From e3f1c57eafeef856284a92ae29bd09f329a79979 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 26 Jun 2023 16:31:52 +0400 Subject: [PATCH 0001/1353] Services and Syncs support (#1021) * Added support for Service entity. * Extract components from ConfigEditor. Now it is possible to build custom forms that looks like ConfigEditor * WIP: oauth integratuion Co-authored-by: Vladimir Klimontovich --- .../jitsu-js/src/destination-plugins/index.ts | 24 +- libs/juava/src/security.ts | 10 +- pnpm-lock.yaml | 53 +++ .../components/CodeEditor/SnippedEditor.tsx | 12 + .../ConfigObjectEditor/ConfigEditor.tsx | 421 ++++++------------ .../ConfigObjectEditor/EditorBase.tsx | 29 ++ .../ConfigObjectEditor/EditorButtons.tsx | 123 +++++ .../ConfigObjectEditor/EditorField.tsx | 54 +++ .../ConfigObjectEditor/EditorTitle.tsx | 25 ++ .../ConnectionEditorPage.tsx | 2 +- .../components/DataView/EventsBrowser.tsx | 6 +- .../components/GlobalLoader/GlobalLoader.tsx | 2 +- .../PageLayout/WorkspacePageLayout.tsx | 14 +- .../ServiceEditor/ServiceEditor.tsx | 188 ++++++++ .../ServicesCatalog.module.css | 11 + .../ServicesCatalog/ServicesCatalog.tsx | 105 +++++ .../SyncEditorPage/SyncEditorPage.tsx | 357 +++++++++++++++ webapps/console/lib/queries.ts | 19 +- webapps/console/lib/schema/config-objects.ts | 5 +- webapps/console/lib/schema/index.ts | 17 + webapps/console/lib/server/fast-store.ts | 2 +- .../console/lib/server/oauth/nango-config.ts | 30 ++ webapps/console/lib/server/oauth/services.tsx | 68 +++ webapps/console/package.json | 3 + .../pages/[workspaceId]/connections/edit.tsx | 4 +- .../pages/[workspaceId]/connections/index.tsx | 4 +- .../pages/[workspaceId]/destinations.tsx | 30 +- .../console/pages/[workspaceId]/functions.tsx | 2 +- webapps/console/pages/[workspaceId]/index.tsx | 4 +- .../console/pages/[workspaceId]/services.tsx | 204 +++++++++ .../pages/[workspaceId]/syncs/edit.tsx | 48 ++ .../pages/[workspaceId]/syncs/index.tsx | 309 +++++++++++++ webapps/console/pages/admin/oauth-test.tsx | 134 ++++++ .../pages/api/[workspaceId]/config/link.ts | 11 +- .../pages/api/[workspaceId]/sources/check.ts | 114 +++++ .../api/[workspaceId]/sources/discover.ts | 149 +++++++ .../pages/api/[workspaceId]/sources/run.ts | 91 ++++ .../pages/api/[workspaceId]/sources/spec.ts | 117 +++++ webapps/console/pages/api/app-config.ts | 8 + .../console/pages/api/oauth/[serviceId].ts | 72 +++ webapps/console/pages/api/oauth/catalog.ts | 10 + webapps/console/pages/api/oauth/init.ts | 11 + .../api/sources/[packageType]/[packageId].ts | 36 ++ webapps/console/pages/api/sources/index.ts | 34 +- webapps/console/pages/api/sources/logo.ts | 1 + webapps/console/pages/api/sources/versions.ts | 22 +- webapps/console/prisma/schema.prisma | 65 +++ 47 files changed, 2723 insertions(+), 337 deletions(-) create mode 100644 webapps/console/components/ConfigObjectEditor/EditorBase.tsx create mode 100644 webapps/console/components/ConfigObjectEditor/EditorButtons.tsx create mode 100644 webapps/console/components/ConfigObjectEditor/EditorField.tsx create mode 100644 webapps/console/components/ConfigObjectEditor/EditorTitle.tsx create mode 100644 webapps/console/components/ServiceEditor/ServiceEditor.tsx create mode 100644 webapps/console/components/ServicesCatalog/ServicesCatalog.module.css create mode 100644 webapps/console/components/ServicesCatalog/ServicesCatalog.tsx create mode 100644 webapps/console/components/SyncEditorPage/SyncEditorPage.tsx create mode 100644 webapps/console/lib/server/oauth/nango-config.ts create mode 100644 webapps/console/lib/server/oauth/services.tsx create mode 100644 webapps/console/pages/[workspaceId]/services.tsx create mode 100644 webapps/console/pages/[workspaceId]/syncs/edit.tsx create mode 100644 webapps/console/pages/[workspaceId]/syncs/index.tsx create mode 100644 webapps/console/pages/admin/oauth-test.tsx create mode 100644 webapps/console/pages/api/[workspaceId]/sources/check.ts create mode 100644 webapps/console/pages/api/[workspaceId]/sources/discover.ts create mode 100644 webapps/console/pages/api/[workspaceId]/sources/run.ts create mode 100644 webapps/console/pages/api/[workspaceId]/sources/spec.ts create mode 100644 webapps/console/pages/api/oauth/[serviceId].ts create mode 100644 webapps/console/pages/api/oauth/catalog.ts create mode 100644 webapps/console/pages/api/oauth/init.ts create mode 100644 webapps/console/pages/api/sources/[packageType]/[packageId].ts diff --git a/libs/jitsu-js/src/destination-plugins/index.ts b/libs/jitsu-js/src/destination-plugins/index.ts index 6ed361fc9..7c049ae3b 100644 --- a/libs/jitsu-js/src/destination-plugins/index.ts +++ b/libs/jitsu-js/src/destination-plugins/index.ts @@ -32,12 +32,24 @@ export function satisfyDomainFilter(filter: string, subject: string | undefined) export function applyFilters(event: AnalyticsClientEvent, creds: CommonDestinationCredentials): boolean { const { hosts = "*", events = "*" } = creds; - const eventsArray = events.split("\n"); - return ( - !!hosts.split("\n").find(hostFilter => satisfyDomainFilter(hostFilter, event.context?.host)) && - (!!eventsArray.find(eventFilter => satisfyFilter(eventFilter, event.type)) || - !!eventsArray.find(eventFilter => satisfyFilter(eventFilter, event.event))) - ); + try { + const eventsArray = Array.isArray(events) ? events : events.split("\n"); + const hostsArray = Array.isArray(hosts) ? hosts : hosts.split("\n"); + return ( + !!hostsArray.find(hostFilter => satisfyDomainFilter(hostFilter, event.context?.host)) && + (!!eventsArray.find(eventFilter => satisfyFilter(eventFilter, event.type)) || + !!eventsArray.find(eventFilter => satisfyFilter(eventFilter, event.event))) + ); + } catch (e) { + console.warn( + `Failed to apply filters: ${e.message}. Typeof events: ${typeof events}, typeof hosts: ${typeof hosts}. Values`, + events, + hosts + ); + throw new Error( + `Failed to apply filters: ${e.message}. Typeof events: ${typeof events}, typeof hosts: ${typeof hosts}` + ); + } } export const internalDestinationPlugins: Record> = { diff --git a/libs/juava/src/security.ts b/libs/juava/src/security.ts index e5b20f5ae..8505cca10 100644 --- a/libs/juava/src/security.ts +++ b/libs/juava/src/security.ts @@ -5,9 +5,13 @@ const defaultSeed = "dea42a58-acf4-45af-85bb-e77e94bd5025"; const globalSeed: string[] = (process.env.GLOBAL_HASH_SECRET || defaultSeed).split(",").map(s => s.trim()); function hashInternal(secret: string, randomSeed: string, globalSeed: string) { - const hash = crypto.createHash("sha512"); - hash.update(secret + randomSeed + globalSeed); - return `${randomSeed}.${hash.digest("hex")}`; + return `${randomSeed}.${hash("sha512", secret + randomSeed + globalSeed)}`; +} + +export function hash(algorithm: string, value: string): string { + const hash = crypto.createHash(algorithm); + hash.update(value); + return hash.digest("hex"); } export function hint(key: string) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 29fd907d2..5c57ef92e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -505,6 +505,9 @@ importers: '@monaco-editor/react': specifier: 4.5.0 version: 4.5.0(monaco-editor@0.37.1)(react-dom@18.2.0)(react@18.2.0) + '@nangohq/frontend': + specifier: ^0.21.11 + version: 0.21.11 '@prisma/client': specifier: ^4.12.0 version: 4.12.0(prisma@4.12.0) @@ -565,6 +568,9 @@ importers: js-yaml: specifier: ^4.1.0 version: 4.1.0 + json-schema-faker: + specifier: ~0.5.3 + version: 0.5.3 json5: specifier: ^2.2.3 version: 2.2.3 @@ -637,6 +643,9 @@ importers: react-use: specifier: ^17.4.0 version: 17.4.0(react-dom@18.2.0)(react@18.2.0) + stable-hash: + specifier: 0.0.3 + version: 0.0.3 stopwatch-node: specifier: ^1.1.0 version: 1.1.0 @@ -5147,6 +5156,10 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@nangohq/frontend@0.21.11: + resolution: {integrity: sha512-oNOqM8gZhRaaHt63zyaWxsWi3pip4a78S9IzstEBVvUUzEFOU3+ys0r3TmyQCbA1veaAZjzeMyq+LtZem/Nt9g==} + dev: false + /@next/env@13.0.0: resolution: {integrity: sha512-65v9BVuah2Mplohm4+efsKEnoEuhmlGm8B2w6vD1geeEP2wXtlSJCvR/cCRJ3fD8wzCQBV41VcMBQeYET6MRkg==} dev: false @@ -10185,6 +10198,10 @@ packages: function-bind: 1.1.1 get-intrinsic: 1.2.0 + /call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + dev: false + /caller-callsite@2.0.0: resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} engines: {node: '>=4'} @@ -13586,6 +13603,10 @@ packages: mime-types: 2.1.35 dev: false + /format-util@1.0.5: + resolution: {integrity: sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==} + dev: false + /format@0.2.2: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} @@ -16781,6 +16802,14 @@ packages: lodash: 4.17.21 dev: false + /json-schema-faker@0.5.3: + resolution: {integrity: sha512-BeIrR0+YSrTbAR9dOMnjbFl1MvHyXnq+Wpdw1FpWZDHWKLzK229hZ5huyPcmzFUfVq1ODwf40WdGVoE266UBUg==} + hasBin: true + dependencies: + json-schema-ref-parser: 6.1.0 + jsonpath-plus: 7.2.0 + dev: false + /json-schema-merge-allof@0.8.1: resolution: {integrity: sha512-CTUKmIlPJbsWfzRRnOXz+0MjIqvnleIXwFTzz+t9T86HnYX/Rozria6ZVGLktAU9e+NygNljveP+yxqtQp/Q4w==} engines: {node: '>=12.0.0'} @@ -16790,6 +16819,15 @@ packages: lodash: 4.17.21 dev: false + /json-schema-ref-parser@6.1.0: + resolution: {integrity: sha512-pXe9H1m6IgIpXmE5JSb8epilNTGsmTb2iPohAXpOdhqGFbQjNeHHsZxU+C8w6T81GZxSPFLeUoqDJmzxx5IGuw==} + deprecated: Please switch to @apidevtools/json-schema-ref-parser + dependencies: + call-me-maybe: 1.0.2 + js-yaml: 3.14.1 + ono: 4.0.11 + dev: false + /json-schema-to-ts@1.6.4: resolution: {integrity: sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA==} dependencies: @@ -16850,6 +16888,11 @@ packages: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} + /jsonpath-plus@7.2.0: + resolution: {integrity: sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==} + engines: {node: '>=12.0.0'} + dev: false + /jsonpointer@5.0.1: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} @@ -19262,6 +19305,12 @@ packages: dependencies: mimic-fn: 2.1.0 + /ono@4.0.11: + resolution: {integrity: sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g==} + dependencies: + format-util: 1.0.5 + dev: false + /open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -23491,6 +23540,10 @@ packages: dependencies: minipass: 3.3.6 + /stable-hash@0.0.3: + resolution: {integrity: sha512-c63fvNCQ7ip1wBfPv54MflMA5L6OE5J0p6Fg13IpKft4JAFoNal8+s/jtJ8PibrwqXm4onnbeQsADs8k0NQGUA==} + dev: false + /stable@0.1.8: resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' diff --git a/webapps/console/components/CodeEditor/SnippedEditor.tsx b/webapps/console/components/CodeEditor/SnippedEditor.tsx index a86467961..3e85ff2ad 100644 --- a/webapps/console/components/CodeEditor/SnippedEditor.tsx +++ b/webapps/console/components/CodeEditor/SnippedEditor.tsx @@ -1,6 +1,7 @@ import Editor from "@monaco-editor/react"; import React from "react"; import { Radio } from "antd"; +import { editor } from "monaco-editor"; /** * See tagDestination comments, due to limitations of the react-jsonschema-form we can't use @@ -19,6 +20,9 @@ export type SnippedEditorProps = { languages?: SupportedLanguages[]; height?: number; onChange: (value: SnippedEditorValue) => void; + options?: editor.IStandaloneEditorConstructionOptions; + //automatically fold code on provided level of indentation on editor mount + foldLevel?: number; }; /** @@ -75,6 +79,13 @@ export const SnippedEditor: React.FC = props => { }} language={valueParsed.lang?.toLowerCase() || "html"} height={props.height ? `${props.height}px` : "500px"} + onMount={ + props.foldLevel + ? editor => { + editor.getAction(`editor.foldLevel${props.foldLevel}`)?.run(); + } + : undefined + } className="rounded-lg" options={{ renderLineHighlight: "none", @@ -98,6 +109,7 @@ export const SnippedEditor: React.FC = props => { }, hideCursorInOverviewRuler: true, overviewRulerLanes: 0, + ...props.options, }} /> diff --git a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx index 907c70534..5d40434a2 100644 --- a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx +++ b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx @@ -1,19 +1,6 @@ -import React, { createContext, PropsWithChildren, ReactNode, useContext, useEffect, useRef, useState } from "react"; -import { - Alert, - Button, - Col, - Dropdown, - Form as AntdForm, - Input, - MenuProps, - Popover, - Row, - Skeleton, - Switch, - Table, -} from "antd"; -import { FaCaretDown, FaCaretRight, FaClone, FaExclamationCircle, FaPlus } from "react-icons/fa"; +import React, { createContext, PropsWithChildren, ReactNode, useContext, useEffect, useState } from "react"; +import { Button, Col, Dropdown, Form as AntdForm, Input, MenuProps, Row, Skeleton, Switch, Table } from "antd"; +import { FaCaretDown, FaCaretRight, FaClone, FaPlus } from "react-icons/fa"; import { ZodType } from "zod"; import { getConfigApi, useApi } from "../../lib/useApi"; import { useRouter } from "next/router"; @@ -41,17 +28,20 @@ import { import { ConfigEntityBase } from "../../lib/schema"; import { useWorkspace } from "../../lib/context"; import omitBy from "lodash/omitBy"; -import { GlobalLoader } from "../GlobalLoader/GlobalLoader"; +import { GlobalLoader, LoadingAnimation } from "../GlobalLoader/GlobalLoader"; import { WLink } from "../Workspace/WLink"; -import { CheckOutlined, DeleteOutlined, EditOutlined, LoadingOutlined } from "@ant-design/icons"; +import { DeleteOutlined, EditOutlined } from "@ant-design/icons"; import { ErrorCard, GlobalError } from "../GlobalError/GlobalError"; -import { Action, confirmOp, doAction, feedbackError, feedbackSuccess, useKeyboard, useTitle } from "../../lib/ui"; +import { Action, confirmOp, doAction, feedbackError, feedbackSuccess, useTitle } from "../../lib/ui"; import { branding } from "../../lib/branding"; import { useAntdModal } from "../../lib/modal"; -import { getCoreDestinationType } from "../../lib/schema/destinations"; -import { ChevronLeft, Inbox } from "lucide-react"; +import { Inbox } from "lucide-react"; import { createDisplayName, prepareZodObjectForSerialization } from "../../lib/zod"; import { JitsuButton } from "../JitsuButton/JitsuButton"; +import { EditorTitle } from "./EditorTitle"; +import { EditorBase } from "./EditorBase"; +import { EditorField } from "./EditorField"; +import { EditorButtons } from "./EditorButtons"; const log = getLog("ConfigEditor"); @@ -67,9 +57,9 @@ export type FieldDisplay = { password?: boolean; }; -export type EditorComponentFactory = (props: EditorComponentProps) => ReactNode | undefined; +export type EditorComponentFactory = (props: EditorComponentProps) => React.FC | undefined; -export type ConfigEditorProps = { +export type ConfigEditorProps = { listTitle?: ReactNode; type: string; listColumns?: { title: ReactNode; render: (o: T) => ReactNode }[]; @@ -80,8 +70,8 @@ export type ConfigEditorProps = { noun: string; nounPlural?: string; addAction?: Action; - editorTitle?: (o: T, isNew: boolean) => ReactNode; - subtitle?: (o: T, isNew: boolean) => ReactNode; + editorTitle?: (o: T, isNew: boolean, meta?: M) => ReactNode; + subtitle?: (o: T, isNew: boolean, meta?: M) => ReactNode; createKeyword?: string; //allows to hide certain objects in the list view filter?: (o: T) => boolean; @@ -93,9 +83,12 @@ export type ConfigEditorProps = { link?: (o: T) => string; disabled?: (o: T) => string | boolean; }[]; - newObject?: () => Partial; + loadMeta?: (o: T | undefined) => Promise; + newObject?: (meta?: M) => Partial; //for providing custom editor component editorComponent?: EditorComponentFactory; + testConnectionEnabled?: (o: any) => boolean; + onTest?: (o: T) => Promise; }; export type CustomWidgetProps = { @@ -198,7 +191,7 @@ const CustomCheckbox = function (props) { return props.onChange(!props.value)} />; }; -type ConfigTestResult = { ok: true } | { ok: false; error: string }; +export type ConfigTestResult = { ok: true } | { ok: false; error: string }; export type ConfigEditorActions = { onSave: (o: any) => Promise; @@ -210,6 +203,8 @@ export type ConfigEditorActions = { export type EditorComponentProps = SingleObjectEditorProps & ConfigEditorActions & { isNew: boolean; + meta: any; + testConnectionEnabled: (o: any) => boolean; object: ConfigEntityBase & Record; }; @@ -229,23 +224,34 @@ function AddButton(props: IconButtonProps) { } const EditorComponent: React.FC = props => { - const { noun, createNew, objectType, fields, onCancel, onSave, onDelete, onTest, object, isNew, subtitle } = props; + const { + noun, + createNew, + objectType, + meta, + fields, + onCancel, + onSave, + onDelete, + testConnectionEnabled, + onTest, + object, + isNew, + subtitle, + } = props; useTitle(`${branding.productName} : ${createNew ? `Create new ${noun}` : `Edit ${noun}`}`); const [loading, setLoading] = useState(false); - const [testStatus, setTestStatus] = useState(""); - const buttonDivRef = useRef(null); const objectTypeFactory = asFunction(objectType); const schema = zodToJsonSchema(objectTypeFactory(object)); const [formState, setFormState] = useState(undefined); const hasErrors = formState?.errors?.length > 0; const isTouched = formState !== undefined || !!createNew; const uiSchema = getUiSchema(schema, fields); - log.atDebug().log("Rendring with schema and props", schema, props); + log.atInfo().log("Rendering with schema and props", schema, props); const [submitCount, setSubmitCount] = useState(0); const modal = useAntdModal(); const onFormChange = state => { - setTestStatus(""); setFormState(state); log.atDebug().log(`Updating editor form state`, state); }; @@ -257,172 +263,72 @@ const EditorComponent: React.FC = props => { setLoading(false); } }; - useKeyboard("Escape", () => { - onCancel(isTouched); - }); - const doTest = async (obj: any) => { - if (onTest) { - setTestStatus("pending"); - try { - const testRes = await onTest(obj); - log.atDebug().log("Test result", testRes); - if (testRes.ok) { - setTestStatus("success"); - } else { - setTestStatus(testRes?.error || "unknown error"); - } - } catch (e) { - setTestStatus("failed to test connection: " + e); - } finally { - setTimeout(() => { - buttonDivRef.current?.scrollIntoView({ behavior: "smooth" }); - }, 50); - } - } - }; - - useEffect(() => { - const handler = async event => { - if (isTouched) { - event.preventDefault(); - return (event.returnValue = "Are you sure you want to exit? You have unsaved changes"); - } - }; - window.addEventListener("beforeunload", handler); - return () => window.removeEventListener("beforeunload", handler); - }, [isTouched]); - - const title = props.editorTitle ? props.editorTitle(object, isNew) : isNew ? `Create new ${noun}` : `Edit ${noun}`; - const subtitleComponent = subtitle && subtitle(object, isNew); + const title = props.editorTitle + ? props.editorTitle(object, isNew, meta) + : isNew + ? `Create new ${noun}` + : `Edit ${noun}`; + const subtitleComponent = subtitle && subtitle(object, isNew, meta); return ( -
-
-
-

{title}

-
- } - type="link" - size="small" - onClick={withLoading(() => onCancel(isTouched))} - > - Back - -
-
- {subtitleComponent &&
{subtitleComponent}
} -
- 0 }}> -
withLoading(() => onSave(formData))()} - formData={formState?.formData || object} - uiSchema={uiSchema} - > - {testStatus && testStatus !== "success" && testStatus !== "pending" && ( - - )} -
-
- {!isNew && ( - - )} -
-
- {onTest && - (testStatus === "success" ? ( - - - - ) : ( - - ))} - - -
-
- -
-
-
-
+ + onCancel(isTouched))} /> + 0 }}> +
withLoading(() => onSave(formData))()} + formData={formState?.formData || object} + uiSchema={uiSchema} + > + onTest(formState?.formData || object) + : undefined + } + onDelete={withLoading(onDelete)} + onCancel={withLoading(() => onCancel(isTouched))} + onSave={() => { + setSubmitCount(submitCount + 1); + if (hasErrors) { + modal.error({ + title: "There are errors in the configuration", + content: ( + <> + Please fix following errors. Fields with errors are marked with red{" "} +
    + {formState.errors.map((e: any) => { + const fieldId = e.property.replace(".", ""); + return ( +
  • + {fieldId} {e.message} +
  • + ); + })} +
+ + ), + }); + } + }} + /> + +
+
); }; @@ -435,19 +341,33 @@ const SingleObjectEditor: React.FC = props => { type, fields, newObject = () => ({}), + loadMeta, + onTest, ...otherProps } = props; + const [meta, setMeta] = useState(undefined); const isNew = !!(!otherProps.object || createNew); const workspace = useWorkspace(); + const router = useRouter(); + + useEffect(() => { + if (loadMeta) { + loadMeta(otherProps.object).then(setMeta); + } else { + setMeta({}); + } + }, [loadMeta, otherProps.object]); + + if (meta === undefined) { + return ; + } const object = otherProps.object || { id: randomId(), workspaceId: workspace.id, type: type, - ...newObject(), + ...newObject(meta), }; - const router = useRouter(); - const onCancel = async (confirm: boolean) => { if (!confirm) { await router.push(`/${workspace.id}/${type}s`); @@ -485,6 +405,7 @@ const SingleObjectEditor: React.FC = props => { }; const editorComponentProps = { ...props, + meta, onCancel, onSave, onDelete, @@ -493,34 +414,15 @@ const SingleObjectEditor: React.FC = props => { noun, } as EditorComponentProps; - if (type === "destination") { - const destinationType = requireDefined( - getCoreDestinationType(object.destinationType), - `Unknown destination type ${object.destinationType}` - ); - if (destinationType.usesBulker) { - editorComponentProps.onTest = async obj => { - try { - const res = await getConfigApi(workspace.id, type).test(obj); - return res.ok ? { ok: true } : { ok: false, error: res?.error || res?.message || "uknown error" }; - } catch (error) { - log - .atWarn() - .log( - `Failed to test destination ${workspace.id} / ${type}. This is not expected since destination tester should return 200 even in credentials are wrong`, - error - ); - return { ok: false, error: "Internal error, see logs for details" }; - //feedbackError("Failed to test object", { error }); - } - }; - } - } if (!props.editorComponent) { return ; } else { - const editorComponent = props.editorComponent(editorComponentProps); - return <>{editorComponent || }; + const CustomEditorComponent = props.editorComponent(editorComponentProps); + if (CustomEditorComponent) { + return ; + } else { + return ; + } } }; @@ -593,8 +495,9 @@ const NestedObjectFieldTemplate = props => { } = props; const { readonlyAsDisabled = true } = registry.formContext; const { RemoveButton } = registry.templates.ButtonTemplates; - const hasHelp = !!help?.props?.help; const hasErrors = !!errors?.props?.errors && formCtx.displayInlineErrors; + const helpProp = !!help?.props?.help ? help : undefined; + const errorsProp = !!errors?.props?.errors && formCtx.displayInlineErrors ? errors : undefined; const additional = ADDITIONAL_PROPERTY_FLAG in schema; const handleBlur = ({ target }: React.FocusEvent) => onKeyChange(target.value); @@ -606,35 +509,9 @@ const NestedObjectFieldTemplate = props => { }; return !additional ? ( -
-
-
- -
-
-
- -
-
{label}
- {errors} -
-
-
-
{children}
-
- {hasHelp && ( -
-
{help}
-
- )} -
+ + {children} + ) : ( @@ -669,38 +546,12 @@ const NestedObjectFieldTemplate = props => { const FieldTemplate = props => { const formCtx = requireDefined(useContext(EditorComponentContext), "Not in "); const { id, classNames, label, help, required, errors, children } = props; - const hasHelp = !!help?.props?.help; - const hasErrors = !!errors?.props?.errors && formCtx.displayInlineErrors; + const helpProp = !!help?.props?.help ? help : undefined; + const errorsProp = !!errors?.props?.errors && formCtx.displayInlineErrors ? errors : undefined; return ( -
-
-
- -
-
-
- -
-
{label}
- {errors} -
-
-
-
{children}
-
- {hasHelp && ( -
-
{help}
-
- )} -
+ + {children} + ); }; diff --git a/webapps/console/components/ConfigObjectEditor/EditorBase.tsx b/webapps/console/components/ConfigObjectEditor/EditorBase.tsx new file mode 100644 index 000000000..45dcb628e --- /dev/null +++ b/webapps/console/components/ConfigObjectEditor/EditorBase.tsx @@ -0,0 +1,29 @@ +import React, { useEffect } from "react"; +import { useKeyboard } from "../../lib/ui"; + +export type EditorBaseProps = { + onCancel: (isTouched: boolean) => void; + isTouched: boolean; +}; + +export const EditorBase: React.FC> = ({ onCancel, isTouched, children }) => { + useKeyboard("Escape", () => { + onCancel(isTouched); + }); + + useEffect(() => { + const handler = async event => { + if (isTouched) { + event.preventDefault(); + return (event.returnValue = "Are you sure you want to exit? You have unsaved changes"); + } + }; + window.addEventListener("beforeunload", handler); + return () => window.removeEventListener("beforeunload", handler); + }, [isTouched]); + return ( +
+
{children}
+
+ ); +}; diff --git a/webapps/console/components/ConfigObjectEditor/EditorButtons.tsx b/webapps/console/components/ConfigObjectEditor/EditorButtons.tsx new file mode 100644 index 000000000..405448b4c --- /dev/null +++ b/webapps/console/components/ConfigObjectEditor/EditorButtons.tsx @@ -0,0 +1,123 @@ +import React, { useEffect, useRef, useState } from "react"; +import { Alert, Button, Popover } from "antd"; +import { CheckOutlined, LoadingOutlined } from "@ant-design/icons"; +import { getLog } from "juava"; +import { ConfigTestResult } from "./ConfigEditor"; + +const log = getLog("ConfigEditor"); + +export type EditorButtonProps = { + isNew: boolean; + loading: boolean; + onDelete: () => void; + onTest?: () => Promise; + onCancel: () => void; + onSave: () => void; + isTouched?: boolean; + hasErrors?: boolean; + testStatus?: string; +}; + +export const EditorButtons: React.FC = ({ + isNew, + loading, + onCancel, + onDelete, + onTest, + onSave, + isTouched, + hasErrors, +}) => { + const buttonDivRef = useRef(null); + + const [testStatus, setTestStatus] = useState(""); + + useEffect(() => { + function handleKeyDown(e) { + setTestStatus(""); + } + document.addEventListener("keydown", handleKeyDown); + + return function cleanup() { + document.removeEventListener("keydown", handleKeyDown); + }; + }, []); + + const doTest = async (obj: any) => { + if (onTest) { + setTestStatus("pending"); + try { + const testRes = await onTest(); + log.atDebug().log("Test result", testRes); + if (testRes.ok) { + setTestStatus("success"); + } else { + setTestStatus(testRes?.error || "unknown error"); + } + } catch (e) { + setTestStatus("failed to test connection: " + e); + } finally { + setTimeout(() => { + buttonDivRef.current?.scrollIntoView({ behavior: "smooth" }); + }, 50); + } + } + }; + + return ( + <> + {testStatus && testStatus !== "success" && testStatus !== "pending" && ( + + )} +
+
+ {!isNew && ( + + )} +
+
+ {onTest && + (testStatus === "success" ? ( + + + + ) : ( + + ))} + + +
+
+ + ); +}; diff --git a/webapps/console/components/ConfigObjectEditor/EditorField.tsx b/webapps/console/components/ConfigObjectEditor/EditorField.tsx new file mode 100644 index 000000000..260270cb4 --- /dev/null +++ b/webapps/console/components/ConfigObjectEditor/EditorField.tsx @@ -0,0 +1,54 @@ +import React from "react"; +import styles from "./ConfigEditor.module.css"; +import { FaExclamationCircle } from "react-icons/fa"; + +export type EditorFieldProps = { + id: string; + required?: boolean; + className?: string; + help?: React.ReactNode; + label: React.ReactNode; + errors?: React.ReactNode; +}; + +export const EditorField: React.FC> = ({ + id, + required, + className, + help, + label, + errors, + children, +}) => { + return ( +
+
+
+ +
+
+
+ +
+
{label}
+ {errors} +
+
+
+
{children}
+
+ {!!help && ( +
+
{help}
+
+ )} +
+ ); +}; diff --git a/webapps/console/components/ConfigObjectEditor/EditorTitle.tsx b/webapps/console/components/ConfigObjectEditor/EditorTitle.tsx new file mode 100644 index 000000000..7c129e233 --- /dev/null +++ b/webapps/console/components/ConfigObjectEditor/EditorTitle.tsx @@ -0,0 +1,25 @@ +import React, { ReactNode } from "react"; +import { JitsuButton } from "../JitsuButton/JitsuButton"; +import { ChevronLeft } from "lucide-react"; + +export type EditorTitleProps = { + title: ReactNode; + subtitle?: ReactNode; + onBack: () => void; +}; + +export const EditorTitle: React.FC = ({ title, subtitle, onBack }) => { + return ( + <> +
+

{title}

+
+ } type="link" size="small" onClick={onBack}> + Back + +
+
+ {subtitle &&
{subtitle}
} + + ); +}; diff --git a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx index 1e3ab4d38..b4bc94110 100644 --- a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx +++ b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx @@ -623,7 +623,7 @@ function ConnectionEditor({ setLoading(true); try { await get(`/api/${workspace.id}/config/link`, { - body: { fromId: srcId, toId: dstId, data: connectionOptions }, + body: { fromId: srcId, toId: dstId, type: "push", data: connectionOptions }, }); router.back(); } catch (error) { diff --git a/webapps/console/components/DataView/EventsBrowser.tsx b/webapps/console/components/DataView/EventsBrowser.tsx index e5e1e74d2..b624abb75 100644 --- a/webapps/console/components/DataView/EventsBrowser.tsx +++ b/webapps/console/components/DataView/EventsBrowser.tsx @@ -8,7 +8,7 @@ import { TableWithDrawer } from "./TableWithDrawer"; import { JSONView } from "./JSONView"; import { useAppConfig, useWorkspace } from "../../lib/context"; import React, { ReactNode, useCallback, useEffect, useMemo, useReducer, useState } from "react"; -import { streamDestinationLinkQuery } from "../../lib/queries"; +import { linksQuery } from "../../lib/queries"; import { WLink } from "../Workspace/WLink"; import { DestinationTitle } from "../../pages/[workspaceId]/destinations"; import ExternalLink from "../Icons/ExternalLink"; @@ -184,7 +184,7 @@ export const EventsBrowser = ({ query = () => getConfigApi(workspace.id, "stream").list(); } else { query = async () => { - const data = await streamDestinationLinkQuery(workspace.id)(); + const data = await linksQuery(workspace.id)(); const streamsMap = arrayToMap(data[0]); const dstMap = arrayToMap(data[1]); return data[2] @@ -666,7 +666,7 @@ const IncomingEventDrawer = ({ event }: { event: IncomingEvent }) => { const hasEvent = typeof event !== "undefined"; useEffect(() => { if (!event) return; - streamDestinationLinkQuery(workspace.id)() + linksQuery(workspace.id)() .then(data => { const streamsMap = arrayToMap(data[0]); const dstMap = arrayToMap(data[1]); diff --git a/webapps/console/components/GlobalLoader/GlobalLoader.tsx b/webapps/console/components/GlobalLoader/GlobalLoader.tsx index c67c3cd69..175e4f545 100644 --- a/webapps/console/components/GlobalLoader/GlobalLoader.tsx +++ b/webapps/console/components/GlobalLoader/GlobalLoader.tsx @@ -34,7 +34,7 @@ export function LoadingAnimation({ hideTitle?: boolean; }) { return ( -
+
diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index ec664b964..59f0fd611 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -18,6 +18,7 @@ import { LayoutDashboard, Loader2, Server, + ServerCog, Settings, Share2, ShieldAlert, @@ -343,20 +344,29 @@ const UserProfileButton: React.FC<{}> = () => { function PageHeader() { const appConfig = useAppConfig(); + const workspace = useWorkspace(); const items: TabsMenuItem[] = [ { title: "Overview", path: "/", aliases: "/overview", icon: }, { title: "Sites", path: "/streams", icon: }, { title: "Destinations", path: "/destinations", icon: }, { title: "Connections", path: "/connections", icon: }, { title: "Functions", path: "/functions", icon: }, + ]; + if (workspace.featuresEnabled && workspace.featuresEnabled.includes("syncs")) { + items.push( + { title: "Services", path: "/services", icon: }, + { title: "Syncs", path: "/syncs", icon: } + ); + } + items.push( { title: "Live Events", path: "/data", icon: }, { title: "Query Data", path: "/sql", icon: , hidden: !appConfig?.ee }, { title: "Settings", path: "/settings", icon: , - }, - ]; + } + ); return (
diff --git a/webapps/console/components/ServiceEditor/ServiceEditor.tsx b/webapps/console/components/ServiceEditor/ServiceEditor.tsx new file mode 100644 index 000000000..1c4c77b84 --- /dev/null +++ b/webapps/console/components/ServiceEditor/ServiceEditor.tsx @@ -0,0 +1,188 @@ +import { EditorComponentProps } from "../ConfigObjectEditor/ConfigEditor"; +import React, { useCallback, useEffect, useState } from "react"; +import { getLog, rpc } from "juava"; +import { EditorTitle } from "../ConfigObjectEditor/EditorTitle"; +import { EditorBase } from "../ConfigObjectEditor/EditorBase"; +import { LoadingAnimation } from "../GlobalLoader/GlobalLoader"; +import { EditorField } from "../ConfigObjectEditor/EditorField"; +import { TextEditor } from "../ConnectionEditorPage/ConnectionEditorPage"; +import { ServiceConfig } from "../../lib/schema"; +import { Button, Select } from "antd"; +import { SnippedEditor } from "../CodeEditor/SnippedEditor"; +import { EditorButtons } from "../ConfigObjectEditor/EditorButtons"; +import { getConfigApi } from "../../lib/useApi"; +import { feedbackError } from "../../lib/ui"; +import { useWorkspace } from "../../lib/context"; +import { useRouter } from "next/router"; + +const log = getLog("ServiceEditor"); + +type ServiceEditorProps = {} & EditorComponentProps; + +const VersionSelector: React.FC<{ versions: string[]; onChange: (v: string) => void; value: string }> = ({ + versions, + onChange, + value, +}) => { + const options = versions.map(v => ({ label: v, value: v })); + return { + setFilter(e.target.value); + }} + className="w-full border border-textDisabled rounded-lg px-4 py-4" + /> +
+ {Object.entries(groups).map(([group, sources]) => ( +
+
{group === "api" ? "API" : capitalize(group)}
+
+ {sources.map(source => { + if (!source.meta.name.toLowerCase().includes(filter.toLowerCase())) { + return null; + } + return ( +
onClick(source.packageType, source.packageId)} + > +
{getDestinationIcon(source)}
+
+
{source.meta.name}
+
+
+ ); + })} +
+
+ ))} +
+ ); +}; diff --git a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx new file mode 100644 index 000000000..6914377e9 --- /dev/null +++ b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx @@ -0,0 +1,357 @@ +import { useWorkspace } from "../../lib/context"; +import { get } from "../../lib/useApi"; +import { DestinationConfig, ServiceConfig } from "../../lib/schema"; +import React, { PropsWithChildren, useCallback, useEffect, useState } from "react"; +import { z } from "zod"; +import { ConfigurationObjectLinkDbModel } from "../../prisma/schema"; +import { useRouter } from "next/router"; +import { assertTrue, getLog, hash as juavaHash, rpc } from "juava"; +import { Disable } from "../Disable/Disable"; +import { Button, Select } from "antd"; +import { WLink } from "../Workspace/WLink"; +import { FaExternalLinkAlt } from "react-icons/fa"; +import { getCoreDestinationType } from "../../lib/schema/destinations"; +import { confirmOp, feedbackError, feedbackSuccess } from "../../lib/ui"; +import FieldListEditorLayout, { EditorItem } from "../FieldListEditorLayout/FieldListEditorLayout"; +import { ChevronLeft } from "lucide-react"; +import { JitsuButton } from "../JitsuButton/JitsuButton"; +import { LoadingAnimation } from "../GlobalLoader/GlobalLoader"; +import { SnippedEditor } from "../CodeEditor/SnippedEditor"; +import hash from "stable-hash"; + +const log = getLog("SyncEditorPage"); + +type SelectorProps = { + enabled: boolean; + selected: string; + items: T[]; + onSelect: (value: string) => void; +}; + +const Htmlizer: React.FC> = ({ children }) => { + return typeof children === "string" ? : <>{children}; +}; + +type SyncOptionsType = any; + +function DestinationSelector(props: SelectorProps) { + return ( +
+ + + + {!props.enabled && ( +
+ + + +
+ )} +
+ ); +} + +function ServiceSelector(props: SelectorProps) { + return ( +
+ + + + {!props.enabled && ( +
+ + + +
+ )} +
+ ); +} + +type EditorProps = { + value?: T; + disabled?: boolean; + onChange: (value: T) => void; +}; + +function SyncEditor({ + services, + destinations, + links, +}: { + services: ServiceConfig[]; + destinations: DestinationConfig[]; + links: z.infer[]; +}) { + const router = useRouter(); + const existingLink = router.query.id ? links.find(link => link.id === router.query.id) : undefined; + + assertTrue(services.length > 0, `Services list is empty`); + assertTrue(destinations.length > 0, `Destinations list is empty`); + + const [loading, setLoading] = useState(false); + const workspace = useWorkspace(); + const [dstId, setDstId] = useState(existingLink?.toId || destinations[0].id); + const [srvId, setSrvId] = useState(existingLink?.fromId || services[0].id); + + const service = services.find(s => s.id === srvId); + + const [syncOptions, setSyncOptions] = useState(existingLink?.data || {}); + const [streamsProvided, setStreamsProvided] = useState(!!syncOptions.streams && syncOptions.streams !== "{}"); + const [loadingCatalog, setLoadingCatalog] = useState(false); + + const updateOptions: (patch: Partial) => void = useCallback( + patch => { + log.atDebug().log("Patching sync options with", patch, " existing options", syncOptions); + setSyncOptions({ ...syncOptions, ...patch }); + }, + [syncOptions] + ); + + const updateCatalog: (catalog: any) => void = useCallback( + catalog => { + updateOptions({ streams: catalog }); + setStreamsProvided(true); + }, + [updateOptions] + ); + + useEffect(() => { + if (!service) { + console.log("No service."); + return; + } + if (streamsProvided) { + console.log("No need to load catalog. Specs are already filled."); + return; + } + (async () => { + console.log("Loading catalog"); + setLoadingCatalog(true); + try { + const h = juavaHash("md5", hash(JSON.parse(service.credentials))); + const storageKey = `${workspace.id}_${service.id}_${h}`; + const firstRes = await rpc( + `/api/${workspace.id}/sources/discover?package=${service.package}&version=${service.version}&storageKey=${storageKey}`, + { + body: service, + } + ); + if (firstRes.error) { + updateCatalog(firstRes.error); + } else if (firstRes.ok) { + console.log("Loaded cached catalog:", JSON.stringify(firstRes, null, 2)); + updateCatalog(JSON.stringify(firstRes.catalog, null, 2)); + } else { + for (let i = 0; i < 60; i++) { + await new Promise(resolve => setTimeout(resolve, 2000)); + const resp = await rpc( + `/api/${workspace.id}/sources/discover?package=${service.package}&version=${service.version}&storageKey=${storageKey}` + ); + if (!resp.pending) { + if (resp.error) { + updateCatalog(resp.error); + return; + } else { + console.log("Loaded catalog:", JSON.stringify(resp, null, 2)); + updateCatalog(JSON.stringify(resp.catalog, null, 2)); + return; + } + } + } + updateCatalog(`Cannot load specs for ${service.package}:${service.version} error: Timeout`); + } + } catch (error) { + updateCatalog(error); + } finally { + setLoadingCatalog(false); + } + })(); + }, [workspace.id, service, updateOptions, streamsProvided]); + + const configItems: EditorItem[] = [ + { + name: existingLink ? "Select Service" : "Service", + documentation: "Select service to connect", + component: ( + { + setSrvId(v); + updateOptions({ streams: "{}" }); + setStreamsProvided(false); + }} + /> + ), + }, + { + name: existingLink ? "Select Destination" : "Destination", + documentation: existingLink + ? "You can't change destination of existing sync. Please create a new one" + : "Select destination to connect", + component: ( + { + setDstId(id); + }} + /> + ), + }, + ]; + if (service) { + configItems.push({ + name: "Selected Streams", + component: ( + <> + {loadingCatalog ? ( + + ) : ( +
+ +
+ { + updateOptions({ streams }); + }} + languages={["json"]} + height={382} + foldLevel={5} + options={{ + folding: true, + foldingHighlight: false, + showFoldingControls: "always", + }} + /> +
+
+ )} + + ), + }); + } + return ( +
+
+

{(existingLink ? "Edit" : "Create") + " sync"}

+ } type="link" size="small" onClick={() => router.back()}> + Back + +
+
+ +
+
+
+ {existingLink && ( + + )} +
+
+ + +
+
+
+ ); +} + +export default SyncEditor; diff --git a/webapps/console/lib/queries.ts b/webapps/console/lib/queries.ts index 7fadd0265..43eec0783 100644 --- a/webapps/console/lib/queries.ts +++ b/webapps/console/lib/queries.ts @@ -1,27 +1,32 @@ import { get, getConfigApi } from "./useApi"; -import { DestinationConfig, StreamConfig } from "./schema"; +import { DestinationConfig, ServiceConfig, StreamConfig } from "./schema"; import { useQuery } from "@tanstack/react-query"; -export function streamDestinationLinkQuery(workspaceId: string) { +export function linksQuery(workspaceId: string, type: "push" | "sync" = "push") { return async () => { return await Promise.all([ - getConfigApi(workspaceId, "stream").list(), + type === "sync" + ? getConfigApi(workspaceId, "service").list() + : getConfigApi(workspaceId, "stream").list(), getConfigApi(workspaceId, "destination").list(), - get(`/api/${workspaceId}/config/link`).then(res => res.links), + get(`/api/${workspaceId}/config/link`).then(res => + res.links.filter(l => l.type === type || (type === "push" && !l.type)) + ), ]); }; } -export function useStreamDestinationLinksQuery( +export function useLinksQuery( workspaceId: string, + type: "push" | "sync" = "push", options?: { cacheTime?: number; retry?: boolean; } ) { return useQuery( - ["streamDestinationLinks", workspaceId], - streamDestinationLinkQuery(workspaceId), + ["links", workspaceId, type], + linksQuery(workspaceId, type), options ? { cacheTime: options.cacheTime, diff --git a/webapps/console/lib/schema/config-objects.ts b/webapps/console/lib/schema/config-objects.ts index 10c5f07aa..0af24ddcf 100644 --- a/webapps/console/lib/schema/config-objects.ts +++ b/webapps/console/lib/schema/config-objects.ts @@ -1,7 +1,7 @@ import { coreDestinationsMap } from "./destinations"; import { safeParseWithDate } from "../zod"; import { ApiError } from "../shared/errors"; -import { ApiKey, ConfigObjectType, DestinationConfig, FunctionConfig, StreamConfig } from "./index"; +import { ApiKey, ConfigObjectType, DestinationConfig, FunctionConfig, ServiceConfig, StreamConfig } from "./index"; import { assertDefined, createHash, requireDefined } from "juava"; import { isDomainAvailable } from "../server/custom-domains"; import { ZodType, ZodTypeDef } from "zod"; @@ -145,4 +145,7 @@ const configObjectTypes: Record = { function: { schema: FunctionConfig, }, + service: { + schema: ServiceConfig, + }, } as const; diff --git a/webapps/console/lib/schema/index.ts b/webapps/console/lib/schema/index.ts index 4454504b9..8cdf86df1 100644 --- a/webapps/console/lib/schema/index.ts +++ b/webapps/console/lib/schema/index.ts @@ -69,6 +69,12 @@ export const AppConfig = z.object({ writeKey: z.string().optional(), }), logLevel: z.enum(["debug", "info", "warn", "error"]), + nango: z + .object({ + publicKey: z.string(), + host: z.string(), + }) + .optional(), }); export type AppConfig = z.infer; @@ -118,6 +124,17 @@ export const FunctionConfig = ConfigEntityBase.merge( ); export type FunctionConfig = z.infer; +export const ServiceConfig = ConfigEntityBase.merge( + z.object({ + name: z.string().min(5), + protocol: z.enum(["airbyte"]).default("airbyte"), + package: z.string(), + version: z.string(), + credentials: z.string(), + }) +); +export type ServiceConfig = z.infer; + /** * What happens to an object before it is saved to DB. * diff --git a/webapps/console/lib/server/fast-store.ts b/webapps/console/lib/server/fast-store.ts index 3e0ca30dd..d212606ae 100644 --- a/webapps/console/lib/server/fast-store.ts +++ b/webapps/console/lib/server/fast-store.ts @@ -253,7 +253,7 @@ async function saveConnectionsToRedis(db: DatabaseConnection) { join "ConfigurationObject" dst on link."toId" = dst.id join "Workspace" ws on link."workspaceId" = ws.id where link.deleted = false and - src."type" = 'stream' and + src."type" in ('stream', 'service') and src."deleted" = false and dst.type='destination' and dst."deleted" = false and diff --git a/webapps/console/lib/server/oauth/nango-config.ts b/webapps/console/lib/server/oauth/nango-config.ts new file mode 100644 index 000000000..e7ca56266 --- /dev/null +++ b/webapps/console/lib/server/oauth/nango-config.ts @@ -0,0 +1,30 @@ +import { Simplify } from "type-fest"; +import { requireDefined } from "juava"; + +export type NangoParams = { + callback: string; + secretKey: string; + publicKey: string; + nangoAppHost: string; + nangoApiHost: string; +}; + +export type NangoConfig = Simplify< + ({ enabled: false } & { [k in keyof NangoParams]?: never }) | ({ enabled: true } & NangoParams) +>; + +function getNangoConfig(): NangoConfig { + if (!process.env.NANGO_APP_HOST) { + return { enabled: false }; + } + return { + enabled: true, + nangoAppHost: process.env.NANGO_APP_HOST, + nangoApiHost: requireDefined(process.env.NANGO_API_HOST, `env NANGO_API_HOST is required`), + secretKey: requireDefined(process.env.NANGO_SECRET_KEY, `env NANGO_SECRET_KEY is required`), + publicKey: requireDefined(process.env.NANGO_PUBLIC_KEY, `env NANGO_SECRET_KEY is required`), + callback: process.env.NANGO_CALLBACK || `${process.env.NANGO_HOST}/oauth/callback`, + }; +} + +export const nangoConfig: NangoConfig = getNangoConfig(); diff --git a/webapps/console/lib/server/oauth/services.tsx b/webapps/console/lib/server/oauth/services.tsx new file mode 100644 index 000000000..474fc3ffc --- /dev/null +++ b/webapps/console/lib/server/oauth/services.tsx @@ -0,0 +1,68 @@ +export type PackageId = `airbyte/${string}`; +/** + * Decorates services with OAuth authentication + */ + +export type OptionsObject = Record; + +export type OauthDecorator = { + /** + * ID of the package. Same as ConnectorPackage.packageId + */ + packageId: PackageId; + /** + * Type of the package. Same as ConnectorPackage.packageType + */ + packageType: "airbyte"; + + /** + * Provider id for nango (github, googlesheets, etc). See https://github.com/NangoHQ/nango/blob/master/packages/shared/providers.yaml + */ + nangoProvider: string; + + /** + * Integration id for nango. If not set, `jitsu-cloud-sync-${nangoProvider}` + */ + nangoIntegrationId?: string; + + /** + * @param original connector config, as defined by airbyte + * @param integrationObj nango integration object, it usually contains client id and secret, sometimes scopes + * @param connectionObj connection object, containing auth and refresh tokens + */ + merge: (opts: OptionsObject, integrationObj: OptionsObject, connectionObj: OptionsObject) => OptionsObject; + + /** + * Removes credentials fields from schema + * @param schema + */ + stripSchema(schema: any): any; +}; + +export function fillDefaults(dec: OauthDecorator): Required { + return { + nangoIntegrationId: `jitsu-cloud-sync-${dec.nangoProvider}`, + ...dec, + }; +} + +export const github: OauthDecorator = { + stripSchema(schema: any): any { + return schema; + }, + packageId: "airbyte/source-github", + packageType: "airbyte", + nangoProvider: "github", + merge: (opts, integrationObj, connectionObj) => { + return { + ...opts, + ...integrationObj, + credentials: { + access_token: connectionObj.access_token, + option_title: "OAuth Credentials", + }, + }; + }, +}; + +export const oauthDecorators = [github]; diff --git a/webapps/console/package.json b/webapps/console/package.json index 2f8e49bc6..914b49013 100644 --- a/webapps/console/package.json +++ b/webapps/console/package.json @@ -32,6 +32,7 @@ "@jitsu/protocols": "workspace:*", "@loadable/component": "^5.15.3", "@monaco-editor/react": "4.5.0", + "@nangohq/frontend": "^0.21.11", "@prisma/client": "^4.12.0", "@rjsf/antd": "5.3.1", "@rjsf/core": "5.3.1", @@ -52,6 +53,7 @@ "highlight.js": "^11.6.0", "ioredis": "^5.2.3", "js-yaml": "^4.1.0", + "json-schema-faker": "~0.5.3", "json5": "^2.2.3", "jsonwebtoken": "^8.5.1", "juava": "workspace:*", @@ -76,6 +78,7 @@ "react-icons": "^4.8.0", "react-json-view": "^1.19.1", "react-use": "^17.4.0", + "stable-hash": "0.0.3", "stopwatch-node": "^1.1.0", "tslib": "^2.4.0", "zod": "3.21.4", diff --git a/webapps/console/pages/[workspaceId]/connections/edit.tsx b/webapps/console/pages/[workspaceId]/connections/edit.tsx index 28755b535..b5d47c2a6 100644 --- a/webapps/console/pages/[workspaceId]/connections/edit.tsx +++ b/webapps/console/pages/[workspaceId]/connections/edit.tsx @@ -4,7 +4,7 @@ import React, { useEffect, useState } from "react"; import { LoadingAnimation } from "../../../components/GlobalLoader/GlobalLoader"; import { GlobalError } from "../../../components/GlobalError/GlobalError"; import ConnectionEditorPage from "../../../components/ConnectionEditorPage/ConnectionEditorPage"; -import { useStreamDestinationLinksQuery } from "../../../lib/queries"; +import { useLinksQuery } from "../../../lib/queries"; import { useConfigApi } from "../../../lib/useApi"; import { FunctionConfig } from "../../../lib/schema"; @@ -21,7 +21,7 @@ const Loader = () => { isLoading: true, error: null, }); - const result = useStreamDestinationLinksQuery(workspace.id, { + const result = useLinksQuery(workspace.id, "push", { cacheTime: 0, retry: false, }); diff --git a/webapps/console/pages/[workspaceId]/connections/index.tsx b/webapps/console/pages/[workspaceId]/connections/index.tsx index 3cc1eb113..e611c9b84 100644 --- a/webapps/console/pages/[workspaceId]/connections/index.tsx +++ b/webapps/console/pages/[workspaceId]/connections/index.tsx @@ -14,7 +14,7 @@ import { index } from "juava"; import { getCoreDestinationType } from "../../../lib/schema/destinations"; import { useRouter } from "next/router"; import { FiEdit2 } from "react-icons/fi"; -import { useStreamDestinationLinksQuery } from "../../../lib/queries"; +import { useLinksQuery } from "../../../lib/queries"; import { jsonSerializationBase64, useQueryStringState } from "../../../lib/useQueryStringState"; import { TableProps } from "antd/es/table/InternalTable"; import { ColumnType, SortOrder } from "antd/es/table/interface"; @@ -252,7 +252,7 @@ function Connections(props: RemoteEntitiesProps) { function ConnectionsLoader(props: { reloadCallback: () => void }) { const workspace = useWorkspace(); - const data = useStreamDestinationLinksQuery(workspace.id, { + const data = useLinksQuery(workspace.id, "push", { cacheTime: 0, retry: false, }); diff --git a/webapps/console/pages/[workspaceId]/destinations.tsx b/webapps/console/pages/[workspaceId]/destinations.tsx index 60628087d..10d2e9593 100644 --- a/webapps/console/pages/[workspaceId]/destinations.tsx +++ b/webapps/console/pages/[workspaceId]/destinations.tsx @@ -4,7 +4,6 @@ import { ConfigEditor, ConfigEditorProps, CustomWidgetProps, - EditorComponentFactory, FieldDisplay, } from "../../components/ConfigObjectEditor/ConfigEditor"; import { DestinationConfig } from "../../lib/schema"; @@ -56,7 +55,7 @@ const Loader: React.FC<{}> = () => { return null; } const destination = await getConfigApi(workspace.id, "destination").get( - router.query.id as string + (router.query.clone || router.query.id) as string ); return requireDefined( getCoreDestinationType(destination.destinationType), @@ -89,7 +88,7 @@ const Destinations: React.FC = () => { ); }; -const customEditors: Record<(typeof coreDestinations)[number]["id"], EditorComponentFactory> = { +const customEditors: Record<(typeof coreDestinations)[number]["id"], React.FC> = { // tag: props => { // return ; // }, @@ -596,7 +595,26 @@ const DestinationsList: React.FC<{ type?: string }> = ({ type }) => { newObject: () => { return { destinationType: router.query["destinationType"] as string }; }, - + testConnectionEnabled: (obj: DestinationConfig) => { + const destinationType = coreDestinationsMap[obj.destinationType]; + assertDefined(destinationType, `Destination ${obj.destinationType} is not found: ${JSON.stringify(obj)}`); + return !!destinationType.usesBulker; + }, + onTest: async obj => { + try { + const res = await getConfigApi(workspace.id, obj.type).test(obj); + return res.ok ? { ok: true } : { ok: false, error: res?.error || res?.message || "unknown error" }; + } catch (error) { + log + .atWarn() + .log( + `Failed to test destination ${workspace.id} / ${type}. This is not expected since destination tester should return 200 even in credentials are wrong`, + error + ); + return { ok: false, error: "Internal error, see logs for details" }; + //feedbackError("Failed to test object", { error }); + } + }, objectType: (obj: DestinationConfig) => { const destinationType = coreDestinationsMap[obj.destinationType]; assertDefined(destinationType, `Destination ${obj.destinationType} is not found: ${JSON.stringify(obj)}`); @@ -656,9 +674,7 @@ const DestinationsList: React.FC<{ type?: string }> = ({ type }) => { listTitle="Destinations" {...(config as any)} editorComponent={props => { - if (customEditors[props.object.destinationType]) { - return customEditors[props.object.destinationType](props); - } + return customEditors[props.object.destinationType]; }} /> diff --git a/webapps/console/pages/[workspaceId]/functions.tsx b/webapps/console/pages/[workspaceId]/functions.tsx index 58e5de883..26f085c2b 100644 --- a/webapps/console/pages/[workspaceId]/functions.tsx +++ b/webapps/console/pages/[workspaceId]/functions.tsx @@ -65,7 +65,7 @@ const FunctionsList: React.FC<{}> = () => { render: (c: FunctionConfig) => <>{c.description ?? ""}, }, ], - editorComponent: FunctionsDebugger, + editorComponent: () => FunctionsDebugger, objectType: FunctionConfig, fields: { type: { constant: "function" }, diff --git a/webapps/console/pages/[workspaceId]/index.tsx b/webapps/console/pages/[workspaceId]/index.tsx index 75847c83e..14bf9db4d 100644 --- a/webapps/console/pages/[workspaceId]/index.tsx +++ b/webapps/console/pages/[workspaceId]/index.tsx @@ -12,7 +12,7 @@ import { coreDestinationsMap } from "../../lib/schema/destinations"; import { PropsWithChildrenClassname, useTitle } from "../../lib/ui"; import { z } from "zod"; import { ConfigurationObjectLinkDbModel } from "../../prisma/schema"; -import { useStreamDestinationLinksQuery } from "../../lib/queries"; +import { useLinksQuery } from "../../lib/queries"; import { QuestionCircleOutlined } from "@ant-design/icons"; import { ButtonProps } from "antd/es/button/button"; import { Simplify } from "type-fest"; @@ -256,7 +256,7 @@ function WorkspaceOverview(props: { function WorkspaceOverviewLoader() { const workspace = useWorkspace(); - const data = useStreamDestinationLinksQuery(workspace.id, { + const data = useLinksQuery(workspace.id, "push", { cacheTime: 0, retry: false, }); diff --git a/webapps/console/pages/[workspaceId]/services.tsx b/webapps/console/pages/[workspaceId]/services.tsx new file mode 100644 index 000000000..e4c907ad8 --- /dev/null +++ b/webapps/console/pages/[workspaceId]/services.tsx @@ -0,0 +1,204 @@ +import { WorkspacePageLayout } from "../../components/PageLayout/WorkspacePageLayout"; +import { ConfigEditor, ConfigEditorProps } from "../../components/ConfigObjectEditor/ConfigEditor"; +import { ServiceConfig } from "../../lib/schema"; +import { useWorkspace } from "../../lib/context"; +import { useRouter } from "next/router"; +import { getLog, hash as jhash, randomId, rpc } from "juava"; +import React from "react"; +import { ServerCog } from "lucide-react"; +import { Modal, Space, Tooltip } from "antd"; +import { serialization, useURLPersistedState } from "../../lib/ui"; +import { ServicesCatalog } from "../../components/ServicesCatalog/ServicesCatalog"; +import { SourceType } from "../api/sources"; +import hash from "stable-hash"; +import { ServiceEditor } from "../../components/ServiceEditor/ServiceEditor"; +import { ErrorCard } from "../../components/GlobalError/GlobalError"; + +const log = getLog("services"); + +const Services: React.FC = () => { + const router = useRouter(); + console.log("router", router.pathname); + return ( + + + + ); +}; + +export const ServiceTitle: React.FC<{ + f?: ServiceConfig; + size?: "small" | "default" | "large"; + title?: (d?: ServiceConfig) => string; +}> = ({ f, title = d => d?.name ?? "service", size = "default" }) => { + const iconClassName = (() => { + switch (size) { + case "small": + return "h-4 w-4"; + case "large": + return "h-16 w-16"; + default: + return "h-8 w-8"; + } + })(); + return ( + +
+ +
+
+ {title(f)} +
+
+ ); +}; + +const ServicesList: React.FC<{}> = () => { + const workspace = useWorkspace(); + + const [showCatalog, setShowCatalog] = useURLPersistedState("showCatalog", { + defaultVal: false, + type: serialization.bool, + }); + const router = useRouter(); + + if (!workspace.featuresEnabled || !workspace.featuresEnabled.includes("syncs")) { + return ( + + ); + } + + const config: ConfigEditorProps = { + listColumns: [ + { + title: "Package", + render: (c: ServiceConfig) => <>{`${c.package}:${c.version}`}, + }, + ], + objectType: ServiceConfig, + fields: { + type: { constant: "service" }, + workspaceId: { constant: workspace.id }, + protocol: { hidden: true }, + package: { hidden: true }, + }, + noun: "service", + type: "service", + explanation: "Services are used to connect to external systems", + editorComponent: () => ServiceEditor, + loadMeta: async (obj?: ServiceConfig) => { + let packageType = ""; + let packageId = ""; + if (obj) { + packageType = obj.protocol; + packageId = obj.package; + } else { + packageType = router.query["packageType"] as string; + packageId = router.query["packageId"] as string; + } + const rawVersions = await rpc( + `/api/sources/versions?type=${packageType}&package=${encodeURIComponent(packageId)}` + ); + const versions = rawVersions.versions.filter((v: any) => v.isRelease).map((v: any) => v.name); + const sourceType = await rpc(`/api/sources/${packageType}/${encodeURIComponent(packageId)}`); + + return { + ...sourceType, + versions, + }; + }, + newObject: meta => { + if (meta) { + return { + name: meta.meta.name, + protocol: meta.packageType as ServiceConfig["protocol"], + package: meta.packageId, + version: meta.versions[0], + }; + } else { + throw new Error("Failed to load service metadata"); + } + }, + testConnectionEnabled: (obj: ServiceConfig) => { + return true; + }, + onTest: async obj => { + console.log("Testing service", obj, typeof obj); + try { + //hash object to avoid sending credentials to the server + const queryId = randomId(); + const h = jhash("md5", hash(JSON.parse(obj.credentials))); + const storageKey = `${workspace.id}_${obj.id}_${h}_${queryId}`; + const res = await rpc(`/api/${workspace.id}/sources/check?storageKey=${storageKey}`, { + method: "POST", + body: obj, + }); + if (res.error) { + return res; + } + for (let i = 0; i < 60; i++) { + const res = await rpc(`/api/${workspace.id}/sources/check?storageKey=${storageKey}`); + if (!res.pending) { + return res; + } + await new Promise(resolve => setTimeout(resolve, 2000)); + } + return { ok: false, error: "Connection test timeout." }; + } catch (error) { + log + .atWarn() + .log( + `Failed to test service ${workspace.id} / ${obj.package}. This is not expected since service tester should return 200 even in credentials are wrong`, + error + ); + return { ok: false, error: "Internal error, see logs for details" }; + //feedbackError("Failed to test object", { error }); + } + }, + addAction: () => { + setShowCatalog(true); + }, + editorTitle: (obj: ServiceConfig, isNew: boolean, meta) => { + if (!meta) { + throw new Error("Failed to load service metadata"); + } + const verb = isNew ? "New" : "Edit"; + return ( +
+
{{meta.packageId}}
+ {verb} service: {meta.meta.name} +
+ ); + }, + subtitle: (obj: ServiceConfig, isNew: boolean, meta) => { + return `${obj.package || meta!.packageId}`; + }, + }; + return ( + <> + setShowCatalog(false)} + footer={null} + > + { + setShowCatalog(false); + router.push( + `/${workspace.id}/services?id=new&packageType=${packageType}&packageId=${encodeURIComponent(packageId)}` + ); + }} + /> + + + + ); +}; + +export default Services; diff --git a/webapps/console/pages/[workspaceId]/syncs/edit.tsx b/webapps/console/pages/[workspaceId]/syncs/edit.tsx new file mode 100644 index 000000000..f1a5c4c67 --- /dev/null +++ b/webapps/console/pages/[workspaceId]/syncs/edit.tsx @@ -0,0 +1,48 @@ +import { WorkspacePageLayout } from "../../../components/PageLayout/WorkspacePageLayout"; +import { useWorkspace } from "../../../lib/context"; +import React from "react"; +import { LoadingAnimation } from "../../../components/GlobalLoader/GlobalLoader"; +import { ErrorCard, GlobalError } from "../../../components/GlobalError/GlobalError"; +import { useLinksQuery } from "../../../lib/queries"; +import SyncEditorPage from "../../../components/SyncEditorPage/SyncEditorPage"; + +const Loader = () => { + const workspace = useWorkspace(); + + const result = useLinksQuery(workspace.id, "sync", { + cacheTime: 0, + retry: false, + }); + if (!workspace.featuresEnabled || !workspace.featuresEnabled.includes("syncs")) { + return ( + + ); + } + + if (result.isLoading) { + return ; + } + if (result.error) { + return ; + } + const [services, destinations, links] = result.data; + return ; +}; + +const RootComponent: React.FC = () => { + return ( + +
+ +
+
+ ); +}; + +RootComponent.displayName = "SyncEditorPage"; + +export default RootComponent; diff --git a/webapps/console/pages/[workspaceId]/syncs/index.tsx b/webapps/console/pages/[workspaceId]/syncs/index.tsx new file mode 100644 index 000000000..e27072af8 --- /dev/null +++ b/webapps/console/pages/[workspaceId]/syncs/index.tsx @@ -0,0 +1,309 @@ +import { WorkspacePageLayout } from "../../../components/PageLayout/WorkspacePageLayout"; +import { useWorkspace } from "../../../lib/context"; +import { get } from "../../../lib/useApi"; +import { DestinationConfig, ServiceConfig } from "../../../lib/schema"; +import { ConfigurationObjectLinkDbModel } from "../../../prisma/schema"; +import { QueryResponse } from "../../../components/QueryResponse/QueryResponse"; +import { z } from "zod"; +import { Table, Tooltip } from "antd"; +import { confirmOp, feedbackError, feedbackSuccess } from "../../../lib/ui"; +import React, { useState } from "react"; +import Link from "next/link"; +import { FaExternalLinkAlt, FaPlus, FaRunning, FaTrash } from "react-icons/fa"; +import { index, rpc } from "juava"; +import { getCoreDestinationType } from "../../../lib/schema/destinations"; +import { useRouter } from "next/router"; +import { FiEdit2 } from "react-icons/fi"; +import { useLinksQuery } from "../../../lib/queries"; +import { jsonSerializationBase64, useQueryStringState } from "../../../lib/useQueryStringState"; +import { TableProps } from "antd/es/table/InternalTable"; +import { ColumnType, SortOrder } from "antd/es/table/interface"; +import { Inbox } from "lucide-react"; +import { PlusOutlined } from "@ant-design/icons"; +import { JitsuButton, WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; +import { ErrorCard } from "../../../components/GlobalError/GlobalError"; + +function EmptyLinks() { + const workspace = useWorkspace(); + return ( +
+
+
+ {" "} + You don't have any links between services and{" "} + destinations +
+ + + Create your first sync + +
+
+ ); +} + +type SyncDbModel = z.infer; + +type RemoteEntitiesProps = { + services: ServiceConfig[]; + destinations: DestinationConfig[]; + links: Omit[]; + reloadCallback: () => void; +}; + +type SortingSettings = { + columns: { order: SortOrder; field: string }[]; +}; + +function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEntitiesProps) { + const servicesById = index(services, "id"); + const destinationsById = index(destinations, "id"); + const workspace = useWorkspace(); + const router = useRouter(); + const [loading, setLoading] = React.useState(false); + const [sorting, setSorting] = useQueryStringState("sorting", { + defaultValue: { columns: [] }, + ...jsonSerializationBase64, + }); + const deleteSync = async (link: Omit) => { + if (await confirmOp("Are you sure you want to unlink this service from this destination?")) { + setLoading(true); + try { + await get(`/api/${workspace.id}/config/link`, { + method: "DELETE", + query: { fromId: link.fromId, toId: link.toId }, + }); + feedbackSuccess("Successfully unliked"); + reloadCallback(); + } catch (e) { + feedbackError("Failed to unlink service and destination", { error: e }); + } finally { + setLoading(false); + } + } + }; + const onChange: TableProps["onChange"] = (pagination, filters, sorter, { currentDataSource }) => { + const sortArray = Array.isArray(sorter) ? sorter : [sorter]; + const columns = sortArray + .filter(s => !!s.column?.title && !!s.order) + .map(s => ({ field: s.column?.title, order: s.order })); + const newVal = { + columns: columns as any, + }; + setSorting(newVal); + console.log("sorter", newVal); + }; + const columns: ColumnType[] = [ + { + title: "Service", + width: "60%", + sortOrder: sorting.columns?.find(s => s.field === "Service")?.order, + sorter: (a, b) => { + const serviceA = servicesById[a.fromId]; + const serviceB = servicesById[b.fromId]; + return (serviceA.name || "").localeCompare(serviceB.name || ""); + }, + render: (text, link) => { + const service = servicesById[link.fromId]; + if (!service) { + return
Service not found
; + } + return ( +
+
+ + {service.package} + +
+
{service.name}
+
+ } + /> +
+
+ ); + }, + }, + { + title: "Destination", + width: "40%", + sortOrder: sorting.columns?.find(s => s.field === "Destination")?.order, + + sorter: (a, b) => { + const destA = destinationsById[a.toId]; + const destB = destinationsById[b.toId]; + return (destA.name || "").localeCompare(destB.name || ""); + }, + render: (text, link) => { + const destination = destinationsById[link.toId]; + if (!destination) { + return
Destination not found
; + } + const coreDestinationType = getCoreDestinationType(destination.destinationType); + return ( +
+
+
+ {coreDestinationType.icon} +
+
{destination.name}
+
+ } + className="link" + size="small" + href={`/${workspace.id}/destinations?id=${link.toId}`} + /> +
+
+
+ ); + }, + }, + { + title: "Actions", + render: (text, link) => ( +
+ } + onClick={async () => { + rpc(`/api/${workspace.id}/sources/run?syncId=${link.id}`); + }} + /> + } /> + } + onClick={() => { + deleteSync(link); + }} + /> +
+ ), + }, + ]; + return ( +
+ + + ); +} + +function Syncs(props: RemoteEntitiesProps) { + const { services, destinations, links } = props; + const workspace = useWorkspace(); + if (props.services.length == 0 || props.destinations.length == 0) { + return ( +
+ +
+ In order to connect service to destination please create at least one destination and one service. Currently, + you have{" "} + + {props.destinations.length} destination{props.destinations.length === 1 ? "" : "s"} + {" "} + and{" "} + + {props.services.length} service{props.services.length === 1 ? "" : "s"} + {" "} + configured +
+
+ }> + Create Destination + + }> + Create Service + +
+
+ ); + } + return ( +
+
+
+
Edit syncs
+
+
+ }> + Connect service and destination + +
+
+
+ {links.length === 0 && } + {links.length > 0 && ( + + )} +
+
+ ); +} + +function SyncsLoader(props: { reloadCallback: () => void }) { + const workspace = useWorkspace(); + const data = useLinksQuery(workspace.id, "sync", { + cacheTime: 0, + retry: false, + }); + if (!workspace.featuresEnabled || !workspace.featuresEnabled.includes("syncs")) { + return ( + + ); + } + + return ( + ( + + )} + /> + ); +} + +const SyncsPage = () => { + const [refresh, setRefresh] = useState(new Date()); + return ( + + { + setRefresh(new Date()); + }} + /> + + ); +}; +export default SyncsPage; diff --git a/webapps/console/pages/admin/oauth-test.tsx b/webapps/console/pages/admin/oauth-test.tsx new file mode 100644 index 000000000..1fd478ec5 --- /dev/null +++ b/webapps/console/pages/admin/oauth-test.tsx @@ -0,0 +1,134 @@ +import { useQuery } from "@tanstack/react-query"; +import { getErrorMessage, getLog, rpc } from "juava"; +import type { OauthDecorator } from "../../lib/server/oauth/services"; +import { Loader2 } from "lucide-react"; +import { ErrorCard } from "../../components/GlobalError/GlobalError"; +import { useState } from "react"; +import { Button, Input, Select } from "antd"; + +import { AppConfig } from "../../lib/schema"; +import Nango from "@nangohq/frontend"; +import { CodeBlock } from "../../components/CodeBlock/CodeBlock"; + +type OauthService = Omit, "merge">; + +const CatalogView: React.FC<{ connectors: OauthService[]; appConfig: AppConfig }> = ({ connectors, appConfig }) => { + const [selectedPackage, setSelectedPackage] = useState(connectors[0].packageId); + const [serviceId, setServiceId] = useState(""); + const [adding, setAdding] = useState(false); + const [nangoError, setNangoError] = useState(); + const [retrieving, setRetrieving] = useState(false); + const [retrievingError, setRetrievingError] = useState(); + const [retrievedForService, setRetrieveForService] = useState(""); + const [credentials, setCredentials] = useState(); + const [integrationId, setIntegrationId] = useState(""); + + if (!appConfig.nango) { + return
Oauth integration is not enabled
; + } + + return ( +
+
+

Add new connection

+
+

Select connector

+ setServiceId(e.target.value)} value={serviceId} /> + + {nangoError &&
{nangoError}
} +
+

Get credentials

+
+

Service id

+ setRetrieveForService(e.target.value)} value={retrievedForService} /> +

Integration id (optional)

+ setIntegrationId(e.target.value)} value={integrationId} /> + + {retrievingError &&
{retrievingError}
} + {credentials && {JSON.stringify(credentials, null, 2)}} +
+
+
+ ); +}; + +const OauthTest: React.FC<{}> = () => { + const { data, isLoading, error } = useQuery( + ["oauth-catalog"], + async () => { + const catalog = (await rpc(`/api/oauth/catalog`)) as { decorators: OauthService[] }; + const appConfig = (await rpc(`/api/app-config`)) as AppConfig; + return { catalog: catalog.decorators, appConfig }; + }, + { cacheTime: 0, retry: false } + ); + + if (isLoading) { + return ( +
+ +
+ ); + } else if (error) { + return ( +
+ +
+ ); + } + + return ; +}; + +export default OauthTest; diff --git a/webapps/console/pages/api/[workspaceId]/config/link.ts b/webapps/console/pages/api/[workspaceId]/config/link.ts index dca1ba15d..f65fe9cf1 100644 --- a/webapps/console/pages/api/[workspaceId]/config/link.ts +++ b/webapps/console/pages/api/[workspaceId]/config/link.ts @@ -24,21 +24,23 @@ export const api: Api = { auth: true, types: { query: z.object({ workspaceId: z.string() }), - body: z.object({ data: z.any().optional(), toId: z.string(), fromId: z.string() }), + body: z.object({ data: z.any().optional(), toId: z.string(), fromId: z.string(), type: z.string().optional() }), }, handle: async ({ body, user, query: { workspaceId } }) => { - const { toId, fromId, data = undefined } = body; + const { toId, fromId, data = undefined, type = "push" } = body; await verifyAccess(user, workspaceId); const existingLink = await db.prisma().configurationObjectLink.findFirst({ where: { workspaceId: workspaceId, toId, fromId, deleted: false }, }); + const fromType = type === "sync" ? "service" : "stream"; + const co = db.prisma().configurationObject; if ( !(await co.findFirst({ - where: { workspaceId: workspaceId, type: "stream", id: fromId, deleted: false }, + where: { workspaceId: workspaceId, type: fromType, id: fromId, deleted: false }, })) ) { - throw new Error(`Stream object with id '${fromId}' not found in the workspace '${workspaceId}'`); + throw new Error(`${fromType} object with id '${fromId}' not found in the workspace '${workspaceId}'`); } if ( !(await co.findFirst({ @@ -62,6 +64,7 @@ export const api: Api = { fromId, toId, data, + type, }, }); await fastStore.fullRefresh(); diff --git a/webapps/console/pages/api/[workspaceId]/sources/check.ts b/webapps/console/pages/api/[workspaceId]/sources/check.ts new file mode 100644 index 000000000..0331886f1 --- /dev/null +++ b/webapps/console/pages/api/[workspaceId]/sources/check.ts @@ -0,0 +1,114 @@ +import { db } from "../../../../lib/server/db"; +import { z } from "zod"; +import { createRoute, verifyAccess } from "../../../../lib/api"; +import { ServiceConfig } from "../../../../lib/schema"; +import { randomId, requireDefined, rpc } from "juava"; + +const resultType = z.object({ + ok: z.boolean(), + pending: z.boolean().optional(), + error: z.string().optional(), +}); + +export default createRoute() + .POST({ + auth: true, + query: z.object({ + workspaceId: z.string(), + storageKey: z.string(), + }), + body: ServiceConfig, + result: resultType, + }) + .handler(async ({ user, query, body }) => { + const { workspaceId } = query; + await verifyAccess(user, workspaceId); + + const syncURL = requireDefined( + process.env.SYNCCTL_URL, + `env SYNCCTL_URL is not set. Sync Controller is required to run sources` + ); + const syncAuthKey = process.env.SYNCCTL_AUTH_KEY ?? ""; + const authHeaders: any = {}; + if (syncAuthKey) { + authHeaders["Authorization"] = `Bearer ${syncAuthKey}`; + } + + try { + const checkRes = await rpc(syncURL + "/check", { + method: "POST", + body: { + config: JSON.parse(body.credentials), + }, + headers: { + "Content-Type": "application/json", + ...authHeaders, + }, + query: { + package: body.package, + version: body.version, + storageKey: query.storageKey, + }, + }); + if (!checkRes.ok) { + return { ok: false, error: checkRes.error ?? "unknown error" }; + } else { + return { ok: false, pending: true }; + } + } catch (e: any) { + const errorId = randomId(); + console.error( + `Error running connection check for source ${query.storageKey} in workspace ${workspaceId}. Error ID: ${errorId}. Error: ${e}` + ); + return { + ok: false, + error: `couldn't run connection check due to internal server error. Please contact support. Error ID: ${errorId}`, + }; + } + }) + .GET({ + auth: true, + query: z.object({ + workspaceId: z.string(), + storageKey: z.string(), + }), + result: resultType, + }) + .handler(async ({ user, query, body }) => { + const { workspaceId } = query; + await verifyAccess(user, workspaceId); + try { + const res = await db + .pgPool() + .query(`select status, description from source_check where key = $1`, [query.storageKey]); + if (res.rowCount === 1) { + const status = res.rows[0].status; + const description = res.rows[0].description; + if (status === "SUCCESS") { + return { + ok: true, + }; + } else { + return { + ok: false, + error: description, + }; + } + } else { + return { + ok: false, + pending: true, + }; + } + } catch (e: any) { + const errorId = randomId(); + console.error( + `Error running connection check for source ${query.storageKey} in workspace ${workspaceId}. Error ID: ${errorId}. Error: ${e}` + ); + return { + ok: false, + error: `couldn't run connection check due to internal server error. Please contact support. Error ID: ${errorId}`, + }; + } + }) + .toNextApiHandler(); diff --git a/webapps/console/pages/api/[workspaceId]/sources/discover.ts b/webapps/console/pages/api/[workspaceId]/sources/discover.ts new file mode 100644 index 000000000..866044b4e --- /dev/null +++ b/webapps/console/pages/api/[workspaceId]/sources/discover.ts @@ -0,0 +1,149 @@ +import { db } from "../../../../lib/server/db"; +import { z } from "zod"; +import { createRoute, verifyAccess } from "../../../../lib/api"; +import { ServiceConfig } from "../../../../lib/schema"; +import { randomId, requireDefined, rpc } from "juava"; + +const resultType = z.object({ + ok: z.boolean(), + pending: z.boolean().optional(), + catalog: z.object({}).passthrough().optional(), + error: z.string().optional(), +}); + +const queryType = z.object({ + workspaceId: z.string(), + package: z.string(), + version: z.string(), + storageKey: z.string(), +}); + +type queryType = z.infer; + +export default createRoute() + .POST({ + auth: true, + query: z.object({ + workspaceId: z.string(), + storageKey: z.string(), + refresh: z.boolean().optional(), + }), + body: ServiceConfig, + result: resultType, + }) + .handler(async ({ user, query, body }) => { + const { workspaceId } = query; + await verifyAccess(user, workspaceId); + + const syncURL = requireDefined( + process.env.SYNCCTL_URL, + `env SYNCCTL_URL is not set. Sync Controller is required to run sources` + ); + const syncAuthKey = process.env.SYNCCTL_AUTH_KEY ?? ""; + const authHeaders: any = {}; + if (syncAuthKey) { + authHeaders["Authorization"] = `Bearer ${syncAuthKey}`; + } + + try { + if (!query.refresh) { + const res = await checkInDb({ ...query, package: body.package, version: body.version }); + if (res && !res.error) { + return res; + } + } + const checkRes = await rpc(syncURL + "/discover", { + method: "POST", + body: { + config: JSON.parse(body.credentials), + }, + headers: { + "Content-Type": "application/json", + ...authHeaders, + }, + query: { + package: body.package, + version: body.version, + storageKey: query.storageKey, + }, + }); + if (!checkRes.ok) { + return { ok: false, error: checkRes.error ?? "unknown error" }; + } else { + return { ok: false, pending: true }; + } + } catch (e: any) { + const errorId = randomId(); + console.error( + `Error running discover for source ${query.storageKey} in workspace ${workspaceId}. Error ID: ${errorId}. Error: ${e}` + ); + return { + ok: false, + error: `couldn't run discover due to internal server error. Please contact support. Error ID: ${errorId}`, + }; + } + }) + .GET({ + auth: true, + query: queryType, + result: resultType, + }) + .handler(async ({ user, query, body }) => { + const { workspaceId } = query; + await verifyAccess(user, workspaceId); + try { + const res = await checkInDb(query); + if (res) { + return res; + } else { + throw new Error("catalog not found in the database"); + } + } catch (e: any) { + const errorId = randomId(); + console.error( + `Error running discover check for source ${query.storageKey} in workspace ${workspaceId}. Error ID: ${errorId}. Error: ${e}` + ); + return { + ok: false, + error: `couldn't run discover check due to internal server error. Please contact support. Error ID: ${errorId}`, + }; + } + }) + .toNextApiHandler(); + +async function checkInDb(query: queryType) { + const res = await db + .pgPool() + .query(`select catalog, status, description from source_catalog where key = $1 and package = $2 and version = $3`, [ + query.storageKey, + query.package, + query.version, + ]); + if (res.rowCount === 1) { + const status = res.rows[0].status; + const catalog = res.rows[0].catalog; + const description = res.rows[0].description; + switch (status) { + case "SUCCESS": + return { ok: true, catalog: selectStreamsFromCatalog(catalog) }; + case "RUNNING": + return { ok: false, pending: true }; + default: + return { ok: false, error: description }; + } + } else { + return null; + } +} + +function selectStreamsFromCatalog(catalog: any): any { + let streams: any[] = []; + for (const stream of catalog.streams) { + streams.push({ + sync_mode: stream.supported_sync_modes[0], + destination_sync_mode: "overwrite", + stream: { ...stream }, + }); + } + return { streams }; +} diff --git a/webapps/console/pages/api/[workspaceId]/sources/run.ts b/webapps/console/pages/api/[workspaceId]/sources/run.ts new file mode 100644 index 000000000..453b2c86b --- /dev/null +++ b/webapps/console/pages/api/[workspaceId]/sources/run.ts @@ -0,0 +1,91 @@ +import { db } from "../../../../lib/server/db"; +import { z } from "zod"; +import { createRoute, verifyAccess } from "../../../../lib/api"; +import { randomId, requireDefined, rpc } from "juava"; +import { randomUUID } from "crypto"; + +const resultType = z.object({ + ok: z.boolean(), + taskID: z.string().optional(), + error: z.string().optional(), +}); + +export default createRoute() + .GET({ + auth: true, + query: z.object({ + workspaceId: z.string(), + syncId: z.string(), + }), + result: resultType, + }) + .handler(async ({ user, query, body }) => { + const { workspaceId } = query; + await verifyAccess(user, workspaceId); + const syncURL = requireDefined( + process.env.SYNCCTL_URL, + `env SYNCCTL_URL is not set. Sync Controller is required to run sources` + ); + const syncAuthKey = process.env.SYNCCTL_AUTH_KEY ?? ""; + const authHeaders: any = {}; + if (syncAuthKey) { + authHeaders["Authorization"] = `Bearer ${syncAuthKey}`; + } + try { + const sync = await db.prisma().configurationObjectLink.findUnique({ + where: { + id: query.syncId as string, + }, + include: { + from: true, + }, + }); + if (!sync) { + return { + ok: false, + error: `syncId ${query.syncId} not found`, + }; + } + console.log("sync", sync); + const service = sync.from; + if (!service) { + return { + ok: false, + error: `service ${sync.from} not found`, + }; + } + const taskId = randomUUID(); + const res = await rpc(syncURL + "/read", { + method: "POST", + headers: { + "Content-Type": "application/json", + ...authHeaders, + }, + query: { + package: (service.config as any).package, + version: (service.config as any).version, + taskId, + syncId: query.syncId, + }, + body: { + config: JSON.parse((service.config as any).credentials), + catalog: JSON.parse((sync.data as any).streams), + }, + }); + if (!res.ok) { + return { ok: false, error: res.error ?? "unknown error", taskId }; + } else { + return { ok: true, taskId }; + } + } catch (e: any) { + const errorId = randomId(); + console.error( + `Error running sync ${query.syncId} in workspace ${workspaceId}. Error ID: ${errorId}. Error: ${e}` + ); + return { + ok: false, + error: `couldn't run sync due to internal server error. Please contact support. Error ID: ${errorId}`, + }; + } + }) + .toNextApiHandler(); diff --git a/webapps/console/pages/api/[workspaceId]/sources/spec.ts b/webapps/console/pages/api/[workspaceId]/sources/spec.ts new file mode 100644 index 000000000..e3058eccf --- /dev/null +++ b/webapps/console/pages/api/[workspaceId]/sources/spec.ts @@ -0,0 +1,117 @@ +import { db } from "../../../../lib/server/db"; +import { z } from "zod"; +import { createRoute, verifyAccess } from "../../../../lib/api"; +import { randomId, requireDefined, rpc } from "juava"; +import { JSONSchemaFaker } from "json-schema-faker"; +import { JsonObject } from "type-fest"; + +JSONSchemaFaker.option("alwaysFakeOptionals", true); +JSONSchemaFaker.option("useDefaultValue", true); +JSONSchemaFaker.option("useExamplesValue", true); +JSONSchemaFaker.option("sortProperties", true); +JSONSchemaFaker.option("fillProperties", false); +JSONSchemaFaker.option("maxItems", 2); +JSONSchemaFaker.option("minLength", 2); +JSONSchemaFaker.option("replaceEmptyByRandomValue", true); +JSONSchemaFaker.option("ignoreProperties", ["replication_method", "tunnel_method"]); + +const resultType = z.object({ + ok: z.boolean(), + pending: z.boolean().optional(), + error: z.string().optional(), + specs: z.object({}).passthrough().optional(), + fakeJson: z.object({}).passthrough().optional(), + startedAt: z.number().optional(), +}); + +export default createRoute() + .GET({ + auth: true, + query: z.object({ + workspaceId: z.string(), + package: z.string(), + version: z.string(), + after: z.string().optional(), + }), + result: resultType, + }) + .handler(async ({ user, query, body }) => { + const { workspaceId } = query; + await verifyAccess(user, workspaceId); + const syncURL = requireDefined( + process.env.SYNCCTL_URL, + `env SYNCCTL_URL is not set. Sync Controller is required to run sources` + ); + const syncAuthKey = process.env.SYNCCTL_AUTH_KEY ?? ""; + const authHeaders: any = {}; + if (syncAuthKey) { + authHeaders["Authorization"] = `Bearer ${syncAuthKey}`; + } + try { + let res; + if (query.after) { + res = await db + .pgPool() + .query(`select specs, error from source_spec where package = $1 and version = $2 and timestamp >= $3`, [ + query.package, + query.version, + new Date(parseInt(query.after)), + ]); + } else { + res = await db + .pgPool() + .query(`select specs, error from source_spec where package = $1 and version = $2`, [ + query.package, + query.version, + ]); + } + let error; + if (res.rowCount === 1) { + const specs = res.rows[0].specs; + const fakeJson = await JSONSchemaFaker.resolve(specs.connectionSpecification); + if (!error && specs) { + return { + ok: true, + specs, + fakeJson: fakeJson as JsonObject, + }; + } else { + error = res.rows[0].error ?? "unknown error"; + } + } + if (!query.after) { + const checkRes = await rpc(syncURL + "/spec", { + method: "GET", + headers: { + "Content-Type": "application/json", + ...authHeaders, + }, + query: { + package: query.package, + version: query.version, + }, + }); + if (!checkRes.ok) { + return { ok: false, error: checkRes.error ?? "unknown error" }; + } else { + return { ok: false, pending: true, startedAt: checkRes.startedAt }; + } + } else { + if (error) { + return { ok: false, error }; + } else { + return { ok: false, pending: true, startedAt: parseInt(query.after) }; + } + } + } catch (e: any) { + const errorId = randomId(); + console.error( + `Error loading specs for source ${query.package}:${query.version} in workspace ${workspaceId}. Error ID: ${errorId}. Error: ${e}` + ); + return { + ok: false, + error: `couldn't load specs due to internal server error. Please contact support. Error ID: ${errorId}`, + }; + } + }) + .toNextApiHandler(); diff --git a/webapps/console/pages/api/app-config.ts b/webapps/console/pages/api/app-config.ts index 2d566c34f..0680ae2a4 100644 --- a/webapps/console/pages/api/app-config.ts +++ b/webapps/console/pages/api/app-config.ts @@ -4,12 +4,14 @@ import { getAppEndpoint, getDataDomain } from "../../lib/domains"; import { getEeConnection } from "../../lib/server/ee"; import { isEEAvailable } from "./ee/jwt"; import { isFirebaseEnabled, requireFirebaseOptions } from "../../lib/server/firebase-server"; +import { nangoConfig } from "../../lib/server/oauth/nango-config"; export default createRoute() .GET({ result: AppConfig, auth: false }) .handler(async ({ req }) => { const publicEndpoints = getAppEndpoint(req); const dataHost = getDataDomain(publicEndpoints); + return { docsUrl: process.env.JITSU_DOCUMENTATION_URL || "https://docs-jitsu-com.staging.jitsu.com/", websiteUrl: process.env.JITSU_WEBSITE_URL || "https://next.jitsu.com", @@ -39,6 +41,12 @@ export default createRoute() port: publicEndpoints.isDefaultPort ? undefined : publicEndpoints.port, }, logLevel: (process.env.FRONTEND_LOG_LEVEL || process.env.LOG_LEVEL || "info") as any, + nango: nangoConfig.enabled + ? { + publicKey: nangoConfig.publicKey, + host: nangoConfig.nangoApiHost, + } + : undefined, }; }) .toNextApiHandler(); diff --git a/webapps/console/pages/api/oauth/[serviceId].ts b/webapps/console/pages/api/oauth/[serviceId].ts new file mode 100644 index 000000000..8d956d8c9 --- /dev/null +++ b/webapps/console/pages/api/oauth/[serviceId].ts @@ -0,0 +1,72 @@ +import { createRoute, verifyAccess } from "../../../lib/api"; +import { db } from "../../../lib/server/db"; +import { z } from "zod"; +import { getLog, requireDefined, rpc } from "juava"; +import { nangoConfig } from "../../../lib/server/oauth/nango-config"; +import { fillDefaults, OauthDecorator, oauthDecorators } from "../../../lib/server/oauth/services"; + +export default createRoute() + .GET({ + auth: true, + query: z.object({ + serviceId: z.string(), + integrationId: z.string().optional(), + }), + }) + .handler(async ({ req, query, user }) => { + const object = await db.prisma().configurationObject.findFirst({ + where: { id: query.serviceId, deleted: false }, + }); + + let credentials: any; + let integrationId: string | undefined; + let oauthDecorator: OauthDecorator; + + if (object) { + await verifyAccess(user, object.workspaceId); + credentials = { + id: object.id, + workspaceId: object.workspaceId, + ...(object.config || ({} as any)), + }; + const packageId = (object.config as any).packageId; + oauthDecorator = requireDefined( + oauthDecorators.map(fillDefaults).find(d => d.packageId === packageId), + `Package ${packageId} for service ${query.serviceId} not found in catalog` + ); + integrationId = oauthDecorator.nangoIntegrationId; + } else { + const userProfile = await db.prisma().userProfile.findFirst({ where: { id: user.internalId } }); + integrationId = requireDefined( + query.integrationId, + `integrationId is required if service (${query.serviceId}) is not found ` + ); + oauthDecorator = requireDefined( + oauthDecorators.map(fillDefaults).find(d => d.nangoIntegrationId === integrationId), + `Integration ${integrationId} not found in catalog` + ); + if (!userProfile || !userProfile.admin) { + throw new Error(`Access denied`); + } + credentials = { + warning: `Service ${query.serviceId} not found in database`, + }; + } + // this code doesn't work because nango doesn't return secrets + // const integrationSettings = await rpc(`${nangoConfig.nangoApiHost}/config/${integrationId}`, { + // headers: { Authorization: `Bearer ${nangoConfig.secretKey}` }, + // }); + const integrationSettings = {}; //todo - pull secrets from OauthSecrets table + const nangoConnectionObject = await rpc( + `${nangoConfig.nangoApiHost}/connection/sync-source.${query.serviceId}?provider_config_key=${integrationId}`, + { headers: { Authorization: `Bearer ${nangoConfig.secretKey}` } } + ); + + getLog().atInfo().log("Integration settings", JSON.stringify(integrationSettings, null, 2)); + getLog().atInfo().log("Configuration object", JSON.stringify(nangoConnectionObject, null, 2)); + + return { + credentials: oauthDecorator.merge(credentials, integrationSettings, nangoConnectionObject.credentials), + }; + }) + .toNextApiHandler(); diff --git a/webapps/console/pages/api/oauth/catalog.ts b/webapps/console/pages/api/oauth/catalog.ts new file mode 100644 index 000000000..69bf62893 --- /dev/null +++ b/webapps/console/pages/api/oauth/catalog.ts @@ -0,0 +1,10 @@ +import { createRoute } from "../../../lib/api"; +import { fillDefaults, oauthDecorators } from "../../../lib/server/oauth/services"; +import omit from "lodash/omit"; + +export default createRoute() + .GET({ auth: true }) + .handler(async ({ res }) => { + return { decorators: oauthDecorators.map(fillDefaults).map(s => omit(s, "merge")) }; + }) + .toNextApiHandler(); diff --git a/webapps/console/pages/api/oauth/init.ts b/webapps/console/pages/api/oauth/init.ts new file mode 100644 index 000000000..cc1be75dc --- /dev/null +++ b/webapps/console/pages/api/oauth/init.ts @@ -0,0 +1,11 @@ +import { createRoute } from "../../../lib/api"; +import { nangoConfig } from "../../../lib/server/oauth/nango-config"; +import { assertTrue } from "juava"; + +export default createRoute() + .GET({ auth: true }) + .handler(async ({ res }) => { + assertTrue(nangoConfig.enabled, "Oauth is disabled"); + res.redirect(nangoConfig.callback); + }) + .toNextApiHandler(); diff --git a/webapps/console/pages/api/sources/[packageType]/[packageId].ts b/webapps/console/pages/api/sources/[packageType]/[packageId].ts new file mode 100644 index 000000000..e1b7e400c --- /dev/null +++ b/webapps/console/pages/api/sources/[packageType]/[packageId].ts @@ -0,0 +1,36 @@ +import { createRoute } from "../../../../lib/api"; +import { db } from "../../../../lib/server/db"; +import pick from "lodash/pick"; +import { SourceType } from "../index"; + +export default createRoute() + .GET({ auth: false }) + .handler(async ({ req }): Promise => { + const packageType = req.query.packageType as string; + const packageId = req.query.packageId as string; + const connectorPackage = await db.prisma().connectorPackage.findFirst({ where: { packageType, packageId } }); + if (!connectorPackage) { + throw new Error(`Source ${packageId} of ${packageType} type not found`); + } + const { id, logoSvg, meta, ...rest } = connectorPackage; + return { + id, + ...rest, + logo: logoSvg + ? `/api/sources/logo?type=${encodeURIComponent(rest.packageType)}&package=${encodeURIComponent(rest.packageId)}` + : undefined, + versions: `/api/sources/versions?type=${encodeURIComponent(rest.packageType)}&package=${encodeURIComponent( + rest.packageId + )}`, + meta: pick( + meta as any, + "name", + "license", + "releaseStage", + "dockerImageTag", + "connectorSubtype", + "dockerRepository" + ), + }; + }) + .toNextApiHandler(); diff --git a/webapps/console/pages/api/sources/index.ts b/webapps/console/pages/api/sources/index.ts index 1eb7ce8c6..b0bfb27b9 100644 --- a/webapps/console/pages/api/sources/index.ts +++ b/webapps/console/pages/api/sources/index.ts @@ -1,12 +1,32 @@ import { createRoute } from "../../../lib/api"; import { db } from "../../../lib/server/db"; -import omit from "lodash/omit"; +import * as z from "zod"; +import { ConnectorPackageDbModel } from "../../../prisma/schema"; +import pick from "lodash/pick"; + +export const SourceType = ConnectorPackageDbModel.merge( + z.object({ + logo: z.string().optional(), + versions: z.string(), + meta: z.object({ + name: z.string(), + license: z.string(), + releaseStage: z.string(), + dockerImageTag: z.string(), + connectorSubtype: z.string(), + dockerRepository: z.string(), + }), + }) +); + +export type SourceType = z.infer; export default createRoute() .GET({ auth: false }) - .handler(async ({ req }) => { + .handler(async ({ req }): Promise<{ sources: SourceType[] }> => { return { sources: (await db.prisma().connectorPackage.findMany()).map(({ id, logoSvg, meta, ...rest }) => ({ + id, ...rest, logo: logoSvg ? `/api/sources/logo?type=${encodeURIComponent(rest.packageType)}&package=${encodeURIComponent( @@ -16,7 +36,15 @@ export default createRoute() versions: `/api/sources/versions?type=${encodeURIComponent(rest.packageType)}&package=${encodeURIComponent( rest.packageId )}`, - meta: omit(meta as any, "icon", "tags", "registries", "definitionId", "documentationUrl", "githubIssueLabel"), + meta: pick( + meta as any, + "name", + "license", + "releaseStage", + "dockerImageTag", + "connectorSubtype", + "dockerRepository" + ), })), }; }) diff --git a/webapps/console/pages/api/sources/logo.ts b/webapps/console/pages/api/sources/logo.ts index b51ab1d55..ed3d68e45 100644 --- a/webapps/console/pages/api/sources/logo.ts +++ b/webapps/console/pages/api/sources/logo.ts @@ -14,6 +14,7 @@ export default async function handler(req, res) { res.status(404).json({ status: 404, message: msg }); } else { res.setHeader("Content-Type", "image/svg+xml"); + res.setHeader("Cache-Control", "public, max-age=2592000, immutable"); res.status(200).send(data.logoSvg); } } catch (e) { diff --git a/webapps/console/pages/api/sources/versions.ts b/webapps/console/pages/api/sources/versions.ts index 2eff181b5..5e8c5a887 100644 --- a/webapps/console/pages/api/sources/versions.ts +++ b/webapps/console/pages/api/sources/versions.ts @@ -15,11 +15,21 @@ export default createRoute() if (type !== "airbyte") { throw new Error(`Only airbyte is supported, not ${type}`); } - const tags = (await rpc(`https://hub.docker.com/v2/repositories/${query.package}/tags`)).results.map( - ({ name }) => ({ name, isRelease: name.match(/^[0-9.]+$/) !== null }) - ); - return { - versions: tags, - }; + let error: any = null; + for (let i = 0; i < 3; i++) { + // endpoint prone to 500 errors + try { + const tags = ( + await rpc(`https://hub.docker.com/v2/repositories/${query.package}/tags?page_size=100`) + ).results.map(({ name }) => ({ name, isRelease: name.match(/^[0-9.]+$/) !== null })); + return { + versions: tags, + }; + } catch (e) { + error = e; + await new Promise(resolve => setTimeout(resolve, 1000)); + } + } + throw error; }) .toNextApiHandler(); diff --git a/webapps/console/prisma/schema.prisma b/webapps/console/prisma/schema.prisma index 56fc6b753..e2b2d7303 100644 --- a/webapps/console/prisma/schema.prisma +++ b/webapps/console/prisma/schema.prisma @@ -73,6 +73,7 @@ model Workspace { configurationObject ConfigurationObject[] configurationObjectLink ConfigurationObjectLink[] preferences UserPreferences[] + featuresEnabled String[] @@unique(slug) } @@ -128,6 +129,7 @@ model ConfigurationObjectLink { deleted Boolean? @default(false) createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @updatedAt + type String? @default("push") data Json? workspaceId String @@ -149,3 +151,66 @@ model ConnectorPackage { createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @updatedAt } + +model source_spec { + package String + version String + specs Json? + timestamp DateTime @default(now()) + error String? + + @@id([package, version]) +} + +model source_check { + package String + version String + key String @id + status String + description String? + timestamp DateTime @default(now()) +} + +model source_catalog { + package String + version String + key String + catalog Json? + timestamp DateTime @default(now()) + status String + description String? + + @@id([package, version, key]) +} + +model source_state { + sync_id String @id + state Json + timestamp DateTime @default(now()) +} + +model source_task { + sync_id String + task_id String @id + package String + version String + started_at DateTime @default(now()) + updated_at DateTime @default(now()) + status String + description String? + + @@index(sync_id) + @@index(started_at) +} + + + +// + +//model OauthSecrets { +// id String @id @default(cuid()) +// createdAt DateTime @default(now()) +// updatedAt DateTime @default(now()) @updatedAt +// nangoIntegrationId String +// secrets Json? +//} From 5d1c28f1e3e7e1ab9dea0c1363b653bfd1e25014 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 28 Jun 2023 11:47:18 +0400 Subject: [PATCH 0002/1353] fix fast-store issue introduced by adding featuresEnabled column --- webapps/console/lib/server/fast-store.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/webapps/console/lib/server/fast-store.ts b/webapps/console/lib/server/fast-store.ts index d212606ae..38cfa435e 100644 --- a/webapps/console/lib/server/fast-store.ts +++ b/webapps/console/lib/server/fast-store.ts @@ -158,6 +158,7 @@ async function selectConfigObjectRows(type: string, db: DatabaseConnection, hand obj."updatedAt" as "obj_updatedAt", workspace.id as "workspace_id", workspace.name as "workspace_name", + workspace."featuresEnabled" as "workspace_featuresEnabled", workspace."slug" as "workspace_slug", workspace."createdAt" as "workspace_createdAt", workspace."updatedAt" as "workspace_updatedAt", From 7a65cec7d23bd3cd26ca8159590e40892f86b0e5 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 28 Jun 2023 11:57:48 +0400 Subject: [PATCH 0003/1353] schema.prisma: set default value for featuresEnabled --- webapps/console/prisma/schema.prisma | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/webapps/console/prisma/schema.prisma b/webapps/console/prisma/schema.prisma index e2b2d7303..cf3e5f630 100644 --- a/webapps/console/prisma/schema.prisma +++ b/webapps/console/prisma/schema.prisma @@ -73,7 +73,7 @@ model Workspace { configurationObject ConfigurationObject[] configurationObjectLink ConfigurationObjectLink[] preferences UserPreferences[] - featuresEnabled String[] + featuresEnabled String[] @default([]) @@unique(slug) } @@ -203,7 +203,19 @@ model source_task { @@index(started_at) } +model task_log { + id String @id @default(uuid()) @db.Uuid + level String + logger String + message String + sync_id String + task_id String + timestamp DateTime @default(now()) + @@index(sync_id) + @@index(task_id) + @@index(timestamp) +} // From bb9eecbd788a38c8c25fe2ed7f961ecee760760a Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 28 Jun 2023 18:10:33 +0400 Subject: [PATCH 0004/1353] Sync Tasks view and Task Logs view pgHelper: use pg-cursor in streamQuery Multiple fixes --- libs/juava/src/debounce.ts | 130 +++++++ libs/juava/src/rpc.ts | 6 +- libs/juava/src/singleton.ts | 2 +- pnpm-lock.yaml | 66 +++- .../console/components/DataView/DataView.tsx | 14 +- .../components/DataView/EventsBrowser.tsx | 24 +- .../DestinationsCatalog.tsx | 5 +- webapps/console/components/Icons/FileText.tsx | 29 ++ .../components/JitsuButton/JitsuButton.tsx | 2 +- .../LabelEllipsis/LabelEllipsis.tsx | 15 +- webapps/console/lib/server/db.ts | 52 ++- webapps/console/lib/server/events-log.ts | 4 +- webapps/console/lib/shared/strings.ts | 8 + webapps/console/lib/useApi.ts | 6 +- webapps/console/package.json | 4 +- .../pages/[workspaceId]/connections/index.tsx | 48 ++- .../pages/[workspaceId]/destinations.tsx | 15 +- .../console/pages/[workspaceId]/services.tsx | 18 +- .../pages/[workspaceId]/syncs/index.tsx | 185 ++++++---- .../pages/[workspaceId]/syncs/logs.tsx | 119 +++++++ .../pages/[workspaceId]/syncs/tasks.tsx | 327 ++++++++++++++++++ .../api/[workspaceId]/log/[type]/[actorId].ts | 11 +- .../pages/api/[workspaceId]/sources/_logs.ts | 64 ++++ .../pages/api/[workspaceId]/sources/logs.ts | 51 +++ .../pages/api/[workspaceId]/sources/run.ts | 2 +- .../pages/api/[workspaceId]/sources/spec.ts | 2 +- .../pages/api/[workspaceId]/sources/tasks.ts | 142 ++++++++ webapps/console/prisma/schema.prisma | 14 +- 28 files changed, 1180 insertions(+), 185 deletions(-) create mode 100644 libs/juava/src/debounce.ts create mode 100644 webapps/console/components/Icons/FileText.tsx create mode 100644 webapps/console/pages/[workspaceId]/syncs/logs.tsx create mode 100644 webapps/console/pages/[workspaceId]/syncs/tasks.tsx create mode 100644 webapps/console/pages/api/[workspaceId]/sources/_logs.ts create mode 100644 webapps/console/pages/api/[workspaceId]/sources/logs.ts create mode 100644 webapps/console/pages/api/[workspaceId]/sources/tasks.ts diff --git a/libs/juava/src/debounce.ts b/libs/juava/src/debounce.ts new file mode 100644 index 000000000..b45cbcc05 --- /dev/null +++ b/libs/juava/src/debounce.ts @@ -0,0 +1,130 @@ +function debounce(func, wait) { + let lastArgs, lastThis, maxWait, result, timerId, lastCallTime; + + let lastInvokeTime = 0; + let leading = false; + let maxing = false; + let trailing = true; + + if (typeof func !== "function") { + throw new TypeError("Expected a function"); + } + wait = +wait || 0; + + function invokeFunc(time) { + const args = lastArgs; + const thisArg = lastThis; + + lastArgs = lastThis = undefined; + lastInvokeTime = time; + result = func.apply(thisArg, args); + return result; + } + + function startTimer(pendingFunc, wait) { + return setTimeout(pendingFunc, wait); + } + + function cancelTimer(id) { + clearTimeout(id); + } + + function leadingEdge(time) { + // Reset any `maxWait` timer. + lastInvokeTime = time; + // Start the timer for the trailing edge. + timerId = startTimer(timerExpired, wait); + // Invoke the leading edge. + return leading ? invokeFunc(time) : result; + } + + function remainingWait(time) { + const timeSinceLastCall = time - lastCallTime; + const timeSinceLastInvoke = time - lastInvokeTime; + const timeWaiting = wait - timeSinceLastCall; + + return maxing ? Math.min(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting; + } + + function shouldInvoke(time) { + const timeSinceLastCall = time - lastCallTime; + const timeSinceLastInvoke = time - lastInvokeTime; + + // Either this is the first call, activity has stopped and we're at the + // trailing edge, the system time has gone backwards and we're treating + // it as the trailing edge, or we've hit the `maxWait` limit. + return ( + lastCallTime === undefined || + timeSinceLastCall >= wait || + timeSinceLastCall < 0 || + (maxing && timeSinceLastInvoke >= maxWait) + ); + } + + function timerExpired() { + const time = Date.now(); + if (shouldInvoke(time)) { + return trailingEdge(time); + } + // Restart the timer. + timerId = startTimer(timerExpired, remainingWait(time)); + } + + function trailingEdge(time) { + timerId = undefined; + + // Only invoke if we have `lastArgs` which means `func` has been + // debounced at least once. + if (trailing && lastArgs) { + return invokeFunc(time); + } + lastArgs = lastThis = undefined; + return result; + } + + function cancel() { + if (timerId !== undefined) { + cancelTimer(timerId); + } + lastInvokeTime = 0; + lastArgs = lastCallTime = lastThis = timerId = undefined; + } + + function flush() { + return timerId === undefined ? result : trailingEdge(Date.now()); + } + + function pending() { + return timerId !== undefined; + } + + function debounced(this: any, ...args) { + const time = Date.now(); + const isInvoking = shouldInvoke(time); + + lastArgs = args; + lastThis = this; + lastCallTime = time; + + if (isInvoking) { + if (timerId === undefined) { + return leadingEdge(lastCallTime); + } + if (maxing) { + // Handle invocations in a tight loop. + timerId = startTimer(timerExpired, wait); + return invokeFunc(lastCallTime); + } + } + if (timerId === undefined) { + timerId = startTimer(timerExpired, wait); + } + return result; + } + debounced.cancel = cancel; + debounced.flush = flush; + debounced.pending = pending; + return debounced; +} + +export { debounce }; diff --git a/libs/juava/src/rpc.ts b/libs/juava/src/rpc.ts index 8ba56c2d3..898455dc5 100644 --- a/libs/juava/src/rpc.ts +++ b/libs/juava/src/rpc.ts @@ -96,7 +96,11 @@ export const rpc: RpcFunc = async (url, { body, ...rest } = {}) => { body: body || undefined, }); } - return await parseJsonResponse(result, method, url); + if ((result.headers.get("Content-Type") ?? "").startsWith("application/json")) { + return await parseJsonResponse(result, method, url); + } else { + return await result.text(); + } }; let rpcFetchImpl: FetchType | undefined; diff --git a/libs/juava/src/singleton.ts b/libs/juava/src/singleton.ts index 4e0de320a..7ab401321 100644 --- a/libs/juava/src/singleton.ts +++ b/libs/juava/src/singleton.ts @@ -1,6 +1,6 @@ import { getErrorMessage, getLog, newError, requireDefined } from "./index"; -import { debounce } from "lodash"; import * as process from "process"; +import { debounce } from "./debounce"; const log = getLog("singleton"); export type CachedValue = ( diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5c57ef92e..cdc7f0ffa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -620,11 +620,11 @@ importers: specifier: ^3.0.0 version: 3.0.0 pg: - specifier: ^8.7.3 - version: 8.10.0 - pg-query-stream: - specifier: ^4.2.4 - version: 4.4.0(pg@8.10.0) + specifier: ~8.11.1 + version: 8.11.1 + pg-cursor: + specifier: ~2.10.1 + version: 2.10.1(pg@8.11.1) prisma: specifier: ^4.12.0 version: 4.12.0 @@ -694,7 +694,7 @@ importers: version: 8.6.6 '@types/pg-query-stream': specifier: ^3.4.0 - version: 3.4.0(pg@8.10.0) + version: 3.4.0(pg@8.11.1) '@types/react': specifier: 18.0.28 version: 18.0.28 @@ -8158,11 +8158,11 @@ packages: - pg-native dev: false - /@types/pg-query-stream@3.4.0(pg@8.10.0): + /@types/pg-query-stream@3.4.0(pg@8.11.1): resolution: {integrity: sha512-oqGAu+5CMPAVNqemN9xYT3LBDy2qXBke15cstEuVYIvJL6lcKSNKeG61fONlVrxTYIFi9sPuGVtIweanrEZcJw==} deprecated: This is a stub types definition. pg-query-stream provides its own type definitions, so you do not need this installed. dependencies: - pg-query-stream: 4.4.0(pg@8.10.0) + pg-query-stream: 4.4.0(pg@8.11.1) transitivePeerDependencies: - pg dev: true @@ -19684,15 +19684,24 @@ packages: is-reference: 3.0.1 dev: true + /pg-cloudflare@1.1.1: + resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} + requiresBuild: true + optional: true + /pg-connection-string@2.5.0: resolution: {integrity: sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==} + dev: false - /pg-cursor@2.9.0(pg@8.10.0): - resolution: {integrity: sha512-tNX0FbHX6+hlhZVNbxhSQPDMNMFF6mOWQvwDobPROAFpilmXrZo3FozawqaBQKonFKpBloZZyWUL3Kkf5rLn6A==} + /pg-connection-string@2.6.1: + resolution: {integrity: sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg==} + + /pg-cursor@2.10.1(pg@8.11.1): + resolution: {integrity: sha512-t4bjqL/gtohsNoByFcD4EKjHVppOuJipBYVhunVUm25TnaS2xEEr2jy3vumOX2z44SHROaf4K7QWPY9xnKT3HA==} peerDependencies: pg: ^8 dependencies: - pg: 8.10.0 + pg: 8.11.1 /pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} @@ -19709,6 +19718,14 @@ packages: pg: '>=8.0' dependencies: pg: 8.10.0 + dev: false + + /pg-pool@3.6.1(pg@8.11.1): + resolution: {integrity: sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==} + peerDependencies: + pg: '>=8.0' + dependencies: + pg: 8.11.1 /pg-promise@11.4.3: resolution: {integrity: sha512-b4wuukB+pkrLRZ53Z+3L9IONlIhOUSM/VlLQV2SnQzNJPJmDZj6ticgcMtZMDanAUEj+zX1FJOBrSpSR9TumXg==} @@ -19725,13 +19742,14 @@ packages: /pg-protocol@1.6.0: resolution: {integrity: sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==} - /pg-query-stream@4.4.0(pg@8.10.0): + /pg-query-stream@4.4.0(pg@8.11.1): resolution: {integrity: sha512-shmP973/ruBw3exSmIEBW9iubWvyyZMzp6oWfcHgvlqAe4LtaRyVqPGxgnuorbRqksK03mjOC9PU+Ohz3b0GkQ==} peerDependencies: pg: ^8 dependencies: - pg: 8.10.0 - pg-cursor: 2.9.0(pg@8.10.0) + pg: 8.11.1 + pg-cursor: 2.10.1(pg@8.11.1) + dev: true /pg-types@2.2.0: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} @@ -19759,6 +19777,26 @@ packages: pg-protocol: 1.6.0 pg-types: 2.2.0 pgpass: 1.0.5 + dev: false + + /pg@8.11.1: + resolution: {integrity: sha512-utdq2obft07MxaDg0zBJI+l/M3mBRfIpEN3iSemsz0G5F2/VXx+XzqF4oxrbIZXQxt2AZzIUzyVg/YM6xOP/WQ==} + engines: {node: '>= 8.0.0'} + peerDependencies: + pg-native: '>=3.0.1' + peerDependenciesMeta: + pg-native: + optional: true + dependencies: + buffer-writer: 2.0.0 + packet-reader: 1.0.0 + pg-connection-string: 2.6.1 + pg-pool: 3.6.1(pg@8.11.1) + pg-protocol: 1.6.0 + pg-types: 2.2.0 + pgpass: 1.0.5 + optionalDependencies: + pg-cloudflare: 1.1.1 /pgpass@1.0.5: resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} diff --git a/webapps/console/components/DataView/DataView.tsx b/webapps/console/components/DataView/DataView.tsx index 2dde4934e..03f1dfbb6 100644 --- a/webapps/console/components/DataView/DataView.tsx +++ b/webapps/console/components/DataView/DataView.tsx @@ -34,10 +34,16 @@ export function DataView() { const patchQueryStringState = (key: string, value: any) => { if (state.viewState[state.activeView][key] === value) return; - setState({ - ...state, - viewState: { ...state.viewState, [state.activeView]: { ...state.viewState[state.activeView], [key]: value } }, - }); + if (value === null) { + const newState = { ...state }; + delete newState[key]; + setState(newState); + } else { + setState({ + ...state, + viewState: { ...state.viewState, [state.activeView]: { ...state.viewState[state.activeView], [key]: value } }, + }); + } }; const items: TabsProps["items"] = [ diff --git a/webapps/console/components/DataView/EventsBrowser.tsx b/webapps/console/components/DataView/EventsBrowser.tsx index b624abb75..8fbcc8d15 100644 --- a/webapps/console/components/DataView/EventsBrowser.tsx +++ b/webapps/console/components/DataView/EventsBrowser.tsx @@ -26,7 +26,7 @@ const formatDate = (date: string | Date) => dayjs(date).utc().format("YYYY-MM-DD type StreamType = "incoming" | "functions" | "bulker"; type EventType = "all" | "error"; -type DatesRange = [number | null, number | null]; +type DatesRange = [string | null, string | null]; type EventsBrowserProps = { streamType: StreamType; @@ -147,8 +147,8 @@ export const EventsBrowser = ({ actorId, { beforeId: beforeId, - start: dates && dates[0] ? dayjs.unix(dates[0]).toDate() : undefined, - end: dates && dates[1] ? dayjs.unix(dates[1]).endOf("day").toDate() : undefined, + start: dates && dates[0] ? dates[0] : undefined, + end: dates && dates[1] ? dates[1] : undefined, }, 100 ); @@ -269,7 +269,7 @@ export const EventsBrowser = ({ {entity[1].stream.name} {"→"} - d.name} /> + ), })); @@ -340,15 +340,19 @@ export const EventsBrowser = ({ Date range: (d ? dayjs.unix(d) : null)).slice(0, 2) as [Dayjs | null, Dayjs | null] + (dates ?? [null, null]).map(d => (d ? dayjs(d, "YYYY-MM-DD") : null)).slice(0, 2) as [ + Dayjs | null, + Dayjs | null + ] } + disabledDate={d => false} allowEmpty={[true, true]} onChange={d => { if (d) { - patchQueryStringState( - "dates", - d.map(d => (d ? d.unix() : null)) - ); + patchQueryStringState("dates", [ + d[0] ? d[0].format("YYYY-MM-DD") : null, + d[1] ? d[1].format("YYYY-MM-DD") : null, + ]); } else { patchQueryStringState("dates", [null, null]); } @@ -716,7 +720,7 @@ const IncomingEventDrawer = ({ event }: { event: IncomingEvent }) => { .filter(d => typeof d !== "undefined") .map((d, i) => ( - d.name} /> + ))} diff --git a/webapps/console/components/DestinationsCatalog/DestinationsCatalog.tsx b/webapps/console/components/DestinationsCatalog/DestinationsCatalog.tsx index f1f19a9e3..3dc7bdbc2 100644 --- a/webapps/console/components/DestinationsCatalog/DestinationsCatalog.tsx +++ b/webapps/console/components/DestinationsCatalog/DestinationsCatalog.tsx @@ -35,7 +35,10 @@ function groupDestinationTypes(): Record { .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}); } -export function getDestinationIcon(destination: DestinationType) { +export function getDestinationIcon(destination?: DestinationType) { + if (!destination) { + return ; + } const tags = ( destination.tags ? (typeof destination.tags === "string" ? [destination.tags] : destination.tags) : [] ).map(t => t.toLowerCase()); diff --git a/webapps/console/components/Icons/FileText.tsx b/webapps/console/components/Icons/FileText.tsx new file mode 100644 index 000000000..f33deb55e --- /dev/null +++ b/webapps/console/components/Icons/FileText.tsx @@ -0,0 +1,29 @@ +import Icon from "@ant-design/icons"; +import { CustomIconComponentProps } from "@ant-design/icons/lib/components/Icon"; + +function Svg() { + return ( + + + + + + + + ); +} + +export default function FileText(props: Partial) { + return ; +} diff --git a/webapps/console/components/JitsuButton/JitsuButton.tsx b/webapps/console/components/JitsuButton/JitsuButton.tsx index 2eef72bf6..844643b0a 100644 --- a/webapps/console/components/JitsuButton/JitsuButton.tsx +++ b/webapps/console/components/JitsuButton/JitsuButton.tsx @@ -43,7 +43,7 @@ export const JitsuButton: React.FC = p => { return ; } return ( - + ); diff --git a/webapps/console/components/LabelEllipsis/LabelEllipsis.tsx b/webapps/console/components/LabelEllipsis/LabelEllipsis.tsx index a57129dd4..b82537357 100644 --- a/webapps/console/components/LabelEllipsis/LabelEllipsis.tsx +++ b/webapps/console/components/LabelEllipsis/LabelEllipsis.tsx @@ -1,15 +1,20 @@ import { Tooltip } from "antd"; -import { trimMiddle } from "../../lib/shared/strings"; +import { trimEnd, trimMiddle } from "../../lib/shared/strings"; export type LabelEllipsisProps = { maxLen: number; + trim?: "middle" | "end"; children: string; }; -export function LabelEllipsis(props: LabelEllipsisProps) { - if (props.children.length <= props.maxLen) { - return <>{props.children}; +export function LabelEllipsis({ maxLen, children, trim = "middle" }: LabelEllipsisProps) { + if (children.length <= maxLen) { + return <>{children}; } else { - return {trimMiddle(props.children, props.maxLen)}; + return ( + + {trim === "middle" ? trimMiddle(children, maxLen) : trimEnd(children, maxLen)} + + ); } } diff --git a/webapps/console/lib/server/db.ts b/webapps/console/lib/server/db.ts index defa3705a..6e252fe08 100644 --- a/webapps/console/lib/server/db.ts +++ b/webapps/console/lib/server/db.ts @@ -1,5 +1,6 @@ import { PrismaClient } from "@prisma/client"; -import { Pool } from "pg"; +import { Pool, PoolClient } from "pg"; +import Cursor from "pg-cursor"; import { namedParameters, newError, requireDefined, stopwatch } from "juava"; import { getSingleton } from "juava"; import { getServerLog } from "./log"; @@ -30,8 +31,21 @@ const pgHelper: PgHelper = { ); const { query: processedQuery, values: processedParams } = namedParameters(query, values || []); const sw = stopwatch(); - let queryResult; + let totalRows = 0; + let cursor: Cursor = undefined; + const client: PoolClient = await db.pgPool().connect(); try { + cursor = client.query(new Cursor(processedQuery, processedParams)); + let rows = await cursor.read(100); + while (rows.length > 0) { + for (let i = 0; i < rows.length; i++) { + await handler(rows[i]); + totalRows++; + } + rows = await cursor.read(100); + } + let queryResult; + queryResult = await db.pgPool().query(processedQuery, processedParams); } catch (e) { log @@ -39,35 +53,19 @@ const pgHelper: PgHelper = { .withCause(e) .log("Error executing query: \n" + processedQuery + "\n with params: " + JSON.stringify(processedParams)); throw newError("Error executing the query. See query in logs", e); + } finally { + if (cursor) { + await cursor.close(() => { + client.release(); + }); + } else if (client) { + client.release(); + } } - for (let i = 0; i < queryResult.rows.length; i++) { - const row = queryResult.rows[i]; - await handler(row); - } log.atDebug().log(`Query executed in ${sw.elapsedMs()}ms: ${processedQuery}${processedParams}`); - return { rows: queryResult.rowCount }; - - // const queryStream = new QueryStream(processedQuery, processedParams); - // - // const stream = await db.pg().query(queryStream); - // - // let rows = 0; - // console.log('Start streaming') - // return new Promise((resolve, reject) => { - // stream.on("error", err => { - // reject(err); - // }); - // stream.on("end", () => { - // resolve({ rows }); - // }); - // stream.on("data", async row => { - // rows++; - // console.log('Got row', row) - // await handler(row); - // }); - // }); + return { rows: totalRows }; }, }; diff --git a/webapps/console/lib/server/events-log.ts b/webapps/console/lib/server/events-log.ts index e4e08c7a6..7bfe32c36 100644 --- a/webapps/console/lib/server/events-log.ts +++ b/webapps/console/lib/server/events-log.ts @@ -1,6 +1,6 @@ export type EventsLogFilter = { - start?: Date; - end?: Date; + start?: string; + end?: string; beforeId?: string; filter?: (any) => boolean; }; diff --git a/webapps/console/lib/shared/strings.ts b/webapps/console/lib/shared/strings.ts index f25afc894..6d5358fd2 100644 --- a/webapps/console/lib/shared/strings.ts +++ b/webapps/console/lib/shared/strings.ts @@ -5,3 +5,11 @@ export function trimMiddle(str: string, maxLen: number, ellisis = "...") { return str.substring(0, maxLen / 2 - (ellisis.length - 1)) + ellisis + str.substring(str.length - maxLen / 2 + 1); } } + +export function trimEnd(str: string, maxLen: number, ellisis = "...") { + if (str.length <= maxLen) { + return str; + } else { + return str.substring(0, maxLen - (ellisis.length - 1)) + ellisis; + } +} diff --git a/webapps/console/lib/useApi.ts b/webapps/console/lib/useApi.ts index 647a8211c..d624801ad 100644 --- a/webapps/console/lib/useApi.ts +++ b/webapps/console/lib/useApi.ts @@ -29,9 +29,9 @@ export function getEventsLogApi(workspaceId: string): EventsLogApi { return { get(eventType: string, actorId: string, filter: EventsLogFilter, limit: number): Promise { return rpc( - `/api/${workspaceId}/log/${eventType}/${actorId}?start=${filter.start?.getTime() ?? ""}&end=${ - filter.end?.getTime() ?? "" - }&beforeId=${filter.beforeId ?? ""}&limit=${limit}` + `/api/${workspaceId}/log/${eventType}/${actorId}?start=${filter.start ?? ""}&end=${filter.end ?? ""}&beforeId=${ + filter.beforeId ?? "" + }&limit=${limit}` ); }, }; diff --git a/webapps/console/package.json b/webapps/console/package.json index 914b49013..00544a959 100644 --- a/webapps/console/package.json +++ b/webapps/console/package.json @@ -70,8 +70,8 @@ "node-sql-parser": "^4.6.5", "nodemailer": "^6.8.0", "object-hash": "^3.0.0", - "pg": "^8.7.3", - "pg-query-stream": "^4.2.4", + "pg": "~8.11.1", + "pg-cursor": "~2.10.1", "prisma": "^4.12.0", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/webapps/console/pages/[workspaceId]/connections/index.tsx b/webapps/console/pages/[workspaceId]/connections/index.tsx index e611c9b84..ea8dbfe41 100644 --- a/webapps/console/pages/[workspaceId]/connections/index.tsx +++ b/webapps/console/pages/[workspaceId]/connections/index.tsx @@ -5,7 +5,7 @@ import { DestinationConfig, StreamConfig } from "../../../lib/schema"; import { ConfigurationObjectLinkDbModel } from "../../../prisma/schema"; import { QueryResponse } from "../../../components/QueryResponse/QueryResponse"; import { z } from "zod"; -import { Table, Tooltip } from "antd"; +import { Table } from "antd"; import { confirmOp, feedbackError, feedbackSuccess } from "../../../lib/ui"; import React, { useState } from "react"; import Link from "next/link"; @@ -21,6 +21,7 @@ import { ColumnType, SortOrder } from "antd/es/table/interface"; import { Inbox } from "lucide-react"; import { PlusOutlined } from "@ant-design/icons"; import { JitsuButton, WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; +import { DestinationTitle } from "../destinations"; function EmptyLinks() { const workspace = useWorkspace(); @@ -95,7 +96,7 @@ function ConnectionsTable({ links, streams, destinations, reloadCallback }: Remo const columns: ColumnType[] = [ { title: "Source", - width: "60%", + width: "50%", sortOrder: sorting.columns?.find(s => s.field === "Source")?.order, sorter: (a, b) => { const streamA = streamsById[a.fromId]; @@ -110,22 +111,20 @@ function ConnectionsTable({ links, streams, destinations, reloadCallback }: Remo return (
{stream.name}
-
- } - /> -
+ } + />
); }, }, { title: "Destination", - width: "40%", + width: "50%", sortOrder: sorting.columns?.find(s => s.field === "Destination")?.order, sorter: (a, b) => { @@ -140,22 +139,15 @@ function ConnectionsTable({ links, streams, destinations, reloadCallback }: Remo } const coreDestinationType = getCoreDestinationType(destination.destinationType); return ( -
-
-
- {coreDestinationType.icon} -
-
{destination.name}
-
- } - className="link" - size="small" - href={`/${workspace.id}/destinations?id=${link.toId}`} - /> -
-
+
+ + } + className="link" + size="small" + href={`/${workspace.id}/destinations?id=${link.toId}`} + />
); }, diff --git a/webapps/console/pages/[workspaceId]/destinations.tsx b/webapps/console/pages/[workspaceId]/destinations.tsx index 10d2e9593..7c716a2bc 100644 --- a/webapps/console/pages/[workspaceId]/destinations.tsx +++ b/webapps/console/pages/[workspaceId]/destinations.tsx @@ -186,14 +186,11 @@ function getEditorComponent(editor: string, editorProps?: any) { } export const DestinationTitle: React.FC<{ - destination: DestinationConfig; + destination?: DestinationConfig; size?: "small" | "default" | "large"; title?: (d: DestinationConfig, t: DestinationType) => string; -}> = ({ destination, title = (d, t) => t.title, size = "default" }) => { - const destinationType = requireDefined( - coreDestinationsMap[destination.destinationType], - `Destination type ${destination.destinationType} is not found` - ); +}> = ({ destination, title = (d, t) => d.name, size = "default" }) => { + const destinationType = coreDestinationsMap[destination?.destinationType ?? ""]; const iconClassName = (() => { switch (size) { case "small": @@ -207,7 +204,7 @@ export const DestinationTitle: React.FC<{ return (
{getDestinationIcon(destinationType)}
-
{title(destination, destinationType)}
+
{destination ? title(destination, destinationType) : "Unknown destination"}
); }; @@ -520,7 +517,7 @@ const ProvisionedDestinations = () => { className={styles.listTable} dataSource={provisionedDestinations} columns={[ - { title: "Name", render: (d: DestinationConfig) => d.name} /> }, + { title: "Name", render: (d: DestinationConfig) => }, { title: "", render: (d: DestinationConfig) => ( @@ -589,7 +586,7 @@ const DestinationsList: React.FC<{ type?: string }> = ({ type }) => { listColumns: [ { title: "Type", - render: (c: DestinationConfig) => , + render: (c: DestinationConfig) => t.title} />, }, ], newObject: () => { diff --git a/webapps/console/pages/[workspaceId]/services.tsx b/webapps/console/pages/[workspaceId]/services.tsx index e4c907ad8..596fee113 100644 --- a/webapps/console/pages/[workspaceId]/services.tsx +++ b/webapps/console/pages/[workspaceId]/services.tsx @@ -5,7 +5,6 @@ import { useWorkspace } from "../../lib/context"; import { useRouter } from "next/router"; import { getLog, hash as jhash, randomId, rpc } from "juava"; import React from "react"; -import { ServerCog } from "lucide-react"; import { Modal, Space, Tooltip } from "antd"; import { serialization, useURLPersistedState } from "../../lib/ui"; import { ServicesCatalog } from "../../components/ServicesCatalog/ServicesCatalog"; @@ -27,10 +26,10 @@ const Services: React.FC = () => { }; export const ServiceTitle: React.FC<{ - f?: ServiceConfig; + service?: ServiceConfig; size?: "small" | "default" | "large"; - title?: (d?: ServiceConfig) => string; -}> = ({ f, title = d => d?.name ?? "service", size = "default" }) => { + title?: (d: ServiceConfig) => string; +}> = ({ service, title = d => d.name, size = "default" }) => { const iconClassName = (() => { switch (size) { case "small": @@ -44,10 +43,15 @@ export const ServiceTitle: React.FC<{ return (
- + {service?.package}
- {title(f)} + + {service ? title(service) : "Unknown service"} +
); @@ -76,7 +80,7 @@ const ServicesList: React.FC<{}> = () => { listColumns: [ { title: "Package", - render: (c: ServiceConfig) => <>{`${c.package}:${c.version}`}, + render: (c: ServiceConfig) => `${c?.package}:${c?.version}`} />, }, ], objectType: ServiceConfig, diff --git a/webapps/console/pages/[workspaceId]/syncs/index.tsx b/webapps/console/pages/[workspaceId]/syncs/index.tsx index e27072af8..5db8fc204 100644 --- a/webapps/console/pages/[workspaceId]/syncs/index.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/index.tsx @@ -5,11 +5,11 @@ import { DestinationConfig, ServiceConfig } from "../../../lib/schema"; import { ConfigurationObjectLinkDbModel } from "../../../prisma/schema"; import { QueryResponse } from "../../../components/QueryResponse/QueryResponse"; import { z } from "zod"; -import { Table, Tooltip } from "antd"; +import { Dropdown, MenuProps, Table, Tag } from "antd"; import { confirmOp, feedbackError, feedbackSuccess } from "../../../lib/ui"; -import React, { useState } from "react"; +import React, { useEffect, useState } from "react"; import Link from "next/link"; -import { FaExternalLinkAlt, FaPlus, FaRunning, FaTrash } from "react-icons/fa"; +import { FaExternalLinkAlt, FaPlus, FaRegPlayCircle, FaThList, FaTrash } from "react-icons/fa"; import { index, rpc } from "juava"; import { getCoreDestinationType } from "../../../lib/schema/destinations"; import { useRouter } from "next/router"; @@ -22,6 +22,18 @@ import { Inbox } from "lucide-react"; import { PlusOutlined } from "@ant-design/icons"; import { JitsuButton, WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; import { ErrorCard } from "../../../components/GlobalError/GlobalError"; +import { Spinner } from "../../../components/GlobalLoader/GlobalLoader"; +import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; +import relativeTime from "dayjs/plugin/relativeTime"; +import { WLink } from "../../../components/Workspace/WLink"; +import { ServiceTitle } from "../services"; +import { DestinationTitle } from "../destinations"; +import JSON5 from "json5"; +dayjs.extend(utc); +dayjs.extend(relativeTime); + +const formatDate = (date: string | Date) => dayjs(date, "YYYY-MM-DDTHH:mm:ss.SSSZ").utc().format("YYYY-MM-DD HH:mm:ss"); function EmptyLinks() { const workspace = useWorkspace(); @@ -65,6 +77,23 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt defaultValue: { columns: [] }, ...jsonSerializationBase64, }); + const [tasks, setTasks] = useState<{ loading: boolean; data?: any; error?: any }>({ loading: true }); + + //useEffect update tasksData every 5 seconds + useEffect(() => { + const fetchTasks = async () => { + try { + const data = await rpc(`/api/${workspace.id}/sources/tasks`, { body: links.map(l => l.id) }); + setTasks({ loading: false, data }); + } catch (e) { + setTasks({ loading: false, data: {}, error: e }); + } + }; + fetchTasks(); + const interval = setInterval(fetchTasks, 10000); + return () => clearInterval(interval); + }, [links, workspace.id]); + const deleteSync = async (link: Omit) => { if (await confirmOp("Are you sure you want to unlink this service from this destination?")) { setLoading(true); @@ -96,7 +125,7 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt const columns: ColumnType[] = [ { title: "Service", - width: "60%", + width: "40%", sortOrder: sorting.columns?.find(s => s.field === "Service")?.order, sorter: (a, b) => { const serviceA = servicesById[a.fromId]; @@ -110,24 +139,14 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt } return (
-
- - {service.package} - -
-
{service.name}
-
- } - /> -
+ + } + />
); }, @@ -149,49 +168,99 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt } const coreDestinationType = getCoreDestinationType(destination.destinationType); return ( -
-
-
- {coreDestinationType.icon} -
-
{destination.name}
-
- } - className="link" - size="small" - href={`/${workspace.id}/destinations?id=${link.toId}`} - /> -
-
+
+ + } + className="link" + size="small" + href={`/${workspace.id}/destinations?id=${link.toId}`} + />
); }, }, { - title: "Actions", - render: (text, link) => ( -
- } - onClick={async () => { + title:
Sync Status
, + width: "5%", + render: (text, link) => { + if (tasks.error) { + return
error obtaining status
; + } + if (tasks.loading) { + return ( +
+ +
+ ); + } + const t = tasks.data.tasks?.[link.id]; + const color = (status: string) => { + switch (status) { + case "RUNNING": + return "blue"; + case "FAILED": + return "red"; + case "SUCCESS": + return "green"; + default: + return undefined; + } + }; + return {t?.status ?? "NO RUNS"}; + }, + }, + { + title:
Status Updated (UTC)
, + width: "12%", + render: (text, link) => { + if (tasks.error || tasks.loading) { + return undefined; + } + const t = tasks.data.tasks?.[link.id]; + return
{t ? formatDate(t.updatedAt) : ""}
; + }, + }, + { + title: "", + render: (text, link) => { + const items: MenuProps["items"] = [ + { + label: "Run Sync", + onClick: async () => { rpc(`/api/${workspace.id}/sources/run?syncId=${link.id}`); - }} - /> - } /> - } - onClick={() => { + }, + key: "run", + icon: , + }, + { + label: Sync Logs, + key: "tasks", + icon: , + }, + { + label: Edit, + key: "edit", + icon: , + }, + { + label: "Delete", + onClick: async () => { deleteSync(link); - }} - /> -
- ), + }, + key: "delete", + icon: , + }, + ].filter(i => !!i); + return ( +
+ +
+
+
+ ); + }, }, ]; return ( diff --git a/webapps/console/pages/[workspaceId]/syncs/logs.tsx b/webapps/console/pages/[workspaceId]/syncs/logs.tsx new file mode 100644 index 000000000..90d057fa2 --- /dev/null +++ b/webapps/console/pages/[workspaceId]/syncs/logs.tsx @@ -0,0 +1,119 @@ +import { WorkspacePageLayout } from "../../../components/PageLayout/WorkspacePageLayout"; +import { useWorkspace } from "../../../lib/context"; +import React, { useEffect, useState } from "react"; +import { useApi } from "../../../lib/useApi"; +import { useRouter } from "next/router"; +import { LoadingAnimation } from "../../../components/GlobalLoader/GlobalLoader"; +import { ErrorCard } from "../../../components/GlobalError/GlobalError"; +import { JitsuButton } from "../../../components/JitsuButton/JitsuButton"; +import { ChevronLeft, FileDown, RefreshCw } from "lucide-react"; + +function TaskLogs() { + const router = useRouter(); + const workspace = useWorkspace(); + const divRef = React.useRef(null); + + const [refresh, setRefresh] = useState(0); + + let logsUrl = `/api/${workspace.id}/sources/logs?syncId=${router.query.syncId}&taskId=${router.query.taskId}&refresh=${refresh}`; + + const { isLoading, data, error } = useApi(logsUrl); + + // Paint lines with ERROR in red + const coloredData = data?.split("\n").map((line, i) => { + if (line.includes(" ERROR [")) { + return ( + + {line + "\n"} + + ); + } else if (line.includes(" WARN [")) { + return ( + + {line + "\n"} + + ); + } else { + return ( + $1') + + "\n", + }} + > + ); + } + }); + + useEffect(() => { + if (divRef.current) { + divRef.current.scrollTop = divRef.current.scrollHeight; + } + }, [data]); + + return ( +
+
+

Sync Tasks

+
+ } + type="link" + size="small" + target="_blank" + href={logsUrl + "&download=true"} + > + Download + + } + type="link" + size="small" + onClick={() => { + setRefresh(refresh + 1); + }} + > + Refresh + + } + type="link" + size="small" + onClick={() => router.back()} + > + Back + +
+
+ {(function () { + if (isLoading) { + return ; + } else if (error) { + return ; + } else { + return ( +
+ {coloredData} +
+ ); + } + })()} +
+ ); +} + +const TasksPage = () => { + return ( + + + + ); +}; +export default TasksPage; diff --git a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx new file mode 100644 index 000000000..2234c088d --- /dev/null +++ b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx @@ -0,0 +1,327 @@ +import { WorkspacePageLayout } from "../../../components/PageLayout/WorkspacePageLayout"; +import { useWorkspace } from "../../../lib/context"; +import { useApi } from "../../../lib/useApi"; +import { source_taskDbModel } from "../../../prisma/schema"; +import { z } from "zod"; +import { Button, Col, DatePicker, Row, Select, Space, Table, Tag } from "antd"; +import React, { useCallback, useEffect, useMemo, useState } from "react"; +import { useQueryStringState } from "../../../lib/useQueryStringState"; +import { ColumnType } from "antd/es/table/interface"; +import dayjs, { Dayjs } from "dayjs"; +import utc from "dayjs/plugin/utc"; +import relativeTime from "dayjs/plugin/relativeTime"; +import JSON5 from "json5"; +import { ErrorCard } from "../../../components/GlobalError/GlobalError"; +import { LabelEllipsis } from "../../../components/LabelEllipsis/LabelEllipsis"; +import { useLinksQuery } from "../../../lib/queries"; +import { DestinationTitle } from "../destinations"; +import { arrayToMap } from "../../../lib/shared/arrays"; +import { ServiceTitle } from "../services"; +import { WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; +import { FileText } from "lucide-react"; + +dayjs.extend(utc); +dayjs.extend(relativeTime); +type DatesRange = [string | null, string | null]; + +const formatDate = (date: string | Date) => dayjs(date, "YYYY-MM-DDTHH:mm:ss.SSSZ").utc().format("YYYY-MM-DD HH:mm:ss"); + +type TasksDbModel = z.infer; + +type TasksTableProps = { + tasks: TasksDbModel[]; + loading: boolean; + reloadCallback: () => void; +}; + +function TasksTable({ tasks, loading, reloadCallback }: TasksTableProps) { + const columns: ColumnType[] = [ + { + title:
Started (UTC)
, + key: "started_at", + width: "12%", + render: (text, task) => { + return
{formatDate(task.started_at)}
; + }, + }, + { + title:
Sync Status
, + key: "status", + width: "5%", + render: (text, task) => { + const color = (status: string) => { + switch (status) { + case "RUNNING": + return "blue"; + case "FAILED": + return "red"; + case "SUCCESS": + return "green"; + default: + return undefined; + } + }; + return {task.status}; + }, + }, + { + title:
Duration
, + key: "updated_at", + render: (text, task) => { + return
{dayjs(task.updated_at).from(dayjs(task.started_at), true)}
; + }, + }, + { + title: "Description", + key: "description", + render: (text, task) => { + return ( + + {task.description ?? ""} + + ); + }, + width: "70%", + }, + { + title: "", + key: "actions", + render: (text, task) => { + return ( + } + type={"text"} + title={"View logs"} + href={`/syncs/logs?taskId=${task.task_id}&syncId=${task.sync_id}`} + /> + ); + }, + }, + ]; + return ( +
+
+ + ); +} + +export type TasksViewState = { + dates?: DatesRange; + syncId?: string; + status?: "all" | "SUCCESS" | "FAILED" | "RUNNING"; +}; + +function Tasks() { + const workspace = useWorkspace(); + + const defaultState: TasksViewState = { + status: "all", + }; + const [refresh, setRefresh] = useState(0); + const [state, setState] = useQueryStringState(`query`, { + defaultValue: defaultState, + parser: (value: string) => { + return { ...defaultState, ...JSON5.parse(value) }; + }, + serializer: (value: TasksViewState) => { + return JSON5.stringify(value); + }, + }); + + const { + data: linksData, + isLoading: linksLoading, + error: linksError, + } = useLinksQuery(workspace.id, "sync", { + cacheTime: 0, + retry: false, + }); + + const patchQueryStringState = useCallback( + (key: string, value: any) => { + if (state[key] === value) return; + if (value === null) { + const newState = { ...state }; + delete newState[key]; + setState(newState); + } else { + setState({ + ...state, + [key]: value, + }); + } + }, + [state, setState] + ); + + useEffect(() => { + if (linksData) { + if (!state.syncId) { + patchQueryStringState("syncId", linksData[2][0]?.id); + } + } + }, [linksData, patchQueryStringState, state.syncId]); + + const entitiesSelectOptions = useMemo(() => { + if (linksData) { + const services = arrayToMap(linksData[0]); + const destinations = arrayToMap(linksData[1]); + const links = arrayToMap(linksData[2]) as Record; + let syncs = Object.entries(links).map(entity => ({ + value: entity[0], + key: entity[0], + label: ( + + + {"→"} + + + ), + })); + syncs = [ + { + key: "all", + value: "all", + label:
All
, + }, + ...syncs, + ]; + return syncs; + } else { + return []; + } + }, [linksData]); + + let tasksUrl = `/api/${workspace.id}/sources/tasks?syncId=${state.syncId}&r=${refresh}`; + if (state.status !== "all") { + tasksUrl += `&status=${state.status}`; + } + if (state.dates) { + if (state.dates.length > 0 && state.dates[0] !== null) { + tasksUrl += `&from=${state.dates[0]}`; + } + if (state.dates.length > 1 && state.dates[1] !== null) { + tasksUrl += `&to=${state.dates[1]}`; + } + } + + const { isLoading, data, error } = useApi(tasksUrl); + + return ( + <> + +
+ Syncs: + { + patchQueryStringState("status", e); + }} + options={[ + { value: "all", label: "All" }, + { + value: "FAILED", + label: ( +
+ FAILED +
+ ), + }, + { + value: "SUCCESS", + label: ( +
+ SUCCESS +
+ ), + }, + { + value: "RUNNING", + label: ( +
+ RUNNING +
+ ), + }, + ]} + /> + + + Date range: + (d ? dayjs(d, "YYYY-MM-DD") : null)).slice(0, 2) as [ + Dayjs | null, + Dayjs | null + ] + } + allowEmpty={[true, true]} + onChange={d => { + if (d) { + const dates = [d[0] ? d[0].format("YYYY-MM-DD") : null, d[1] ? d[1].format("YYYY-MM-DD") : null]; + if (dates[0] === null && dates[1] === null) { + patchQueryStringState("dates", null); + } else { + patchQueryStringState("dates", dates); + } + } else { + patchQueryStringState("dates", null); + } + }} + /> + + + + + + {error ? ( + + ) : ( + {}} /> + )} + + ); +} + +const TasksPage = () => { + return ( + +
+

Sync Tasks

+
+ +
+ ); +}; +export default TasksPage; diff --git a/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts b/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts index 6855f91b3..cb74d998d 100644 --- a/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts +++ b/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts @@ -5,6 +5,7 @@ import { ApiError } from "../../../../../lib/shared/errors"; import { httpAgent, httpsAgent } from "../../../../../lib/server/http-agent"; import { getErrorMessage, requireDefined } from "juava"; import nodeFetch from "node-fetch-commonjs"; +import dayjs from "dayjs"; const log = getServerLog("test-connection"); @@ -32,11 +33,15 @@ export const api: Api = { if (bulkerAuthKey) { options.headers["Authorization"] = `Bearer ${bulkerAuthKey}`; } + const start = req.query.start as string; + const end = req.query.end as string; try { const response = await nodeFetch( - `${bulkerURLEnv}/log/${type}/${actorId}?limit=${req.query.limit ?? 50}&start=${req.query.start ?? ""}&end=${ - req.query.end ?? "" - }&beforeId=${req.query.beforeId ?? ""}`, + `${bulkerURLEnv}/log/${type}/${actorId}?limit=${req.query.limit ?? 50}&start=${ + start ? dayjs(start, "YYYY-MM-DD").utc(true).unix() * 1000 : "" + }&end=${end ? dayjs(end, "YYYY-MM-DD").utc(true).add(1, "d").unix() * 1000 : ""}&beforeId=${ + req.query.beforeId ?? "" + }`, options ); const json = await response.json(); diff --git a/webapps/console/pages/api/[workspaceId]/sources/_logs.ts b/webapps/console/pages/api/[workspaceId]/sources/_logs.ts new file mode 100644 index 000000000..98a329f98 --- /dev/null +++ b/webapps/console/pages/api/[workspaceId]/sources/_logs.ts @@ -0,0 +1,64 @@ +import { db } from "../../../../lib/server/db"; +import { randomId } from "juava"; +import dayjs from "dayjs"; +import { Duplex } from "stream"; + +export const config = { + runtime: "edge", +}; + +export default async function handler(req: Request) { + console.log("req", req.url); + try { + //create byte buffer + const duplex = new Duplex(); + // res.setHeader("Content-Type", "text/plain"); + // if (query.download) { + // res.setHeader("Content-Disposition", `attachment; filename=log_sync_${query.syncId}_task_${query.taskId}.txt`); + // } + const load = async () => { + await db.pgHelper().streamQuery( + `select * + from task_log + where task_id = :task_id + order by timestamp`, + { task_id: "1a7128c9-5d71-428f-8c6c-d45d00389b7c" }, + r => { + duplex.write( + `${dayjs(r.timestamp).utc().format("YYYY-MM-DD HH:mm:ss.SSS")} ${r.level} [${r.logger}] ${r.message}\n` + ); + } + ); + duplex.write("test"); + duplex.end(); + }; + load(); + //stream buffer to response + const stream = new ReadableStream({ + async pull(controller) { + const chunk = await duplex.read(); + if (chunk) { + controller.enqueue(chunk); + } else { + controller.close(); + } + }, + }); + + return new Response(stream, { + headers: { + "Content-Type": "text/plain", + "Content-Disposition": `attachment; filename=log_sync_${1}_task_${1}.txt`, + }, + }); + } catch (e: any) { + const errorId = randomId(); + console.error(`Error loading logs for task ids ${1} . Error ID: ${errorId}. Error: ${e}`); + return new Response( + JSON.stringify({ + ok: false, + error: `couldn't load tasks due to internal server error. Please contact support. Error ID: ${errorId}`, + }) + ); + } +} diff --git a/webapps/console/pages/api/[workspaceId]/sources/logs.ts b/webapps/console/pages/api/[workspaceId]/sources/logs.ts new file mode 100644 index 000000000..7ce1150db --- /dev/null +++ b/webapps/console/pages/api/[workspaceId]/sources/logs.ts @@ -0,0 +1,51 @@ +import { db } from "../../../../lib/server/db"; +import { z } from "zod"; +import { createRoute, verifyAccess } from "../../../../lib/api"; +import { randomId } from "juava"; +import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; +dayjs.extend(utc); + +export default createRoute() + .GET({ + auth: true, + query: z.object({ + workspaceId: z.string(), + taskId: z.string(), + syncId: z.string(), + download: z.string().optional(), + }), + }) + .handler(async ({ user, query, res }) => { + const { workspaceId } = query; + await verifyAccess(user, workspaceId); + res.setHeader("Content-Type", "text/plain"); + if (query.download) { + res.setHeader("Content-Disposition", `attachment; filename=logs_sync_${query.syncId}_task_${query.taskId}.txt`); + } + try { + await db.pgHelper().streamQuery( + `select * + from task_log + where task_id = :task_id + order by timestamp`, + { task_id: query.taskId }, + r => { + res.write( + `${dayjs(r.timestamp).utc().format("YYYY-MM-DD HH:mm:ss.SSS")} ${r.level} [${r.logger}] ${r.message}\n` + ); + } + ); + res.end(); + } catch (e: any) { + const errorId = randomId(); + console.error( + `Error loading logs for task id ${query.taskId} in workspace ${workspaceId}. Error ID: ${errorId}. Error: ${e}` + ); + return { + ok: false, + error: `couldn't load tasks due to internal server error. Please contact support. Error ID: ${errorId}`, + }; + } + }) + .toNextApiHandler(); diff --git a/webapps/console/pages/api/[workspaceId]/sources/run.ts b/webapps/console/pages/api/[workspaceId]/sources/run.ts index 453b2c86b..b9a3e4abd 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/run.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/run.ts @@ -19,7 +19,7 @@ export default createRoute() }), result: resultType, }) - .handler(async ({ user, query, body }) => { + .handler(async ({ user, query }) => { const { workspaceId } = query; await verifyAccess(user, workspaceId); const syncURL = requireDefined( diff --git a/webapps/console/pages/api/[workspaceId]/sources/spec.ts b/webapps/console/pages/api/[workspaceId]/sources/spec.ts index e3058eccf..7592b0cdc 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/spec.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/spec.ts @@ -35,7 +35,7 @@ export default createRoute() }), result: resultType, }) - .handler(async ({ user, query, body }) => { + .handler(async ({ user, query }) => { const { workspaceId } = query; await verifyAccess(user, workspaceId); const syncURL = requireDefined( diff --git a/webapps/console/pages/api/[workspaceId]/sources/tasks.ts b/webapps/console/pages/api/[workspaceId]/sources/tasks.ts new file mode 100644 index 000000000..98f1e97fe --- /dev/null +++ b/webapps/console/pages/api/[workspaceId]/sources/tasks.ts @@ -0,0 +1,142 @@ +import { db } from "../../../../lib/server/db"; +import { z } from "zod"; +import { createRoute, verifyAccess } from "../../../../lib/api"; +import { randomId } from "juava"; +import { source_taskDbModel } from "../../../../prisma/schema"; +import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; +dayjs.extend(utc); + +const aggregatedResultType = z.object({ + ok: z.boolean(), + error: z.string().optional(), + tasks: z + .record( + z.object({ + syncId: z.string(), + taskId: z.string(), + status: z.string(), + startedAt: z.date(), + updatedAt: z.date(), + }) + ) + .optional(), +}); + +type aggregatedResultType = z.infer; + +const tasksResultType = z.object({ + ok: z.boolean(), + error: z.string().optional(), + tasks: z.array(source_taskDbModel).optional(), +}); + +export default createRoute() + .POST({ + auth: true, + query: z.object({ + workspaceId: z.string(), + }), + body: z.array(z.string()), + result: aggregatedResultType, + }) + .handler(async ({ user, query, body }) => { + const { workspaceId } = query; + await verifyAccess(user, workspaceId); + try { + //get latest source_tasks from db for provided sync ids grouped by sync id + const rows = await db.pgPool().query( + `select distinct sync_id as syncid, + last_value(task_id) over ( partition by sync_id order by started_at RANGE BETWEEN unbounded preceding and unbounded following) taskid, + last_value(status) over ( partition by sync_id order by started_at RANGE BETWEEN unbounded preceding and unbounded following) status, + last_value(started_at) over ( partition by sync_id order by started_at RANGE BETWEEN unbounded preceding and unbounded following) startedat, + last_value(updated_at) over ( partition by sync_id order by started_at RANGE BETWEEN unbounded preceding and unbounded following) updatedat +from source_task where sync_id = ANY($1::text[])`, + [body] + ); + const tasksRecord = rows.rows.reduce((acc, r) => { + acc[r.syncid] = { + syncId: r.syncid, + taskId: r.taskid, + status: r.status, + startedAt: r.startedat, + updatedAt: r.updatedat, + }; + return acc; + }, {} as aggregatedResultType["tasks"]); + return { + ok: true, + tasks: tasksRecord, + }; + } catch (e: any) { + const errorId = randomId(); + console.error( + `Error loading tasks for sync ids ${body} in workspace ${workspaceId}. Error ID: ${errorId}. Error: ${e}` + ); + return { + ok: false, + error: `couldn't load tasks due to internal server error. Please contact support. Error ID: ${errorId}`, + }; + } + }) + .GET({ + auth: true, + query: z.object({ + workspaceId: z.string(), + syncId: z.string(), + from: z.string().optional(), + to: z.string().optional(), + status: z.string().optional(), + }), + result: tasksResultType, + }) + .handler(async ({ user, query }) => { + const { workspaceId } = query; + await verifyAccess(user, workspaceId); + + try { + const tasks = await db.prisma().source_task.findMany({ + where: { + ...(query.syncId !== "all" && { + sync_id: { + equals: query.syncId, + }, + }), + ...(query.status && { + status: { + equals: query.status, + }, + }), + ...((query.from || query.to) && { + started_at: { + ...(query.from && { + gte: dayjs(query.from, "YYYY-MM-DD").utc(true).toDate(), + }), + ...(query.to && { + lt: dayjs(query.to, "YYYY-MM-DD").utc(true).add(1, "d").toDate(), + }), + }, + }), + }, + orderBy: { + started_at: "desc", + }, + take: 50, + }); + + return { + ok: true, + tasks: tasks, + }; + } catch (e: any) { + const errorId = randomId(); + console.error( + `Error loading tasks for sync ids ${query.syncId} in workspace ${workspaceId}. Error ID: ${errorId}. Error: ${e}` + ); + return { + ok: false, + error: `couldn't load tasks due to internal server error. Please contact support. Error ID: ${errorId}`, + }; + } + }) + .toNextApiHandler(); diff --git a/webapps/console/prisma/schema.prisma b/webapps/console/prisma/schema.prisma index cf3e5f630..a82946ae9 100644 --- a/webapps/console/prisma/schema.prisma +++ b/webapps/console/prisma/schema.prisma @@ -156,7 +156,7 @@ model source_spec { package String version String specs Json? - timestamp DateTime @default(now()) + timestamp DateTime @default(now()) @db.Timestamptz(3) error String? @@id([package, version]) @@ -168,7 +168,7 @@ model source_check { key String @id status String description String? - timestamp DateTime @default(now()) + timestamp DateTime @default(now()) @db.Timestamptz(3) } model source_catalog { @@ -176,7 +176,7 @@ model source_catalog { version String key String catalog Json? - timestamp DateTime @default(now()) + timestamp DateTime @default(now()) @db.Timestamptz(3) status String description String? @@ -186,7 +186,7 @@ model source_catalog { model source_state { sync_id String @id state Json - timestamp DateTime @default(now()) + timestamp DateTime @default(now()) @db.Timestamptz(3) } model source_task { @@ -194,8 +194,8 @@ model source_task { task_id String @id package String version String - started_at DateTime @default(now()) - updated_at DateTime @default(now()) + started_at DateTime @default(now()) @db.Timestamptz(3) + updated_at DateTime @default(now()) @db.Timestamptz(3) status String description String? @@ -210,7 +210,7 @@ model task_log { message String sync_id String task_id String - timestamp DateTime @default(now()) + timestamp DateTime @default(now()) @db.Timestamptz(3) @@index(sync_id) @@index(task_id) From 7797d8fcec2ec9c9570e78f29322e381a7cfa4d2 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 29 Jun 2023 15:59:59 +0400 Subject: [PATCH 0005/1353] Tasks View UX improvements. Fixes --- webapps/console/lib/api.ts | 10 +- .../pages/[workspaceId]/syncs/index.tsx | 10 +- .../pages/[workspaceId]/syncs/tasks.tsx | 158 +++++++++++++++--- .../pages/api/[workspaceId]/sources/logs.ts | 11 +- 4 files changed, 155 insertions(+), 34 deletions(-) diff --git a/webapps/console/lib/api.ts b/webapps/console/lib/api.ts index 83e3b27ab..461bce2c3 100644 --- a/webapps/console/lib/api.ts +++ b/webapps/console/lib/api.ts @@ -44,6 +44,8 @@ export type ApiMethod; query?: ZodType; }; + // indicates that handler uses write method for outputting response content. This is useful for streaming responses. + streaming?: boolean; handle: (ctx: HandlerOpts) => Promise; }; @@ -170,6 +172,10 @@ export function nextJsApiHandler(api: Api): NextApiHandler { } const result = await handler.handle({ body, req, res, query, user: currentUser as any }); + if (handler.streaming) { + //we cannot do anything with the result, it is the responsibility of the handler to write the response + return; + } if (handler.types?.result) { const parseResult = handler.types?.result.safeParse(result); if (!parseResult.success) { @@ -253,6 +259,7 @@ export type RouteBuilderBase = { body?: BodyZodType; result?: ResultZodType; auth?: RequireAuth; + streaming?: boolean; }) => { handler: ( handler: (params: { @@ -272,13 +279,14 @@ export function createRoute(): RouteBuilder { const legacyApiInstance: Api = {}; const builder: any = {}; for (const method of httpMethods) { - builder[method] = ({ query, body, result, auth }) => { + builder[method] = ({ query, body, result, auth, streaming }) => { return { handler: handler => { legacyApiInstance[method] = { auth: !!auth, types: { query, body, result }, handle: handler, + streaming: streaming, }; return builder; }, diff --git a/webapps/console/pages/[workspaceId]/syncs/index.tsx b/webapps/console/pages/[workspaceId]/syncs/index.tsx index 5db8fc204..8e496b133 100644 --- a/webapps/console/pages/[workspaceId]/syncs/index.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/index.tsx @@ -229,7 +229,15 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt { label: "Run Sync", onClick: async () => { - rpc(`/api/${workspace.id}/sources/run?syncId=${link.id}`); + await rpc(`/api/${workspace.id}/sources/run?syncId=${link.id}`); + router.push( + `/${workspace.slug || workspace.id}/syncs/tasks?query=${encodeURIComponent( + JSON5.stringify({ + syncId: link.id, + notification: "Sync Started", + }) + )}` + ); }, key: "run", icon: , diff --git a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx index 2234c088d..565dd7133 100644 --- a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx @@ -3,7 +3,7 @@ import { useWorkspace } from "../../../lib/context"; import { useApi } from "../../../lib/useApi"; import { source_taskDbModel } from "../../../prisma/schema"; import { z } from "zod"; -import { Button, Col, DatePicker, Row, Select, Space, Table, Tag } from "antd"; +import { Button, Col, DatePicker, notification, Popover, Row, Select, Space, Table, Tag } from "antd"; import React, { useCallback, useEffect, useMemo, useState } from "react"; import { useQueryStringState } from "../../../lib/useQueryStringState"; import { ColumnType } from "antd/es/table/interface"; @@ -12,13 +12,14 @@ import utc from "dayjs/plugin/utc"; import relativeTime from "dayjs/plugin/relativeTime"; import JSON5 from "json5"; import { ErrorCard } from "../../../components/GlobalError/GlobalError"; -import { LabelEllipsis } from "../../../components/LabelEllipsis/LabelEllipsis"; import { useLinksQuery } from "../../../lib/queries"; import { DestinationTitle } from "../destinations"; import { arrayToMap } from "../../../lib/shared/arrays"; import { ServiceTitle } from "../services"; -import { WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; +import { JitsuButton, WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; import { FileText } from "lucide-react"; +import { FaExternalLinkAlt, FaRegPlayCircle } from "react-icons/fa"; +import { useRouter } from "next/router"; dayjs.extend(utc); dayjs.extend(relativeTime); @@ -31,10 +32,14 @@ type TasksDbModel = z.infer; type TasksTableProps = { tasks: TasksDbModel[]; loading: boolean; - reloadCallback: () => void; + linksMap?: Record; + servicesMap?: Record; + destinationsMap?: Record; }; -function TasksTable({ tasks, loading, reloadCallback }: TasksTableProps) { +function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap }: TasksTableProps) { + const router = useRouter(); + const workspace = useWorkspace(); const columns: ColumnType[] = [ { title:
Started (UTC)
, @@ -44,6 +49,33 @@ function TasksTable({ tasks, loading, reloadCallback }: TasksTableProps) { return
{formatDate(task.started_at)}
; }, }, + { + title:
Sync
, + key: "link", + className: "w-full", + render: (text, task) => { + if (linksMap && servicesMap && destinationsMap) { + const link = linksMap[task.sync_id]; + if (link) { + return ( + + + {"→"} + + } + /> + + ); + } + } + return
{task.sync_id}
; + }, + }, { title:
Sync Status
, key: "status", @@ -72,16 +104,46 @@ function TasksTable({ tasks, loading, reloadCallback }: TasksTableProps) { }, }, { - title: "Description", - key: "description", + title:
Rows Processed
, + key: "rows", + className: "text-right", + width: "10%", render: (text, task) => { - return ( - - {task.description ?? ""} - - ); + if (task.status === "SUCCESS") { + try { + const des = JSON.parse(task.description || "{}"); + //sum des values + let processed_rows = 0; + for (const key in des) { + processed_rows += des[key]; + } + return {processed_rows}; + } catch (e) {} + } + return <>; + }, + }, + { + title: "Errors", + key: "errors", + width: "5%", + render: (text, task) => { + if (task.status === "FAILED") { + const popoverContent = ( +
+
{task.description}
+
+ ); + return ( + + e.stopPropagation()}> + Show error + + + ); + } + return <>; }, - width: "70%", }, { title: "", @@ -90,10 +152,12 @@ function TasksTable({ tasks, loading, reloadCallback }: TasksTableProps) { return ( } - type={"text"} + type={"link"} title={"View logs"} href={`/syncs/logs?taskId=${task.task_id}&syncId=${task.sync_id}`} - /> + > + View Logs + ); }, }, @@ -103,6 +167,15 @@ function TasksTable({ tasks, loading, reloadCallback }: TasksTableProps) {
{ + return { + onClick: () => { + router.push( + `/${workspace.slug || workspace.id}/syncs/logs?taskId=${record.task_id}&syncId=${record.sync_id}` + ); + }, + }; + }} dataSource={tasks} sortDirections={["ascend", "descend"]} columns={columns} @@ -118,10 +191,12 @@ export type TasksViewState = { dates?: DatesRange; syncId?: string; status?: "all" | "SUCCESS" | "FAILED" | "RUNNING"; + notification?: string; }; function Tasks() { const workspace = useWorkspace(); + const [api, contextHolder] = notification.useNotification(); const defaultState: TasksViewState = { status: "all", @@ -136,6 +211,11 @@ function Tasks() { return JSON5.stringify(value); }, }); + const [linksMap, setLinksMap] = useState | undefined>( + undefined + ); + const [servicesMap, setServicesMap] = useState | undefined>(undefined); + const [destinationsMap, setDestinationsMap] = useState | undefined>(undefined); const { data: linksData, @@ -163,6 +243,26 @@ function Tasks() { [state, setState] ); + useEffect(() => { + if (state.notification) { + api.info({ + message: state.notification, + description: "", + icon: , + placement: "topRight", + }); + patchQueryStringState("notification", null); + } + }, [state, api, patchQueryStringState]); + + useEffect(() => { + if (linksData) { + setServicesMap(arrayToMap(linksData[0])); + setDestinationsMap(arrayToMap(linksData[1])); + setLinksMap(arrayToMap(linksData[2])); + } + }, [linksData]); + useEffect(() => { if (linksData) { if (!state.syncId) { @@ -172,18 +272,15 @@ function Tasks() { }, [linksData, patchQueryStringState, state.syncId]); const entitiesSelectOptions = useMemo(() => { - if (linksData) { - const services = arrayToMap(linksData[0]); - const destinations = arrayToMap(linksData[1]); - const links = arrayToMap(linksData[2]) as Record; - let syncs = Object.entries(links).map(entity => ({ - value: entity[0], - key: entity[0], + if (linksMap && servicesMap && destinationsMap) { + let syncs = Object.entries(linksMap).map(([linkId, link]) => ({ + value: linkId, + key: linkId, label: ( - - + + {"→"} - + ), })); @@ -199,7 +296,7 @@ function Tasks() { } else { return []; } - }, [linksData]); + }, [linksMap, servicesMap, destinationsMap]); let tasksUrl = `/api/${workspace.id}/sources/tasks?syncId=${state.syncId}&r=${refresh}`; if (state.status !== "all") { @@ -218,6 +315,7 @@ function Tasks() { return ( <> + {contextHolder} Syncs: @@ -308,7 +406,13 @@ function Tasks() { {error ? ( ) : ( - {}} /> + )} ); diff --git a/webapps/console/pages/api/[workspaceId]/sources/logs.ts b/webapps/console/pages/api/[workspaceId]/sources/logs.ts index 7ce1150db..1390aa074 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/logs.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/logs.ts @@ -15,6 +15,7 @@ export default createRoute() syncId: z.string(), download: z.string().optional(), }), + streaming: true, }) .handler(async ({ user, query, res }) => { const { workspaceId } = query; @@ -36,16 +37,16 @@ export default createRoute() ); } ); - res.end(); } catch (e: any) { const errorId = randomId(); console.error( `Error loading logs for task id ${query.taskId} in workspace ${workspaceId}. Error ID: ${errorId}. Error: ${e}` ); - return { - ok: false, - error: `couldn't load tasks due to internal server error. Please contact support. Error ID: ${errorId}`, - }; + res.write( + `ERROR: couldn't load task logs due to internal server error. Please contact support. Error ID: ${errorId}` + ); + } finally { + res.end(); } }) .toNextApiHandler(); From 2611974f31ffaabf6ae6e3c0ef237011fa7213f8 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 29 Jun 2023 19:48:02 +0400 Subject: [PATCH 0006/1353] Tasks View UX improvements --- .../pages/[workspaceId]/syncs/tasks.tsx | 134 +++++++++--------- 1 file changed, 68 insertions(+), 66 deletions(-) diff --git a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx index 565dd7133..ee08d3e8d 100644 --- a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx @@ -3,7 +3,7 @@ import { useWorkspace } from "../../../lib/context"; import { useApi } from "../../../lib/useApi"; import { source_taskDbModel } from "../../../prisma/schema"; import { z } from "zod"; -import { Button, Col, DatePicker, notification, Popover, Row, Select, Space, Table, Tag } from "antd"; +import { Button, Col, DatePicker, notification, Popconfirm, Row, Select, Space, Table, Tag } from "antd"; import React, { useCallback, useEffect, useMemo, useState } from "react"; import { useQueryStringState } from "../../../lib/useQueryStringState"; import { ColumnType } from "antd/es/table/interface"; @@ -16,10 +16,11 @@ import { useLinksQuery } from "../../../lib/queries"; import { DestinationTitle } from "../destinations"; import { arrayToMap } from "../../../lib/shared/arrays"; import { ServiceTitle } from "../services"; -import { JitsuButton, WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; +import { WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; import { FileText } from "lucide-react"; import { FaExternalLinkAlt, FaRegPlayCircle } from "react-icons/fa"; import { useRouter } from "next/router"; +import { ExclamationCircleOutlined } from "@ant-design/icons"; dayjs.extend(utc); dayjs.extend(relativeTime); @@ -76,73 +77,74 @@ function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap }: return
{task.sync_id}
; }, }, - { - title:
Sync Status
, - key: "status", - width: "5%", - render: (text, task) => { - const color = (status: string) => { - switch (status) { - case "RUNNING": - return "blue"; - case "FAILED": - return "red"; - case "SUCCESS": - return "green"; - default: - return undefined; - } - }; - return {task.status}; - }, - }, { title:
Duration
, key: "updated_at", + width: "12%", render: (text, task) => { return
{dayjs(task.updated_at).from(dayjs(task.started_at), true)}
; }, }, { - title:
Rows Processed
, - key: "rows", + title:
Sync Status
, + key: "status", className: "text-right", - width: "10%", - render: (text, task) => { - if (task.status === "SUCCESS") { - try { - const des = JSON.parse(task.description || "{}"); - //sum des values - let processed_rows = 0; - for (const key in des) { - processed_rows += des[key]; - } - return {processed_rows}; - } catch (e) {} - } - return <>; - }, - }, - { - title: "Errors", - key: "errors", width: "5%", render: (text, task) => { - if (task.status === "FAILED") { - const popoverContent = ( -
-
{task.description}
-
- ); - return ( - - e.stopPropagation()}> - Show error - - - ); + switch (task.status) { + case "SUCCESS": + try { + const des = JSON.parse(task.description || "{}"); + //sum des values + let processed_rows = 0; + for (const key in des) { + processed_rows += des[key]; + } + return ( + + + SUCCESS + + {processed_rows} rows + + ); + } catch (e) {} + return ( + + SUCCESS + + ); + case "FAILED": + const popoverContent = ( +
+
{task.description}
+
+ ); + return ( + } + showCancel={false} + > + + + FAILED + + Show error + + + ); + case "RUNNING": + return ( + + RUNNING + + ); } - return <>; }, }, { @@ -167,15 +169,15 @@ function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap }:
{ - return { - onClick: () => { - router.push( - `/${workspace.slug || workspace.id}/syncs/logs?taskId=${record.task_id}&syncId=${record.sync_id}` - ); - }, - }; - }} + // onRow={record => { + // return { + // onClick: () => { + // router.push( + // `/${workspace.slug || workspace.id}/syncs/logs?taskId=${record.task_id}&syncId=${record.sync_id}` + // ); + // }, + // }; + // }} dataSource={tasks} sortDirections={["ascend", "descend"]} columns={columns} From b901e9a6d00876c85b63d20885b25bdd1465ac35 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 29 Jun 2023 21:02:32 +0400 Subject: [PATCH 0007/1353] hide error popover on esc --- .../console/pages/[workspaceId]/syncs/tasks.tsx | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx index ee08d3e8d..82e7ecf60 100644 --- a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx @@ -130,12 +130,14 @@ function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap }: icon={} showCancel={false} > - - - FAILED - - Show error - + ); case "RUNNING": From 3b6a43960dcde7b34452717a91b8daa866a1aa91 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 30 Jun 2023 17:11:12 +0400 Subject: [PATCH 0008/1353] Don't allow to run the same sync twice. Pass saved state to sync. API: return entities sorted by createdAt Visual tweaks --- .../pages/[workspaceId]/syncs/index.tsx | 88 +++++++++---------- .../pages/[workspaceId]/syncs/tasks.tsx | 26 ++++-- .../api/[workspaceId]/config/[type]/index.ts | 1 + .../pages/api/[workspaceId]/config/link.ts | 1 + .../pages/api/[workspaceId]/sources/run.ts | 28 +++++- 5 files changed, 87 insertions(+), 57 deletions(-) diff --git a/webapps/console/pages/[workspaceId]/syncs/index.tsx b/webapps/console/pages/[workspaceId]/syncs/index.tsx index 8e496b133..a2b2f6fc9 100644 --- a/webapps/console/pages/[workspaceId]/syncs/index.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/index.tsx @@ -5,7 +5,7 @@ import { DestinationConfig, ServiceConfig } from "../../../lib/schema"; import { ConfigurationObjectLinkDbModel } from "../../../prisma/schema"; import { QueryResponse } from "../../../components/QueryResponse/QueryResponse"; import { z } from "zod"; -import { Dropdown, MenuProps, Table, Tag } from "antd"; +import { Space, Table, Tag } from "antd"; import { confirmOp, feedbackError, feedbackSuccess } from "../../../lib/ui"; import React, { useEffect, useState } from "react"; import Link from "next/link"; @@ -26,7 +26,6 @@ import { Spinner } from "../../../components/GlobalLoader/GlobalLoader"; import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; import relativeTime from "dayjs/plugin/relativeTime"; -import { WLink } from "../../../components/Workspace/WLink"; import { ServiceTitle } from "../services"; import { DestinationTitle } from "../destinations"; import JSON5 from "json5"; @@ -183,7 +182,7 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt }, { title:
Sync Status
, - width: "5%", + width: "4%", render: (text, link) => { if (tasks.error) { return
error obtaining status
; @@ -223,50 +222,49 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt }, }, { - title: "", + title:
Actions
, render: (text, link) => { - const items: MenuProps["items"] = [ - { - label: "Run Sync", - onClick: async () => { - await rpc(`/api/${workspace.id}/sources/run?syncId=${link.id}`); - router.push( - `/${workspace.slug || workspace.id}/syncs/tasks?query=${encodeURIComponent( - JSON5.stringify({ - syncId: link.id, - notification: "Sync Started", - }) - )}` - ); - }, - key: "run", - icon: , - }, - { - label: Sync Logs, - key: "tasks", - icon: , - }, - { - label: Edit, - key: "edit", - icon: , - }, - { - label: "Delete", - onClick: async () => { - deleteSync(link); - }, - key: "delete", - icon: , - }, - ].filter(i => !!i); + const t = tasks?.data?.tasks?.[link.id]; return ( -
- -
-
-
+ + } + onClick={async () => { + const runStatus = await rpc(`/api/${workspace.id}/sources/run?syncId=${link.id}`); + if (runStatus?.error) { + feedbackError(`Failed to run sync: ${runStatus.error}`); + } else { + router.push( + `/${workspace.slug || workspace.id}/syncs/tasks?query=${encodeURIComponent( + JSON5.stringify({ + syncId: link.id, + notification: "Sync Started", + }) + )}` + ); + } + }} + > + Run + + } href={`/syncs/tasks?query=${JSON5.stringify({ syncId: link.id })}`}> + Logs + + } href={`/syncs/edit?id=${link.id}`}> + Edit + + } + onClick={async () => { + deleteSync(link); + }} + danger + > + ); }, }, diff --git a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx index 82e7ecf60..5beef432c 100644 --- a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx @@ -3,7 +3,7 @@ import { useWorkspace } from "../../../lib/context"; import { useApi } from "../../../lib/useApi"; import { source_taskDbModel } from "../../../prisma/schema"; import { z } from "zod"; -import { Button, Col, DatePicker, notification, Popconfirm, Row, Select, Space, Table, Tag } from "antd"; +import { Col, DatePicker, notification, Popconfirm, Row, Select, Space, Table, Tag } from "antd"; import React, { useCallback, useEffect, useMemo, useState } from "react"; import { useQueryStringState } from "../../../lib/useQueryStringState"; import { ColumnType } from "antd/es/table/interface"; @@ -16,8 +16,8 @@ import { useLinksQuery } from "../../../lib/queries"; import { DestinationTitle } from "../destinations"; import { arrayToMap } from "../../../lib/shared/arrays"; import { ServiceTitle } from "../services"; -import { WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; -import { FileText } from "lucide-react"; +import { JitsuButton, WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; +import { ChevronLeft, FileText, RefreshCw } from "lucide-react"; import { FaExternalLinkAlt, FaRegPlayCircle } from "react-icons/fa"; import { useRouter } from "next/router"; import { ExclamationCircleOutlined } from "@ant-design/icons"; @@ -200,6 +200,7 @@ export type TasksViewState = { function Tasks() { const workspace = useWorkspace(); + const router = useRouter(); const [api, contextHolder] = notification.useNotification(); const defaultState: TasksViewState = { @@ -396,15 +397,24 @@ function Tasks() { />
- + + } + type="link" + size="small" + onClick={() => router.push(`/${workspace.slug || workspace.id}/syncs`)} + > + Back + {error ? ( diff --git a/webapps/console/pages/api/[workspaceId]/config/[type]/index.ts b/webapps/console/pages/api/[workspaceId]/config/[type]/index.ts index e5da56b6a..c9cb97fb6 100644 --- a/webapps/console/pages/api/[workspaceId]/config/[type]/index.ts +++ b/webapps/console/pages/api/[workspaceId]/config/[type]/index.ts @@ -18,6 +18,7 @@ export const api: Api = { assertDefined(configObjectType, `Invalid config object type: ${type}`); const objects = await db.prisma().configurationObject.findMany({ where: { workspaceId: workspaceId, type, deleted: false }, + orderBy: { createdAt: "asc" }, }); return { objects: objects diff --git a/webapps/console/pages/api/[workspaceId]/config/link.ts b/webapps/console/pages/api/[workspaceId]/config/link.ts index f65fe9cf1..ceb4b5fcb 100644 --- a/webapps/console/pages/api/[workspaceId]/config/link.ts +++ b/webapps/console/pages/api/[workspaceId]/config/link.ts @@ -16,6 +16,7 @@ export const api: Api = { return { links: await db.prisma().configurationObjectLink.findMany({ where: { workspaceId: workspaceId, deleted: false }, + orderBy: { createdAt: "asc" }, }), }; }, diff --git a/webapps/console/pages/api/[workspaceId]/sources/run.ts b/webapps/console/pages/api/[workspaceId]/sources/run.ts index b9a3e4abd..7ebeade87 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/run.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/run.ts @@ -32,6 +32,19 @@ export default createRoute() authHeaders["Authorization"] = `Bearer ${syncAuthKey}`; } try { + const running = await db.prisma().source_task.findFirst({ + where: { + sync_id: query.syncId as string, + status: "RUNNING", + }, + }); + if (running) { + return { + ok: false, + error: `Sync is already running`, + }; + } + const sync = await db.prisma().configurationObjectLink.findUnique({ where: { id: query.syncId as string, @@ -43,17 +56,23 @@ export default createRoute() if (!sync) { return { ok: false, - error: `syncId ${query.syncId} not found`, + error: `Sync ${query.syncId} not found`, }; } - console.log("sync", sync); const service = sync.from; if (!service) { return { ok: false, - error: `service ${sync.from} not found`, + error: `Service ${sync.from} not found`, }; } + //load state from db + const stateObj = await db.prisma().source_state.findUnique({ + where: { + sync_id: query.syncId as string, + }, + }); + const taskId = randomUUID(); const res = await rpc(syncURL + "/read", { method: "POST", @@ -70,6 +89,7 @@ export default createRoute() body: { config: JSON.parse((service.config as any).credentials), catalog: JSON.parse((sync.data as any).streams), + ...(stateObj ? { state: stateObj.state } : {}), }, }); if (!res.ok) { @@ -84,7 +104,7 @@ export default createRoute() ); return { ok: false, - error: `couldn't run sync due to internal server error. Please contact support. Error ID: ${errorId}`, + error: `Couldn't run sync due to internal server error. Please contact support. Error ID: ${errorId}`, }; } }) From 0bfdbe99dc1c9867f8a9a8a078c9bb144825845c Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Sun, 2 Jul 2023 12:24:50 -0400 Subject: [PATCH 0009/1353] README tweaks --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index a5ac370fb..032117727 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,12 @@ # Jitsu 2.0 - -> Looking for Jitsu Classic? Switch to -> classic branch, and read about Jitsu Classic and Jitsu Next differences

- - +👉Looking for Jitsu Classic? Switch to +classic branch, and read about Jitsu Classic and Jitsu Next differences +

+

+ +

Learn more » From 4f08eee242732ebc4018288c4b5bf061a479c44c Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Sun, 2 Jul 2023 14:48:53 -0400 Subject: [PATCH 0010/1353] README fix --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 032117727..c222aed66 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,8 @@ classic branch, and read about Jitsu Classic and Jitsu Next differences

- - + +

Learn more » From 7773acbb60ffa311ec9801b4162603a08e4ad25a Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 3 Jul 2023 10:53:39 +0400 Subject: [PATCH 0011/1353] Visual tweaks --- .../components/Billing/BillingBlockingDialog.tsx | 9 ++++++++- webapps/console/pages/[workspaceId]/syncs/tasks.tsx | 10 ++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/webapps/console/components/Billing/BillingBlockingDialog.tsx b/webapps/console/components/Billing/BillingBlockingDialog.tsx index 737fb4547..6023e5856 100644 --- a/webapps/console/components/Billing/BillingBlockingDialog.tsx +++ b/webapps/console/components/Billing/BillingBlockingDialog.tsx @@ -5,6 +5,7 @@ import { Modal } from "antd"; import { upgradeRequired } from "./copy"; import { AlertTriangle, ArrowRight } from "lucide-react"; import { WJitsuButton } from "../JitsuButton/JitsuButton"; +import { useWorkspace } from "../../lib/context"; const log = getLog("billing"); @@ -57,7 +58,13 @@ function LoadAndBlockIfNeed() { export const BillingBlockingDialog = () => { const billing = useBilling(); - if (!billing.enabled || billing.loading || billing.settings.planId !== "free") { + const workspace = useWorkspace(); + if ( + !billing.enabled || + billing.loading || + billing.settings.planId !== "free" || + workspace.featuresEnabled.includes("noblock") + ) { return <>; } else { return ; diff --git a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx index 5beef432c..40332ee06 100644 --- a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx @@ -105,7 +105,9 @@ function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap }: SUCCESS - {processed_rows} rows + + {processed_rows.toLocaleString("FR", { useGrouping: true })} rows + ); } catch (e) {} @@ -130,12 +132,12 @@ function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap }: icon={} showCancel={false} > - From e0dc3563c0a4004e061c2061a6ac1eb3111f006d Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 3 Jul 2023 16:21:14 +0400 Subject: [PATCH 0012/1353] Use the same ButtonGroup component in all entities list --- .../ButtonGroup/ButtonGroup.module.css | 3 + .../components/ButtonGroup/ButtonGroup.tsx | 80 +++++++++++++++++ .../ConfigObjectEditor/ConfigEditor.tsx | 63 ++++++------- .../components/JitsuButton/JitsuButton.tsx | 24 ++--- .../pages/[workspaceId]/connections/index.tsx | 30 ++++--- .../pages/[workspaceId]/destinations.tsx | 1 + .../console/pages/[workspaceId]/streams.tsx | 1 + .../pages/[workspaceId]/syncs/index.tsx | 88 ++++++++++--------- .../pages/[workspaceId]/syncs/tasks.tsx | 4 +- 9 files changed, 190 insertions(+), 104 deletions(-) create mode 100644 webapps/console/components/ButtonGroup/ButtonGroup.module.css create mode 100644 webapps/console/components/ButtonGroup/ButtonGroup.tsx diff --git a/webapps/console/components/ButtonGroup/ButtonGroup.module.css b/webapps/console/components/ButtonGroup/ButtonGroup.module.css new file mode 100644 index 000000000..25abbf3b9 --- /dev/null +++ b/webapps/console/components/ButtonGroup/ButtonGroup.module.css @@ -0,0 +1,3 @@ +.buttonGroup > :global(.ant-btn) { + margin-inline-start: 0 !important; +} diff --git a/webapps/console/components/ButtonGroup/ButtonGroup.tsx b/webapps/console/components/ButtonGroup/ButtonGroup.tsx new file mode 100644 index 000000000..a8c7374e7 --- /dev/null +++ b/webapps/console/components/ButtonGroup/ButtonGroup.tsx @@ -0,0 +1,80 @@ +import { Button, Dropdown, MenuProps } from "antd"; +import React from "react"; +import { JitsuButton, WJitsuButton } from "../JitsuButton/JitsuButton"; +import { BaseButtonProps } from "antd/lib/button/button"; +import styles from "./ButtonGroup.module.css"; +import { useRouter } from "next/router"; +import { useWorkspace } from "../../lib/context"; + +const AntButtonGroup = Button.Group; + +export type ButtonProps = Omit & { + href?: string; + label?: React.ReactNode; + hideLabel?: boolean; + collapsed?: boolean; + title?: string; + onClick?: () => void; +}; + +export type ButtonGroupProps = { + items: ButtonProps[]; + collapseLast?: number; +}; + +export const ButtonGroup: React.FC = ({ items, collapseLast }) => { + const router = useRouter(); + const w = useWorkspace(); + const _expandedItems = typeof collapseLast !== "undefined" ? items.slice(0, items.length - collapseLast) : items; + const _collapsedItems: MenuProps["items"] = + typeof collapseLast !== "undefined" + ? items.slice(items.length - collapseLast).map((item, i) => ({ + label: item.label, + key: i, + icon: item.icon, + disabled: item.disabled, + danger: item.danger, + onClick: item.onClick || (item.href ? () => router.push(`/${w.slug || w.id}${item.href}`) : undefined), + })) + : []; + const expandedItems = _expandedItems.filter(item => !item.collapsed); + const collapsedItems = [..._expandedItems.filter(item => item.collapsed), ..._collapsedItems].map((item, i) => ({ + ...item, + key: i, + })); + + return ( + + {expandedItems.map((item, i) => { + if (item.href) { + return ( + + {!item.hideLabel && item.label ? item.label : <>} + + ); + } + return ( + + {!item.hideLabel && item.label ? item.label : <>} + + ); + })} + {collapsedItems.length > 0 && ( + + + + )} + + ); +}; diff --git a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx index 5d40434a2..bf090c435 100644 --- a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx +++ b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx @@ -1,5 +1,5 @@ import React, { createContext, PropsWithChildren, ReactNode, useContext, useEffect, useState } from "react"; -import { Button, Col, Dropdown, Form as AntdForm, Input, MenuProps, Row, Skeleton, Switch, Table } from "antd"; +import { Button, Col, Form as AntdForm, Input, Row, Skeleton, Switch, Table } from "antd"; import { FaCaretDown, FaCaretRight, FaClone, FaPlus } from "react-icons/fa"; import { ZodType } from "zod"; import { getConfigApi, useApi } from "../../lib/useApi"; @@ -42,6 +42,7 @@ import { EditorTitle } from "./EditorTitle"; import { EditorBase } from "./EditorBase"; import { EditorField } from "./EditorField"; import { EditorButtons } from "./EditorButtons"; +import { ButtonGroup, ButtonProps } from "../ButtonGroup/ButtonGroup"; const log = getLog("ConfigEditor"); @@ -78,6 +79,8 @@ export type ConfigEditorProps actions?: { title: ReactNode; icon?: ReactNode; + hideLabel?: boolean; + collapsed?: boolean; key?: string; action?: (o: T) => void; link?: (o: T) => string; @@ -641,52 +644,40 @@ const ObjectsList: React.FC<{ objects: any[]; onDelete: (id: string) => Promise< })), { title: "", + className: "text-right", render: (text, record) => { - const items: MenuProps["items"] = [ + const items: ButtonProps[] = [ { - label: Edit, - key: "edit", + label: "Edit", + href: `/${type}s?id=${record.id}`, icon: , }, + ...actions.map(action => ({ + disabled: !!(action.disabled && action.disabled(record)), + href: action.link ? action.link(record) : undefined, + label: action.title, + hideLabel: action.hideLabel, + collapsed: action.collapsed, + onClick: action.action + ? () => { + (action.action as any)(record); + } + : undefined, + icon:

{action.icon}
, + })), { - label: Clone, - key: "clone", + label: "Clone", + href: `/${type}s?id=new&clone=${record.id}`, icon: , }, { - label: deleteObject(record.id)}>Delete, - key: "del", + label: "Delete", + danger: true, + onClick: () => deleteObject(record.id), icon: , }, - ...actions.map(action => ({ - disabled: !!(action.disabled && action.disabled(record)), - label: action.link ? ( - {action.title} - ) : ( - { - (action.action as any)(record); - } - : undefined - } - > - {action.title} - - ), - key: - (typeof action.title === "string" ? action.title : action.link ? action.link(record) : action.key) ?? "", - icon:
{action.icon}
, - })), ].filter(i => !!i); - return ( -
- -
-
-
- ); + return ; }, }, ]; diff --git a/webapps/console/components/JitsuButton/JitsuButton.tsx b/webapps/console/components/JitsuButton/JitsuButton.tsx index 844643b0a..69761e5d0 100644 --- a/webapps/console/components/JitsuButton/JitsuButton.tsx +++ b/webapps/console/components/JitsuButton/JitsuButton.tsx @@ -1,11 +1,11 @@ import type { ButtonProps } from "antd/es/button/button"; -import Link from "next/link"; import { Button } from "antd"; import omit from "lodash/omit"; import React from "react"; -import { WLink } from "../Workspace/WLink"; import { ButtonLabel } from "../ButtonLabel/ButtonLabel"; +import { useRouter } from "next/router"; +import { useWorkspace } from "../../lib/context"; export type JitsuButtonProps = ButtonProps & { iconPosition?: "left" | "right"; @@ -14,11 +14,15 @@ export type JitsuButtonProps = ButtonProps & { }; export const WJitsuButton: React.FC>> = p => { - return ( - - - - ); + const workspace = useWorkspace(); + const router = useRouter(); + return router.push(`/${workspace.slug || workspace.id}${p.href}`)} />; +}; + +//href button +const HJitsuButton: React.FC>> = p => { + const router = useRouter(); + return router.push(p.href)} />; }; function Button0(props: JitsuButtonProps) { @@ -42,9 +46,5 @@ export const JitsuButton: React.FC = p => { if (p.ws) { return ; } - return ( - - - - ); + return ; }; diff --git a/webapps/console/pages/[workspaceId]/connections/index.tsx b/webapps/console/pages/[workspaceId]/connections/index.tsx index ea8dbfe41..e949a875b 100644 --- a/webapps/console/pages/[workspaceId]/connections/index.tsx +++ b/webapps/console/pages/[workspaceId]/connections/index.tsx @@ -22,6 +22,7 @@ import { Inbox } from "lucide-react"; import { PlusOutlined } from "@ant-design/icons"; import { JitsuButton, WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; import { DestinationTitle } from "../destinations"; +import { ButtonGroup, ButtonProps } from "../../../components/ButtonGroup/ButtonGroup"; function EmptyLinks() { const workspace = useWorkspace(); @@ -154,19 +155,24 @@ function ConnectionsTable({ links, streams, destinations, reloadCallback }: Remo }, { title: "Actions", - render: (text, link) => ( -
- } /> - } - onClick={() => { + render: (text, link) => { + const items: ButtonProps[] = [ + { + icon: , + label: "Edit", + href: `/connections/edit?id=${link.id}`, + }, + { + icon: , + onClick: async () => { deleteConnection(link); - }} - /> -
- ), + }, + danger: true, + label: "Delete", + }, + ]; + return ; + }, }, ]; return ( diff --git a/webapps/console/pages/[workspaceId]/destinations.tsx b/webapps/console/pages/[workspaceId]/destinations.tsx index 7c716a2bc..6bed5b3ce 100644 --- a/webapps/console/pages/[workspaceId]/destinations.tsx +++ b/webapps/console/pages/[workspaceId]/destinations.tsx @@ -572,6 +572,7 @@ const DestinationsList: React.FC<{ type?: string }> = ({ type }) => { actions: [ { title: "Run SQL query editor", + collapsed: true, icon: , key: "sql", link: (d: DestinationConfig) => `/sql?destinationId=${d.id}`, diff --git a/webapps/console/pages/[workspaceId]/streams.tsx b/webapps/console/pages/[workspaceId]/streams.tsx index d0399ea98..f869db023 100644 --- a/webapps/console/pages/[workspaceId]/streams.tsx +++ b/webapps/console/pages/[workspaceId]/streams.tsx @@ -324,6 +324,7 @@ const StreamsList: React.FC<{}> = () => { { icon: , title: "Setup Instructions", + collapsed: true, action: stream => { router.replace({ pathname: router.pathname, diff --git a/webapps/console/pages/[workspaceId]/syncs/index.tsx b/webapps/console/pages/[workspaceId]/syncs/index.tsx index a2b2f6fc9..9cd14cece 100644 --- a/webapps/console/pages/[workspaceId]/syncs/index.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/index.tsx @@ -5,7 +5,7 @@ import { DestinationConfig, ServiceConfig } from "../../../lib/schema"; import { ConfigurationObjectLinkDbModel } from "../../../prisma/schema"; import { QueryResponse } from "../../../components/QueryResponse/QueryResponse"; import { z } from "zod"; -import { Space, Table, Tag } from "antd"; +import { Table, Tag } from "antd"; import { confirmOp, feedbackError, feedbackSuccess } from "../../../lib/ui"; import React, { useEffect, useState } from "react"; import Link from "next/link"; @@ -29,6 +29,7 @@ import relativeTime from "dayjs/plugin/relativeTime"; import { ServiceTitle } from "../services"; import { DestinationTitle } from "../destinations"; import JSON5 from "json5"; +import { ButtonGroup, ButtonProps } from "../../../components/ButtonGroup/ButtonGroup"; dayjs.extend(utc); dayjs.extend(relativeTime); @@ -225,47 +226,50 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt title:
Actions
, render: (text, link) => { const t = tasks?.data?.tasks?.[link.id]; - return ( - - } - onClick={async () => { - const runStatus = await rpc(`/api/${workspace.id}/sources/run?syncId=${link.id}`); - if (runStatus?.error) { - feedbackError(`Failed to run sync: ${runStatus.error}`); - } else { - router.push( - `/${workspace.slug || workspace.id}/syncs/tasks?query=${encodeURIComponent( - JSON5.stringify({ - syncId: link.id, - notification: "Sync Started", - }) - )}` - ); - } - }} - > - Run - - } href={`/syncs/tasks?query=${JSON5.stringify({ syncId: link.id })}`}> - Logs - - } href={`/syncs/edit?id=${link.id}`}> - Edit - - } - onClick={async () => { - deleteSync(link); - }} - danger - > - - ); + const items: ButtonProps[] = [ + { + type: "primary", + disabled: t?.status === "RUNNING", + title: t?.status === "RUNNING" ? "Sync is already running" : undefined, + ghost: true, + icon: , + onClick: async () => { + const runStatus = await rpc(`/api/${workspace.id}/sources/run?syncId=${link.id}`); + if (runStatus?.error) { + feedbackError(`Failed to run sync: ${runStatus.error}`); + } else { + router.push( + `/${workspace.slug || workspace.id}/syncs/tasks?query=${encodeURIComponent( + JSON5.stringify({ + syncId: link.id, + notification: "Sync Started", + }) + )}` + ); + } + }, + label: "Run", + }, + { + icon: , + label: "Logs", + href: `/syncs/tasks?query=${JSON5.stringify({ syncId: link.id })}`, + }, + { + icon: , + label: "Edit", + href: `/syncs/edit?id=${link.id}`, + }, + { + icon: , + onClick: async () => { + deleteSync(link); + }, + danger: true, + label: "Delete", + }, + ]; + return ; }, }, ]; diff --git a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx index 40332ee06..7ef93580d 100644 --- a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx @@ -101,7 +101,7 @@ function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap }: processed_rows += des[key]; } return ( - + SUCCESS @@ -133,7 +133,7 @@ function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap }: showCancel={false} > + } /> )} diff --git a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx index bf090c435..1480ffdf8 100644 --- a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx +++ b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx @@ -30,12 +30,12 @@ import { useWorkspace } from "../../lib/context"; import omitBy from "lodash/omitBy"; import { GlobalLoader, LoadingAnimation } from "../GlobalLoader/GlobalLoader"; import { WLink } from "../Workspace/WLink"; -import { DeleteOutlined, EditOutlined } from "@ant-design/icons"; +import { DeleteOutlined } from "@ant-design/icons"; import { ErrorCard, GlobalError } from "../GlobalError/GlobalError"; import { Action, confirmOp, doAction, feedbackError, feedbackSuccess, useTitle } from "../../lib/ui"; import { branding } from "../../lib/branding"; import { useAntdModal } from "../../lib/modal"; -import { Inbox } from "lucide-react"; +import { Edit3, Inbox } from "lucide-react"; import { createDisplayName, prepareZodObjectForSerialization } from "../../lib/zod"; import { JitsuButton } from "../JitsuButton/JitsuButton"; import { EditorTitle } from "./EditorTitle"; @@ -650,7 +650,7 @@ const ObjectsList: React.FC<{ objects: any[]; onDelete: (id: string) => Promise< { label: "Edit", href: `/${type}s?id=${record.id}`, - icon: , + icon: , }, ...actions.map(action => ({ disabled: !!(action.disabled && action.disabled(record)), diff --git a/webapps/console/components/JitsuButton/JitsuButton.tsx b/webapps/console/components/JitsuButton/JitsuButton.tsx index 69761e5d0..d62387839 100644 --- a/webapps/console/components/JitsuButton/JitsuButton.tsx +++ b/webapps/console/components/JitsuButton/JitsuButton.tsx @@ -27,7 +27,7 @@ const HJitsuButton: React.FC +
- {entityType == "stream" ? "Sites: " : "Connection: "} - { - dispatch({ type: "events", value: [] }); - dispatch({ type: "beforeId", value: "" }); - patchQueryStringState("eventType", e); - }} - options={[ - { value: "all", label: "All" }, - { value: "error", label: "Errors only" }, - ]} - /> - - - Date range: - (d ? dayjs(d, "YYYY-MM-DD") : null)).slice(0, 2) as [ - Dayjs | null, - Dayjs | null - ] - } - disabledDate={d => false} - allowEmpty={[true, true]} - onChange={d => { - if (d) { - patchQueryStringState("dates", [ - d[0] ? d[0].format("YYYY-MM-DD") : null, - d[1] ? d[1].format("YYYY-MM-DD") : null, - ]); - } else { - patchQueryStringState("dates", [null, null]); - } - dispatch({ type: "events", value: [] }); - dispatch({ type: "beforeId", value: "" }); - }} - // onOpenChange={onOpenChange} - /> + + + +
+ {entityType == "stream" ? "Sites: " : "Connection: "} + { + dispatch({ type: "events", value: [] }); + dispatch({ type: "beforeId", value: "" }); + patchQueryStringState("eventType", e); + }} + options={[ + { value: "all", label: "All" }, + { value: "error", label: "Errors only" }, + ]} + /> +
+
+ Date range: + (d ? dayjs(d, "YYYY-MM-DD") : null)).slice(0, 2) as [ + Dayjs | null, + Dayjs | null + ] + } + disabledDate={d => false} + allowEmpty={[true, true]} + onChange={d => { + if (d) { + patchQueryStringState("dates", [ + d[0] ? d[0].format("YYYY-MM-DD") : null, + d[1] ? d[1].format("YYYY-MM-DD") : null, + ]); + } else { + patchQueryStringState("dates", [null, null]); + } + dispatch({ type: "events", value: [] }); + dispatch({ type: "beforeId", value: "" }); + }} + // onOpenChange={onOpenChange} + /> +
+
- - + {!error ? ( diff --git a/webapps/console/pages/[workspaceId]/destinations.tsx b/webapps/console/pages/[workspaceId]/destinations.tsx index 6bed5b3ce..1cea1170f 100644 --- a/webapps/console/pages/[workspaceId]/destinations.tsx +++ b/webapps/console/pages/[workspaceId]/destinations.tsx @@ -570,18 +570,18 @@ const DestinationsList: React.FC<{ type?: string }> = ({ type }) => { log.atInfo().log("extraFields", extraFields); const config: ConfigEditorProps = { actions: [ - { - title: "Run SQL query editor", - collapsed: true, - icon: , - key: "sql", - link: (d: DestinationConfig) => `/sql?destinationId=${d.id}`, - disabled: (d: DestinationConfig) => { - return d.provisioned || (d.destinationType === "clickhouse" && d.protocol === "https") - ? false - : "Jitsu can query either provisioned ClickHouse, or ClickHouse connected via HTTPS protocol"; - }, - }, + // { + // title: "Run SQL query editor", + // collapsed: true, + // icon: , + // key: "sql", + // link: (d: DestinationConfig) => `/sql?destinationId=${d.id}`, + // disabled: (d: DestinationConfig) => { + // return d.provisioned || (d.destinationType === "clickhouse" && d.protocol === "https") + // ? false + // : "Jitsu can query either provisioned ClickHouse, or ClickHouse connected via HTTPS protocol"; + // }, + // }, ], filter: (obj: DestinationConfig) => !obj.provisioned, listColumns: [ diff --git a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx index 4ec0c4c00..da42a8e37 100644 --- a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx @@ -321,80 +321,84 @@ function Tasks() { return ( <> {contextHolder} - - - Syncs: - { - patchQueryStringState("status", e); - }} - options={[ - { value: "all", label: "All" }, - { - value: "FAILED", - label: ( -
- FAILED -
- ), - }, - { - value: "SUCCESS", - label: ( -
- SUCCESS -
- ), - }, - { - value: "RUNNING", - label: ( -
- RUNNING -
- ), - }, - ]} - /> - - - Date range: - (d ? dayjs(d, "YYYY-MM-DD") : null)).slice(0, 2) as [ - Dayjs | null, - Dayjs | null - ] - } - allowEmpty={[true, true]} - onChange={d => { - if (d) { - const dates = [d[0] ? d[0].format("YYYY-MM-DD") : null, d[1] ? d[1].format("YYYY-MM-DD") : null]; - if (dates[0] === null && dates[1] === null) { - patchQueryStringState("dates", null); - } else { - patchQueryStringState("dates", dates); + + + +
+ Syncs: + { + patchQueryStringState("status", e); + }} + options={[ + { value: "all", label: "All" }, + { + value: "FAILED", + label: ( +
+ FAILED +
+ ), + }, + { + value: "SUCCESS", + label: ( +
+ SUCCESS +
+ ), + }, + { + value: "RUNNING", + label: ( +
+ RUNNING +
+ ), + }, + ]} + /> +
+
+ Date range: + (d ? dayjs(d, "YYYY-MM-DD") : null)).slice(0, 2) as [ + Dayjs | null, + Dayjs | null + ] } - } else { - patchQueryStringState("dates", null); - } - }} - /> + allowEmpty={[true, true]} + onChange={d => { + if (d) { + const dates = [d[0] ? d[0].format("YYYY-MM-DD") : null, d[1] ? d[1].format("YYYY-MM-DD") : null]; + if (dates[0] === null && dates[1] === null) { + patchQueryStringState("dates", null); + } else { + patchQueryStringState("dates", dates); + } + } else { + patchQueryStringState("dates", null); + } + }} + /> +
+
Date: Tue, 4 Jul 2023 17:23:36 +0400 Subject: [PATCH 0016/1353] Added oauth support for Github Service --- .../ServiceEditor/ServiceEditor.tsx | 114 +++++++++++++---- webapps/console/lib/schema/index.ts | 1 + webapps/console/lib/server/oauth/services.ts | 116 ++++++++++++++++++ webapps/console/lib/server/oauth/services.tsx | 68 ---------- webapps/console/pages/admin/oauth-test.tsx | 4 +- .../pages/api/[workspaceId]/sources/check.ts | 6 +- .../api/[workspaceId]/sources/discover.ts | 5 +- .../pages/api/[workspaceId]/sources/run.ts | 6 +- .../console/pages/api/oauth/[serviceId].ts | 72 ----------- webapps/console/pages/api/oauth/catalog.ts | 4 +- webapps/console/pages/api/oauth/service.ts | 74 +++++++++++ 11 files changed, 295 insertions(+), 175 deletions(-) create mode 100644 webapps/console/lib/server/oauth/services.ts delete mode 100644 webapps/console/lib/server/oauth/services.tsx delete mode 100644 webapps/console/pages/api/oauth/[serviceId].ts create mode 100644 webapps/console/pages/api/oauth/service.ts diff --git a/webapps/console/components/ServiceEditor/ServiceEditor.tsx b/webapps/console/components/ServiceEditor/ServiceEditor.tsx index e81bf937b..eaf37d5ec 100644 --- a/webapps/console/components/ServiceEditor/ServiceEditor.tsx +++ b/webapps/console/components/ServiceEditor/ServiceEditor.tsx @@ -1,6 +1,6 @@ import { EditorComponentProps } from "../ConfigObjectEditor/ConfigEditor"; import React, { useCallback, useEffect, useState } from "react"; -import { getLog, rpc } from "juava"; +import { getErrorMessage, getLog, rpc } from "juava"; import { EditorTitle } from "../ConfigObjectEditor/EditorTitle"; import { EditorBase } from "../ConfigObjectEditor/EditorBase"; import { LoadingAnimation } from "../GlobalLoader/GlobalLoader"; @@ -8,12 +8,15 @@ import { EditorField } from "../ConfigObjectEditor/EditorField"; import { TextEditor } from "../ConnectionEditorPage/ConnectionEditorPage"; import { ServiceConfig } from "../../lib/schema"; import { Button, Select } from "antd"; -import { SnippedEditor } from "../CodeEditor/SnippedEditor"; import { EditorButtons } from "../ConfigObjectEditor/EditorButtons"; import { getConfigApi } from "../../lib/useApi"; import { feedbackError } from "../../lib/ui"; -import { useWorkspace } from "../../lib/context"; +import { useAppConfig, useWorkspace } from "../../lib/context"; import { useRouter } from "next/router"; +import { JitsuButton } from "../JitsuButton/JitsuButton"; +import Nango from "@nangohq/frontend"; +import { oauthDecorators } from "../../lib/server/oauth/services"; +import { CodeEditor } from "../CodeEditor/CodeEditor"; const log = getLog("ServiceEditor"); @@ -30,6 +33,7 @@ const VersionSelector: React.FC<{ versions: string[]; onChange: (v: string) => v export const ServiceEditor: React.FC = props => { const { object, meta, createNew, onCancel, onDelete, onTest, isNew, noun, loadMeta } = props; + const appConfig = useAppConfig(); const workspace = useWorkspace(); const { push } = useRouter(); const [obj, setObj] = useState>({ @@ -38,10 +42,14 @@ export const ServiceEditor: React.FC = props => { const [formState, setFormState] = useState(undefined); const isTouched = formState !== undefined || !!createNew; const [loading, setLoading] = useState(false); + const [nangoLoading, setNangoLoading] = useState(false); + const [nangoError, setNangoError] = useState(undefined); const [credUserProvided, setCredUserProvided] = useState(!!obj.credentials && obj.credentials !== "{}"); const [loadingSpecs, setLoadingSpecs] = useState(false); const [specs, setSpecs] = useState(undefined); + const oauthConnector = oauthDecorators.find(d => d.packageId === obj.package); + const change = useCallback( (key: string, value: any) => { setObj({ @@ -150,29 +158,85 @@ export const ServiceEditor: React.FC = props => { {loadingSpecs ? ( ) : ( -
-
- +
+ {oauthConnector && ( +
+
+ { + const nango = new Nango({ publicKey: appConfig.nango!.publicKey, host: appConfig.nango!.host }); + setNangoLoading(true); + nango + .auth(oauthConnector.nangoIntegrationId ?? "", `sync-source.${obj?.id}`) + .then(result => { + const strippedSchema = JSON.stringify( + oauthConnector.stripSchema(JSON.parse(obj?.credentials ?? "{}")), + null, + 4 + ); + setObj({ ...obj, credentials: strippedSchema, authorized: true }); + setNangoError(undefined); + }) + .catch(err => { + setNangoError(getErrorMessage(err)); + getLog().atError().log("Failed to add oauth connection", err); + change.bind(null, "authorized")(false); + }) + .finally(() => setNangoLoading(false)); + }} + icon={ + {obj?.package} + } + > + {obj?.authorized ? "Re-Sign In" : "Authorize"} + +
+ + {nangoError ? ( + OAuth2 error: ${nangoError} + ) : obj?.authorized ? ( + "" + ) : ( + `Click "Authorize" to open OAuth2.0 authorization popup` + )} + +
+ )} +
+
+ +
+
+ { + change.bind(null, "credentials")(v); + setCredUserProvided(true); + }} + language={"json"} + height={"206px"} + /> +
- { - change.bind(null, "credentials")(v); - setCredUserProvided(true); - }} - languages={["json"]} - height={206} - />
)} diff --git a/webapps/console/lib/schema/index.ts b/webapps/console/lib/schema/index.ts index 8cdf86df1..c6ddaccf7 100644 --- a/webapps/console/lib/schema/index.ts +++ b/webapps/console/lib/schema/index.ts @@ -128,6 +128,7 @@ export const ServiceConfig = ConfigEntityBase.merge( z.object({ name: z.string().min(5), protocol: z.enum(["airbyte"]).default("airbyte"), + authorized: z.boolean().optional(), package: z.string(), version: z.string(), credentials: z.string(), diff --git a/webapps/console/lib/server/oauth/services.ts b/webapps/console/lib/server/oauth/services.ts new file mode 100644 index 000000000..9a8f69f70 --- /dev/null +++ b/webapps/console/lib/server/oauth/services.ts @@ -0,0 +1,116 @@ +import { ServiceConfig } from "../../schema"; +import { rpc } from "juava"; +import { getAppEndpoint } from "../../domains"; +import { NextApiRequest } from "next"; + +export type PackageId = `airbyte/${string}`; +/** + * Decorates services with OAuth authentication + */ + +export const JITSU_MANAGED = "JITSU_MANAGED"; + +// If service supports Jitsu OAuth - returns decorated credentials part of service config +// otherwise returns original credentials part of config +export const tryManageOauthCreds = async (service: ServiceConfig, req: NextApiRequest): Promise => { + const oauthConnector = oauthDecorators.find(d => d.packageId === service.package); + if (oauthConnector && service.authorized) { + return await rpc( + `${getAppEndpoint(req).baseUrl}/api/oauth/service?package=${service.package}&serviceId=${service.id}`, + { + headers: { + Authorization: req.headers.authorization ?? "", + Cookie: req.headers.cookie ?? "", + }, + body: service.credentials, + } + ); + } else { + return JSON.parse(service.credentials); + } +}; + +function manage(original: string, provided: string) { + if (original === JITSU_MANAGED) { + return provided; + } else { + return original; + } +} + +export type OptionsObject = Record; + +export type OauthDecorator = { + /** + * ID of the package. Same as ConnectorPackage.packageId + */ + packageId: PackageId; + /** + * Type of the package. Same as ConnectorPackage.packageType + */ + packageType: "airbyte"; + + /** + * Provider id for nango (github, googlesheets, etc). See https://github.com/NangoHQ/nango/blob/master/packages/shared/providers.yaml + */ + nangoProvider: string; + + /** + * Integration id for nango. If not set, `jitsu-cloud-sync-${nangoProvider}` + */ + nangoIntegrationId?: string; + + /** + * @param original connector config, as defined by airbyte + * @param integrationObj nango integration object, it usually contains client id and secret, sometimes scopes + * @param connectionObj connection object, containing auth and refresh tokens + */ + merge: (opts: OptionsObject, integrationObj: OptionsObject, connectionObj: OptionsObject) => OptionsObject; + + /** + * Removes credentials fields from schema + * @param schema + */ + stripSchema: (schema: any) => any; +}; + +function fillDefaults(dec: OauthDecorator): Required { + return { + nangoIntegrationId: `jitsu-cloud-sync-${dec.nangoProvider}`, + ...dec, + }; +} + +export const github: OauthDecorator = { + stripSchema: (schema: any) => { + return { + ...schema, + credentials: { + access_token: JITSU_MANAGED, + client_id: JITSU_MANAGED, + client_secret: JITSU_MANAGED, + option_title: "OAuth Credentials", + }, + }; + }, + packageId: "airbyte/source-github", + packageType: "airbyte", + nangoProvider: "github", + merge: (opts, integrationObj, connectionObj) => { + const mCred = { ...opts.credentials }; + if (mCred.option_title === "OAuth Credentials") { + mCred.access_token = manage(mCred.access_token, connectionObj.access_token); + mCred.client_id = manage(mCred.client_id, integrationObj.clientId); + mCred.client_secret = manage(mCred.client_secret, integrationObj.clientSecret); + } + return { + ...opts, + credentials: { + ...opts.credentials, + ...mCred, + }, + }; + }, +}; + +export const oauthDecorators = [github].map(fillDefaults); diff --git a/webapps/console/lib/server/oauth/services.tsx b/webapps/console/lib/server/oauth/services.tsx deleted file mode 100644 index 474fc3ffc..000000000 --- a/webapps/console/lib/server/oauth/services.tsx +++ /dev/null @@ -1,68 +0,0 @@ -export type PackageId = `airbyte/${string}`; -/** - * Decorates services with OAuth authentication - */ - -export type OptionsObject = Record; - -export type OauthDecorator = { - /** - * ID of the package. Same as ConnectorPackage.packageId - */ - packageId: PackageId; - /** - * Type of the package. Same as ConnectorPackage.packageType - */ - packageType: "airbyte"; - - /** - * Provider id for nango (github, googlesheets, etc). See https://github.com/NangoHQ/nango/blob/master/packages/shared/providers.yaml - */ - nangoProvider: string; - - /** - * Integration id for nango. If not set, `jitsu-cloud-sync-${nangoProvider}` - */ - nangoIntegrationId?: string; - - /** - * @param original connector config, as defined by airbyte - * @param integrationObj nango integration object, it usually contains client id and secret, sometimes scopes - * @param connectionObj connection object, containing auth and refresh tokens - */ - merge: (opts: OptionsObject, integrationObj: OptionsObject, connectionObj: OptionsObject) => OptionsObject; - - /** - * Removes credentials fields from schema - * @param schema - */ - stripSchema(schema: any): any; -}; - -export function fillDefaults(dec: OauthDecorator): Required { - return { - nangoIntegrationId: `jitsu-cloud-sync-${dec.nangoProvider}`, - ...dec, - }; -} - -export const github: OauthDecorator = { - stripSchema(schema: any): any { - return schema; - }, - packageId: "airbyte/source-github", - packageType: "airbyte", - nangoProvider: "github", - merge: (opts, integrationObj, connectionObj) => { - return { - ...opts, - ...integrationObj, - credentials: { - access_token: connectionObj.access_token, - option_title: "OAuth Credentials", - }, - }; - }, -}; - -export const oauthDecorators = [github]; diff --git a/webapps/console/pages/admin/oauth-test.tsx b/webapps/console/pages/admin/oauth-test.tsx index 1fd478ec5..c86cfdb44 100644 --- a/webapps/console/pages/admin/oauth-test.tsx +++ b/webapps/console/pages/admin/oauth-test.tsx @@ -80,7 +80,9 @@ const CatalogView: React.FC<{ connectors: OauthService[]; appConfig: AppConfig } setRetrieving(true); try { const result = await rpc( - `/api/oauth/${retrievedForService}` + (integrationId ? `?integrationId=${integrationId}` : "") + `/api/oauth/service?serviceId=${retrievedForService}` + + (integrationId ? `&integrationId=${integrationId}` : ""), + { method: "POST" } ); setCredentials(result); setRetrievingError(undefined); diff --git a/webapps/console/pages/api/[workspaceId]/sources/check.ts b/webapps/console/pages/api/[workspaceId]/sources/check.ts index 0331886f1..74593f019 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/check.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/check.ts @@ -3,6 +3,7 @@ import { z } from "zod"; import { createRoute, verifyAccess } from "../../../../lib/api"; import { ServiceConfig } from "../../../../lib/schema"; import { randomId, requireDefined, rpc } from "juava"; +import { tryManageOauthCreds } from "../../../../lib/server/oauth/services"; const resultType = z.object({ ok: z.boolean(), @@ -20,10 +21,9 @@ export default createRoute() body: ServiceConfig, result: resultType, }) - .handler(async ({ user, query, body }) => { + .handler(async ({ user, query, body, req }) => { const { workspaceId } = query; await verifyAccess(user, workspaceId); - const syncURL = requireDefined( process.env.SYNCCTL_URL, `env SYNCCTL_URL is not set. Sync Controller is required to run sources` @@ -38,7 +38,7 @@ export default createRoute() const checkRes = await rpc(syncURL + "/check", { method: "POST", body: { - config: JSON.parse(body.credentials), + config: await tryManageOauthCreds(body as ServiceConfig, req), }, headers: { "Content-Type": "application/json", diff --git a/webapps/console/pages/api/[workspaceId]/sources/discover.ts b/webapps/console/pages/api/[workspaceId]/sources/discover.ts index 866044b4e..5ac5c7527 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/discover.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/discover.ts @@ -3,6 +3,7 @@ import { z } from "zod"; import { createRoute, verifyAccess } from "../../../../lib/api"; import { ServiceConfig } from "../../../../lib/schema"; import { randomId, requireDefined, rpc } from "juava"; +import { tryManageOauthCreds } from "../../../../lib/server/oauth/services"; const resultType = z.object({ ok: z.boolean(), @@ -31,7 +32,7 @@ export default createRoute() body: ServiceConfig, result: resultType, }) - .handler(async ({ user, query, body }) => { + .handler(async ({ user, query, body, req }) => { const { workspaceId } = query; await verifyAccess(user, workspaceId); @@ -55,7 +56,7 @@ export default createRoute() const checkRes = await rpc(syncURL + "/discover", { method: "POST", body: { - config: JSON.parse(body.credentials), + config: await tryManageOauthCreds(body as ServiceConfig, req), }, headers: { "Content-Type": "application/json", diff --git a/webapps/console/pages/api/[workspaceId]/sources/run.ts b/webapps/console/pages/api/[workspaceId]/sources/run.ts index 7ebeade87..5c118f657 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/run.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/run.ts @@ -3,6 +3,8 @@ import { z } from "zod"; import { createRoute, verifyAccess } from "../../../../lib/api"; import { randomId, requireDefined, rpc } from "juava"; import { randomUUID } from "crypto"; +import { tryManageOauthCreds } from "../../../../lib/server/oauth/services"; +import { ServiceConfig } from "../../../../lib/schema"; const resultType = z.object({ ok: z.boolean(), @@ -19,7 +21,7 @@ export default createRoute() }), result: resultType, }) - .handler(async ({ user, query }) => { + .handler(async ({ user, query, req }) => { const { workspaceId } = query; await verifyAccess(user, workspaceId); const syncURL = requireDefined( @@ -87,7 +89,7 @@ export default createRoute() syncId: query.syncId, }, body: { - config: JSON.parse((service.config as any).credentials), + config: await tryManageOauthCreds({ ...(service.config as ServiceConfig), id: sync.fromId }, req), catalog: JSON.parse((sync.data as any).streams), ...(stateObj ? { state: stateObj.state } : {}), }, diff --git a/webapps/console/pages/api/oauth/[serviceId].ts b/webapps/console/pages/api/oauth/[serviceId].ts deleted file mode 100644 index 8d956d8c9..000000000 --- a/webapps/console/pages/api/oauth/[serviceId].ts +++ /dev/null @@ -1,72 +0,0 @@ -import { createRoute, verifyAccess } from "../../../lib/api"; -import { db } from "../../../lib/server/db"; -import { z } from "zod"; -import { getLog, requireDefined, rpc } from "juava"; -import { nangoConfig } from "../../../lib/server/oauth/nango-config"; -import { fillDefaults, OauthDecorator, oauthDecorators } from "../../../lib/server/oauth/services"; - -export default createRoute() - .GET({ - auth: true, - query: z.object({ - serviceId: z.string(), - integrationId: z.string().optional(), - }), - }) - .handler(async ({ req, query, user }) => { - const object = await db.prisma().configurationObject.findFirst({ - where: { id: query.serviceId, deleted: false }, - }); - - let credentials: any; - let integrationId: string | undefined; - let oauthDecorator: OauthDecorator; - - if (object) { - await verifyAccess(user, object.workspaceId); - credentials = { - id: object.id, - workspaceId: object.workspaceId, - ...(object.config || ({} as any)), - }; - const packageId = (object.config as any).packageId; - oauthDecorator = requireDefined( - oauthDecorators.map(fillDefaults).find(d => d.packageId === packageId), - `Package ${packageId} for service ${query.serviceId} not found in catalog` - ); - integrationId = oauthDecorator.nangoIntegrationId; - } else { - const userProfile = await db.prisma().userProfile.findFirst({ where: { id: user.internalId } }); - integrationId = requireDefined( - query.integrationId, - `integrationId is required if service (${query.serviceId}) is not found ` - ); - oauthDecorator = requireDefined( - oauthDecorators.map(fillDefaults).find(d => d.nangoIntegrationId === integrationId), - `Integration ${integrationId} not found in catalog` - ); - if (!userProfile || !userProfile.admin) { - throw new Error(`Access denied`); - } - credentials = { - warning: `Service ${query.serviceId} not found in database`, - }; - } - // this code doesn't work because nango doesn't return secrets - // const integrationSettings = await rpc(`${nangoConfig.nangoApiHost}/config/${integrationId}`, { - // headers: { Authorization: `Bearer ${nangoConfig.secretKey}` }, - // }); - const integrationSettings = {}; //todo - pull secrets from OauthSecrets table - const nangoConnectionObject = await rpc( - `${nangoConfig.nangoApiHost}/connection/sync-source.${query.serviceId}?provider_config_key=${integrationId}`, - { headers: { Authorization: `Bearer ${nangoConfig.secretKey}` } } - ); - - getLog().atInfo().log("Integration settings", JSON.stringify(integrationSettings, null, 2)); - getLog().atInfo().log("Configuration object", JSON.stringify(nangoConnectionObject, null, 2)); - - return { - credentials: oauthDecorator.merge(credentials, integrationSettings, nangoConnectionObject.credentials), - }; - }) - .toNextApiHandler(); diff --git a/webapps/console/pages/api/oauth/catalog.ts b/webapps/console/pages/api/oauth/catalog.ts index 69bf62893..7b7c2d599 100644 --- a/webapps/console/pages/api/oauth/catalog.ts +++ b/webapps/console/pages/api/oauth/catalog.ts @@ -1,10 +1,10 @@ import { createRoute } from "../../../lib/api"; -import { fillDefaults, oauthDecorators } from "../../../lib/server/oauth/services"; +import { oauthDecorators } from "../../../lib/server/oauth/services"; import omit from "lodash/omit"; export default createRoute() .GET({ auth: true }) .handler(async ({ res }) => { - return { decorators: oauthDecorators.map(fillDefaults).map(s => omit(s, "merge")) }; + return { decorators: oauthDecorators.map(s => omit(s, "merge")) }; }) .toNextApiHandler(); diff --git a/webapps/console/pages/api/oauth/service.ts b/webapps/console/pages/api/oauth/service.ts new file mode 100644 index 000000000..6180562cb --- /dev/null +++ b/webapps/console/pages/api/oauth/service.ts @@ -0,0 +1,74 @@ +import { createRoute, verifyAccess } from "../../../lib/api"; +import { db } from "../../../lib/server/db"; +import { z } from "zod"; +import { assertDefined, getLog, requireDefined, rpc } from "juava"; +import { nangoConfig } from "../../../lib/server/oauth/nango-config"; +import { OauthDecorator, oauthDecorators } from "../../../lib/server/oauth/services"; + +export default createRoute() + .POST({ + auth: true, + body: z.string().optional(), + query: z.object({ + serviceId: z.string().optional(), + package: z.string().optional(), + integrationId: z.string().optional(), + }), + }) + .handler(async ({ req, query, user, body }) => { + let credentials: any; + let integrationId: string | undefined; + let oauthDecorator: OauthDecorator; + + // we need that because we work with unsaved objects (new or edited) - body represents credentials from the form + if (body) { + credentials = JSON.parse(body); + oauthDecorator = requireDefined( + oauthDecorators.find(d => d.packageId === query.package), + `Package ${query.package} for service ${query.serviceId} not found in catalog` + ); + integrationId = oauthDecorator.nangoIntegrationId; + } else if (query.serviceId) { + const object = await db.prisma().configurationObject.findFirst({ + where: { id: query.serviceId, deleted: false }, + }); + assertDefined(object, `Service ${query.serviceId} not found in database`); + await verifyAccess(user, object.workspaceId); + credentials = JSON.parse((object.config as any).credentials); + const packageId = (object.config as any).package; + oauthDecorator = requireDefined( + oauthDecorators.find(d => d.packageId === packageId), + `Package ${packageId} for service ${query.serviceId} not found in catalog` + ); + integrationId = oauthDecorator.nangoIntegrationId; + } else { + const userProfile = await db.prisma().userProfile.findFirst({ where: { id: user.internalId } }); + integrationId = requireDefined( + query.integrationId, + `integrationId is required if service (${query.serviceId}) is not found ` + ); + oauthDecorator = requireDefined( + oauthDecorators.find(d => d.nangoIntegrationId === integrationId), + `Integration ${integrationId} not found in catalog` + ); + if (!userProfile || !userProfile.admin) { + throw new Error(`Access denied`); + } + credentials = { + warning: `Service ${query.serviceId} not found in database`, + }; + } + const integrationSettings = await rpc(`${nangoConfig.nangoApiHost}/config/${integrationId}?include_creds=true`, { + headers: { Authorization: `Bearer ${nangoConfig.secretKey}` }, + }); + const nangoConnectionObject = await rpc( + `${nangoConfig.nangoApiHost}/connection/sync-source.${query.serviceId}?provider_config_key=${integrationId}`, + { headers: { Authorization: `Bearer ${nangoConfig.secretKey}` } } + ); + + getLog().atDebug().log("Integration settings", JSON.stringify(integrationSettings, null, 2)); + getLog().atDebug().log("Configuration object", JSON.stringify(nangoConnectionObject, null, 2)); + + return oauthDecorator.merge(credentials, integrationSettings.config?.configRes, nangoConnectionObject.credentials); + }) + .toNextApiHandler(); From 4781bfde0141bdeb56743b829ae17cc6eb2f70e2 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 4 Jul 2023 17:42:27 +0400 Subject: [PATCH 0017/1353] small tweaks --- .../components/DataView/EventsBrowser.tsx | 18 +++++++++--------- .../components/ServiceEditor/ServiceEditor.tsx | 2 +- .../pages/[workspaceId]/syncs/tasks.tsx | 18 +++++++++--------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/webapps/console/components/DataView/EventsBrowser.tsx b/webapps/console/components/DataView/EventsBrowser.tsx index 789376c82..47d89a215 100644 --- a/webapps/console/components/DataView/EventsBrowser.tsx +++ b/webapps/console/components/DataView/EventsBrowser.tsx @@ -3,7 +3,7 @@ import utc from "dayjs/plugin/utc"; import relativeTime from "dayjs/plugin/relativeTime"; import { EventsLogRecord } from "../../lib/server/events-log"; import { ColumnsType } from "antd/es/table"; -import { Alert, Col, Collapse, DatePicker, Row, Select, Space, Spin, Table, Tag, Tooltip } from "antd"; +import { Alert, Collapse, DatePicker, Select, Space, Spin, Table, Tag, Tooltip } from "antd"; import { TableWithDrawer } from "./TableWithDrawer"; import { JSONView } from "./JSONView"; import { useAppConfig, useWorkspace } from "../../lib/context"; @@ -298,9 +298,9 @@ export const EventsBrowser = ({ })(); return ( <> - -
- +
+
+
{entityType == "stream" ? "Sites: " : "Connection: "}
- - -
+ + +
} type="link" @@ -419,8 +419,8 @@ function Tasks() { > Back - - +
+ {error ? ( ) : ( From 7332bbd74f677beea473a50e6f9f15c0669c9219 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 5 Jul 2023 12:01:46 +0400 Subject: [PATCH 0018/1353] visual tweaks --- .../components/ButtonLabel/ButtonLabel.tsx | 11 ++--- .../ServiceEditor/ServiceEditor.tsx | 21 +++++++-- .../ServicesCatalog/ServicesCatalog.tsx | 47 ++++++++++--------- 3 files changed, 47 insertions(+), 32 deletions(-) diff --git a/webapps/console/components/ButtonLabel/ButtonLabel.tsx b/webapps/console/components/ButtonLabel/ButtonLabel.tsx index 1f5a37360..f20ccaed7 100644 --- a/webapps/console/components/ButtonLabel/ButtonLabel.tsx +++ b/webapps/console/components/ButtonLabel/ButtonLabel.tsx @@ -15,15 +15,12 @@ export const ButtonLabel: React.FC = ({ iconPosition = "left", className, }) => { - if (loading) { - return <>{children}; - } return ( -
-
- {iconPosition === "left" && {icon}} +
+
+ {iconPosition === "left" && !loading && {icon}} {children && {children}} - {iconPosition === "right" && {icon}} + {iconPosition === "right" && !loading && {icon}}
); diff --git a/webapps/console/components/ServiceEditor/ServiceEditor.tsx b/webapps/console/components/ServiceEditor/ServiceEditor.tsx index d4ef215c4..008d1d240 100644 --- a/webapps/console/components/ServiceEditor/ServiceEditor.tsx +++ b/webapps/console/components/ServiceEditor/ServiceEditor.tsx @@ -17,6 +17,7 @@ import { JitsuButton } from "../JitsuButton/JitsuButton"; import Nango from "@nangohq/frontend"; import { oauthDecorators } from "../../lib/server/oauth/services"; import { CodeEditor } from "../CodeEditor/CodeEditor"; +import { CheckCircleTwoTone, InfoCircleTwoTone } from "@ant-design/icons"; const log = getLog("ServiceEditor"); @@ -160,7 +161,7 @@ export const ServiceEditor: React.FC = props => { ) : (
{oauthConnector && ( -
+
= props => { {nangoError ? ( OAuth2 error: ${nangoError} ) : obj?.authorized ? ( - "Authorized." +
+ + Authorized +
) : ( - `Click "Authorize" to open OAuth2.0 authorization popup` +
+ + Click "Authorize" to open OAuth2.0 authorization popup +
)}
diff --git a/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx b/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx index aba05a6b8..3acb9438d 100644 --- a/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx +++ b/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx @@ -76,30 +76,33 @@ export const ServicesCatalog: React.FC<{ onClick: (packageType, packageId: strin className="w-full border border-textDisabled rounded-lg px-4 py-4" />
- {Object.entries(groups).map(([group, sources]) => ( -
-
{group === "api" ? "API" : capitalize(group)}
-
- {sources.map(source => { - if (!source.meta.name.toLowerCase().includes(filter.toLowerCase())) { - return null; - } - return ( -
onClick(source.packageType, source.packageId)} - > -
{getDestinationIcon(source)}
-
-
{source.meta.name}
+ {Object.entries(groups).map(([group, sources]) => { + const filtered = sources.filter(source => source.meta.name.toLowerCase().includes(filter.toLowerCase())); + if (filtered.length === 0) { + return null; + } + return ( +
+
{group === "api" ? "API" : capitalize(group)}
+
+ {filtered.map(source => { + return ( +
onClick(source.packageType, source.packageId)} + > +
{getDestinationIcon(source)}
+
+
{source.meta.name}
+
-
- ); - })} + ); + })} +
-
- ))} + ); + })}
); }; From da3d3e0b1f6be4c085ea214a8cbe4663c66998d5 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 5 Jul 2023 18:08:33 +0400 Subject: [PATCH 0019/1353] Added OAuth for services: GA, GA4, Google Ads, Sheets, FB Marketing. Tweaks --- .../ConfigObjectEditor/ConfigEditor.tsx | 5 +- .../ConnectionEditorPage.tsx | 2 +- .../components/DataView/EventsBrowser.tsx | 1 + .../ServiceEditor/ServiceEditor.tsx | 25 ++-- .../SyncEditorPage/SyncEditorPage.tsx | 2 +- webapps/console/lib/server/oauth/services.ts | 117 +++++++++++++++++- .../pages/[workspaceId]/syncs/index.tsx | 2 +- .../pages/[workspaceId]/syncs/tasks.tsx | 1 + .../api/[workspaceId]/config/[type]/index.ts | 3 +- .../pages/api/[workspaceId]/sources/check.ts | 4 +- webapps/console/pages/api/oauth/service.ts | 6 +- 11 files changed, 141 insertions(+), 27 deletions(-) diff --git a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx index 1480ffdf8..227f22609 100644 --- a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx +++ b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx @@ -4,7 +4,7 @@ import { FaCaretDown, FaCaretRight, FaClone, FaPlus } from "react-icons/fa"; import { ZodType } from "zod"; import { getConfigApi, useApi } from "../../lib/useApi"; import { useRouter } from "next/router"; -import { asFunction, FunctionLike, getErrorMessage, getLog, randomId, requireDefined } from "juava"; +import { asFunction, FunctionLike, getErrorMessage, getLog, requireDefined } from "juava"; import zodToJsonSchema from "zod-to-json-schema"; @@ -43,6 +43,7 @@ import { EditorBase } from "./EditorBase"; import { EditorField } from "./EditorField"; import { EditorButtons } from "./EditorButtons"; import { ButtonGroup, ButtonProps } from "../ButtonGroup/ButtonGroup"; +import cuid from "cuid"; const log = getLog("ConfigEditor"); @@ -365,7 +366,7 @@ const SingleObjectEditor: React.FC = props => { return ; } const object = otherProps.object || { - id: randomId(), + id: cuid(), workspaceId: workspace.id, type: type, ...newObject(meta), diff --git a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx index b4bc94110..97fce517c 100644 --- a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx +++ b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx @@ -37,7 +37,7 @@ function DestinationSelector(props: SelectorProps) { return (
- {props.items.map(destination => { const destinationType = getCoreDestinationType(destination.destinationType); return ( diff --git a/webapps/console/components/DataView/EventsBrowser.tsx b/webapps/console/components/DataView/EventsBrowser.tsx index 47d89a215..65c7cc1f7 100644 --- a/webapps/console/components/DataView/EventsBrowser.tsx +++ b/webapps/console/components/DataView/EventsBrowser.tsx @@ -304,6 +304,7 @@ export const EventsBrowser = ({
{entityType == "stream" ? "Sites: " : "Connection: "} + Project doesn't have configured Syncs
} style={{ width: 300 }} loading={linksLoading} diff --git a/webapps/console/pages/api/[workspaceId]/config/[type]/index.ts b/webapps/console/pages/api/[workspaceId]/config/[type]/index.ts index c9cb97fb6..1db413625 100644 --- a/webapps/console/pages/api/[workspaceId]/config/[type]/index.ts +++ b/webapps/console/pages/api/[workspaceId]/config/[type]/index.ts @@ -42,10 +42,11 @@ export const api: Api = { await verifyAccess(user, workspaceId); const configObjectTypes = getConfigObjectType(type); const object = await configObjectTypes.inputFilter(parseObject(type, body), "create"); + const id = object.id; delete object.id; delete object.workspaceId; const created = await db.prisma().configurationObject.create({ - data: { workspaceId: workspaceId, config: object, type }, + data: { id, workspaceId: workspaceId, config: object, type }, }); await fastStore.fullRefresh(); return { id: created.id }; diff --git a/webapps/console/pages/api/[workspaceId]/sources/check.ts b/webapps/console/pages/api/[workspaceId]/sources/check.ts index 74593f019..5bb9cc32b 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/check.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/check.ts @@ -34,11 +34,13 @@ export default createRoute() authHeaders["Authorization"] = `Bearer ${syncAuthKey}`; } + const config = await tryManageOauthCreds(body as ServiceConfig, req); + try { const checkRes = await rpc(syncURL + "/check", { method: "POST", body: { - config: await tryManageOauthCreds(body as ServiceConfig, req), + config: config, }, headers: { "Content-Type": "application/json", diff --git a/webapps/console/pages/api/oauth/service.ts b/webapps/console/pages/api/oauth/service.ts index 6180562cb..a4e404d9a 100644 --- a/webapps/console/pages/api/oauth/service.ts +++ b/webapps/console/pages/api/oauth/service.ts @@ -62,12 +62,12 @@ export default createRoute() headers: { Authorization: `Bearer ${nangoConfig.secretKey}` }, }); const nangoConnectionObject = await rpc( - `${nangoConfig.nangoApiHost}/connection/sync-source.${query.serviceId}?provider_config_key=${integrationId}`, + `${nangoConfig.nangoApiHost}/connection/sync-source.${query.serviceId}?provider_config_key=${integrationId}&refresh_token=true`, { headers: { Authorization: `Bearer ${nangoConfig.secretKey}` } } ); - getLog().atDebug().log("Integration settings", JSON.stringify(integrationSettings, null, 2)); - getLog().atDebug().log("Configuration object", JSON.stringify(nangoConnectionObject, null, 2)); + getLog().atInfo().log("Integration settings", JSON.stringify(integrationSettings, null, 2)); + getLog().atInfo().log("Configuration object", JSON.stringify(nangoConnectionObject, null, 2)); return oauthDecorator.merge(credentials, integrationSettings.config?.configRes, nangoConnectionObject.credentials); }) From c8ca0f7518c58821c1f2156d56454a7301f48939 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Wed, 5 Jul 2023 11:29:51 -0400 Subject: [PATCH 0020/1353] fix: visual layout --- webapps/console/lib/ui.tsx | 5 +- .../pages/[workspaceId]/syncs/index.tsx | 43 ++++++---- .../pages/[workspaceId]/syncs/logs.tsx | 84 +++++++++++-------- 3 files changed, 79 insertions(+), 53 deletions(-) diff --git a/webapps/console/lib/ui.tsx b/webapps/console/lib/ui.tsx index 0326aa336..c090a3cde 100644 --- a/webapps/console/lib/ui.tsx +++ b/webapps/console/lib/ui.tsx @@ -6,6 +6,7 @@ import { ErrorDetails } from "../components/GlobalError/GlobalError"; import { getAntdModal } from "./modal"; import * as _useTitle from "react-use/lib/useTitle"; +import { NotificationPlacement } from "antd/es/notification/interface"; export type KeyboardKey = "Escape" | "Enter"; @@ -113,10 +114,10 @@ export function feedbackSuccess(message: ReactNode) { }); } -export function feedbackError(message: ReactNode, opts?: { error?: any }) { +export function feedbackError(message: ReactNode, opts?: { error?: any; placement?: NotificationPlacement }) { notification.error({ message: message, - placement: "bottomRight", + placement: opts?.placement || "bottomRight", description: opts?.error ? ( <>
({ loading: true }); + const [running, setRunning] = useState(undefined); //useEffect update tasksData every 5 seconds useEffect(() => { @@ -227,22 +228,34 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt const t = tasks?.data?.tasks?.[link.id]; const items: ButtonProps[] = [ { - disabled: t?.status === "RUNNING", + disabled: t?.status === "RUNNING" || !!running, title: t?.status === "RUNNING" ? "Sync is already running" : undefined, - icon: , + icon: + running == link.id ? ( + + ) : ( + + ), onClick: async () => { - const runStatus = await rpc(`/api/${workspace.id}/sources/run?syncId=${link.id}`); - if (runStatus?.error) { - feedbackError(`Failed to run sync: ${runStatus.error}`); - } else { - router.push( - `/${workspace.slug || workspace.id}/syncs/tasks?query=${encodeURIComponent( - JSON5.stringify({ - syncId: link.id, - notification: "Sync Started", - }) - )}` - ); + setRunning(link.id); + try { + const runStatus = await rpc(`/api/${workspace.id}/sources/run?syncId=${link.id}`); + if (runStatus?.error) { + feedbackError(`Failed to run sync: ${runStatus.error}`); + } else { + router.push( + `/${workspace.slug || workspace.id}/syncs/tasks?query=${encodeURIComponent( + JSON5.stringify({ + syncId: link.id, + notification: "Sync Started", + }) + )}` + ); + } + } catch (e) { + feedbackError("Failed to run sync", { error: e, placement: "top" }); + } finally { + setRunning(undefined); } }, label: "Run", diff --git a/webapps/console/pages/[workspaceId]/syncs/logs.tsx b/webapps/console/pages/[workspaceId]/syncs/logs.tsx index 90d057fa2..5f24b6fdf 100644 --- a/webapps/console/pages/[workspaceId]/syncs/logs.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/logs.tsx @@ -1,26 +1,14 @@ import { WorkspacePageLayout } from "../../../components/PageLayout/WorkspacePageLayout"; import { useWorkspace } from "../../../lib/context"; -import React, { useEffect, useState } from "react"; -import { useApi } from "../../../lib/useApi"; +import React, { ReactNode, useEffect, useState } from "react"; import { useRouter } from "next/router"; -import { LoadingAnimation } from "../../../components/GlobalLoader/GlobalLoader"; -import { ErrorCard } from "../../../components/GlobalError/GlobalError"; import { JitsuButton } from "../../../components/JitsuButton/JitsuButton"; import { ChevronLeft, FileDown, RefreshCw } from "lucide-react"; +import { useQuery } from "@tanstack/react-query"; +import { LoadingAnimation } from "../../../components/GlobalLoader/GlobalLoader"; -function TaskLogs() { - const router = useRouter(); - const workspace = useWorkspace(); - const divRef = React.useRef(null); - - const [refresh, setRefresh] = useState(0); - - let logsUrl = `/api/${workspace.id}/sources/logs?syncId=${router.query.syncId}&taskId=${router.query.taskId}&refresh=${refresh}`; - - const { isLoading, data, error } = useApi(logsUrl); - - // Paint lines with ERROR in red - const coloredData = data?.split("\n").map((line, i) => { +function colorLogs(data: string): ReactNode { + return data.split("\n").map((line, i) => { if (line.includes(" ERROR [")) { return ( @@ -46,11 +34,37 @@ function TaskLogs() { ); } }); +} + +function TaskLogs() { + const router = useRouter(); + const workspace = useWorkspace(); + const divRef = React.useRef(null); + const origialRefresh = Math.round(Math.random() * 100000); + const [refresh, setRefresh] = React.useState(origialRefresh); + + let logsUrl = `/api/${workspace.id}/sources/logs?syncId=${router.query.syncId}&taskId=${router.query.taskId}`; + const { isLoading, data, error } = useQuery( + ["taskLog", router.query.taskId, refresh], + async () => { + const res = await fetch(logsUrl); + return res.text(); + }, + { cacheTime: 0, retry: false } + ); + + const [displayText, setDisplayText] = useState(undefined); useEffect(() => { if (divRef.current) { divRef.current.scrollTop = divRef.current.scrollHeight; } + }, [displayText]); + + useEffect(() => { + if (data) { + setDisplayText(data); + } }, [data]); return ( @@ -68,10 +82,10 @@ function TaskLogs() { Download } + icon={} type="link" size="small" - onClick={() => { + onClick={async () => { setRefresh(refresh + 1); }} > @@ -87,24 +101,22 @@ function TaskLogs() {
- {(function () { - if (isLoading) { - return ; - } else if (error) { - return ; - } else { - return ( -
- {coloredData} +
+ <> + {isLoading && origialRefresh == refresh && ( +
+
- ); - } - })()} + )} + {error &&
Error: {JSON.stringify(error)}
} + {displayText && colorLogs(displayText)} + +
); } From 1ff05efdea963dfa6884a5be0c4ba0cac3273074 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 6 Jul 2023 20:20:39 +0400 Subject: [PATCH 0021/1353] Sync endpoints: improved error reporting Sync endpoints: check workspace access UX improvements --- .../components/CodeBlock/CodeBlock.tsx | 4 +- .../components/CodeEditor/CodeEditor.tsx | 5 + .../ConnectionEditorPage.tsx | 12 +- .../components/DataView/EventsBrowser.tsx | 18 +-- .../console/components/DataView/JSONView.tsx | 6 +- .../components/GlobalLoader/GlobalLoader.tsx | 24 +++- .../ServiceEditor/ServiceEditor.tsx | 11 +- .../SyncEditorPage/SyncEditorPage.tsx | 60 ++++---- webapps/console/lib/shared/errors.ts | 33 +++++ webapps/console/lib/shared/errors.tsx | 10 -- webapps/console/lib/useQueryStringState.ts | 9 +- .../pages/[workspaceId]/destinations.tsx | 2 +- .../console/pages/[workspaceId]/functions.tsx | 12 +- .../console/pages/[workspaceId]/services.tsx | 16 +-- .../pages/[workspaceId]/syncs/index.tsx | 131 ++++++++++++++++-- .../pages/[workspaceId]/syncs/logs.tsx | 12 +- .../pages/[workspaceId]/syncs/tasks.tsx | 42 +++--- .../pages/api/[workspaceId]/sources/check.ts | 38 +++-- .../api/[workspaceId]/sources/discover.ts | 38 +++-- .../pages/api/[workspaceId]/sources/logs.ts | 20 ++- .../pages/api/[workspaceId]/sources/run.ts | 43 +++--- .../pages/api/[workspaceId]/sources/spec.ts | 19 +-- .../pages/api/[workspaceId]/sources/tasks.ts | 76 ++++------ 23 files changed, 411 insertions(+), 230 deletions(-) create mode 100644 webapps/console/lib/shared/errors.ts delete mode 100644 webapps/console/lib/shared/errors.tsx diff --git a/webapps/console/components/CodeBlock/CodeBlock.tsx b/webapps/console/components/CodeBlock/CodeBlock.tsx index eda07853d..c27706329 100644 --- a/webapps/console/components/CodeBlock/CodeBlock.tsx +++ b/webapps/console/components/CodeBlock/CodeBlock.tsx @@ -7,10 +7,11 @@ import json from "highlight.js/lib/languages/json"; import yaml from "highlight.js/lib/languages/yaml"; import htmlLang from "highlight.js/lib/languages/xml"; import typescript from "highlight.js/lib/languages/typescript"; +import bash from "highlight.js/lib/languages/bash"; import styles from "./CodeBlock.module.css"; -export type SupportedLang = "html" | "javascript" | "json" | "yaml" | "typescript" | "tsx" | "jsx"; +export type SupportedLang = "html" | "javascript" | "json" | "yaml" | "typescript" | "tsx" | "jsx" | "bash"; const langMap: Record = { html: htmlLang, javascript: javascript, @@ -19,6 +20,7 @@ const langMap: Record = { tsx: typescript, typescript: typescript, yaml: yaml, + bash: bash, }; Object.entries(langMap).map(([lang, module]) => hljs.registerLanguage(lang, module)); diff --git a/webapps/console/components/CodeEditor/CodeEditor.tsx b/webapps/console/components/CodeEditor/CodeEditor.tsx index 4936a78a1..e0958eec0 100644 --- a/webapps/console/components/CodeEditor/CodeEditor.tsx +++ b/webapps/console/components/CodeEditor/CodeEditor.tsx @@ -14,6 +14,7 @@ type CodeEditorProps = { changePosition?: (position: number) => void; ctrlEnterCallback?: (value: string) => void; ctrlSCallback?: (value: string) => void; + foldLevel?: number; monacoOptions?: Partial; }; @@ -27,6 +28,7 @@ export const CodeEditor: React.FC = ({ ctrlSCallback, changePosition, monacoOptions, + foldLevel, }) => { const editorRef = useRef(null); const [mounted, setMounted] = React.useState(false); @@ -35,6 +37,9 @@ export const CodeEditor: React.FC = ({ const handleEditorDidMount = useCallback( (editor, monaco) => { + if (foldLevel) { + editor.getAction(`editor.foldLevel${foldLevel}`)?.run(); + } editorRef.current = editor; editor.setValue(value); editor.onDidChangeCursorPosition(e => { diff --git a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx index 97fce517c..d00070417 100644 --- a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx +++ b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx @@ -7,7 +7,7 @@ import { ConfigurationObjectLinkDbModel } from "../../prisma/schema"; import { useRouter } from "next/router"; import { assertTrue, getLog, requireDefined } from "juava"; import { Disable } from "../Disable/Disable"; -import { Button, Input, InputNumber, Radio, Select, Space, Switch } from "antd"; +import { Button, Input, InputNumber, Radio, Select, Switch } from "antd"; import { WLink } from "../Workspace/WLink"; import { FaExternalLinkAlt } from "react-icons/fa"; import { BaseBulkerConnectionOptions, getCoreDestinationType } from "../../lib/schema/destinations"; @@ -77,7 +77,7 @@ function SourceSelector(props: SelectorProps) { {!props.enabled && (
- +
@@ -96,7 +96,7 @@ type EditorComponent = React.FC & P>; const DataLayoutEditor: EditorComponent = props => ( props.onChange(val.target.value)}> - +
@@ -124,7 +124,7 @@ const DataLayoutEditor: EditorComponent = props => (
- +
); @@ -157,7 +157,7 @@ export const BatchOrStreamEditor: EditorComponent onChange(e.target.value)} > - +
@@ -181,7 +181,7 @@ export const BatchOrStreamEditor: EditorComponent Batch - +
); }; diff --git a/webapps/console/components/DataView/EventsBrowser.tsx b/webapps/console/components/DataView/EventsBrowser.tsx index 65c7cc1f7..d6f763026 100644 --- a/webapps/console/components/DataView/EventsBrowser.tsx +++ b/webapps/console/components/DataView/EventsBrowser.tsx @@ -3,7 +3,7 @@ import utc from "dayjs/plugin/utc"; import relativeTime from "dayjs/plugin/relativeTime"; import { EventsLogRecord } from "../../lib/server/events-log"; import { ColumnsType } from "antd/es/table"; -import { Alert, Collapse, DatePicker, Select, Space, Spin, Table, Tag, Tooltip } from "antd"; +import { Alert, Collapse, DatePicker, Select, Spin, Table, Tag, Tooltip } from "antd"; import { TableWithDrawer } from "./TableWithDrawer"; import { JSONView } from "./JSONView"; import { useAppConfig, useWorkspace } from "../../lib/context"; @@ -268,11 +268,11 @@ export const EventsBrowser = ({ entity[1].type === "stream" ? ( entity[1].name ) : ( - - {entity[1].stream.name} - {"→"} +
+ {entity[1].stream.name} + {"→"} - +
), })); } else { @@ -722,7 +722,7 @@ const IncomingEventDrawer = ({ event }: { event: IncomingEvent }) => { return props.loading ? ( ) : ( - +
{props.destinationIds .map(d => props.destinationsMap[d]?.destination) .filter(d => typeof d !== "undefined") @@ -731,7 +731,7 @@ const IncomingEventDrawer = ({ event }: { event: IncomingEvent }) => { ))} - +
); }; @@ -967,7 +967,7 @@ const IncomingEventsTable = ({ loadEvents, loading, streamType, entityType, acto key: "summary", render: (d: IncomingEvent) => { return ( - +
{d.host && ( } className={"whitespace-nowrap"}> @@ -1010,7 +1010,7 @@ const IncomingEventsTable = ({ loadEvents, loading, streamType, entityType, acto )} - +
); }, }, diff --git a/webapps/console/components/DataView/JSONView.tsx b/webapps/console/components/DataView/JSONView.tsx index a941877c0..753c74533 100644 --- a/webapps/console/components/DataView/JSONView.tsx +++ b/webapps/console/components/DataView/JSONView.tsx @@ -1,5 +1,5 @@ import React, { useState } from "react"; -import { Button, Space } from "antd"; +import { Button } from "antd"; import { CopyOutlined, FileTextOutlined } from "@ant-design/icons"; import loadable from "@loadable/component"; import { CodeBlockLight } from "../CodeBlock/CodeBlockLight"; @@ -24,7 +24,7 @@ export const JSONView = (props: { data: any; rawData?: string }) => { return (
- +
{!raw ? ( - +
{!raw ? ( diff --git a/webapps/console/components/GlobalLoader/GlobalLoader.tsx b/webapps/console/components/GlobalLoader/GlobalLoader.tsx index 175e4f545..b1b8a9a7a 100644 --- a/webapps/console/components/GlobalLoader/GlobalLoader.tsx +++ b/webapps/console/components/GlobalLoader/GlobalLoader.tsx @@ -1,5 +1,6 @@ import React, { ReactNode, useEffect, useState } from "react"; import classNames from "classnames"; +import dayjs from "dayjs"; export function Spinner(props: { className?: string }) { return ( @@ -24,21 +25,40 @@ export function Spinner(props: { className?: string }) { export function LoadingAnimation({ title, + longLoadingTitle, + longLoadingThresholdSeconds = 3, className, hideTitle, }: { title?: ReactNode; + longLoadingTitle?: ReactNode; + longLoadingThresholdSeconds?: number; iconSize?: number; fontSize?: string; className?: string; hideTitle?: boolean; }) { + const startTime = dayjs(); + const [shownTitle, setShownTitle] = useState(title || "Loading..."); + + useEffect(() => { + if (longLoadingTitle) { + const id = setInterval(() => { + if (dayjs().diff(startTime, "second") > longLoadingThresholdSeconds) { + setShownTitle(longLoadingTitle); + } + }, 1000); + + return () => clearInterval(id); + } + }, [startTime, longLoadingTitle, longLoadingThresholdSeconds]); + return ( -
+
- {!hideTitle &&
{title || "Loading..."}
} + {!hideTitle &&
{shownTitle}
}
); } diff --git a/webapps/console/components/ServiceEditor/ServiceEditor.tsx b/webapps/console/components/ServiceEditor/ServiceEditor.tsx index 5996db77a..9c224102f 100644 --- a/webapps/console/components/ServiceEditor/ServiceEditor.tsx +++ b/webapps/console/components/ServiceEditor/ServiceEditor.tsx @@ -157,7 +157,14 @@ export const ServiceEditor: React.FC = props => { {loadingSpecs ? ( - + ) : (
{oauthConnector && ( @@ -202,7 +209,7 @@ export const ServiceEditor: React.FC = props => {
{nangoError ? ( diff --git a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx index 491b25c9a..12b3b4377 100644 --- a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx +++ b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx @@ -1,7 +1,7 @@ import { useWorkspace } from "../../lib/context"; import { get } from "../../lib/useApi"; import { DestinationConfig, ServiceConfig } from "../../lib/schema"; -import React, { PropsWithChildren, useCallback, useEffect, useState } from "react"; +import React, { useCallback, useEffect, useState } from "react"; import { z } from "zod"; import { ConfigurationObjectLinkDbModel } from "../../prisma/schema"; import { useRouter } from "next/router"; @@ -16,8 +16,8 @@ import FieldListEditorLayout, { EditorItem } from "../FieldListEditorLayout/Fiel import { ChevronLeft } from "lucide-react"; import { JitsuButton } from "../JitsuButton/JitsuButton"; import { LoadingAnimation } from "../GlobalLoader/GlobalLoader"; -import { SnippedEditor } from "../CodeEditor/SnippedEditor"; import hash from "stable-hash"; +import { CodeEditor } from "../CodeEditor/CodeEditor"; const log = getLog("SyncEditorPage"); @@ -28,10 +28,6 @@ type SelectorProps = { onSelect: (value: string) => void; }; -const Htmlizer: React.FC> = ({ children }) => { - return typeof children === "string" ? : <>{children}; -}; - type SyncOptionsType = any; function DestinationSelector(props: SelectorProps) { @@ -41,6 +37,9 @@ function DestinationSelector(props: SelectorProps) { setValue(e.target.value)} + onKeyDown={e => { + if (e.key === "Enter") { + setEditing(false); + onUpdate(value); + } else if (e.key == "Escape") { + setEditing(false); + setValue(rollbackValue); + } + console.log(e.key); + }} + /> +
+ + + + ) : ( + <> +

{ + setRollbackValue(value); + setEditing(true); + }} + > + {value} +

+ + + )} +
+ ); +}; + export const FunctionsDebugger: React.FC = props => { const { push } = useRouter(); @@ -133,19 +205,17 @@ export const FunctionsDebugger: React.FC = props => {
+
+ { + setObj({ ...obj, name }); + }} + > + {obj.name || "New function"} + +
( -
-

{props.isNew ? "Add new function" : `Edit ${obj.name}`}

- {expanded ? "(hide)" : "(edit name)"} -
- ), - }, Code: { expandable: false, className: "overflow-hidden", @@ -188,32 +258,6 @@ export const FunctionsDebugger: React.FC = props => { }, }} items={[ - { - group: "Name", - name: "Name", - component: ( - { - setObj({ ...obj, name }); - }} - /> - ), - }, - { - group: "Name", - name: "Description", - component: ( - { - setObj({ ...obj, description }); - }} - /> - ), - }, { group: "Code", key: "code", diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index 59f0fd611..ead517c8d 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -22,6 +22,7 @@ import { Settings, Share2, ShieldAlert, + X, } from "lucide-react"; import { NextRouter, useRouter } from "next/router"; @@ -522,9 +523,14 @@ export const WorkspacePageLayout: React.FC> = )} {fullscreen && ( - +
+ +
)} {children}
diff --git a/webapps/console/pages/[workspaceId]/index.tsx b/webapps/console/pages/[workspaceId]/index.tsx index 2caeedd24..ccfaef98f 100644 --- a/webapps/console/pages/[workspaceId]/index.tsx +++ b/webapps/console/pages/[workspaceId]/index.tsx @@ -5,11 +5,11 @@ import { QueryResponse } from "../../components/QueryResponse/QueryResponse"; import { branding } from "../../lib/branding"; import { Badge, Steps, Tooltip } from "antd"; import { WLink } from "../../components/Workspace/WLink"; -import React, { ReactNode } from "react"; -import { FaGlobe, FaPlus } from "react-icons/fa"; +import React, { ReactNode, useEffect, useState } from "react"; +import { FaGlobe } from "react-icons/fa"; import { LabelEllipsis } from "../../components/LabelEllipsis/LabelEllipsis"; import { coreDestinationsMap } from "../../lib/schema/destinations"; -import { PropsWithChildrenClassname, useTitle } from "../../lib/ui"; +import { useTitle } from "../../lib/ui"; import { z } from "zod"; import { ConfigurationObjectLinkDbModel } from "../../prisma/schema"; import { useLinksQuery } from "../../lib/queries"; @@ -17,8 +17,10 @@ import { QuestionCircleOutlined } from "@ant-design/icons"; import { ButtonProps } from "antd/es/button/button"; import { Simplify } from "type-fest"; import { ProvisionDatabaseButton } from "../../components/ProvisionDatabaseButton/ProvisionDatabaseButton"; -import { JitsuButton } from "../../components/JitsuButton/JitsuButton"; import { ConnectionsDiagram } from "../../components/ConnectionsDiagram/ConnectionsDiagram"; +import { getLog } from "juava"; +import { Chrome } from "lucide-react"; +import classNames from "classnames"; function Welcome({ destinations, @@ -128,50 +130,59 @@ function Welcome({ ); } -function Card({ title, configLink, icon }: { title: string; configLink?: string; icon: ReactNode }) { - const card = ( -
-
-
{icon}
-
- {title} -
-
+function HoverBorder({ children, forceHover }: { children: ReactNode; forceHover?: boolean }) { + const [_hover, setHover] = useState(false); + const hover = forceHover || _hover; + return ( +
setHover(true)} + onMouseLeave={() => setHover(false)} + style={hover ? { padding: "0px", borderWidth: "2px" } : { padding: "1px", borderWidth: "1px" }} + > + {children}
); - return configLink ? {card} : card; } -type ButtonAction = Simplify | Pick>; - -function Section({ +function Card({ title, - children, - noun, - className, - addAction, -}: PropsWithChildrenClassname<{ title: string; noun: string; addAction: ButtonAction }>) { - return ( -
-
-
{title}
-
- } type="primary" size="large" {...addAction}> - Add {noun} - + configLink, + icon, + selected, +}: { + title: string; + configLink?: string; + icon: ReactNode; + selected?: boolean; +}) { + const card = ( + +
+
+
{icon}
+
+ {title} +
-
{children}
-
+ ); + return configLink ? {card} : card; } +type ButtonAction = Simplify | Pick>; + type ConfigurationLinkDbModel = Omit, "data">; -function DestinationCard({ dest }: { dest: DestinationConfig }) { +function DestinationCard({ dest, selected }: { dest: DestinationConfig; selected?: boolean }) { const workspace = useWorkspace(); const card = ( } title={dest.name} configLink={!dest.provisioned ? `/${workspace.id}/destinations?id=${dest.id}` : undefined} @@ -205,6 +216,37 @@ function DestinationCard({ dest }: { dest: DestinationConfig }) { ); } +const FaviconLoader: React.FC<{ potentialUrl?: string }> = ({ potentialUrl }) => { + const [faviconUrl, setFaviconUrl] = useState(null); + useEffect(() => { + (async () => { + if (potentialUrl) { + let url; + let fullUrl = + potentialUrl.indexOf("http") === 0 ? potentialUrl + "/favicon.ico" : `https://${potentialUrl}/favicon.ico`; + try { + url = new URL(fullUrl); + } catch (e) { + getLog().atDebug().withCause(e).log(`Failed to parse url ${fullUrl}`); + } + let response; + try { + response = await fetch(fullUrl); + } catch (e) { + getLog().atDebug().withCause(e).log(`Failed to parse url ${fullUrl}`); + return; + } + if (response.ok) { + setFaviconUrl(fullUrl); + } else { + getLog().atDebug().log(`Failed to load favicon for ${fullUrl}`); + } + } + })(); + }, [potentialUrl]); + return faviconUrl ? : ; +}; + function WorkspaceOverview(props: { streams: StreamConfig[]; destinations: DestinationConfig[]; @@ -231,9 +273,10 @@ function WorkspaceOverview(props: { }} sources={streams.map(({ id, name }) => ({ id: id, - card: ( + card: (forceSelect: boolean) => ( } + selected={forceSelect} + icon={} title={name || id} configLink={`/${workspace.id}/streams?id=${id}`} /> @@ -241,7 +284,7 @@ function WorkspaceOverview(props: { }))} destinations={destinations.map(d => ({ id: d.id, - card: , + card: (forceSelect: boolean) => , }))} connections={links.map(l => ({ from: l.fromId, From ca5151a56e7173fb9a32946324a8df5b634f8af6 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 10 Jul 2023 22:57:35 +0400 Subject: [PATCH 0028/1353] layout fixes --- .../components/CodeEditor/CodeEditor.tsx | 4 +- .../components/CodeEditor/SnippedEditor.tsx | 45 +---- .../components/DataView/EventsBrowser.tsx | 20 +-- .../FunctionsDebugger/FunctionsDebugger.tsx | 156 +++++++----------- .../PageLayout/PageLayout.module.css | 12 -- .../PageLayout/WorkspacePageLayout.module.css | 4 + .../PageLayout/WorkspacePageLayout.tsx | 84 +++++----- webapps/console/lib/schema/destinations.tsx | 4 +- webapps/console/pages/[workspaceId]/data.tsx | 2 +- .../pages/[workspaceId]/destinations.tsx | 10 ++ .../console/pages/[workspaceId]/functions.tsx | 4 +- webapps/console/pages/[workspaceId]/sql.tsx | 2 +- .../pages/[workspaceId]/syncs/tasks.tsx | 40 ++--- 13 files changed, 165 insertions(+), 222 deletions(-) delete mode 100644 webapps/console/components/PageLayout/PageLayout.module.css create mode 100644 webapps/console/components/PageLayout/WorkspacePageLayout.module.css diff --git a/webapps/console/components/CodeEditor/CodeEditor.tsx b/webapps/console/components/CodeEditor/CodeEditor.tsx index e0958eec0..0b2dfc69d 100644 --- a/webapps/console/components/CodeEditor/CodeEditor.tsx +++ b/webapps/console/components/CodeEditor/CodeEditor.tsx @@ -41,7 +41,9 @@ export const CodeEditor: React.FC = ({ editor.getAction(`editor.foldLevel${foldLevel}`)?.run(); } editorRef.current = editor; - editor.setValue(value); + if (typeof value !== "undefined") { + editor.setValue(value); + } editor.onDidChangeCursorPosition(e => { handleChangePosition(editor.getModel().getOffsetAt(e.position)); }); diff --git a/webapps/console/components/CodeEditor/SnippedEditor.tsx b/webapps/console/components/CodeEditor/SnippedEditor.tsx index 3e85ff2ad..ffbeba56c 100644 --- a/webapps/console/components/CodeEditor/SnippedEditor.tsx +++ b/webapps/console/components/CodeEditor/SnippedEditor.tsx @@ -1,7 +1,7 @@ -import Editor from "@monaco-editor/react"; import React from "react"; import { Radio } from "antd"; import { editor } from "monaco-editor"; +import { CodeEditor } from "./CodeEditor"; /** * See tagDestination comments, due to limitations of the react-jsonschema-form we can't use @@ -20,7 +20,7 @@ export type SnippedEditorProps = { languages?: SupportedLanguages[]; height?: number; onChange: (value: SnippedEditorValue) => void; - options?: editor.IStandaloneEditorConstructionOptions; + monacoOptions?: editor.IStandaloneEditorConstructionOptions; //automatically fold code on provided level of indentation on editor mount foldLevel?: number; }; @@ -32,7 +32,7 @@ export type SnippedEditorProps = { function parse(val: string) { try { const j = JSON.parse(val); - if (j.lang && j.code) { + if (j.lang) { return j; } else { return { code: val, lang: "json" }; @@ -66,7 +66,9 @@ export const SnippedEditor: React.FC = props => {
)}
- { if (singleLanguage) { @@ -77,39 +79,10 @@ export const SnippedEditor: React.FC = props => { props.onChange(newValue); } }} - language={valueParsed.lang?.toLowerCase() || "html"} - height={props.height ? `${props.height}px` : "500px"} - onMount={ - props.foldLevel - ? editor => { - editor.getAction(`editor.foldLevel${props.foldLevel}`)?.run(); - } - : undefined - } - className="rounded-lg" - options={{ - renderLineHighlight: "none", - //readOnly: readonly, - automaticLayout: true, - glyphMargin: false, - folding: false, + foldLevel={props.foldLevel} + monacoOptions={{ lineNumbers: "off", - lineDecorationsWidth: 11, - lineNumbersMinChars: 0, - minimap: { - enabled: false, - }, - scrollbar: { - verticalScrollbarSize: 5, - horizontalScrollbarSize: 5, - }, - padding: { - top: 4, - bottom: 4, - }, - hideCursorInOverviewRuler: true, - overviewRulerLanes: 0, - ...props.options, + ...(props.monacoOptions || {}), }} />
diff --git a/webapps/console/components/DataView/EventsBrowser.tsx b/webapps/console/components/DataView/EventsBrowser.tsx index b9965abe8..b507a5be7 100644 --- a/webapps/console/components/DataView/EventsBrowser.tsx +++ b/webapps/console/components/DataView/EventsBrowser.tsx @@ -13,7 +13,7 @@ import { WLink } from "../Workspace/WLink"; import { DestinationTitle } from "../../pages/[workspaceId]/destinations"; import ExternalLink from "../Icons/ExternalLink"; import { AnalyticsContext, AnalyticsServerEvent } from "@jitsu/protocols/analytics"; -import { GlobalOutlined, LinkOutlined, NumberOutlined, QuestionCircleOutlined, UserOutlined } from "@ant-design/icons"; +import { GlobalOutlined, LinkOutlined, QuestionCircleOutlined, UserOutlined } from "@ant-design/icons"; import { getConfigApi, useEventsLogApi } from "../../lib/useApi"; import { FunctionTitle } from "../../pages/[workspaceId]/functions"; import { FunctionConfig } from "../../lib/schema"; @@ -310,7 +310,7 @@ export const EventsBrowser = ({ })(); return ( <> -
+
@@ -796,7 +796,7 @@ const IncomingEventDrawer = ({ event }: { event: IncomingEvent }) => { name: "Jitsu Domain", value: event.originDomain, }); - drawerData.push({ name: "Write Key", value: event.writeKey }); + drawerData.push({ name: "Write Key", value: {event.writeKey} }); drawerData.push({ name: "HTTP Headers", value: ( @@ -1015,13 +1015,13 @@ const IncomingEventsTable = ({ loadEvents, loading, streamType, entityType, acto )} - {d.messageId && ( - - } className={"whitespace-nowrap"}> - {d.messageId} - - - )} + {/*{d.messageId && (*/} + {/* */} + {/* } className={"whitespace-nowrap"}>*/} + {/* {d.messageId}*/} + {/* */} + {/* */} + {/*)}*/}
); }, diff --git a/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx b/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx index b637f4d50..79a77e2eb 100644 --- a/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx +++ b/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx @@ -1,6 +1,5 @@ import React, { useCallback, useEffect, useReducer, useState } from "react"; import { EditorComponentProps } from "../ConfigObjectEditor/ConfigEditor"; -import FieldListEditorLayout from "../FieldListEditorLayout/FieldListEditorLayout"; import { Badge, Button, Drawer, Dropdown, Input, MenuProps, Select, Table } from "antd"; import { PlayCircleOutlined } from "@ant-design/icons"; import { CodeEditor } from "../CodeEditor/CodeEditor"; @@ -34,9 +33,9 @@ export const EditableTitle: React.FC<{ children: string; onUpdate: (str: string) const [value, setValue] = useState(children); const [rollbackValue, setRollbackValue] = useState(children); return ( -
+
{editing ? ( - <> +
- +
) : ( - <> +

{ setRollbackValue(value); setEditing(true); @@ -86,7 +85,7 @@ export const EditableTitle: React.FC<{ children: string; onUpdate: (str: string) {value}

- +
)}
); @@ -119,11 +118,11 @@ export const FunctionsDebugger: React.FC = props => { const [logs, setLogs] = useState([]); const [unreadErrorLogs, setUnreadErrorLogs] = useState(0); const [unreadLogs, setUnreadLogs] = useState(0); - const [loading, setLoading] = useState(false); + const [saving, setSaving] = useState(false); const [running, setRunning] = useState(false); const save = useCallback(async () => { - setLoading(true); + setSaving(true); try { if (props.isNew) { await getConfigApi(workspace.id, "function").create(obj); @@ -136,7 +135,7 @@ export const FunctionsDebugger: React.FC = props => { } catch (error) { feedbackError(`Can't save function`, { error }); } finally { - setLoading(false); + setSaving(false); } }, [props.isNew, obj, workspace.id, push]); @@ -204,7 +203,7 @@ export const FunctionsDebugger: React.FC = props => {
-
+
{ @@ -214,86 +213,59 @@ export const FunctionsDebugger: React.FC = props => { {obj.name || "New function"}
- -
-

Code:

-
-
- - - - -
-
- ), - }, - }} - items={[ - { - group: "Code", - key: "code", - itemClassName: "flex-auto", - component: ( -
-
- setObj({ ...obj, code: value })} - monacoOptions={{ renderLineHighlight: "none" }} - /> -
-
-
Config
- -
-
- ), - }, - ]} - /> +
+
+

Code:

+
+
+ + + + +
+
+
+
+ setObj({ ...obj, code: value })} + monacoOptions={{ renderLineHighlight: "none" }} + /> +
+
+
Config
+ +
+
diff --git a/webapps/console/components/PageLayout/PageLayout.module.css b/webapps/console/components/PageLayout/PageLayout.module.css deleted file mode 100644 index 3ddadad8a..000000000 --- a/webapps/console/components/PageLayout/PageLayout.module.css +++ /dev/null @@ -1,12 +0,0 @@ -.contentWidth { - max-width: 1400px; - min-width: 600px; - flex-grow: 1; -} - -.rootWrapper { - margin: auto; - max-width: 1400px; - min-width: 700px; - min-height: 80vh; -} diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.module.css b/webapps/console/components/PageLayout/WorkspacePageLayout.module.css new file mode 100644 index 000000000..00d56e1be --- /dev/null +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.module.css @@ -0,0 +1,4 @@ +.widthControl { + max-width: 1500px; + min-width: 1000px; +} diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index ead517c8d..f1d4fd68d 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -6,6 +6,7 @@ import { FiSettings } from "react-icons/fi"; import { Button, Drawer, Dropdown, Menu } from "antd"; import MenuItem from "antd/lib/menu/MenuItem"; import { ButtonLabel } from "../ButtonLabel/ButtonLabel"; +import styles from "./WorkspacePageLayout.module.css"; import { Activity, ArrowLeftRight, @@ -240,34 +241,31 @@ export const TopTabsMenu: React.FC = props => { const router = useRouter(); return ( -
-
- {props.items - .filter(i => !i.hidden) - .map(item => { - const selected = isSelected(item, router); - return ( -
-
+ {props.items + .filter(i => !i.hidden) + .map(item => { + const selected = isSelected(item, router); + return ( +
+ + - - -
{item.icon}
- {item.title} -
-
-
-
- ); - })} -
+
{item.icon}
+ {item.title} + + +
+ ); + })}
); }; @@ -371,7 +369,7 @@ function PageHeader() { return (
-
+
@@ -449,11 +447,7 @@ export const VerticalSection: React.FC }; export const WidthControl: React.FC> = ({ children, className }) => { - return ( -
- {children} -
- ); + return
{children}
; }; export const WorkspacePageLayout: React.FC> = ({ @@ -477,17 +471,15 @@ export const WorkspacePageLayout: React.FC> = const pHeader = ( - -
- -
+ +
); return ( -
+
{!doNotBlockIfUsageExceeded && } -
+
{!workspace.slug && ( { @@ -523,16 +515,14 @@ export const WorkspacePageLayout: React.FC> = )} {fullscreen && ( -
- -
+ )} - {children} + {children}
diff --git a/webapps/console/lib/schema/destinations.tsx b/webapps/console/lib/schema/destinations.tsx index 831b2c215..d1292c4e6 100644 --- a/webapps/console/lib/schema/destinations.tsx +++ b/webapps/console/lib/schema/destinations.tsx @@ -400,8 +400,8 @@ export const coreDestinations: DestinationType[] = [ }), credentialsUi: { keyFile: { - editor: "SnippedEditor", - editorProps: { languages: ["json"], height: 250 }, + editor: "CodeEditor", + editorProps: { language: "json", height: "250px", monacoOptions: { lineNumbers: "off" } }, }, }, }, diff --git a/webapps/console/pages/[workspaceId]/data.tsx b/webapps/console/pages/[workspaceId]/data.tsx index 4bdda3cc0..8b0bc3f45 100644 --- a/webapps/console/pages/[workspaceId]/data.tsx +++ b/webapps/console/pages/[workspaceId]/data.tsx @@ -13,7 +13,7 @@ const DataViewPage: React.FC = () => {

Live Events

-
+
diff --git a/webapps/console/pages/[workspaceId]/destinations.tsx b/webapps/console/pages/[workspaceId]/destinations.tsx index 0faa44d00..c8dd18795 100644 --- a/webapps/console/pages/[workspaceId]/destinations.tsx +++ b/webapps/console/pages/[workspaceId]/destinations.tsx @@ -37,6 +37,7 @@ import { useBilling } from "../../components/Billing/BillingProvider"; import { UpgradeDialog } from "../../components/Billing/UpgradeDialog"; import { ProvisionDatabaseButton } from "../../components/ProvisionDatabaseButton/ProvisionDatabaseButton"; import Link from "next/link"; +import { CodeEditor } from "../../components/CodeEditor/CodeEditor"; const log = getLog("destinations"); const Loader: React.FC<{}> = () => { @@ -170,6 +171,15 @@ export const KeyValueArrayEditor: React.FC> = p function getEditorComponent(editor: string, editorProps?: any) { if (editor === "ArrayTextarea" || editor === "StringArrayEditor") { return ArrayTextareaEditor; + } else if (editor === "CodeEditor") { + //eslint-disable-next-line react/display-name + return props => { + return ( +
+ +
+ ); + }; } else if (editor === "SnippedEditor") { //eslint-disable-next-line react/display-name return props => { diff --git a/webapps/console/pages/[workspaceId]/functions.tsx b/webapps/console/pages/[workspaceId]/functions.tsx index 7430bc965..11ea075f4 100644 --- a/webapps/console/pages/[workspaceId]/functions.tsx +++ b/webapps/console/pages/[workspaceId]/functions.tsx @@ -16,7 +16,9 @@ const Functions: React.FC = () => { console.log("router", router.pathname); return ( diff --git a/webapps/console/pages/[workspaceId]/sql.tsx b/webapps/console/pages/[workspaceId]/sql.tsx index 663229e2f..5882ebd87 100644 --- a/webapps/console/pages/[workspaceId]/sql.tsx +++ b/webapps/console/pages/[workspaceId]/sql.tsx @@ -96,7 +96,7 @@ const DataViewPage: React.FC = () => { return (
-
+
diff --git a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx index 7ef978f44..8de6b2398 100644 --- a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx @@ -327,7 +327,7 @@ function Tasks() { return ( <> {contextHolder} -
+
@@ -408,24 +408,26 @@ function Tasks() {
- 0 && "animate-spin"}`} />} - type="link" - size="small" - onClick={() => { - setRefresh(refresh + 1); - }} - > - Refresh - - } - type="link" - size="small" - onClick={() => router.push(`/${workspace.slug || workspace.id}/syncs`)} - > - Back - +
+ 0 && "animate-spin"}`} />} + type="link" + size="small" + onClick={() => { + setRefresh(refresh + 1); + }} + > + Refresh + + } + type="link" + size="small" + onClick={() => router.push(`/${workspace.slug || workspace.id}/syncs`)} + > + Back + +
{error ? ( From 04a80ee8999ea3434f6588694309ab8aa5ae23f9 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 10 Jul 2023 23:09:25 +0400 Subject: [PATCH 0029/1353] Live Events: don't crash on deleted sites --- webapps/console/components/DataView/EventsBrowser.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/components/DataView/EventsBrowser.tsx b/webapps/console/components/DataView/EventsBrowser.tsx index b507a5be7..51ff10dd7 100644 --- a/webapps/console/components/DataView/EventsBrowser.tsx +++ b/webapps/console/components/DataView/EventsBrowser.tsx @@ -281,7 +281,7 @@ export const EventsBrowser = ({ entity[1].name ) : (
- {entity[1].stream.name} + {entity[1].stream?.name || "unknown"} {"→"}
From a2b7aadab2b3b4c8e42db82359ca5fc847aa2926 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Mon, 10 Jul 2023 15:48:25 -0400 Subject: [PATCH 0030/1353] feat: overview page visual improvements --- .../ConnectionsDiagram/ConnectionsDiagram.tsx | 40 +++++++++++-------- webapps/console/pages/[workspaceId]/index.tsx | 4 +- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx b/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx index 2ba72bded..6c711f9a5 100644 --- a/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx +++ b/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx @@ -1,6 +1,6 @@ import React, { ReactNode, RefObject, useEffect } from "react"; import { branding } from "../../lib/branding"; -import { requireDefined } from "juava"; +import { getLog, requireDefined } from "juava"; import Link from "next/link"; import { useWorkspace } from "../../lib/context"; import { ExternalLink } from "lucide-react"; @@ -75,8 +75,8 @@ export const ConnectionsDiagram: React.FC = ({ connectio const [mouseOverSrc, setMouseOverSrc] = React.useState(); const [mouseOverDst, setMouseOverDst] = React.useState(); const workspaces = useWorkspace(); - const [forceSelectDestination, setForceSelectDestination] = React.useState(); - const [forceSelectSource, setForceSelectSource] = React.useState(); + const [forceSelectDestination, setForceSelectDestination] = React.useState([]); + const [forceSelectSource, setForceSelectSource] = React.useState([]); useEffect(() => { const resizeListener = () => setWindowSize({ width: window.innerWidth, height: window.innerHeight }); window.addEventListener("resize", resizeListener); @@ -94,8 +94,6 @@ export const ConnectionsDiagram: React.FC = ({ connectio ); const logoBounds = logoRef.current.getBoundingClientRect(); const newLines: ConnectorLine[] = []; - setForceSelectDestination(undefined); - setForceSelectSource(undefined); srcRefs.current .map(r => r.current) .filter(r => !!r) @@ -105,9 +103,6 @@ export const ConnectionsDiagram: React.FC = ({ connectio const selected = mouseOverSrc === sources[idx].id || (!!mouseOverDst && !!connections.find(c => c.from === sources[idx].id && c.to === mouseOverDst)); - if (selected) { - setForceSelectSource(sources[idx].id); - } newLines.push({ from: { top: rel.top + bounds.height / 2, left: rel.left + bounds.width }, to: { left: logoPosition.left, top: logoPosition.top + logoBounds.height / 2 }, @@ -121,11 +116,13 @@ export const ConnectionsDiagram: React.FC = ({ connectio .forEach((r, idx) => { const rel = getRelativePosition(canvasRef.current!, r!); const bounds = r!.getBoundingClientRect(); + const destination = destinations[idx]; const selected = - mouseOverDst === destinations[idx].id || - (!!mouseOverSrc && !!connections.find(c => c.to === destinations[idx].id && c.from === mouseOverSrc)); + mouseOverDst === destination.id || + (!!mouseOverSrc && !!connections.find(c => c.to === destination.id && c.from === mouseOverSrc)); if (selected) { - setForceSelectDestination(destinations[idx].id); + setForceSelectDestination([destination.id]); + setForceSelectSource(connections.filter(c => c.to === destination.id).map(c => c.from)); } newLines.push({ to: { top: rel.top + bounds.height / 2, left: rel.left }, @@ -134,6 +131,17 @@ export const ConnectionsDiagram: React.FC = ({ connectio }); }); setLines(newLines); + + if (mouseOverSrc) { + setForceSelectSource([mouseOverSrc]); + setForceSelectDestination(connections.filter(c => c.from === mouseOverSrc).map(c => c.to)); + } else if (mouseOverDst) { + setForceSelectDestination([mouseOverDst]); + setForceSelectSource(connections.filter(c => c.to === mouseOverDst).map(c => c.from)); + } else { + setForceSelectDestination([]); + setForceSelectSource([]); + } }, [connections, sources, destinations, windowSize, mouseOverSrc, mouseOverDst]); srcRefs.current = sources.map((_, i) => srcRefs.current[i] ?? React.createRef()); @@ -155,7 +163,7 @@ export const ConnectionsDiagram: React.FC = ({ connectio }} onMouseLeave={() => setMouseOverSrc(undefined)} > - {s.card(forceSelectSource === s.id)} + {s.card(forceSelectSource.includes(s.id))}
))}
@@ -178,17 +186,17 @@ export const ConnectionsDiagram: React.FC = ({ connectio
- {destinations.map((d, idx) => ( + {destinations.map((dest, idx) => (
{ - setMouseOverDst(d.id); + setMouseOverDst(dest.id); }} onMouseLeave={() => setMouseOverDst(undefined)} > - {d.card(forceSelectDestination === d.id)} + {dest.card(forceSelectDestination.includes(dest.id))}
))}
diff --git a/webapps/console/pages/[workspaceId]/index.tsx b/webapps/console/pages/[workspaceId]/index.tsx index ccfaef98f..ef2cc3ab7 100644 --- a/webapps/console/pages/[workspaceId]/index.tsx +++ b/webapps/console/pages/[workspaceId]/index.tsx @@ -141,7 +141,7 @@ function HoverBorder({ children, forceHover }: { children: ReactNode; forceHover )} onMouseEnter={() => setHover(true)} onMouseLeave={() => setHover(false)} - style={hover ? { padding: "0px", borderWidth: "2px" } : { padding: "1px", borderWidth: "1px" }} + style={hover ? { padding: "0px", borderWidth: "3px" } : { padding: "2px", borderWidth: "1px" }} > {children}
@@ -174,8 +174,6 @@ function Card({ return configLink ? {card} : card; } -type ButtonAction = Simplify | Pick>; - type ConfigurationLinkDbModel = Omit, "data">; function DestinationCard({ dest, selected }: { dest: DestinationConfig; selected?: boolean }) { From 00ff1112426a862244d4338aef8cf903b1319b21 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Mon, 10 Jul 2023 16:57:15 -0400 Subject: [PATCH 0031/1353] fix: applied linter --- .../components/ConnectionsDiagram/ConnectionsDiagram.tsx | 2 +- webapps/console/pages/[workspaceId]/index.tsx | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx b/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx index 6c711f9a5..76d315fc7 100644 --- a/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx +++ b/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx @@ -1,6 +1,6 @@ import React, { ReactNode, RefObject, useEffect } from "react"; import { branding } from "../../lib/branding"; -import { getLog, requireDefined } from "juava"; +import { requireDefined } from "juava"; import Link from "next/link"; import { useWorkspace } from "../../lib/context"; import { ExternalLink } from "lucide-react"; diff --git a/webapps/console/pages/[workspaceId]/index.tsx b/webapps/console/pages/[workspaceId]/index.tsx index ef2cc3ab7..44a98873a 100644 --- a/webapps/console/pages/[workspaceId]/index.tsx +++ b/webapps/console/pages/[workspaceId]/index.tsx @@ -14,8 +14,6 @@ import { z } from "zod"; import { ConfigurationObjectLinkDbModel } from "../../prisma/schema"; import { useLinksQuery } from "../../lib/queries"; import { QuestionCircleOutlined } from "@ant-design/icons"; -import { ButtonProps } from "antd/es/button/button"; -import { Simplify } from "type-fest"; import { ProvisionDatabaseButton } from "../../components/ProvisionDatabaseButton/ProvisionDatabaseButton"; import { ConnectionsDiagram } from "../../components/ConnectionsDiagram/ConnectionsDiagram"; import { getLog } from "juava"; From 484c9ad6ce5951f25d828d549ccd18988f45da38 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Mon, 10 Jul 2023 18:01:42 -0400 Subject: [PATCH 0032/1353] feat: /api/me endpoint for detecting login user from other subdomains --- webapps/console/lib/server/origin.ts | 13 +++++ .../pages/api/fb-auth/create-session.ts | 15 ++++- webapps/console/pages/api/me.ts | 57 +++++++++++++++++++ webapps/ee-api/lib/firebase-auth.ts | 2 +- 4 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 webapps/console/lib/server/origin.ts create mode 100644 webapps/console/pages/api/me.ts diff --git a/webapps/console/lib/server/origin.ts b/webapps/console/lib/server/origin.ts new file mode 100644 index 000000000..b84284145 --- /dev/null +++ b/webapps/console/lib/server/origin.ts @@ -0,0 +1,13 @@ +import { NextApiRequest } from "next"; + +export function getTopLevelDomain(requestDomain: string): string { + const parts = requestDomain.split("."); + if (parts.length < 2) { + return parts[0]; + } + return parts.slice(-2).join("."); +} + +export function getRequestHost(req: NextApiRequest) { + return (req.headers["x-forwarded-host"] || req.headers.host) as string; +} diff --git a/webapps/console/pages/api/fb-auth/create-session.ts b/webapps/console/pages/api/fb-auth/create-session.ts index 1ad0f09b2..2e35883ba 100644 --- a/webapps/console/pages/api/fb-auth/create-session.ts +++ b/webapps/console/pages/api/fb-auth/create-session.ts @@ -3,8 +3,9 @@ import { getLog } from "juava"; import { z } from "zod"; import { createSessionCookie, firebaseAuthCookieName } from "../../../lib/server/firebase-server"; import { ApiError } from "../../../lib/shared/errors"; -import { serialize } from "cookie"; +import { CookieSerializeOptions, serialize } from "cookie"; import { getAppEndpoint } from "../../../lib/domains"; +import { getRequestHost, getTopLevelDomain } from "../../../lib/server/origin"; export const log = getLog("firebase"); @@ -28,7 +29,17 @@ export const api: Api = { throw new ApiError("CSRF error", {}, { status: 401 }); } const { cookie, expiresIn } = await createSessionCookie(idToken); - const options = { maxAge: expiresIn, httpOnly: true, secure, path: "/" }; + const domain = "." + getTopLevelDomain(getRequestHost(req)).split(":")[0]; + console.log("Setting cookie", cookie, domain); + let options: CookieSerializeOptions; + options = { + maxAge: expiresIn, + httpOnly: true, + secure, + path: "/", + sameSite: "lax", + domain, + }; res.setHeader("Set-Cookie", serialize(firebaseAuthCookieName, cookie, options)); return { ok: true }; diff --git a/webapps/console/pages/api/me.ts b/webapps/console/pages/api/me.ts new file mode 100644 index 000000000..5cd6e3a82 --- /dev/null +++ b/webapps/console/pages/api/me.ts @@ -0,0 +1,57 @@ +import { NextApiRequest, NextApiResponse } from "next"; +import { getUser } from "../../lib/api"; +import { getLog } from "juava"; +import { getRequestHost, getTopLevelDomain } from "../../lib/server/origin"; + +const allowedOrigins = process.env.ALLOWED_API_ORIGINS || "*.[originTopLevelDomain],[originTopLevelDomain]"; + +function getMatcher(mask: string): (test: string) => boolean { + if (mask.startsWith("*")) { + const suffix = mask.substring(1); + return (test: string) => { + console.log(`Matching ${mask} (suffix: ${suffix}) with ${test} - wildcard`); + return test.toLowerCase().trim().endsWith(suffix.toLowerCase().trim()); + }; + } else { + return (test: string) => { + console.log(`Matching ${mask} with ${test}`); + return test.toLowerCase().trim() === mask.toLowerCase().trim(); + }; + } +} + +function handleCors(requestDomain: string, origin: string | undefined, res: NextApiResponse) { + if (!origin) { + //pass + return; + } + const originHost = origin.replaceAll("http://", "").replaceAll("https://", "").split(":")[0]; + const topLevelDomain = getTopLevelDomain(requestDomain); + const compiledMasks = allowedOrigins + .split(",") + .map(mask => mask.replaceAll("[originTopLevelDomain]", topLevelDomain)); + if (!compiledMasks.map(getMatcher).find(matcher => matcher(originHost))) { + getLog() + .atError() + .log( + `CORS error - origin ${origin} is not allowed. Masks: ${allowedOrigins} (compiled: ${compiledMasks}), request domain: ${requestDomain}, top level domain: ${topLevelDomain}` + ); + res.status(403).send(`Origin ${origin} is not allowed`); + } else { + res.setHeader("Access-Control-Allow-Origin", origin); + res.setHeader("Access-Control-Allow-Methods", "GET"); + res.setHeader("Access-Control-Allow-Headers", "*"); + res.setHeader("Access-Control-Allow-Credentials", "true"); + } +} + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + const [hostname] = getRequestHost(req).split(":"); + handleCors(hostname, req.headers.origin, res); + const user = await getUser(res, req); + if (!user) { + res.send({ auth: false }); + } else { + res.send({ auth: true, user: user }); + } +} diff --git a/webapps/ee-api/lib/firebase-auth.ts b/webapps/ee-api/lib/firebase-auth.ts index c5c1df24e..eeecdd0c3 100644 --- a/webapps/ee-api/lib/firebase-auth.ts +++ b/webapps/ee-api/lib/firebase-auth.ts @@ -6,7 +6,7 @@ import * as JSON5 from "json5"; const bearerPrefix = "bearer "; -export const firebaseAuthCookieName = "fb-auth"; +export const firebaseAuthCookieName = "fb-auth2"; export type FirebaseToken = { idToken: string; cookieToken?: never } | { idToken?: never; cookieToken: string }; From 9761fb8af9d08e8305de18f45b2e08032ead54f6 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Mon, 10 Jul 2023 21:25:00 -0400 Subject: [PATCH 0033/1353] feat: fixed firebase logout, added optional workspace list to /api/me endpoint --- webapps/console/lib/api.ts | 8 +++-- webapps/console/lib/firebase-client.tsx | 3 +- webapps/console/lib/server/firebase-server.ts | 31 ++++++++++++++----- .../pages/api/fb-auth/create-session.ts | 3 +- .../pages/api/fb-auth/revoke-session.ts | 23 ++++++++++++++ webapps/console/pages/api/me.ts | 26 ++++++++++++++-- 6 files changed, 79 insertions(+), 15 deletions(-) create mode 100644 webapps/console/pages/api/fb-auth/revoke-session.ts diff --git a/webapps/console/lib/api.ts b/webapps/console/lib/api.ts index 461bce2c3..ba05b985e 100644 --- a/webapps/console/lib/api.ts +++ b/webapps/console/lib/api.ts @@ -81,7 +81,11 @@ export function getAuthBearerToken(req: NextApiRequest): string | undefined { return undefined; } -export async function getUser(res: NextApiResponse, req: NextApiRequest): Promise { +export async function getUser( + res: NextApiResponse, + req: NextApiRequest, + checkRevoked?: boolean +): Promise { const bearerToken = getAuthBearerToken(req); if (bearerToken) { const [keyId, secret] = bearerToken.split(":"); @@ -110,7 +114,7 @@ export async function getUser(res: NextApiResponse, req: NextApiRequest): Promis } if (isFirebaseEnabled()) { - return await getFirebaseUser(req); + return await getFirebaseUser(req, checkRevoked); } const session = await getServerSession(req, res, nextAuthConfig); return session ? getUserFromSession(session) : undefined; diff --git a/webapps/console/lib/firebase-client.tsx b/webapps/console/lib/firebase-client.tsx index 1086a00fd..0f5006e20 100644 --- a/webapps/console/lib/firebase-client.tsx +++ b/webapps/console/lib/firebase-client.tsx @@ -106,6 +106,7 @@ async function getUserFromFirebase(currentUser: auth.User): Promise { - await a.signOut(a.getAuth()); + await firebaseSignOut(); }, //user: () => (currentUser ? getUserFromFirebase(currentUser) : undefined), async signIn(username: string, password): Promise { diff --git a/webapps/console/lib/server/firebase-server.ts b/webapps/console/lib/server/firebase-server.ts index e6668d3a3..be42affba 100644 --- a/webapps/console/lib/server/firebase-server.ts +++ b/webapps/console/lib/server/firebase-server.ts @@ -3,7 +3,7 @@ import { NextApiRequest } from "next"; import * as admin from "firebase-admin"; import * as JSON5 from "json5"; -import { getErrorMessage, getSingleton, requireDefined, Singleton } from "juava"; +import { getErrorMessage, getLog, getSingleton, requireDefined, Singleton } from "juava"; export type FirebaseOptions = { admin: any; @@ -82,7 +82,11 @@ export async function createSessionCookie(idToken: string): Promise<{ cookie; ex return { cookie, expiresIn }; } -export async function getFirebaseUser(req: NextApiRequest): Promise { +export async function signOut(firebaseUserId: string): Promise { + await firebase().auth().revokeRefreshTokens(firebaseUserId); +} + +export async function getFirebaseUser(req: NextApiRequest, checkRevoked?: boolean): Promise { const authToken = getFirebaseToken(req); if (!authToken) { return undefined; @@ -90,11 +94,24 @@ export async function getFirebaseUser(req: NextApiRequest): Promise { + await signOut(user.externalId); + const secure = getAppEndpoint(req).protocol === "https"; + res.setHeader( + "Set-Cookie", + serialize(firebaseAuthCookieName, "", { + maxAge: 0, + httpOnly: true, + secure, + }) + ); + }) + .toNextApiHandler(); diff --git a/webapps/console/pages/api/me.ts b/webapps/console/pages/api/me.ts index 5cd6e3a82..6dc8a0096 100644 --- a/webapps/console/pages/api/me.ts +++ b/webapps/console/pages/api/me.ts @@ -1,7 +1,8 @@ import { NextApiRequest, NextApiResponse } from "next"; import { getUser } from "../../lib/api"; -import { getLog } from "juava"; +import { getLog, requireDefined } from "juava"; import { getRequestHost, getTopLevelDomain } from "../../lib/server/origin"; +import { db } from "../../lib/server/db"; const allowedOrigins = process.env.ALLOWED_API_ORIGINS || "*.[originTopLevelDomain],[originTopLevelDomain]"; @@ -45,13 +46,32 @@ function handleCors(requestDomain: string, origin: string | undefined, res: Next } } +async function getWorkspaces(internalUserId: string) { + const userModel = requireDefined( + await db.prisma().userProfile.findUnique({ where: { id: internalUserId } }), + `User ${internalUserId} does not exist` + ); + if (userModel.admin) { + return await db.prisma().workspace.findMany({ where: { deleted: false } }); + } + return ( + await db.prisma().workspaceAccess.findMany({ where: { userId: internalUserId }, include: { workspace: true } }) + ) + .map(res => res.workspace) + .filter(w => !w.deleted); +} + export default async function handler(req: NextApiRequest, res: NextApiResponse) { const [hostname] = getRequestHost(req).split(":"); handleCors(hostname, req.headers.origin, res); - const user = await getUser(res, req); + const user = await getUser(res, req, true); if (!user) { res.send({ auth: false }); } else { - res.send({ auth: true, user: user }); + res.send({ + auth: true, + user: user, + workspaces: req.query.workspaces === "true" ? await getWorkspaces(user.internalId) : undefined, + }); } } From 96961dfde2e8dbbc212cc7be5e55c3d28021060e Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 11 Jul 2023 17:22:59 +0400 Subject: [PATCH 0034/1353] Improve onboarding experience Unify entities titles and icons drawing across all components Provisioning DB name - clear unsupported symbols from slug Remove object name min characters requirement --- .../ConfigObjectEditor/ConfigEditor.tsx | 20 ++++-- .../ConnectionEditorPage.tsx | 28 +++++--- .../ConnectionsDiagram/ConnectionsDiagram.tsx | 29 ++++---- .../components/DataView/EventsBrowser.tsx | 10 ++- .../DestinationsCatalog.tsx | 56 +++++++++------- .../FieldListEditorLayout.tsx | 14 ++-- .../components/ObjectTitle/ObjectTitle.tsx | 24 +++++++ .../ServicesCatalog/ServicesCatalog.tsx | 56 +++++++++------- .../SyncEditorPage/SyncEditorPage.tsx | 43 +++++++----- .../WorkspaceNameAndSlugEditor.tsx | 2 + webapps/console/lib/schema/index.ts | 9 ++- .../pages/[workspaceId]/connections/index.tsx | 31 ++++++++- .../pages/[workspaceId]/destinations.tsx | 55 ++++++++------- .../console/pages/[workspaceId]/functions.tsx | 34 +++------- webapps/console/pages/[workspaceId]/index.tsx | 67 ++++++++++++++----- .../console/pages/[workspaceId]/services.tsx | 46 ++++++------- .../console/pages/[workspaceId]/streams.tsx | 19 +++++- .../pages/[workspaceId]/syncs/index.tsx | 6 +- .../console/pages/api/workspace/slug-check.ts | 9 ++- webapps/ee-api/pages/api/provision-db.ts | 4 +- 20 files changed, 351 insertions(+), 211 deletions(-) create mode 100644 webapps/console/components/ObjectTitle/ObjectTitle.tsx diff --git a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx index 227f22609..9c07303bb 100644 --- a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx +++ b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx @@ -44,6 +44,7 @@ import { EditorField } from "./EditorField"; import { EditorButtons } from "./EditorButtons"; import { ButtonGroup, ButtonProps } from "../ButtonGroup/ButtonGroup"; import cuid from "cuid"; +import { ObjectTitle } from "../ObjectTitle/ObjectTitle"; const log = getLog("ConfigEditor"); @@ -65,6 +66,7 @@ export type ConfigEditorProps listTitle?: ReactNode; type: string; listColumns?: { title: ReactNode; render: (o: T) => ReactNode }[]; + icon?: (o: T) => ReactNode; name?: (o: T) => string; objectType: FunctionLike, T>; fields: Record; @@ -93,6 +95,7 @@ export type ConfigEditorProps editorComponent?: EditorComponentFactory; testConnectionEnabled?: (o: any) => boolean; onTest?: (o: T) => Promise; + backTo?: string; }; export type CustomWidgetProps = { @@ -347,6 +350,7 @@ const SingleObjectEditor: React.FC = props => { newObject = () => ({}), loadMeta, onTest, + backTo, ...otherProps } = props; const [meta, setMeta] = useState(undefined); @@ -402,7 +406,11 @@ const SingleObjectEditor: React.FC = props => { await getConfigApi(workspace.id, type).update(object.id, newObject); //await new Promise(resolve => setTimeout(resolve, 10000000)); } - router.push(`/${workspace.id}/${type}s`); + if (backTo) { + router.push(`/${workspace.id}${backTo}`); + } else { + router.push(`/${workspace.id}/${type}s`); + } } catch (error) { feedbackError("Failed to save object", { error }); } @@ -591,15 +599,16 @@ const ConfigEditor: React.FC = props => { const router = useRouter(); const id = router.query.id as string; const clone = router.query.clone as string; + const backTo = router.query.backTo as string; if (id) { if (id === "new") { if (clone) { - return ; + return ; } else { - return ; + return ; } } else { - return ; + return ; } } else { return ; @@ -617,6 +626,7 @@ const ObjectsList: React.FC<{ objects: any[]; onDelete: (id: string) => Promise< listColumns = [], actions = [], noun, + icon, name = (o: any) => o.name, }) => { const modal = useAntdModal(); @@ -635,7 +645,7 @@ const ObjectsList: React.FC<{ objects: any[]; onDelete: (id: string) => Promise< title: "Name", render: (text, record) => ( - {name(record)} + ), }, diff --git a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx index d00070417..8c4665ac7 100644 --- a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx +++ b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx @@ -17,6 +17,8 @@ import { DataLayoutType } from "@jitsu/protocols/analytics"; import { ChevronLeft } from "lucide-react"; import styles from "./ConnectionEditorPage.module.css"; import { JitsuButton } from "../JitsuButton/JitsuButton"; +import { StreamTitle } from "../../pages/[workspaceId]/streams"; +import { DestinationTitle } from "../../pages/[workspaceId]/destinations"; const log = getLog("ConnectionEditorPage"); @@ -42,11 +44,18 @@ function DestinationSelector(props: SelectorProps) { const destinationType = getCoreDestinationType(destination.destinationType); return ( -
-
{destinationType.icon}
-
{destination.name}
-
({destinationType.title})
-
+ { + return ( +
+
{destination.name}
+
({destinationType.title})
+
+ ); + }} + />
); })} @@ -70,7 +79,7 @@ function SourceSelector(props: SelectorProps) { @@ -541,7 +550,6 @@ function ConnectionEditor({ const functionId = "udf." + func.id; configItems.push({ group: "Functions", - documentation: func.description, name: func.name, link: `/functions?id=${func.id}`, component: ( @@ -625,7 +633,11 @@ function ConnectionEditor({ await get(`/api/${workspace.id}/config/link`, { body: { fromId: srcId, toId: dstId, type: "push", data: connectionOptions }, }); - router.back(); + if (router.query.backTo) { + router.push(`/${workspace.id}${router.query.backTo}`); + } else { + router.back(); + } } catch (error) { feedbackError(`Can't link destinations`, { error }); } finally { diff --git a/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx b/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx index 76d315fc7..c5ae98b49 100644 --- a/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx +++ b/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx @@ -100,14 +100,17 @@ export const ConnectionsDiagram: React.FC = ({ connectio .forEach((r, idx) => { const rel = getRelativePosition(canvasRef.current!, r!); const bounds = r!.getBoundingClientRect(); + const source = sources[idx]; const selected = - mouseOverSrc === sources[idx].id || - (!!mouseOverDst && !!connections.find(c => c.from === sources[idx].id && c.to === mouseOverDst)); - newLines.push({ - from: { top: rel.top + bounds.height / 2, left: rel.left + bounds.width }, - to: { left: logoPosition.left, top: logoPosition.top + logoBounds.height / 2 }, - selected, - }); + mouseOverSrc === source.id || + (!!mouseOverDst && !!connections.find(c => c.from === source.id && c.to === mouseOverDst)); + if (connections.find(c => c.from === source.id)) { + newLines.push({ + from: { top: rel.top + bounds.height / 2, left: rel.left + bounds.width }, + to: { left: logoPosition.left, top: logoPosition.top + logoBounds.height / 2 }, + selected, + }); + } }); dstRefs.current @@ -124,11 +127,13 @@ export const ConnectionsDiagram: React.FC = ({ connectio setForceSelectDestination([destination.id]); setForceSelectSource(connections.filter(c => c.to === destination.id).map(c => c.from)); } - newLines.push({ - to: { top: rel.top + bounds.height / 2, left: rel.left }, - from: { left: logoPosition.left + logoBounds.width, top: logoPosition.top + logoBounds.height / 2 }, - selected, - }); + if (connections.find(c => c.to === destination.id)) { + newLines.push({ + to: { top: rel.top + bounds.height / 2, left: rel.left }, + from: { left: logoPosition.left + logoBounds.width, top: logoPosition.top + logoBounds.height / 2 }, + selected, + }); + } }); setLines(newLines); diff --git a/webapps/console/components/DataView/EventsBrowser.tsx b/webapps/console/components/DataView/EventsBrowser.tsx index 51ff10dd7..00e5137ce 100644 --- a/webapps/console/components/DataView/EventsBrowser.tsx +++ b/webapps/console/components/DataView/EventsBrowser.tsx @@ -20,6 +20,8 @@ import { FunctionConfig } from "../../lib/schema"; import { arrayToMap } from "../../lib/shared/arrays"; import { RefreshCw } from "lucide-react"; import { JitsuButton } from "../JitsuButton/JitsuButton"; +import { ConnectionTitle } from "../../pages/[workspaceId]/connections"; +import { StreamTitle } from "../../pages/[workspaceId]/streams"; dayjs.extend(utc); dayjs.extend(relativeTime); @@ -278,13 +280,9 @@ export const EventsBrowser = ({ value: entity[0], label: entity[1].type === "stream" ? ( - entity[1].name + ) : ( -
- {entity[1].stream?.name || "unknown"} - {"→"} - -
+ ), })); } else { diff --git a/webapps/console/components/DestinationsCatalog/DestinationsCatalog.tsx b/webapps/console/components/DestinationsCatalog/DestinationsCatalog.tsx index 3dc7bdbc2..9a8e7ffba 100644 --- a/webapps/console/components/DestinationsCatalog/DestinationsCatalog.tsx +++ b/webapps/console/components/DestinationsCatalog/DestinationsCatalog.tsx @@ -1,4 +1,4 @@ -import { useMemo } from "react"; +import React, { useMemo } from "react"; import styles from "./DestinationsCatalog.module.css"; import { coreDestinations, DestinationType } from "../../lib/schema/destinations"; @@ -48,34 +48,38 @@ export function getDestinationIcon(destination?: DestinationType) { export const DestinationCatalog: React.FC<{ onClick: (destinationType: string) => void }> = ({ onClick }) => { const groups = useMemo(() => groupDestinationTypes(), []); return ( -
- {Object.entries(groups).map(([tag, destinations]) => ( -
-
{tag}
-
- {destinations.map(destination => ( -
onClick(destination.id)} - > - {destination.comingSoon && ( -
- Coming soon +
+
+ {Object.entries(groups).map(([tag, destinations]) => ( +
+
{tag}
+
+ {destinations.map(destination => ( +
onClick(destination.id)} + > + {destination.comingSoon && ( +
+ Coming soon +
+ )} +
{getDestinationIcon(destination)}
+
+
+ {destination.title} +
+ {destination.description &&
{destination.description}
}
- )} -
{getDestinationIcon(destination)}
-
-
{destination.title}
- {destination.description &&
{destination.description}
}
-
- ))} + ))} +
-
- ))} + ))} +
); }; diff --git a/webapps/console/components/FieldListEditorLayout/FieldListEditorLayout.tsx b/webapps/console/components/FieldListEditorLayout/FieldListEditorLayout.tsx index 8c2cbae88..36ad015b3 100644 --- a/webapps/console/components/FieldListEditorLayout/FieldListEditorLayout.tsx +++ b/webapps/console/components/FieldListEditorLayout/FieldListEditorLayout.tsx @@ -85,12 +85,14 @@ const EditorItemTable: React.FC<{ items: Omit[]; className?
{item.name && (
- - {item.link && ( - - - - )} +
+ + {item.link && ( + + + + )} +
)}
{item.component}
diff --git a/webapps/console/components/ObjectTitle/ObjectTitle.tsx b/webapps/console/components/ObjectTitle/ObjectTitle.tsx new file mode 100644 index 000000000..a627c6b61 --- /dev/null +++ b/webapps/console/components/ObjectTitle/ObjectTitle.tsx @@ -0,0 +1,24 @@ +import React from "react"; + +export const ObjectTitle: React.FC<{ + size?: "small" | "default" | "large"; + icon?: React.ReactNode; + title: string | React.ReactNode; +}> = ({ icon, title, size = "default" }) => { + const iconClassName = (() => { + switch (size) { + case "small": + return "h-4 w-4"; + case "large": + return "h-10 w-10"; + default: + return "h-6 w-6"; + } + })(); + return ( +
+ {icon &&
{icon}
} +
{title}
+
+ ); +}; diff --git a/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx b/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx index 3acb9438d..7c3b515bc 100644 --- a/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx +++ b/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx @@ -65,7 +65,7 @@ export const ServicesCatalog: React.FC<{ onClick: (packageType, packageId: strin } const groups = groupByType(data.sources); return ( -
+
- {Object.entries(groups).map(([group, sources]) => { - const filtered = sources.filter(source => source.meta.name.toLowerCase().includes(filter.toLowerCase())); - if (filtered.length === 0) { - return null; - } - return ( -
-
{group === "api" ? "API" : capitalize(group)}
-
- {filtered.map(source => { - return ( -
onClick(source.packageType, source.packageId)} - > -
{getDestinationIcon(source)}
-
-
{source.meta.name}
+
+ {Object.entries(groups).map(([group, sources]) => { + const filtered = sources.filter(source => source.meta.name.toLowerCase().includes(filter.toLowerCase())); + if (filtered.length === 0) { + return null; + } + return ( +
+
+ {group === "api" ? "API" : capitalize(group)} +
+
+ {filtered.map(source => { + return ( +
onClick(source.packageType, source.packageId)} + > +
{getDestinationIcon(source)}
+
+
{source.meta.name}
+
-
- ); - })} + ); + })} +
-
- ); - })} + ); + })} +
); }; diff --git a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx index 8c50ba082..dc37e4b52 100644 --- a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx +++ b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx @@ -18,6 +18,8 @@ import { JitsuButton } from "../JitsuButton/JitsuButton"; import { LoadingAnimation } from "../GlobalLoader/GlobalLoader"; import hash from "stable-hash"; import { CodeEditor } from "../CodeEditor/CodeEditor"; +import { DestinationTitle } from "../../pages/[workspaceId]/destinations"; +import { ServiceTitle } from "../../pages/[workspaceId]/services"; const log = getLog("SyncEditorPage"); @@ -42,11 +44,18 @@ function DestinationSelector(props: SelectorProps) { } return ( -
-
{destinationType.icon}
-
{destination.name}
-
({destinationType.title})
-
+ { + return ( +
+
{destination.name}
+
({destinationType.title})
+
+ ); + }} + />
); })} @@ -70,18 +79,18 @@ function ServiceSelector(props: SelectorProps) { diff --git a/webapps/console/components/WorkspaceNameAndSlugEditor/WorkspaceNameAndSlugEditor.tsx b/webapps/console/components/WorkspaceNameAndSlugEditor/WorkspaceNameAndSlugEditor.tsx index 6b7b11f43..145773597 100644 --- a/webapps/console/components/WorkspaceNameAndSlugEditor/WorkspaceNameAndSlugEditor.tsx +++ b/webapps/console/components/WorkspaceNameAndSlugEditor/WorkspaceNameAndSlugEditor.tsx @@ -53,10 +53,12 @@ export function WorkspaceNameAndSlugEditor({ value={slug} size="large" onChange={e => { + //setSlug(e.target.value ? e.target.value.toLowerCase().replaceAll(/[^a-z0-9-]/g, "") : ""); setSlug(e.target.value); setChanged(true); }} /> +
{slugError}
{displayId && ( <>
Workspace Id
diff --git a/webapps/console/lib/schema/index.ts b/webapps/console/lib/schema/index.ts index c6ddaccf7..25660ca31 100644 --- a/webapps/console/lib/schema/index.ts +++ b/webapps/console/lib/schema/index.ts @@ -95,7 +95,7 @@ export type ApiKey = z.infer; export const StreamConfig = ConfigEntityBase.merge( z.object({ - name: z.string().min(5).optional(), + name: z.string(), domains: z.array(z.string()).optional(), authorizedJavaScriptDomains: z.string().optional(), publicKeys: z.array(ApiKey).optional(), @@ -109,7 +109,7 @@ export const DestinationConfig = ConfigEntityBase.merge( .object({ destinationType: z.string(), provisioned: z.boolean().optional(), - name: z.string().min(5), + name: z.string(), }) .passthrough() ); @@ -117,8 +117,7 @@ export type DestinationConfig = z.infer; export const FunctionConfig = ConfigEntityBase.merge( z.object({ - name: z.string().min(5), - description: z.string().optional(), + name: z.string(), code: z.string(), }) ); @@ -126,7 +125,7 @@ export type FunctionConfig = z.infer; export const ServiceConfig = ConfigEntityBase.merge( z.object({ - name: z.string().min(5), + name: z.string(), protocol: z.enum(["airbyte"]).default("airbyte"), authorized: z.boolean().optional(), package: z.string(), diff --git a/webapps/console/pages/[workspaceId]/connections/index.tsx b/webapps/console/pages/[workspaceId]/connections/index.tsx index 412878bbe..c2d63b511 100644 --- a/webapps/console/pages/[workspaceId]/connections/index.tsx +++ b/webapps/console/pages/[workspaceId]/connections/index.tsx @@ -22,6 +22,7 @@ import { PlusOutlined } from "@ant-design/icons"; import { JitsuButton, WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; import { DestinationTitle } from "../destinations"; import { ButtonGroup, ButtonProps } from "../../../components/ButtonGroup/ButtonGroup"; +import { StreamTitle } from "../streams"; function EmptyLinks() { const workspace = useWorkspace(); @@ -42,6 +43,30 @@ function EmptyLinks() { ); } +export const ConnectionTitle: React.FC<{ + connectionId: string; + stream: StreamConfig; + destination: DestinationConfig; + showLink?: boolean; +}> = ({ connectionId, stream, destination, showLink = false }) => { + return ( +
+ + {"→"} + + {showLink && ( + } + /> + )} +
+ ); +}; + type ConfigurationLinkDbModel = z.infer; type RemoteEntitiesProps = { @@ -110,13 +135,13 @@ function ConnectionsTable({ links, streams, destinations, reloadCallback }: Remo } return (
-
{stream.name}
+ } + icon={} />
); @@ -143,7 +168,7 @@ function ConnectionsTable({ links, streams, destinations, reloadCallback }: Remo } + icon={} className="link" size="small" href={`/${workspace.id}/destinations?id=${link.toId}`} diff --git a/webapps/console/pages/[workspaceId]/destinations.tsx b/webapps/console/pages/[workspaceId]/destinations.tsx index c8dd18795..eee5e3bf1 100644 --- a/webapps/console/pages/[workspaceId]/destinations.tsx +++ b/webapps/console/pages/[workspaceId]/destinations.tsx @@ -16,7 +16,7 @@ import { PropertyUI, } from "../../lib/schema/destinations"; import { DestinationCatalog, getDestinationIcon } from "../../components/DestinationsCatalog/DestinationsCatalog"; -import { useWorkspace } from "../../lib/context"; +import { useAppConfig, useWorkspace } from "../../lib/context"; import { useRouter } from "next/router"; import { assertDefined, getLog, requireDefined, rpc } from "juava"; import React, { PropsWithChildren, useState } from "react"; @@ -38,6 +38,7 @@ import { UpgradeDialog } from "../../components/Billing/UpgradeDialog"; import { ProvisionDatabaseButton } from "../../components/ProvisionDatabaseButton/ProvisionDatabaseButton"; import Link from "next/link"; import { CodeEditor } from "../../components/CodeEditor/CodeEditor"; +import { ObjectTitle } from "../../components/ObjectTitle/ObjectTitle"; const log = getLog("destinations"); const Loader: React.FC<{}> = () => { @@ -198,24 +199,15 @@ function getEditorComponent(editor: string, editorProps?: any) { export const DestinationTitle: React.FC<{ destination?: DestinationConfig; size?: "small" | "default" | "large"; - title?: (d: DestinationConfig, t: DestinationType) => string; + title?: (d: DestinationConfig, t: DestinationType) => string | React.ReactNode; }> = ({ destination, title = (d, t) => d.name, size = "default" }) => { const destinationType = coreDestinationsMap[destination?.destinationType ?? ""]; - const iconClassName = (() => { - switch (size) { - case "small": - return "h-4 w-4"; - case "large": - return "h-16 w-16"; - default: - return "h-8 w-8"; - } - })(); return ( -
-
{getDestinationIcon(destinationType)}
-
{destination ? title(destination, destinationType) : "Unknown destination"}
-
+ ); }; @@ -520,7 +512,7 @@ const ProvisionedDestinations = () => {
Provisioned Destinations
- Provisioned destinations are manager by {branding.productName} + Provisioned destinations are managed by {branding.productName}
= ({ type }) => { defaultVal: false, type: serialization.bool, }); + const appConfig = useAppConfig(); const router = useRouter(); const workspace = useWorkspace(); const extraFields: Record = Object.entries(getAllDestinationFields(type)).reduce( @@ -577,7 +570,7 @@ const DestinationsList: React.FC<{ type?: string }> = ({ type }) => { }, {} ); - log.atInfo().log("extraFields", extraFields); + log.atDebug().log("extraFields", extraFields); const config: ConfigEditorProps = { actions: [ // { @@ -594,10 +587,17 @@ const DestinationsList: React.FC<{ type?: string }> = ({ type }) => { // }, ], filter: (obj: DestinationConfig) => !obj.provisioned, + icon: (d: DestinationConfig) => { + const destinationType = coreDestinationsMap[d.destinationType]; + return getDestinationIcon(destinationType); + }, listColumns: [ { title: "Type", - render: (c: DestinationConfig) => t.title} />, + render: (d: DestinationConfig) => { + const destinationType = coreDestinationsMap[d.destinationType]; + return {destinationType.title}; + }, }, ], newObject: () => { @@ -660,7 +660,12 @@ const DestinationsList: React.FC<{ type?: string }> = ({ type }) => { return ( <> setShowCatalog(false)} @@ -668,12 +673,16 @@ const DestinationsList: React.FC<{ type?: string }> = ({ type }) => { > { - setShowCatalog(false); - router.push(`/${workspace.id}/destinations?id=new&destinationType=${destination}`); + const url = `/${ + workspace.id + }/destinations?id=new&destinationType=${destination}&backTo=${encodeURIComponent( + (router.query.backTo ?? "") as string + )}`; + router.push(url); }} /> - {!router.query.id && ( + {!router.query.id && appConfig.ee?.available && (
diff --git a/webapps/console/pages/[workspaceId]/functions.tsx b/webapps/console/pages/[workspaceId]/functions.tsx index 11ea075f4..44688b800 100644 --- a/webapps/console/pages/[workspaceId]/functions.tsx +++ b/webapps/console/pages/[workspaceId]/functions.tsx @@ -6,8 +6,8 @@ import { useRouter } from "next/router"; import { getLog } from "juava"; import React from "react"; import { FunctionSquare } from "lucide-react"; -import { Tooltip } from "antd"; import { FunctionsDebugger } from "../../components/FunctionsDebugger/FunctionsDebugger"; +import { ObjectTitle } from "../../components/ObjectTitle/ObjectTitle"; const log = getLog("functions"); @@ -29,27 +29,14 @@ const Functions: React.FC = () => { export const FunctionTitle: React.FC<{ f?: FunctionConfig; size?: "small" | "default" | "large"; - title?: (d?: FunctionConfig) => string; + title?: (d?: FunctionConfig) => string | React.ReactNode; }> = ({ f, title = d => d?.name ?? "function", size = "default" }) => { - const iconClassName = (() => { - switch (size) { - case "small": - return "h-4 w-4"; - case "large": - return "h-16 w-16"; - default: - return "h-8 w-8"; - } - })(); return ( -
-
- -
-
- {title(f)} -
-
+ } + size={size} + title={f ? title(f) : "Unknown function"} + /> ); }; @@ -57,12 +44,6 @@ const FunctionsList: React.FC<{}> = () => { const router = useRouter(); const workspace = useWorkspace(); const config: ConfigEditorProps = { - listColumns: [ - { - title: "Description", - render: (c: FunctionConfig) => <>{c.description ?? ""}, - }, - ], editorComponent: () => FunctionsDebugger, objectType: FunctionConfig, fields: { @@ -72,6 +53,7 @@ const FunctionsList: React.FC<{}> = () => { }, noun: "function", type: "function", + icon: f => , explanation: (
Functions let you apply transformations to incoming events. Examples of such transformations diff --git a/webapps/console/pages/[workspaceId]/index.tsx b/webapps/console/pages/[workspaceId]/index.tsx index 44a98873a..0dfddd10c 100644 --- a/webapps/console/pages/[workspaceId]/index.tsx +++ b/webapps/console/pages/[workspaceId]/index.tsx @@ -19,20 +19,26 @@ import { ConnectionsDiagram } from "../../components/ConnectionsDiagram/Connecti import { getLog } from "juava"; import { Chrome } from "lucide-react"; import classNames from "classnames"; +import { useRouter } from "next/router"; function Welcome({ destinations, streams, + links, }: { streams: StreamConfig[]; destinations: DestinationConfig[]; links: any[]; }) { let step = -1; - if (streams.length > 0 && destinations.length > 0) { + if (streams.length > 0 && destinations.length > 0 && links.length > 0) { + step = 3; + } else if (streams.length > 0 && destinations.length > 0) { step = 2; } else if (streams.length > 0) { step = 1; + } else { + step = 0; } return (
@@ -57,7 +63,7 @@ function Welcome({ description={ streams.length === 0 ? ( <> - Click here to add it! + Click here to add it! ) : ( <> @@ -87,22 +93,47 @@ function Welcome({ description={ destinations.length === 0 ? ( <> - Click here to add it! + Click here to add it! ) : ( <> - Congratulations! You have {destinations.length} destinations configured. You can always change{" "} - settings here + Congratulations! You have{" "} + + {destinations.length} {destinations.length > 1 ? "destinations" : "destination"} + {" "} + configured. ) } /> + Link your site with destination{" "} + {links.length > 0 ? ( + <> + {" "} + - done! + + ) : ( + "" + )} + + } description={ - - Edit site & destination connections - + links.length === 0 ? ( + <> + Click here to add it! + + ) : ( + <> + Congratulations! You have{" "} + + {links.length} {links.length > 1 ? "connections" : "connection"} + {" "} + configured. + + ) } /> - Fist, add at list one site + Fist, add at list one site ) : ( <> @@ -160,8 +191,8 @@ function Card({ const card = (
-
-
{icon}
+
+
{icon}
{title}
@@ -212,7 +243,7 @@ function DestinationCard({ dest, selected }: { dest: DestinationConfig; selected ); } -const FaviconLoader: React.FC<{ potentialUrl?: string }> = ({ potentialUrl }) => { +export const FaviconLoader: React.FC<{ potentialUrl?: string }> = ({ potentialUrl }) => { const [faviconUrl, setFaviconUrl] = useState(null); useEffect(() => { (async () => { @@ -240,7 +271,11 @@ const FaviconLoader: React.FC<{ potentialUrl?: string }> = ({ potentialUrl }) => } })(); }, [potentialUrl]); - return faviconUrl ? : ; + return faviconUrl ? ( + + ) : ( + + ); }; function WorkspaceOverview(props: { @@ -248,10 +283,12 @@ function WorkspaceOverview(props: { destinations: DestinationConfig[]; links: ConfigurationLinkDbModel[]; }) { + const router = useRouter(); const workspace = useWorkspace(); const { destinations, streams, links } = props; useTitle(`${branding.productName} : ${workspace.name}`); - const configurationFinished = streams.length > 0 && destinations.length > 0; + const configurationFinished = + !router.query.welcome && streams.length > 0 && destinations.length > 0 && links.length > 0; return (
{!configurationFinished && } diff --git a/webapps/console/pages/[workspaceId]/services.tsx b/webapps/console/pages/[workspaceId]/services.tsx index b5114e6c6..aca9dc6fa 100644 --- a/webapps/console/pages/[workspaceId]/services.tsx +++ b/webapps/console/pages/[workspaceId]/services.tsx @@ -5,7 +5,7 @@ import { useWorkspace } from "../../lib/context"; import { useRouter } from "next/router"; import { getLog, hash as jhash, randomId, rpc } from "juava"; import React from "react"; -import { Modal, Tooltip } from "antd"; +import { Modal } from "antd"; import { serialization, useURLPersistedState } from "../../lib/ui"; import { ServicesCatalog } from "../../components/ServicesCatalog/ServicesCatalog"; import { SourceType } from "../api/sources"; @@ -13,6 +13,7 @@ import hash from "stable-hash"; import { ServiceEditor } from "../../components/ServiceEditor/ServiceEditor"; import { ErrorCard } from "../../components/GlobalError/GlobalError"; import { syncError } from "../../lib/shared/errors"; +import { ObjectTitle } from "../../components/ObjectTitle/ObjectTitle"; const log = getLog("services"); @@ -29,32 +30,19 @@ const Services: React.FC = () => { export const ServiceTitle: React.FC<{ service?: ServiceConfig; size?: "small" | "default" | "large"; - title?: (d: ServiceConfig) => string; + title?: (d: ServiceConfig) => string | React.ReactNode; }> = ({ service, title = d => d.name, size = "default" }) => { - const iconClassName = (() => { - switch (size) { - case "small": - return "h-4 w-4"; - case "large": - return "h-16 w-16"; - default: - return "h-8 w-8"; - } - })(); return ( -
-
+ -
-
- - {service ? title(service) : "Unknown service"} - -
-
+ } + size={size} + title={service ? title(service) : "Unknown service"} + /> ); }; @@ -81,7 +69,7 @@ const ServicesList: React.FC<{}> = () => { listColumns: [ { title: "Package", - render: (c: ServiceConfig) => `${c?.package}:${c?.version}`} />, + render: (s: ServiceConfig) => {`${s?.package}:${s?.version}`}, }, ], objectType: ServiceConfig, @@ -94,6 +82,12 @@ const ServicesList: React.FC<{}> = () => { noun: "service", type: "service", explanation: "Services are used to connect to external systems", + icon: s => ( + {s?.package} + ), editorComponent: () => ServiceEditor, loadMeta: async (obj?: ServiceConfig) => { let packageType = ""; @@ -179,7 +173,12 @@ const ServicesList: React.FC<{}> = () => { return ( <> setShowCatalog(false)} @@ -187,7 +186,6 @@ const ServicesList: React.FC<{}> = () => { > { - setShowCatalog(false); router.push( `/${workspace.id}/services?id=new&packageType=${packageType}&packageId=${encodeURIComponent(packageId)}` ); diff --git a/webapps/console/pages/[workspaceId]/streams.tsx b/webapps/console/pages/[workspaceId]/streams.tsx index e05fb1fc0..f4ced8e5e 100644 --- a/webapps/console/pages/[workspaceId]/streams.tsx +++ b/webapps/console/pages/[workspaceId]/streams.tsx @@ -21,6 +21,8 @@ import type { DomainStatus } from "../../lib/server/ee"; import { getAntdModal, useAntdModal } from "../../lib/modal"; import { get } from "../../lib/useApi"; import { Wrench } from "lucide-react"; +import { FaviconLoader } from "./index"; +import { ObjectTitle } from "../../components/ObjectTitle/ObjectTitle"; const Streams: React.FC = () => { return ( @@ -295,6 +297,20 @@ const DomainsEditor: React.FC> = props => { ); }; +export const StreamTitle: React.FC<{ + stream?: StreamConfig; + size?: "small" | "default" | "large"; + title?: (s: StreamConfig) => string | React.ReactNode; +}> = ({ stream, title = s => s.name, size = "default" }) => { + return ( + } + size={size} + title={stream ? title(stream) : "Unknown stream"} + /> + ); +}; + const StreamsList: React.FC<{}> = () => { const workspace = useWorkspace(); const noun = "site"; @@ -320,6 +336,7 @@ const StreamsList: React.FC<{}> = () => { ), objectType: StreamConfig, + icon: s => , actions: [ { icon: , @@ -346,7 +363,7 @@ const StreamsList: React.FC<{}> = () => {
{domain}
- +
diff --git a/webapps/console/pages/[workspaceId]/syncs/index.tsx b/webapps/console/pages/[workspaceId]/syncs/index.tsx index e1f1e7e48..87ae79246 100644 --- a/webapps/console/pages/[workspaceId]/syncs/index.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/index.tsx @@ -149,7 +149,7 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt type="link" className="link" size="small" - icon={} + icon={} />
); @@ -175,7 +175,7 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt } + icon={} className="link" size="small" href={`/${workspace.id}/destinations?id=${link.toId}`} @@ -471,7 +471,7 @@ export const SyncTitle: React.FC<{ type="link" className="link" size="small" - icon={} + icon={} /> )}
diff --git a/webapps/console/pages/api/workspace/slug-check.ts b/webapps/console/pages/api/workspace/slug-check.ts index abb23605e..af304871a 100644 --- a/webapps/console/pages/api/workspace/slug-check.ts +++ b/webapps/console/pages/api/workspace/slug-check.ts @@ -30,9 +30,12 @@ const api: Api = { const { slug } = query; if (slug.length < 5) { return { valid: false, reason: "Slug must be at least 5 characters long" }; - } else if (/[^a-z0-9\\-]/.test(slug)) { - return { valid: false, reason: "Slug must only contain lowercase letters and numbers" }; - } else if (slug.charAt(0) >= "0" && slug.charAt(0) <= "9") { + } else if (/[^a-z0-9-]/.test(slug)) { + return { + valid: false, + reason: "Slug must only contain lowercase letters, numbers or hyphen and start with a letter", + }; + } else if ((slug.charAt(0) >= "0" && slug.charAt(0) <= "9") || slug.charAt(0) === "-") { return { valid: false, reason: "Slug can't start with a digit" }; } const currentSlug = await db.prisma().workspace.findFirst({ where: { slug } }); diff --git a/webapps/ee-api/pages/api/provision-db.ts b/webapps/ee-api/pages/api/provision-db.ts index 255f4f787..8082cec5e 100644 --- a/webapps/ee-api/pages/api/provision-db.ts +++ b/webapps/ee-api/pages/api/provision-db.ts @@ -119,8 +119,8 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse }); } const dbCredentials = await createAccount({ - username: slug.replace("-", "_"), - database: slug.replace("-", "_"), + username: slug.replaceAll("-", "_"), + database: slug.replaceAll("-", "_"), password: randomId(24), cluster: clickhouseClusterName, }); From d0c715513eb7ee970dbb3e9ade84bba901672812 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 11 Jul 2023 19:13:52 +0400 Subject: [PATCH 0035/1353] Fix for minWidth handling --- .../PageLayout/WorkspacePageLayout.module.css | 2 +- .../PageLayout/WorkspacePageLayout.tsx | 20 ++++++++++--------- webapps/console/styles/globals.css | 2 +- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.module.css b/webapps/console/components/PageLayout/WorkspacePageLayout.module.css index 00d56e1be..0de1f94f0 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.module.css +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.module.css @@ -1,4 +1,4 @@ .widthControl { max-width: 1500px; - min-width: 1000px; + min-width: 1024px; } diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index f1d4fd68d..8a19454fd 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -241,7 +241,7 @@ export const TopTabsMenu: React.FC = props => { const router = useRouter(); return ( -
+
{props.items .filter(i => !i.hidden) .map(item => { @@ -249,9 +249,7 @@ export const TopTabsMenu: React.FC = props => { return (
= props => { selected ? "text-neutral-800" : "text-neutral-500" }`} > -
{item.icon}
+
{item.icon}
{item.title}
@@ -443,7 +441,11 @@ const WorkspaceSettingsModal: React.FC<{ onSuccess: () => void }> = ({ onSuccess const log = getLog("WorkspacePageLayout"); export const VerticalSection: React.FC> = ({ children, className }) => { - return
{children}
; + return ( +
+ {children} +
+ ); }; export const WidthControl: React.FC> = ({ children, className }) => { @@ -471,7 +473,7 @@ export const WorkspacePageLayout: React.FC> = const pHeader = ( - + @@ -501,7 +503,7 @@ export const WorkspacePageLayout: React.FC> =
> = )} - {children} + {children}
diff --git a/webapps/console/styles/globals.css b/webapps/console/styles/globals.css index 9f5b9dbdf..e975734a9 100644 --- a/webapps/console/styles/globals.css +++ b/webapps/console/styles/globals.css @@ -39,7 +39,7 @@ body { height: 100vh; width: 100vw; - overflow-x: auto; + overflow-x: scroll; overflow-y: auto; } From 9f217f4c647e433fef67f99a76b3ab5de57b86ea Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Tue, 11 Jul 2023 18:00:11 -0400 Subject: [PATCH 0036/1353] feat: tsv export for users --- webapps/console/pages/api/admin/users.ts | 76 +++++++++++------------- 1 file changed, 36 insertions(+), 40 deletions(-) diff --git a/webapps/console/pages/api/admin/users.ts b/webapps/console/pages/api/admin/users.ts index e2b09a8bb..c544cdda6 100644 --- a/webapps/console/pages/api/admin/users.ts +++ b/webapps/console/pages/api/admin/users.ts @@ -1,16 +1,16 @@ -import { createRoute } from "../../../lib/api"; +import { getUser } from "../../../lib/api"; import { z } from "zod"; -import { assertDefined, assertTrue, requireDefined } from "juava"; +import { assertDefined, assertTrue, getErrorMessage, getLog, requireDefined } from "juava"; import { firebase, isFirebaseEnabled } from "../../../lib/server/firebase-server"; import { db } from "../../../lib/server/db"; import { SessionUser } from "../../../lib/schema"; -import { auth } from "firebase-admin"; -import UserRecord = auth.UserRecord; +import { NextApiRequest, NextApiResponse } from "next"; const ResultUser = z.object({ internalId: z.string().optional(), externalId: z.string().optional(), email: z.string().optional(), + created: z.string().optional(), name: z.string().optional(), userInfo: z.object({}).passthrough().optional(), }); @@ -31,55 +31,51 @@ function usr(u: any, extended?: boolean) { externalId: u.uid, email: u.email, name: u.displayName, + created: new Date(u.metadata.creationTime).toISOString(), userInfo: extended ? u : undefined, }; } -export default createRoute() - .GET({ - auth: true, - query: z.object({ - extended: z.boolean().optional(), - internalId: z.string().optional(), - externalId: z.string().optional(), - }), - result: z.object({ - users: z.array(ResultUser), - }), - }) - .handler(async ({ user, query: { extended, externalId } }) => { +function isTrueish(v: any) { + return v === "true" || v === true || v === 1 || v === "1"; +} + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + try { + const user = requireDefined(await getUser(res, req, true), `User is not authenticated`); await check(user); - const users: ResultUser[] = []; + const { externalId, internalId, extended, format } = req.query; + const users: any[] = []; + if (externalId) { - const u = requireDefined(await firebase().auth().getUser(externalId), `User ${externalId} does not exist`); + const u = requireDefined( + await firebase() + .auth() + .getUser(externalId as string), + `User ${externalId} does not exist` + ); users.push(usr(u, true)); } else { let nextPageToken: string | undefined = undefined; do { const usersPage = await firebase().auth().listUsers(1000, nextPageToken); nextPageToken = usersPage.pageToken; - usersPage.users.forEach(u => users.push(usr(u, extended))); + usersPage.users.forEach(u => users.push(usr(u, isTrueish(extended)))); } while (nextPageToken); } - return { users }; - }) - .POST({ - auth: true, - body: z.object({ - externalId: z.string(), - }), - result: z.object({ - token: z.string(), - }), - }) - .handler(async ({ req, user, body }) => { - await check(user); + if (format === "tsv") { + const lines = users.map(u => [u.internalId, u.externalId, u.email, u.name, u.created].join("\t")); + const header = ["internalId", "externalId", "email", "name", "created"].join("\t"); + const tsv = [header, ...lines].join("\n"); - const firebaseUser = await firebase().auth().getUser(body.externalId); - const token = await firebase() - .auth() - .createCustomToken(firebaseUser.uid, { internalId: firebaseUser.customClaims?.internalId }); - return { token }; - }) - .toNextApiHandler(); + res.setHeader("Content-Type", "text/plain"); + res.status(200).send(tsv); + return tsv; + } + res.status(200).send({ users }); + } catch (e) { + res.status(500).send(getErrorMessage(e)); + getLog().atError().withCause(e).log("Error obtaining list of platform users"); + } +} From c9023ad3ed0178860c7df874f1a03ab46a89c78d Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Tue, 11 Jul 2023 20:43:41 -0400 Subject: [PATCH 0037/1353] fix: rotated fb-cookie --- webapps/console/lib/server/firebase-server.ts | 6 +++--- webapps/console/pages/api/admin/users.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/webapps/console/lib/server/firebase-server.ts b/webapps/console/lib/server/firebase-server.ts index be42affba..948436183 100644 --- a/webapps/console/lib/server/firebase-server.ts +++ b/webapps/console/lib/server/firebase-server.ts @@ -57,7 +57,7 @@ export function firebase(): admin.app.App { return requireDefined(firebaseService(), `Something went wrong, firebaseService is not initialized`); } -export const firebaseAuthCookieName = "fb-auth"; +export const firebaseAuthCookieName = "fb-auth2"; export type FirebaseToken = { idToken: string; cookieToken?: never } | { idToken?: never; cookieToken: string }; @@ -96,7 +96,7 @@ export async function getFirebaseUser(req: NextApiRequest, checkRevoked?: boolea getLog() .atDebug() - .log(`authToken (${checkRevoked}): ${JSON.stringify(authToken)}`); + .log(`authToken (${(checkRevoked = !!checkRevoked)}): ${JSON.stringify(authToken)}`); let decodedIdToken; try { @@ -104,7 +104,7 @@ export async function getFirebaseUser(req: NextApiRequest, checkRevoked?: boolea ? await firebase().auth().verifyIdToken(authToken.idToken) : await firebase() .auth() - .verifySessionCookie(authToken.cookieToken as string, !!checkRevoked); + .verifySessionCookie(authToken.cookieToken as string, checkRevoked); } catch (e) { getLog() .atWarn() diff --git a/webapps/console/pages/api/admin/users.ts b/webapps/console/pages/api/admin/users.ts index c544cdda6..b315989aa 100644 --- a/webapps/console/pages/api/admin/users.ts +++ b/webapps/console/pages/api/admin/users.ts @@ -44,7 +44,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) try { const user = requireDefined(await getUser(res, req, true), `User is not authenticated`); await check(user); - const { externalId, internalId, extended, format } = req.query; + const { externalId, extended, format } = req.query; const users: any[] = []; if (externalId) { From f67ba73fec6e4aeb2a4ef218cbec4b40f92f9579 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 12 Jul 2023 11:34:58 +0400 Subject: [PATCH 0038/1353] Onboarding improvements --- .../ConfigObjectEditor/ConfigEditor.tsx | 10 +- .../ConnectionEditorPage.tsx | 14 +- webapps/console/pages/[workspaceId]/index.tsx | 225 ++++++++++-------- 3 files changed, 142 insertions(+), 107 deletions(-) diff --git a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx index 9c07303bb..c8cfea8b7 100644 --- a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx +++ b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx @@ -377,11 +377,11 @@ const SingleObjectEditor: React.FC = props => { }; const onCancel = async (confirm: boolean) => { - if (!confirm) { - await router.push(`/${workspace.id}/${type}s`); - } else { - if (await confirmOp("Are you sure you want to close this page? All unsaved changes will be lost.")) { - await router.push(`/${workspace.id}/${type}s`); + if (!confirm || (await confirmOp("Are you sure you want to close this page? All unsaved changes will be lost."))) { + if (backTo) { + router.push(`/${workspace.id}${backTo}`); + } else { + router.push(`/${workspace.id}/${type}s`); } } }; diff --git a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx index 8c4665ac7..1bd40b61d 100644 --- a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx +++ b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx @@ -619,7 +619,19 @@ function ConnectionEditor({ )}
- + +

+ Next, look for the error on the{" "} + Issues Page. +

+

+ For more information, see{" "} + + https://docs.sentry.io/platforms/javascript/guides/nextjs/ + +

+ +
+ ); +} diff --git a/webapps/console/sentry.client.config.ts b/webapps/console/sentry.client.config.ts new file mode 100644 index 000000000..cd863efd6 --- /dev/null +++ b/webapps/console/sentry.client.config.ts @@ -0,0 +1,28 @@ +// This file configures the initialization of Sentry on the client. +// The config you add here will be used whenever a users loads a page in their browser. +// https://docs.sentry.io/platforms/javascript/guides/nextjs/ + +import * as Sentry from "@sentry/nextjs"; + +Sentry.init({ + // Adjust this value in production, or use tracesSampler for greater control + tracesSampleRate: 1, + + // Setting this option to true will print useful information to the console while you're setting up Sentry. + debug: false, + + replaysOnErrorSampleRate: 1.0, + + // This sets the sample rate to be 10%. You may want this to be 100% while + // in development and sample at a lower rate in production + replaysSessionSampleRate: 0.1, + + // You can remove this option if you're not planning to use the Sentry Session Replay feature: + integrations: [ + new Sentry.Replay({ + // Additional Replay configuration goes in here, for example: + maskAllText: true, + blockAllMedia: true, + }), + ], +}); diff --git a/webapps/console/sentry.edge.config.ts b/webapps/console/sentry.edge.config.ts new file mode 100644 index 000000000..d7bbbc385 --- /dev/null +++ b/webapps/console/sentry.edge.config.ts @@ -0,0 +1,14 @@ +// This file configures the initialization of Sentry for edge features (middleware, edge routes, and so on). +// The config you add here will be used whenever one of the edge features is loaded. +// Note that this config is unrelated to the Vercel Edge Runtime and is also required when running locally. +// https://docs.sentry.io/platforms/javascript/guides/nextjs/ + +import * as Sentry from "@sentry/nextjs"; + +Sentry.init({ + // Adjust this value in production, or use tracesSampler for greater control + tracesSampleRate: 1, + + // Setting this option to true will print useful information to the console while you're setting up Sentry. + debug: false, +}); diff --git a/webapps/console/sentry.server.config.ts b/webapps/console/sentry.server.config.ts new file mode 100644 index 000000000..5369a2c0a --- /dev/null +++ b/webapps/console/sentry.server.config.ts @@ -0,0 +1,13 @@ +// This file configures the initialization of Sentry on the server. +// The config you add here will be used whenever the server handles a request. +// https://docs.sentry.io/platforms/javascript/guides/nextjs/ + +import * as Sentry from "@sentry/nextjs"; + +Sentry.init({ + // Adjust this value in production, or use tracesSampler for greater control + tracesSampleRate: 1, + + // Setting this option to true will print useful information to the console while you're setting up Sentry. + debug: false, +}); From 8b904f80f594d6623ba2d22f72c0b9df1c09b16a Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 12 Jul 2023 17:08:55 +0400 Subject: [PATCH 0041/1353] change sentry organization --- webapps/console/next.config.js | 2 +- webapps/console/sentry.client.config.ts | 2 ++ webapps/console/sentry.edge.config.ts | 2 ++ webapps/console/sentry.server.config.ts | 2 ++ 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/webapps/console/next.config.js b/webapps/console/next.config.js index 58a4cea19..609c01b45 100644 --- a/webapps/console/next.config.js +++ b/webapps/console/next.config.js @@ -65,7 +65,7 @@ module.exports = withSentryConfig( // Suppresses source map uploading logs during build silent: true, authToken: process.env.SENTRY_AUTH_TOKEN, - org: "jitsu-labs-inc", + org: "jitsucom", project: "new-jitsu", }, { diff --git a/webapps/console/sentry.client.config.ts b/webapps/console/sentry.client.config.ts index cd863efd6..8f706f9b5 100644 --- a/webapps/console/sentry.client.config.ts +++ b/webapps/console/sentry.client.config.ts @@ -5,6 +5,8 @@ import * as Sentry from "@sentry/nextjs"; Sentry.init({ + dsn: "https://9a477534c34b4befbd5dc6397cf6815a@o330694.ingest.sentry.io/4505516539445248", + // Adjust this value in production, or use tracesSampler for greater control tracesSampleRate: 1, diff --git a/webapps/console/sentry.edge.config.ts b/webapps/console/sentry.edge.config.ts index d7bbbc385..50954e999 100644 --- a/webapps/console/sentry.edge.config.ts +++ b/webapps/console/sentry.edge.config.ts @@ -6,6 +6,8 @@ import * as Sentry from "@sentry/nextjs"; Sentry.init({ + dsn: "https://9a477534c34b4befbd5dc6397cf6815a@o330694.ingest.sentry.io/4505516539445248", + // Adjust this value in production, or use tracesSampler for greater control tracesSampleRate: 1, diff --git a/webapps/console/sentry.server.config.ts b/webapps/console/sentry.server.config.ts index 5369a2c0a..67af1eb26 100644 --- a/webapps/console/sentry.server.config.ts +++ b/webapps/console/sentry.server.config.ts @@ -5,6 +5,8 @@ import * as Sentry from "@sentry/nextjs"; Sentry.init({ + dsn: "https://9a477534c34b4befbd5dc6397cf6815a@o330694.ingest.sentry.io/4505516539445248", + // Adjust this value in production, or use tracesSampler for greater control tracesSampleRate: 1, From 14e05f8cda2587890b38a582e775ed25a8c7c484 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 12 Jul 2023 17:57:13 +0400 Subject: [PATCH 0042/1353] dryRun sentry in dev environment --- webapps/console/next.config.js | 1 + .../pages/api/[workspaceId]/sources/_logs.ts | 64 ------------------- 2 files changed, 1 insertion(+), 64 deletions(-) delete mode 100644 webapps/console/pages/api/[workspaceId]/sources/_logs.ts diff --git a/webapps/console/next.config.js b/webapps/console/next.config.js index 609c01b45..508828d05 100644 --- a/webapps/console/next.config.js +++ b/webapps/console/next.config.js @@ -62,6 +62,7 @@ module.exports = withSentryConfig( // For all available options, see: // https://github.com/getsentry/sentry-webpack-plugin#options + dryRun: !process.env.SENTRY_AUTH_TOKEN, // Suppresses source map uploading logs during build silent: true, authToken: process.env.SENTRY_AUTH_TOKEN, diff --git a/webapps/console/pages/api/[workspaceId]/sources/_logs.ts b/webapps/console/pages/api/[workspaceId]/sources/_logs.ts deleted file mode 100644 index 98a329f98..000000000 --- a/webapps/console/pages/api/[workspaceId]/sources/_logs.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { db } from "../../../../lib/server/db"; -import { randomId } from "juava"; -import dayjs from "dayjs"; -import { Duplex } from "stream"; - -export const config = { - runtime: "edge", -}; - -export default async function handler(req: Request) { - console.log("req", req.url); - try { - //create byte buffer - const duplex = new Duplex(); - // res.setHeader("Content-Type", "text/plain"); - // if (query.download) { - // res.setHeader("Content-Disposition", `attachment; filename=log_sync_${query.syncId}_task_${query.taskId}.txt`); - // } - const load = async () => { - await db.pgHelper().streamQuery( - `select * - from task_log - where task_id = :task_id - order by timestamp`, - { task_id: "1a7128c9-5d71-428f-8c6c-d45d00389b7c" }, - r => { - duplex.write( - `${dayjs(r.timestamp).utc().format("YYYY-MM-DD HH:mm:ss.SSS")} ${r.level} [${r.logger}] ${r.message}\n` - ); - } - ); - duplex.write("test"); - duplex.end(); - }; - load(); - //stream buffer to response - const stream = new ReadableStream({ - async pull(controller) { - const chunk = await duplex.read(); - if (chunk) { - controller.enqueue(chunk); - } else { - controller.close(); - } - }, - }); - - return new Response(stream, { - headers: { - "Content-Type": "text/plain", - "Content-Disposition": `attachment; filename=log_sync_${1}_task_${1}.txt`, - }, - }); - } catch (e: any) { - const errorId = randomId(); - console.error(`Error loading logs for task ids ${1} . Error ID: ${errorId}. Error: ${e}`); - return new Response( - JSON.stringify({ - ok: false, - error: `couldn't load tasks due to internal server error. Please contact support. Error ID: ${errorId}`, - }) - ); - } -} From 2fa64c3f9790f702009bdbd7c43710e266c7c9e2 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 12 Jul 2023 17:58:37 +0400 Subject: [PATCH 0043/1353] analytics-plugin: url encode json values in cookies (__eventn_id_usr) --- libs/jitsu-js/src/analytics-plugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/jitsu-js/src/analytics-plugin.ts b/libs/jitsu-js/src/analytics-plugin.ts index ecf0c9e62..3482ef3fa 100644 --- a/libs/jitsu-js/src/analytics-plugin.ts +++ b/libs/jitsu-js/src/analytics-plugin.ts @@ -116,7 +116,7 @@ const defaultCookie2Key = { const cookieStorage: StorageFactory = (cookieDomain, key2cookie) => { return { setItem(key: string, val: any) { - const strVal = typeof val === "object" && val !== null ? JSON.stringify(val) : val; + const strVal = typeof val === "object" && val !== null ? encodeURIComponent(JSON.stringify(val)) : val; const cookieName = key2cookie[key] || key; setCookie(cookieName, strVal, { domain: cookieDomain, From 0dc9edc4a21e72101276d46a0ced60cf9bc54842 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Wed, 12 Jul 2023 14:48:55 -0400 Subject: [PATCH 0044/1353] fix: become button fixed --- webapps/console/pages/admin/users.tsx | 2 +- webapps/console/pages/api/admin/become.ts | 36 +++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 webapps/console/pages/api/admin/become.ts diff --git a/webapps/console/pages/admin/users.tsx b/webapps/console/pages/admin/users.tsx index b745da16a..cc487d7a2 100644 --- a/webapps/console/pages/admin/users.tsx +++ b/webapps/console/pages/admin/users.tsx @@ -42,7 +42,7 @@ export const BecomeUser: React.FC<{ externalId?: string; internalId?: string }> onClick={async () => { setLoading(true); try { - const { token } = await get(`/api/admin/users`, { method: "POST", body: { externalId: props.externalId } }); + const { token } = await get(`/api/admin/become`, { method: "POST", body: { externalId: props.externalId } }); await fb.resolveUser(token).user; //we need to a full reload, so the top level components catch up on the new user window.location.assign("/"); diff --git a/webapps/console/pages/api/admin/become.ts b/webapps/console/pages/api/admin/become.ts new file mode 100644 index 000000000..8835ae44e --- /dev/null +++ b/webapps/console/pages/api/admin/become.ts @@ -0,0 +1,36 @@ +import { createRoute } from "../../../lib/api"; +import { z } from "zod"; +import { assertDefined, assertTrue, requireDefined } from "juava"; +import { firebase, isFirebaseEnabled } from "../../../lib/server/firebase-server"; +import { db } from "../../../lib/server/db"; +import { SessionUser } from "../../../lib/schema"; + +async function check(user: SessionUser) { + assertDefined(isFirebaseEnabled(), `Admin users-tool works with firebase only`); + const userModel = requireDefined( + await db.prisma().userProfile.findUnique({ where: { id: user.internalId } }), + `User ${user.internalId} does not exist` + ); + assertTrue(userModel.admin, `User ${user.internalId} is not admin`); +} + +export default createRoute() + .POST({ + auth: true, + body: z.object({ + externalId: z.string(), + }), + result: z.object({ + token: z.string(), + }), + }) + .handler(async ({ req, user, body }) => { + await check(user); + + const firebaseUser = await firebase().auth().getUser(body.externalId); + const token = await firebase() + .auth() + .createCustomToken(firebaseUser.uid, { internalId: firebaseUser.customClaims?.internalId }); + return { token }; + }) + .toNextApiHandler(); From ca2572e431d7bc4fa8f1eae8760209e3c64801c1 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 12 Jul 2023 22:54:26 +0400 Subject: [PATCH 0045/1353] is-active: check only that users exists in classic project (for now) Improve Switch to Jitsu Classic experience --- .../PageLayout/WorkspacePageLayout.tsx | 54 ++++++++++--- .../WorkspaceNameAndSlugEditor.tsx | 48 ++++++++++- webapps/console/public/logo-classic-gray.svg | 3 + webapps/console/public/logo-classic.svg | 3 + webapps/ee-api/pages/api/custom-token.ts | 2 +- webapps/ee-api/pages/api/is-active.ts | 80 +++++++++---------- 6 files changed, 135 insertions(+), 55 deletions(-) create mode 100644 webapps/console/public/logo-classic-gray.svg create mode 100644 webapps/console/public/logo-classic.svg diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index 8a19454fd..2255619c3 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -198,13 +198,11 @@ function WorkspacesMenu(props: { jitsuClassicAvailable: boolean }) { export const WorkspaceSelector: React.FC = props => { const [open, setOpen] = useState(false); - const classicProject = useClassicProject(); + //const classicProject = useClassicProject(); return ( ( - - )} + dropdownRender={() => } trigger={["click"]} open={open} onOpenChange={open => setOpen(open)} @@ -270,6 +268,9 @@ export const TopTabsMenu: React.FC = props => { function Breadcrumbs() { const workspace = useWorkspace(); + const appConfig = useAppConfig(); + const classicProject = useClassicProject(); + return (
{branding.logo}
@@ -281,6 +282,36 @@ function Breadcrumbs() {
+ {classicProject.active && !!classicProject.project && ( + <> +
+ + + +
+
+ +
+ + + )}
); } @@ -378,8 +409,8 @@ function PageHeader() { } const WorkspaceSettingsModal: React.FC<{ onSuccess: () => void }> = ({ onSuccess }) => { - const cfg = useAppConfig(); - const domains = getDomains(cfg); + const appConfig = useAppConfig(); + const domains = getDomains(appConfig); const { analytics } = useJitsu(); const { push, query } = useRouter(); const searchParams = useSearchParams(); @@ -394,14 +425,15 @@ const WorkspaceSettingsModal: React.FC<{ onSuccess: () => void }> = ({ onSuccess const dataIngestion = ( <> - {cfg.publicEndpoints.protocol}://yourslug.{cfg.publicEndpoints.dataHost} - {cfg.publicEndpoints.port ? `:${cfg.publicEndpoints.port}` : ""} + {appConfig.publicEndpoints.protocol}://yourslug. + {appConfig.publicEndpoints.dataHost} + {appConfig.publicEndpoints.port ? `:${appConfig.publicEndpoints.port}` : ""} ); return ( -
-
+
+

👋 Let's get started!

Pick a name a slug for your {branding.productName} workspace. Slug will be used in the URLs{" "} @@ -409,7 +441,7 @@ const WorkspaceSettingsModal: React.FC<{ onSuccess: () => void }> = ({ onSuccess {domains.appBase}/your-slug {" "}
- + )} -
+
+
+ {offerClassic && classicProject.active && !!classicProject.project && ( + <> +
+ } + onClick={async () => { + try { + const eeClient = getEeClient( + requireDefined(appConfig.ee.host, `EE is not available`), + workspace.id + ); + const customToken = await eeClient.createCustomToken(); + window.location.href = `${appConfig.jitsuClassicUrl}/?token=${customToken}`; + } catch (e) { + feedbackError(`Can't navigate to Jitsu.Classic`, { error: e }); + } + }} + > + Switch to Jitsu Classic + +
+
+ } + onClick={() => window.open("https://jitsu.com/blog/jitsu-next#migration-faq", "_blank")} + > + Read about migration + +
+ + )} +
+ + {data?.needsConfiguration && ( + + + + )} + - )} - - - +
-
+
+
Status:
+ {(() => { + if (isLoading) { + return ( + + + + Checking Domain Status + + + ); + } else if (error || data?.error) { + return ERROR; + } else if (data?.needsConfiguration) { + return Configuration Required; + } else { + return OK; + } + })()} +
+ {(error || data?.error) && ( +
+
Description:
+
{`${data?.error || "Internal error"}`}
+
+ )} + {data?.needsConfiguration && ( + + )} +
); }; From 12265b4631a6a70ed7e97bc8cd770ea25beca596 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 17 Jul 2023 15:29:01 +0400 Subject: [PATCH 0074/1353] improve custom domains UI --- webapps/console/pages/[workspaceId]/streams.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/webapps/console/pages/[workspaceId]/streams.tsx b/webapps/console/pages/[workspaceId]/streams.tsx index 56f32e85b..b3fdc3004 100644 --- a/webapps/console/pages/[workspaceId]/streams.tsx +++ b/webapps/console/pages/[workspaceId]/streams.tsx @@ -158,7 +158,7 @@ const CustomDomain: React.FC<{ domain: string; deleteDomain: () => Promise
-
Status:
+
Status:
{(() => { if (isLoading) { return ( @@ -180,13 +180,13 @@ const CustomDomain: React.FC<{ domain: string; deleteDomain: () => Promise
{(error || data?.error) && (
-
Description:
+
Description:
{`${data?.error || "Internal error"}`}
)} {data?.needsConfiguration && (
-
Description:
+
Description:
See{" "} Date: Mon, 17 Jul 2023 16:29:23 +0400 Subject: [PATCH 0075/1353] init s3 only if at least on stream is created --- .../ConfigObjectEditor/ConfigEditor.tsx | 13 ++++++++++++- webapps/console/pages/_app.tsx | 19 ++++++++++++++----- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx index 8160ac313..a5694080b 100644 --- a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx +++ b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx @@ -4,7 +4,7 @@ import { FaCaretDown, FaCaretRight, FaClone, FaPlus } from "react-icons/fa"; import { ZodType } from "zod"; import { getConfigApi, useApi } from "../../lib/useApi"; import { useRouter } from "next/router"; -import { asFunction, FunctionLike, getErrorMessage, getLog, requireDefined } from "juava"; +import { asFunction, FunctionLike, getErrorMessage, getLog, requireDefined, rpc } from "juava"; import zodToJsonSchema from "zod-to-json-schema"; @@ -401,6 +401,16 @@ const SingleObjectEditor: React.FC = props => { try { if (isNew) { await getConfigApi(workspace.id, type).create(newObject); + if (type === "stream") { + try { + await rpc(`/api/${workspace.id}/ee/s3-init`, { + method: "POST", + query: { workspaceId: workspace.id }, + }); + } catch (e: any) { + console.error("Failed to init S3 bucket", e.message); + } + } } else { await getConfigApi(workspace.id, type).update(object.id, newObject); //await new Promise(resolve => setTimeout(resolve, 10000000)); @@ -586,6 +596,7 @@ const SingleObjectEditorLoader: React.FC> = ({ const appConfig = useAppConfig(); const user = useUser(); const router = useRouter(); + const [streams, setStreams] = useState([]); const { data: workspace, @@ -426,18 +427,26 @@ const WorkspaceLoader: React.FC> = ({ useEffect(() => { (async () => { if (workspace?.id) { + const streams = await getConfigApi(workspace.id, "stream").list(); + setStreams(streams); + } + })(); + }, [workspace?.id]); + + useEffect(() => { + (async () => { + if (workspace?.id && streams.length > 0) { try { - const res = await rpc(`/api/${workspace.id}/ee/s3-init`, { + await rpc(`/api/${workspace.id}/ee/s3-init`, { method: "POST", query: { workspaceId: workspace.id }, }); - console.log("s3-init", res); } catch (e: any) { console.error("Failed to init S3 bucket", e.message); } } })(); - }, [workspace?.id]); + }, [workspace?.id, streams]); useEffect(() => { if (workspace?.id) { From 4a18c9ce2019f85704e45cb10dbdd982b012dd8f Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Tue, 18 Jul 2023 16:12:26 -0400 Subject: [PATCH 0076/1353] feat: disable iframe embedding --- webapps/console/middleware.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/webapps/console/middleware.ts b/webapps/console/middleware.ts index e7390a5d3..60a03852d 100644 --- a/webapps/console/middleware.ts +++ b/webapps/console/middleware.ts @@ -2,11 +2,16 @@ import { NextResponse } from "next/server"; import type { NextRequest } from "next/server"; export function middleware(request: NextRequest) { + let response; if (request.nextUrl.pathname.startsWith("/p.js")) { - return NextResponse.rewrite(new URL("/api/s/javascript-library", request.url)); + response = NextResponse.rewrite(new URL("/api/s/javascript-library", request.url)); + } else { + response = NextResponse.next(); } + response.headers.set("X-Frame-Options", "DENY"); + return response; } export const config = { - matcher: "/p.js", + matcher: "", }; From 43004b9b6c3b7d2e62e5d85956b87f09bff0ae47 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 20 Jul 2023 18:13:40 +0400 Subject: [PATCH 0077/1353] fixed clickhouse destination UI form enforcing 'default' cluster. fix for unnecessary EE-related error message --- webapps/console/components/Billing/BillingProvider.tsx | 2 +- webapps/console/lib/schema/destinations.tsx | 2 +- webapps/console/pages/[workspaceId]/index.tsx | 7 ++++--- webapps/console/pages/[workspaceId]/sql.tsx | 2 +- webapps/console/pages/[workspaceId]/streams.tsx | 2 +- webapps/console/pages/_app.tsx | 4 ++-- 6 files changed, 10 insertions(+), 9 deletions(-) diff --git a/webapps/console/components/Billing/BillingProvider.tsx b/webapps/console/components/Billing/BillingProvider.tsx index e93c05e8b..32e9522aa 100644 --- a/webapps/console/components/Billing/BillingProvider.tsx +++ b/webapps/console/components/Billing/BillingProvider.tsx @@ -87,7 +87,7 @@ export const BillingProvider: React.FC{children}; } else if (error) { - log.atError().withCause(error).log("Can't connect to billing server. Billing is disabled"); + log.atDebug().withCause(error).log("Can't connect to billing server. Billing is disabled"); return {children}; } else if (billingSettings) { return {children}; diff --git a/webapps/console/lib/schema/destinations.tsx b/webapps/console/lib/schema/destinations.tsx index 803082e11..3e4bcbaa5 100644 --- a/webapps/console/lib/schema/destinations.tsx +++ b/webapps/console/lib/schema/destinations.tsx @@ -210,7 +210,7 @@ export const ClickhouseCredentials = z.object({ password: z.string().describe("Password for ClickHouse connection"), cluster: z .string() - .default("default") + .optional() .describe("Name of cluster to use. If clickhouse works in single node mode, leave this field empty"), database: z.string().default("default").describe("Name of the database to use"), parameters: z diff --git a/webapps/console/pages/[workspaceId]/index.tsx b/webapps/console/pages/[workspaceId]/index.tsx index 3c7b6d234..1b8f11be9 100644 --- a/webapps/console/pages/[workspaceId]/index.tsx +++ b/webapps/console/pages/[workspaceId]/index.tsx @@ -1,5 +1,5 @@ import { WorkspacePageLayout } from "../../components/PageLayout/WorkspacePageLayout"; -import { useWorkspace } from "../../lib/context"; +import { useAppConfig, useWorkspace } from "../../lib/context"; import { DestinationConfig, StreamConfig } from "../../lib/schema"; import { QueryResponse } from "../../components/QueryResponse/QueryResponse"; import { branding } from "../../lib/branding"; @@ -225,7 +225,7 @@ function Card({
{icon}
- {title} + {title}
@@ -315,6 +315,7 @@ function WorkspaceOverview(props: { links: ConfigurationLinkDbModel[]; }) { const router = useRouter(); + const appConfig = useAppConfig(); const workspace = useWorkspace(); const { destinations, streams, links } = props; useTitle(`${branding.productName} : ${workspace.name}`); @@ -356,7 +357,7 @@ function WorkspaceOverview(props: { }))} /> )} - {configurationFinished && ( + {configurationFinished && appConfig.ee?.available && (
diff --git a/webapps/console/pages/[workspaceId]/sql.tsx b/webapps/console/pages/[workspaceId]/sql.tsx index 5882ebd87..3d35b4d2b 100644 --- a/webapps/console/pages/[workspaceId]/sql.tsx +++ b/webapps/console/pages/[workspaceId]/sql.tsx @@ -72,7 +72,7 @@ const AvailableDestinationsList: React.FC = () => { ))}
- + {appConfig.ee?.available && }
); } else if (error) { diff --git a/webapps/console/pages/[workspaceId]/streams.tsx b/webapps/console/pages/[workspaceId]/streams.tsx index b3fdc3004..2fbeb4e7f 100644 --- a/webapps/console/pages/[workspaceId]/streams.tsx +++ b/webapps/console/pages/[workspaceId]/streams.tsx @@ -90,7 +90,7 @@ const CustomDomain: React.FC<{ domain: string; deleteDomain: () => Promise
diff --git a/webapps/console/pages/_app.tsx b/webapps/console/pages/_app.tsx index 82b21b55a..12e02ac69 100644 --- a/webapps/console/pages/_app.tsx +++ b/webapps/console/pages/_app.tsx @@ -435,7 +435,7 @@ const WorkspaceLoader: React.FC> = ({ useEffect(() => { (async () => { - if (workspace?.id && streams.length > 0) { + if (appConfig.ee.available && workspace?.id && streams.length > 0) { try { await rpc(`/api/${workspace.id}/ee/s3-init`, { method: "POST", @@ -446,7 +446,7 @@ const WorkspaceLoader: React.FC> = ({ } } })(); - }, [workspace?.id, streams]); + }, [workspace?.id, streams, appConfig]); useEffect(() => { if (workspace?.id) { From 41c9e7d2cef765d887593000fb93627d346446cd Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 20 Jul 2023 18:19:42 +0400 Subject: [PATCH 0078/1353] fixed clickhouse destination UI form enforcing 'default' cluster. fix for unnecessary EE-related error message --- services/rotor/package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/services/rotor/package.json b/services/rotor/package.json index 9d74712e0..302a41b4d 100644 --- a/services/rotor/package.json +++ b/services/rotor/package.json @@ -60,7 +60,6 @@ "ts-node": "~10.8.1", "typescript": "^4.9.3", "webpack": "^5.75.0", - "webpack-cli": "^5.0.0", - "wepack-cli": "0.0.1-security" + "webpack-cli": "^5.0.0" } } From d2bc56e46acc217487e09be02f777b2004db3b2a Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 21 Jul 2023 16:51:06 +0400 Subject: [PATCH 0079/1353] Full-featured ServiceEditor UI --- pnpm-lock.yaml | 70 ++-- .../components/ApiKeyEditor/ApiKeyEditor.tsx | 2 +- .../ConfigEditor.module.css | 8 + .../ConfigObjectEditor/ConfigEditor.tsx | 15 +- .../ConfigObjectEditor/EditorField.tsx | 63 ++- .../components/ConfigObjectEditor/Editors.tsx | 87 ++++ .../ConfigObjectEditor/SchemaForm.tsx | 371 ++++++++++++++++++ .../ConnectionEditorPage.tsx | 11 +- .../components/GlobalError/GlobalError.tsx | 21 +- .../console/components/Htmlizer/Htmlizer.tsx | 5 + .../ServiceEditor/ServiceEditor.tsx | 306 +++++++++------ webapps/console/lib/zod.ts | 3 +- webapps/console/package.json | 9 +- .../pages/[workspaceId]/destinations.tsx | 14 +- .../console/pages/[workspaceId]/services.tsx | 1 + .../console/pages/[workspaceId]/streams.tsx | 3 +- 16 files changed, 775 insertions(+), 214 deletions(-) create mode 100644 webapps/console/components/ConfigObjectEditor/Editors.tsx create mode 100644 webapps/console/components/ConfigObjectEditor/SchemaForm.tsx create mode 100644 webapps/console/components/Htmlizer/Htmlizer.tsx diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ae81187b8..5533823c8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -467,9 +467,6 @@ importers: webpack-cli: specifier: ^5.0.0 version: 5.0.1(@webpack-cli/generators@3.0.1)(webpack@5.78.0) - wepack-cli: - specifier: 0.0.1-security - version: 0.0.1-security types/protocols: {} @@ -512,17 +509,17 @@ importers: specifier: ^4.12.0 version: 4.12.0(prisma@4.12.0) '@rjsf/antd': - specifier: 5.3.1 - version: 5.3.1(@ant-design/icons@5.0.1)(@rjsf/core@5.3.1)(@rjsf/utils@5.3.1)(antd@5.4.2)(dayjs@1.11.7)(react-dom@18.2.0)(react@18.2.0) + specifier: 5.10.0 + version: 5.10.0(@ant-design/icons@5.0.1)(@rjsf/core@5.10.0)(@rjsf/utils@5.10.0)(antd@5.4.2)(dayjs@1.11.7)(react-dom@18.2.0)(react@18.2.0) '@rjsf/core': - specifier: 5.3.1 - version: 5.3.1(@rjsf/utils@5.3.1)(react@18.2.0) + specifier: 5.10.0 + version: 5.10.0(@rjsf/utils@5.10.0)(react@18.2.0) '@rjsf/utils': - specifier: 5.3.1 - version: 5.3.1(react@18.2.0) + specifier: 5.10.0 + version: 5.10.0(react@18.2.0) '@rjsf/validator-ajv6': - specifier: 5.3.1 - version: 5.3.1(@rjsf/utils@5.3.1) + specifier: 5.10.0 + version: 5.10.0(@rjsf/utils@5.10.0) '@sensejs/kafkajs-zstd-support': specifier: ^0.9.2 version: 0.9.2(kafkajs@2.2.4) @@ -541,6 +538,9 @@ importers: agentkeepalive: specifier: ^4.2.1 version: 4.3.0 + ajv: + specifier: ~8.12.0 + version: 8.12.0 classnames: specifier: ^2.3.1 version: 2.3.2 @@ -5881,49 +5881,49 @@ packages: source-map: 0.7.4 dev: true - /@rjsf/antd@5.3.1(@ant-design/icons@5.0.1)(@rjsf/core@5.3.1)(@rjsf/utils@5.3.1)(antd@5.4.2)(dayjs@1.11.7)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Cu2n6XMeNQUpYLqWwzSFwHeaPclzueeV3Wqf2zQcvG5UlOBZP5FhLMNlkY1PG/AeshK7rsMiTJa0AN60k0AsKg==} + /@rjsf/antd@5.10.0(@ant-design/icons@5.0.1)(@rjsf/core@5.10.0)(@rjsf/utils@5.10.0)(antd@5.4.2)(dayjs@1.11.7)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-dj0BVL/g2wtrvNxnlya069H8M9hoserMTEWtRtutLf99nsmiargCei34OhM+MxkKkk+c8SsSv5DlEqPiUa+Low==} engines: {node: '>=14'} peerDependencies: '@ant-design/icons': ^4.0.0 - '@rjsf/core': ^5.0.0 - '@rjsf/utils': ^5.0.0 + '@rjsf/core': ^5.8.x + '@rjsf/utils': ^5.8.x antd: ^4.0.0 dayjs: ^1.8.0 react: ^16.14.0 || >=17 dependencies: '@ant-design/icons': 5.0.1(react-dom@18.2.0)(react@18.2.0) - '@rjsf/core': 5.3.1(@rjsf/utils@5.3.1)(react@18.2.0) - '@rjsf/utils': 5.3.1(react@18.2.0) + '@rjsf/core': 5.10.0(@rjsf/utils@5.10.0)(react@18.2.0) + '@rjsf/utils': 5.10.0(react@18.2.0) antd: 5.4.2(react-dom@18.2.0)(react@18.2.0) classnames: 2.3.2 dayjs: 1.11.7 lodash: 4.17.21 lodash-es: 4.17.21 - rc-picker: 2.7.0(react-dom@18.2.0)(react@18.2.0) + rc-picker: 2.7.2(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 transitivePeerDependencies: - react-dom dev: false - /@rjsf/core@5.3.1(@rjsf/utils@5.3.1)(react@18.2.0): - resolution: {integrity: sha512-AejBNI5XBmfirubZ2L/f7Hx9hga4E3w777UB4ZvzAPwNygxKS3p/4nUKuP4Ho53aktsArdva0mdmgdBNn8phCw==} + /@rjsf/core@5.10.0(@rjsf/utils@5.10.0)(react@18.2.0): + resolution: {integrity: sha512-G9KapNurCpP9l/CK4rR3/pQ1rKuaD1BxdzHjaWUWrpUbEqbDTeNu+5630ymUf0y8A04JuSN1guQRVyYl0Dlfxw==} engines: {node: '>=14'} peerDependencies: - '@rjsf/utils': ^5.0.0 + '@rjsf/utils': ^5.8.x react: ^16.14.0 || >=17 dependencies: - '@rjsf/utils': 5.3.1(react@18.2.0) + '@rjsf/utils': 5.10.0(react@18.2.0) lodash: 4.17.21 lodash-es: 4.17.21 - markdown-to-jsx: 7.2.0(react@18.2.0) + markdown-to-jsx: 7.2.1(react@18.2.0) nanoid: 3.3.6 prop-types: 15.8.1 react: 18.2.0 dev: false - /@rjsf/utils@5.3.1(react@18.2.0): - resolution: {integrity: sha512-bpqq1c8nivNaynGgQa/ZOTxZaD8RYo1YYF/cHpmTqGGO+qwNhimJdFCxu6uOJ5dRP59nsJ3nYbhzK1cLtxFXfQ==} + /@rjsf/utils@5.10.0(react@18.2.0): + resolution: {integrity: sha512-HGytUxCGtV6OCOw4PbjFcksxrPIxUt0y3T9oqCTsP4xiqnLfve4ZfY9FkbHzPSGOXVp57yCNNEZTWiK6tcV9uA==} engines: {node: '>=14'} peerDependencies: react: ^16.14.0 || >=17 @@ -5936,13 +5936,13 @@ packages: react-is: 18.2.0 dev: false - /@rjsf/validator-ajv6@5.3.1(@rjsf/utils@5.3.1): - resolution: {integrity: sha512-HzlBZlrZKx+3tgzBT0cZALfblzBUFZCbWZtBLBH13DTIZ/6fj1CrnBs2JqtnrSpoWFRSGPyRm9g6+G/BJkFJcQ==} + /@rjsf/validator-ajv6@5.10.0(@rjsf/utils@5.10.0): + resolution: {integrity: sha512-XywXT7Gs8V0mx5xZ5cc95HH73B7kpWma1qozQJC7DeTHoYhbLpfOrZdsYuFYAO4xmGD+hS7zNarsHlOWPUiW2w==} engines: {node: '>=14'} peerDependencies: - '@rjsf/utils': ^5.0.0 + '@rjsf/utils': ^5.8.x dependencies: - '@rjsf/utils': 5.3.1(react@18.2.0) + '@rjsf/utils': 5.10.0(react@18.2.0) ajv: 6.12.6 lodash: 4.17.21 lodash-es: 4.17.21 @@ -17679,8 +17679,8 @@ packages: dev: false optional: true - /markdown-to-jsx@7.2.0(react@18.2.0): - resolution: {integrity: sha512-3l4/Bigjm4bEqjCR6Xr+d4DtM1X6vvtGsMGSjJYyep8RjjIvcWtrXBS8Wbfe1/P+atKNMccpsraESIaWVplzVg==} + /markdown-to-jsx@7.2.1(react@18.2.0): + resolution: {integrity: sha512-9HrdzBAo0+sFz9ZYAGT5fB8ilzTW+q6lPocRxrIesMO+aB40V9MgFfbfMXxlGjf22OpRy+IXlvVaQenicdpgbg==} engines: {node: '>= 10'} peerDependencies: react: '>= 0.14.0' @@ -21998,8 +21998,8 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - /rc-picker@2.7.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-oZH6FZ3j4iuBxHB4NvQ6ABRsS2If/Kpty1YFFsji7/aej6ruGmfM7WnJWQ88AoPfpJ++ya5z+nVEA8yCRYGKyw==} + /rc-picker@2.7.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-KbUKgbzgWVN5L+V9xhZDKSmseHIyFneBlmuMtMrZ9fU7Oypw6D+owS5kuUicIEV08Y17oXt8dUqauMeC5IFBPg==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' @@ -25972,10 +25972,6 @@ packages: resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} engines: {node: '>=0.8.0'} - /wepack-cli@0.0.1-security: - resolution: {integrity: sha512-10l/6mMWz+LWQO+Pic8ZZRZtEHvs0JIiyZsnbWVVm8SHA3dOkxl2nu8EyCag4W/lSDXoWHcVgFCImkHkAw1aVQ==} - dev: true - /whatwg-encoding@1.0.5: resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} dependencies: diff --git a/webapps/console/components/ApiKeyEditor/ApiKeyEditor.tsx b/webapps/console/components/ApiKeyEditor/ApiKeyEditor.tsx index 73400810a..cc33b97d1 100644 --- a/webapps/console/components/ApiKeyEditor/ApiKeyEditor.tsx +++ b/webapps/console/components/ApiKeyEditor/ApiKeyEditor.tsx @@ -1,4 +1,3 @@ -import { CustomWidgetProps } from "../ConfigObjectEditor/ConfigEditor"; import { ApiKey } from "../../lib/schema"; import { useState } from "react"; import { Button, Tooltip } from "antd"; @@ -6,6 +5,7 @@ import { branding } from "../../lib/branding"; import { confirmOp, copyTextToClipboard } from "../../lib/ui"; import { FaCopy, FaPlus, FaTrash } from "react-icons/fa"; import { randomId } from "juava"; +import { CustomWidgetProps } from "../ConfigObjectEditor/Editors"; const CopyToClipboard: React.FC<{ text: string }> = ({ text }) => { const [copied, setCopied] = useState(false); diff --git a/webapps/console/components/ConfigObjectEditor/ConfigEditor.module.css b/webapps/console/components/ConfigObjectEditor/ConfigEditor.module.css index 554cca155..f1e48d997 100644 --- a/webapps/console/components/ConfigObjectEditor/ConfigEditor.module.css +++ b/webapps/console/components/ConfigObjectEditor/ConfigEditor.module.css @@ -6,6 +6,14 @@ color: rgb(100, 100, 100); } +.inner:first-child { + padding-top: 4px; +} + +.inner:last-child { + margin-bottom: 0; +} + .invalidInput input { border-color: rgb(255, 0, 0); } diff --git a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx index a5694080b..16ce10ecd 100644 --- a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx +++ b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx @@ -11,7 +11,8 @@ import zodToJsonSchema from "zod-to-json-schema"; import styles from "./ConfigEditor.module.css"; import validator from "@rjsf/validator-ajv6"; -import { Form } from "@rjsf/antd/dist/antd.cjs.development"; +import { Form } from "@rjsf/antd"; + import { ADDITIONAL_PROPERTY_FLAG, canExpand, @@ -26,8 +27,7 @@ import { } from "@rjsf/utils"; import { ConfigEntityBase } from "../../lib/schema"; -import { useWorkspace } from "../../lib/context"; -import omitBy from "lodash/omitBy"; +import { useAppConfig, useWorkspace } from "../../lib/context"; import { GlobalLoader, LoadingAnimation } from "../GlobalLoader/GlobalLoader"; import { WLink } from "../Workspace/WLink"; import { DeleteOutlined } from "@ant-design/icons"; @@ -45,6 +45,7 @@ import { EditorButtons } from "./EditorButtons"; import { ButtonGroup, ButtonProps } from "../ButtonGroup/ButtonGroup"; import cuid from "cuid"; import { ObjectTitle } from "../ObjectTitle/ObjectTitle"; +import omitBy from "lodash/omitBy"; const log = getLog("ConfigEditor"); @@ -98,11 +99,6 @@ export type ConfigEditorProps backTo?: string; }; -export type CustomWidgetProps = { - value: T | undefined; - onChange: (value: T) => void; -}; - type JsonSchema = any; function getUiWidget(field: FieldDisplay) { @@ -355,6 +351,7 @@ const SingleObjectEditor: React.FC = props => { const [meta, setMeta] = useState(undefined); const isNew = !!(!otherProps.object || createNew); const workspace = useWorkspace(); + const appConfig = useAppConfig(); const router = useRouter(); useEffect(() => { @@ -401,7 +398,7 @@ const SingleObjectEditor: React.FC = props => { try { if (isNew) { await getConfigApi(workspace.id, type).create(newObject); - if (type === "stream") { + if (type === "stream" && appConfig.ee.available) { try { await rpc(`/api/${workspace.id}/ee/s3-init`, { method: "POST", diff --git a/webapps/console/components/ConfigObjectEditor/EditorField.tsx b/webapps/console/components/ConfigObjectEditor/EditorField.tsx index 260270cb4..fb3a55e91 100644 --- a/webapps/console/components/ConfigObjectEditor/EditorField.tsx +++ b/webapps/console/components/ConfigObjectEditor/EditorField.tsx @@ -11,7 +11,7 @@ export type EditorFieldProps = { errors?: React.ReactNode; }; -export const EditorField: React.FC> = ({ +const EditorField0: React.FC> = ({ id, required, className, @@ -22,33 +22,70 @@ export const EditorField: React.FC> = }) => { return (
-
-
+
+
-
-
- -
-
{label}
+
{errors} +
{children}
{!!help && ( -
+
{help}
)}
); }; + +const EditorFieldInner: React.FC> = ({ + id, + required, + className, + help, + label, + errors, + children, +}) => { + return ( +
+
+
+ +
+
+ {errors} + +
+
+
+
+
{children}
+
+ {!!help && ( +
+
{help}
+
+ )} +
+
+ ); +}; + +export const EditorField: React.FC> = ({ + inner, + ...props +}) => { + return inner ? : ; +}; diff --git a/webapps/console/components/ConfigObjectEditor/Editors.tsx b/webapps/console/components/ConfigObjectEditor/Editors.tsx new file mode 100644 index 000000000..821943294 --- /dev/null +++ b/webapps/console/components/ConfigObjectEditor/Editors.tsx @@ -0,0 +1,87 @@ +import React from "react"; +import { DatePicker, Input, Select } from "antd"; +import dayjs from "dayjs"; + +export type CustomWidgetProps = { + value: T | undefined; + onChange: (value: T) => void; +}; +export const DateEditor: React.FC<{ format: string } & CustomWidgetProps> = props => { + return ( + { + props.onChange((v ?? dayjs()).format(props.format)); + }} + /> + ); +}; + +export function SelectEditor( + props: { options: { label: string; value: T }[]; className?: string } & CustomWidgetProps +) { + return ( + ({ label: o, value: o }))} + onChange={v => { + props.onChange(v); + }} + /> + ); +}; + +export const TextEditor: React.FC<{ rows?: number } & CustomWidgetProps> = props => { + if (props.rows && props.rows > 1) { + return props.onChange(e.target.value)} />; + } else { + return props.onChange(e.target.value)} />; + } +}; + +export const NumberEditor: React.FC> = props => { + return ( + { + const v = parseInt(e.target.value); + props.onChange(v); + }} + /> + ); +}; + +export const PasswordEditor: React.FC> = props => { + return ( + { + props.onChange(e.target.value); + }} + /> + ); +}; diff --git a/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx b/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx new file mode 100644 index 000000000..c7d11be61 --- /dev/null +++ b/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx @@ -0,0 +1,371 @@ +import React, { useCallback, useMemo, useState } from "react"; +import set from "lodash/set"; +import get from "lodash/get"; +import styles from "./ConfigEditor.module.css"; +import { EditorField } from "./EditorField"; +import { Switch, Tabs } from "antd"; +import { createDisplayName } from "../../lib/zod"; +import Ajv from "ajv"; +import { PlusIcon } from "lucide-react"; +import { getLog } from "juava"; +import { DateEditor, NumberEditor, PasswordEditor, SelectEditor, StringArray, TextEditor } from "./Editors"; +import { Htmlizer } from "../Htmlizer/Htmlizer"; + +const log = getLog("SchemaForm"); +const ajv = new Ajv({ allErrors: false, strictSchema: false, useDefaults: true, allowUnionTypes: true }); + +/** + * Renders a form based on a JSON schema. Supports nested objects, arrays of objects, and oneOf using recursion. + * + * @param jsonSchema - schema to render (ROOT object schema or schema part of nested object) + * @param path - path for the nested objects. For ROOT object, path must not be provided. + * @param onChange - callback for when the value changes. `path` is always calculated for the ROOT object + * @param obj - object to render (ROOT object or nested object) + * @param hiddenFields - fields to hide. It is mirror of ROOT object where only fields that needed to be hidden are present. + * @param showErrors - enables showing validation errors. It is recommended to disable this when for the fresh form of new object until the first save attempt. + */ +export const SchemaForm: React.FC<{ + path?: string[]; + jsonSchema: any; + hiddenFields?: any; + showErrors?: boolean; + onChange: (path: string[], v: any) => void; + obj: any; +}> = ({ jsonSchema, path, onChange, obj, hiddenFields, showErrors }) => { + const required = useMemo(() => (jsonSchema.required as string[]) || [], [jsonSchema.required]); + const properties = useMemo(() => (jsonSchema.properties || {}) as Record, [jsonSchema.properties]); + + const validateSingle = useCallback( + (name: string, fieldSchema: any, value: any) => { + // ajv validates 'oneOf' without determinant against all possible variants and returns error messages for all of them + // airbyte schema seems to uses oneOf without determinants. So we better skip validation for such fields + if (typeof fieldSchema.oneOf === "undefined" && typeof fieldSchema.const === "undefined") { + const req = required.includes(name); + const noValue = typeof value === "undefined" || value === null || value === ""; + if (req && noValue) { + return "Required"; + } else if (!noValue) { + const validate = ajv.compile(fieldSchema); + if (!validate(value)) { + //show only one error message for the field + return validate.errors?.[0].message; + } + } + } + }, + [required] + ); + + // Pre init object with default values and constants + // Rendering will be skipped until all necessary fields will be initialized + // since changed obj value will trigger consequent rerender anyway + const skipRender = useMemo( + () => + Object.entries(properties).reduce((acc: boolean, [n, f]) => { + const value = obj?.[n]; + if (value === undefined && f.default) { + onChange(path ? [...path, n] : [n], f.default); + return true; + } else if (f.const && value !== f.const) { + onChange(path ? [...path, n] : [n], f.const); + return true; + } + return acc; + }, false), + [obj, onChange, path, properties] + ); + + // Validate all object fields + const errors = useMemo(() => { + return skipRender + ? {} + : Object.entries(properties).reduce((acc: any, [n, f]) => { + const value = obj?.[n]; + const error = validateSingle(n, f, value); + if (error) { + acc = set(acc, path ? [...path, n] : n, error); + } + return acc; + }, {}); + }, [obj, path, properties, skipRender, validateSingle]); + + if (skipRender) { + return null; + } + + return ( + <> + {Object.entries(properties) + .sort((a, b) => a[1].order - b[1].order) + .map(([n, f]) => { + const newPath = path ? [...path, n] : [n]; + const error = get(errors, newPath); + const isHidden = !(error && showErrors) && get(hiddenFields, newPath); + + const change = (v: any) => { + onChange(newPath, v); + }; + let value = obj?.[n]; + + const editorProps = { value, onChange: change }; + + if (f.const) { + if (f.description) { + return ( +
+ {f.description} +
+ ); + } else { + return null; + } + } + + return ( + {f.description}} + required={required.includes(n)} + > + <> + {(function () { + if (f.type === "object") { + if (f.oneOf) { + return ( + + ); + } + return ( + + ); + } + switch (f.type) { + case "integer": + case "number": + return ; + case "string": + if (f.format?.includes("date")) { + let format = "YYYY-MM-DD"; + switch (f.pattern) { + case "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$": + format = "YYYY-MM-DDTHH:mm:ss[Z]"; + break; + case "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}Z$": + format = "YYYY-MM-DDTHH:mm:ss.SSS[Z]"; + break; + } + return ; + } + if (f.enum) { + return ( + ({ + value: o, + label: o, + }))} + {...editorProps} + /> + ); + } + if (f.airbyte_secret) { + return ; + } + return ; + case "boolean": + return ; + case "array": + if (f.items?.type === "object") { + return ( + + ); + } else { + const options = f.items?.enum ?? []; + return ; + } + } + })()} + + + ); + })} + + ); +}; +const EditableTabs: React.FC<{ items; onAdd: () => void; onDelete: (k) => void }> = props => { + const [activeKey, setActiveKey] = useState(props.items?.length > 0 ? props.items[0]?.key : undefined); + + const onChange = (key: string) => { + setActiveKey(key); + }; + + const onEdit = (targetKey: React.MouseEvent | React.KeyboardEvent | string, action: "add" | "remove") => { + if (action === "add") { + setActiveKey(props.items.length ?? 1); + props.onAdd(); + } else { + if (activeKey >= props.items.length - 1) { + setActiveKey(props.items.length - 2); + } + props.onDelete(targetKey); + } + }; + + return ( + } + onEdit={onEdit} + items={props.items} + /> + ); +}; + +const ArrayOfObjects: React.FC<{ + name: string; + path: string[]; + fieldSchema: any; + value?: any; + hiddenFields?: any; + showErrors?: boolean; + onChange: (path: string[], v: any) => void; +}> = ({ fieldSchema, value, hiddenFields, name, path, onChange, showErrors }) => { + const items = !value + ? [] + : value.map((v, i) => { + const arrPath = [...path, i.toString()]; + return { + label: v?.name || v?.table_name || createDisplayName(name) + ` ${i + 1}`, + key: i, + children: ( +
+ +
+ ), + }; + }); + return ( + { + onChange([...path, value?.length ?? 0], {}); + }} + onDelete={k => onChange([...(path ?? []), k.toString()], undefined)} + items={items} + /> + ); +}; + +const OneOf: React.FC<{ + name: string; + path: string[]; + fieldSchema: any; + value?: any; + hiddenFields?: any; + showErrors?: boolean; + onChange: (path: string[], v: any) => void; +}> = ({ fieldSchema, value, hiddenFields, name, path, onChange, showErrors }) => { + const options = (fieldSchema.oneOf as any[]).map((o, i) => ({ + label: o.title, + value: i, + })); + + // find discriminator field. This is a field that is present in all oneOf variants and has a const or enum with a single value + // discriminator is used to determine which variant is selected + const consts = (fieldSchema.oneOf as any[]) + .map(o => o.properties) + .map(p => Object.entries(p as Record)) + .flat() + .reduce((acc: any, [k, v]) => { + if (v.const || v.enum?.length === 1) { + acc[k] = (acc[k] ?? 0) + 1; + } + return acc; + }, {}); + const discriminator = Object.entries(consts).find(([k, v]) => v === fieldSchema.oneOf?.length); + + if (!discriminator) { + log.atError().log("No discriminator found for oneOf field", name); + return <>; + } + const discriminatorKey = discriminator[0]; + const discriminatorValue = value?.[discriminatorKey]; + + let selected: any; + let selectedIdx: number = 0; + for (let i = 0; i < fieldSchema.oneOf.length; i++) { + const o = fieldSchema.oneOf[i]; + if ( + o.properties[discriminatorKey].const === discriminatorValue || + o.properties[discriminatorKey].enum?.[0] === discriminatorValue + ) { + selected = o; + selectedIdx = i; + break; + } + } + + return ( + <> + { + onChange(path, { + [discriminatorKey]: + fieldSchema.oneOf[v].properties[discriminatorKey].const || + fieldSchema.oneOf[v].properties[discriminatorKey].enum?.[0], + }); + }} + options={options} + /> + {selected && ( + + )} + + ); +}; diff --git a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx index 1bd40b61d..73a3879a3 100644 --- a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx +++ b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx @@ -1,7 +1,7 @@ import { useWorkspace } from "../../lib/context"; import { get } from "../../lib/useApi"; import { DestinationConfig, FunctionConfig, StreamConfig } from "../../lib/schema"; -import React, { PropsWithChildren, useEffect, useState } from "react"; +import React, { useEffect, useState } from "react"; import { SomeZodObject, z } from "zod"; import { ConfigurationObjectLinkDbModel } from "../../prisma/schema"; import { useRouter } from "next/router"; @@ -19,6 +19,7 @@ import styles from "./ConnectionEditorPage.module.css"; import { JitsuButton } from "../JitsuButton/JitsuButton"; import { StreamTitle } from "../../pages/[workspaceId]/streams"; import { DestinationTitle } from "../../pages/[workspaceId]/destinations"; +import { Htmlizer } from "../Htmlizer/Htmlizer"; const log = getLog("ConnectionEditorPage"); @@ -29,10 +30,6 @@ type SelectorProps = { onSelect: (value: string) => void; }; -const Htmlizer: React.FC> = ({ children }) => { - return typeof children === "string" ? : <>{children}; -}; - type ConnectionOptionsType = Partial & { [key: string]: any }; function DestinationSelector(props: SelectorProps) { @@ -216,8 +213,8 @@ export const SyncFrequencyEditor: EditorComponent; type SwitchComponentType = EditorComponent; -export const TextEditor: TextEditorComponent = ({ rows, value, onChange, disabled, className }) => { - if (rows) { +const TextEditor: TextEditorComponent = ({ rows, value, onChange, disabled, className }) => { + if (rows && rows > 1) { return ( !!x) - .join("\n"); + const message = props.error?.message && `${props.error.message}`; + const stack = props.error?.stack && `${props.error.stack}`; + return ( <> - {details.length > 0 && ( + {message && ( + <> +
Error:
+ {message} + + )} + {stack && ( <> -
Error
- {details} +
Stack:
+ {stack} )} {props.error.response && ( diff --git a/webapps/console/components/Htmlizer/Htmlizer.tsx b/webapps/console/components/Htmlizer/Htmlizer.tsx new file mode 100644 index 000000000..bd5153b64 --- /dev/null +++ b/webapps/console/components/Htmlizer/Htmlizer.tsx @@ -0,0 +1,5 @@ +import React, { PropsWithChildren } from "react"; + +export const Htmlizer: React.FC> = ({ children }) => { + return typeof children === "string" ? : <>{children}; +}; diff --git a/webapps/console/components/ServiceEditor/ServiceEditor.tsx b/webapps/console/components/ServiceEditor/ServiceEditor.tsx index c57acca05..9ce01fd0f 100644 --- a/webapps/console/components/ServiceEditor/ServiceEditor.tsx +++ b/webapps/console/components/ServiceEditor/ServiceEditor.tsx @@ -1,13 +1,12 @@ import { EditorComponentProps } from "../ConfigObjectEditor/ConfigEditor"; -import React, { useCallback, useEffect, useState } from "react"; +import React, { useCallback, useEffect, useMemo, useState } from "react"; import { getErrorMessage, getLog, rpc } from "juava"; import { EditorTitle } from "../ConfigObjectEditor/EditorTitle"; import { EditorBase } from "../ConfigObjectEditor/EditorBase"; import { LoadingAnimation } from "../GlobalLoader/GlobalLoader"; import { EditorField } from "../ConfigObjectEditor/EditorField"; -import { TextEditor } from "../ConnectionEditorPage/ConnectionEditorPage"; import { ServiceConfig } from "../../lib/schema"; -import { Button, Select } from "antd"; +import { Select } from "antd"; import { EditorButtons } from "../ConfigObjectEditor/EditorButtons"; import { getConfigApi } from "../../lib/useApi"; import { feedbackError } from "../../lib/ui"; @@ -16,10 +15,14 @@ import { useRouter } from "next/router"; import { JitsuButton } from "../JitsuButton/JitsuButton"; import Nango from "@nangohq/frontend"; import { oauthDecorators } from "../../lib/server/oauth/services"; -import { CodeEditor } from "../CodeEditor/CodeEditor"; import { CheckCircleTwoTone, InfoCircleTwoTone } from "@ant-design/icons"; - -const log = getLog("ServiceEditor"); +import set from "lodash/set"; +import get from "lodash/get"; +import Ajv from "ajv"; +import unset from "lodash/unset"; +import { SchemaForm } from "../ConfigObjectEditor/SchemaForm"; +import { TextEditor } from "../ConfigObjectEditor/Editors"; +import { useAntdModal } from "../../lib/modal"; type ServiceEditorProps = {} & EditorComponentProps; @@ -40,16 +43,23 @@ export const ServiceEditor: React.FC = props => { const [obj, setObj] = useState>({ ...props.object, }); - const [formState, setFormState] = useState(undefined); - const isTouched = formState !== undefined || !!createNew; + const [credentials, setCredentials] = useState(obj.credentials ? JSON.parse(obj.credentials) : {}); + const [isTouched, setIsTouched] = useState(false); + const [showErrors, setShowErrors] = useState(false); const [loading, setLoading] = useState(false); const [nangoLoading, setNangoLoading] = useState(false); const [nangoError, setNangoError] = useState(undefined); const [credUserProvided, setCredUserProvided] = useState(!!obj.credentials && obj.credentials !== "{}"); - const [loadingSpecs, setLoadingSpecs] = useState(false); + const [loadingSpecs, setLoadingSpecs] = useState(true); const [specs, setSpecs] = useState(undefined); const oauthConnector = oauthDecorators.find(d => d.packageId === obj.package); + const [manualAuth, setManualAuth] = useState(typeof oauthConnector === "undefined"); + const ajv = useMemo( + () => new Ajv({ allErrors: true, strictSchema: false, useDefaults: true, allowUnionTypes: true }), + [] + ); + const modal = useAntdModal(); const change = useCallback( (key: string, value: any) => { @@ -57,13 +67,13 @@ export const ServiceEditor: React.FC = props => { ...obj, [key]: value, }); + setIsTouched(true); }, [obj] ); useEffect(() => { - if (credUserProvided || specs) { - console.log("No need to load specs. Credentials are already filled."); + if (specs) { return; } (async () => { @@ -74,14 +84,15 @@ export const ServiceEditor: React.FC = props => { if (firstRes.ok) { console.log("Loaded cached specs:", JSON.stringify(firstRes, null, 2)); setSpecs(firstRes.specs); - change("credentials", JSON.stringify(firstRes.fakeJson, null, 2)); + if (!credUserProvided) { + change("credentials", JSON.stringify(firstRes.fakeJson, null, 2)); + } + } else if (firstRes.error) { + feedbackError(`Cannot load specs for ${obj.package}:${obj.version} error: ${firstRes.error}`); + return; } else { for (let i = 0; i < 60; i++) { await new Promise(resolve => setTimeout(resolve, 2000)); - console.log( - "Loading specs attempt", - `/api/${workspace.id}/sources/spec?package=${obj.package}&version=${obj.version}&after=${firstRes.startedAt}` - ); const resp = await rpc( `/api/${workspace.id}/sources/spec?package=${obj.package}&version=${obj.version}&after=${firstRes.startedAt}` ); @@ -92,7 +103,9 @@ export const ServiceEditor: React.FC = props => { } else { console.log("Loaded specs:", JSON.stringify(resp, null, 2)); setSpecs(resp.specs); - change("credentials", JSON.stringify(resp.fakeJson, null, 2)); + if (!credUserProvided) { + change("credentials", JSON.stringify(resp.fakeJson, null, 2)); + } return; } } @@ -107,9 +120,51 @@ export const ServiceEditor: React.FC = props => { })(); }, [workspace.id, credUserProvided, obj.package, obj.version, change, specs]); + const validate = useCallback(() => { + const validate = ajv.compile(specs.connectionSpecification); + const valid = validate(credentials); + const errors: string[] = []; + if (!obj.name) { + errors.push("[required] Object must have required property 'name'"); + } + if (!valid || errors.length > 0) { + errors.push( + ...(validate.errors ?? []).reduce((acc: string[], err) => { + acc.push(`${err.instancePath || "Object"} ${err.message}`); + return acc; + }, []) + ); + setShowErrors(true); + modal.error({ + title: "There are errors in the configuration", + style: { width: "600px" }, + content: ( +
+ Please fix following errors. Fields with errors are marked with red{" "} +
    + {errors.map((e: any, i) => { + return ( +
  • + {e} +
  • + ); + })} +
+
+ ), + }); + return false; + } + return true; + }, [ajv, credentials, obj.name, specs]); + const save = useCallback(async () => { setLoading(true); try { + if (!validate()) { + return; + } + obj.credentials = JSON.stringify(credentials); if (props.isNew) { await getConfigApi(workspace.id, "service").create(obj); } else if (obj.id) { @@ -123,7 +178,7 @@ export const ServiceEditor: React.FC = props => { } finally { setLoading(false); } - }, [props.isNew, obj, workspace.id, push]); + }, [validate, obj, credentials, props.isNew, push, workspace.id]); if (meta === undefined) { return ; @@ -136,8 +191,77 @@ export const ServiceEditor: React.FC = props => { return ( onCancel(isTouched)} /> - - + {oauthConnector && ( +
+
+ { + const nango = new Nango({ + publicKey: appConfig.nango!.publicKey, + host: appConfig.nango!.host, + }); + setNangoLoading(true); + nango + .auth(oauthConnector.nangoIntegrationId ?? "", `sync-source.${obj?.id}`) + .then(result => { + const strippedSchema = oauthConnector.stripSchema(credentials || {}); + setObj({ ...obj, credentials: JSON.stringify(strippedSchema), authorized: true }); + setCredentials(strippedSchema); + setCredUserProvided(true); + setNangoError(undefined); + }) + .catch(err => { + setNangoError(getErrorMessage(err)); + getLog().atError().log("Failed to add oauth connection", err); + change.bind(null, "authorized")(false); + }) + .finally(() => setNangoLoading(false)); + }} + icon={ + {obj?.package} + } + > + {obj?.authorized ? "Re-Sign In" : "Authorize"} + +
+
+ {nangoError ? ( + OAuth2 error: {nangoError} + ) : obj?.authorized ? ( + <> + + Authorized + + ) : ( + <> + + Click "Authorize" to open OAuth2.0 authorization popup + + )} +
+
+ setManualAuth(!manualAuth)}> + {manualAuth ? "Hide authorization settings" : "Manually setup authorization"} + +
+
+ )} + + = props => { value={obj.version ?? ""} onChange={v => { change.bind(null, "version")(v); + setLoadingSpecs(true); setSpecs(undefined); }} versions={meta.versions} /> - - {loadingSpecs ? ( - - ) : ( -
- {oauthConnector && ( -
-
- { - const nango = new Nango({ publicKey: appConfig.nango!.publicKey, host: appConfig.nango!.host }); - setNangoLoading(true); - nango - .auth(oauthConnector.nangoIntegrationId ?? "", `sync-source.${obj?.id}`) - .then(result => { - const strippedSchema = JSON.stringify( - oauthConnector.stripSchema(JSON.parse(obj?.credentials ?? "{}")), - null, - 4 - ); - setObj({ ...obj, credentials: strippedSchema, authorized: true }); - setNangoError(undefined); - }) - .catch(err => { - setNangoError(getErrorMessage(err)); - getLog().atError().log("Failed to add oauth connection", err); - change.bind(null, "authorized")(false); - }) - .finally(() => setNangoLoading(false)); - }} - icon={ - {obj?.package} - } - > - {obj?.authorized ? "Re-Sign In" : "Authorize"} - -
-
- {nangoError ? ( - OAuth2 error: {nangoError} - ) : obj?.authorized ? ( - <> - - Authorized - - ) : ( - <> - - Click "Authorize" to open OAuth2.0 authorization popup - - )} -
-
- )} -
-
- -
-
- { - change.bind(null, "credentials")(v); - setCredUserProvided(true); - }} - language={"json"} - height={"206px"} - /> -
-
-
- )} -
+ {loadingSpecs ? ( + + ) : ( + !!specs && ( + <> + { + const newCred = { ...credentials }; + const lastPathEl = n[n.length - 1]; + if (v === undefined && lastPathEl.match(/^\d+$/)) { + //remove element from array + get(newCred, n.slice(0, n.length - 1)).splice(parseInt(lastPathEl), 1); + } else if (v === undefined || v === null || v === "") { + //remove element from object + unset(newCred, n); + } else { + set(newCred, n, v); + } + setIsTouched(true); + setCredentials(newCred); + }} + obj={credentials} + /> + + ) + )} onCancel(isTouched)} onSave={save} - onTest={() => onTest!(obj)} + onTest={() => { + if (!validate()) { + return Promise.resolve({ ok: false, error: "Config validation failed" }); + } + return onTest!({ ...obj, credentials: JSON.stringify(credentials) }); + }} />
); diff --git a/webapps/console/lib/zod.ts b/webapps/console/lib/zod.ts index 83ed7e50d..b00d07c73 100644 --- a/webapps/console/lib/zod.ts +++ b/webapps/console/lib/zod.ts @@ -51,6 +51,5 @@ export function prepareZodObjectForDeserialization(obj: any) { } export function createDisplayName(name: string) { - const result = name.replace(/([A-Z])/g, " $1"); - return result.charAt(0).toUpperCase() + result.slice(1); + return name.replace(/([-_][a-z]|^[a-z])/g, group => group.toUpperCase().replace("-", " ").replace("_", " ")); } diff --git a/webapps/console/package.json b/webapps/console/package.json index aaed34cac..489903d70 100644 --- a/webapps/console/package.json +++ b/webapps/console/package.json @@ -34,10 +34,11 @@ "@monaco-editor/react": "4.5.0", "@nangohq/frontend": "^0.21.11", "@prisma/client": "^4.12.0", - "@rjsf/antd": "5.3.1", - "@rjsf/core": "5.3.1", - "@rjsf/utils": "5.3.1", - "@rjsf/validator-ajv6": "5.3.1", + "@rjsf/antd": "5.10.0", + "@rjsf/core": "5.10.0", + "@rjsf/utils": "5.10.0", + "@rjsf/validator-ajv6": "5.10.0", + "ajv": "~8.12.0", "@sensejs/kafkajs-zstd-support": "^0.9.2", "@sentry/nextjs": "^7.57.0", "@tanstack/react-query": "^4.2.1", diff --git a/webapps/console/pages/[workspaceId]/destinations.tsx b/webapps/console/pages/[workspaceId]/destinations.tsx index 90d681a34..76bba6dbf 100644 --- a/webapps/console/pages/[workspaceId]/destinations.tsx +++ b/webapps/console/pages/[workspaceId]/destinations.tsx @@ -1,11 +1,6 @@ import { WorkspacePageLayout } from "../../components/PageLayout/WorkspacePageLayout"; import { Button, Modal, Popover, Skeleton, Table, Tabs, Tooltip } from "antd"; -import { - ConfigEditor, - ConfigEditorProps, - CustomWidgetProps, - FieldDisplay, -} from "../../components/ConfigObjectEditor/ConfigEditor"; +import { ConfigEditor, ConfigEditorProps, FieldDisplay } from "../../components/ConfigObjectEditor/ConfigEditor"; import { DestinationConfig } from "../../lib/schema"; import { confirmOp, feedbackError, serialization } from "../../lib/ui"; import { @@ -40,6 +35,8 @@ import Link from "next/link"; import { CodeEditor } from "../../components/CodeEditor/CodeEditor"; import { ObjectTitle } from "../../components/ObjectTitle/ObjectTitle"; import { useQueryStringState } from "../../lib/useQueryStringState"; +import { CustomWidgetProps } from "../../components/ConfigObjectEditor/Editors"; +import { Htmlizer } from "../../components/Htmlizer/Htmlizer"; const log = getLog("destinations"); const Loader: React.FC<{}> = () => { @@ -549,10 +546,6 @@ const ProvisionedDestinations = (props: any) => { ); }; -const Htmlizer: React.FC> = ({ children }) => { - return typeof children === "string" ? : <>{children}; -}; - const DestinationsList: React.FC<{ type?: string }> = ({ type }) => { const [showCatalog, setShowCatalog] = useQueryStringState("showCatalog", { defaultValue: false, @@ -684,6 +677,7 @@ const DestinationsList: React.FC<{ type?: string }> = ({ type }) => { (router.query.backTo ?? "") as string )}`; router.push(url); + setShowCatalog(false); }} dismiss={() => { setShowCatalog(false); diff --git a/webapps/console/pages/[workspaceId]/services.tsx b/webapps/console/pages/[workspaceId]/services.tsx index 3abf9f227..9620b12f1 100644 --- a/webapps/console/pages/[workspaceId]/services.tsx +++ b/webapps/console/pages/[workspaceId]/services.tsx @@ -190,6 +190,7 @@ const ServicesList: React.FC<{}> = () => { router.push( `/${workspace.id}/services?id=new&packageType=${packageType}&packageId=${encodeURIComponent(packageId)}` ); + setShowCatalog(false); }} /> diff --git a/webapps/console/pages/[workspaceId]/streams.tsx b/webapps/console/pages/[workspaceId]/streams.tsx index 2fbeb4e7f..b5cae1203 100644 --- a/webapps/console/pages/[workspaceId]/streams.tsx +++ b/webapps/console/pages/[workspaceId]/streams.tsx @@ -1,6 +1,6 @@ import { WorkspacePageLayout } from "../../components/PageLayout/WorkspacePageLayout"; import { Button, Input, notification, Tag, Tooltip } from "antd"; -import { ConfigEditor, ConfigEditorProps, CustomWidgetProps } from "../../components/ConfigObjectEditor/ConfigEditor"; +import { ConfigEditor, ConfigEditorProps } from "../../components/ConfigObjectEditor/ConfigEditor"; import { StreamConfig } from "../../lib/schema"; import { useAppConfig, useWorkspace } from "../../lib/context"; import React, { PropsWithChildren, useMemo, useState } from "react"; @@ -22,6 +22,7 @@ import { Globe, Wrench } from "lucide-react"; import { FaviconLoader } from "./index"; import { ObjectTitle } from "../../components/ObjectTitle/ObjectTitle"; import omit from "lodash/omit"; +import { CustomWidgetProps } from "../../components/ConfigObjectEditor/Editors"; const Streams: React.FC = () => { return ( From 5532f871fe8a67808b415806f271136e95757878 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Sat, 22 Jul 2023 08:31:08 +0400 Subject: [PATCH 0080/1353] Fixed new function saving bug --- webapps/console/pages/[workspaceId]/functions.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/webapps/console/pages/[workspaceId]/functions.tsx b/webapps/console/pages/[workspaceId]/functions.tsx index 44688b800..2dad6e2c8 100644 --- a/webapps/console/pages/[workspaceId]/functions.tsx +++ b/webapps/console/pages/[workspaceId]/functions.tsx @@ -53,6 +53,7 @@ const FunctionsList: React.FC<{}> = () => { }, noun: "function", type: "function", + newObject: () => ({ name: "New function" }), icon: f => , explanation: (
From e378121269e972fa3cd4ad3bbc61168c9feca3b0 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Sat, 22 Jul 2023 10:54:17 +0400 Subject: [PATCH 0081/1353] small fixes --- .../ConnectionEditorPage.tsx | 4 ++++ .../components/ObjectTitle/ObjectTitle.tsx | 6 +++--- .../ServicesCatalog/ServicesCatalog.tsx | 8 ++++---- .../console/pages/[workspaceId]/services.tsx | 4 ++-- webapps/console/pages/_app.tsx | 8 ++++---- webapps/console/pages/api/sources/logo.ts | 20 +++++++++++++++++-- 6 files changed, 35 insertions(+), 15 deletions(-) diff --git a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx index 73a3879a3..c0570f27c 100644 --- a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx +++ b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx @@ -403,6 +403,10 @@ function ConnectionEditor({ The unique field that should present in any event. In case of duplicated values, the new event will either replace the old one or be dropped as 'failed' event depending on 'Deduplicate' option. Don't change this field unless you know what you are doing. +
+
+ Keep in mind that for data warehouses, all field names get translated to snake_case. For example,{" "} + messageId get translated to message_id. ), component: ( diff --git a/webapps/console/components/ObjectTitle/ObjectTitle.tsx b/webapps/console/components/ObjectTitle/ObjectTitle.tsx index a627c6b61..351cf4dae 100644 --- a/webapps/console/components/ObjectTitle/ObjectTitle.tsx +++ b/webapps/console/components/ObjectTitle/ObjectTitle.tsx @@ -8,11 +8,11 @@ export const ObjectTitle: React.FC<{ const iconClassName = (() => { switch (size) { case "small": - return "h-4 w-4"; + return "h-4 w-4 flex-shrink-0"; case "large": - return "h-10 w-10"; + return "h-10 w-10 flex-shrink-0"; default: - return "h-6 w-6"; + return "h-6 w-6 flex-shrink-0"; } })(); return ( diff --git a/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx b/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx index 7e8e20c2d..687341139 100644 --- a/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx +++ b/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx @@ -43,14 +43,14 @@ function groupByType(sources: SourceType[]): Record { .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}); } -export function getDestinationIcon(source: SourceType) { +export function getServiceIcon(source: SourceType) { const connectorSubtype = source.meta.connectorSubtype; return source.logo ? ( {source.meta.name} ) : connectorSubtype === "database" ? ( - + ) : ( - + ); } @@ -95,7 +95,7 @@ export const ServicesCatalog: React.FC<{ onClick: (packageType, packageId: strin className={`flex items-center cursor-pointer relative w-72 border border-textDisabled ${"hover:scale-105 hover:border-primary"} transition ease-in-out rounded-lg px-4 py-4 space-x-4 m-4`} onClick={() => onClick(source.packageType, source.packageId)} > -
{getDestinationIcon(source)}
+
{getServiceIcon(source)}
{source.meta.name}
diff --git a/webapps/console/pages/[workspaceId]/services.tsx b/webapps/console/pages/[workspaceId]/services.tsx index 9620b12f1..f9c5afdf9 100644 --- a/webapps/console/pages/[workspaceId]/services.tsx +++ b/webapps/console/pages/[workspaceId]/services.tsx @@ -7,7 +7,7 @@ import { getLog, hash as jhash, randomId, rpc } from "juava"; import React from "react"; import { Modal } from "antd"; import { serialization, useURLPersistedState } from "../../lib/ui"; -import { ServicesCatalog } from "../../components/ServicesCatalog/ServicesCatalog"; +import { getServiceIcon, ServicesCatalog } from "../../components/ServicesCatalog/ServicesCatalog"; import { SourceType } from "../api/sources"; import hash from "stable-hash"; import { ServiceEditor } from "../../components/ServiceEditor/ServiceEditor"; @@ -161,7 +161,7 @@ const ServicesList: React.FC<{}> = () => { const verb = isNew ? "New" : "Edit"; return (
-
{{meta.packageId}}
+
{getServiceIcon(meta)}
{verb} service: {meta.meta.name}
); diff --git a/webapps/console/pages/_app.tsx b/webapps/console/pages/_app.tsx index 12e02ac69..67e2a86b4 100644 --- a/webapps/console/pages/_app.tsx +++ b/webapps/console/pages/_app.tsx @@ -523,13 +523,13 @@ export const App = ({ Component, pageProps }: AppProps) => { useTitle(branding.productName); const router = useRouter(); const [loading, setLoading] = useState(false); - const startLoader = (url: string, { shallow }: { shallow?: boolean }) => { - if (!shallow) { + const startLoader = (url: string, en?: { shallow?: boolean }) => { + if (!en?.shallow) { setLoading(true); } }; - const hideLoader = (url: string, { shallow }: { shallow?: boolean }) => { - if (!shallow) { + const hideLoader = (url: string, en?: { shallow?: boolean }) => { + if (!en?.shallow) { setLoading(false); } }; diff --git a/webapps/console/pages/api/sources/logo.ts b/webapps/console/pages/api/sources/logo.ts index ed3d68e45..83aca2133 100644 --- a/webapps/console/pages/api/sources/logo.ts +++ b/webapps/console/pages/api/sources/logo.ts @@ -8,14 +8,30 @@ export default async function handler(req, res) { const data = await db .prisma() - .connectorPackage.findFirst({ where: { packageId, packageType }, select: { logoSvg: true } }); + .connectorPackage.findFirst({ where: { packageId, packageType }, select: { logoSvg: true, meta: true } }); if (!data) { const msg = `Icon for ${packageType} - ${packageId} not found`; res.status(404).json({ status: 404, message: msg }); - } else { + } else if (data.logoSvg) { res.setHeader("Content-Type", "image/svg+xml"); res.setHeader("Cache-Control", "public, max-age=2592000, immutable"); res.status(200).send(data.logoSvg); + } else { + res.setHeader("Content-Type", "image/svg+xml"); + res.setHeader("Cache-Control", "public, max-age=2592000, immutable"); + if ((data.meta as any).connectorSubtype === "database") { + res + .status(200) + .send( + '' + ); + } else { + res + .status(200) + .send( + '' + ); + } } } catch (e) { res.status(500).json({ status: 500, message: getErrorMessage(e) }); From fb8ed57fd66c3ef9c2a1f9f0ce0239b6285ece77 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 24 Jul 2023 18:17:46 +0400 Subject: [PATCH 0082/1353] Sync Tasks UI: show synced bytes --- webapps/console/lib/schema/destinations.tsx | 13 ++++++++ .../pages/[workspaceId]/syncs/tasks.tsx | 30 ++++++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/webapps/console/lib/schema/destinations.tsx b/webapps/console/lib/schema/destinations.tsx index 3e4bcbaa5..302907ee1 100644 --- a/webapps/console/lib/schema/destinations.tsx +++ b/webapps/console/lib/schema/destinations.tsx @@ -459,6 +459,14 @@ export const coreDestinations: DestinationType[] = [ region: z.enum(s3Regions).describe("S3 Region::S3 Region"), bucket: z.string().describe("S3 Bucket Name::S3 Bucket Name"), }), + credentialsUi: { + password: { + password: true, + }, + secretAccessKey: { + password: true, + }, + }, description: "Amazon Redshift is a cloud data warehouse that is optimized for the analytical workloads of business intelligence (BI) and data warehousing (DWH). Jitsu supports both Serverless and Classic Redshift", }, @@ -517,6 +525,11 @@ export const coreDestinations: DestinationType[] = [ endpoint: z.string().optional().describe("Custom endpoint of S3-compatible server"), }) .merge(blockStorageSettings), + credentialsUi: { + secretAccessKey: { + password: true, + }, + }, }, { id: "gcs", diff --git a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx index 8de6b2398..b3fdef17a 100644 --- a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx @@ -27,6 +27,26 @@ type DatesRange = [string | null, string | null]; const formatDate = (date: string | Date) => dayjs(date, "YYYY-MM-DDTHH:mm:ss.SSSZ").utc().format("YYYY-MM-DD HH:mm:ss"); +const formatBytes = bytes => { + const dp = 1; + const thresh = 1024; + + if (Math.abs(bytes) < thresh) { + return bytes + " bytes"; + } + + const units = ["KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"]; + let u = -1; + const r = 10 ** dp; + + do { + bytes /= thresh; + ++u; + } while (Math.round(Math.abs(bytes) * r) / r >= thresh && u < units.length - 1); + + return bytes.toFixed(dp) + " " + units[u]; +}; + type TasksDbModel = z.infer; type TasksTableProps = { @@ -90,8 +110,15 @@ function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap }: const des = JSON.parse(task.description || "{}"); //sum des values let processed_rows = 0; + let processed_bytes = 0; for (const key in des) { - processed_rows += des[key]; + const stat = des[key]; + if (typeof stat === "number") { + processed_rows += des[key]; + } else if (typeof stat === "object") { + processed_rows += des[key].events; + processed_bytes += des[key].bytes; + } } return (
@@ -99,6 +126,7 @@ function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap }: SUCCESS {processed_rows.toLocaleString()} rows + {formatBytes(processed_bytes)}
); } catch (e) {} From 3405ad07f4f6f514f405af421de0b3261d52c6d6 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 24 Jul 2023 19:49:19 +0400 Subject: [PATCH 0083/1353] reduce logging --- services/rotor/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index 59d1e95c7..234710b1c 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -69,7 +69,7 @@ export async function rotorMessageHandler(_message: string | undefined) { ); log - .atInfo() + .atDebug() .log( `Processing ${message.type} Message ID: ${message.messageId} for: ${connection.id} (${connection.streamId} → ${connection.destinationId}(${connection.type}))` ); From 279723689f4742468127b327709f6c314bacf354 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 25 Jul 2023 12:27:48 +0400 Subject: [PATCH 0084/1353] Live Events: show track event name in summary. Upgrade lucide-react package --- pnpm-lock.yaml | 8 ++++---- .../console/components/DataView/EventsBrowser.tsx | 13 ++++++++++++- webapps/console/package.json | 2 +- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5533823c8..d6c4a3336 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -593,8 +593,8 @@ importers: specifier: ^4.17.21 version: 4.17.21 lucide-react: - specifier: ^0.125.0 - version: 0.125.0(react@18.2.0) + specifier: ^0.263.1 + version: 0.263.1(react@18.2.0) mjml: specifier: ^4.13.0 version: 4.14.1 @@ -17549,8 +17549,8 @@ packages: resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} dev: false - /lucide-react@0.125.0(react@18.2.0): - resolution: {integrity: sha512-tadphtB6TPytEitR9vX75hqu9PQT/uz5RcvXMq976nC190eukAM9+cHMgBxfvfEGDXwIhIT9aFxTUGdAjxw9uQ==} + /lucide-react@0.263.1(react@18.2.0): + resolution: {integrity: sha512-keqxAx97PlaEN89PXZ6ki1N8nRjGWtDa4021GFYLNj0RgruM5odbpl8GHTExj0hhPq3sF6Up0gnxt6TSHu+ovw==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 dependencies: diff --git a/webapps/console/components/DataView/EventsBrowser.tsx b/webapps/console/components/DataView/EventsBrowser.tsx index 47ddcbe63..09908f44d 100644 --- a/webapps/console/components/DataView/EventsBrowser.tsx +++ b/webapps/console/components/DataView/EventsBrowser.tsx @@ -18,7 +18,7 @@ import { getConfigApi, useEventsLogApi } from "../../lib/useApi"; import { FunctionTitle } from "../../pages/[workspaceId]/functions"; import { FunctionConfig } from "../../lib/schema"; import { arrayToMap } from "../../lib/shared/arrays"; -import { RefreshCw } from "lucide-react"; +import { BadgeCheck, RefreshCw } from "lucide-react"; import { JitsuButton } from "../JitsuButton/JitsuButton"; import { ConnectionTitle } from "../../pages/[workspaceId]/connections"; import { StreamTitle } from "../../pages/[workspaceId]/streams"; @@ -981,6 +981,17 @@ const IncomingEventsTable = ({ loadEvents, loading, streamType, entityType, acto render: (d: IncomingEvent) => { return (
+ {d.event?.event && ( + + } + className={"whitespace-nowrap"} + > + {d.event?.event} + + + )} {d.host && ( } className={"whitespace-nowrap"}> diff --git a/webapps/console/package.json b/webapps/console/package.json index 489903d70..923f454e3 100644 --- a/webapps/console/package.json +++ b/webapps/console/package.json @@ -62,7 +62,7 @@ "kafkajs": "^2.2.4", "kafkajs-snappy": "^1.1.0", "lodash": "^4.17.21", - "lucide-react": "^0.125.0", + "lucide-react": "^0.263.1", "mjml": "^4.13.0", "mjml-react": "^2.0.8", "monaco-editor": "0.37.1", From ff5ef0069324e0b45f4bfef73379a746f798d66c Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 25 Jul 2023 15:54:16 +0400 Subject: [PATCH 0085/1353] jitsuLegacy data layout fixes Live Events improvements --- .../src/functions/bulker-destination.ts | 6 ++++-- .../console/components/DataView/EventsBrowser.tsx | 15 ++++++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/libs/core-functions/src/functions/bulker-destination.ts b/libs/core-functions/src/functions/bulker-destination.ts index 0c731c07b..75b437231 100644 --- a/libs/core-functions/src/functions/bulker-destination.ts +++ b/libs/core-functions/src/functions/bulker-destination.ts @@ -68,7 +68,7 @@ export function jitsuLegacy(event: AnalyticsServerEvent): MappedEvent { doc_path: url?.pathname, doc_search: url?.search, eventn_ctx_event_id: event.messageId, - event_type: event.type, + event_type: event.event || event.type, local_tz_offset: event.context?.page?.timezoneOffset || event.properties?.timezoneOffset, page_title: event.context?.page?.title, referer: event.context?.page?.referrer, @@ -92,7 +92,9 @@ export function jitsuLegacy(event: AnalyticsServerEvent): MappedEvent { user_language: event.context?.locale, utc_time: event.timestamp, utm: event.context?.campaign, - vp_size: "", + vp_size: + Math.max(event.context?.screen?.innerWidth || 0) + "x" + Math.max(event.context?.screen?.innerHeight || 0), + ...(event.type === "track" ? event.properties : {}), }) ); return { event: flat, table: event[TableNameParameter] ?? "events" }; diff --git a/webapps/console/components/DataView/EventsBrowser.tsx b/webapps/console/components/DataView/EventsBrowser.tsx index 09908f44d..972dd2148 100644 --- a/webapps/console/components/DataView/EventsBrowser.tsx +++ b/webapps/console/components/DataView/EventsBrowser.tsx @@ -569,8 +569,14 @@ const StreamEventsTable = ({ loadEvents, loading, streamType, entityType, actorI }, { title: "Type", - width: "8em", - dataIndex: ["content", "original", "type"], + width: "11em", + ellipsis: true, + key: "type", + className: "whitespace-nowrap", + dataIndex: ["content", "original"], + render: (o: any) => { + return o.type || o.event; + }, }, { title: "Page Host", @@ -674,7 +680,7 @@ const BatchTable = ({ loadEvents, loading, streamType, entityType, actorId, even loading={loading} loadEvents={loadEvents} events={events} - drawerNode={event => } + drawerNode={event => } columns={columns} /> ); @@ -748,6 +754,9 @@ const IncomingEventDrawer = ({ event }: { event: IncomingEvent }) => { drawerData.push({ name: , value: }); drawerData.push({ name: "Message ID", value: event.messageId }); drawerData.push({ name: "Type", value: event.type }); + if (event.event?.event) { + drawerData.push({ name: "Track Event Name", value: event.event.event }); + } drawerData.push({ name: "Status", value: (st => { From 242e672b3eb19cec9d5c5a0122bf8be4111ce2f9 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 25 Jul 2023 17:52:19 +0400 Subject: [PATCH 0086/1353] jitsuLegacy fix test. oauth nango: change integrationSettings node location --- libs/core-functions/__tests__/jitsu-legacy.test.ts | 2 +- webapps/console/pages/api/oauth/service.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/core-functions/__tests__/jitsu-legacy.test.ts b/libs/core-functions/__tests__/jitsu-legacy.test.ts index 375ea7744..a6eae7e0e 100644 --- a/libs/core-functions/__tests__/jitsu-legacy.test.ts +++ b/libs/core-functions/__tests__/jitsu-legacy.test.ts @@ -159,7 +159,7 @@ const legacyPageExpected = { name: "campaign", source: "source", }, - vp_size: "", + vp_size: "1280x720", }; test("legacy event", () => { diff --git a/webapps/console/pages/api/oauth/service.ts b/webapps/console/pages/api/oauth/service.ts index a4e404d9a..0e33cb804 100644 --- a/webapps/console/pages/api/oauth/service.ts +++ b/webapps/console/pages/api/oauth/service.ts @@ -69,6 +69,6 @@ export default createRoute() getLog().atInfo().log("Integration settings", JSON.stringify(integrationSettings, null, 2)); getLog().atInfo().log("Configuration object", JSON.stringify(nangoConnectionObject, null, 2)); - return oauthDecorator.merge(credentials, integrationSettings.config?.configRes, nangoConnectionObject.credentials); + return oauthDecorator.merge(credentials, integrationSettings.config, nangoConnectionObject.credentials); }) .toNextApiHandler(); From b52bd500ce47a2f1a94871c87e9a218d6b5ddef7 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 26 Jul 2023 15:57:16 +0400 Subject: [PATCH 0087/1353] jitsu-js: browser: allow to change jitsu object key in global window object --- libs/jitsu-js/src/browser.ts | 11 +++++++---- webapps/console/pages/[workspaceId]/streams.tsx | 1 + 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/libs/jitsu-js/src/browser.ts b/libs/jitsu-js/src/browser.ts index 78b440551..5923a9b80 100644 --- a/libs/jitsu-js/src/browser.ts +++ b/libs/jitsu-js/src/browser.ts @@ -2,6 +2,7 @@ import { JitsuOptions } from "./jitsu"; import { jitsuAnalytics } from "./index"; export type JitsuBrowserOptions = { + id?: string; userId?: string; onload?: string; initOnly?: boolean; @@ -40,9 +41,6 @@ function getScriptAttributes(scriptElement: HTMLScriptElement) { } (function () { - if (window["jitsu"]) { - console.log("Jitsu is already initialized"); - } function readJitsuOptions(): JitsuBrowserOptions { const scriptElement = window.document.currentScript as HTMLScriptElement; if (!scriptElement) { @@ -54,6 +52,11 @@ function getScriptAttributes(scriptElement: HTMLScriptElement) { } const options = readJitsuOptions(); + const JITSU_V2_ID: string = options.id || "jitsu"; + + if (window[JITSU_V2_ID]) { + console.log("Jitsu is already initialized"); + } if (options.debug) { console.log(`Jitsu options: `, JSON.stringify(options)); } @@ -70,7 +73,7 @@ function getScriptAttributes(scriptElement: HTMLScriptElement) { console.warn(`onload function ${options.onload} is not callable: ${typeof onloadFunction}`); } } - window["jitsu"] = jitsu; + window[JITSU_V2_ID] = jitsu; if (!options.initOnly) { jitsu.page(); diff --git a/webapps/console/pages/[workspaceId]/streams.tsx b/webapps/console/pages/[workspaceId]/streams.tsx index b5cae1203..fcb9546cc 100644 --- a/webapps/console/pages/[workspaceId]/streams.tsx +++ b/webapps/console/pages/[workspaceId]/streams.tsx @@ -432,6 +432,7 @@ const StreamsList: React.FC<{}> = () => { ), }, authorizedJavaScriptDomains: { + displayName: "Authorized JavaScript Domains", documentation: ( <> If this setting is not empty, JavaScript code from the specified domains will be able to post data to From 81f555dfb9b3fabc7f0328830c00ee6679f95002 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 26 Jul 2023 16:05:41 +0400 Subject: [PATCH 0088/1353] jitsu-js: browser: allow to change jitsu object key in global window object. (better naming) --- libs/jitsu-js/src/browser.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/jitsu-js/src/browser.ts b/libs/jitsu-js/src/browser.ts index 5923a9b80..d316560f5 100644 --- a/libs/jitsu-js/src/browser.ts +++ b/libs/jitsu-js/src/browser.ts @@ -2,7 +2,7 @@ import { JitsuOptions } from "./jitsu"; import { jitsuAnalytics } from "./index"; export type JitsuBrowserOptions = { - id?: string; + namespace?: string; userId?: string; onload?: string; initOnly?: boolean; @@ -52,7 +52,7 @@ function getScriptAttributes(scriptElement: HTMLScriptElement) { } const options = readJitsuOptions(); - const JITSU_V2_ID: string = options.id || "jitsu"; + const JITSU_V2_ID: string = options.namespace || "jitsu"; if (window[JITSU_V2_ID]) { console.log("Jitsu is already initialized"); From 9c358ab6c699e2f9d6a6e287b7b3009b3967e3ed Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 26 Jul 2023 19:11:27 +0400 Subject: [PATCH 0089/1353] fix for createDisplayName regression --- webapps/console/lib/server/fast-store.ts | 3 +-- webapps/console/lib/zod.ts | 4 +++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/webapps/console/lib/server/fast-store.ts b/webapps/console/lib/server/fast-store.ts index 2ca8bf0d3..f7339ce99 100644 --- a/webapps/console/lib/server/fast-store.ts +++ b/webapps/console/lib/server/fast-store.ts @@ -79,7 +79,7 @@ export type StreamWithDestinations = { export type EnrichedConnectionConfig = { id: string; workspaceId: string; - updatedAt: Date; + updatedAt?: Date; destinationId: string; streamId: string; metricsKeyPrefix: string; @@ -337,7 +337,6 @@ async function saveConnectionsToRedis(db: DatabaseConnection) { batchSize: 1_000_000, mode: "batch", }, - updatedAt: new Date(), credentials: { region: process.env.S3_REGION, accessKeyId: process.env.S3_ACCESS_KEY_ID, diff --git a/webapps/console/lib/zod.ts b/webapps/console/lib/zod.ts index b00d07c73..40a21f379 100644 --- a/webapps/console/lib/zod.ts +++ b/webapps/console/lib/zod.ts @@ -51,5 +51,7 @@ export function prepareZodObjectForDeserialization(obj: any) { } export function createDisplayName(name: string) { - return name.replace(/([-_][a-z]|^[a-z])/g, group => group.toUpperCase().replace("-", " ").replace("_", " ")); + return name + .replace(/([A-Z])/g, " $1") + .replace(/([-_][a-z]|^[a-z])/g, group => group.toUpperCase().replace("-", " ").replace("_", " ")); } From 178146fa307ae23210e51854de2621cf5d9ee5f6 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 27 Jul 2023 08:23:31 +0400 Subject: [PATCH 0090/1353] use dynamic import for lucide icons --- .../Billing/BillingBlockingDialog.tsx | 6 +- .../components/Billing/BillingManager.tsx | 20 ++++-- .../components/Billing/UpgradeDialog.tsx | 12 ++-- .../components/ButtonGroup/ButtonGroup.tsx | 7 +- .../components/CodeBlock/CodeBlock.tsx | 4 +- .../ConfigObjectEditor/ConfigEditor.tsx | 6 +- .../ConfigObjectEditor/EditorTitle.tsx | 9 ++- .../ConfigObjectEditor/SchemaForm.tsx | 4 +- .../ConnectionEditorPage.tsx | 9 ++- .../ConnectionsDiagram/ConnectionsDiagram.tsx | 4 +- .../components/DataView/EventsBrowser.tsx | 5 +- .../FunctionsDebugger/FunctionsDebugger.tsx | 10 +-- .../components/GlobalError/GlobalError.tsx | 4 +- .../console/components/Icons/LucideIcon.tsx | 15 ++++ .../console/components/Icons/RefreshCw.tsx | 28 ++++++++ .../PageLayout/WorkspacePageLayout.tsx | 71 +++++++++---------- .../ProvisionDatabaseButton.tsx | 12 +++- .../components/SQLViewer/SQLViewer.tsx | 9 ++- .../SyncEditorPage/SyncEditorPage.tsx | 9 ++- .../pages/[workspaceId]/connections/index.tsx | 6 +- .../pages/[workspaceId]/destinations.tsx | 22 ++++-- .../console/pages/[workspaceId]/functions.tsx | 10 +-- webapps/console/pages/[workspaceId]/index.tsx | 4 +- .../pages/[workspaceId]/settings/billing.tsx | 9 ++- .../pages/[workspaceId]/settings/index.tsx | 8 +-- webapps/console/pages/[workspaceId]/sql.tsx | 6 +- .../console/pages/[workspaceId]/streams.tsx | 9 +-- .../pages/[workspaceId]/syncs/index.tsx | 15 ++-- .../pages/[workspaceId]/syncs/logs.tsx | 7 +- .../pages/[workspaceId]/syncs/tasks.tsx | 7 +- webapps/console/pages/admin/oauth-test.tsx | 4 +- webapps/console/pages/admin/users.tsx | 14 ++-- webapps/console/pages/workspaces.tsx | 6 +- 33 files changed, 238 insertions(+), 133 deletions(-) create mode 100644 webapps/console/components/Icons/LucideIcon.tsx create mode 100644 webapps/console/components/Icons/RefreshCw.tsx diff --git a/webapps/console/components/Billing/BillingBlockingDialog.tsx b/webapps/console/components/Billing/BillingBlockingDialog.tsx index 9b87b117d..ed630569e 100644 --- a/webapps/console/components/Billing/BillingBlockingDialog.tsx +++ b/webapps/console/components/Billing/BillingBlockingDialog.tsx @@ -3,9 +3,9 @@ import { assertDefined, assertFalse, assertTrue, getLog } from "juava"; import { useUsage } from "./use-usage"; import { Modal } from "antd"; import { upgradeRequired } from "./copy"; -import { AlertTriangle, ArrowRight } from "lucide-react"; import { WJitsuButton } from "../JitsuButton/JitsuButton"; import { useWorkspace } from "../../lib/context"; +import LucideIcon from "../Icons/LucideIcon"; const log = getLog("billing"); @@ -30,7 +30,7 @@ function LoadAndBlockIfNeed() { open={true} title={
- +

Upgrade required

} @@ -42,7 +42,7 @@ function LoadAndBlockIfNeed() { className="w-full" size="large" type="primary" - icon={} + icon={} > Manage Billing {"&"} Plan diff --git a/webapps/console/components/Billing/BillingManager.tsx b/webapps/console/components/Billing/BillingManager.tsx index 4de6b498e..446ab738a 100644 --- a/webapps/console/components/Billing/BillingManager.tsx +++ b/webapps/console/components/Billing/BillingManager.tsx @@ -5,7 +5,6 @@ import { assertDefined, assertFalse, assertTrue, requireDefined, rpc } from "jua import { BillingSettings } from "../../lib/schema"; import { Alert, Button, Progress, Skeleton, Tooltip } from "antd"; import Link from "next/link"; -import { Check, Edit2, Info, XCircle } from "lucide-react"; import styles from "./BillingManager.module.css"; import { useQuery } from "@tanstack/react-query"; @@ -13,6 +12,7 @@ import { ErrorCard } from "../GlobalError/GlobalError"; import { useUsage } from "./use-usage"; import { upgradeRequired } from "./copy"; import { JitsuButton } from "../JitsuButton/JitsuButton"; +import LucideIcon from "../Icons/LucideIcon"; function formatNumber(n: number) { return n.toLocaleString("en-US", { maximumFractionDigits: 0 }); @@ -41,14 +41,18 @@ const ComparisonSection: React.FC<{ {header} {info && ( - + )}
    {items.map(item => (
  • - {typeof item === "string" || item.enabled ? : } + {typeof item === "string" || item.enabled ? ( + + ) : ( + + )} {typeof item === "string" ? item : item.header}
  • ))} @@ -150,7 +154,7 @@ const CurrentSubscription: React.FC<{}> = () => { href={`/api/${workspace.id}/ee/billing/manage?returnUrl=${encodeURIComponent(window.location.href)}`} > Manage subscription - + )}
@@ -280,7 +284,13 @@ const AvailablePlans: React.FC<{}> = () => { />
{planId === billing.settings.planId ? ( - } className="w-full" size="large" type="ghost" disabled={true}> + } + className="w-full" + size="large" + type="ghost" + disabled={true} + > Current plan ) : planId === "free" ? ( diff --git a/webapps/console/components/Billing/UpgradeDialog.tsx b/webapps/console/components/Billing/UpgradeDialog.tsx index 32c721763..5d7b6d328 100644 --- a/webapps/console/components/Billing/UpgradeDialog.tsx +++ b/webapps/console/components/Billing/UpgradeDialog.tsx @@ -2,8 +2,8 @@ import { Alert } from "antd"; import React from "react"; import { useBilling } from "./BillingProvider"; import { assertFalse, assertTrue } from "juava"; -import { AlertCircle, Lock, Unlock } from "lucide-react"; import { WJitsuButton } from "../JitsuButton/JitsuButton"; +import LucideIcon from "../Icons/LucideIcon"; function arrayJoin(arr: T[], sep: S): (T | S)[] { const result: (T | S)[] = []; @@ -29,10 +29,10 @@ export const UpgradeDialog: React.FC<{ featureDescription: string; availableInPl - Upgrade required + Upgrade required } - icon={} + icon={} description={
@@ -51,7 +51,11 @@ export const UpgradeDialog: React.FC<{ featureDescription: string; availableInPl plan.
- } type="primary" href={`/settings/billing`}> + } + type="primary" + href={`/settings/billing`} + > Upgrade to a plan with {featureDescription}
diff --git a/webapps/console/components/ButtonGroup/ButtonGroup.tsx b/webapps/console/components/ButtonGroup/ButtonGroup.tsx index 92db5ee33..91a90876a 100644 --- a/webapps/console/components/ButtonGroup/ButtonGroup.tsx +++ b/webapps/console/components/ButtonGroup/ButtonGroup.tsx @@ -5,7 +5,7 @@ import { BaseButtonProps } from "antd/lib/button/button"; import styles from "./ButtonGroup.module.css"; import { useRouter } from "next/router"; import { useWorkspace } from "../../lib/context"; -import { MoreVertical } from "lucide-react"; +import LucideIcon from "../Icons/LucideIcon"; const AntButtonGroup = Button.Group; @@ -66,7 +66,10 @@ export const ButtonGroup: React.FC = ({ items, collapseLast }) })} {collapsedItems.length > 0 && ( - } /> + } + /> )} diff --git a/webapps/console/components/CodeBlock/CodeBlock.tsx b/webapps/console/components/CodeBlock/CodeBlock.tsx index 25f1c2f27..de0b54370 100644 --- a/webapps/console/components/CodeBlock/CodeBlock.tsx +++ b/webapps/console/components/CodeBlock/CodeBlock.tsx @@ -40,7 +40,7 @@ import "highlight.js/styles/github-dark.css"; import hljs from "highlight.js/lib/common"; import { CopyButton } from "../CopyButton/CopyButton"; -import { Copy } from "lucide-react"; +import LucideIcon from "../Icons/LucideIcon"; export const CodeBlock: React.FC> = ({ lang, children, className }) => { assertDefined(children, "CodeBlock children must be defined"); @@ -54,7 +54,7 @@ export const CodeBlock: React.FC>
- +
diff --git a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx
index 16ce10ecd..0e208a63e 100644
--- a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx
+++ b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx
@@ -35,7 +35,6 @@ import { ErrorCard, GlobalError } from "../GlobalError/GlobalError";
 import { Action, confirmOp, doAction, feedbackError, feedbackSuccess, useTitle } from "../../lib/ui";
 import { branding } from "../../lib/branding";
 import { useAntdModal } from "../../lib/modal";
-import { Edit3, Inbox } from "lucide-react";
 import { createDisplayName, prepareZodObjectForSerialization } from "../../lib/zod";
 import { JitsuButton } from "../JitsuButton/JitsuButton";
 import { EditorTitle } from "./EditorTitle";
@@ -46,6 +45,7 @@ import { ButtonGroup, ButtonProps } from "../ButtonGroup/ButtonGroup";
 import cuid from "cuid";
 import { ObjectTitle } from "../ObjectTitle/ObjectTitle";
 import omitBy from "lodash/omitBy";
+import LucideIcon from "../Icons/LucideIcon";
 
 const log = getLog("ConfigEditor");
 
@@ -668,7 +668,7 @@ const ObjectsList: React.FC<{ objects: any[]; onDelete: (id: string) => Promise<
           {
             label: "Edit",
             href: `/${type}s?id=${record.id}`,
-            icon: ,
+            icon: ,
           },
           ...actions.map(action => ({
             disabled: !!(action.disabled && action.disabled(record)),
@@ -752,7 +752,7 @@ const ObjectListEditor: React.FC = props => {
         {list.length === 0 && !isLoading && !error && (
           
- +
You don't any have {props.noun}s configured.
) : ( @@ -91,7 +91,7 @@ export const EditableTitle: React.FC<{ children: string; onUpdate: (str: string) setEditing(true); }} > - +
)} @@ -225,7 +225,7 @@ export const FunctionsDebugger: React.FC = props => { type="default" disabled={saving} onClick={() => setShowConfig(!showConfig)} - icon={} + icon={} > Config diff --git a/webapps/console/components/GlobalError/GlobalError.tsx b/webapps/console/components/GlobalError/GlobalError.tsx index 6da20e3db..1406bbd09 100644 --- a/webapps/console/components/GlobalError/GlobalError.tsx +++ b/webapps/console/components/GlobalError/GlobalError.tsx @@ -7,8 +7,8 @@ import { signOut } from "next-auth/react"; import { getErrorMessage, getLog } from "juava"; import { firebaseSignOut } from "../../lib/firebase-client"; import { PropsWithChildrenClassname } from "../../lib/ui"; -import { AlertCircle } from "lucide-react"; import classNames from "classnames"; +import LucideIcon from "../Icons/LucideIcon"; export type GlobalErrorProps = { error: any; @@ -88,7 +88,7 @@ export const EmbeddedErrorMessage: React.FC - +
{children} {actions &&
{actions}
} diff --git a/webapps/console/components/Icons/LucideIcon.tsx b/webapps/console/components/Icons/LucideIcon.tsx new file mode 100644 index 000000000..472e90f61 --- /dev/null +++ b/webapps/console/components/Icons/LucideIcon.tsx @@ -0,0 +1,15 @@ +import dynamic from "next/dynamic"; +import type { LucideProps } from "lucide-react"; +import dynamicIconImports from "lucide-react/dynamicIconImports"; + +interface IconProps extends LucideProps { + name: keyof typeof dynamicIconImports; +} + +const LucideIcon = ({ name, ...props }: IconProps) => { + const LI = dynamic(dynamicIconImports[name]); + + return
  • ; +}; + +export default LucideIcon; diff --git a/webapps/console/components/Icons/RefreshCw.tsx b/webapps/console/components/Icons/RefreshCw.tsx new file mode 100644 index 000000000..fbff17b48 --- /dev/null +++ b/webapps/console/components/Icons/RefreshCw.tsx @@ -0,0 +1,28 @@ +import Icon from "@ant-design/icons"; +import { CustomIconComponentProps } from "@ant-design/icons/lib/components/Icon"; + +function Svg() { + return ( + + + + + + + ); +} + +export default function RefreshCw(props: Partial) { + return ; +} diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index 2255619c3..7decc24ec 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -7,24 +7,6 @@ import { Button, Drawer, Dropdown, Menu } from "antd"; import MenuItem from "antd/lib/menu/MenuItem"; import { ButtonLabel } from "../ButtonLabel/ButtonLabel"; import styles from "./WorkspacePageLayout.module.css"; -import { - Activity, - ArrowLeftRight, - BarChart3, - ChevronUp, - FilePlus, - Folders, - FunctionSquare, - Globe, - LayoutDashboard, - Loader2, - Server, - ServerCog, - Settings, - Share2, - ShieldAlert, - X, -} from "lucide-react"; import { NextRouter, useRouter } from "next/router"; import Link from "next/link"; @@ -46,6 +28,7 @@ import { useClassicProject } from "./ClassicProjectProvider"; import { useJitsu } from "@jitsu/jitsu-react"; import { useSearchParams } from "next/navigation"; import omit from "lodash/omit"; +import LucideIcon from "../Icons/LucideIcon"; export type PageLayoutProps = { fullscreen?: boolean; @@ -93,7 +76,7 @@ function AdminMenuItems() { log.atWarn().log("Failed to load user properties", error); } else if (data) { return ( - }> + }> Admin Users ); @@ -118,7 +101,7 @@ function WorkspacesMenu(props: { jitsuClassicAvailable: boolean }) { { key: "admin-users", label: "Admin Users", - icon: , + icon: , onClick: async () => { await router.push("/admin/users"); }, @@ -133,9 +116,9 @@ function WorkspacesMenu(props: { jitsuClassicAvailable: boolean }) { key: "all-workspaces", label: "View all workspaces", icon: workspacesLoading ? ( - + ) : ( - + ), onClick: async () => { setWorkspacesLoading(true); @@ -149,7 +132,11 @@ function WorkspacesMenu(props: { jitsuClassicAvailable: boolean }) { { key: "new-workspace", label: "Create new workspace", - icon: adding ? : , + icon: adding ? ( + + ) : ( + + ), onClick: async () => { setAdding(true); try { @@ -168,9 +155,9 @@ function WorkspacesMenu(props: { jitsuClassicAvailable: boolean }) { key: "switch", label: "Switch to Jitsu Classic", icon: classicLoading ? ( - + ) : ( - + ), onClick: async () => { setClassicLoading(true); @@ -374,25 +361,35 @@ function PageHeader() { const appConfig = useAppConfig(); const workspace = useWorkspace(); const items: TabsMenuItem[] = [ - { title: "Overview", path: "/", aliases: "/overview", icon: }, - { title: "Sites", path: "/streams", icon: }, - { title: "Destinations", path: "/destinations", icon: }, - { title: "Connections", path: "/connections", icon: }, - { title: "Functions", path: "/functions", icon: }, + { + title: "Overview", + path: "/", + aliases: "/overview", + icon: , + }, + { title: "Sites", path: "/streams", icon: }, + { title: "Destinations", path: "/destinations", icon: }, + { title: "Connections", path: "/connections", icon: }, + { title: "Functions", path: "/functions", icon: }, ]; if (workspace.featuresEnabled && workspace.featuresEnabled.includes("syncs")) { items.push( - { title: "Services", path: "/services", icon: }, - { title: "Syncs", path: "/syncs", icon: } + { title: "Services", path: "/services", icon: }, + { title: "Syncs", path: "/syncs", icon: } ); } items.push( - { title: "Live Events", path: "/data", icon: }, - { title: "Query Data", path: "/sql", icon: , hidden: !appConfig?.ee }, + { title: "Live Events", path: "/data", icon: }, + { + title: "Query Data", + path: "/sql", + icon: , + hidden: !appConfig?.ee, + }, { title: "Settings", path: "/settings", - icon: , + icon: , } ); return ( @@ -529,7 +526,7 @@ export const WorkspacePageLayout: React.FC> = className="border-l border-b border-r rounded-b-md px-8 py-0 shadow" onClick={() => setShowDrawer(!showDrawer)} > - +
  • @@ -553,7 +550,7 @@ export const WorkspacePageLayout: React.FC> = className="absolute right-0 top-0 mt-1 mr-2 hover:bg-neutral-100 p-1.5 rounded-lg flex justify-center items-center z-50" onClick={() => (onClose ? onClose() : router.back())} > - + )} {children} diff --git a/webapps/console/components/ProvisionDatabaseButton/ProvisionDatabaseButton.tsx b/webapps/console/components/ProvisionDatabaseButton/ProvisionDatabaseButton.tsx index 746653508..447ef1a7e 100644 --- a/webapps/console/components/ProvisionDatabaseButton/ProvisionDatabaseButton.tsx +++ b/webapps/console/components/ProvisionDatabaseButton/ProvisionDatabaseButton.tsx @@ -4,8 +4,8 @@ import React, { useState } from "react"; import { useRouter } from "next/router"; import { rpc } from "juava"; import { feedbackError, feedbackSuccess } from "../../lib/ui"; -import { Database, Loader2, Plus } from "lucide-react"; import { JitsuButton } from "../JitsuButton/JitsuButton"; +import LucideIcon from "../Icons/LucideIcon"; export function ProvisionDatabaseButton(props) { const { loader = undefined, createdCallback = undefined } = props; @@ -44,7 +44,7 @@ export function ProvisionDatabaseButton(props) { return (
    - +
    Create FREE ClickHouse Warehouse
    @@ -55,7 +55,13 @@ export function ProvisionDatabaseButton(props) {
    : } + icon={ + dbCreating ? ( + + ) : ( + + ) + } type="default" onClick={createDbHandler} disabled={dbCreating} diff --git a/webapps/console/components/SQLViewer/SQLViewer.tsx b/webapps/console/components/SQLViewer/SQLViewer.tsx index f901a3ab1..6adf7bca8 100644 --- a/webapps/console/components/SQLViewer/SQLViewer.tsx +++ b/webapps/console/components/SQLViewer/SQLViewer.tsx @@ -10,11 +10,11 @@ import { trimMiddle } from "../../lib/shared/strings"; import { LabelEllipsis } from "../LabelEllipsis/LabelEllipsis"; import { SortOrder } from "antd/es/table/interface"; import { ExpandableButton } from "../ExpandableButton/ExpandableButton"; -import { FolderTree, Play } from "lucide-react"; import styles from "./SQLViewer.module.css"; import { CodeEditor } from "../CodeEditor/CodeEditor"; import ClickhouseIcon from "../../lib/schema/icons/clickhouse"; +import LucideIcon from "../Icons/LucideIcon"; const { Sider, Content } = Layout; @@ -215,10 +215,13 @@ const SQLViewer: React.FC = ({ destinationId }) => {
    - } onClick={() => runNewQuery(sql, SQLQueryDefaultLimit)}> + } + onClick={() => runNewQuery(sql, SQLQueryDefaultLimit)} + > Run Query - } onClick={() => setShowSider(!showSider)}> + } onClick={() => setShowSider(!showSider)}> {showSider ? "Hide" : "Show"} tables
    diff --git a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx index dc37e4b52..f9f368536 100644 --- a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx +++ b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx @@ -13,13 +13,13 @@ import { FaExternalLinkAlt } from "react-icons/fa"; import { getCoreDestinationType } from "../../lib/schema/destinations"; import { confirmOp, feedbackError, feedbackSuccess } from "../../lib/ui"; import FieldListEditorLayout, { EditorItem } from "../FieldListEditorLayout/FieldListEditorLayout"; -import { ChevronLeft } from "lucide-react"; import { JitsuButton } from "../JitsuButton/JitsuButton"; import { LoadingAnimation } from "../GlobalLoader/GlobalLoader"; import hash from "stable-hash"; import { CodeEditor } from "../CodeEditor/CodeEditor"; import { DestinationTitle } from "../../pages/[workspaceId]/destinations"; import { ServiceTitle } from "../../pages/[workspaceId]/services"; +import LucideIcon from "../Icons/LucideIcon"; const log = getLog("SyncEditorPage"); @@ -298,7 +298,12 @@ function SyncEditor({

    {(existingLink ? "Edit" : "Create") + " sync"}

    - } type="link" size="small" onClick={() => router.back()}> + } + type="link" + size="small" + onClick={() => router.back()} + > Back
    diff --git a/webapps/console/pages/[workspaceId]/connections/index.tsx b/webapps/console/pages/[workspaceId]/connections/index.tsx index c2d63b511..209fd3baf 100644 --- a/webapps/console/pages/[workspaceId]/connections/index.tsx +++ b/webapps/console/pages/[workspaceId]/connections/index.tsx @@ -17,12 +17,12 @@ import { useLinksQuery } from "../../../lib/queries"; import { jsonSerializationBase64, useQueryStringState } from "../../../lib/useQueryStringState"; import { TableProps } from "antd/es/table/InternalTable"; import { ColumnType, SortOrder } from "antd/es/table/interface"; -import { Edit3, Inbox } from "lucide-react"; import { PlusOutlined } from "@ant-design/icons"; import { JitsuButton, WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; import { DestinationTitle } from "../destinations"; import { ButtonGroup, ButtonProps } from "../../../components/ButtonGroup/ButtonGroup"; import { StreamTitle } from "../streams"; +import LucideIcon from "../../../components/Icons/LucideIcon"; function EmptyLinks() { const workspace = useWorkspace(); @@ -182,7 +182,7 @@ function ConnectionsTable({ links, streams, destinations, reloadCallback }: Remo render: (text, link) => { const items: ButtonProps[] = [ { - icon: , + icon: , label: "Edit", href: `/connections/edit?id=${link.id}`, }, @@ -221,7 +221,7 @@ function Connections(props: RemoteEntitiesProps) { if (props.streams.length == 0 || props.destinations.length == 0) { return (
    - +
    In order to connect site to destination please create at least one destination and one stream. Currently, you have{" "} diff --git a/webapps/console/pages/[workspaceId]/destinations.tsx b/webapps/console/pages/[workspaceId]/destinations.tsx index 76bba6dbf..46c5c28fd 100644 --- a/webapps/console/pages/[workspaceId]/destinations.tsx +++ b/webapps/console/pages/[workspaceId]/destinations.tsx @@ -25,7 +25,6 @@ import { SnippedEditor } from "../../components/CodeEditor/SnippedEditor"; import { MultiSelectWithCustomOptions } from "../../components/MultiSelectWithCustomOptions/MultiSelectWithCustomOptions"; import { LoadingAnimation } from "../../components/GlobalLoader/GlobalLoader"; import { useQuery } from "@tanstack/react-query"; -import { Copy, Eye, FileKey, Loader2, TerminalSquare, XCircle } from "lucide-react"; import { ClickhouseConnectionCredentials } from "../../lib/schema/clickhouse-connection-credentials"; import { CodeBlock } from "../../components/CodeBlock/CodeBlock"; import { useBilling } from "../../components/Billing/BillingProvider"; @@ -37,6 +36,7 @@ import { ObjectTitle } from "../../components/ObjectTitle/ObjectTitle"; import { useQueryStringState } from "../../lib/useQueryStringState"; import { CustomWidgetProps } from "../../components/ConfigObjectEditor/Editors"; import { Htmlizer } from "../../components/Htmlizer/Htmlizer"; +import LucideIcon from "../../components/Icons/LucideIcon"; const log = getLog("destinations"); const Loader: React.FC<{}> = () => { @@ -215,7 +215,7 @@ const Password: React.FC = ({ children }) => {
    {show ? children : "********"}
    ); @@ -245,7 +245,11 @@ export const CredentialValue: React.FC<{ children: string; password?: boolean }> onClick={onClick} className="border shadow-sm rounded h-full bg-backgroundLight mr-1 mt-1 px-2 py-1 flex items-center font-main" > - {displayMask ? : } + {displayMask ? ( + + ) : ( + + )}
    {displayMask ? "Reveal" : justCopied ? "Copied" : "Copy"}
    @@ -369,7 +373,7 @@ function ProvisionedDestinationShowCredentials(props: { destination: Destination return <>; } if (billing.loading) { - return ; + return ; } return ( @@ -407,7 +411,7 @@ function ProvisionedDestinationShowCredentials(props: { destination: Destination
    {error ? "Error loading credentials" : "Clickhouse Credentials"}
    } @@ -437,7 +441,11 @@ function ProvisionedDestinationShowCredentials(props: { destination: Destination } }} > - {loading ? : } + {loading ? ( + + ) : ( + + )} @@ -526,7 +534,7 @@ const ProvisionedDestinations = (props: any) => { - + diff --git a/webapps/console/pages/[workspaceId]/functions.tsx b/webapps/console/pages/[workspaceId]/functions.tsx index 2dad6e2c8..609d85dbb 100644 --- a/webapps/console/pages/[workspaceId]/functions.tsx +++ b/webapps/console/pages/[workspaceId]/functions.tsx @@ -5,9 +5,9 @@ import { useWorkspace } from "../../lib/context"; import { useRouter } from "next/router"; import { getLog } from "juava"; import React from "react"; -import { FunctionSquare } from "lucide-react"; import { FunctionsDebugger } from "../../components/FunctionsDebugger/FunctionsDebugger"; import { ObjectTitle } from "../../components/ObjectTitle/ObjectTitle"; +import LucideIcon from "../../components/Icons/LucideIcon"; const log = getLog("functions"); @@ -33,9 +33,9 @@ export const FunctionTitle: React.FC<{ }> = ({ f, title = d => d?.name ?? "function", size = "default" }) => { return ( } + icon={} size={size} - title={f ? title(f) : "Unknown function"} + title={title ? title(f) : "Unknown function"} /> ); }; @@ -54,7 +54,7 @@ const FunctionsList: React.FC<{}> = () => { noun: "function", type: "function", newObject: () => ({ name: "New function" }), - icon: f => , + icon: f => , explanation: (
    Functions let you apply transformations to incoming events. Examples of such transformations @@ -80,7 +80,7 @@ const FunctionsList: React.FC<{}> = () => { const verb = isNew ? "Create" : "Edit"; return (
    -
    {}
    +
    {}
    {verb} function
    ); diff --git a/webapps/console/pages/[workspaceId]/index.tsx b/webapps/console/pages/[workspaceId]/index.tsx index 1b8f11be9..01e804d2b 100644 --- a/webapps/console/pages/[workspaceId]/index.tsx +++ b/webapps/console/pages/[workspaceId]/index.tsx @@ -17,12 +17,12 @@ import { QuestionCircleOutlined } from "@ant-design/icons"; import { ProvisionDatabaseButton } from "../../components/ProvisionDatabaseButton/ProvisionDatabaseButton"; import { ConnectionsDiagram } from "../../components/ConnectionsDiagram/ConnectionsDiagram"; import { getLog } from "juava"; -import { Chrome } from "lucide-react"; import classNames from "classnames"; import { useRouter } from "next/router"; import { TrackingIntegrationDocumentation } from "../../components/TrackingIntegrationDocumentation/TrackingIntegrationDocumentation"; import omit from "lodash/omit"; import Link from "next/link"; +import LucideIcon from "../../components/Icons/LucideIcon"; function Welcome({ destinations, @@ -305,7 +305,7 @@ export const FaviconLoader: React.FC<{ potentialUrl?: string }> = ({ potentialUr return faviconUrl ? ( ) : ( - + ); }; diff --git a/webapps/console/pages/[workspaceId]/settings/billing.tsx b/webapps/console/pages/[workspaceId]/settings/billing.tsx index a5aee534c..f6d63c040 100644 --- a/webapps/console/pages/[workspaceId]/settings/billing.tsx +++ b/webapps/console/pages/[workspaceId]/settings/billing.tsx @@ -1,10 +1,10 @@ import { WorkspacePageLayout } from "../../../components/PageLayout/WorkspacePageLayout"; import { useBilling } from "../../../components/Billing/BillingProvider"; import { Alert, Skeleton } from "antd"; -import { ChevronLeft } from "lucide-react"; import React from "react"; import { BillingManager } from "../../../components/Billing/BillingManager"; import { WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; +import LucideIcon from "../../../components/Icons/LucideIcon"; const BillingPage: React.FC<{}> = () => { return ( @@ -12,7 +12,12 @@ const BillingPage: React.FC<{}> = () => {

    Plan & Billing

    - }> + } + > Back to settings
    diff --git a/webapps/console/pages/[workspaceId]/settings/index.tsx b/webapps/console/pages/[workspaceId]/settings/index.tsx index d2c7c6818..0af1802cb 100644 --- a/webapps/console/pages/[workspaceId]/settings/index.tsx +++ b/webapps/console/pages/[workspaceId]/settings/index.tsx @@ -14,8 +14,8 @@ import { FaExternalLinkAlt, FaGithub, FaGoogle, FaUser } from "react-icons/fa"; import Link from "next/link"; import { AntdModal, useAntdModal } from "../../../lib/modal"; import { FiMail } from "react-icons/fi"; -import { ArrowRight, Copy } from "lucide-react"; import { JitsuButton, WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; +import LucideIcon from "../../../components/Icons/LucideIcon"; const InviteUserForm: React.FC<{ invite: (email: string) => Promise }> = ({ invite }) => { const [inputVisible, setInputVisible] = useState(false); @@ -73,7 +73,7 @@ function showInvitationLink(m: AntdModal, link: string) {
    {link} - +
    @@ -241,7 +241,7 @@ const WorkspaceSettingsComponent: React.FC = () => {
    } + icon={} href={"/settings/billing"} size="large" type="primary" @@ -262,7 +262,7 @@ const WorkspaceSettingsComponent: React.FC = () => {
    } + icon={} href={"/user"} size="large" type="primary" diff --git a/webapps/console/pages/[workspaceId]/sql.tsx b/webapps/console/pages/[workspaceId]/sql.tsx index 3d35b4d2b..aa394683e 100644 --- a/webapps/console/pages/[workspaceId]/sql.tsx +++ b/webapps/console/pages/[workspaceId]/sql.tsx @@ -9,9 +9,9 @@ import { useAppConfig, useWorkspace } from "../../lib/context"; import { LoadingAnimation } from "../../components/GlobalLoader/GlobalLoader"; import { ErrorCard } from "../../components/GlobalError/GlobalError"; import Link from "next/link"; -import { ArrowRight, Inbox } from "lucide-react"; import ClickhouseIcon from "../../lib/schema/icons/clickhouse"; import { ProvisionDatabaseButton } from "../../components/ProvisionDatabaseButton/ProvisionDatabaseButton"; +import LucideIcon from "../../components/Icons/LucideIcon"; function removeDoubleSlashes(url: string) {} @@ -46,7 +46,7 @@ const AvailableDestinationsList: React.FC = () => { {Object.entries(data).length == 0 && ( <>
    - +
    You don't any destinations available for SQL
    @@ -67,7 +67,7 @@ const AvailableDestinationsList: React.FC = () => {
    {(destination as any).name}
    - +
    ))} diff --git a/webapps/console/pages/[workspaceId]/streams.tsx b/webapps/console/pages/[workspaceId]/streams.tsx index fcb9546cc..ea647debf 100644 --- a/webapps/console/pages/[workspaceId]/streams.tsx +++ b/webapps/console/pages/[workspaceId]/streams.tsx @@ -18,11 +18,11 @@ import { confirmOp, feedbackError } from "../../lib/ui"; import type { DomainStatus } from "../../lib/server/ee"; import { getAntdModal, useAntdModal } from "../../lib/modal"; import { get } from "../../lib/useApi"; -import { Globe, Wrench } from "lucide-react"; import { FaviconLoader } from "./index"; import { ObjectTitle } from "../../components/ObjectTitle/ObjectTitle"; import omit from "lodash/omit"; import { CustomWidgetProps } from "../../components/ConfigObjectEditor/Editors"; +import LucideIcon from "../../components/Icons/LucideIcon"; const Streams: React.FC = () => { return ( @@ -89,7 +89,8 @@ const CustomDomain: React.FC<{ domain: string; deleteDomain: () => Promise {/* */} {/*
    */}
    - = () => { }} className="flex items-center space-x-2 text-primary" > - + Setup Instructions ), @@ -371,7 +372,7 @@ const StreamsList: React.FC<{}> = () => { icon: s => , actions: [ { - icon: , + icon: , title: "Setup Instructions", collapsed: false, action: stream => { diff --git a/webapps/console/pages/[workspaceId]/syncs/index.tsx b/webapps/console/pages/[workspaceId]/syncs/index.tsx index 20fb20f50..c9d0a05bb 100644 --- a/webapps/console/pages/[workspaceId]/syncs/index.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/index.tsx @@ -16,7 +16,6 @@ import { useLinksQuery } from "../../../lib/queries"; import { jsonSerializationBase64, useQueryStringState } from "../../../lib/useQueryStringState"; import { TableProps } from "antd/es/table/InternalTable"; import { ColumnType, SortOrder } from "antd/es/table/interface"; -import { CalendarCheckIcon, Edit3, Inbox, ListMinusIcon, Loader2, RefreshCw } from "lucide-react"; import { PlusOutlined } from "@ant-design/icons"; import { JitsuButton, WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; import { ErrorCard } from "../../../components/GlobalError/GlobalError"; @@ -30,6 +29,8 @@ import JSON5 from "json5"; import { ButtonGroup, ButtonProps } from "../../../components/ButtonGroup/ButtonGroup"; import { Overlay } from "../../../components/Overlay/Overlay"; import { CodeBlock } from "../../../components/CodeBlock/CodeBlock"; +import LucideIcon from "../../../components/Icons/LucideIcon"; +import RefreshCw from "../../../components/Icons/RefreshCw"; dayjs.extend(utc); dayjs.extend(relativeTime); @@ -254,7 +255,7 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt title: t?.status === "RUNNING" ? "Sync is already running" : undefined, icon: running == link.id ? ( - + ) : ( ), @@ -283,12 +284,12 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt label: "Run", }, { - icon: , + icon: , label: "Logs", href: `/syncs/tasks?query=${JSON5.stringify({ syncId: link.id })}`, }, { - icon: , + icon: , label: "Edit", href: `/syncs/edit?id=${link.id}`, }, @@ -297,7 +298,7 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt title: t?.status === "RUNNING" ? "Sync is already running" : undefined, icon: running == link.id ? ( - + ) : ( ), @@ -326,7 +327,7 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt label: "Full Sync", }, { - icon: , + icon: , onClick: async () => { setShowScheduling(link.id); }, @@ -377,7 +378,7 @@ function Syncs(props: RemoteEntitiesProps) { if (props.services.length == 0 || props.destinations.length == 0) { return (
    - +
    In order to connect service to destination please create at least one destination and one service. Currently, you have{" "} diff --git a/webapps/console/pages/[workspaceId]/syncs/logs.tsx b/webapps/console/pages/[workspaceId]/syncs/logs.tsx index 7bfdb2284..2e8c27493 100644 --- a/webapps/console/pages/[workspaceId]/syncs/logs.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/logs.tsx @@ -3,9 +3,10 @@ import { useWorkspace } from "../../../lib/context"; import React, { ReactNode, useEffect, useMemo, useState } from "react"; import { useRouter } from "next/router"; import { JitsuButton } from "../../../components/JitsuButton/JitsuButton"; -import { ChevronLeft, FileDown, RefreshCw } from "lucide-react"; import { useQuery } from "@tanstack/react-query"; import { LoadingAnimation } from "../../../components/GlobalLoader/GlobalLoader"; +import LucideIcon from "../../../components/Icons/LucideIcon"; +import RefreshCw from "../../../components/Icons/RefreshCw"; function colorLogs(data: string): ReactNode { return data.split("\n").map((line, i) => { @@ -73,7 +74,7 @@ function TaskLogs() {

    Sync Tasks

    } + icon={} type="link" size="small" target="_blank" @@ -92,7 +93,7 @@ function TaskLogs() { Refresh } + icon={} type="link" size="small" onClick={() => router.back()} diff --git a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx index b3fdef17a..bec153f15 100644 --- a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx @@ -15,11 +15,12 @@ import { ErrorCard } from "../../../components/GlobalError/GlobalError"; import { useLinksQuery } from "../../../lib/queries"; import { arrayToMap } from "../../../lib/shared/arrays"; import { JitsuButton, WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; -import { ChevronLeft, FileText, RefreshCw } from "lucide-react"; import { FaExternalLinkAlt, FaRegPlayCircle } from "react-icons/fa"; import { useRouter } from "next/router"; import { ExclamationCircleOutlined } from "@ant-design/icons"; import { SyncTitle } from "./index"; +import LucideIcon from "../../../components/Icons/LucideIcon"; +import RefreshCw from "../../../components/Icons/RefreshCw"; dayjs.extend(utc); dayjs.extend(relativeTime); @@ -176,7 +177,7 @@ function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap }: render: (text, task) => { return ( } + icon={} type={"link"} title={"View logs"} href={`/syncs/logs?taskId=${task.task_id}&syncId=${task.sync_id}`} @@ -448,7 +449,7 @@ function Tasks() { Refresh } + icon={} type="link" size="small" onClick={() => router.push(`/${workspace.slug || workspace.id}/syncs`)} diff --git a/webapps/console/pages/admin/oauth-test.tsx b/webapps/console/pages/admin/oauth-test.tsx index c86cfdb44..e9432cf42 100644 --- a/webapps/console/pages/admin/oauth-test.tsx +++ b/webapps/console/pages/admin/oauth-test.tsx @@ -1,7 +1,6 @@ import { useQuery } from "@tanstack/react-query"; import { getErrorMessage, getLog, rpc } from "juava"; import type { OauthDecorator } from "../../lib/server/oauth/services"; -import { Loader2 } from "lucide-react"; import { ErrorCard } from "../../components/GlobalError/GlobalError"; import { useState } from "react"; import { Button, Input, Select } from "antd"; @@ -9,6 +8,7 @@ import { Button, Input, Select } from "antd"; import { AppConfig } from "../../lib/schema"; import Nango from "@nangohq/frontend"; import { CodeBlock } from "../../components/CodeBlock/CodeBlock"; +import LucideIcon from "../../components/Icons/LucideIcon"; type OauthService = Omit, "merge">; @@ -119,7 +119,7 @@ const OauthTest: React.FC<{}> = () => { if (isLoading) { return (
    - +
    ); } else if (error) { diff --git a/webapps/console/pages/admin/users.tsx b/webapps/console/pages/admin/users.tsx index cc487d7a2..f3cec4772 100644 --- a/webapps/console/pages/admin/users.tsx +++ b/webapps/console/pages/admin/users.tsx @@ -1,5 +1,4 @@ import { get, useApi } from "../../lib/useApi"; -import { Loader2, UserCheck } from "lucide-react"; import { ErrorCard, ErrorDetails } from "../../components/GlobalError/GlobalError"; import { Input, Table } from "antd"; import { CodeBlock } from "../../components/CodeBlock/CodeBlock"; @@ -11,13 +10,14 @@ import { useQueryStringState } from "../../lib/useQueryStringState"; import { feedbackError } from "../../lib/ui"; import { useFirebaseSession } from "../../lib/firebase-client"; import { JitsuButton } from "../../components/JitsuButton/JitsuButton"; +import LucideIcon from "../../components/Icons/LucideIcon"; export const UserDetails: React.FC<{ externalId?: string; internalId?: string }> = props => { const { data, isLoading, error } = useApi(urlWithQueryString(`/api/admin/users`, props, { filterUndefined: true })); if (isLoading) { return (
    - +
    ); } else if (error) { @@ -38,7 +38,13 @@ export const BecomeUser: React.FC<{ externalId?: string; internalId?: string }> return ( : } + icon={ + loading ? ( + + ) : ( + + ) + } onClick={async () => { setLoading(true); try { @@ -65,7 +71,7 @@ export const UsersAdminPage = () => { if (isLoading) { return (
    - +
    ); } else if (error) { diff --git a/webapps/console/pages/workspaces.tsx b/webapps/console/pages/workspaces.tsx index 5cd8416e2..e753a9eb7 100644 --- a/webapps/console/pages/workspaces.tsx +++ b/webapps/console/pages/workspaces.tsx @@ -3,7 +3,6 @@ import { FaArrowLeft, FaPlus } from "react-icons/fa"; import { get, useApi } from "../lib/useApi"; import { z } from "zod"; import { WorkspaceDbModel } from "../prisma/schema"; -import { ArrowRight, Loader2 } from "lucide-react"; import { EmbeddedErrorMessage } from "../components/GlobalError/GlobalError"; import { getLog } from "juava"; import Link from "next/link"; @@ -13,6 +12,7 @@ import React, { useState } from "react"; import { feedbackError } from "../lib/ui"; import { JitsuButton } from "../components/JitsuButton/JitsuButton"; import { Input, Tag } from "antd"; +import LucideIcon from "../components/Icons/LucideIcon"; const log = getLog("worspaces"); @@ -24,7 +24,7 @@ const WorkspacesList = () => { if (isLoading) { return (
    - +
    ); } else if (error) { @@ -69,7 +69,7 @@ const WorkspacesList = () => { {userData?.admin && {workspace.id}}
    - +
    ))} From 478cb0d64bc7c68e1b5a5c9373e9bac1e04eaf32 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 27 Jul 2023 12:26:14 +0400 Subject: [PATCH 0091/1353] fix imports for all icons --- pnpm-lock.yaml | 19 ++++++-- .../Billing/BillingBlockingDialog.tsx | 6 +-- .../components/Billing/BillingManager.tsx | 12 ++--- .../components/Billing/UpgradeDialog.tsx | 8 ++-- .../components/ButtonGroup/ButtonGroup.tsx | 4 +- .../components/CodeBlock/CodeBlock.tsx | 4 +- .../components/CodeEditor/CodeEditor.tsx | 2 +- .../ConfigObjectEditor/ConfigEditor.tsx | 6 +-- .../ConfigObjectEditor/EditorTitle.tsx | 4 +- .../ConfigObjectEditor/SchemaForm.tsx | 4 +- .../ConnectionEditorPage.tsx | 4 +- .../ConnectionsDiagram/ConnectionsDiagram.tsx | 4 +- .../components/DataView/EventsBrowser.tsx | 4 +- .../FunctionsDebugger/FunctionsDebugger.tsx | 12 ++--- .../components/GlobalError/GlobalError.tsx | 4 +- .../console/components/Icons/ExternalLink.tsx | 3 +- webapps/console/components/Icons/FileText.tsx | 3 +- .../console/components/Icons/JLucideIcon.tsx | 21 ++++++++ .../console/components/Icons/LucideIcon.tsx | 15 ------ .../console/components/Icons/RefreshCw.tsx | 3 +- .../PageLayout/WorkspacePageLayout.tsx | 48 ++++++++++--------- .../ProvisionDatabaseButton.tsx | 8 ++-- .../components/SQLViewer/SQLViewer.tsx | 6 +-- .../ServiceEditor/ServiceEditor.tsx | 2 +- .../SyncEditorPage/SyncEditorPage.tsx | 4 +- .../WorkspaceNameAndSlugEditor.tsx | 2 +- webapps/console/next.config.js | 19 ++++++++ webapps/console/package.json | 3 +- .../pages/[workspaceId]/connections/index.tsx | 6 +-- .../pages/[workspaceId]/destinations.tsx | 18 +++---- .../console/pages/[workspaceId]/functions.tsx | 8 ++-- webapps/console/pages/[workspaceId]/index.tsx | 6 +-- .../pages/[workspaceId]/settings/billing.tsx | 4 +- .../pages/[workspaceId]/settings/index.tsx | 8 ++-- webapps/console/pages/[workspaceId]/sql.tsx | 6 +-- .../console/pages/[workspaceId]/streams.tsx | 8 ++-- .../pages/[workspaceId]/syncs/index.tsx | 14 +++--- .../pages/[workspaceId]/syncs/logs.tsx | 6 +-- .../pages/[workspaceId]/syncs/tasks.tsx | 6 +-- webapps/console/pages/admin/oauth-test.tsx | 4 +- webapps/console/pages/admin/users.tsx | 10 ++-- webapps/console/pages/workspaces.tsx | 6 +-- 42 files changed, 191 insertions(+), 153 deletions(-) create mode 100644 webapps/console/components/Icons/JLucideIcon.tsx delete mode 100644 webapps/console/components/Icons/LucideIcon.tsx diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d6c4a3336..0e2e2a5d1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -508,6 +508,9 @@ importers: '@prisma/client': specifier: ^4.12.0 version: 4.12.0(prisma@4.12.0) + '@react-icons/all-files': + specifier: ^4.1.0 + version: 4.1.0(react@18.2.0) '@rjsf/antd': specifier: 5.10.0 version: 5.10.0(@ant-design/icons@5.0.1)(@rjsf/core@5.10.0)(@rjsf/utils@5.10.0)(antd@5.4.2)(dayjs@1.11.7)(react-dom@18.2.0)(react@18.2.0) @@ -638,8 +641,8 @@ importers: specifier: ^18.2.0 version: 18.2.0(react@18.2.0) react-icons: - specifier: ^4.8.0 - version: 4.8.0(react@18.2.0) + specifier: ^4.1.0 + version: 4.10.1(react@18.2.0) react-json-view: specifier: ^1.19.1 version: 1.21.3(@types/react@18.0.28)(react-dom@18.2.0)(react@18.2.0) @@ -5864,6 +5867,14 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + /@react-icons/all-files@4.1.0(react@18.2.0): + resolution: {integrity: sha512-hxBI2UOuVaI3O/BhQfhtb4kcGn9ft12RWAFVMUeNjqqhLsHvFtzIkFaptBJpFDANTKoDfdVoHTKZDlwKCACbMQ==} + peerDependencies: + react: '*' + dependencies: + react: 18.2.0 + dev: false + /@remix-run/router@1.5.0: resolution: {integrity: sha512-bkUDCp8o1MvFO+qxkODcbhSqRa6P2GXgrGZVpt0dCXNW2HCSCqYI0ZoAqEOSAjRWmmlKcYgFvN4B4S+zo/f8kg==} engines: {node: '>=14'} @@ -22370,8 +22381,8 @@ packages: resolution: {integrity: sha512-s6V1MF7/hheDh0WbbauMYu62H6z5n9PRPgUO/6RFm/V0srHcCO0gtBlz3AwkhldcQRcMaYAAkLO5o+6rTO/xkA==} dev: false - /react-icons@4.8.0(react@18.2.0): - resolution: {integrity: sha512-N6+kOLcihDiAnj5Czu637waJqSnwlMNROzVZMhfX68V/9bu9qHaMIJC4UdozWoOk57gahFCNHwVvWzm0MTzRjg==} + /react-icons@4.10.1(react@18.2.0): + resolution: {integrity: sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw==} peerDependencies: react: '*' dependencies: diff --git a/webapps/console/components/Billing/BillingBlockingDialog.tsx b/webapps/console/components/Billing/BillingBlockingDialog.tsx index ed630569e..c5201f666 100644 --- a/webapps/console/components/Billing/BillingBlockingDialog.tsx +++ b/webapps/console/components/Billing/BillingBlockingDialog.tsx @@ -5,7 +5,7 @@ import { Modal } from "antd"; import { upgradeRequired } from "./copy"; import { WJitsuButton } from "../JitsuButton/JitsuButton"; import { useWorkspace } from "../../lib/context"; -import LucideIcon from "../Icons/LucideIcon"; +import JLucideIcon from "../Icons/JLucideIcon"; const log = getLog("billing"); @@ -30,7 +30,7 @@ function LoadAndBlockIfNeed() { open={true} title={
    - +

    Upgrade required

    } @@ -42,7 +42,7 @@ function LoadAndBlockIfNeed() { className="w-full" size="large" type="primary" - icon={} + icon={} > Manage Billing {"&"} Plan diff --git a/webapps/console/components/Billing/BillingManager.tsx b/webapps/console/components/Billing/BillingManager.tsx index 446ab738a..ea41756ce 100644 --- a/webapps/console/components/Billing/BillingManager.tsx +++ b/webapps/console/components/Billing/BillingManager.tsx @@ -12,7 +12,7 @@ import { ErrorCard } from "../GlobalError/GlobalError"; import { useUsage } from "./use-usage"; import { upgradeRequired } from "./copy"; import { JitsuButton } from "../JitsuButton/JitsuButton"; -import LucideIcon from "../Icons/LucideIcon"; +import JLucideIcon from "../Icons/JLucideIcon"; function formatNumber(n: number) { return n.toLocaleString("en-US", { maximumFractionDigits: 0 }); @@ -41,7 +41,7 @@ const ComparisonSection: React.FC<{ {header} {info && ( - + )} @@ -49,9 +49,9 @@ const ComparisonSection: React.FC<{ {items.map(item => (
  • {typeof item === "string" || item.enabled ? ( - + ) : ( - + )} {typeof item === "string" ? item : item.header}
  • @@ -154,7 +154,7 @@ const CurrentSubscription: React.FC<{}> = () => { href={`/api/${workspace.id}/ee/billing/manage?returnUrl=${encodeURIComponent(window.location.href)}`} > Manage subscription - + )}
    @@ -285,7 +285,7 @@ const AvailablePlans: React.FC<{}> = () => {
    {planId === billing.settings.planId ? ( } + icon={} className="w-full" size="large" type="ghost" diff --git a/webapps/console/components/Billing/UpgradeDialog.tsx b/webapps/console/components/Billing/UpgradeDialog.tsx index 5d7b6d328..72f87f8fb 100644 --- a/webapps/console/components/Billing/UpgradeDialog.tsx +++ b/webapps/console/components/Billing/UpgradeDialog.tsx @@ -3,7 +3,7 @@ import React from "react"; import { useBilling } from "./BillingProvider"; import { assertFalse, assertTrue } from "juava"; import { WJitsuButton } from "../JitsuButton/JitsuButton"; -import LucideIcon from "../Icons/LucideIcon"; +import JLucideIcon from "../Icons/JLucideIcon"; function arrayJoin(arr: T[], sep: S): (T | S)[] { const result: (T | S)[] = []; @@ -29,10 +29,10 @@ export const UpgradeDialog: React.FC<{ featureDescription: string; availableInPl - Upgrade required + Upgrade required } - icon={} + icon={} description={
    @@ -52,7 +52,7 @@ export const UpgradeDialog: React.FC<{ featureDescription: string; availableInPl
    } + icon={} type="primary" href={`/settings/billing`} > diff --git a/webapps/console/components/ButtonGroup/ButtonGroup.tsx b/webapps/console/components/ButtonGroup/ButtonGroup.tsx index 91a90876a..f0002f812 100644 --- a/webapps/console/components/ButtonGroup/ButtonGroup.tsx +++ b/webapps/console/components/ButtonGroup/ButtonGroup.tsx @@ -5,7 +5,7 @@ import { BaseButtonProps } from "antd/lib/button/button"; import styles from "./ButtonGroup.module.css"; import { useRouter } from "next/router"; import { useWorkspace } from "../../lib/context"; -import LucideIcon from "../Icons/LucideIcon"; +import JLucideIcon from "../Icons/JLucideIcon"; const AntButtonGroup = Button.Group; @@ -68,7 +68,7 @@ export const ButtonGroup: React.FC = ({ items, collapseLast }) } + icon={} /> )} diff --git a/webapps/console/components/CodeBlock/CodeBlock.tsx b/webapps/console/components/CodeBlock/CodeBlock.tsx index de0b54370..e6e009340 100644 --- a/webapps/console/components/CodeBlock/CodeBlock.tsx +++ b/webapps/console/components/CodeBlock/CodeBlock.tsx @@ -40,7 +40,7 @@ import "highlight.js/styles/github-dark.css"; import hljs from "highlight.js/lib/common"; import { CopyButton } from "../CopyButton/CopyButton"; -import LucideIcon from "../Icons/LucideIcon"; +import JLucideIcon from "../Icons/JLucideIcon"; export const CodeBlock: React.FC> = ({ lang, children, className }) => { assertDefined(children, "CodeBlock children must be defined"); @@ -54,7 +54,7 @@ export const CodeBlock: React.FC>
    - +
    diff --git a/webapps/console/components/CodeEditor/CodeEditor.tsx b/webapps/console/components/CodeEditor/CodeEditor.tsx
    index fb89e2b26..dbe2608c3 100644
    --- a/webapps/console/components/CodeEditor/CodeEditor.tsx
    +++ b/webapps/console/components/CodeEditor/CodeEditor.tsx
    @@ -49,7 +49,7 @@ export const CodeEditor: React.FC = ({
           });
           setMounted(true);
         },
    -    [handleChangePosition, value]
    +    [foldLevel, handleChangePosition, value]
       );
     
       useEffect(() => {
    diff --git a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx
    index 0e208a63e..02d68f26d 100644
    --- a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx
    +++ b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx
    @@ -45,7 +45,7 @@ import { ButtonGroup, ButtonProps } from "../ButtonGroup/ButtonGroup";
     import cuid from "cuid";
     import { ObjectTitle } from "../ObjectTitle/ObjectTitle";
     import omitBy from "lodash/omitBy";
    -import LucideIcon from "../Icons/LucideIcon";
    +import JLucideIcon from "../Icons/JLucideIcon";
     
     const log = getLog("ConfigEditor");
     
    @@ -668,7 +668,7 @@ const ObjectsList: React.FC<{ objects: any[]; onDelete: (id: string) => Promise<
               {
                 label: "Edit",
                 href: `/${type}s?id=${record.id}`,
    -            icon: ,
    +            icon: ,
               },
               ...actions.map(action => ({
                 disabled: !!(action.disabled && action.disabled(record)),
    @@ -752,7 +752,7 @@ const ObjectListEditor: React.FC = props => {
             {list.length === 0 && !isLoading && !error && (
               
    - +
    You don't any have {props.noun}s configured.
    ) : ( @@ -91,7 +91,7 @@ export const EditableTitle: React.FC<{ children: string; onUpdate: (str: string) setEditing(true); }} > - +
    )} @@ -225,7 +225,7 @@ export const FunctionsDebugger: React.FC = props => { type="default" disabled={saving} onClick={() => setShowConfig(!showConfig)} - icon={} + icon={} > Config diff --git a/webapps/console/components/GlobalError/GlobalError.tsx b/webapps/console/components/GlobalError/GlobalError.tsx index 1406bbd09..70b4f7440 100644 --- a/webapps/console/components/GlobalError/GlobalError.tsx +++ b/webapps/console/components/GlobalError/GlobalError.tsx @@ -8,7 +8,7 @@ import { getErrorMessage, getLog } from "juava"; import { firebaseSignOut } from "../../lib/firebase-client"; import { PropsWithChildrenClassname } from "../../lib/ui"; import classNames from "classnames"; -import LucideIcon from "../Icons/LucideIcon"; +import JLucideIcon from "../Icons/JLucideIcon"; export type GlobalErrorProps = { error: any; @@ -88,7 +88,7 @@ export const EmbeddedErrorMessage: React.FC - +
    {children} {actions &&
    {actions}
    } diff --git a/webapps/console/components/Icons/ExternalLink.tsx b/webapps/console/components/Icons/ExternalLink.tsx index eee01221e..d74f7711a 100644 --- a/webapps/console/components/Icons/ExternalLink.tsx +++ b/webapps/console/components/Icons/ExternalLink.tsx @@ -1,5 +1,4 @@ -import Icon from "@ant-design/icons"; -import { CustomIconComponentProps } from "@ant-design/icons/lib/components/Icon"; +import Icon, { CustomIconComponentProps } from "@ant-design/icons/lib/components/Icon"; function Svg() { return ( diff --git a/webapps/console/components/Icons/FileText.tsx b/webapps/console/components/Icons/FileText.tsx index f33deb55e..1baa1f9cf 100644 --- a/webapps/console/components/Icons/FileText.tsx +++ b/webapps/console/components/Icons/FileText.tsx @@ -1,5 +1,4 @@ -import Icon from "@ant-design/icons"; -import { CustomIconComponentProps } from "@ant-design/icons/lib/components/Icon"; +import Icon, { CustomIconComponentProps } from "@ant-design/icons/lib/components/Icon"; function Svg() { return ( diff --git a/webapps/console/components/Icons/JLucideIcon.tsx b/webapps/console/components/Icons/JLucideIcon.tsx new file mode 100644 index 000000000..440bb9394 --- /dev/null +++ b/webapps/console/components/Icons/JLucideIcon.tsx @@ -0,0 +1,21 @@ +import dynamic from "next/dynamic"; +import dynamicIconImports from "lucide-react/dynamicIconImports"; +import { RefAttributes, SVGAttributes } from "react"; + +type ComponentAttributes = RefAttributes & SVGAttributes; +interface LucideProps extends ComponentAttributes { + size?: string | number; + absoluteStrokeWidth?: boolean; +} + +interface IconProps extends LucideProps { + name: keyof typeof dynamicIconImports; +} + +const JLucideIcon = ({ name, ...props }: IconProps) => { + const LI = dynamic(dynamicIconImports[name]); + + return
  • ; +}; + +export default JLucideIcon; diff --git a/webapps/console/components/Icons/LucideIcon.tsx b/webapps/console/components/Icons/LucideIcon.tsx deleted file mode 100644 index 472e90f61..000000000 --- a/webapps/console/components/Icons/LucideIcon.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import dynamic from "next/dynamic"; -import type { LucideProps } from "lucide-react"; -import dynamicIconImports from "lucide-react/dynamicIconImports"; - -interface IconProps extends LucideProps { - name: keyof typeof dynamicIconImports; -} - -const LucideIcon = ({ name, ...props }: IconProps) => { - const LI = dynamic(dynamicIconImports[name]); - - return
  • ; -}; - -export default LucideIcon; diff --git a/webapps/console/components/Icons/RefreshCw.tsx b/webapps/console/components/Icons/RefreshCw.tsx index fbff17b48..640cd8658 100644 --- a/webapps/console/components/Icons/RefreshCw.tsx +++ b/webapps/console/components/Icons/RefreshCw.tsx @@ -1,5 +1,4 @@ -import Icon from "@ant-design/icons"; -import { CustomIconComponentProps } from "@ant-design/icons/lib/components/Icon"; +import Icon, { CustomIconComponentProps } from "@ant-design/icons/lib/components/Icon"; function Svg() { return ( diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index 7decc24ec..48444709f 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -28,7 +28,7 @@ import { useClassicProject } from "./ClassicProjectProvider"; import { useJitsu } from "@jitsu/jitsu-react"; import { useSearchParams } from "next/navigation"; import omit from "lodash/omit"; -import LucideIcon from "../Icons/LucideIcon"; +import JLucideIcon from "../Icons/JLucideIcon"; export type PageLayoutProps = { fullscreen?: boolean; @@ -76,7 +76,7 @@ function AdminMenuItems() { log.atWarn().log("Failed to load user properties", error); } else if (data) { return ( - }> + }> Admin Users ); @@ -101,7 +101,7 @@ function WorkspacesMenu(props: { jitsuClassicAvailable: boolean }) { { key: "admin-users", label: "Admin Users", - icon: , + icon: , onClick: async () => { await router.push("/admin/users"); }, @@ -116,9 +116,9 @@ function WorkspacesMenu(props: { jitsuClassicAvailable: boolean }) { key: "all-workspaces", label: "View all workspaces", icon: workspacesLoading ? ( - + ) : ( - + ), onClick: async () => { setWorkspacesLoading(true); @@ -133,9 +133,9 @@ function WorkspacesMenu(props: { jitsuClassicAvailable: boolean }) { key: "new-workspace", label: "Create new workspace", icon: adding ? ( - + ) : ( - + ), onClick: async () => { setAdding(true); @@ -155,9 +155,9 @@ function WorkspacesMenu(props: { jitsuClassicAvailable: boolean }) { key: "switch", label: "Switch to Jitsu Classic", icon: classicLoading ? ( - + ) : ( - + ), onClick: async () => { setClassicLoading(true); @@ -289,7 +289,7 @@ function Breadcrumbs() { } }} > - Switch to Jitsu Classic + {""} Switch to Jitsu Classic
  • @@ -365,31 +365,35 @@ function PageHeader() { title: "Overview", path: "/", aliases: "/overview", - icon: , + icon: , + }, + { title: "Sites", path: "/streams", icon: }, + { title: "Destinations", path: "/destinations", icon: }, + { title: "Connections", path: "/connections", icon: }, + { + title: "Functions", + path: "/functions", + icon: , }, - { title: "Sites", path: "/streams", icon: }, - { title: "Destinations", path: "/destinations", icon: }, - { title: "Connections", path: "/connections", icon: }, - { title: "Functions", path: "/functions", icon: }, ]; if (workspace.featuresEnabled && workspace.featuresEnabled.includes("syncs")) { items.push( - { title: "Services", path: "/services", icon: }, - { title: "Syncs", path: "/syncs", icon: } + { title: "Services", path: "/services", icon: }, + { title: "Syncs", path: "/syncs", icon: } ); } items.push( - { title: "Live Events", path: "/data", icon: }, + { title: "Live Events", path: "/data", icon: }, { title: "Query Data", path: "/sql", - icon: , + icon: , hidden: !appConfig?.ee, }, { title: "Settings", path: "/settings", - icon: , + icon: , } ); return ( @@ -526,7 +530,7 @@ export const WorkspacePageLayout: React.FC> = className="border-l border-b border-r rounded-b-md px-8 py-0 shadow" onClick={() => setShowDrawer(!showDrawer)} > - +
    @@ -550,7 +554,7 @@ export const WorkspacePageLayout: React.FC> = className="absolute right-0 top-0 mt-1 mr-2 hover:bg-neutral-100 p-1.5 rounded-lg flex justify-center items-center z-50" onClick={() => (onClose ? onClose() : router.back())} > - + )} {children} diff --git a/webapps/console/components/ProvisionDatabaseButton/ProvisionDatabaseButton.tsx b/webapps/console/components/ProvisionDatabaseButton/ProvisionDatabaseButton.tsx index 447ef1a7e..00be59dbb 100644 --- a/webapps/console/components/ProvisionDatabaseButton/ProvisionDatabaseButton.tsx +++ b/webapps/console/components/ProvisionDatabaseButton/ProvisionDatabaseButton.tsx @@ -5,7 +5,7 @@ import { useRouter } from "next/router"; import { rpc } from "juava"; import { feedbackError, feedbackSuccess } from "../../lib/ui"; import { JitsuButton } from "../JitsuButton/JitsuButton"; -import LucideIcon from "../Icons/LucideIcon"; +import JLucideIcon from "../Icons/JLucideIcon"; export function ProvisionDatabaseButton(props) { const { loader = undefined, createdCallback = undefined } = props; @@ -44,7 +44,7 @@ export function ProvisionDatabaseButton(props) { return (
    - +
    Create FREE ClickHouse Warehouse
    @@ -57,9 +57,9 @@ export function ProvisionDatabaseButton(props) { + ) : ( - + ) } type="default" diff --git a/webapps/console/components/SQLViewer/SQLViewer.tsx b/webapps/console/components/SQLViewer/SQLViewer.tsx index 6adf7bca8..d20b2824d 100644 --- a/webapps/console/components/SQLViewer/SQLViewer.tsx +++ b/webapps/console/components/SQLViewer/SQLViewer.tsx @@ -14,7 +14,7 @@ import styles from "./SQLViewer.module.css"; import { CodeEditor } from "../CodeEditor/CodeEditor"; import ClickhouseIcon from "../../lib/schema/icons/clickhouse"; -import LucideIcon from "../Icons/LucideIcon"; +import JLucideIcon from "../Icons/JLucideIcon"; const { Sider, Content } = Layout; @@ -216,12 +216,12 @@ const SQLViewer: React.FC = ({ destinationId }) => {
    } + icon={} onClick={() => runNewQuery(sql, SQLQueryDefaultLimit)} > Run Query - } onClick={() => setShowSider(!showSider)}> + } onClick={() => setShowSider(!showSider)}> {showSider ? "Hide" : "Show"} tables
    diff --git a/webapps/console/components/ServiceEditor/ServiceEditor.tsx b/webapps/console/components/ServiceEditor/ServiceEditor.tsx index 9ce01fd0f..bfd4ea2e8 100644 --- a/webapps/console/components/ServiceEditor/ServiceEditor.tsx +++ b/webapps/console/components/ServiceEditor/ServiceEditor.tsx @@ -156,7 +156,7 @@ export const ServiceEditor: React.FC = props => { return false; } return true; - }, [ajv, credentials, obj.name, specs]); + }, [ajv, credentials, modal, obj.name, specs.connectionSpecification]); const save = useCallback(async () => { setLoading(true); diff --git a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx index f9f368536..56346e4eb 100644 --- a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx +++ b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx @@ -19,7 +19,7 @@ import hash from "stable-hash"; import { CodeEditor } from "../CodeEditor/CodeEditor"; import { DestinationTitle } from "../../pages/[workspaceId]/destinations"; import { ServiceTitle } from "../../pages/[workspaceId]/services"; -import LucideIcon from "../Icons/LucideIcon"; +import JLucideIcon from "../Icons/JLucideIcon"; const log = getLog("SyncEditorPage"); @@ -299,7 +299,7 @@ function SyncEditor({

    {(existingLink ? "Edit" : "Create") + " sync"}

    } + icon={} type="link" size="small" onClick={() => router.back()} diff --git a/webapps/console/components/WorkspaceNameAndSlugEditor/WorkspaceNameAndSlugEditor.tsx b/webapps/console/components/WorkspaceNameAndSlugEditor/WorkspaceNameAndSlugEditor.tsx index a2c4b89dc..f43bd4d76 100644 --- a/webapps/console/components/WorkspaceNameAndSlugEditor/WorkspaceNameAndSlugEditor.tsx +++ b/webapps/console/components/WorkspaceNameAndSlugEditor/WorkspaceNameAndSlugEditor.tsx @@ -96,7 +96,7 @@ export function WorkspaceNameAndSlugEditor({ } + icon={{""}} onClick={async () => { try { const eeClient = getEeClient( diff --git a/webapps/console/next.config.js b/webapps/console/next.config.js index ab9adefbb..a04f3d614 100644 --- a/webapps/console/next.config.js +++ b/webapps/console/next.config.js @@ -11,6 +11,25 @@ const prevWebpack = module.exports.webpack; const packageRoot = path.join(__dirname, "../../"); console.log("packageRoot", packageRoot); module.exports = { + modularizeImports: { + "lucide-react": { + transform: "Use instead of importing from 'lucide-react'", + preventFullImport: true, + }, + lodash: { + transform: "lodash/{{member}}", + preventFullImport: true, + }, + "@ant-design/icons": { + transform: "@ant-design/icons/{{member}}", + preventFullImport: true, + }, + "react-icons/(\\w+)": { + transform: "@react-icons/all-files/{{ matches.[1] }}/{{member}}", + preventFullImport: true, + skipDefaultConversion: true, + }, + }, experimental: { outputFileTracingExcludes: { "*": [ diff --git a/webapps/console/package.json b/webapps/console/package.json index 923f454e3..5f419cf5c 100644 --- a/webapps/console/package.json +++ b/webapps/console/package.json @@ -77,7 +77,8 @@ "prisma": "^4.12.0", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-icons": "^4.8.0", + "react-icons": "^4.1.0", + "@react-icons/all-files": "^4.1.0", "react-json-view": "^1.19.1", "react-use": "^17.4.0", "stable-hash": "0.0.3", diff --git a/webapps/console/pages/[workspaceId]/connections/index.tsx b/webapps/console/pages/[workspaceId]/connections/index.tsx index 209fd3baf..3e1f5b3a8 100644 --- a/webapps/console/pages/[workspaceId]/connections/index.tsx +++ b/webapps/console/pages/[workspaceId]/connections/index.tsx @@ -22,7 +22,7 @@ import { JitsuButton, WJitsuButton } from "../../../components/JitsuButton/Jitsu import { DestinationTitle } from "../destinations"; import { ButtonGroup, ButtonProps } from "../../../components/ButtonGroup/ButtonGroup"; import { StreamTitle } from "../streams"; -import LucideIcon from "../../../components/Icons/LucideIcon"; +import JLucideIcon from "../../../components/Icons/JLucideIcon"; function EmptyLinks() { const workspace = useWorkspace(); @@ -182,7 +182,7 @@ function ConnectionsTable({ links, streams, destinations, reloadCallback }: Remo render: (text, link) => { const items: ButtonProps[] = [ { - icon: , + icon: , label: "Edit", href: `/connections/edit?id=${link.id}`, }, @@ -221,7 +221,7 @@ function Connections(props: RemoteEntitiesProps) { if (props.streams.length == 0 || props.destinations.length == 0) { return (
    - +
    In order to connect site to destination please create at least one destination and one stream. Currently, you have{" "} diff --git a/webapps/console/pages/[workspaceId]/destinations.tsx b/webapps/console/pages/[workspaceId]/destinations.tsx index 46c5c28fd..7ea730e69 100644 --- a/webapps/console/pages/[workspaceId]/destinations.tsx +++ b/webapps/console/pages/[workspaceId]/destinations.tsx @@ -36,7 +36,7 @@ import { ObjectTitle } from "../../components/ObjectTitle/ObjectTitle"; import { useQueryStringState } from "../../lib/useQueryStringState"; import { CustomWidgetProps } from "../../components/ConfigObjectEditor/Editors"; import { Htmlizer } from "../../components/Htmlizer/Htmlizer"; -import LucideIcon from "../../components/Icons/LucideIcon"; +import JLucideIcon from "../../components/Icons/JLucideIcon"; const log = getLog("destinations"); const Loader: React.FC<{}> = () => { @@ -215,7 +215,7 @@ const Password: React.FC = ({ children }) => {
    {show ? children : "********"}
    ); @@ -246,9 +246,9 @@ export const CredentialValue: React.FC<{ children: string; password?: boolean }> className="border shadow-sm rounded h-full bg-backgroundLight mr-1 mt-1 px-2 py-1 flex items-center font-main" > {displayMask ? ( - + ) : ( - + )}
    {displayMask ? "Reveal" : justCopied ? "Copied" : "Copy"}
    @@ -373,7 +373,7 @@ function ProvisionedDestinationShowCredentials(props: { destination: Destination return <>; } if (billing.loading) { - return ; + return ; } return ( @@ -411,7 +411,7 @@ function ProvisionedDestinationShowCredentials(props: { destination: Destination
    {error ? "Error loading credentials" : "Clickhouse Credentials"}
    } @@ -442,9 +442,9 @@ function ProvisionedDestinationShowCredentials(props: { destination: Destination }} > {loading ? ( - + ) : ( - + )} @@ -534,7 +534,7 @@ const ProvisionedDestinations = (props: any) => { - + diff --git a/webapps/console/pages/[workspaceId]/functions.tsx b/webapps/console/pages/[workspaceId]/functions.tsx index 609d85dbb..69e4b118b 100644 --- a/webapps/console/pages/[workspaceId]/functions.tsx +++ b/webapps/console/pages/[workspaceId]/functions.tsx @@ -7,7 +7,7 @@ import { getLog } from "juava"; import React from "react"; import { FunctionsDebugger } from "../../components/FunctionsDebugger/FunctionsDebugger"; import { ObjectTitle } from "../../components/ObjectTitle/ObjectTitle"; -import LucideIcon from "../../components/Icons/LucideIcon"; +import JLucideIcon from "../../components/Icons/JLucideIcon"; const log = getLog("functions"); @@ -33,7 +33,7 @@ export const FunctionTitle: React.FC<{ }> = ({ f, title = d => d?.name ?? "function", size = "default" }) => { return ( } + icon={} size={size} title={title ? title(f) : "Unknown function"} /> @@ -54,7 +54,7 @@ const FunctionsList: React.FC<{}> = () => { noun: "function", type: "function", newObject: () => ({ name: "New function" }), - icon: f => , + icon: f => , explanation: (
    Functions let you apply transformations to incoming events. Examples of such transformations @@ -80,7 +80,7 @@ const FunctionsList: React.FC<{}> = () => { const verb = isNew ? "Create" : "Edit"; return (
    -
    {}
    +
    {}
    {verb} function
    ); diff --git a/webapps/console/pages/[workspaceId]/index.tsx b/webapps/console/pages/[workspaceId]/index.tsx index 01e804d2b..f445a1a8b 100644 --- a/webapps/console/pages/[workspaceId]/index.tsx +++ b/webapps/console/pages/[workspaceId]/index.tsx @@ -22,7 +22,7 @@ import { useRouter } from "next/router"; import { TrackingIntegrationDocumentation } from "../../components/TrackingIntegrationDocumentation/TrackingIntegrationDocumentation"; import omit from "lodash/omit"; import Link from "next/link"; -import LucideIcon from "../../components/Icons/LucideIcon"; +import JLucideIcon from "../../components/Icons/JLucideIcon"; function Welcome({ destinations, @@ -303,9 +303,9 @@ export const FaviconLoader: React.FC<{ potentialUrl?: string }> = ({ potentialUr })(); }, [potentialUrl]); return faviconUrl ? ( - + {""} ) : ( - + ); }; diff --git a/webapps/console/pages/[workspaceId]/settings/billing.tsx b/webapps/console/pages/[workspaceId]/settings/billing.tsx index f6d63c040..2858cd488 100644 --- a/webapps/console/pages/[workspaceId]/settings/billing.tsx +++ b/webapps/console/pages/[workspaceId]/settings/billing.tsx @@ -4,7 +4,7 @@ import { Alert, Skeleton } from "antd"; import React from "react"; import { BillingManager } from "../../../components/Billing/BillingManager"; import { WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; -import LucideIcon from "../../../components/Icons/LucideIcon"; +import JLucideIcon from "../../../components/Icons/JLucideIcon"; const BillingPage: React.FC<{}> = () => { return ( @@ -16,7 +16,7 @@ const BillingPage: React.FC<{}> = () => { href={`/settings`} size="large" type="primary" - icon={} + icon={} > Back to settings diff --git a/webapps/console/pages/[workspaceId]/settings/index.tsx b/webapps/console/pages/[workspaceId]/settings/index.tsx index 0af1802cb..51c9a6e4a 100644 --- a/webapps/console/pages/[workspaceId]/settings/index.tsx +++ b/webapps/console/pages/[workspaceId]/settings/index.tsx @@ -15,7 +15,7 @@ import Link from "next/link"; import { AntdModal, useAntdModal } from "../../../lib/modal"; import { FiMail } from "react-icons/fi"; import { JitsuButton, WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; -import LucideIcon from "../../../components/Icons/LucideIcon"; +import JLucideIcon from "../../../components/Icons/JLucideIcon"; const InviteUserForm: React.FC<{ invite: (email: string) => Promise }> = ({ invite }) => { const [inputVisible, setInputVisible] = useState(false); @@ -73,7 +73,7 @@ function showInvitationLink(m: AntdModal, link: string) {
    {link} - +
    @@ -241,7 +241,7 @@ const WorkspaceSettingsComponent: React.FC = () => {
    } + icon={} href={"/settings/billing"} size="large" type="primary" @@ -262,7 +262,7 @@ const WorkspaceSettingsComponent: React.FC = () => {
    } + icon={} href={"/user"} size="large" type="primary" diff --git a/webapps/console/pages/[workspaceId]/sql.tsx b/webapps/console/pages/[workspaceId]/sql.tsx index aa394683e..c4ec258f7 100644 --- a/webapps/console/pages/[workspaceId]/sql.tsx +++ b/webapps/console/pages/[workspaceId]/sql.tsx @@ -11,7 +11,7 @@ import { ErrorCard } from "../../components/GlobalError/GlobalError"; import Link from "next/link"; import ClickhouseIcon from "../../lib/schema/icons/clickhouse"; import { ProvisionDatabaseButton } from "../../components/ProvisionDatabaseButton/ProvisionDatabaseButton"; -import LucideIcon from "../../components/Icons/LucideIcon"; +import JLucideIcon from "../../components/Icons/JLucideIcon"; function removeDoubleSlashes(url: string) {} @@ -46,7 +46,7 @@ const AvailableDestinationsList: React.FC = () => { {Object.entries(data).length == 0 && ( <>
    - +
    You don't any destinations available for SQL
    @@ -67,7 +67,7 @@ const AvailableDestinationsList: React.FC = () => {
    {(destination as any).name}
    - +
    ))} diff --git a/webapps/console/pages/[workspaceId]/streams.tsx b/webapps/console/pages/[workspaceId]/streams.tsx index ea647debf..b1fc4892c 100644 --- a/webapps/console/pages/[workspaceId]/streams.tsx +++ b/webapps/console/pages/[workspaceId]/streams.tsx @@ -22,7 +22,7 @@ import { FaviconLoader } from "./index"; import { ObjectTitle } from "../../components/ObjectTitle/ObjectTitle"; import omit from "lodash/omit"; import { CustomWidgetProps } from "../../components/ConfigObjectEditor/Editors"; -import LucideIcon from "../../components/Icons/LucideIcon"; +import JLucideIcon from "../../components/Icons/JLucideIcon"; const Streams: React.FC = () => { return ( @@ -89,7 +89,7 @@ const CustomDomain: React.FC<{ domain: string; deleteDomain: () => Promise {/* */} {/*
    */}
    - = () => { }} className="flex items-center space-x-2 text-primary" > - + Setup Instructions ), @@ -372,7 +372,7 @@ const StreamsList: React.FC<{}> = () => { icon: s => , actions: [ { - icon: , + icon: , title: "Setup Instructions", collapsed: false, action: stream => { diff --git a/webapps/console/pages/[workspaceId]/syncs/index.tsx b/webapps/console/pages/[workspaceId]/syncs/index.tsx index c9d0a05bb..363832124 100644 --- a/webapps/console/pages/[workspaceId]/syncs/index.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/index.tsx @@ -29,7 +29,7 @@ import JSON5 from "json5"; import { ButtonGroup, ButtonProps } from "../../../components/ButtonGroup/ButtonGroup"; import { Overlay } from "../../../components/Overlay/Overlay"; import { CodeBlock } from "../../../components/CodeBlock/CodeBlock"; -import LucideIcon from "../../../components/Icons/LucideIcon"; +import JLucideIcon from "../../../components/Icons/JLucideIcon"; import RefreshCw from "../../../components/Icons/RefreshCw"; dayjs.extend(utc); @@ -255,7 +255,7 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt title: t?.status === "RUNNING" ? "Sync is already running" : undefined, icon: running == link.id ? ( - + ) : ( ), @@ -284,12 +284,12 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt label: "Run", }, { - icon: , + icon: , label: "Logs", href: `/syncs/tasks?query=${JSON5.stringify({ syncId: link.id })}`, }, { - icon: , + icon: , label: "Edit", href: `/syncs/edit?id=${link.id}`, }, @@ -298,7 +298,7 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt title: t?.status === "RUNNING" ? "Sync is already running" : undefined, icon: running == link.id ? ( - + ) : ( ), @@ -327,7 +327,7 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt label: "Full Sync", }, { - icon: , + icon: , onClick: async () => { setShowScheduling(link.id); }, @@ -378,7 +378,7 @@ function Syncs(props: RemoteEntitiesProps) { if (props.services.length == 0 || props.destinations.length == 0) { return (
    - +
    In order to connect service to destination please create at least one destination and one service. Currently, you have{" "} diff --git a/webapps/console/pages/[workspaceId]/syncs/logs.tsx b/webapps/console/pages/[workspaceId]/syncs/logs.tsx index 2e8c27493..6f83f55ba 100644 --- a/webapps/console/pages/[workspaceId]/syncs/logs.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/logs.tsx @@ -5,7 +5,7 @@ import { useRouter } from "next/router"; import { JitsuButton } from "../../../components/JitsuButton/JitsuButton"; import { useQuery } from "@tanstack/react-query"; import { LoadingAnimation } from "../../../components/GlobalLoader/GlobalLoader"; -import LucideIcon from "../../../components/Icons/LucideIcon"; +import JLucideIcon from "../../../components/Icons/JLucideIcon"; import RefreshCw from "../../../components/Icons/RefreshCw"; function colorLogs(data: string): ReactNode { @@ -74,7 +74,7 @@ function TaskLogs() {

    Sync Tasks

    } + icon={} type="link" size="small" target="_blank" @@ -93,7 +93,7 @@ function TaskLogs() { Refresh } + icon={} type="link" size="small" onClick={() => router.back()} diff --git a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx index bec153f15..dccc174fc 100644 --- a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx @@ -19,7 +19,7 @@ import { FaExternalLinkAlt, FaRegPlayCircle } from "react-icons/fa"; import { useRouter } from "next/router"; import { ExclamationCircleOutlined } from "@ant-design/icons"; import { SyncTitle } from "./index"; -import LucideIcon from "../../../components/Icons/LucideIcon"; +import JLucideIcon from "../../../components/Icons/JLucideIcon"; import RefreshCw from "../../../components/Icons/RefreshCw"; dayjs.extend(utc); @@ -177,7 +177,7 @@ function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap }: render: (text, task) => { return ( } + icon={} type={"link"} title={"View logs"} href={`/syncs/logs?taskId=${task.task_id}&syncId=${task.sync_id}`} @@ -449,7 +449,7 @@ function Tasks() { Refresh } + icon={} type="link" size="small" onClick={() => router.push(`/${workspace.slug || workspace.id}/syncs`)} diff --git a/webapps/console/pages/admin/oauth-test.tsx b/webapps/console/pages/admin/oauth-test.tsx index e9432cf42..8452f0fe9 100644 --- a/webapps/console/pages/admin/oauth-test.tsx +++ b/webapps/console/pages/admin/oauth-test.tsx @@ -8,7 +8,7 @@ import { Button, Input, Select } from "antd"; import { AppConfig } from "../../lib/schema"; import Nango from "@nangohq/frontend"; import { CodeBlock } from "../../components/CodeBlock/CodeBlock"; -import LucideIcon from "../../components/Icons/LucideIcon"; +import JLucideIcon from "../../components/Icons/JLucideIcon"; type OauthService = Omit, "merge">; @@ -119,7 +119,7 @@ const OauthTest: React.FC<{}> = () => { if (isLoading) { return (
    - +
    ); } else if (error) { diff --git a/webapps/console/pages/admin/users.tsx b/webapps/console/pages/admin/users.tsx index f3cec4772..38007cf9a 100644 --- a/webapps/console/pages/admin/users.tsx +++ b/webapps/console/pages/admin/users.tsx @@ -10,14 +10,14 @@ import { useQueryStringState } from "../../lib/useQueryStringState"; import { feedbackError } from "../../lib/ui"; import { useFirebaseSession } from "../../lib/firebase-client"; import { JitsuButton } from "../../components/JitsuButton/JitsuButton"; -import LucideIcon from "../../components/Icons/LucideIcon"; +import JLucideIcon from "../../components/Icons/JLucideIcon"; export const UserDetails: React.FC<{ externalId?: string; internalId?: string }> = props => { const { data, isLoading, error } = useApi(urlWithQueryString(`/api/admin/users`, props, { filterUndefined: true })); if (isLoading) { return (
    - +
    ); } else if (error) { @@ -40,9 +40,9 @@ export const BecomeUser: React.FC<{ externalId?: string; internalId?: string }> disabled={loading} icon={ loading ? ( - + ) : ( - + ) } onClick={async () => { @@ -71,7 +71,7 @@ export const UsersAdminPage = () => { if (isLoading) { return (
    - +
    ); } else if (error) { diff --git a/webapps/console/pages/workspaces.tsx b/webapps/console/pages/workspaces.tsx index e753a9eb7..56554798a 100644 --- a/webapps/console/pages/workspaces.tsx +++ b/webapps/console/pages/workspaces.tsx @@ -12,7 +12,7 @@ import React, { useState } from "react"; import { feedbackError } from "../lib/ui"; import { JitsuButton } from "../components/JitsuButton/JitsuButton"; import { Input, Tag } from "antd"; -import LucideIcon from "../components/Icons/LucideIcon"; +import JLucideIcon from "../components/Icons/JLucideIcon"; const log = getLog("worspaces"); @@ -24,7 +24,7 @@ const WorkspacesList = () => { if (isLoading) { return (
    - +
    ); } else if (error) { @@ -69,7 +69,7 @@ const WorkspacesList = () => { {userData?.admin && {workspace.id}}
    - +
    ))} From 9aedd2936236437c8ef48a2190f2ce41fbb82aab Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 27 Jul 2023 13:02:34 +0400 Subject: [PATCH 0092/1353] reduce lucide icons flickering caused by dynamic loading --- webapps/console/components/Icons/JLucideIcon.tsx | 9 +++++---- .../components/PageLayout/WorkspacePageLayout.tsx | 5 +++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/webapps/console/components/Icons/JLucideIcon.tsx b/webapps/console/components/Icons/JLucideIcon.tsx index 440bb9394..edc5345a5 100644 --- a/webapps/console/components/Icons/JLucideIcon.tsx +++ b/webapps/console/components/Icons/JLucideIcon.tsx @@ -1,6 +1,6 @@ import dynamic from "next/dynamic"; import dynamicIconImports from "lucide-react/dynamicIconImports"; -import { RefAttributes, SVGAttributes } from "react"; +import React, { RefAttributes, SVGAttributes } from "react"; type ComponentAttributes = RefAttributes & SVGAttributes; interface LucideProps extends ComponentAttributes { @@ -13,9 +13,10 @@ interface IconProps extends LucideProps { } const JLucideIcon = ({ name, ...props }: IconProps) => { - const LI = dynamic(dynamicIconImports[name]); - + const LI = dynamic(dynamicIconImports[name], { + loading: () =>
    , + }); return
  • ; }; -export default JLucideIcon; +export default React.memo(JLucideIcon); diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index 48444709f..a07098f21 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -1,4 +1,4 @@ -import { PropsWithChildren, ReactNode, useEffect, useState } from "react"; +import React, { PropsWithChildren, ReactNode, useEffect, useState } from "react"; import { branding } from "../../lib/branding"; import { HiSelector } from "react-icons/hi"; import { FaSignOutAlt, FaUserCircle } from "react-icons/fa"; @@ -357,7 +357,7 @@ const UserProfileButton: React.FC<{}> = () => { ); }; -function PageHeader() { +function PageHeader0() { const appConfig = useAppConfig(); const workspace = useWorkspace(); const items: TabsMenuItem[] = [ @@ -408,6 +408,7 @@ function PageHeader() {
  • ); } +const PageHeader = React.memo(PageHeader0); const WorkspaceSettingsModal: React.FC<{ onSuccess: () => void }> = ({ onSuccess }) => { const appConfig = useAppConfig(); From 25ec533c37df37b68016ce30de61cbfff5049a68 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 27 Jul 2023 13:58:31 +0400 Subject: [PATCH 0093/1353] show enabled functions in connection list --- webapps/console/lib/queries.ts | 17 ++++--- .../pages/[workspaceId]/connections/index.tsx | 48 ++++++++++++++++--- .../console/pages/[workspaceId]/functions.tsx | 2 +- 3 files changed, 54 insertions(+), 13 deletions(-) diff --git a/webapps/console/lib/queries.ts b/webapps/console/lib/queries.ts index 43eec0783..a05a1885c 100644 --- a/webapps/console/lib/queries.ts +++ b/webapps/console/lib/queries.ts @@ -1,10 +1,10 @@ import { get, getConfigApi } from "./useApi"; -import { DestinationConfig, ServiceConfig, StreamConfig } from "./schema"; +import { DestinationConfig, FunctionConfig, ServiceConfig, StreamConfig } from "./schema"; import { useQuery } from "@tanstack/react-query"; -export function linksQuery(workspaceId: string, type: "push" | "sync" = "push") { +export function linksQuery(workspaceId: string, type: "push" | "sync" = "push", withFunctions: boolean = false) { return async () => { - return await Promise.all([ + const promises = [ type === "sync" ? getConfigApi(workspaceId, "service").list() : getConfigApi(workspaceId, "stream").list(), @@ -12,7 +12,11 @@ export function linksQuery(workspaceId: string, type: "push" | "sync" = "push") get(`/api/${workspaceId}/config/link`).then(res => res.links.filter(l => l.type === type || (type === "push" && !l.type)) ), - ]); + ]; + if (withFunctions) { + promises.push(getConfigApi(workspaceId, "function").list()); + } + return await Promise.all(promises); }; } @@ -20,13 +24,14 @@ export function useLinksQuery( workspaceId: string, type: "push" | "sync" = "push", options?: { + withFunctions?: boolean; cacheTime?: number; retry?: boolean; } ) { return useQuery( - ["links", workspaceId, type], - linksQuery(workspaceId, type), + ["links", workspaceId, type, options?.withFunctions], + linksQuery(workspaceId, type, options?.withFunctions), options ? { cacheTime: options.cacheTime, diff --git a/webapps/console/pages/[workspaceId]/connections/index.tsx b/webapps/console/pages/[workspaceId]/connections/index.tsx index 3e1f5b3a8..ce0a4ff17 100644 --- a/webapps/console/pages/[workspaceId]/connections/index.tsx +++ b/webapps/console/pages/[workspaceId]/connections/index.tsx @@ -1,7 +1,7 @@ import { WorkspacePageLayout } from "../../../components/PageLayout/WorkspacePageLayout"; import { useWorkspace } from "../../../lib/context"; import { get } from "../../../lib/useApi"; -import { DestinationConfig, StreamConfig } from "../../../lib/schema"; +import { DestinationConfig, FunctionConfig, StreamConfig } from "../../../lib/schema"; import { ConfigurationObjectLinkDbModel } from "../../../prisma/schema"; import { QueryResponse } from "../../../components/QueryResponse/QueryResponse"; import { z } from "zod"; @@ -23,6 +23,7 @@ import { DestinationTitle } from "../destinations"; import { ButtonGroup, ButtonProps } from "../../../components/ButtonGroup/ButtonGroup"; import { StreamTitle } from "../streams"; import JLucideIcon from "../../../components/Icons/JLucideIcon"; +import { FunctionTitle } from "../functions"; function EmptyLinks() { const workspace = useWorkspace(); @@ -73,6 +74,7 @@ type RemoteEntitiesProps = { streams: StreamConfig[]; destinations: DestinationConfig[]; links: Omit[]; + functions: FunctionConfig[]; reloadCallback: () => void; }; @@ -80,9 +82,11 @@ type SortingSettings = { columns: { order: SortOrder; field: string }[]; }; -function ConnectionsTable({ links, streams, destinations, reloadCallback }: RemoteEntitiesProps) { +function ConnectionsTable({ links, streams, destinations, functions, reloadCallback }: RemoteEntitiesProps) { const streamsById = index(streams, "id"); const destinationsById = index(destinations, "id"); + const functionsById = index(functions, "id"); + const workspace = useWorkspace(); const router = useRouter(); const [loading, setLoading] = React.useState(false); @@ -121,7 +125,7 @@ function ConnectionsTable({ links, streams, destinations, reloadCallback }: Remo const columns: ColumnType[] = [ { title: "Source", - width: "50%", + width: "33%", sortOrder: sorting.columns?.find(s => s.field === "Source")?.order, sorter: (a, b) => { const streamA = streamsById[a.fromId]; @@ -149,7 +153,7 @@ function ConnectionsTable({ links, streams, destinations, reloadCallback }: Remo }, { title: "Destination", - width: "50%", + width: "33%", sortOrder: sorting.columns?.find(s => s.field === "Destination")?.order, sorter: (a, b) => { @@ -177,6 +181,35 @@ function ConnectionsTable({ links, streams, destinations, reloadCallback }: Remo ); }, }, + { + title: "Functions", + width: "33%", + render: (text, link) => { + return ( +
    + {functions && + (link.data?.functions || []) + .filter(f => f.functionId.startsWith("udf.")) + .map((f, i) => { + const id = f.functionId.replace("udf.", ""); + const func = functionsById[id]; + if (!func) { + return f.functionId} />; + } + return ( +
    router.push(`/${workspace.id}/functions?id=${id}`)} + key={i} + > + +
    + ); + })} +
    + ); + }, + }, { title: "Actions", render: (text, link) => { @@ -216,7 +249,7 @@ function ConnectionsTable({ links, streams, destinations, reloadCallback }: Remo } function Connections(props: RemoteEntitiesProps) { - const { streams, destinations, links } = props; + const { streams, destinations, links, functions } = props; const workspace = useWorkspace(); if (props.streams.length == 0 || props.destinations.length == 0) { return ( @@ -262,6 +295,7 @@ function Connections(props: RemoteEntitiesProps) { {links.length > 0 && ( void }) { const data = useLinksQuery(workspace.id, "push", { cacheTime: 0, retry: false, + withFunctions: true, }); return ( ( + render={([streams, destinations, links, functions]) => ( = ({ f, title = d => d?.name ?? "function", size = "default" }) => { return ( } + icon={f ? : undefined} size={size} title={title ? title(f) : "Unknown function"} /> From 5ee6a5b9c6a3bc36144086789ecbcf94fd197832 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 27 Jul 2023 18:11:38 +0400 Subject: [PATCH 0094/1353] rotor: send active incoming events metric to bulker. small improvements --- .../src/functions/bulker-destination.ts | 2 +- services/rotor/src/index.ts | 49 +++++++++++++++++-- .../rotor/src/lib/data-layout/jitsu-legacy.ts | 0 services/rotor/src/lib/functions-chain.ts | 2 + types/protocols/analytics.d.ts | 2 +- .../components/ObjectTitle/ObjectTitle.tsx | 2 +- .../pages/[workspaceId]/connections/index.tsx | 13 ++++- 7 files changed, 63 insertions(+), 7 deletions(-) delete mode 100644 services/rotor/src/lib/data-layout/jitsu-legacy.ts diff --git a/libs/core-functions/src/functions/bulker-destination.ts b/libs/core-functions/src/functions/bulker-destination.ts index 75b437231..da09fef6b 100644 --- a/libs/core-functions/src/functions/bulker-destination.ts +++ b/libs/core-functions/src/functions/bulker-destination.ts @@ -1,6 +1,5 @@ import { JitsuFunction } from "@jitsu/protocols/functions"; import { AnalyticsServerEvent, DataLayoutType } from "@jitsu/protocols/analytics"; -import type { Event as JitsuLegacyEvent } from "@jitsu/sdk-js"; import omit from "lodash/omit"; @@ -178,6 +177,7 @@ export const dataLayouts: Record> = { segment: event => segmentLayout(event, false), "segment-single-table": event => segmentLayout(event, true), "jitsu-legacy": event => jitsuLegacy(event), + passthrough: event => ({ event: omit(event, TableNameParameter), table: event[TableNameParameter] ?? "events" }), }; export type BulkerDestinationConfig = { diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index 234710b1c..11990736f 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -18,8 +18,8 @@ import minimist from "minimist"; import { glob } from "glob"; import fs from "fs"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; -import { createRedisLogger, FuncChain, runChain } from "./lib/functions-chain"; -import { getBuiltinFunction, mongoAnonymousEventsStore, UDFWrapper } from "@jitsu/core-functions"; +import { createRedisLogger, Func, FuncChain, runChain } from "./lib/functions-chain"; +import { createFullContext, getBuiltinFunction, mongoAnonymousEventsStore, UDFWrapper } from "@jitsu/core-functions"; import { EventContext, JitsuFunction, Store, SystemContext } from "@jitsu/protocols/functions"; import { redis } from "@jitsu-internal/console/lib/server/redis"; import express from "express"; @@ -48,6 +48,21 @@ const rotorHttpPort = process.env.ROTOR_HTTP_PORT || process.env.PORT || 3401; const bulkerBase = requireDefined(process.env.BULKER_URL, "env BULKER_URL is not defined"); const bulkerAuthKey = requireDefined(process.env.BULKER_AUTH_KEY, "env BULKER_AUTH_KEY is not defined"); +const metricsFunction: Func = { + id: "builtin.destination.bulker", + config: { + bulkerEndpoint: bulkerBase, + destinationId: "metrics", + authToken: bulkerAuthKey, + dataLayout: "passthrough", + }, + exec: requireDefined( + getBuiltinFunction("builtin.destination.bulker"), + `Unknown function builtin.destination.bulker` + ) as JitsuFunction, + context: {}, +}; + const getCachedOrLoad = async (cache: NodeCache, key: string, loader: (key: string) => Promise) => { const cached = cache.get(key); if (cached) { @@ -189,7 +204,35 @@ export async function rotorMessageHandler(_message: string | undefined) { await redisClient.hdel(`store:${connection.id}`, key); }, }; - await runChain(funcChain, event, connection, redisLogger, store, ctx); + const execLog = await runChain(funcChain, event, connection, redisLogger, store, ctx); + const processedIdx = execLog.findIndex(l => !l.dropped && l.functionId.startsWith("builtin.destination.")); + + if (processedIdx >= 0) { + const d = new Date(message.messageCreated); + d.setMilliseconds(0); + d.setSeconds(0); + const event = { + timestamp: d.toISOString(), + workspaceId: connection.workspaceId, + messageId: message.messageId, + JITSU_TABLE_NAME: "active_incoming", + }; + try { + await metricsFunction.exec( + event, + createFullContext( + metricsFunction.id, + redisLogger, + store, + { headers: message.httpHeaders }, + {}, + metricsFunction.config + ) + ); + } catch (e) { + log.atError().withCause(e).log("Failed to send metrics"); + } + } } const retrySettings = { diff --git a/services/rotor/src/lib/data-layout/jitsu-legacy.ts b/services/rotor/src/lib/data-layout/jitsu-legacy.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index 97275bd9d..baebe45c1 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -30,6 +30,7 @@ export type FunctionExecLog = { eventIndex: number; functionId: string; error?: string; + dropped?: boolean; ms: number; }[]; @@ -67,6 +68,7 @@ export async function runChain( eventIndex: i, functionId: f.id, ms: sw.elapsedMs(), + dropped: result === "drop", }); if (result === "drop") { return execLog; diff --git a/types/protocols/analytics.d.ts b/types/protocols/analytics.d.ts index 32dc0bbe3..55662e19d 100644 --- a/types/protocols/analytics.d.ts +++ b/types/protocols/analytics.d.ts @@ -2,7 +2,7 @@ import { ISO8601Date } from "./iso8601.d"; export type ID = string | null | undefined; -export type DataLayoutType = "segment" | "jitsu-legacy" | "segment-single-table"; +export type DataLayoutType = "segment" | "jitsu-legacy" | "segment-single-table" | "passthrough"; /** * Event coming from client library diff --git a/webapps/console/components/ObjectTitle/ObjectTitle.tsx b/webapps/console/components/ObjectTitle/ObjectTitle.tsx index 351cf4dae..d0518b3fe 100644 --- a/webapps/console/components/ObjectTitle/ObjectTitle.tsx +++ b/webapps/console/components/ObjectTitle/ObjectTitle.tsx @@ -18,7 +18,7 @@ export const ObjectTitle: React.FC<{ return (
    {icon &&
    {icon}
    } -
    {title}
    +
    {title}
    ); }; diff --git a/webapps/console/pages/[workspaceId]/connections/index.tsx b/webapps/console/pages/[workspaceId]/connections/index.tsx index ce0a4ff17..bd0192e7a 100644 --- a/webapps/console/pages/[workspaceId]/connections/index.tsx +++ b/webapps/console/pages/[workspaceId]/connections/index.tsx @@ -89,6 +89,7 @@ function ConnectionsTable({ links, streams, destinations, functions, reloadCallb const workspace = useWorkspace(); const router = useRouter(); + const [showId, setShowId] = React.useState(false); const [loading, setLoading] = React.useState(false); const [sorting, setSorting] = useQueryStringState("sorting", { defaultValue: { columns: [] }, @@ -123,6 +124,15 @@ function ConnectionsTable({ links, streams, destinations, functions, reloadCallb console.log("sorter", newVal); }; const columns: ColumnType[] = [ + { + title: "ID", + dataIndex: "id", + width: "33%", + className: showId ? "" : "hidden", + render: (text, link) => { + return
    {link.id}
    ; + }, + }, { title: "Source", width: "33%", @@ -211,7 +221,8 @@ function ConnectionsTable({ links, streams, destinations, functions, reloadCallb }, }, { - title: "Actions", + title: setShowId(!showId)}>Actions, + key: "actions", render: (text, link) => { const items: ButtonProps[] = [ { From 80ed7098e566ccca7f99391ba4551badee6d089c Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 27 Jul 2023 18:20:24 +0400 Subject: [PATCH 0095/1353] fix --- webapps/console/lib/schema/destinations.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/webapps/console/lib/schema/destinations.tsx b/webapps/console/lib/schema/destinations.tsx index 302907ee1..dced5a6b0 100644 --- a/webapps/console/lib/schema/destinations.tsx +++ b/webapps/console/lib/schema/destinations.tsx @@ -124,7 +124,9 @@ export const BaseBulkerConnectionOptions = z primaryKey: z.string().default("message_id"), deduplicate: z.boolean().default(true), timestampColumn: z.string().default("timestamp"), - dataLayout: z.enum(["segment", "jitsu-legacy", "segment-single-table"]).default("segment-single-table"), + dataLayout: z + .enum(["segment", "jitsu-legacy", "segment-single-table", "passthrough"]) + .default("segment-single-table"), }) .merge(BatchModeOptions) .merge(CloudDestinationsConnectionOptions); From aa85430337f8a6b34e15e9083fc840c96242546a Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 27 Jul 2023 19:32:53 +0400 Subject: [PATCH 0096/1353] lucide icons workaround --- webapps/console/components/Icons/JLucideIcon.tsx | 15 ++++++++------- webapps/console/next.config.js | 8 ++++---- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/webapps/console/components/Icons/JLucideIcon.tsx b/webapps/console/components/Icons/JLucideIcon.tsx index edc5345a5..f579aeecc 100644 --- a/webapps/console/components/Icons/JLucideIcon.tsx +++ b/webapps/console/components/Icons/JLucideIcon.tsx @@ -1,5 +1,4 @@ -import dynamic from "next/dynamic"; -import dynamicIconImports from "lucide-react/dynamicIconImports"; +import { icons } from "lucide-react"; import React, { RefAttributes, SVGAttributes } from "react"; type ComponentAttributes = RefAttributes & SVGAttributes; @@ -9,14 +8,16 @@ interface LucideProps extends ComponentAttributes { } interface IconProps extends LucideProps { - name: keyof typeof dynamicIconImports; + name: string; } const JLucideIcon = ({ name, ...props }: IconProps) => { - const LI = dynamic(dynamicIconImports[name], { - loading: () =>
    , - }); - return
  • ; + const n = name.replace(/-(.)/g, x => x.substring(1).toUpperCase()).replace(/^(.)/g, c => c.toUpperCase()); + const LucideIcon = icons[n]; + if (!LucideIcon) { + return
    ; + } + return ; }; export default React.memo(JLucideIcon); diff --git a/webapps/console/next.config.js b/webapps/console/next.config.js index a04f3d614..3e74b86da 100644 --- a/webapps/console/next.config.js +++ b/webapps/console/next.config.js @@ -12,10 +12,10 @@ const packageRoot = path.join(__dirname, "../../"); console.log("packageRoot", packageRoot); module.exports = { modularizeImports: { - "lucide-react": { - transform: "Use instead of importing from 'lucide-react'", - preventFullImport: true, - }, + // "lucide-react": { + // transform: "Use instead of importing from 'lucide-react'", + // preventFullImport: true, + // }, lodash: { transform: "lodash/{{member}}", preventFullImport: true, From 401536dc0be59b49593d980873bdf5461ec9d77e Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 27 Jul 2023 19:40:38 +0400 Subject: [PATCH 0097/1353] fix --- webapps/console/pages/api/[workspaceId]/sql/query.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/pages/api/[workspaceId]/sql/query.ts b/webapps/console/pages/api/[workspaceId]/sql/query.ts index b7dc37ce5..7b482b633 100644 --- a/webapps/console/pages/api/[workspaceId]/sql/query.ts +++ b/webapps/console/pages/api/[workspaceId]/sql/query.ts @@ -5,9 +5,9 @@ import { requireDefined } from "juava"; import { createClient } from "@clickhouse/client"; import { ClickhouseCredentials } from "../../../../lib/schema/destinations"; import { Parser } from "node-sql-parser"; -import { SQLQueryDefaultLimit } from "../../../../components/SQLViewer/SQLViewer"; import { db } from "../../../../lib/server/db"; +const SQLQueryDefaultLimit = 50; const log = getServerLog("sql-query"); export const getClickhouseClient = (workspaceId: string, cred: ClickhouseCredentials) => { From 7a1b61aa742b7410cf1e2e368d7d125e8adc3762 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 28 Jul 2023 11:45:59 +0400 Subject: [PATCH 0098/1353] revert unnecessary and bad workaround for importing icons --- pnpm-lock.yaml | 13 +-- .../Billing/BillingBlockingDialog.tsx | 6 +- .../components/Billing/BillingManager.tsx | 20 ++--- .../components/Billing/UpgradeDialog.tsx | 12 +-- .../components/ButtonGroup/ButtonGroup.tsx | 7 +- .../components/CodeBlock/CodeBlock.tsx | 4 +- .../ConfigObjectEditor/ConfigEditor.tsx | 6 +- .../ConfigObjectEditor/EditorTitle.tsx | 9 +-- .../ConfigObjectEditor/SchemaForm.tsx | 4 +- .../ConnectionEditorPage.tsx | 9 +-- .../ConnectionsDiagram/ConnectionsDiagram.tsx | 4 +- .../components/DataView/EventsBrowser.tsx | 5 +- .../FunctionsDebugger/FunctionsDebugger.tsx | 12 +-- .../components/GlobalError/GlobalError.tsx | 4 +- .../console/components/Icons/JLucideIcon.tsx | 23 ------ .../console/components/Icons/RefreshCw.tsx | 27 ------- .../PageLayout/WorkspacePageLayout.tsx | 80 +++++++++---------- .../ProvisionDatabaseButton.tsx | 12 +-- .../components/SQLViewer/SQLViewer.tsx | 9 +-- .../SyncEditorPage/SyncEditorPage.tsx | 9 +-- webapps/console/next.config.js | 38 ++++----- webapps/console/package.json | 3 +- .../pages/[workspaceId]/connections/index.tsx | 6 +- .../pages/[workspaceId]/destinations.tsx | 22 ++--- .../console/pages/[workspaceId]/functions.tsx | 12 +-- webapps/console/pages/[workspaceId]/index.tsx | 4 +- .../pages/[workspaceId]/settings/billing.tsx | 9 +-- .../pages/[workspaceId]/settings/index.tsx | 8 +- webapps/console/pages/[workspaceId]/sql.tsx | 6 +- .../console/pages/[workspaceId]/streams.tsx | 9 +-- .../pages/[workspaceId]/syncs/index.tsx | 15 ++-- .../pages/[workspaceId]/syncs/logs.tsx | 7 +- .../pages/[workspaceId]/syncs/tasks.tsx | 7 +- webapps/console/pages/admin/oauth-test.tsx | 4 +- webapps/console/pages/admin/users.tsx | 14 +--- webapps/console/pages/workspaces.tsx | 6 +- webapps/console/public/logo.svg | 1 + 37 files changed, 159 insertions(+), 287 deletions(-) delete mode 100644 webapps/console/components/Icons/JLucideIcon.tsx delete mode 100644 webapps/console/components/Icons/RefreshCw.tsx create mode 100644 webapps/console/public/logo.svg diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0e2e2a5d1..a509235b0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -508,9 +508,6 @@ importers: '@prisma/client': specifier: ^4.12.0 version: 4.12.0(prisma@4.12.0) - '@react-icons/all-files': - specifier: ^4.1.0 - version: 4.1.0(react@18.2.0) '@rjsf/antd': specifier: 5.10.0 version: 5.10.0(@ant-design/icons@5.0.1)(@rjsf/core@5.10.0)(@rjsf/utils@5.10.0)(antd@5.4.2)(dayjs@1.11.7)(react-dom@18.2.0)(react@18.2.0) @@ -641,7 +638,7 @@ importers: specifier: ^18.2.0 version: 18.2.0(react@18.2.0) react-icons: - specifier: ^4.1.0 + specifier: ^4.10.1 version: 4.10.1(react@18.2.0) react-json-view: specifier: ^1.19.1 @@ -5867,14 +5864,6 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - /@react-icons/all-files@4.1.0(react@18.2.0): - resolution: {integrity: sha512-hxBI2UOuVaI3O/BhQfhtb4kcGn9ft12RWAFVMUeNjqqhLsHvFtzIkFaptBJpFDANTKoDfdVoHTKZDlwKCACbMQ==} - peerDependencies: - react: '*' - dependencies: - react: 18.2.0 - dev: false - /@remix-run/router@1.5.0: resolution: {integrity: sha512-bkUDCp8o1MvFO+qxkODcbhSqRa6P2GXgrGZVpt0dCXNW2HCSCqYI0ZoAqEOSAjRWmmlKcYgFvN4B4S+zo/f8kg==} engines: {node: '>=14'} diff --git a/webapps/console/components/Billing/BillingBlockingDialog.tsx b/webapps/console/components/Billing/BillingBlockingDialog.tsx index c5201f666..9b87b117d 100644 --- a/webapps/console/components/Billing/BillingBlockingDialog.tsx +++ b/webapps/console/components/Billing/BillingBlockingDialog.tsx @@ -3,9 +3,9 @@ import { assertDefined, assertFalse, assertTrue, getLog } from "juava"; import { useUsage } from "./use-usage"; import { Modal } from "antd"; import { upgradeRequired } from "./copy"; +import { AlertTriangle, ArrowRight } from "lucide-react"; import { WJitsuButton } from "../JitsuButton/JitsuButton"; import { useWorkspace } from "../../lib/context"; -import JLucideIcon from "../Icons/JLucideIcon"; const log = getLog("billing"); @@ -30,7 +30,7 @@ function LoadAndBlockIfNeed() { open={true} title={
    - +

    Upgrade required

    } @@ -42,7 +42,7 @@ function LoadAndBlockIfNeed() { className="w-full" size="large" type="primary" - icon={} + icon={} > Manage Billing {"&"} Plan diff --git a/webapps/console/components/Billing/BillingManager.tsx b/webapps/console/components/Billing/BillingManager.tsx index ea41756ce..4de6b498e 100644 --- a/webapps/console/components/Billing/BillingManager.tsx +++ b/webapps/console/components/Billing/BillingManager.tsx @@ -5,6 +5,7 @@ import { assertDefined, assertFalse, assertTrue, requireDefined, rpc } from "jua import { BillingSettings } from "../../lib/schema"; import { Alert, Button, Progress, Skeleton, Tooltip } from "antd"; import Link from "next/link"; +import { Check, Edit2, Info, XCircle } from "lucide-react"; import styles from "./BillingManager.module.css"; import { useQuery } from "@tanstack/react-query"; @@ -12,7 +13,6 @@ import { ErrorCard } from "../GlobalError/GlobalError"; import { useUsage } from "./use-usage"; import { upgradeRequired } from "./copy"; import { JitsuButton } from "../JitsuButton/JitsuButton"; -import JLucideIcon from "../Icons/JLucideIcon"; function formatNumber(n: number) { return n.toLocaleString("en-US", { maximumFractionDigits: 0 }); @@ -41,18 +41,14 @@ const ComparisonSection: React.FC<{ {header} {info && ( - + )}
      {items.map(item => (
    • - {typeof item === "string" || item.enabled ? ( - - ) : ( - - )} + {typeof item === "string" || item.enabled ? : } {typeof item === "string" ? item : item.header}
    • ))} @@ -154,7 +150,7 @@ const CurrentSubscription: React.FC<{}> = () => { href={`/api/${workspace.id}/ee/billing/manage?returnUrl=${encodeURIComponent(window.location.href)}`} > Manage subscription - + )}
  • @@ -284,13 +280,7 @@ const AvailablePlans: React.FC<{}> = () => { />
    {planId === billing.settings.planId ? ( - } - className="w-full" - size="large" - type="ghost" - disabled={true} - > + } className="w-full" size="large" type="ghost" disabled={true}> Current plan ) : planId === "free" ? ( diff --git a/webapps/console/components/Billing/UpgradeDialog.tsx b/webapps/console/components/Billing/UpgradeDialog.tsx index 72f87f8fb..32c721763 100644 --- a/webapps/console/components/Billing/UpgradeDialog.tsx +++ b/webapps/console/components/Billing/UpgradeDialog.tsx @@ -2,8 +2,8 @@ import { Alert } from "antd"; import React from "react"; import { useBilling } from "./BillingProvider"; import { assertFalse, assertTrue } from "juava"; +import { AlertCircle, Lock, Unlock } from "lucide-react"; import { WJitsuButton } from "../JitsuButton/JitsuButton"; -import JLucideIcon from "../Icons/JLucideIcon"; function arrayJoin(arr: T[], sep: S): (T | S)[] { const result: (T | S)[] = []; @@ -29,10 +29,10 @@ export const UpgradeDialog: React.FC<{ featureDescription: string; availableInPl - Upgrade required + Upgrade required } - icon={} + icon={} description={
    @@ -51,11 +51,7 @@ export const UpgradeDialog: React.FC<{ featureDescription: string; availableInPl plan.
    - } - type="primary" - href={`/settings/billing`} - > + } type="primary" href={`/settings/billing`}> Upgrade to a plan with {featureDescription}
    diff --git a/webapps/console/components/ButtonGroup/ButtonGroup.tsx b/webapps/console/components/ButtonGroup/ButtonGroup.tsx index f0002f812..92db5ee33 100644 --- a/webapps/console/components/ButtonGroup/ButtonGroup.tsx +++ b/webapps/console/components/ButtonGroup/ButtonGroup.tsx @@ -5,7 +5,7 @@ import { BaseButtonProps } from "antd/lib/button/button"; import styles from "./ButtonGroup.module.css"; import { useRouter } from "next/router"; import { useWorkspace } from "../../lib/context"; -import JLucideIcon from "../Icons/JLucideIcon"; +import { MoreVertical } from "lucide-react"; const AntButtonGroup = Button.Group; @@ -66,10 +66,7 @@ export const ButtonGroup: React.FC = ({ items, collapseLast }) })} {collapsedItems.length > 0 && ( - } - /> + } /> )} diff --git a/webapps/console/components/CodeBlock/CodeBlock.tsx b/webapps/console/components/CodeBlock/CodeBlock.tsx index e6e009340..25f1c2f27 100644 --- a/webapps/console/components/CodeBlock/CodeBlock.tsx +++ b/webapps/console/components/CodeBlock/CodeBlock.tsx @@ -40,7 +40,7 @@ import "highlight.js/styles/github-dark.css"; import hljs from "highlight.js/lib/common"; import { CopyButton } from "../CopyButton/CopyButton"; -import JLucideIcon from "../Icons/JLucideIcon"; +import { Copy } from "lucide-react"; export const CodeBlock: React.FC> = ({ lang, children, className }) => { assertDefined(children, "CodeBlock children must be defined"); @@ -54,7 +54,7 @@ export const CodeBlock: React.FC>
    - +
    diff --git a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx
    index 02d68f26d..16ce10ecd 100644
    --- a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx
    +++ b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx
    @@ -35,6 +35,7 @@ import { ErrorCard, GlobalError } from "../GlobalError/GlobalError";
     import { Action, confirmOp, doAction, feedbackError, feedbackSuccess, useTitle } from "../../lib/ui";
     import { branding } from "../../lib/branding";
     import { useAntdModal } from "../../lib/modal";
    +import { Edit3, Inbox } from "lucide-react";
     import { createDisplayName, prepareZodObjectForSerialization } from "../../lib/zod";
     import { JitsuButton } from "../JitsuButton/JitsuButton";
     import { EditorTitle } from "./EditorTitle";
    @@ -45,7 +46,6 @@ import { ButtonGroup, ButtonProps } from "../ButtonGroup/ButtonGroup";
     import cuid from "cuid";
     import { ObjectTitle } from "../ObjectTitle/ObjectTitle";
     import omitBy from "lodash/omitBy";
    -import JLucideIcon from "../Icons/JLucideIcon";
     
     const log = getLog("ConfigEditor");
     
    @@ -668,7 +668,7 @@ const ObjectsList: React.FC<{ objects: any[]; onDelete: (id: string) => Promise<
               {
                 label: "Edit",
                 href: `/${type}s?id=${record.id}`,
    -            icon: ,
    +            icon: ,
               },
               ...actions.map(action => ({
                 disabled: !!(action.disabled && action.disabled(record)),
    @@ -752,7 +752,7 @@ const ObjectListEditor: React.FC = props => {
             {list.length === 0 && !isLoading && !error && (
               
    - +
    You don't any have {props.noun}s configured.
    ) : ( @@ -91,7 +91,7 @@ export const EditableTitle: React.FC<{ children: string; onUpdate: (str: string) setEditing(true); }} > - +
    )} @@ -225,7 +225,7 @@ export const FunctionsDebugger: React.FC = props => { type="default" disabled={saving} onClick={() => setShowConfig(!showConfig)} - icon={} + icon={} > Config diff --git a/webapps/console/components/GlobalError/GlobalError.tsx b/webapps/console/components/GlobalError/GlobalError.tsx index 70b4f7440..6da20e3db 100644 --- a/webapps/console/components/GlobalError/GlobalError.tsx +++ b/webapps/console/components/GlobalError/GlobalError.tsx @@ -7,8 +7,8 @@ import { signOut } from "next-auth/react"; import { getErrorMessage, getLog } from "juava"; import { firebaseSignOut } from "../../lib/firebase-client"; import { PropsWithChildrenClassname } from "../../lib/ui"; +import { AlertCircle } from "lucide-react"; import classNames from "classnames"; -import JLucideIcon from "../Icons/JLucideIcon"; export type GlobalErrorProps = { error: any; @@ -88,7 +88,7 @@ export const EmbeddedErrorMessage: React.FC - +
    {children} {actions &&
    {actions}
    } diff --git a/webapps/console/components/Icons/JLucideIcon.tsx b/webapps/console/components/Icons/JLucideIcon.tsx deleted file mode 100644 index f579aeecc..000000000 --- a/webapps/console/components/Icons/JLucideIcon.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { icons } from "lucide-react"; -import React, { RefAttributes, SVGAttributes } from "react"; - -type ComponentAttributes = RefAttributes & SVGAttributes; -interface LucideProps extends ComponentAttributes { - size?: string | number; - absoluteStrokeWidth?: boolean; -} - -interface IconProps extends LucideProps { - name: string; -} - -const JLucideIcon = ({ name, ...props }: IconProps) => { - const n = name.replace(/-(.)/g, x => x.substring(1).toUpperCase()).replace(/^(.)/g, c => c.toUpperCase()); - const LucideIcon = icons[n]; - if (!LucideIcon) { - return
    ; - } - return ; -}; - -export default React.memo(JLucideIcon); diff --git a/webapps/console/components/Icons/RefreshCw.tsx b/webapps/console/components/Icons/RefreshCw.tsx deleted file mode 100644 index 640cd8658..000000000 --- a/webapps/console/components/Icons/RefreshCw.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import Icon, { CustomIconComponentProps } from "@ant-design/icons/lib/components/Icon"; - -function Svg() { - return ( - - - - - - - ); -} - -export default function RefreshCw(props: Partial) { - return ; -} diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index a07098f21..f4a221298 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -1,4 +1,4 @@ -import React, { PropsWithChildren, ReactNode, useEffect, useState } from "react"; +import { PropsWithChildren, ReactNode, useEffect, useState } from "react"; import { branding } from "../../lib/branding"; import { HiSelector } from "react-icons/hi"; import { FaSignOutAlt, FaUserCircle } from "react-icons/fa"; @@ -7,6 +7,24 @@ import { Button, Drawer, Dropdown, Menu } from "antd"; import MenuItem from "antd/lib/menu/MenuItem"; import { ButtonLabel } from "../ButtonLabel/ButtonLabel"; import styles from "./WorkspacePageLayout.module.css"; +import { + Activity, + ArrowLeftRight, + BarChart3, + ChevronUp, + FilePlus, + Folders, + FunctionSquare, + Globe, + LayoutDashboard, + Loader2, + Server, + ServerCog, + Settings, + Share2, + ShieldAlert, + X, +} from "lucide-react"; import { NextRouter, useRouter } from "next/router"; import Link from "next/link"; @@ -28,7 +46,6 @@ import { useClassicProject } from "./ClassicProjectProvider"; import { useJitsu } from "@jitsu/jitsu-react"; import { useSearchParams } from "next/navigation"; import omit from "lodash/omit"; -import JLucideIcon from "../Icons/JLucideIcon"; export type PageLayoutProps = { fullscreen?: boolean; @@ -76,7 +93,7 @@ function AdminMenuItems() { log.atWarn().log("Failed to load user properties", error); } else if (data) { return ( - }> + }> Admin Users ); @@ -101,7 +118,7 @@ function WorkspacesMenu(props: { jitsuClassicAvailable: boolean }) { { key: "admin-users", label: "Admin Users", - icon: , + icon: , onClick: async () => { await router.push("/admin/users"); }, @@ -116,9 +133,9 @@ function WorkspacesMenu(props: { jitsuClassicAvailable: boolean }) { key: "all-workspaces", label: "View all workspaces", icon: workspacesLoading ? ( - + ) : ( - + ), onClick: async () => { setWorkspacesLoading(true); @@ -132,11 +149,7 @@ function WorkspacesMenu(props: { jitsuClassicAvailable: boolean }) { { key: "new-workspace", label: "Create new workspace", - icon: adding ? ( - - ) : ( - - ), + icon: adding ? : , onClick: async () => { setAdding(true); try { @@ -155,9 +168,9 @@ function WorkspacesMenu(props: { jitsuClassicAvailable: boolean }) { key: "switch", label: "Switch to Jitsu Classic", icon: classicLoading ? ( - + ) : ( - + ), onClick: async () => { setClassicLoading(true); @@ -357,43 +370,29 @@ const UserProfileButton: React.FC<{}> = () => { ); }; -function PageHeader0() { +function PageHeader() { const appConfig = useAppConfig(); const workspace = useWorkspace(); const items: TabsMenuItem[] = [ - { - title: "Overview", - path: "/", - aliases: "/overview", - icon: , - }, - { title: "Sites", path: "/streams", icon: }, - { title: "Destinations", path: "/destinations", icon: }, - { title: "Connections", path: "/connections", icon: }, - { - title: "Functions", - path: "/functions", - icon: , - }, + { title: "Overview", path: "/", aliases: "/overview", icon: }, + { title: "Sites", path: "/streams", icon: }, + { title: "Destinations", path: "/destinations", icon: }, + { title: "Connections", path: "/connections", icon: }, + { title: "Functions", path: "/functions", icon: }, ]; if (workspace.featuresEnabled && workspace.featuresEnabled.includes("syncs")) { items.push( - { title: "Services", path: "/services", icon: }, - { title: "Syncs", path: "/syncs", icon: } + { title: "Services", path: "/services", icon: }, + { title: "Syncs", path: "/syncs", icon: } ); } items.push( - { title: "Live Events", path: "/data", icon: }, - { - title: "Query Data", - path: "/sql", - icon: , - hidden: !appConfig?.ee, - }, + { title: "Live Events", path: "/data", icon: }, + { title: "Query Data", path: "/sql", icon: , hidden: !appConfig?.ee }, { title: "Settings", path: "/settings", - icon: , + icon: , } ); return ( @@ -408,7 +407,6 @@ function PageHeader0() {
    ); } -const PageHeader = React.memo(PageHeader0); const WorkspaceSettingsModal: React.FC<{ onSuccess: () => void }> = ({ onSuccess }) => { const appConfig = useAppConfig(); @@ -531,7 +529,7 @@ export const WorkspacePageLayout: React.FC> = className="border-l border-b border-r rounded-b-md px-8 py-0 shadow" onClick={() => setShowDrawer(!showDrawer)} > - +
    @@ -555,7 +553,7 @@ export const WorkspacePageLayout: React.FC> = className="absolute right-0 top-0 mt-1 mr-2 hover:bg-neutral-100 p-1.5 rounded-lg flex justify-center items-center z-50" onClick={() => (onClose ? onClose() : router.back())} > - + )} {children} diff --git a/webapps/console/components/ProvisionDatabaseButton/ProvisionDatabaseButton.tsx b/webapps/console/components/ProvisionDatabaseButton/ProvisionDatabaseButton.tsx index 00be59dbb..746653508 100644 --- a/webapps/console/components/ProvisionDatabaseButton/ProvisionDatabaseButton.tsx +++ b/webapps/console/components/ProvisionDatabaseButton/ProvisionDatabaseButton.tsx @@ -4,8 +4,8 @@ import React, { useState } from "react"; import { useRouter } from "next/router"; import { rpc } from "juava"; import { feedbackError, feedbackSuccess } from "../../lib/ui"; +import { Database, Loader2, Plus } from "lucide-react"; import { JitsuButton } from "../JitsuButton/JitsuButton"; -import JLucideIcon from "../Icons/JLucideIcon"; export function ProvisionDatabaseButton(props) { const { loader = undefined, createdCallback = undefined } = props; @@ -44,7 +44,7 @@ export function ProvisionDatabaseButton(props) { return (
    - +
    Create FREE ClickHouse Warehouse
    @@ -55,13 +55,7 @@ export function ProvisionDatabaseButton(props) {
    - ) : ( - - ) - } + icon={dbCreating ? : } type="default" onClick={createDbHandler} disabled={dbCreating} diff --git a/webapps/console/components/SQLViewer/SQLViewer.tsx b/webapps/console/components/SQLViewer/SQLViewer.tsx index d20b2824d..f901a3ab1 100644 --- a/webapps/console/components/SQLViewer/SQLViewer.tsx +++ b/webapps/console/components/SQLViewer/SQLViewer.tsx @@ -10,11 +10,11 @@ import { trimMiddle } from "../../lib/shared/strings"; import { LabelEllipsis } from "../LabelEllipsis/LabelEllipsis"; import { SortOrder } from "antd/es/table/interface"; import { ExpandableButton } from "../ExpandableButton/ExpandableButton"; +import { FolderTree, Play } from "lucide-react"; import styles from "./SQLViewer.module.css"; import { CodeEditor } from "../CodeEditor/CodeEditor"; import ClickhouseIcon from "../../lib/schema/icons/clickhouse"; -import JLucideIcon from "../Icons/JLucideIcon"; const { Sider, Content } = Layout; @@ -215,13 +215,10 @@ const SQLViewer: React.FC = ({ destinationId }) => {
    - } - onClick={() => runNewQuery(sql, SQLQueryDefaultLimit)} - > + } onClick={() => runNewQuery(sql, SQLQueryDefaultLimit)}> Run Query - } onClick={() => setShowSider(!showSider)}> + } onClick={() => setShowSider(!showSider)}> {showSider ? "Hide" : "Show"} tables
    diff --git a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx index 56346e4eb..dc37e4b52 100644 --- a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx +++ b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx @@ -13,13 +13,13 @@ import { FaExternalLinkAlt } from "react-icons/fa"; import { getCoreDestinationType } from "../../lib/schema/destinations"; import { confirmOp, feedbackError, feedbackSuccess } from "../../lib/ui"; import FieldListEditorLayout, { EditorItem } from "../FieldListEditorLayout/FieldListEditorLayout"; +import { ChevronLeft } from "lucide-react"; import { JitsuButton } from "../JitsuButton/JitsuButton"; import { LoadingAnimation } from "../GlobalLoader/GlobalLoader"; import hash from "stable-hash"; import { CodeEditor } from "../CodeEditor/CodeEditor"; import { DestinationTitle } from "../../pages/[workspaceId]/destinations"; import { ServiceTitle } from "../../pages/[workspaceId]/services"; -import JLucideIcon from "../Icons/JLucideIcon"; const log = getLog("SyncEditorPage"); @@ -298,12 +298,7 @@ function SyncEditor({

    {(existingLink ? "Edit" : "Create") + " sync"}

    - } - type="link" - size="small" - onClick={() => router.back()} - > + } type="link" size="small" onClick={() => router.back()}> Back
    diff --git a/webapps/console/next.config.js b/webapps/console/next.config.js index 3e74b86da..2e334723c 100644 --- a/webapps/console/next.config.js +++ b/webapps/console/next.config.js @@ -11,25 +11,25 @@ const prevWebpack = module.exports.webpack; const packageRoot = path.join(__dirname, "../../"); console.log("packageRoot", packageRoot); module.exports = { - modularizeImports: { - // "lucide-react": { - // transform: "Use instead of importing from 'lucide-react'", - // preventFullImport: true, - // }, - lodash: { - transform: "lodash/{{member}}", - preventFullImport: true, - }, - "@ant-design/icons": { - transform: "@ant-design/icons/{{member}}", - preventFullImport: true, - }, - "react-icons/(\\w+)": { - transform: "@react-icons/all-files/{{ matches.[1] }}/{{member}}", - preventFullImport: true, - skipDefaultConversion: true, - }, - }, + // modularizeImports: { + // // "lucide-react": { + // // transform: "Use instead of importing from 'lucide-react'", + // // preventFullImport: true, + // // }, + // lodash: { + // transform: "lodash/{{member}}", + // preventFullImport: true, + // }, + // "@ant-design/icons": { + // transform: "@ant-design/icons/{{member}}", + // preventFullImport: true, + // }, + // "react-icons/(\\w+)": { + // transform: "@react-icons/all-files/{{ matches.[1] }}/{{member}}", + // preventFullImport: true, + // skipDefaultConversion: true, + // }, + // }, experimental: { outputFileTracingExcludes: { "*": [ diff --git a/webapps/console/package.json b/webapps/console/package.json index 5f419cf5c..b99e3da4c 100644 --- a/webapps/console/package.json +++ b/webapps/console/package.json @@ -77,8 +77,7 @@ "prisma": "^4.12.0", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-icons": "^4.1.0", - "@react-icons/all-files": "^4.1.0", + "react-icons": "^4.10.1", "react-json-view": "^1.19.1", "react-use": "^17.4.0", "stable-hash": "0.0.3", diff --git a/webapps/console/pages/[workspaceId]/connections/index.tsx b/webapps/console/pages/[workspaceId]/connections/index.tsx index bd0192e7a..67cea07e7 100644 --- a/webapps/console/pages/[workspaceId]/connections/index.tsx +++ b/webapps/console/pages/[workspaceId]/connections/index.tsx @@ -17,12 +17,12 @@ import { useLinksQuery } from "../../../lib/queries"; import { jsonSerializationBase64, useQueryStringState } from "../../../lib/useQueryStringState"; import { TableProps } from "antd/es/table/InternalTable"; import { ColumnType, SortOrder } from "antd/es/table/interface"; +import { Edit3, Inbox } from "lucide-react"; import { PlusOutlined } from "@ant-design/icons"; import { JitsuButton, WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; import { DestinationTitle } from "../destinations"; import { ButtonGroup, ButtonProps } from "../../../components/ButtonGroup/ButtonGroup"; import { StreamTitle } from "../streams"; -import JLucideIcon from "../../../components/Icons/JLucideIcon"; import { FunctionTitle } from "../functions"; function EmptyLinks() { @@ -226,7 +226,7 @@ function ConnectionsTable({ links, streams, destinations, functions, reloadCallb render: (text, link) => { const items: ButtonProps[] = [ { - icon: , + icon: , label: "Edit", href: `/connections/edit?id=${link.id}`, }, @@ -265,7 +265,7 @@ function Connections(props: RemoteEntitiesProps) { if (props.streams.length == 0 || props.destinations.length == 0) { return (
    - +
    In order to connect site to destination please create at least one destination and one stream. Currently, you have{" "} diff --git a/webapps/console/pages/[workspaceId]/destinations.tsx b/webapps/console/pages/[workspaceId]/destinations.tsx index 7ea730e69..76bba6dbf 100644 --- a/webapps/console/pages/[workspaceId]/destinations.tsx +++ b/webapps/console/pages/[workspaceId]/destinations.tsx @@ -25,6 +25,7 @@ import { SnippedEditor } from "../../components/CodeEditor/SnippedEditor"; import { MultiSelectWithCustomOptions } from "../../components/MultiSelectWithCustomOptions/MultiSelectWithCustomOptions"; import { LoadingAnimation } from "../../components/GlobalLoader/GlobalLoader"; import { useQuery } from "@tanstack/react-query"; +import { Copy, Eye, FileKey, Loader2, TerminalSquare, XCircle } from "lucide-react"; import { ClickhouseConnectionCredentials } from "../../lib/schema/clickhouse-connection-credentials"; import { CodeBlock } from "../../components/CodeBlock/CodeBlock"; import { useBilling } from "../../components/Billing/BillingProvider"; @@ -36,7 +37,6 @@ import { ObjectTitle } from "../../components/ObjectTitle/ObjectTitle"; import { useQueryStringState } from "../../lib/useQueryStringState"; import { CustomWidgetProps } from "../../components/ConfigObjectEditor/Editors"; import { Htmlizer } from "../../components/Htmlizer/Htmlizer"; -import JLucideIcon from "../../components/Icons/JLucideIcon"; const log = getLog("destinations"); const Loader: React.FC<{}> = () => { @@ -215,7 +215,7 @@ const Password: React.FC = ({ children }) => {
    {show ? children : "********"}
    ); @@ -245,11 +245,7 @@ export const CredentialValue: React.FC<{ children: string; password?: boolean }> onClick={onClick} className="border shadow-sm rounded h-full bg-backgroundLight mr-1 mt-1 px-2 py-1 flex items-center font-main" > - {displayMask ? ( - - ) : ( - - )} + {displayMask ? : }
    {displayMask ? "Reveal" : justCopied ? "Copied" : "Copy"}
    @@ -373,7 +369,7 @@ function ProvisionedDestinationShowCredentials(props: { destination: Destination return <>; } if (billing.loading) { - return ; + return ; } return ( @@ -411,7 +407,7 @@ function ProvisionedDestinationShowCredentials(props: { destination: Destination
    {error ? "Error loading credentials" : "Clickhouse Credentials"}
    } @@ -441,11 +437,7 @@ function ProvisionedDestinationShowCredentials(props: { destination: Destination } }} > - {loading ? ( - - ) : ( - - )} + {loading ? : } @@ -534,7 +526,7 @@ const ProvisionedDestinations = (props: any) => { - + diff --git a/webapps/console/pages/[workspaceId]/functions.tsx b/webapps/console/pages/[workspaceId]/functions.tsx index 6ef98a0b5..09cb14240 100644 --- a/webapps/console/pages/[workspaceId]/functions.tsx +++ b/webapps/console/pages/[workspaceId]/functions.tsx @@ -5,9 +5,9 @@ import { useWorkspace } from "../../lib/context"; import { useRouter } from "next/router"; import { getLog } from "juava"; import React from "react"; +import { FunctionSquare } from "lucide-react"; import { FunctionsDebugger } from "../../components/FunctionsDebugger/FunctionsDebugger"; import { ObjectTitle } from "../../components/ObjectTitle/ObjectTitle"; -import JLucideIcon from "../../components/Icons/JLucideIcon"; const log = getLog("functions"); @@ -30,12 +30,12 @@ export const FunctionTitle: React.FC<{ f?: FunctionConfig; size?: "small" | "default" | "large"; title?: (d?: FunctionConfig) => string | React.ReactNode; -}> = ({ f, title = d => d?.name ?? "function", size = "default" }) => { +}> = ({ f, title = d => d?.name ?? "unknown function", size = "default" }) => { return ( : undefined} + icon={f ? : undefined} size={size} - title={title ? title(f) : "Unknown function"} + title={title ? title(f) : "unknown function"} /> ); }; @@ -54,7 +54,7 @@ const FunctionsList: React.FC<{}> = () => { noun: "function", type: "function", newObject: () => ({ name: "New function" }), - icon: f => , + icon: f => , explanation: (
    Functions let you apply transformations to incoming events. Examples of such transformations @@ -80,7 +80,7 @@ const FunctionsList: React.FC<{}> = () => { const verb = isNew ? "Create" : "Edit"; return (
    -
    {}
    +
    {}
    {verb} function
    ); diff --git a/webapps/console/pages/[workspaceId]/index.tsx b/webapps/console/pages/[workspaceId]/index.tsx index f445a1a8b..8ae0a0e17 100644 --- a/webapps/console/pages/[workspaceId]/index.tsx +++ b/webapps/console/pages/[workspaceId]/index.tsx @@ -17,12 +17,12 @@ import { QuestionCircleOutlined } from "@ant-design/icons"; import { ProvisionDatabaseButton } from "../../components/ProvisionDatabaseButton/ProvisionDatabaseButton"; import { ConnectionsDiagram } from "../../components/ConnectionsDiagram/ConnectionsDiagram"; import { getLog } from "juava"; +import { Chrome } from "lucide-react"; import classNames from "classnames"; import { useRouter } from "next/router"; import { TrackingIntegrationDocumentation } from "../../components/TrackingIntegrationDocumentation/TrackingIntegrationDocumentation"; import omit from "lodash/omit"; import Link from "next/link"; -import JLucideIcon from "../../components/Icons/JLucideIcon"; function Welcome({ destinations, @@ -305,7 +305,7 @@ export const FaviconLoader: React.FC<{ potentialUrl?: string }> = ({ potentialUr return faviconUrl ? ( {""} ) : ( - + ); }; diff --git a/webapps/console/pages/[workspaceId]/settings/billing.tsx b/webapps/console/pages/[workspaceId]/settings/billing.tsx index 2858cd488..a5aee534c 100644 --- a/webapps/console/pages/[workspaceId]/settings/billing.tsx +++ b/webapps/console/pages/[workspaceId]/settings/billing.tsx @@ -1,10 +1,10 @@ import { WorkspacePageLayout } from "../../../components/PageLayout/WorkspacePageLayout"; import { useBilling } from "../../../components/Billing/BillingProvider"; import { Alert, Skeleton } from "antd"; +import { ChevronLeft } from "lucide-react"; import React from "react"; import { BillingManager } from "../../../components/Billing/BillingManager"; import { WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; -import JLucideIcon from "../../../components/Icons/JLucideIcon"; const BillingPage: React.FC<{}> = () => { return ( @@ -12,12 +12,7 @@ const BillingPage: React.FC<{}> = () => {

    Plan & Billing

    - } - > + }> Back to settings
    diff --git a/webapps/console/pages/[workspaceId]/settings/index.tsx b/webapps/console/pages/[workspaceId]/settings/index.tsx index 51c9a6e4a..d2c7c6818 100644 --- a/webapps/console/pages/[workspaceId]/settings/index.tsx +++ b/webapps/console/pages/[workspaceId]/settings/index.tsx @@ -14,8 +14,8 @@ import { FaExternalLinkAlt, FaGithub, FaGoogle, FaUser } from "react-icons/fa"; import Link from "next/link"; import { AntdModal, useAntdModal } from "../../../lib/modal"; import { FiMail } from "react-icons/fi"; +import { ArrowRight, Copy } from "lucide-react"; import { JitsuButton, WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; -import JLucideIcon from "../../../components/Icons/JLucideIcon"; const InviteUserForm: React.FC<{ invite: (email: string) => Promise }> = ({ invite }) => { const [inputVisible, setInputVisible] = useState(false); @@ -73,7 +73,7 @@ function showInvitationLink(m: AntdModal, link: string) {
    {link} - +
    @@ -241,7 +241,7 @@ const WorkspaceSettingsComponent: React.FC = () => {
    } + icon={} href={"/settings/billing"} size="large" type="primary" @@ -262,7 +262,7 @@ const WorkspaceSettingsComponent: React.FC = () => {
    } + icon={} href={"/user"} size="large" type="primary" diff --git a/webapps/console/pages/[workspaceId]/sql.tsx b/webapps/console/pages/[workspaceId]/sql.tsx index c4ec258f7..3d35b4d2b 100644 --- a/webapps/console/pages/[workspaceId]/sql.tsx +++ b/webapps/console/pages/[workspaceId]/sql.tsx @@ -9,9 +9,9 @@ import { useAppConfig, useWorkspace } from "../../lib/context"; import { LoadingAnimation } from "../../components/GlobalLoader/GlobalLoader"; import { ErrorCard } from "../../components/GlobalError/GlobalError"; import Link from "next/link"; +import { ArrowRight, Inbox } from "lucide-react"; import ClickhouseIcon from "../../lib/schema/icons/clickhouse"; import { ProvisionDatabaseButton } from "../../components/ProvisionDatabaseButton/ProvisionDatabaseButton"; -import JLucideIcon from "../../components/Icons/JLucideIcon"; function removeDoubleSlashes(url: string) {} @@ -46,7 +46,7 @@ const AvailableDestinationsList: React.FC = () => { {Object.entries(data).length == 0 && ( <>
    - +
    You don't any destinations available for SQL
    @@ -67,7 +67,7 @@ const AvailableDestinationsList: React.FC = () => {
    {(destination as any).name}
    - +
    ))} diff --git a/webapps/console/pages/[workspaceId]/streams.tsx b/webapps/console/pages/[workspaceId]/streams.tsx index b1fc4892c..fcb9546cc 100644 --- a/webapps/console/pages/[workspaceId]/streams.tsx +++ b/webapps/console/pages/[workspaceId]/streams.tsx @@ -18,11 +18,11 @@ import { confirmOp, feedbackError } from "../../lib/ui"; import type { DomainStatus } from "../../lib/server/ee"; import { getAntdModal, useAntdModal } from "../../lib/modal"; import { get } from "../../lib/useApi"; +import { Globe, Wrench } from "lucide-react"; import { FaviconLoader } from "./index"; import { ObjectTitle } from "../../components/ObjectTitle/ObjectTitle"; import omit from "lodash/omit"; import { CustomWidgetProps } from "../../components/ConfigObjectEditor/Editors"; -import JLucideIcon from "../../components/Icons/JLucideIcon"; const Streams: React.FC = () => { return ( @@ -89,8 +89,7 @@ const CustomDomain: React.FC<{ domain: string; deleteDomain: () => Promise {/* */} {/*
    */}
    - = () => { }} className="flex items-center space-x-2 text-primary" > - + Setup Instructions ), @@ -372,7 +371,7 @@ const StreamsList: React.FC<{}> = () => { icon: s => , actions: [ { - icon: , + icon: , title: "Setup Instructions", collapsed: false, action: stream => { diff --git a/webapps/console/pages/[workspaceId]/syncs/index.tsx b/webapps/console/pages/[workspaceId]/syncs/index.tsx index 363832124..20fb20f50 100644 --- a/webapps/console/pages/[workspaceId]/syncs/index.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/index.tsx @@ -16,6 +16,7 @@ import { useLinksQuery } from "../../../lib/queries"; import { jsonSerializationBase64, useQueryStringState } from "../../../lib/useQueryStringState"; import { TableProps } from "antd/es/table/InternalTable"; import { ColumnType, SortOrder } from "antd/es/table/interface"; +import { CalendarCheckIcon, Edit3, Inbox, ListMinusIcon, Loader2, RefreshCw } from "lucide-react"; import { PlusOutlined } from "@ant-design/icons"; import { JitsuButton, WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; import { ErrorCard } from "../../../components/GlobalError/GlobalError"; @@ -29,8 +30,6 @@ import JSON5 from "json5"; import { ButtonGroup, ButtonProps } from "../../../components/ButtonGroup/ButtonGroup"; import { Overlay } from "../../../components/Overlay/Overlay"; import { CodeBlock } from "../../../components/CodeBlock/CodeBlock"; -import JLucideIcon from "../../../components/Icons/JLucideIcon"; -import RefreshCw from "../../../components/Icons/RefreshCw"; dayjs.extend(utc); dayjs.extend(relativeTime); @@ -255,7 +254,7 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt title: t?.status === "RUNNING" ? "Sync is already running" : undefined, icon: running == link.id ? ( - + ) : ( ), @@ -284,12 +283,12 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt label: "Run", }, { - icon: , + icon: , label: "Logs", href: `/syncs/tasks?query=${JSON5.stringify({ syncId: link.id })}`, }, { - icon: , + icon: , label: "Edit", href: `/syncs/edit?id=${link.id}`, }, @@ -298,7 +297,7 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt title: t?.status === "RUNNING" ? "Sync is already running" : undefined, icon: running == link.id ? ( - + ) : ( ), @@ -327,7 +326,7 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt label: "Full Sync", }, { - icon: , + icon: , onClick: async () => { setShowScheduling(link.id); }, @@ -378,7 +377,7 @@ function Syncs(props: RemoteEntitiesProps) { if (props.services.length == 0 || props.destinations.length == 0) { return (
    - +
    In order to connect service to destination please create at least one destination and one service. Currently, you have{" "} diff --git a/webapps/console/pages/[workspaceId]/syncs/logs.tsx b/webapps/console/pages/[workspaceId]/syncs/logs.tsx index 6f83f55ba..7bfdb2284 100644 --- a/webapps/console/pages/[workspaceId]/syncs/logs.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/logs.tsx @@ -3,10 +3,9 @@ import { useWorkspace } from "../../../lib/context"; import React, { ReactNode, useEffect, useMemo, useState } from "react"; import { useRouter } from "next/router"; import { JitsuButton } from "../../../components/JitsuButton/JitsuButton"; +import { ChevronLeft, FileDown, RefreshCw } from "lucide-react"; import { useQuery } from "@tanstack/react-query"; import { LoadingAnimation } from "../../../components/GlobalLoader/GlobalLoader"; -import JLucideIcon from "../../../components/Icons/JLucideIcon"; -import RefreshCw from "../../../components/Icons/RefreshCw"; function colorLogs(data: string): ReactNode { return data.split("\n").map((line, i) => { @@ -74,7 +73,7 @@ function TaskLogs() {

    Sync Tasks

    } + icon={} type="link" size="small" target="_blank" @@ -93,7 +92,7 @@ function TaskLogs() { Refresh } + icon={} type="link" size="small" onClick={() => router.back()} diff --git a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx index dccc174fc..b3fdef17a 100644 --- a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx @@ -15,12 +15,11 @@ import { ErrorCard } from "../../../components/GlobalError/GlobalError"; import { useLinksQuery } from "../../../lib/queries"; import { arrayToMap } from "../../../lib/shared/arrays"; import { JitsuButton, WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; +import { ChevronLeft, FileText, RefreshCw } from "lucide-react"; import { FaExternalLinkAlt, FaRegPlayCircle } from "react-icons/fa"; import { useRouter } from "next/router"; import { ExclamationCircleOutlined } from "@ant-design/icons"; import { SyncTitle } from "./index"; -import JLucideIcon from "../../../components/Icons/JLucideIcon"; -import RefreshCw from "../../../components/Icons/RefreshCw"; dayjs.extend(utc); dayjs.extend(relativeTime); @@ -177,7 +176,7 @@ function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap }: render: (text, task) => { return ( } + icon={} type={"link"} title={"View logs"} href={`/syncs/logs?taskId=${task.task_id}&syncId=${task.sync_id}`} @@ -449,7 +448,7 @@ function Tasks() { Refresh } + icon={} type="link" size="small" onClick={() => router.push(`/${workspace.slug || workspace.id}/syncs`)} diff --git a/webapps/console/pages/admin/oauth-test.tsx b/webapps/console/pages/admin/oauth-test.tsx index 8452f0fe9..c86cfdb44 100644 --- a/webapps/console/pages/admin/oauth-test.tsx +++ b/webapps/console/pages/admin/oauth-test.tsx @@ -1,6 +1,7 @@ import { useQuery } from "@tanstack/react-query"; import { getErrorMessage, getLog, rpc } from "juava"; import type { OauthDecorator } from "../../lib/server/oauth/services"; +import { Loader2 } from "lucide-react"; import { ErrorCard } from "../../components/GlobalError/GlobalError"; import { useState } from "react"; import { Button, Input, Select } from "antd"; @@ -8,7 +9,6 @@ import { Button, Input, Select } from "antd"; import { AppConfig } from "../../lib/schema"; import Nango from "@nangohq/frontend"; import { CodeBlock } from "../../components/CodeBlock/CodeBlock"; -import JLucideIcon from "../../components/Icons/JLucideIcon"; type OauthService = Omit, "merge">; @@ -119,7 +119,7 @@ const OauthTest: React.FC<{}> = () => { if (isLoading) { return (
    - +
    ); } else if (error) { diff --git a/webapps/console/pages/admin/users.tsx b/webapps/console/pages/admin/users.tsx index 38007cf9a..cc487d7a2 100644 --- a/webapps/console/pages/admin/users.tsx +++ b/webapps/console/pages/admin/users.tsx @@ -1,4 +1,5 @@ import { get, useApi } from "../../lib/useApi"; +import { Loader2, UserCheck } from "lucide-react"; import { ErrorCard, ErrorDetails } from "../../components/GlobalError/GlobalError"; import { Input, Table } from "antd"; import { CodeBlock } from "../../components/CodeBlock/CodeBlock"; @@ -10,14 +11,13 @@ import { useQueryStringState } from "../../lib/useQueryStringState"; import { feedbackError } from "../../lib/ui"; import { useFirebaseSession } from "../../lib/firebase-client"; import { JitsuButton } from "../../components/JitsuButton/JitsuButton"; -import JLucideIcon from "../../components/Icons/JLucideIcon"; export const UserDetails: React.FC<{ externalId?: string; internalId?: string }> = props => { const { data, isLoading, error } = useApi(urlWithQueryString(`/api/admin/users`, props, { filterUndefined: true })); if (isLoading) { return (
    - +
    ); } else if (error) { @@ -38,13 +38,7 @@ export const BecomeUser: React.FC<{ externalId?: string; internalId?: string }> return ( - ) : ( - - ) - } + icon={loading ? : } onClick={async () => { setLoading(true); try { @@ -71,7 +65,7 @@ export const UsersAdminPage = () => { if (isLoading) { return (
    - +
    ); } else if (error) { diff --git a/webapps/console/pages/workspaces.tsx b/webapps/console/pages/workspaces.tsx index 56554798a..5cd8416e2 100644 --- a/webapps/console/pages/workspaces.tsx +++ b/webapps/console/pages/workspaces.tsx @@ -3,6 +3,7 @@ import { FaArrowLeft, FaPlus } from "react-icons/fa"; import { get, useApi } from "../lib/useApi"; import { z } from "zod"; import { WorkspaceDbModel } from "../prisma/schema"; +import { ArrowRight, Loader2 } from "lucide-react"; import { EmbeddedErrorMessage } from "../components/GlobalError/GlobalError"; import { getLog } from "juava"; import Link from "next/link"; @@ -12,7 +13,6 @@ import React, { useState } from "react"; import { feedbackError } from "../lib/ui"; import { JitsuButton } from "../components/JitsuButton/JitsuButton"; import { Input, Tag } from "antd"; -import JLucideIcon from "../components/Icons/JLucideIcon"; const log = getLog("worspaces"); @@ -24,7 +24,7 @@ const WorkspacesList = () => { if (isLoading) { return (
    - +
    ); } else if (error) { @@ -69,7 +69,7 @@ const WorkspacesList = () => { {userData?.admin && {workspace.id}}
    - +
    ))} diff --git a/webapps/console/public/logo.svg b/webapps/console/public/logo.svg new file mode 100644 index 000000000..cf613bf48 --- /dev/null +++ b/webapps/console/public/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file From b47659c260d8b432080d1fb2be4ebdef99f9f801 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 28 Jul 2023 12:16:46 +0400 Subject: [PATCH 0099/1353] log api endpoint: check access to entities --- .../api/[workspaceId]/log/[type]/[actorId].ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts b/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts index cb74d998d..74dd3b815 100644 --- a/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts +++ b/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts @@ -1,4 +1,5 @@ import { Api, inferUrl, nextJsApiHandler, verifyAccess } from "../../../../../lib/api"; +import { db } from "../../../../../lib/server/db"; import { z } from "zod"; import { getServerLog } from "../../../../../lib/server/log"; import { ApiError } from "../../../../../lib/shared/errors"; @@ -23,6 +24,21 @@ export const api: Api = { const bulkerAuthKey = process.env.BULKER_AUTH_KEY ?? ""; const isHttps = bulkerURLEnv.startsWith("https://"); await verifyAccess(user, workspaceId); + if (type.startsWith("incoming.")) { + const source = await db + .prisma() + .configurationObject.findFirst({ where: { id: actorId, workspaceId: workspaceId } }); + if (!source) { + throw new ApiError(`site doesn't belong to the current workspace`, {}, { status: 403 }); + } + } else { + const link = await db + .prisma() + .configurationObjectLink.findFirst({ where: { id: actorId, workspaceId: workspaceId } }); + if (!link) { + throw new ApiError(`connection doesn't belong to the current workspace`, {}, { status: 403 }); + } + } // Options object const options = { From f6985fb6c3f65f168c882952cfc59a754254697b Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 28 Jul 2023 15:55:47 +0400 Subject: [PATCH 0100/1353] redis events log: add original event fetch logs --- libs/core-functions/src/context.ts | 4 +++- services/rotor/src/lib/functions-chain.ts | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/libs/core-functions/src/context.ts b/libs/core-functions/src/context.ts index deedbc665..f2ee387e6 100644 --- a/libs/core-functions/src/context.ts +++ b/libs/core-functions/src/context.ts @@ -11,7 +11,8 @@ export function createFullContext( store: Store, eventContext: EventContext, systemContext: SystemContext | {} = {}, - props: Record = {} + props: Record = {}, + event?: any ): FullContext { const ar = functionId.split("."); const id = ar.pop(); @@ -28,6 +29,7 @@ export function createFullContext( method: init?.method || "GET", body: init?.body, headers: init?.headers ? hideSensitiveHeaders(init.headers) : undefined, + event: event, }; if (!init?.agent) { init = { ...init, agent: (url.startsWith("https://") ? httpsAgent : httpAgent)() }; diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index baebe45c1..efc1b6cd1 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -50,7 +50,7 @@ export async function runChain( const event = events[i]; let result: FuncReturn; const sw = stopwatch(); - const funcCtx = createFullContext(f.id, eventsStore, store, eventContext, f.context, f.config); + const funcCtx = createFullContext(f.id, eventsStore, store, eventContext, f.context, f.config, event); try { result = await f.exec(event, funcCtx); } catch (err) { From 9bccfe2e5cb24c4e5f6447e80e8d055258caec49 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 31 Jul 2023 12:22:50 +0400 Subject: [PATCH 0101/1353] fix service editor ui bug --- .../src/functions/ga4-destination.ts | 3 ++- .../ConfigObjectEditor/SchemaForm.tsx | 19 +++++++++---------- .../ServiceEditor/ServiceEditor.tsx | 8 ++++++-- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/libs/core-functions/src/functions/ga4-destination.ts b/libs/core-functions/src/functions/ga4-destination.ts index c9259fcad..7427a6942 100644 --- a/libs/core-functions/src/functions/ga4-destination.ts +++ b/libs/core-functions/src/functions/ga4-destination.ts @@ -156,6 +156,7 @@ function trackEvent(event: AnalyticsServerEvent): Ga4Event { const evp = event.properties || {}; let params: Record = {}; let name; + const eventName = event.event || event.name; switch (event.name) { case "Promotion Clicked": name = "select_promotion"; @@ -267,7 +268,7 @@ function trackEvent(event: AnalyticsServerEvent): Ga4Event { params.items = getItems(event); break; default: - name = event.event || event.name; + name = eventName; params = { ...evp }; params = removeProperties(params, StandardProperties); params.currency = evp.currency; diff --git a/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx b/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx index c7d11be61..a84b84e77 100644 --- a/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx +++ b/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx @@ -1,7 +1,6 @@ import React, { useCallback, useMemo, useState } from "react"; import set from "lodash/set"; import get from "lodash/get"; -import styles from "./ConfigEditor.module.css"; import { EditorField } from "./EditorField"; import { Switch, Tabs } from "antd"; import { createDisplayName } from "../../lib/zod"; @@ -110,15 +109,15 @@ export const SchemaForm: React.FC<{ const editorProps = { value, onChange: change }; if (f.const) { - if (f.description) { - return ( -
    - {f.description} -
    - ); - } else { - return null; - } + // if (f.description) { + // return ( + //
    + // {f.description} + //
    + // ); + // } else { + return null; + //} } return ( diff --git a/webapps/console/components/ServiceEditor/ServiceEditor.tsx b/webapps/console/components/ServiceEditor/ServiceEditor.tsx index bfd4ea2e8..059eb6bb1 100644 --- a/webapps/console/components/ServiceEditor/ServiceEditor.tsx +++ b/webapps/console/components/ServiceEditor/ServiceEditor.tsx @@ -121,9 +121,13 @@ export const ServiceEditor: React.FC = props => { }, [workspace.id, credUserProvided, obj.package, obj.version, change, specs]); const validate = useCallback(() => { + const errors: string[] = []; + if (!specs || !specs.connectionSpecification) { + errors.push("Source specification was not loaded"); + return; + } const validate = ajv.compile(specs.connectionSpecification); const valid = validate(credentials); - const errors: string[] = []; if (!obj.name) { errors.push("[required] Object must have required property 'name'"); } @@ -156,7 +160,7 @@ export const ServiceEditor: React.FC = props => { return false; } return true; - }, [ajv, credentials, modal, obj.name, specs.connectionSpecification]); + }, [ajv, credentials, modal, obj.name, specs]); const save = useCallback(async () => { setLoading(true); From e18242a7da53cdd8f5a82d9049145cd38d546c24 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 1 Aug 2023 19:14:03 +0400 Subject: [PATCH 0102/1353] Syncs and Tasks UI improvements: support for Partial syncs results. --- .../SyncEditorPage/SyncEditorPage.tsx | 6 +- .../pages/[workspaceId]/syncs/index.tsx | 38 +- .../pages/[workspaceId]/syncs/tasks.tsx | 423 ++++++++++++++---- .../pages/api/[workspaceId]/sources/tasks.ts | 31 +- 4 files changed, 363 insertions(+), 135 deletions(-) diff --git a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx index dc37e4b52..1950c6f59 100644 --- a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx +++ b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx @@ -161,7 +161,7 @@ function SyncEditor({ } let cancelled = false; (async () => { - console.log("Loading catalog"); + console.log("Loading catalog for:", service.package, service.version); setLoadingCatalog(true); try { const h = juavaHash("md5", hash(JSON.parse(service.credentials))); @@ -205,7 +205,9 @@ function SyncEditor({ } catch (error) { updateCatalog(error); } finally { - setLoadingCatalog(false); + if (!cancelled) { + setLoadingCatalog(false); + } } })(); return () => { diff --git a/webapps/console/pages/[workspaceId]/syncs/index.tsx b/webapps/console/pages/[workspaceId]/syncs/index.tsx index 20fb20f50..7a3327d40 100644 --- a/webapps/console/pages/[workspaceId]/syncs/index.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/index.tsx @@ -30,6 +30,7 @@ import JSON5 from "json5"; import { ButtonGroup, ButtonProps } from "../../../components/ButtonGroup/ButtonGroup"; import { Overlay } from "../../../components/Overlay/Overlay"; import { CodeBlock } from "../../../components/CodeBlock/CodeBlock"; +import { processTaskStatus, TaskStatus } from "./tasks"; dayjs.extend(utc); dayjs.extend(relativeTime); @@ -185,7 +186,7 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt }, }, { - title:
    Sync Status
    , + title:
    Last Status
    , className: "text-right", width: "4%", render: (text, link) => { @@ -200,37 +201,10 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt ); } const t = tasks.data.tasks?.[link.id]; - const color = (status: string) => { - switch (status) { - case "RUNNING": - return "blue"; - case "FAILED": - return "red"; - case "SUCCESS": - return "green"; - default: - return undefined; - } - }; if (!t?.status) { - return NO RUNS; + return NO RUNS; } - return ( - //
    - { - router.push(`/${workspace.slug || workspace.id}/syncs/logs?taskId=${t.taskId}&syncId=${t.syncId}`); - }} - color={color(t.status)} - style={{ marginRight: 0 }} - > - {t.status} - - // show logs - //
    - ); + return ; }, }, { @@ -241,7 +215,7 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt return undefined; } const t = tasks.data.tasks?.[link.id]; - return
    {t ? formatDate(t.updatedAt) : ""}
    ; + return
    {t ? formatDate(t.updated_at) : ""}
    ; }, }, { @@ -405,7 +379,7 @@ function Syncs(props: RemoteEntitiesProps) {
    -
    Edit syncs
    +
    Syncs
    }> diff --git a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx index b3fdef17a..2475938f1 100644 --- a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx @@ -3,8 +3,8 @@ import { useWorkspace } from "../../../lib/context"; import { useApi } from "../../../lib/useApi"; import { source_taskDbModel } from "../../../prisma/schema"; import { z } from "zod"; -import { DatePicker, notification, Popconfirm, Select, Table, Tag } from "antd"; -import React, { useCallback, useEffect, useMemo, useState } from "react"; +import { DatePicker, notification, Popover, Select, Table, Tag } from "antd"; +import React, { PropsWithChildren, useCallback, useEffect, useMemo, useState } from "react"; import { useQueryStringState } from "../../../lib/useQueryStringState"; import { ColumnType } from "antd/es/table/interface"; import dayjs, { Dayjs } from "dayjs"; @@ -15,11 +15,13 @@ import { ErrorCard } from "../../../components/GlobalError/GlobalError"; import { useLinksQuery } from "../../../lib/queries"; import { arrayToMap } from "../../../lib/shared/arrays"; import { JitsuButton, WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; -import { ChevronLeft, FileText, RefreshCw } from "lucide-react"; -import { FaExternalLinkAlt, FaRegPlayCircle } from "react-icons/fa"; +import { AlertCircle, CheckCircle2, ChevronLeft, ListMinusIcon, RefreshCw, XCircle } from "lucide-react"; +import { FaExternalLinkAlt, FaPlay, FaRegPlayCircle } from "react-icons/fa"; import { useRouter } from "next/router"; -import { ExclamationCircleOutlined } from "@ant-design/icons"; import { SyncTitle } from "./index"; +import { ButtonGroup, ButtonProps } from "../../../components/ButtonGroup/ButtonGroup"; +import { rpc } from "juava"; +import { feedbackError } from "../../../lib/ui"; dayjs.extend(utc); dayjs.extend(relativeTime); @@ -49,18 +51,268 @@ const formatBytes = bytes => { type TasksDbModel = z.infer; +type TaskStats = { + stats: any; + totalStreams: number; + successStreams: number; + processedRows: number; + processedBytes: number; +}; + type TasksTableProps = { tasks: TasksDbModel[]; loading: boolean; linksMap?: Record; servicesMap?: Record; destinationsMap?: Record; + refreshCb?: () => void; }; -function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap }: TasksTableProps) { +export function TaskStatus({ task }: { task: TasksDbModel & TaskStats }) { const router = useRouter(); const workspace = useWorkspace(); - const columns: ColumnType[] = [ + + const SyncStatus: React.FC> = props => { + const [showPopover, setShowPopover] = useState(false); + const handleOpenChange = (newOpen: boolean) => { + console.log("handleOpenChange", newOpen); + setShowPopover(newOpen); + }; + + const popoverContent = ( +
    +
    + {task.stats ? ( + { + const o = { key: v[0], stream: v[0], ...(v[1] as any) }; + arr.push(o); + return arr; + }, [] as any[])} + /> + ) : ( +
    {task.description}
    + )} +
    +
    + } + type={"primary"} + ghost + href={`/syncs/logs?taskId=${task.task_id}&syncId=${task.sync_id}`} + > + Show Logs + + { + setShowPopover(false); + }} + > + Ok + +
    +
    + ); + + const icon = + props.status === "SUCCESS" ? ( + + ) : props.status === "PARTIAL" ? ( + + ) : ( + + ); + return ( + + {icon} + {props.status} +
    + } + trigger={"click"} + > + + + ); + }; + + switch (task.status) { + case "SUCCESS": + if (task.stats) { + return ( + + + SUCCESS + + show stats + + ); + } else { + return ( + + SUCCESS + + ); + } + case "PARTIAL": + return ( + + + PARTIAL + + show stats + + ); + case "FAILED": + return ( + + + FAILED + + show error + + ); + case "RUNNING": + return ( +
    { + router.push(`/${workspace.slug || workspace.id}/syncs/logs?taskId=${task.task_id}&syncId=${task.sync_id}`); + }} + > + + RUNNING + + show logs +
    + ); + default: + return ( + + {task.status} + + ); + } +} + +function TaskStatusResultTable({ stats }: { stats: any[] }) { + const columns: ColumnType[] = [ + { + title: "Stream", + dataIndex: "stream", + key: "stream", + width: "100%", + className: "font-mono", + }, + Table.EXPAND_COLUMN, + { + title: "Status", + key: "status", + render: (text, record) => { + if (record.status === "SUCCESS") { + return SUCCESS; + } else if (record.status === "PARTIAL") { + return PARTIAL; + } else { + return {record.status}; + } + }, + }, + { + title: "Rows", + dataIndex: "events", + key: "rows", + className: "text-right text-xs whitespace-nowrap", + render: (text, record) => { + return record.events ? record.events.toLocaleString() : 0; + }, + }, + { + title: "Size", + dataIndex: "bytes", + render: (text, record) => { + return formatBytes(record.bytes); + }, + key: "size", + className: "text-right text-xs whitespace-nowrap", + }, + ]; + return ( +
    record.status !== "SUCCESS", + expandedRowRender: record => { + return
    {record.error}
    ; + }, + }} + /> + ); +} + +export function processTaskStatus(task: TasksDbModel): TasksDbModel & TaskStats { + let stats: any = undefined; + try { + stats = JSON.parse(task.description || "{}"); + } catch (e) {} + //sum des values + const taskStats: TaskStats = { + stats, + totalStreams: 0, + successStreams: 0, + processedRows: 0, + processedBytes: 0, + }; + if (stats) { + for (const key in stats) { + taskStats.totalStreams++; + const stat = stats[key]; + if (typeof stat === "number") { + stats[key] = { + events: stat, + status: "SUCCESS", + }; + taskStats.successStreams++; + taskStats.processedRows += stats[key]; + } else if (typeof stat === "object") { + if (stat.status === "SUCCESS") { + taskStats.successStreams++; + } + taskStats.processedRows += stats[key].events; + taskStats.processedBytes += stats[key].bytes; + } + } + } + return { + ...task, + ...taskStats, + }; +} + +function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap, refreshCb }: TasksTableProps) { + const workspace = useWorkspace(); + + const tasksMapped = useMemo(() => { + return tasks.map(task => { + return { + key: task.task_id, + ...processTaskStatus(task), + }; + }); + }, [tasks]); + const columns: ColumnType<(typeof tasksMapped)[number]>[] = [ { title:
    Started (UTC)
    , key: "started_at", @@ -92,98 +344,94 @@ function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap }: }, { title:
    Duration
    , - key: "updated_at", + key: "duration", width: "12%", render: (text, task) => { - return
    {dayjs(task.updated_at).from(dayjs(task.started_at), true)}
    ; + return ( +
    {dayjs(task.updated_at).from(dayjs(task.started_at), true)}
    + ); }, }, { - title:
    Sync Status
    , + title:
    Status
    , key: "status", - className: "text-right", + className: "text-right whitespace-nowrap", width: "5%", + render: (text, task) => , + }, + { + title:
    Streams
    , + key: "streams", + width: "12%", + className: "text-right", render: (text, task) => { - switch (task.status) { - case "SUCCESS": - try { - const des = JSON.parse(task.description || "{}"); - //sum des values - let processed_rows = 0; - let processed_bytes = 0; - for (const key in des) { - const stat = des[key]; - if (typeof stat === "number") { - processed_rows += des[key]; - } else if (typeof stat === "object") { - processed_rows += des[key].events; - processed_bytes += des[key].bytes; - } - } - return ( -
    - - SUCCESS - - {processed_rows.toLocaleString()} rows - {formatBytes(processed_bytes)} -
    - ); - } catch (e) {} - return ( - - SUCCESS - - ); - case "FAILED": - const popoverContent = ( -
    -
    {task.description}
    -
    - ); - return ( - } - showCancel={false} - > - - - ); - case "RUNNING": - return ( - - RUNNING - - ); + if (task.status === "SUCCESS") { + return
    {task.successStreams}
    ; + } else if (task.status === "PARTIAL") { + return ( +
    + {task.successStreams} of {task.totalStreams} +
    + ); + } else { + return
    0
    ; } }, }, { - title: "", - key: "actions", + title:
    Rows
    , + dataIndex: "processedRows", + width: "12%", + className: "text-right", render: (text, task) => { - return ( - } - type={"link"} - title={"View logs"} - href={`/syncs/logs?taskId=${task.task_id}&syncId=${task.sync_id}`} - > - View Logs - - ); + return {(task.processedRows || 0).toLocaleString()}; + }, + }, + { + title:
    Data Size
    , + dataIndex: "processedRows", + width: "12%", + className: "text-right", + render: (text, task) => { + return {formatBytes(task.processedBytes)}; + }, + }, + { + title:
    Actions
    , + key: "actions", + render: (text, task, index) => { + const items: ButtonProps[] = [ + { + disabled: index > 0 || task.status === "RUNNING", + title: + index > 0 + ? "Only last task may be restarted" + : task.status === "RUNNING" + ? "Sync is already running" + : undefined, + icon: , + onClick: async () => { + try { + const runStatus = await rpc(`/api/${workspace.id}/sources/run?syncId=${task.sync_id}`); + if (runStatus?.error) { + feedbackError(runStatus.error, { placement: "top" }); + } else if (refreshCb) { + refreshCb(); + } + } catch (e) { + feedbackError("Failed to run sync", { error: e, placement: "top" }); + } finally { + } + }, + label: "Run Again", + }, + { + icon: , + href: `/syncs/logs?taskId=${task.task_id}&syncId=${task.sync_id}`, + label: "Show Logs", + }, + ]; + return ; }, }, ]; @@ -201,7 +449,7 @@ function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap }: // }, // }; // }} - dataSource={tasks} + dataSource={tasksMapped} sortDirections={["ascend", "descend"]} columns={columns} pagination={false} @@ -467,6 +715,7 @@ function Tasks() { linksMap={linksMap} servicesMap={servicesMap} destinationsMap={destinationsMap} + refreshCb={() => setRefresh(refresh + 1)} /> )} diff --git a/webapps/console/pages/api/[workspaceId]/sources/tasks.ts b/webapps/console/pages/api/[workspaceId]/sources/tasks.ts index 7014b01c4..55f7919c6 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/tasks.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/tasks.ts @@ -17,11 +17,12 @@ const aggregatedResultType = z.object({ tasks: z .record( z.object({ - syncId: z.string(), - taskId: z.string(), + sync_id: z.string(), + task_id: z.string(), status: z.string(), - startedAt: z.date(), - updatedAt: z.date(), + description: z.string(), + started_at: z.date(), + updated_at: z.date(), }) ) .optional(), @@ -53,21 +54,23 @@ export default createRoute() try { //get latest source_tasks from db for provided sync ids grouped by sync id const rows = await db.pgPool().query( - `select distinct sync_id as syncid, - last_value(task_id) over ( partition by sync_id order by started_at RANGE BETWEEN unbounded preceding and unbounded following) taskid, - last_value(status) over ( partition by sync_id order by started_at RANGE BETWEEN unbounded preceding and unbounded following) status, - last_value(started_at) over ( partition by sync_id order by started_at RANGE BETWEEN unbounded preceding and unbounded following) startedat, - last_value(updated_at) over ( partition by sync_id order by started_at RANGE BETWEEN unbounded preceding and unbounded following) updatedat + `select distinct sync_id as sync_id, + last_value(task_id) over ( partition by sync_id order by started_at RANGE BETWEEN unbounded preceding and unbounded following) as task_id, + last_value(status) over ( partition by sync_id order by started_at RANGE BETWEEN unbounded preceding and unbounded following) as status, + last_value(description) over ( partition by sync_id order by started_at RANGE BETWEEN unbounded preceding and unbounded following) as description, + last_value(started_at) over ( partition by sync_id order by started_at RANGE BETWEEN unbounded preceding and unbounded following) as started_at, + last_value(updated_at) over ( partition by sync_id order by started_at RANGE BETWEEN unbounded preceding and unbounded following) as updated_at from source_task where sync_id = ANY($1::text[])`, [body] ); const tasksRecord = rows.rows.reduce((acc, r) => { - acc[r.syncid] = { - syncId: r.syncid, - taskId: r.taskid, + acc[r.sync_id] = { + sync_id: r.sync_id, + task_id: r.task_id, status: r.status, - startedAt: r.startedat, - updatedAt: r.updatedat, + description: r.description, + started_at: r.started_at, + updated_at: r.updated_at, }; return acc; }, {} as aggregatedResultType["tasks"]); From 61ffbe7e3cfed85a4fc5ca66abd57f4169fbbe53 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 1 Aug 2023 19:27:01 +0400 Subject: [PATCH 0103/1353] Syncs and Tasks UI improvements: support for Partial syncs results. --- webapps/console/pages/[workspaceId]/syncs/tasks.tsx | 9 --------- 1 file changed, 9 deletions(-) diff --git a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx index 2475938f1..4e5c350e9 100644 --- a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx @@ -440,15 +440,6 @@ function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap, re
    { - // return { - // onClick: () => { - // router.push( - // `/${workspace.slug || workspace.id}/syncs/logs?taskId=${record.task_id}&syncId=${record.sync_id}` - // ); - // }, - // }; - // }} dataSource={tasksMapped} sortDirections={["ascend", "descend"]} columns={columns} From fe04ec8bfa28ccfac7492143bfb733f2f53f7d0f Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 2 Aug 2023 10:28:55 +0400 Subject: [PATCH 0104/1353] functions: treat empty array result as "drop" --- services/rotor/src/lib/functions-chain.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index efc1b6cd1..fe12d821a 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -68,9 +68,9 @@ export async function runChain( eventIndex: i, functionId: f.id, ms: sw.elapsedMs(), - dropped: result === "drop", + dropped: result === "drop" || (Array.isArray(result) && result.length === 0), }); - if (result === "drop") { + if (result === "drop" || (Array.isArray(result) && result.length === 0)) { return execLog; } else if (result) { newEvents.push(...(Array.isArray(result) ? result : [result])); From 9b7da1850e64116a8de13c2103734152d299ad76 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 2 Aug 2023 16:11:07 +0400 Subject: [PATCH 0105/1353] fix redis saving error if there is no stream api keys in project --- webapps/console/lib/server/fast-store.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/webapps/console/lib/server/fast-store.ts b/webapps/console/lib/server/fast-store.ts index f7339ce99..d21c9e032 100644 --- a/webapps/console/lib/server/fast-store.ts +++ b/webapps/console/lib/server/fast-store.ts @@ -366,7 +366,6 @@ async function saveConnectionsToRedis(db: DatabaseConnection) { if (lastStreamConfig && destinationsBuffer.length > 0) { addStreamByDomain(lastStreamConfig, destinationsBuffer, lastBackupEnabled); } - const apiKeysTmp = apiKeys.tmp(); for (const [domain, streamDsts] of Object.entries(streamsByDomain)) { //store array of StreamWithDestinations by domain await redis().hset(domainsRedisKey.tmp(), domain.toLowerCase(), JSON.stringify(Object.values(streamDsts))); @@ -380,14 +379,18 @@ async function saveConnectionsToRedis(db: DatabaseConnection) { (strm.stream.publicKeys ?? []) .filter(k => !!k.hash) .map(k => - redis().hset(apiKeysTmp, k.id, JSON.stringify({ hash: k.hash as string, streamId: id, keyType: "browser" })) + redis().hset( + apiKeys.tmp(), + k.id, + JSON.stringify({ hash: k.hash as string, streamId: id, keyType: "browser" }) + ) ) ); await Promise.all( (strm.stream.privateKeys ?? []) .filter(k => !!k.hash) .map(k => - redis().hset(apiKeysTmp, k.id, JSON.stringify({ hash: k.hash as string, streamId: id, keyType: "s2s" })) + redis().hset(apiKeys.tmp(), k.id, JSON.stringify({ hash: k.hash as string, streamId: id, keyType: "s2s" })) ) ); } From 578156ed3e0ec8158e6e907f531224398f54034d Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 2 Aug 2023 20:28:06 +0400 Subject: [PATCH 0106/1353] syncs: support airbyte state v2 syncs: allow same pairs of service=>dst syncs because they may have different catalog and scheduling --- .../ConfigObjectEditor/SchemaForm.tsx | 16 ++++++- .../SyncEditorPage/SyncEditorPage.tsx | 8 +++- .../pages/[workspaceId]/syncs/tasks.tsx | 8 ++-- .../pages/api/[workspaceId]/config/link.ts | 27 +++++++++--- .../pages/api/[workspaceId]/sources/run.ts | 44 +++++++++++++++++-- webapps/console/prisma/schema.prisma | 5 ++- 6 files changed, 92 insertions(+), 16 deletions(-) diff --git a/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx b/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx index a84b84e77..a50c020a7 100644 --- a/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx +++ b/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx @@ -305,7 +305,6 @@ const OneOf: React.FC<{ label: o.title, value: i, })); - // find discriminator field. This is a field that is present in all oneOf variants and has a const or enum with a single value // discriminator is used to determine which variant is selected const consts = (fieldSchema.oneOf as any[]) @@ -329,6 +328,7 @@ const OneOf: React.FC<{ let selected: any; let selectedIdx: number = 0; + let removeIdx = -1; for (let i = 0; i < fieldSchema.oneOf.length; i++) { const o = fieldSchema.oneOf[i]; if ( @@ -340,6 +340,18 @@ const OneOf: React.FC<{ break; } } + //Hide CDC option for replication_method + if (name === "replication_method") { + for (let i = 0; i < fieldSchema.oneOf.length; i++) { + const o = fieldSchema.oneOf[i]; + if (o.properties[discriminatorKey].const === "CDC" || o.properties[discriminatorKey].enum?.[0] === "CDC") { + removeIdx = i; + break; + } + } + } + + const filteredOptions = options.filter((o, i) => i !== removeIdx); return ( <> @@ -352,7 +364,7 @@ const OneOf: React.FC<{ fieldSchema.oneOf[v].properties[discriminatorKey].enum?.[0], }); }} - options={options} + options={filteredOptions} /> {selected && ( { - const { toId, fromId, data = undefined, type = "push" } = body; + const { id, toId, fromId, data = undefined, type = "push" } = body; await verifyAccess(user, workspaceId); - const existingLink = await db.prisma().configurationObjectLink.findFirst({ - where: { workspaceId: workspaceId, toId, fromId, deleted: false }, - }); const fromType = type === "sync" ? "service" : "stream"; + // we allow duplicates of service=>dst links because they may have different streams and scheduling + const existingLink = + type === "push" + ? await db.prisma().configurationObjectLink.findFirst({ + where: { workspaceId: workspaceId, toId, fromId, deleted: false }, + }) + : id + ? await db.prisma().configurationObjectLink.findFirst({ where: { id, deleted: false } }) + : undefined; + + if (!id && existingLink) { + throw new Error(`Link from '${fromId}' to '${toId}' already exists`); + } + const co = db.prisma().configurationObject; if ( !(await co.findFirst({ diff --git a/webapps/console/pages/api/[workspaceId]/sources/run.ts b/webapps/console/pages/api/[workspaceId]/sources/run.ts index 8a308687e..db6a836ee 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/run.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/run.ts @@ -94,7 +94,7 @@ export default createRoute() error: `Service ${sync.from} not found`, }; } - let stateObj: any = null; + let stateObj: any = undefined; if (query.fullSync === "true" || query.fullSync === "1") { await db.prisma().source_state.deleteMany({ where: { @@ -103,11 +103,49 @@ export default createRoute() }); } else { //load state from db - stateObj = await db.prisma().source_state.findUnique({ + const stateRows = await db.prisma().source_state.findMany({ where: { sync_id: query.syncId as string, }, }); + if (stateRows.length > 0) { + if (stateRows.length === 1 && stateRows[0].stream === "_LEGACY_STATE") { + //legacy state + stateObj = stateRows[0].state; + } else if (stateRows.length === 1 && stateRows[0].stream === "_GLOBAL_STATE") { + //v2 global state + stateObj = [ + { + type: "GLOBAL", + global: stateRows[0].state, + }, + ]; + } else { + //v2 multi-stream states + stateObj = stateRows + .filter(r => r.stream !== "_LEGACY_STATE" && r.stream != "_GLOBAL_STATE") + .map(r => { + const descr = r.stream.split("."); + let namespace: string | undefined = undefined; + let name: string | undefined = undefined; + if (descr.length === 1) { + name = descr[0]; + } else if (descr.length === 2) { + namespace = descr[0]; + name = descr[1]; + } else { + throw new Error(`Invalid stream name ${r.stream}`); + } + return { + type: "STREAM", + stream: { + stream_descriptor: { name: name, namespace: namespace }, + stream_state: r.state, + }, + }; + }); + } + } } const taskId = randomUUID(); @@ -126,7 +164,7 @@ export default createRoute() body: { config: await tryManageOauthCreds({ ...(service.config as ServiceConfig), id: sync.fromId }, req), catalog: JSON.parse((sync.data as any).streams), - ...(stateObj ? { state: stateObj.state } : {}), + ...(stateObj ? { state: stateObj } : {}), }, }); if (!res.ok) { diff --git a/webapps/console/prisma/schema.prisma b/webapps/console/prisma/schema.prisma index a82946ae9..e1638dcb0 100644 --- a/webapps/console/prisma/schema.prisma +++ b/webapps/console/prisma/schema.prisma @@ -184,9 +184,12 @@ model source_catalog { } model source_state { - sync_id String @id + sync_id String + stream String state Json timestamp DateTime @default(now()) @db.Timestamptz(3) + + @@id([sync_id, stream]) } model source_task { From d39cbea1506cfcb470fb505f28aece5d5dc0b081 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 3 Aug 2023 12:51:05 +0400 Subject: [PATCH 0107/1353] fix for saving connections --- .../ConnectionEditorPage/ConnectionEditorPage.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx index c0570f27c..9a1e95e0c 100644 --- a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx +++ b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx @@ -644,7 +644,13 @@ function ConnectionEditor({ setLoading(true); try { await get(`/api/${workspace.id}/config/link`, { - body: { fromId: srcId, toId: dstId, type: "push", data: connectionOptions }, + body: { + ...(existingLink ? { id: existingLink.id } : {}), + fromId: srcId, + toId: dstId, + type: "push", + data: connectionOptions, + }, }); if (router.query.backTo) { router.push(`/${workspace.id}${router.query.backTo}`); From 6bb46f551034ea08bb86d3d5fcf25626203c804e Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 3 Aug 2023 16:15:56 +0400 Subject: [PATCH 0108/1353] ServiceEditor and destination editor: test connection before saving rotor: set timeout to 30s for all fetch requests --- libs/core-functions/src/context.ts | 17 +++++++---- types/protocols/functions.d.ts | 1 - .../ConfigObjectEditor/ConfigEditor.tsx | 22 ++++++++++++++- .../ServiceEditor/ServiceEditor.tsx | 28 ++++++++++++++++--- webapps/console/lib/schema/index.ts | 2 ++ 5 files changed, 59 insertions(+), 11 deletions(-) diff --git a/libs/core-functions/src/context.ts b/libs/core-functions/src/context.ts index f2ee387e6..465491f1c 100644 --- a/libs/core-functions/src/context.ts +++ b/libs/core-functions/src/context.ts @@ -1,5 +1,5 @@ import { EventContext, EventsStore, FetchOpts, FullContext, Store, SystemContext } from "@jitsu/protocols/functions"; -import nodeFetch from "node-fetch-commonjs"; +import nodeFetch, { RequestInit } from "node-fetch-commonjs"; import { getErrorMessage, getLog } from "juava"; import { httpAgent, httpsAgent } from "./functions/lib/http-agent"; @@ -31,12 +31,19 @@ export function createFullContext( headers: init?.headers ? hideSensitiveHeaders(init.headers) : undefined, event: event, }; - if (!init?.agent) { - init = { ...init, agent: (url.startsWith("https://") ? httpsAgent : httpAgent)() }; - } + const controller = new AbortController(); + setTimeout(() => { + controller.abort(); + }, 30000); + + let internalInit: RequestInit = { + ...init, + agent: (url.startsWith("https://") ? httpsAgent : httpAgent)(), + signal: controller.signal, + }; let fetchResult: any = undefined; try { - fetchResult = await nodeFetch(url, init as any); + fetchResult = await nodeFetch(url, internalInit); } catch (err) { if (logToRedis) { eventsStore.log(true, { ...baseInfo, error: getErrorMessage(err) }); diff --git a/types/protocols/functions.d.ts b/types/protocols/functions.d.ts index 5b424d13e..dfb566184 100644 --- a/types/protocols/functions.d.ts +++ b/types/protocols/functions.d.ts @@ -43,7 +43,6 @@ export type FetchResponse = { export type FetchOpts = { method?: string; headers?: Record; - agent?: RequestOptions["agent"] | ((parsedUrl: URL) => RequestOptions["agent"]); body?: string; }; export type FunctionContext = { diff --git a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx index 16ce10ecd..ebd98a28d 100644 --- a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx +++ b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx @@ -288,7 +288,27 @@ const EditorComponent: React.FC = props => { schema={schema as any} liveValidate={true} validator={validator} - onSubmit={({ formData }) => withLoading(() => onSave(formData))()} + onSubmit={async ({ formData }) => { + if (onTest && testConnectionEnabled && testConnectionEnabled(formData || object)) { + const testRes = await onTest(formState?.formData || object); + if (!testRes.ok) { + modal.confirm({ + title: "Connection test failed", + content: testRes.error, + okText: "Save anyway", + okType: "danger", + cancelText: "Cancel", + onOk: () => { + withLoading(() => onSave({ ...formData, testConnectionError: testRes.error }))(); + }, + }); + return; + } else { + delete formData.testConnectionError; + } + } + withLoading(() => onSave(formData))(); + }} formData={formState?.formData || object} uiSchema={uiSchema} > diff --git a/webapps/console/components/ServiceEditor/ServiceEditor.tsx b/webapps/console/components/ServiceEditor/ServiceEditor.tsx index 059eb6bb1..5243d5fa8 100644 --- a/webapps/console/components/ServiceEditor/ServiceEditor.tsx +++ b/webapps/console/components/ServiceEditor/ServiceEditor.tsx @@ -164,11 +164,9 @@ export const ServiceEditor: React.FC = props => { const save = useCallback(async () => { setLoading(true); - try { - if (!validate()) { - return; - } + async function _save(testConnectionError?: string) { obj.credentials = JSON.stringify(credentials); + obj.testConnectionError = testConnectionError; if (props.isNew) { await getConfigApi(workspace.id, "service").create(obj); } else if (obj.id) { @@ -177,6 +175,28 @@ export const ServiceEditor: React.FC = props => { feedbackError(`Can't save service without id`); } push(`/${workspace.id}/services`); + } + try { + if (!validate()) { + return; + } + const testRes = await onTest!({ ...obj, credentials: JSON.stringify(credentials) }); + if (!testRes.ok) { + modal.confirm({ + title: "Connection test failed", + content: testRes.error, + okText: "Save anyway", + okType: "danger", + cancelText: "Cancel", + onOk: () => { + _save(testRes.error); + }, + }); + return; + } else { + delete obj.testConnectionError; + } + await _save(); } catch (error) { feedbackError(`Can't save service`, { error }); } finally { diff --git a/webapps/console/lib/schema/index.ts b/webapps/console/lib/schema/index.ts index 25660ca31..3f8226bb1 100644 --- a/webapps/console/lib/schema/index.ts +++ b/webapps/console/lib/schema/index.ts @@ -110,6 +110,7 @@ export const DestinationConfig = ConfigEntityBase.merge( destinationType: z.string(), provisioned: z.boolean().optional(), name: z.string(), + testConnectionError: z.string().optional(), }) .passthrough() ); @@ -131,6 +132,7 @@ export const ServiceConfig = ConfigEntityBase.merge( package: z.string(), version: z.string(), credentials: z.string(), + testConnectionError: z.string().optional(), }) ); export type ServiceConfig = z.infer; From b57899d457a2e799b18caa977163423df116a51a Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 3 Aug 2023 17:12:01 +0400 Subject: [PATCH 0109/1353] rotor: process destination messages partitions in parallel. rotor: enable metrics endpoint --- pnpm-lock.yaml | 20 ++++++++++++++++++++ services/rotor/package.json | 1 + services/rotor/src/index.ts | 8 ++++++++ services/rotor/src/lib/rotor.ts | 25 ++++++++++++++++++++++++- 4 files changed, 53 insertions(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a509235b0..b68f0ef1d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -373,6 +373,9 @@ importers: object-hash: specifier: ^3.0.0 version: 3.0.0 + prom-client: + specifier: ^14.2.0 + version: 14.2.0 tslib: specifier: ^2.4.0 version: 2.5.0 @@ -10144,6 +10147,10 @@ packages: file-uri-to-path: 1.0.0 dev: true + /bintrees@1.0.2: + resolution: {integrity: sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==} + dev: false + /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} dependencies: @@ -21481,6 +21488,13 @@ packages: engines: {node: '>=0.4.0'} dev: false + /prom-client@14.2.0: + resolution: {integrity: sha512-sF308EhTenb/pDRPakm+WgiN+VdM/T1RaHj1x+MvAuT8UiQP8JmOEbxVqtkbfR4LrvOg5n7ic01kRBDGXjYikA==} + engines: {node: '>=10'} + dependencies: + tdigest: 0.1.2 + dev: false + /promise-all-reject-late@1.0.1: resolution: {integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==} @@ -24380,6 +24394,12 @@ packages: mkdirp: 1.0.4 yallist: 4.0.0 + /tdigest@0.1.2: + resolution: {integrity: sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==} + dependencies: + bintrees: 1.0.2 + dev: false + /teeny-request@8.0.3: resolution: {integrity: sha512-jJZpA5He2y52yUhA7pyAGZlgQpcB+xLjcN0eUFxr9c8hP/H7uOXbBNVo/O0C/xVfJLJs680jvkFgVJEEvk9+ww==} engines: {node: '>=12'} diff --git a/services/rotor/package.json b/services/rotor/package.json index 302a41b4d..7b3461517 100644 --- a/services/rotor/package.json +++ b/services/rotor/package.json @@ -17,6 +17,7 @@ }, "dependencies": { "object-hash": "^3.0.0", + "prom-client": "^14.2.0", "node-cache": "^5.1.2", "@jitsu-internal/console": "workspace:*", "@jitsu/core-functions": "workspace:*", diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index 11990736f..8b0edfe32 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -26,6 +26,7 @@ import express from "express"; import NodeCache from "node-cache"; import hash from "object-hash"; import { UDFRunHandler } from "./http/udf"; +import Prometheus from "prom-client"; setServerJsonFormat(process.env.LOG_FORMAT === "json"); @@ -316,6 +317,8 @@ async function main() { handle: rotorMessageHandler, }); log.atInfo().log("Starting kafka processing"); + Prometheus.collectDefaultMetrics(); + rotor .start() .then(() => { @@ -323,6 +326,11 @@ async function main() { http.get("/health", (req, res) => { res.send("OK"); }); + http.get("/metrics", async (req, res) => { + res.set("Content-Type", Prometheus.register.contentType); + const result = await Prometheus.register.metrics(); + res.end(result); + }); http.post("/udfrun", UDFRunHandler); http.listen(rotorHttpPort, () => { log.atInfo().log(`Listening health-checks on port ${rotorHttpPort}`); diff --git a/services/rotor/src/lib/rotor.ts b/services/rotor/src/lib/rotor.ts index 077ff00bc..4f8f34b63 100644 --- a/services/rotor/src/lib/rotor.ts +++ b/services/rotor/src/lib/rotor.ts @@ -1,5 +1,6 @@ import { getLog } from "juava"; import { connectToKafka, KafkaCredentials } from "@jitsu-internal/console/lib/server/kafka-config"; +import Prometheus from "prom-client"; const log = getLog("kafka-rotor"); @@ -66,9 +67,31 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { const producer = kafka.producer({ allowAutoTopicCreation: false }); await producer.connect(); + const admin = kafka.admin(); + + const topicOffsets = new Prometheus.Gauge({ + name: "rotor_topic_offsets", + help: "topic offsets", + // add `as const` here to enforce label names + labelNames: ["partition", "offset"] as const, + }); + + const interval = setInterval(async () => { + try { + const offsets = await admin.fetchTopicOffsets(kafkaTopic); + for (const o of offsets) { + topicOffsets.set({ partition: o.partition, offset: "offset" }, parseInt(o.offset)); + topicOffsets.set({ partition: o.partition, offset: "high" }, parseInt(o.high)); + topicOffsets.set({ partition: o.partition, offset: "low" }, parseInt(o.low)); + } + } catch (e) { + log.atError().withCause(e).log("Failed to commit offsets"); + } + }, 60000); + await consumer.run({ autoCommit: true, - + partitionsConsumedConcurrently: 4, eachMessage: async ({ message }) => { const firstProcessed = message.headers?.firstProcessed ? new Date(message.headers?.firstProcessed.toString()) From b150190847b09686e7dcb04e26cd5dd1f489c5ec Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 3 Aug 2023 18:15:35 +0400 Subject: [PATCH 0110/1353] bring back blur on long loading --- .../components/PageLayout/WorkspacePageLayout.tsx | 2 +- webapps/console/pages/_app.tsx | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index f4a221298..e1cea31a1 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -504,7 +504,7 @@ export const WorkspacePageLayout: React.FC> = }, [fullscreen]); const pHeader = ( - + diff --git a/webapps/console/pages/_app.tsx b/webapps/console/pages/_app.tsx index 67e2a86b4..bb387c72f 100644 --- a/webapps/console/pages/_app.tsx +++ b/webapps/console/pages/_app.tsx @@ -236,15 +236,23 @@ const ProgressBar0: React.FC<{ className?: string }> = ({ className }) => { const ProgressBar = React.memo(ProgressBar0); const LoadingBlur: React.FC<{}> = () => { + const [showAnimation, setShowAnimation] = useState(false); + useEffect(() => { + setTimeout(() => setShowAnimation(true), 1000); + }, []); return (
    -
    +
    -
    +
    From f99a5aa3a990e1e4cbf07efab6763f14746a0bce Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Fri, 4 Aug 2023 19:13:14 +0400 Subject: [PATCH 0111/1353] feat: switch billing stat to clickhouse, new workspace admin page --- .../components/Billing/BillingManager.tsx | 40 +++- .../console/components/Billing/use-usage.ts | 29 +-- .../components/JsonAsTable/JsonAsTable.tsx | 81 ++++++++ .../PageLayout/WorkspacePageLayout.tsx | 98 ++++++++-- .../pages/[workspaceId]/settings/index.tsx | 2 +- .../console/pages/admin/overage-billing.tsx | 59 ++++++ webapps/console/pages/admin/workspaces.tsx | 84 ++++++++ .../api/[workspaceId]/ee/[...proxyPath].ts | 5 +- webapps/ee-api/lib/sql/workspace-info.sql | 32 ++++ webapps/ee-api/next.config.js | 10 + .../ee-api/pages/api/report/[reportName].ts | 76 -------- webapps/ee-api/pages/api/report/overage.ts | 116 ++++++++--- .../ee-api/pages/api/report/workspace-stat.ts | 181 ++++++++++++++++++ 13 files changed, 673 insertions(+), 140 deletions(-) create mode 100644 webapps/console/components/JsonAsTable/JsonAsTable.tsx create mode 100644 webapps/console/pages/admin/overage-billing.tsx create mode 100644 webapps/console/pages/admin/workspaces.tsx create mode 100644 webapps/ee-api/lib/sql/workspace-info.sql delete mode 100644 webapps/ee-api/pages/api/report/[reportName].ts create mode 100644 webapps/ee-api/pages/api/report/workspace-stat.ts diff --git a/webapps/console/components/Billing/BillingManager.tsx b/webapps/console/components/Billing/BillingManager.tsx index 4de6b498e..63ea0627e 100644 --- a/webapps/console/components/Billing/BillingManager.tsx +++ b/webapps/console/components/Billing/BillingManager.tsx @@ -90,8 +90,8 @@ const UsageSection: React.FC<{}> = () => { status={usage.usagePercentage > 1 ? "exception" : undefined} />
    - {formatNumber(Math.round(usage.destinationEvents))} / {formatNumber(usage.maxAllowedDestinatonEvents)}{" "} - destination events used from {startStr} to {endStr}. The quota will be reset on {endStr}. + {formatNumber(Math.round(usage?.events))} / {formatNumber(usage.maxAllowedDestinatonEvents)} destination events + used from {startStr} to {endStr}. The quota will be reset on {endStr}.
    {usage.usagePercentage > 1 && billing.settings.planId === "free" && (
    @@ -103,6 +103,24 @@ const UsageSection: React.FC<{}> = () => { />
    )} + {usage?.projectionByTheEndOfPeriod && + usage?.projectionByTheEndOfPeriod > usage?.maxAllowedDestinatonEvents && + billing.settings.planId == "free" && ( +
    + Account quota warning!} + showIcon + type={"warning"} + description={ + <> + You are projected to exceed your monthly events destination limit by{" "} + {formatNumber(usage?.projectionByTheEndOfPeriod - usage?.maxAllowedDestinatonEvents)} events. + Please upgrade your plan to avoid service disruption. + + } + /> +
    + )} {usage.usagePercentage > 1 && billing.settings.planId !== "free" && (
    = () => { description={
    You have exceeded your monthly events destination limit by{" "} - {formatNumber(usage.destinationEvents - usage.maxAllowedDestinatonEvents)}. The overage fee of $ + {formatNumber(usage.events - usage.maxAllowedDestinatonEvents)}. The overage fee of at least $ {( - ((usage.destinationEvents - usage.maxAllowedDestinatonEvents) / 100_000) * + ((usage.events - usage.maxAllowedDestinatonEvents) / 100_000) * (billing.settings?.overagePricePer100k || 0) ).toLocaleString("en-us", { maximumFractionDigits: 2 })} {" "} - will be added to your next invoice + will be added to your next invoice.{" "} + {usage.projectionByTheEndOfPeriod && ( + <> + The projected overage fee by end of the month is{" "} + + $ + {( + ((usage?.projectionByTheEndOfPeriod - usage.maxAllowedDestinatonEvents) / 100_000) * + (billing.settings?.overagePricePer100k || 0) + ).toLocaleString("en-us", { maximumFractionDigits: 2 })} + {" "} + + )}
    } type="info" diff --git a/webapps/console/components/Billing/use-usage.ts b/webapps/console/components/Billing/use-usage.ts index 579570c9f..2a466996d 100644 --- a/webapps/console/components/Billing/use-usage.ts +++ b/webapps/console/components/Billing/use-usage.ts @@ -2,9 +2,11 @@ import { useQuery } from "@tanstack/react-query"; import { assertFalse, assertTrue, rpc } from "juava"; import { useWorkspace } from "../../lib/context"; import { useBilling } from "./BillingProvider"; +import dayjs from "dayjs"; export type Usage = { - destinationEvents: number; + events: number; + projectionByTheEndOfPeriod?: number; maxAllowedDestinatonEvents: number; usagePercentage: number; periodStart: Date; @@ -13,6 +15,8 @@ export type Usage = { export type UseUsageRes = { isLoading: boolean; error?: any; usage?: Usage }; +export type DestinationReportDataRow = {}; + export function useUsage(): UseUsageRes { const workspace = useWorkspace(); const billing = useBilling(); @@ -34,20 +38,18 @@ export function useUsage(): UseUsageRes { const { isLoading, error, data } = useQuery( ["billing usage", workspace.id], async () => { - const report = await rpc(`/api/${workspace.id}/ee/report/destination-stat?start=${periodStart?.toISOString()}`); - const warehouseUsage = report.data.reduce( - (acc, d) => acc + (d.destination_type === "warehouse" ? d.events : 0), - 0 - ); - const destinationUsage = report.data.reduce( - (acc, d) => acc + (d.destination_type === "warehouse" ? 0 : d.events), - 0 - ); - return { warehouseUsage, destinationUsage } as const; + const report = await rpc(`/api/${workspace.id}/ee/report/workspace-stat?start=${periodStart?.toISOString()}`); + const usage = report.data.reduce((acc, d) => acc + d.events, 0); + return { usage } as const; }, { retry: false, cacheTime: 0 } ); + const periodDuration = dayjs(new Date()).diff(dayjs(periodStart), "day"); + const projection = + periodDuration > 0 && data + ? (data.usage / periodDuration) * dayjs(periodEnd).diff(dayjs(periodStart), "day") + : undefined; return { isLoading, error, @@ -55,9 +57,10 @@ export function useUsage(): UseUsageRes { ? { periodStart, periodEnd, - destinationEvents: data.warehouseUsage + data.destinationUsage, + events: data.usage, + projectionByTheEndOfPeriod: projection, maxAllowedDestinatonEvents: billing.settings.destinationEvensPerMonth, - usagePercentage: (data.warehouseUsage + data.destinationUsage) / billing.settings.destinationEvensPerMonth, + usagePercentage: data.usage / billing.settings.destinationEvensPerMonth, } : undefined, }; diff --git a/webapps/console/components/JsonAsTable/JsonAsTable.tsx b/webapps/console/components/JsonAsTable/JsonAsTable.tsx new file mode 100644 index 000000000..152181fb2 --- /dev/null +++ b/webapps/console/components/JsonAsTable/JsonAsTable.tsx @@ -0,0 +1,81 @@ +import omit from "lodash/omit"; +import Link from "next/link"; +import { ExternalLink } from "lucide-react"; +import { Table } from "antd"; +import hash from "stable-hash"; + +function makeNiceName(key: string) { + return key + .replace(/([a-z])([A-Z])/g, "$1 $2") + .split(/(?=[A-Z])/) + .map(word => word.charAt(0).toUpperCase() + word.slice(1)) + .join(" "); +} + +export type TypedColumn = + | { + type: "number"; + } + | { type: "link"; href: (val, row) => string }; +export type ColumnOption = { omit: true; type?: unknown } | ({ omit?: false | undefined } & TypedColumn); +export const JsonAsTable: React.FC<{ rows: any[]; columnOptions: Record }> = ({ + rows, + columnOptions, +}) => { + const columnsMeta: Record = {}; + const omitColumns = columnOptions + ? Object.entries(columnOptions) + .filter(([_, v]) => v.omit) + .map(([k, _]) => k) + : []; + for (const row of rows) { + const displayKeys = Object.keys(omit({ ...row }, omitColumns)); + for (const key of displayKeys) { + if (!columnsMeta[key]) { + const columnType = columnOptions[key]; + const isNumber = columnType?.type === "number"; + columnsMeta[key] = { + key: key, + title: {makeNiceName(key)}, + render: (row: any) => { + return ( +
    + {(() => { + const val = row[key]; + if (isNumber) { + return new Intl.NumberFormat("en-US").format(val); + } else if (columnType?.type === "link") { + return ( + + {val} + + ); + } else { + return typeof val === "undefined" ? "" : typeof val === "object" ? JSON.stringify(val) : `${val}`; + } + })()} +
    + ); + }, + sorter: isNumber + ? (a: number, b: number) => a[key] - b[key] + : (a, b) => (a?.[key] ? `${a?.[key]}` : "").localeCompare(b?.[key] ? `${b?.[key]}` : ""), + }; + } + } + } + return ( +
    ({ key: hash(r), ...r }))} + pagination={{ pageSize: 1000 }} + expandable={{ + expandedRowRender: row =>
    {JSON.stringify(omit(row, "key"), null, 2)}
    , + }} + /> + ); +}; diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index f4a221298..9ee06ea73 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -1,4 +1,4 @@ -import { PropsWithChildren, ReactNode, useEffect, useState } from "react"; +import React, { PropsWithChildren, ReactNode, useEffect, useState } from "react"; import { branding } from "../../lib/branding"; import { HiSelector } from "react-icons/hi"; import { FaSignOutAlt, FaUserCircle } from "react-icons/fa"; @@ -9,10 +9,13 @@ import { ButtonLabel } from "../ButtonLabel/ButtonLabel"; import styles from "./WorkspacePageLayout.module.css"; import { Activity, + AlertCircle, ArrowLeftRight, + ArrowRight, BarChart3, ChevronUp, FilePlus, + FolderKanban, Folders, FunctionSquare, Globe, @@ -34,7 +37,7 @@ import { get, useApi } from "../../lib/useApi"; import { Overlay } from "../Overlay/Overlay"; import { WorkspaceNameAndSlugEditor } from "../WorkspaceNameAndSlugEditor/WorkspaceNameAndSlugEditor"; -import { getLog, requireDefined } from "juava"; +import { assertDefined, assertTrue, getLog, requireDefined } from "juava"; import classNames from "classnames"; import { getEeClient } from "../../lib/ee-client"; import { BillingBlockingDialog } from "../Billing/BillingBlockingDialog"; @@ -46,6 +49,8 @@ import { useClassicProject } from "./ClassicProjectProvider"; import { useJitsu } from "@jitsu/jitsu-react"; import { useSearchParams } from "next/navigation"; import omit from "lodash/omit"; +import { useBilling } from "../Billing/BillingProvider"; +import { useUsage } from "../Billing/use-usage"; export type PageLayoutProps = { fullscreen?: boolean; @@ -87,20 +92,6 @@ export const WorkspaceMenu: React.FC<{ closeMenu: () => void; classicProject?: s ); }; -function AdminMenuItems() { - const { data, error } = useApi(`/user/properties`); - if (error) { - log.atWarn().log("Failed to load user properties", error); - } else if (data) { - return ( - }> - Admin Users - - ); - } - return <>; -} - function WorkspacesMenu(props: { jitsuClassicAvailable: boolean }) { const router = useRouter(); const [classicLoading, setClassicLoading] = useState(false); @@ -123,6 +114,14 @@ function WorkspacesMenu(props: { jitsuClassicAvailable: boolean }) { await router.push("/admin/users"); }, }, + { + key: "admin-workspaces", + label: "Admin Workspaces", + icon: , + onClick: async () => { + await router.push("/admin/workspaces"); + }, + }, ]; } @@ -370,6 +369,70 @@ const UserProfileButton: React.FC<{}> = () => { ); }; +const AlertView: React.FC> = ({ children }) => { + const [show, setShow] = useState(false); + useEffect(() => { + setTimeout(() => setShow(true), 1); // Set a delay of 1 second before showing the alert. + }, []); + + return ( +
    + +
    {children}
    +
    + +
    +
    + ); +}; +const FreePlanQuotaAlert: React.FC<{}> = () => { + const workspace = useWorkspace(); + const usage = useUsage(); + const billing = useBilling(); + const router = useRouter(); + assertTrue(billing.enabled, "Billing should be enabled and loaded"); + assertDefined(billing.settings, "Billing settings should be loaded"); + + if (router.pathname.endsWith("/settings/billing")) { + //don't display second alert on billing page + return <>; + } + + if ( + !usage.isLoading && + !usage.error && + billing.settings.planId === "free" && + usage.usage?.projectionByTheEndOfPeriod && + usage.usage?.projectionByTheEndOfPeriod > usage.usage.maxAllowedDestinatonEvents + ) { + return ( + + You are projected to exceed your monthly events. Please upgrade your plan to avoid service disruption.{" "} + + Go to billing + + + ); + } + return <>; +}; + +const WorkspaceAlert: React.FC<{}> = () => { + const billing = useBilling(); + if (billing.loading || !billing.enabled) { + return <>; + } + return ; +}; + function PageHeader() { const appConfig = useAppConfig(); const workspace = useWorkspace(); @@ -397,7 +460,8 @@ function PageHeader() { ); return (
    -
    +
    +
    diff --git a/webapps/console/pages/[workspaceId]/settings/index.tsx b/webapps/console/pages/[workspaceId]/settings/index.tsx index d2c7c6818..cdd3db541 100644 --- a/webapps/console/pages/[workspaceId]/settings/index.tsx +++ b/webapps/console/pages/[workspaceId]/settings/index.tsx @@ -246,7 +246,7 @@ const WorkspaceSettingsComponent: React.FC = () => { size="large" type="primary" > - Manage Billing {"&"} Plan + Manage Billing {"&"} Plan / Download Invoices
    diff --git a/webapps/console/pages/admin/overage-billing.tsx b/webapps/console/pages/admin/overage-billing.tsx new file mode 100644 index 000000000..1b9467d50 --- /dev/null +++ b/webapps/console/pages/admin/overage-billing.tsx @@ -0,0 +1,59 @@ +import { useApi } from "../../lib/useApi"; +import { useRouter } from "next/router"; +import { Loader2 } from "lucide-react"; +import { ErrorCard } from "../../components/GlobalError/GlobalError"; +import { JitsuButton } from "../../components/JitsuButton/JitsuButton"; +import { FaArrowLeft } from "react-icons/fa"; +import { JsonAsTable } from "../../components/JsonAsTable/JsonAsTable"; + +const View = ({ data }) => { + const router = useRouter(); + return ( +
    +
    +
    + } size="large" type="primary" onClick={() => router.back()}> + Go back + +
    + `/${row.workspaceId}` }, + destinationEvents: { type: "number" }, + overageEvents: { type: "number" }, + overageFee: { type: "number" }, + overageFeeFinal: { omit: true }, + discountPercentage: { omit: true }, + coupon: { omit: true }, + couponName: { omit: true }, + invoiceHelper: { omit: true }, + workspaceSlug: { omit: true }, + workspaceName: { type: "link", href: (val, row) => `/${row.workspaceSlug}` }, + }} + /> +
    + ); +}; + +export const OverageBillingPage = () => { + const { data, isLoading, error } = useApi(`/api/$all/ee/report/overage`); + if (isLoading) { + return ( +
    + +
    + ); + } else if (error) { + return ( +
    + +
    + ); + } + return ; +}; + +export default OverageBillingPage; diff --git a/webapps/console/pages/admin/workspaces.tsx b/webapps/console/pages/admin/workspaces.tsx new file mode 100644 index 000000000..a41dc9bdc --- /dev/null +++ b/webapps/console/pages/admin/workspaces.tsx @@ -0,0 +1,84 @@ +import { useApi } from "../../lib/useApi"; +import { useRouter } from "next/router"; +import { useQueryStringState } from "../../lib/useQueryStringState"; +import { Loader2 } from "lucide-react"; +import { ErrorCard } from "../../components/GlobalError/GlobalError"; +import { Switch } from "antd"; +import omit from "lodash/omit"; +import { JitsuButton } from "../../components/JitsuButton/JitsuButton"; +import { FaArrowLeft } from "react-icons/fa"; +import { useState } from "react"; +import hash from "stable-hash"; +import { JsonAsTable } from "../../components/JsonAsTable/JsonAsTable"; + +const View = ({ data }) => { + const [rollup, setRollup] = useState(false); + const router = useRouter(); + return ( +
    +
    +
    + setRollup(val)} /> +
    + } size="large" type="primary" onClick={() => router.back()}> + Go back + +
    + { + const rowKey = hash(omit(row, "events", "period")); + const rowValues = omit(row, "period"); + if (!res[rowKey]) { + res[rowKey] = { ...rowValues, events: 0 }; + } + res[rowKey].events += row.events; + return res; + }, {}) + ) + : data.data + ).map(({ period, workspaceName, workspaceId, domains, workspaceSlug, events, ...rest }) => ({ + ...(period ? { period: new Date(period).toISOString().replace("T", " ") } : {}), + ...{ + workspaceName: workspaceName || workspaceSlug || workspaceId, + workspaceSlug: workspaceSlug || workspaceId, + domains, + ...rest, + events, + }, + }))} + columnOptions={{ + src: { omit: true }, + workspaceId: { omit: true }, + users: { omit: true }, + events: { type: "number" }, + workspaceSlug: { omit: true }, + workspaceName: { type: "link", href: (val, row) => `/${row.workspaceSlug}` }, + }} + /> +
    + ); +}; + +export const WorkspacesAdminPage = () => { + const { data, isLoading, error } = useApi(`/api/$all/ee/report/workspace-stat?extended=true`); + const router = useRouter(); + const [filter, setFilter] = useQueryStringState("filter"); + if (isLoading) { + return ( +
    + +
    + ); + } else if (error) { + return ( +
    + +
    + ); + } + return ; +}; + +export default WorkspacesAdminPage; diff --git a/webapps/console/pages/api/[workspaceId]/ee/[...proxyPath].ts b/webapps/console/pages/api/[workspaceId]/ee/[...proxyPath].ts index f4a1a8caf..f038f252f 100644 --- a/webapps/console/pages/api/[workspaceId]/ee/[...proxyPath].ts +++ b/webapps/console/pages/api/[workspaceId]/ee/[...proxyPath].ts @@ -23,10 +23,11 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse const { jwt } = createJwt(user.internalId, user.email, workspaceId, 60); const query = { ...(req.query || {}), - workspaceId, + workspaceId: workspaceId === "$all" ? undefined : workspaceId, }; const queryString = Object.entries(query) - .map(([key, val]) => `${key}=${encodeURIComponent(val)}`) + .filter(([, val]) => val !== undefined) + .map(([key, val]) => `${key}=${encodeURIComponent(val + "")}`) .join("&"); const url = removeDoubleSlashes(`${getEeConnection().host}/api/${proxyPath.join("/")}?${queryString}`); const response = await fetch(url, { diff --git a/webapps/ee-api/lib/sql/workspace-info.sql b/webapps/ee-api/lib/sql/workspace-info.sql new file mode 100644 index 000000000..cf417b152 --- /dev/null +++ b/webapps/ee-api/lib/sql/workspace-info.sql @@ -0,0 +1,32 @@ +with workspace_domains as (select ws.name as workspaceName, + ws.slug as workspaceSlug, + ws."id" as workspaceId, + CO.config -> 'domains' as domains + + +from newjitsu."Workspace" ws + left join newjitsu."ConfigurationObject" CO +on "ws".id = CO."workspaceId" and CO.type = 'stream' +where CO.config ->> 'domains' is not null + and CO.config ->> 'domains' <> '[]'), + workspace_admins as (select ws.name as workspaceName, + ws.slug as workspaceSlug, + ws."id" as workspaceId, + ARRAY_AGG(u.name || '<' || u.email || '>') as users +from newjitsu."Workspace" ws + left join newjitsu."WorkspaceAccess" acc on ws.id = acc."workspaceId" + left join newjitsu."UserProfile" u on acc."userId" = u.id +group by 1, 2, 3) + + +select ws.name as "workspaceName", + ws.slug as "workspaceSlug", + ws."id" as "workspaceId", + dm.domains as domains, + u.users +from newjitsu."Workspace" ws + left join workspace_domains dm on dm.workspaceId = ws.id + left join workspace_admins u on u.workspaceId = ws.id +where ws."deleted" = false +--- TODO: we should probably add `and ws."id" in (:workspaceIds)` + diff --git a/webapps/ee-api/next.config.js b/webapps/ee-api/next.config.js index 0c83ce699..69b35e09f 100644 --- a/webapps/ee-api/next.config.js +++ b/webapps/ee-api/next.config.js @@ -2,6 +2,16 @@ const nextConfig = { reactStrictMode: true, swcMinify: true, + webpack: (config, opts) => { + // if (prevWebpack) { + // prevWebpack(config, opts); + // } + config.module.rules.push({ + test: /\.sql$/, + use: "raw-loader", + }); + return config; + } } const withTM = require('next-transpile-modules')(['juava']); // pass the modules you would like to see transpiled diff --git a/webapps/ee-api/pages/api/report/[reportName].ts b/webapps/ee-api/pages/api/report/[reportName].ts deleted file mode 100644 index 7bca80d91..000000000 --- a/webapps/ee-api/pages/api/report/[reportName].ts +++ /dev/null @@ -1,76 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from "next"; -import { getLog, namedParameters, requireDefined, SqlQueryParameters, unrollParams } from "juava"; -import { withErrorHandler } from "../../../lib/error-handler"; -import { auth } from "../../../lib/auth"; -import { pg } from "../../../lib/services"; -import * as PG from "pg"; - -const log = getLog("/api/report"); - -export const queries: Record string> = { - //newjitsu schema is hardcoded here, should be fixed - //newjitsu schema is hardcoded here, should be fixed - "destination-stat": () => ` - select - date (m.timestamp) as day, case when length (obj.data->> 'mode') > 0 then 'warehouse' else 'service' - end as destination_type, - sum(m.value) as events - from newjitsuee.bulker_metrics m - left join newjitsu."ConfigurationObjectLink" obj on obj."id"=m."destinationId" - where - m.metric_name='bulkerapp_ingest_messages' and - m.status='success' and - m.timestamp > now() - interval '30 day' and - obj."workspaceId" = :workspaceId and - date_trunc(:granularity, "timestamp") >= date_trunc(:granularity, :start::TIMESTAMP) and - date_trunc(:granularity, "timestamp") <= date_trunc(:granularity, :end::TIMESTAMP) - group by day, destination_type order by day, destination_type desc; - `, -}; - -function getDate(param: string | undefined, defaultVal?: string): Date { - return param ? new Date(param) : defaultVal ? new Date(defaultVal) : new Date(); -} - -export async function query(pg: PG.Pool, sql: string, params: SqlQueryParameters = []): Promise[]> { - const { query, values } = namedParameters(sql, params); - log.atInfo().log(`Querying: ${unrollParams(query, values)}`); - return await pg.query({ text: query, values }).then(res => { - return res.rows; - }); -} - -const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { - res.setHeader("Access-Control-Allow-Origin", req.headers.origin || "*"); - res.setHeader("Access-Control-Allow-Methods", "*"); - res.setHeader("Access-Control-Allow-Headers", "authorization, content-type, baggage, sentry-trace"); - if (req.method === "OPTIONS") { - //allowing requests from everywhere since our tokens are short-lived - //and can't be hijacked - res.status(200).end(); - return; - } - const claims = await auth(req, res); - if (!claims) { - res.status(401).end(); - return; - } - const workspaceId = - claims.type === "user" - ? claims.workspaceId - : requireDefined(req.query.workspaceId as string, "workspaceId must be set as get parameter for admin auth"); - const start = getDate(req.query.start as string, "2010-01-01").toISOString(); - const end = getDate(req.query.end as string)?.toISOString() || new Date().toISOString(); - const granularity = ((req.query.granularity as string) || "day").toLowerCase(); - if (!["day", "hour"].includes(granularity)) { - throw new Error(`Invalid granularity: ${granularity}`); - } - const metricsTable = `${process.env.METRICS_SCHEMA || "bulker"}.bulker_metrics`; - const reportName = requireDefined(req.query.reportName, `No [reportName] in URL`) as string; - const sqlQuery = requireDefined(queries[reportName], `Unknown report ${reportName}`)({ metricsTable }); - - const data = await query(await pg(), sqlQuery, { workspaceId, granularity, start, end }); - return { data }; -}; - -export default withErrorHandler(handler); diff --git a/webapps/ee-api/pages/api/report/overage.ts b/webapps/ee-api/pages/api/report/overage.ts index 333797852..edc6e8a8d 100644 --- a/webapps/ee-api/pages/api/report/overage.ts +++ b/webapps/ee-api/pages/api/report/overage.ts @@ -1,15 +1,52 @@ import type { NextApiRequest, NextApiResponse } from "next"; -import { assertTrue, getLog, requireDefined } from "juava"; +import { assertTrue, getLog } from "juava"; import { withErrorHandler } from "../../../lib/error-handler"; import { auth } from "../../../lib/auth"; -import { pg, store } from "../../../lib/services"; +import { store } from "../../../lib/services"; import { getAvailableProducts, stripe, stripeDataTable } from "../../../lib/stripe"; import Stripe from "stripe"; -import { queries, query } from "./[reportName]"; import pick from "lodash/pick"; +import { buildWorkspaceReport } from "./workspace-stat"; const log = getLog("/api/report"); +function toUTC(date: Date | string) { + const dateObj = new Date(date); + const timezoneOffset = dateObj.getTimezoneOffset(); + return new Date(dateObj.getTime() - timezoneOffset * 60000); +} + +function round(date: Date | string, granularity: "day" = "day"): { start: string; end: string } { + try { + const dateObj = toUTC(date).toISOString(); + const day = dateObj.split("T")[0]; + const start = `${day}T00:00:00.000Z`; + const end = `${day}T23:59:59.999Z`; + return { start, end }; + } catch (e) { + throw new Error(`Can't parse date ${date}`); + } +} + +async function listAllInvoices() { + log.atInfo().log("Listing invoices..."); + let starting_after: string | undefined = undefined; + const allInvoices: Stripe.Invoice[] = []; + do { + const result = await stripe.invoices.list({ + limit: 100, + starting_after: starting_after, + }); + starting_after = result?.data[result.data.length - 1]?.id; + log.atInfo().log(`Fetched ${result?.data.length} invoices. Has more: ${!!starting_after}`); + if (result?.data) { + allInvoices.push(...result?.data); + } + } while (starting_after); + log.atInfo().log(`${allInvoices.length} invoices found`); + return allInvoices; +} + const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { const claims = await auth(req, res); const workspaceId: string | undefined = req.query.workspaceId ? (req.query.workspaceId as string) : undefined; @@ -30,6 +67,14 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse res.status(200).end(); return; } + const report = await buildWorkspaceReport( + new Date("2023-01-01").toISOString(), + new Date().toISOString(), + "day", + workspaceId + ); + + log.atInfo().log("Report", JSON.stringify(report, null, 2)); const allWorkspaces = workspaceId ? [ @@ -42,24 +87,12 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse const availableProducts = await getAvailableProducts(); - const report: any[] = []; + const result: any[] = []; + const allInvoices = await listAllInvoices(); for (const { id: workspaceId, obj } of allWorkspaces) { const { stripeCustomerId } = obj; - let starting_after: string | undefined = undefined; - const customerInvoices: Stripe.Invoice[] = []; - do { - const result = await stripe.invoices.list({ - limit: 100, - starting_after: starting_after, - customer: stripeCustomerId, - }); - starting_after = result?.data[result.data.length - 1]?.id; - if (result?.data) { - customerInvoices.push(...result?.data); - } - } while (starting_after); - const metricsTable = `${process.env.METRICS_SCHEMA || "bulker"}.bulker_metrics`; + const customerInvoices = allInvoices.filter(i => i.customer === stripeCustomerId); for (const invoice of customerInvoices) { if (!invoice.lines.data.length) { log.atWarn().log(`No lines found for invoice ${invoice.id}`); @@ -76,16 +109,47 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse log.atWarn().log(`No plan found for ${product} from invoice ${invoice.id}`); continue; } + log + .atInfo() + .log( + `Processing invoice ${invoice.id} for [${new Date(start).toISOString()}, ${new Date( + end + ).toISOString()}] workspace ${workspaceId}, plan ${plan.id}` + ); const { overagePricePer100k, destinationEvensPerMonth } = JSON.parse(plan.metadata.plan_data); - const sqlQuery = requireDefined(queries["destination-stat"], `destination-stat`)({ metricsTable }); const overagePricePerEvent = overagePricePer100k / 100_000; - - const data = await query(await pg(), sqlQuery, { workspaceId, granularity: "day", start, end }); - - const destinationEvents = data.reduce((acc, row) => acc + row.events, 0); + const invoiceStartRounded = round(start, "day").start; + const invoiceEndRounded = round(end, "day").end; + log.atInfo().log(`\t[${invoiceStartRounded}, ${invoiceEndRounded}]`); + let rows = report.filter(row => { + log.atInfo().log(JSON.stringify(row)); + const { start, end } = round(row.period, "day"); + let includes = + row.workspaceId === workspaceId && + Date.parse(start) >= Date.parse(invoiceStartRounded) && + Date.parse(end) <= Date.parse(invoiceEndRounded); + log.atInfo().log(includes + ":" + JSON.stringify({ start, end, invoiceStartRounded, invoiceEndRounded })); + return includes; + }); + log + .atInfo() + .log( + `Found ${rows.length} rows for ${workspaceId} for [${new Date(invoiceStartRounded).toISOString()}, ${new Date( + invoiceEndRounded + ).toISOString()}]: \n ${JSON.stringify(rows, null, 2)}}` + ); + const destinationEvents = rows.reduce((acc, row) => acc + row.events, 0); + log + .atInfo() + .log( + `Destination events for ${workspaceId} for [${new Date(invoiceStartRounded).toISOString()}, ${new Date( + invoiceEndRounded + ).toISOString()}] → ${destinationEvents}` + ); const overageFee = (Math.max(0, destinationEvents - destinationEvensPerMonth) / 100_000) * overagePricePer100k; const discountPercentage = invoice.discount ? invoice.discount.coupon.percent_off : undefined; - report.push({ + let overageFeeFinal = discountPercentage ? overageFee * (1 - discountPercentage / 100) : overageFee; + result.push({ month: start.toLocaleString("en-US", { month: "long", year: "numeric" }), baseInvoiceId: invoice.id, workspaceId, @@ -103,14 +167,14 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse discountPercentage, coupon: invoice.discount ? pick(invoice.discount.coupon, "id", "name") : undefined, couponName: invoice.discount ? invoice.discount.coupon.name : undefined, - overageFeeFinal: discountPercentage ? overageFee * (1 - discountPercentage / 100) : overageFee, + overageFeeFinal, }); } } return res.status(200).json({ stripeDataTable, - report, + result, }); }; diff --git a/webapps/ee-api/pages/api/report/workspace-stat.ts b/webapps/ee-api/pages/api/report/workspace-stat.ts new file mode 100644 index 000000000..f6a531628 --- /dev/null +++ b/webapps/ee-api/pages/api/report/workspace-stat.ts @@ -0,0 +1,181 @@ +import type { NextApiRequest, NextApiResponse } from "next"; +import { getLog, namedParameters, SqlQueryParameters, unrollParams } from "juava"; +import { withErrorHandler } from "../../../lib/error-handler"; +import { auth } from "../../../lib/auth"; +import { clickhouse, pg } from "../../../lib/services"; +import * as PG from "pg"; + +const log = getLog("/api/report"); + +const workspaceStatSql = require("../../../lib/sql/workspace-info.sql").default; + +export type ISODate = string; + +export type WorkspaceReportRow = { + period: ISODate; + workspaceId: string; + events: number; +}; + +export type ReportParams = { + workspaceId?: string; + start: ISODate; + end: ISODate; + granularity: "day"; +}; + +function removeUndefined(obj: Record): Record { + const res: Record = {}; + for (const [key, value] of Object.entries(obj)) { + if (value !== undefined) { + res[key] = value; + } + } + return res; +} + +function isoDateTOClickhouse(date: ISODate): string { + return date.replace("T", " ").replace("Z", "").split(".")[0]; +} + +async function getPostgresPart({ granularity, start, end, workspaceId }: ReportParams): Promise { + const sql = `select + obj."workspaceId" as "workspaceId", + date_trunc(:granularity, (m.timestamp::TIMESTAMPTZ)) as period, + sum(m.value) as events + from newjitsuee.bulker_metrics m + left join newjitsu."ConfigurationObjectLink" obj + on obj."id" = m."destinationId" + where m.metric_name = 'bulkerapp_ingest_messages' and m.status = 'success' and m.timestamp <= '2023-07-28T00:00:00Z' and ${ + workspaceId ? 'obj."workspaceId" = :workspaceId and' : "" + } date_trunc(:granularity, "timestamp") >= date_trunc(:granularity, :start::timestamp) and + date_trunc(:granularity, "timestamp") <= date_trunc(:granularity, :end::timestamp) + group by period, "workspaceId" + order by period, "workspaceId" desc;; + `; + const params = removeUndefined({ start, end, granularity, workspaceId }); + const { query, values } = namedParameters(sql, params); + return await pg() + .query({ text: query, values }) + .then(res => { + return res.rows; + }); +} + +async function getClickhousePart({ + granularity, + start, + end, + workspaceId, +}: ReportParams): Promise { + const query = `select + date_trunc('${granularity}', timestamp) as period, + workspaceId as "workspaceId", + uniqMerge(count) as events + from newjitsu_metrics.mv_active_incoming + where + timestamp >= toDateTime('2023-07-28 00:00:00', 'UTC') and + timestamp >= toDateTime({start :String}, 'UTC') and + timestamp <= toDateTime({end :String}, 'UTC') ${ + workspaceId ? "and workspaceId = {workspaceId:String}" : "" + } + group by period, workspaceId + order by period desc; + `; + const resultSet = await clickhouse().query({ + query, + clickhouse_settings: { + wait_end_of_query: 1, + }, + query_params: removeUndefined({ + start: isoDateTOClickhouse(start), + end: isoDateTOClickhouse(end), + granularity, + workspaceId, + }), + }); + + return ((await resultSet.json()) as any).data.map(({ events, period, ...rest }) => ({ + events: Number(events), + period: period.replace(" ", "T") + ".000Z", + ...rest, + })); +} + +function getDate(param: string | undefined, defaultVal?: string): Date { + return param ? new Date(param) : defaultVal ? new Date(defaultVal) : new Date(); +} + +export async function query(pg: PG.Pool, sql: string, params: SqlQueryParameters = []): Promise[]> { + const { query, values } = namedParameters(sql, params); + log.atInfo().log(`Querying: ${unrollParams(query, values)}`); + return await pg.query({ text: query, values }).then(res => { + return res.rows; + }); +} + +function minusDays(d, days) { + return new Date(d.getTime() - days * 24 * 60 * 60 * 1000); +} + +type WorkspaceInfo = { + id: string; + slug: string; + name: string; + domains?: string[]; +}; + +type ExtendedWorkspaceReportRow = WorkspaceReportRow & WorkspaceInfo; + +export async function buildWorkspaceReport( + start: string, + end: string, + granularity: "day", + workspaceId: string | undefined +): Promise { + const [pgRes, chRes] = await Promise.all([ + getPostgresPart({ start, end, granularity, workspaceId }), + getClickhousePart({ start, end, granularity, workspaceId }), + ]); + return [...pgRes.map(s => ({ ...s, src: "pg" })), ...chRes.map(s => ({ ...s, src: "ch" }))]; +} + +async function extend(reportResult: WorkspaceReportRow[]): Promise { + const workspaceInfo = await query(pg(), workspaceStatSql); + const workspaceInfoMap = workspaceInfo.reduce((acc, w) => { + acc[w.workspaceId] = w; + return acc; + }, {}); + log.atInfo().log(`Got workspace info: ${JSON.stringify(workspaceInfoMap)}`); + + return reportResult.map(r => ({ ...r, ...workspaceInfoMap[r.workspaceId] })); +} + +const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { + await clickhouse.waitInit(); + await pg.waitInit(); + + res.setHeader("Access-Control-Allow-Origin", req.headers.origin || "*"); + res.setHeader("Access-Control-Allow-Methods", "*"); + res.setHeader("Access-Control-Allow-Headers", "authorization, content-type, baggage, sentry-trace"); + if (req.method === "OPTIONS") { + //allowing requests from everywhere since our tokens are short-lived + //and can't be hijacked + res.status(200).end(); + return; + } + const claims = await auth(req, res); + if (!claims) { + res.status(401).end(); + return; + } + const workspaceId = claims.type === "user" ? claims.workspaceId : (req.query.workspaceId as string) || undefined; + const extended = req.query.extended === "true"; + const start = getDate(req.query.start as string, minusDays(new Date(), 32).toISOString()).toISOString(); + const end = getDate(req.query.end as string, new Date().toISOString()).toISOString(); + const granularity = "day"; // = ((req.query.granularity as string) || "day").toLowerCase(); + const reportResult = await buildWorkspaceReport(start, end, granularity, workspaceId); + res.send({ data: extended ? await extend(reportResult) : reportResult }); +}; + +export default withErrorHandler(handler); From 5dddf270644111da2c5e4490b36c0a885d349b0b Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 4 Aug 2023 20:07:17 +0400 Subject: [PATCH 0112/1353] hide test connection error field from destination form --- webapps/console/lib/useQueryStringState.ts | 2 +- .../pages/[workspaceId]/destinations.tsx | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/webapps/console/lib/useQueryStringState.ts b/webapps/console/lib/useQueryStringState.ts index fc50c9e64..3a8684c88 100644 --- a/webapps/console/lib/useQueryStringState.ts +++ b/webapps/console/lib/useQueryStringState.ts @@ -24,7 +24,7 @@ export function useQueryStringState( parser: (val: string) => val as T, serializer: (val: T) => (val || "").toString(), } -): [T, (val: T) => void] { +): [T, (val: T) => Promise] { const { push, query } = useRouter(); const initialValueStr = query[param] as string | undefined; const initialValue = initialValueStr diff --git a/webapps/console/pages/[workspaceId]/destinations.tsx b/webapps/console/pages/[workspaceId]/destinations.tsx index 76bba6dbf..d25cd18d8 100644 --- a/webapps/console/pages/[workspaceId]/destinations.tsx +++ b/webapps/console/pages/[workspaceId]/destinations.tsx @@ -37,6 +37,7 @@ import { ObjectTitle } from "../../components/ObjectTitle/ObjectTitle"; import { useQueryStringState } from "../../lib/useQueryStringState"; import { CustomWidgetProps } from "../../components/ConfigObjectEditor/Editors"; import { Htmlizer } from "../../components/Htmlizer/Htmlizer"; +import omit from "lodash/omit"; const log = getLog("destinations"); const Loader: React.FC<{}> = () => { @@ -606,7 +607,7 @@ const DestinationsList: React.FC<{ type?: string }> = ({ type }) => { }, onTest: async obj => { try { - const res = await getConfigApi(workspace.id, obj.type).test(obj); + const res = await getConfigApi(workspace.id, obj.type).test(omit(obj, "testConnectionError")); return res.ok ? { ok: true } : { ok: false, error: res?.error || res?.message || "unknown error" }; } catch (error) { log @@ -629,6 +630,7 @@ const DestinationsList: React.FC<{ type?: string }> = ({ type }) => { destinationType: { hidden: true }, workspaceId: { constant: workspace.id }, provisioned: { hidden: true }, + testConnectionError: { hidden: true }, ...extraFields, }, noun: "destination", @@ -670,19 +672,18 @@ const DestinationsList: React.FC<{ type?: string }> = ({ type }) => { footer={null} > { + onClick={async destination => { const url = `/${ workspace.id }/destinations?id=new&destinationType=${destination}&backTo=${encodeURIComponent( (router.query.backTo ?? "") as string )}`; - router.push(url); - setShowCatalog(false); + setShowCatalog(false).then(() => router.push(url)); }} - dismiss={() => { - setShowCatalog(false); - router.push(`/${workspace.slugOrId}${router.query.backTo || "/destinations"}`); - setRefresh(new Date()); + dismiss={async () => { + await setShowCatalog(false) + .then(() => router.push(`/${workspace.slugOrId}${router.query.backTo || "/destinations"}`)) + .then(() => setRefresh(new Date())); }} /> From 75d25997b7d0b72cd803f560ec070910f111ef48 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Sat, 5 Aug 2023 14:33:04 +0400 Subject: [PATCH 0113/1353] fix: billing alert view --- webapps/console/components/PageLayout/WorkspacePageLayout.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index 05bb1e497..529c2b871 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -377,7 +377,7 @@ const AlertView: React.FC> = ({ children }) => { return (
    From 0807282f3a8e225312df4f9ebde0758e937bb834 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Sat, 5 Aug 2023 17:10:52 +0400 Subject: [PATCH 0114/1353] fix: billing alert view + other cosmetic fixes --- libs/juava/src/security.ts | 2 +- .../components/Billing/BillingManager.tsx | 2 +- .../PageLayout/WorkspacePageLayout.tsx | 30 ++++++++++++++----- .../pages/[workspaceId]/settings/index.tsx | 2 +- webapps/ee-api/pages/api/report/overage.ts | 2 -- 5 files changed, 25 insertions(+), 13 deletions(-) diff --git a/libs/juava/src/security.ts b/libs/juava/src/security.ts index 8505cca10..b9eaf99ce 100644 --- a/libs/juava/src/security.ts +++ b/libs/juava/src/security.ts @@ -35,7 +35,7 @@ export function isValidSecret(secret: string): boolean { export type Authorizer = (secret: string) => boolean; /** - * Creates an authorizer agains a string that contains a comma separated list of + * Creates an authorizer against a string that contains a comma separated list of * tokens. Each token can be a plain string or a hash of a string. The hash is * something that contains '.'. */ diff --git a/webapps/console/components/Billing/BillingManager.tsx b/webapps/console/components/Billing/BillingManager.tsx index 63ea0627e..eaa85c744 100644 --- a/webapps/console/components/Billing/BillingManager.tsx +++ b/webapps/console/components/Billing/BillingManager.tsx @@ -179,7 +179,7 @@ const CurrentSubscription: React.FC<{}> = () => { className="flex items-center" href={`/api/${workspace.id}/ee/billing/manage?returnUrl=${encodeURIComponent(window.location.href)}`} > - Manage subscription + Manage subscription / download invoices )} diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index 529c2b871..0c4cafd29 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -371,21 +371,35 @@ const UserProfileButton: React.FC<{}> = () => { const AlertView: React.FC> = ({ children }) => { const [show, setShow] = useState(false); + const workspaceAlertHiddenAt = "workspaceAlertHiddenAt"; useEffect(() => { - setTimeout(() => setShow(true), 1); // Set a delay of 1 second before showing the alert. + const hiddenAt = localStorage.getItem(workspaceAlertHiddenAt); + const hideAlertSeconds = 60 * 60; // 1 hour + if (!hiddenAt || new Date().getTime() - new Date(hiddenAt).getTime() > 1000 * hideAlertSeconds) { + setTimeout(() => setShow(true), 1); // show after 1ms to avoid SSR issues and enable animation + } }, []); return (
    - -
    {children}
    -
    - +
    + +
    {children}
    +
    + +
    ); diff --git a/webapps/console/pages/[workspaceId]/settings/index.tsx b/webapps/console/pages/[workspaceId]/settings/index.tsx index cdd3db541..d2c7c6818 100644 --- a/webapps/console/pages/[workspaceId]/settings/index.tsx +++ b/webapps/console/pages/[workspaceId]/settings/index.tsx @@ -246,7 +246,7 @@ const WorkspaceSettingsComponent: React.FC = () => { size="large" type="primary" > - Manage Billing {"&"} Plan / Download Invoices + Manage Billing {"&"} Plan
    diff --git a/webapps/ee-api/pages/api/report/overage.ts b/webapps/ee-api/pages/api/report/overage.ts index edc6e8a8d..0931e9479 100644 --- a/webapps/ee-api/pages/api/report/overage.ts +++ b/webapps/ee-api/pages/api/report/overage.ts @@ -74,8 +74,6 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse workspaceId ); - log.atInfo().log("Report", JSON.stringify(report, null, 2)); - const allWorkspaces = workspaceId ? [ { From 829f74bd1361a99866f5f403002e07327d60ed67 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 7 Aug 2023 12:41:33 +0400 Subject: [PATCH 0115/1353] Sync Streams Editor refactoring and fixes --- pnpm-lock.yaml | 10 +- .../ConfigObjectEditor/EditorButtons.tsx | 3 +- .../LabelEllipsis/LabelEllipsis.tsx | 9 +- .../ServiceEditor/ServiceEditor.tsx | 31 +- .../SyncEditorPage/SyncEditorPage.tsx | 374 ++++++++++++++---- webapps/console/lib/api.ts | 3 +- webapps/console/lib/schema/index.ts | 2 +- webapps/console/lib/server/oauth/services.ts | 2 +- webapps/console/lib/ui.tsx | 4 +- webapps/console/package.json | 2 +- .../console/pages/[workspaceId]/services.tsx | 15 +- .../pages/api/[workspaceId]/sources/check.ts | 1 - .../api/[workspaceId]/sources/discover.ts | 36 +- .../pages/api/[workspaceId]/sources/run.ts | 44 ++- webapps/console/pages/api/oauth/service.ts | 6 +- webapps/console/prisma/schema.prisma | 55 ++- 16 files changed, 421 insertions(+), 176 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b68f0ef1d..2083715e6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -662,8 +662,8 @@ importers: specifier: 3.21.4 version: 3.21.4 zod-to-json-schema: - specifier: 3.20.4 - version: 3.20.4(zod@3.21.4) + specifier: 3.21.4 + version: 3.21.4(zod@3.21.4) devDependencies: '@ant-design/icons': specifier: ^5.0.1 @@ -26539,10 +26539,10 @@ packages: zod: 3.21.4 dev: true - /zod-to-json-schema@3.20.4(zod@3.21.4): - resolution: {integrity: sha512-Un9+kInJ2Zt63n6Z7mLqBifzzPcOyX+b+Exuzf7L1+xqck9Q2EPByyTRduV3kmSPaXaRer1JCsucubpgL1fipg==} + /zod-to-json-schema@3.21.4(zod@3.21.4): + resolution: {integrity: sha512-fjUZh4nQ1s6HMccgIeE0VP4QG/YRGPmyjO9sAh890aQKPEk3nqbfUXhMFaC+Dr5KvYBm8BCyvfpZf2jY9aGSsw==} peerDependencies: - zod: ^3.20.0 + zod: ^3.21.4 dependencies: zod: 3.21.4 dev: false diff --git a/webapps/console/components/ConfigObjectEditor/EditorButtons.tsx b/webapps/console/components/ConfigObjectEditor/EditorButtons.tsx index 405448b4c..d6ebec99b 100644 --- a/webapps/console/components/ConfigObjectEditor/EditorButtons.tsx +++ b/webapps/console/components/ConfigObjectEditor/EditorButtons.tsx @@ -66,7 +66,7 @@ export const EditorButtons: React.FC = ({ return ( <> - {testStatus && testStatus !== "success" && testStatus !== "pending" && ( + {!loading && testStatus && testStatus !== "success" && testStatus !== "pending" && ( = ({ closable /> )} + {loading && onTest && }
    {!isNew && ( diff --git a/webapps/console/components/LabelEllipsis/LabelEllipsis.tsx b/webapps/console/components/LabelEllipsis/LabelEllipsis.tsx index b82537357..b09290861 100644 --- a/webapps/console/components/LabelEllipsis/LabelEllipsis.tsx +++ b/webapps/console/components/LabelEllipsis/LabelEllipsis.tsx @@ -5,15 +5,18 @@ export type LabelEllipsisProps = { maxLen: number; trim?: "middle" | "end"; children: string; + className?: string; }; -export function LabelEllipsis({ maxLen, children, trim = "middle" }: LabelEllipsisProps) { +export function LabelEllipsis({ maxLen, children, trim = "middle", className }: LabelEllipsisProps) { if (children.length <= maxLen) { - return <>{children}; + return {children}; } else { return ( - {trim === "middle" ? trimMiddle(children, maxLen) : trimEnd(children, maxLen)} + + {trim === "middle" ? trimMiddle(children, maxLen) : trimEnd(children, maxLen)} + ); } diff --git a/webapps/console/components/ServiceEditor/ServiceEditor.tsx b/webapps/console/components/ServiceEditor/ServiceEditor.tsx index 5243d5fa8..12e7c8f62 100644 --- a/webapps/console/components/ServiceEditor/ServiceEditor.tsx +++ b/webapps/console/components/ServiceEditor/ServiceEditor.tsx @@ -1,6 +1,6 @@ import { EditorComponentProps } from "../ConfigObjectEditor/ConfigEditor"; import React, { useCallback, useEffect, useMemo, useState } from "react"; -import { getErrorMessage, getLog, rpc } from "juava"; +import { getErrorMessage, getLog, hash as juavaHash, rpc } from "juava"; import { EditorTitle } from "../ConfigObjectEditor/EditorTitle"; import { EditorBase } from "../ConfigObjectEditor/EditorBase"; import { LoadingAnimation } from "../GlobalLoader/GlobalLoader"; @@ -23,6 +23,7 @@ import unset from "lodash/unset"; import { SchemaForm } from "../ConfigObjectEditor/SchemaForm"; import { TextEditor } from "../ConfigObjectEditor/Editors"; import { useAntdModal } from "../../lib/modal"; +import hash from "stable-hash"; type ServiceEditorProps = {} & EditorComponentProps; @@ -43,13 +44,12 @@ export const ServiceEditor: React.FC = props => { const [obj, setObj] = useState>({ ...props.object, }); - const [credentials, setCredentials] = useState(obj.credentials ? JSON.parse(obj.credentials) : {}); + const [credentials, setCredentials] = useState(obj.credentials || {}); const [isTouched, setIsTouched] = useState(false); const [showErrors, setShowErrors] = useState(false); const [loading, setLoading] = useState(false); const [nangoLoading, setNangoLoading] = useState(false); const [nangoError, setNangoError] = useState(undefined); - const [credUserProvided, setCredUserProvided] = useState(!!obj.credentials && obj.credentials !== "{}"); const [loadingSpecs, setLoadingSpecs] = useState(true); const [specs, setSpecs] = useState(undefined); @@ -84,9 +84,6 @@ export const ServiceEditor: React.FC = props => { if (firstRes.ok) { console.log("Loaded cached specs:", JSON.stringify(firstRes, null, 2)); setSpecs(firstRes.specs); - if (!credUserProvided) { - change("credentials", JSON.stringify(firstRes.fakeJson, null, 2)); - } } else if (firstRes.error) { feedbackError(`Cannot load specs for ${obj.package}:${obj.version} error: ${firstRes.error}`); return; @@ -103,9 +100,6 @@ export const ServiceEditor: React.FC = props => { } else { console.log("Loaded specs:", JSON.stringify(resp, null, 2)); setSpecs(resp.specs); - if (!credUserProvided) { - change("credentials", JSON.stringify(resp.fakeJson, null, 2)); - } return; } } @@ -118,7 +112,7 @@ export const ServiceEditor: React.FC = props => { setLoadingSpecs(false); } })(); - }, [workspace.id, credUserProvided, obj.package, obj.version, change, specs]); + }, [workspace.id, obj.package, obj.version, change, specs]); const validate = useCallback(() => { const errors: string[] = []; @@ -165,8 +159,16 @@ export const ServiceEditor: React.FC = props => { const save = useCallback(async () => { setLoading(true); async function _save(testConnectionError?: string) { - obj.credentials = JSON.stringify(credentials); + obj.credentials = credentials; obj.testConnectionError = testConnectionError; + const storageKey = `${workspace.id}_${obj.id}_${juavaHash("md5", hash(credentials))}`; + // trigger loading catalog in background (k8s) + await rpc( + `/api/${workspace.id}/sources/discover?package=${obj.package}&version=${obj.version}&storageKey=${storageKey}`, + { + body: obj, + } + ); if (props.isNew) { await getConfigApi(workspace.id, "service").create(obj); } else if (obj.id) { @@ -180,7 +182,7 @@ export const ServiceEditor: React.FC = props => { if (!validate()) { return; } - const testRes = await onTest!({ ...obj, credentials: JSON.stringify(credentials) }); + const testRes = await onTest!({ ...obj, credentials: credentials }); if (!testRes.ok) { modal.confirm({ title: "Connection test failed", @@ -233,9 +235,8 @@ export const ServiceEditor: React.FC = props => { .auth(oauthConnector.nangoIntegrationId ?? "", `sync-source.${obj?.id}`) .then(result => { const strippedSchema = oauthConnector.stripSchema(credentials || {}); - setObj({ ...obj, credentials: JSON.stringify(strippedSchema), authorized: true }); + setObj({ ...obj, credentials: strippedSchema, authorized: true }); setCredentials(strippedSchema); - setCredUserProvided(true); setNangoError(undefined); }) .catch(err => { @@ -348,7 +349,7 @@ export const ServiceEditor: React.FC = props => { if (!validate()) { return Promise.resolve({ ok: false, error: "Config validation failed" }); } - return onTest!({ ...obj, credentials: JSON.stringify(credentials) }); + return onTest!({ ...obj, credentials: credentials }); }} /> diff --git a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx index 0ed39609a..dc627147e 100644 --- a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx +++ b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx @@ -7,9 +7,7 @@ import { ConfigurationObjectLinkDbModel } from "../../prisma/schema"; import { useRouter } from "next/router"; import { assertTrue, getLog, hash as juavaHash, rpc } from "juava"; import { Disable } from "../Disable/Disable"; -import { Button, Select } from "antd"; -import { WLink } from "../Workspace/WLink"; -import { FaExternalLinkAlt } from "react-icons/fa"; +import { Button, Select, Switch, Tooltip } from "antd"; import { getCoreDestinationType } from "../../lib/schema/destinations"; import { confirmOp, feedbackError, feedbackSuccess } from "../../lib/ui"; import FieldListEditorLayout, { EditorItem } from "../FieldListEditorLayout/FieldListEditorLayout"; @@ -17,9 +15,13 @@ import { ChevronLeft } from "lucide-react"; import { JitsuButton } from "../JitsuButton/JitsuButton"; import { LoadingAnimation } from "../GlobalLoader/GlobalLoader"; import hash from "stable-hash"; -import { CodeEditor } from "../CodeEditor/CodeEditor"; import { DestinationTitle } from "../../pages/[workspaceId]/destinations"; import { ServiceTitle } from "../../pages/[workspaceId]/services"; +import { SwitchComponent } from "../ConnectionEditorPage/ConnectionEditorPage"; +import { ErrorCard } from "../GlobalError/GlobalError"; +import { LabelEllipsis } from "../LabelEllipsis/LabelEllipsis"; +import { createDisplayName } from "../../lib/zod"; +import xor from "lodash/xor"; const log = getLog("SyncEditorPage"); @@ -30,7 +32,17 @@ type SelectorProps = { onSelect: (value: string) => void; }; -type SyncOptionsType = any; +type SyncOptionsType = { + storageKey?: string; + streams?: SelectedStreams; +}; + +type SelectedStreamSettings = { + sync_mode: "full_refresh" | "incremental"; + cursor_field?: string[]; +}; + +type SelectedStreams = Record; function DestinationSelector(props: SelectorProps) { return ( @@ -61,18 +73,18 @@ function DestinationSelector(props: SelectorProps) { })} - {!props.enabled && ( -
    - - - -
    - )} + {/*{!props.enabled && (*/} + {/*
    */} + {/* */} + {/* */} + {/* */} + {/*
    */} + {/*)}*/}
    ); } -function ServiceSelector(props: SelectorProps) { +function ServiceSelector(props: SelectorProps & { refreshCatalogCb?: () => void }) { return (
    @@ -95,12 +107,17 @@ function ServiceSelector(props: SelectorProps) { ))} - {!props.enabled && ( -
    - - - -
    + {props.refreshCatalogCb && ( + )}
    ); @@ -128,35 +145,139 @@ function SyncEditor({ const service = services.find(s => s.id === srvId); - const [syncOptions, setSyncOptions] = useState(existingLink?.data || {}); - const [streamsProvided, setStreamsProvided] = useState(!!syncOptions.streams && syncOptions.streams !== "{}"); - const [loadingCatalog, setLoadingCatalog] = useState(false); + const [syncOptions, setSyncOptions] = useState(existingLink?.data as SyncOptionsType); + const [catalog, setCatalog] = useState(undefined); + const [catalogError, setCatalogError] = useState(undefined); + const [loadingCatalog, setLoadingCatalog] = useState(true); + const [refreshCatalog, setRefreshCatalog] = useState(0); - const updateOptions: (patch: Partial) => void = useCallback( - patch => { - log.atDebug().log("Patching sync options with", patch, " existing options", syncOptions); + const updateOptions = useCallback( + (patch: Partial) => { + log.atInfo().log("Patching sync options with", patch, " existing options", syncOptions); setSyncOptions({ ...syncOptions, ...patch }); }, [syncOptions] ); - const updateCatalog: (catalog: any) => void = useCallback( - catalog => { - if (!streamsProvided) { - updateOptions({ streams: catalog }); - setStreamsProvided(true); + const updateSelectedStream = useCallback( + (streamName: string, propName: K, value: SelectedStreamSettings[K]) => { + if (syncOptions) { + setSyncOptions({ + ...syncOptions, + streams: { + ...syncOptions.streams, + [streamName]: { ...syncOptions.streams?.[streamName], [propName]: value } as SelectedStreamSettings, + }, + }); } }, - [updateOptions, streamsProvided] + [syncOptions] + ); + + const deleteSelectedStream = useCallback( + (streamName: string) => { + if (syncOptions) { + const streams = { ...syncOptions.streams }; + delete streams[streamName]; + setSyncOptions({ + ...syncOptions, + streams: streams, + }); + } + }, + [syncOptions] ); + const addStream = useCallback( + (streamName: string) => { + if (syncOptions) { + const stream = catalog.streams.find((s: any) => + streamName === s.namespace ? s.namespace + "." + s.name : s.name + ); + if (!stream) { + log.atError().log("Stream not found in catalog", streamName); + return; + } + const initedStream = initStream(stream); + setSyncOptions({ + ...syncOptions, + streams: { + ...syncOptions.streams, + [streamName]: initedStream, + }, + }); + } + }, + [syncOptions, catalog] + ); + + const initStream = (stream: any): SelectedStreamSettings => { + const supportedModes = stream.supported_sync_modes; + let sync_mode: "full_refresh" | "incremental" = "full_refresh"; + let cursor_field: string[] | undefined = undefined; + if (supportedModes.includes("incremental")) { + if (stream.source_defined_cursor) { + sync_mode = "incremental"; + } + if (stream.default_cursor_field?.length > 0) { + sync_mode = "incremental"; + cursor_field = stream.default_cursor_field; + } else { + const props = Object.entries(stream.json_schema.properties as Record); + const dateProps = props.filter(([_, p]) => p.format === "date-time"); + const cursorField = + dateProps.find(([name, _]) => name.startsWith("updated")) || + dateProps.find(([name, _]) => name.startsWith("created")) || + dateProps.find(([name, _]) => name === "timestamp") || + props.find( + ([name, p]) => + name === "id" && (p.type === "integer" || (Array.isArray(p.type) && p.type.includes("integer"))) + ); + if (cursorField) { + sync_mode = "incremental"; + cursor_field = [cursorField[0]]; + } + } + } + return { + sync_mode, + cursor_field, + }; + }; + + const initSyncOptions = useCallback( + (storageKey: string, catalog: any, force?: boolean) => { + const streams: SelectedStreams = {}; + const currentStreams = force ? {} : syncOptions?.streams || {}; + for (const stream of catalog.streams) { + const name = stream.namespace ? `${stream.namespace}.${stream.name}` : stream.name; + streams[name] = currentStreams[name] || initStream(stream); + } + if (xor(Object.keys(streams), Object.keys(currentStreams)).length > 0) { + updateOptions({ streams, storageKey }); + } + }, + [syncOptions?.streams, updateOptions] + ); + + const deleteAllStreams = useCallback(() => { + if (syncOptions) { + setSyncOptions({ ...syncOptions, streams: {} }); + } + }, [syncOptions]); + + const addAllStreams = useCallback(() => { + if (syncOptions?.storageKey && catalog) { + initSyncOptions(syncOptions?.storageKey, catalog, true); + } + }, [initSyncOptions, catalog, syncOptions?.storageKey]); + useEffect(() => { if (!service) { console.log("No service."); return; } - if (streamsProvided) { - console.log("No need to load catalog. Specs are already filled."); + if (catalog) { return; } let cancelled = false; @@ -164,10 +285,13 @@ function SyncEditor({ console.log("Loading catalog for:", service.package, service.version); setLoadingCatalog(true); try { - const h = juavaHash("md5", hash(JSON.parse(service.credentials))); + const force = refreshCatalog > 0; + const h = juavaHash("md5", hash(service.credentials)); const storageKey = `${workspace.id}_${service.id}_${h}`; const firstRes = await rpc( - `/api/${workspace.id}/sources/discover?package=${service.package}&version=${service.version}&storageKey=${storageKey}`, + `/api/${workspace.id}/sources/discover?package=${service.package}&version=${ + service.version + }&storageKey=${storageKey}${force ? "&refresh=true" : ""}`, { body: service, } @@ -176,10 +300,11 @@ function SyncEditor({ return; } if (firstRes.error) { - updateCatalog(firstRes.error); + setCatalogError(firstRes.error); } else if (firstRes.ok) { console.log("Loaded cached catalog:", JSON.stringify(firstRes, null, 2)); - updateCatalog(JSON.stringify(firstRes.catalog, null, 2)); + setCatalog(firstRes.catalog); + initSyncOptions(storageKey, firstRes.catalog); } else { for (let i = 0; i < 60; i++) { if (cancelled) { @@ -191,19 +316,20 @@ function SyncEditor({ ); if (!resp.pending) { if (resp.error) { - updateCatalog(resp.error); + setCatalogError(resp.error); return; } else { console.log("Loaded catalog:", JSON.stringify(resp, null, 2)); - updateCatalog(JSON.stringify(resp.catalog, null, 2)); + setCatalog(resp.catalog); + initSyncOptions(storageKey, resp.catalog); return; } } } - updateCatalog(`Cannot load catalog for ${service.package}:${service.version} error: Timeout`); + setCatalogError(`Cannot load catalog for ${service.package}:${service.version} error: Timeout`); } } catch (error) { - updateCatalog(error); + setCatalogError(error); } finally { if (!cancelled) { setLoadingCatalog(false); @@ -213,7 +339,7 @@ function SyncEditor({ return () => { cancelled = true; }; - }, [workspace.id, service, updateOptions, updateCatalog, streamsProvided]); + }, [workspace.id, service, initSyncOptions, updateOptions, refreshCatalog, catalog]); const configItems: EditorItem[] = [ { @@ -225,9 +351,16 @@ function SyncEditor({ selected={srvId} enabled={!existingLink} onSelect={v => { + setLoadingCatalog(true); setSrvId(v); - updateOptions({ streams: "{}" }); - setStreamsProvided(false); + setRefreshCatalog(0); + setCatalog(undefined); + updateOptions({ streams: undefined }); + }} + refreshCatalogCb={() => { + setLoadingCatalog(true); + setCatalog(undefined); + setRefreshCatalog(refreshCatalog + 1); }} /> ), @@ -250,51 +383,109 @@ function SyncEditor({ }, ]; if (service) { - configItems.push({ - name: "Selected Streams", - component: ( - <> - {loadingCatalog ? ( + if (loadingCatalog) { + configItems.push({ + group: "Streams", + key: "streams", + component: ( + <> - ) : ( -
    - -
    - { - updateOptions({ streams }); - }} - height={"382px"} - language={"json"} - foldLevel={5} - monacoOptions={{ - folding: true, - foldingHighlight: false, - showFoldingControls: "always", - }} + + ), + }); + } else if (catalog) { + for (const stream of catalog.streams ?? []) { + const name = stream.namespace ? `${stream.namespace}.${stream.name}` : stream.name; + const syncModeOptions = stream.supported_sync_modes.map(m => ({ + value: m, + label: createDisplayName(m), + })); + let cursorFieldOptions: { value: string[]; label: string }[] = []; + if (stream.supported_sync_modes.includes("incremental") && !stream.source_defined_cursor) { + const props = Object.entries(stream.json_schema.properties as Record); + cursorFieldOptions = props + .filter( + ([_, p]) => + p.format === "date-time" || + p.type === "integer" || + (Array.isArray(p.type) && p.type.includes("integer")) + ) + .map(([name, _]) => ({ value: [name], label: name })); + } + + configItems.push({ + group: "Streams", + key: name, + name: ( + + {name} + + ), + component: ( +
    +
    + Mode:{" "} + updateSelectedStream(name, "cursor_field", v)} + /> + + + )} +
    + { + if (enabled) { + addStream(name); + } else { + deleteSelectedStream(name); + } + }} + />
    - )} - - ), - }); + ), + }); + } + } else { + configItems.push({ + group: "Streams", + key: "streams", + component: ( +
    + +
    + ), + }); + } } return (
    @@ -307,8 +498,27 @@ function SyncEditor({
    +
    Streams
    +
    + Switch All + 0} + onChange={ch => { + if (ch) { + addAllStreams(); + } else { + deleteAllStreams(); + } + }} + /> +
    +
    + ), + }, }} items={configItems} /> diff --git a/webapps/console/lib/api.ts b/webapps/console/lib/api.ts index ba05b985e..94523c1cc 100644 --- a/webapps/console/lib/api.ts +++ b/webapps/console/lib/api.ts @@ -141,8 +141,7 @@ export function nextJsApiHandler(api: Api): NextApiHandler { } let body = undefined; if (req.body && handler.types?.body) { - const parseResult = safeParseWithDate( - handler.types?.body, + const parseResult = handler.types?.body.safeParse( req.body ? prepareZodObjectForDeserialization(parseIfNeeded(req.body)) : undefined ); diff --git a/webapps/console/lib/schema/index.ts b/webapps/console/lib/schema/index.ts index 3f8226bb1..22973f4ed 100644 --- a/webapps/console/lib/schema/index.ts +++ b/webapps/console/lib/schema/index.ts @@ -131,7 +131,7 @@ export const ServiceConfig = ConfigEntityBase.merge( authorized: z.boolean().optional(), package: z.string(), version: z.string(), - credentials: z.string(), + credentials: z.object({}).passthrough(), testConnectionError: z.string().optional(), }) ); diff --git a/webapps/console/lib/server/oauth/services.ts b/webapps/console/lib/server/oauth/services.ts index 0d7095ecc..c59a76292 100644 --- a/webapps/console/lib/server/oauth/services.ts +++ b/webapps/console/lib/server/oauth/services.ts @@ -26,7 +26,7 @@ export const tryManageOauthCreds = async (service: ServiceConfig, req: NextApiRe } ); } else { - return JSON.parse(service.credentials); + return service.credentials; } }; diff --git a/webapps/console/lib/ui.tsx b/webapps/console/lib/ui.tsx index c090a3cde..e065eb513 100644 --- a/webapps/console/lib/ui.tsx +++ b/webapps/console/lib/ui.tsx @@ -88,7 +88,7 @@ export const serialization = { export function useURLPersistedState( paramName: string, opts: Serialization & { defaultVal?: T; type?: Serialization } = { type: serialization.json } -): [T, (val: T) => void] { +): [T, (val: T) => Promise] { const router = useRouter(); const parser = opts.parser || opts.type?.parser || serialization.json.parser; const serializer = opts?.serializer || opts.type?.serializer || serialization.json.serializer; @@ -98,7 +98,7 @@ export function useURLPersistedState( const setPersistedValue = val => { setValue(val); - router.replace({ + return router.replace({ pathname: router.pathname, query: { ...(router.query || {}), [paramName]: serializer(val) }, }); diff --git a/webapps/console/package.json b/webapps/console/package.json index b99e3da4c..685ddd21f 100644 --- a/webapps/console/package.json +++ b/webapps/console/package.json @@ -84,7 +84,7 @@ "stopwatch-node": "^1.1.0", "tslib": "^2.4.0", "zod": "3.21.4", - "zod-to-json-schema": "3.20.4" + "zod-to-json-schema": "3.21.4" }, "devDependencies": { "@ant-design/icons": "^5.0.1", diff --git a/webapps/console/pages/[workspaceId]/services.tsx b/webapps/console/pages/[workspaceId]/services.tsx index f9c5afdf9..d1668285d 100644 --- a/webapps/console/pages/[workspaceId]/services.tsx +++ b/webapps/console/pages/[workspaceId]/services.tsx @@ -14,6 +14,7 @@ import { ServiceEditor } from "../../components/ServiceEditor/ServiceEditor"; import { ErrorCard } from "../../components/GlobalError/GlobalError"; import { syncError } from "../../lib/shared/errors"; import { ObjectTitle } from "../../components/ObjectTitle/ObjectTitle"; +import omit from "lodash/omit"; const log = getLog("services"); @@ -130,11 +131,12 @@ const ServicesList: React.FC<{}> = () => { try { //hash object to avoid sending credentials to the server const queryId = randomId(); - const h = jhash("md5", hash(JSON.parse(obj.credentials))); + const h = jhash("md5", hash(obj.credentials)); + const storageKey = `${workspace.id}_${obj.id}_${h}_${queryId}`; const res = await rpc(`/api/${workspace.id}/sources/check?storageKey=${storageKey}`, { method: "POST", - body: obj, + body: omit(obj, "testConnectionError"), }); if (res.error) { return res; @@ -186,11 +188,12 @@ const ServicesList: React.FC<{}> = () => { footer={null} > { - router.push( - `/${workspace.id}/services?id=new&packageType=${packageType}&packageId=${encodeURIComponent(packageId)}` + onClick={async (packageType, packageId) => { + await setShowCatalog(false).then(() => + router.push( + `/${workspace.id}/services?id=new&packageType=${packageType}&packageId=${encodeURIComponent(packageId)}` + ) ); - setShowCatalog(false); }} /> diff --git a/webapps/console/pages/api/[workspaceId]/sources/check.ts b/webapps/console/pages/api/[workspaceId]/sources/check.ts index fb3cf363f..c5b7a7081 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/check.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/check.ts @@ -40,7 +40,6 @@ export default createRoute() if (syncAuthKey) { authHeaders["Authorization"] = `Bearer ${syncAuthKey}`; } - const config = await tryManageOauthCreds(body as ServiceConfig, req); try { diff --git a/webapps/console/pages/api/[workspaceId]/sources/discover.ts b/webapps/console/pages/api/[workspaceId]/sources/discover.ts index 44f9134b5..2a9c39fd5 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/discover.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/discover.ts @@ -23,7 +23,7 @@ const queryType = z.object({ storageKey: z.string(), }); -type queryType = z.infer; +type catalogKeyType = z.infer; export default createRoute() .POST({ @@ -31,7 +31,7 @@ export default createRoute() query: z.object({ workspaceId: z.string(), storageKey: z.string(), - refresh: z.boolean().optional(), + refresh: z.string().optional(), }), body: ServiceConfig, result: resultType, @@ -54,13 +54,13 @@ export default createRoute() } try { - if (!query.refresh) { - const res = await checkInDb({ ...query, package: body.package, version: body.version }); - if (res && !res.error) { - return res; + if (query.refresh !== "true") { + const discoverDbRes = await catalogFromDb({ ...query, package: body.package, version: body.version }); + if (discoverDbRes && !discoverDbRes.error) { + return discoverDbRes; } } - const checkRes = await rpc(syncURL + "/discover", { + const discoverQueryRes = await rpc(syncURL + "/discover", { method: "POST", body: { config: await tryManageOauthCreds(body as ServiceConfig, req), @@ -75,8 +75,8 @@ export default createRoute() storageKey: query.storageKey, }, }); - if (!checkRes.ok) { - return { ok: false, error: checkRes.error ?? "unknown error" }; + if (!discoverQueryRes.ok) { + return { ok: false, error: discoverQueryRes.error ?? "unknown error" }; } else { return { ok: false, pending: true }; } @@ -102,7 +102,7 @@ export default createRoute() return { ok: false, error: "storageKey doesn't belong to the current workspace" }; } try { - const res = await checkInDb(query); + const res = await catalogFromDb(query); if (res) { return res; } else { @@ -120,7 +120,7 @@ export default createRoute() }) .toNextApiHandler(); -async function checkInDb(query: queryType) { +async function catalogFromDb(query: Omit) { const res = await db .pgPool() .query(`select catalog, status, description from source_catalog where key = $1 and package = $2 and version = $3`, [ @@ -134,7 +134,7 @@ async function checkInDb(query: queryType) { const description = res.rows[0].description; switch (status) { case "SUCCESS": - return { ok: true, catalog: selectStreamsFromCatalog(catalog) }; + return { ok: true, catalog: catalog }; case "RUNNING": return { ok: false, pending: true }; default: @@ -144,15 +144,3 @@ async function checkInDb(query: queryType) { return null; } } - -function selectStreamsFromCatalog(catalog: any): any { - let streams: any[] = []; - for (const stream of catalog.streams) { - streams.push({ - sync_mode: stream.supported_sync_modes[0], - destination_sync_mode: "overwrite", - stream: { ...stream }, - }); - } - return { streams }; -} diff --git a/webapps/console/pages/api/[workspaceId]/sources/run.ts b/webapps/console/pages/api/[workspaceId]/sources/run.ts index db6a836ee..ae7af01e2 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/run.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/run.ts @@ -148,6 +148,19 @@ export default createRoute() } } + const catalog = await catalogFromDb( + (service.config as any).package, + (service.config as any).version, + (sync.data as any).storageKey + ); + if (!catalog) { + return { + ok: false, + error: `Catalog not found. Please run Refresh Catalog in Sync settings`, + }; + } + const configuredCatalog = selectStreamsFromCatalog(catalog, (sync.data as any).streams); + const taskId = randomUUID(); const res = await rpc(syncURL + "/read", { method: "POST", @@ -163,7 +176,7 @@ export default createRoute() }, body: { config: await tryManageOauthCreds({ ...(service.config as ServiceConfig), id: sync.fromId }, req), - catalog: JSON.parse((sync.data as any).streams), + catalog: configuredCatalog, ...(stateObj ? { state: stateObj } : {}), }, }); @@ -186,3 +199,32 @@ export default createRoute() } }) .toNextApiHandler(); + +async function catalogFromDb(packageName: string, version: string, storageKey: string) { + const res = await db + .pgPool() + .query(`select catalog from source_catalog where key = $1 and package = $2 and version = $3`, [ + storageKey, + packageName, + version, + ]); + if (res.rowCount === 1) { + return res.rows[0].catalog; + } else { + return null; + } +} + +function selectStreamsFromCatalog(catalog: any, selectedStreams: any): any { + const streams = catalog.streams + .filter((s: any) => !!selectedStreams[s.namespace ? s.namespace + "." + s.name : s.name]) + .map((s: any) => { + const stream = selectedStreams[s.namespace ? s.namespace + "." + s.name : s.name]; + return { + ...stream, + destination_sync_mode: "overwrite", + stream: s, + }; + }); + return { streams }; +} diff --git a/webapps/console/pages/api/oauth/service.ts b/webapps/console/pages/api/oauth/service.ts index 0e33cb804..6dd9533f5 100644 --- a/webapps/console/pages/api/oauth/service.ts +++ b/webapps/console/pages/api/oauth/service.ts @@ -8,7 +8,7 @@ import { OauthDecorator, oauthDecorators } from "../../../lib/server/oauth/servi export default createRoute() .POST({ auth: true, - body: z.string().optional(), + body: z.object({}).passthrough(), query: z.object({ serviceId: z.string().optional(), package: z.string().optional(), @@ -22,7 +22,7 @@ export default createRoute() // we need that because we work with unsaved objects (new or edited) - body represents credentials from the form if (body) { - credentials = JSON.parse(body); + credentials = body; oauthDecorator = requireDefined( oauthDecorators.find(d => d.packageId === query.package), `Package ${query.package} for service ${query.serviceId} not found in catalog` @@ -34,7 +34,7 @@ export default createRoute() }); assertDefined(object, `Service ${query.serviceId} not found in database`); await verifyAccess(user, object.workspaceId); - credentials = JSON.parse((object.config as any).credentials); + credentials = (object.config as any).credentials; const packageId = (object.config as any).package; oauthDecorator = requireDefined( oauthDecorators.find(d => d.packageId === packageId), diff --git a/webapps/console/prisma/schema.prisma b/webapps/console/prisma/schema.prisma index e1638dcb0..6d313c836 100644 --- a/webapps/console/prisma/schema.prisma +++ b/webapps/console/prisma/schema.prisma @@ -5,7 +5,6 @@ generator zod { relationModel = false modelCase = "PascalCase" modelSuffix = "DbModel" - imports = "../lib/schema" useDecimalJs = true prismaJsonNullability = true } @@ -33,8 +32,8 @@ model EmailLog { model UserPreferences { id String @id @default(cuid()) - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt + createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) + updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) userId String user UserProfile @relation(fields: [userId], references: [id]) @@ -51,8 +50,8 @@ model UserProfile { name String email String admin Boolean? @default(false) - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt + createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) + updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) loginProvider String externalUsername String? externalId String @@ -63,8 +62,8 @@ model UserProfile { model Workspace { id String @id @default(cuid()) - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt + createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) + updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) name String deleted Boolean @default(false) @@ -80,8 +79,8 @@ model Workspace { model WorkspaceAccess { workspaceId String - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt + createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) + updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) userId String workspace Workspace @relation(fields: [workspaceId], references: [id]) user UserProfile @relation(fields: [userId], references: [id]) @@ -91,8 +90,8 @@ model WorkspaceAccess { model UserApiToken { id String @id @default(cuid()) - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt + createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) + updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) hint String hash String userId String @@ -104,8 +103,8 @@ model InvitationToken { workspaceId String email String - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt + createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) + updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) token String usedBy String? } @@ -113,8 +112,8 @@ model InvitationToken { model ConfigurationObject { id String @id @default(cuid()) deleted Boolean? @default(false) - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt + createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) + updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) type String workspaceId String workspace Workspace @relation(fields: [workspaceId], references: [id]) @@ -127,8 +126,8 @@ model ConfigurationObject { model ConfigurationObjectLink { id String @id @default(cuid()) deleted Boolean? @default(false) - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt + createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) + updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) type String? @default("push") data Json? @@ -148,15 +147,15 @@ model ConnectorPackage { packageType String @default("airbyte") meta Json? logoSvg String? - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt + createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) + updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) } model source_spec { package String version String specs Json? - timestamp DateTime @default(now()) @db.Timestamptz(3) + timestamp DateTime @default(now()) @db.Timestamptz(3) /// @zod.custom(z.coerce.date()) error String? @@id([package, version]) @@ -168,7 +167,7 @@ model source_check { key String @id status String description String? - timestamp DateTime @default(now()) @db.Timestamptz(3) + timestamp DateTime @default(now()) @db.Timestamptz(3) /// @zod.custom(z.coerce.date()) } model source_catalog { @@ -176,7 +175,7 @@ model source_catalog { version String key String catalog Json? - timestamp DateTime @default(now()) @db.Timestamptz(3) + timestamp DateTime @default(now()) @db.Timestamptz(3) /// @zod.custom(z.coerce.date()) status String description String? @@ -187,7 +186,7 @@ model source_state { sync_id String stream String state Json - timestamp DateTime @default(now()) @db.Timestamptz(3) + timestamp DateTime @default(now()) @db.Timestamptz(3) /// @zod.custom(z.coerce.date()) @@id([sync_id, stream]) } @@ -197,8 +196,8 @@ model source_task { task_id String @id package String version String - started_at DateTime @default(now()) @db.Timestamptz(3) - updated_at DateTime @default(now()) @db.Timestamptz(3) + started_at DateTime @default(now()) @db.Timestamptz(3) /// @zod.custom(z.coerce.date()) + updated_at DateTime @default(now()) @db.Timestamptz(3) /// @zod.custom(z.coerce.date()) status String description String? @@ -213,7 +212,7 @@ model task_log { message String sync_id String task_id String - timestamp DateTime @default(now()) @db.Timestamptz(3) + timestamp DateTime @default(now()) @db.Timestamptz(3) /// @zod.custom(z.coerce.date()) @@index(sync_id) @@index(task_id) @@ -224,8 +223,8 @@ model task_log { //model OauthSecrets { // id String @id @default(cuid()) -// createdAt DateTime @default(now()) -// updatedAt DateTime @default(now()) @updatedAt +// createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) +// updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) // nangoIntegrationId String // secrets Json? //} From 61f2a48624f5b4e5ad53c63ebd3862dbe87cc5b9 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Mon, 7 Aug 2023 12:52:07 +0400 Subject: [PATCH 0116/1353] fix: now workspace admin view works if EE server auth is enabled --- webapps/console/lib/api.ts | 7 +++++++ .../console/pages/api/[workspaceId]/ee/[...proxyPath].ts | 9 +++++++-- webapps/ee-api/lib/auth.ts | 4 ++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/webapps/console/lib/api.ts b/webapps/console/lib/api.ts index 94523c1cc..568353513 100644 --- a/webapps/console/lib/api.ts +++ b/webapps/console/lib/api.ts @@ -233,6 +233,13 @@ function stackToArray(stack?: string) { const lines = stack.split("\n"); return lines.length > 0 ? lines.map(s => s.trim()) : undefined; } +export async function verifyAdmin(user: SessionUser) { + const userId = requireDefined(user.internalId, `internalId is not defined`); + if ((await db.prisma().userProfile.findFirst({ where: { id: user.internalId } }))?.admin) { + return; + } + throw new ApiError(`User ${userId} is not an admin`, { status: 403 }); +} export async function verifyAccess(user: SessionUser, workspaceId: string) { const userId = requireDefined(user.internalId, `internalId is not defined`); diff --git a/webapps/console/pages/api/[workspaceId]/ee/[...proxyPath].ts b/webapps/console/pages/api/[workspaceId]/ee/[...proxyPath].ts index f038f252f..8924462cd 100644 --- a/webapps/console/pages/api/[workspaceId]/ee/[...proxyPath].ts +++ b/webapps/console/pages/api/[workspaceId]/ee/[...proxyPath].ts @@ -1,5 +1,5 @@ import { NextApiRequest, NextApiResponse } from "next"; -import { getUser, verifyAccess } from "../../../../lib/api"; +import { getUser, verifyAccess, verifyAdmin } from "../../../../lib/api"; import { createJwt, getEeConnection } from "../../../../lib/server/ee"; import { isEEAvailable } from "../../ee/jwt"; @@ -19,7 +19,12 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse } const workspaceId = req.query.workspaceId as string; const proxyPath = req.query.proxyPath as string[]; - await verifyAccess(user, workspaceId); + if (workspaceId === "$all") { + //only admins can access to all workspaces + await verifyAdmin(user); + } else { + await verifyAccess(user, workspaceId); + } const { jwt } = createJwt(user.internalId, user.email, workspaceId, 60); const query = { ...(req.query || {}), diff --git a/webapps/ee-api/lib/auth.ts b/webapps/ee-api/lib/auth.ts index f778ac47d..7c4d62505 100644 --- a/webapps/ee-api/lib/auth.ts +++ b/webapps/ee-api/lib/auth.ts @@ -66,6 +66,10 @@ export async function auth(req: NextApiRequest, res: NextApiResponse): Promise
    Date: Mon, 7 Aug 2023 14:55:15 +0400 Subject: [PATCH 0117/1353] don't import react to api.ts --- webapps/console/lib/api.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/webapps/console/lib/api.ts b/webapps/console/lib/api.ts index 568353513..5cca6b3f7 100644 --- a/webapps/console/lib/api.ts +++ b/webapps/console/lib/api.ts @@ -9,7 +9,6 @@ import { prepareZodObjectForDeserialization, safeParseWithDate } from "./zod"; import { ApiError } from "./shared/errors"; import { getServerLog } from "./server/log"; import { getFirebaseUser, isFirebaseEnabled } from "./server/firebase-server"; -import { ReactNode } from "react"; type HandlerOpts = { body?: Req; @@ -264,7 +263,7 @@ export type RouteBuilderBase = { ResultZodType extends ZodType = any, RequireAuth extends undefined | boolean = false >(spec: { - description?: ReactNode; + description?: string; query?: QueryZodType; body?: BodyZodType; result?: ResultZodType; From cac4242f08f01beea67aef71d0766ba18d77bd3f Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 7 Aug 2023 15:23:33 +0400 Subject: [PATCH 0118/1353] simple error pages for 403,404,500 --- webapps/console/pages/403.tsx | 3 +++ webapps/console/pages/404.tsx | 3 +++ webapps/console/pages/500.tsx | 3 +++ 3 files changed, 9 insertions(+) create mode 100644 webapps/console/pages/403.tsx create mode 100644 webapps/console/pages/404.tsx create mode 100644 webapps/console/pages/500.tsx diff --git a/webapps/console/pages/403.tsx b/webapps/console/pages/403.tsx new file mode 100644 index 000000000..3e443f7c1 --- /dev/null +++ b/webapps/console/pages/403.tsx @@ -0,0 +1,3 @@ +export default function Custom403() { + return

    403 - Not authorized

    ; +} diff --git a/webapps/console/pages/404.tsx b/webapps/console/pages/404.tsx new file mode 100644 index 000000000..cad17021f --- /dev/null +++ b/webapps/console/pages/404.tsx @@ -0,0 +1,3 @@ +export default function Custom404() { + return

    404 - Page Not Found

    ; +} diff --git a/webapps/console/pages/500.tsx b/webapps/console/pages/500.tsx new file mode 100644 index 000000000..341a955f1 --- /dev/null +++ b/webapps/console/pages/500.tsx @@ -0,0 +1,3 @@ +export default function Custom500() { + return

    500 - Internal server error

    ; +} From 792c8923f0c7b64334cfb70556f905d7acaa7fc1 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 7 Aug 2023 15:30:06 +0400 Subject: [PATCH 0119/1353] simple error pages for 405 --- webapps/console/pages/405.tsx | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 webapps/console/pages/405.tsx diff --git a/webapps/console/pages/405.tsx b/webapps/console/pages/405.tsx new file mode 100644 index 000000000..5c8614ce1 --- /dev/null +++ b/webapps/console/pages/405.tsx @@ -0,0 +1,3 @@ +export default function Custom405() { + return

    405 - Method is not allowed

    ; +} From 8a95d8908c804b49c144dba1217b9d4d5d31df48 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 8 Aug 2023 18:20:49 +0400 Subject: [PATCH 0120/1353] Sync scheduling support on Google Cloud Scheduler --- pnpm-lock.yaml | 153 +++++++++++++++++- .../components/CodeBlock/CodeBlock.tsx | 14 +- .../components/GlobalError/GlobalError.tsx | 48 +++--- .../SyncEditorPage/SyncEditorPage.tsx | 102 +++++++++++- webapps/console/lib/schema/index.ts | 4 + webapps/console/lib/server/sync-scheduler.ts | 98 +++++++++++ webapps/console/package.json | 4 +- webapps/console/pages/403.tsx | 4 +- webapps/console/pages/404.tsx | 4 +- webapps/console/pages/405.tsx | 4 +- webapps/console/pages/500.tsx | 6 +- .../pages/api/[workspaceId]/config/link.ts | 9 +- .../pages/api/[workspaceId]/sources/run.ts | 7 +- webapps/console/pages/api/app-config.ts | 4 + 14 files changed, 415 insertions(+), 46 deletions(-) create mode 100644 webapps/console/lib/server/sync-scheduler.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2083715e6..77763efc8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -487,6 +487,9 @@ importers: '@fontsource/roboto-mono': specifier: ^4.5.8 version: 4.5.10 + '@google-cloud/scheduler': + specifier: ^4.0.0 + version: 4.0.0 '@jitsu/core-functions': specifier: workspace:* version: link:../../libs/core-functions @@ -655,6 +658,9 @@ importers: stopwatch-node: specifier: ^1.1.0 version: 1.1.0 + timezones-list: + specifier: ^3.0.2 + version: 3.0.2 tslib: specifier: ^2.4.0 version: 2.5.0 @@ -4309,6 +4315,16 @@ packages: dev: false optional: true + /@google-cloud/scheduler@4.0.0: + resolution: {integrity: sha512-9q3djPsxaKIJETgdlx+76F8zobzUTyCZujSVtj2FD2K7jyjfhYZ31meLVBJzbsJ+YwDzF9KK3cCIx57Xap39WQ==} + engines: {node: '>=14.0.0'} + dependencies: + google-gax: 4.0.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /@google-cloud/storage@6.9.5: resolution: {integrity: sha512-fcLsDA8YKcGuqvhk0XTjJGVpG9dzs5Em8IcUjSjspYvERuHYqMy9CMChWapSjv3Lyw//exa3mv4nUxPlV93BnA==} engines: {node: '>=12'} @@ -4351,7 +4367,6 @@ packages: '@grpc/proto-loader': 0.7.6 '@types/node': 18.15.11 dev: false - optional: true /@grpc/proto-loader@0.6.13: resolution: {integrity: sha512-FjxPYDRTn6Ec3V0arm1FtSpmP6V50wuph2yILpyvTKzjc76oDdoihXqM1DzOW5ubvCC8GivfCnNtfaRE8myJ7g==} @@ -4372,7 +4387,7 @@ packages: '@types/long': 4.0.2 lodash.camelcase: 4.3.0 long: 4.0.0 - protobufjs: 7.2.3 + protobufjs: 7.2.4 yargs: 16.2.0 /@humanwhocodes/config-array@0.10.7: @@ -9287,6 +9302,15 @@ packages: transitivePeerDependencies: - supports-color + /agent-base@7.1.0: + resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + engines: {node: '>= 14'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + /agentkeepalive@4.3.0: resolution: {integrity: sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==} engines: {node: '>= 8.0.0'} @@ -11975,7 +11999,6 @@ packages: readable-stream: 3.6.2 stream-shift: 1.0.1 dev: false - optional: true /ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} @@ -13973,6 +13996,19 @@ packages: dev: false optional: true + /gaxios@6.0.4: + resolution: {integrity: sha512-mwKfHJn7f3pLRfahdEPNyvygXRwjwgsgDPaIIoBRIDkgP4SFyezkYGWQ2aLCfrAnzimSrP+mAg1aSUj5gidXvw==} + engines: {node: '>=14'} + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.1 + is-stream: 2.0.1 + node-fetch: 2.6.9 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /gcp-metadata@4.3.1: resolution: {integrity: sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==} engines: {node: '>=10'} @@ -13996,6 +14032,17 @@ packages: dev: false optional: true + /gcp-metadata@6.0.0: + resolution: {integrity: sha512-Ozxyi23/1Ar51wjUT2RDklK+3HxqDr8TLBNK8rBBFQ7T85iIGnXnVusauj06QyqCXRFZig8LZC+TUddWbndlpQ==} + engines: {node: '>=14'} + dependencies: + gaxios: 6.0.4 + json-bigint: 1.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /generic-names@2.0.1: resolution: {integrity: sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ==} dependencies: @@ -14267,6 +14314,22 @@ packages: dev: false optional: true + /google-auth-library@9.0.0: + resolution: {integrity: sha512-IQGjgQoVUAfOk6khqTVMLvWx26R+yPw9uLyb1MNyMQpdKiKt0Fd9sp4NWoINjyGHR8S3iw12hMTYK7O8J07c6Q==} + engines: {node: '>=14'} + dependencies: + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + gaxios: 6.0.4 + gcp-metadata: 6.0.0 + gtoken: 7.0.1 + jws: 4.0.0 + lru-cache: 6.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /google-gax@3.6.0: resolution: {integrity: sha512-2fyb61vWxUonHiArRNJQmE4tx5oY1ni8VPo08fzII409vDSCWG7apDX4qNOQ2GXXT82gLBn3d3P1Dydh7pWjyw==} engines: {node: '>=12'} @@ -14283,7 +14346,7 @@ packages: is-stream-ended: 0.1.4 node-fetch: 2.6.9 object-hash: 3.0.0 - proto3-json-serializer: 1.1.0 + proto3-json-serializer: 1.1.1 protobufjs: 7.2.3 protobufjs-cli: 1.1.1(protobufjs@7.2.3) retry-request: 5.0.2 @@ -14293,6 +14356,26 @@ packages: dev: false optional: true + /google-gax@4.0.3: + resolution: {integrity: sha512-gllHYRhZvpz0LcVN+xtyzBeUa/ZYiLGF4JNBECrvL/LxDkaJc09hHoQ+KzRBI2Ewqgrjj7V3QrOC2pGno5ropw==} + engines: {node: '>=14'} + dependencies: + '@grpc/grpc-js': 1.8.13 + '@grpc/proto-loader': 0.7.6 + '@types/long': 4.0.2 + abort-controller: 3.0.0 + duplexify: 4.1.2 + google-auth-library: 9.0.0 + node-fetch: 2.6.9 + object-hash: 3.0.0 + proto3-json-serializer: 1.1.1 + protobufjs: 7.2.4 + retry-request: 6.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /google-p12-pem@3.1.4: resolution: {integrity: sha512-HHuHmkLgwjdmVRngf5+gSmpkyaRI6QmOg77J8tkNBHhNEI62sGHyw4/+UkgyZEI7h84NbWprXDJ+sa3xOYFvTg==} engines: {node: '>=10'} @@ -14393,6 +14476,17 @@ packages: dev: false optional: true + /gtoken@7.0.1: + resolution: {integrity: sha512-KcFVtoP1CVFtQu0aSk3AyAt2og66PFhZAlkUOuWKwzMLoulHXG5W5wE5xAnHb+yl3/wEFoqGW7/cDGMU8igDZQ==} + engines: {node: '>=14.0.0'} + dependencies: + gaxios: 6.0.4 + jws: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /gunzip-maybe@1.4.2: resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} hasBin: true @@ -14748,6 +14842,16 @@ packages: transitivePeerDependencies: - supports-color + /https-proxy-agent@7.0.1: + resolution: {integrity: sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -21562,13 +21666,12 @@ packages: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} dev: false - /proto3-json-serializer@1.1.0: - resolution: {integrity: sha512-SjXwUWe/vANGs/mJJTbw5++7U67nwsymg7qsoPtw6GiXqw3kUy8ByojrlEdVE2efxAdKreX8WkDafxvYW95ZQg==} + /proto3-json-serializer@1.1.1: + resolution: {integrity: sha512-AwAuY4g9nxx0u52DnSMkqqgyLHaW/XaPLtaAo3y/ZCfeaQB/g4YDH4kb8Wc/mWzWvu0YjOznVnfn373MVZZrgw==} engines: {node: '>=12.0.0'} dependencies: - protobufjs: 7.2.3 + protobufjs: 7.2.4 dev: false - optional: true /protobufjs-cli@1.1.1(protobufjs@7.2.3): resolution: {integrity: sha512-VPWMgIcRNyQwWUv8OLPyGQ/0lQY/QTQAVN5fh+XzfDwsVw1FZ2L3DM/bcBf8WPiRz2tNpaov9lPZfNcmNo6LXA==} @@ -21627,6 +21730,26 @@ packages: '@protobufjs/utf8': 1.1.0 '@types/node': 18.15.11 long: 5.2.1 + dev: false + optional: true + + /protobufjs@7.2.4: + resolution: {integrity: sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 18.15.11 + long: 5.2.1 /proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} @@ -22983,6 +23106,16 @@ packages: dev: false optional: true + /retry-request@6.0.0: + resolution: {integrity: sha512-24kaFMd3wCnT3n4uPnsQh90ZSV8OISpfTFXJ00Wi+/oD2OPrp63EQ8hznk6rhxdlpwx2QBhQSDz2Fg46ki852g==} + engines: {node: '>=14'} + dependencies: + debug: 4.3.4 + extend: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: false + /retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} @@ -24593,6 +24726,10 @@ packages: convert-hrtime: 3.0.0 dev: true + /timezones-list@3.0.2: + resolution: {integrity: sha512-I698hm6Jp/xxkwyTSOr39pZkYKETL8LDJeSIhjxXBfPUAHM5oZNuQ4o9UK3PSkDBOkjATecSOBb3pR1IkIBUsg==} + dev: false + /timsort@0.3.0: resolution: {integrity: sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==} dev: true diff --git a/webapps/console/components/CodeBlock/CodeBlock.tsx b/webapps/console/components/CodeBlock/CodeBlock.tsx index 25f1c2f27..bb6fd08b0 100644 --- a/webapps/console/components/CodeBlock/CodeBlock.tsx +++ b/webapps/console/components/CodeBlock/CodeBlock.tsx @@ -42,7 +42,12 @@ import hljs from "highlight.js/lib/common"; import { CopyButton } from "../CopyButton/CopyButton"; import { Copy } from "lucide-react"; -export const CodeBlock: React.FC> = ({ lang, children, className }) => { +export const CodeBlock: React.FC> = ({ + lang, + preWrap, + children, + className, +}) => { assertDefined(children, "CodeBlock children must be defined"); const codeRef = useRef(null); useEffect(() => { @@ -57,7 +62,12 @@ export const CodeBlock: React.FC>
    -
    +      
             {children}
           
    diff --git a/webapps/console/components/GlobalError/GlobalError.tsx b/webapps/console/components/GlobalError/GlobalError.tsx index 6da20e3db..852e7dde2 100644 --- a/webapps/console/components/GlobalError/GlobalError.tsx +++ b/webapps/console/components/GlobalError/GlobalError.tsx @@ -2,7 +2,7 @@ import React, { ErrorInfo, ReactNode } from "react"; import { Expandable } from "../Expandable/Expandable"; import { CodeBlock } from "../CodeBlock/CodeBlock"; import { FaExclamationCircle } from "react-icons/fa"; -import { Button } from "antd"; +import { Button, Collapse } from "antd"; import { signOut } from "next-auth/react"; import { getErrorMessage, getLog } from "juava"; import { firebaseSignOut } from "../../lib/firebase-client"; @@ -13,6 +13,7 @@ import classNames from "classnames"; export type GlobalErrorProps = { error: any; title?: string; + hideActions?: boolean; }; export type ErrorProps = { error: Error; errorInfo: ErrorInfo }; @@ -44,34 +45,33 @@ export class ErrorBoundary extends React.Component< export function ErrorDetails(props: { error: any }) { const message = props.error?.message && `${props.error.message}`; const stack = props.error?.stack && `${props.error.stack}`; - return ( - <> + {message && ( - <> -
    Error:
    - {message} - - )} - {stack && ( - <> -
    Stack:
    - {stack} - + Error
    }> + {message} + )} {props.error.response && ( - <> -
    Response
    - {JSON.stringify(props.error.response, null, 2)} - + Response
    }> + + {JSON.stringify(props.error.response, null, 2)} + + )} {props.error.request && ( - <> -
    Request
    - {JSON.stringify(props.error.request, null, 2)} - + Request
    }> + + {JSON.stringify(props.error.request, null, 2)} + + + )} + {stack && ( + Stack
    }> + {stack} + )} - + ); } @@ -156,8 +156,8 @@ export const GlobalOverlay: React.FC> = ({ childr ); -export const GlobalError: React.FC = ({ error, title }) => ( +export const GlobalError: React.FC = props => ( - + ); diff --git a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx index dc627147e..ff7a5b1fd 100644 --- a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx +++ b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx @@ -1,4 +1,4 @@ -import { useWorkspace } from "../../lib/context"; +import { useAppConfig, useWorkspace } from "../../lib/context"; import { get } from "../../lib/useApi"; import { DestinationConfig, ServiceConfig } from "../../lib/schema"; import React, { useCallback, useEffect, useState } from "react"; @@ -7,7 +7,7 @@ import { ConfigurationObjectLinkDbModel } from "../../prisma/schema"; import { useRouter } from "next/router"; import { assertTrue, getLog, hash as juavaHash, rpc } from "juava"; import { Disable } from "../Disable/Disable"; -import { Button, Select, Switch, Tooltip } from "antd"; +import { Button, Input, Select, Switch, Tooltip } from "antd"; import { getCoreDestinationType } from "../../lib/schema/destinations"; import { confirmOp, feedbackError, feedbackSuccess } from "../../lib/ui"; import FieldListEditorLayout, { EditorItem } from "../FieldListEditorLayout/FieldListEditorLayout"; @@ -22,9 +22,41 @@ import { ErrorCard } from "../GlobalError/GlobalError"; import { LabelEllipsis } from "../LabelEllipsis/LabelEllipsis"; import { createDisplayName } from "../../lib/zod"; import xor from "lodash/xor"; +import timezones from "timezones-list"; const log = getLog("SyncEditorPage"); +const scheduleOptions = [ + { + label: "Disabled", + value: "", + }, + { + label: "Every minute", + value: "* * * * *", + }, + { + label: "Every 5 minutes", + value: "*/5 * * * *", + }, + { + label: "Every 15 minutes", + value: "*/15 * * * *", + }, + { + label: "Every hour", + value: "0 * * * *", + }, + { + label: "Every day", + value: "0 0 * * *", + }, + { + label: "Custom", + value: "custom", + }, +]; + type SelectorProps = { enabled: boolean; selected: string; @@ -35,6 +67,8 @@ type SelectorProps = { type SyncOptionsType = { storageKey?: string; streams?: SelectedStreams; + schedule?: string; + timezone?: string; }; type SelectedStreamSettings = { @@ -133,6 +167,7 @@ function SyncEditor({ links: z.infer[]; }) { const router = useRouter(); + const appConfig = useAppConfig(); const existingLink = router.query.id ? links.find(link => link.id === router.query.id) : undefined; assertTrue(services.length > 0, `Services list is empty`); @@ -151,6 +186,10 @@ function SyncEditor({ const [loadingCatalog, setLoadingCatalog] = useState(true); const [refreshCatalog, setRefreshCatalog] = useState(0); + const [showCustomSchedule, setShowCustomSchedule] = useState( + syncOptions?.schedule && !scheduleOptions.find(o => o.value === syncOptions?.schedule) + ); + const updateOptions = useCallback( (patch: Partial) => { log.atInfo().log("Patching sync options with", patch, " existing options", syncOptions); @@ -382,6 +421,65 @@ function SyncEditor({ ), }, ]; + if (appConfig.scheduler.enabled) { + configItems.push({ + name: "Schedule", + documentation: "Select schedule to run sync", + component: ( + updateOptions({ schedule: e.target.value })} /> + + ), + }); + } + if (syncOptions?.schedule) { + configItems.push({ + name: "Scheduler Timezone", + documentation: + "Select timezone for scheduler. E.g. 'Every day' setting runs sync at 00:00 in selected timezone", + component: ( + { + const optionDisabled = + billing.enabled && + !billing.loading && + billing.settings.maximumSyncFrequency && + minuteFrequency < billing.settings.maximumSyncFrequency; + return { + ...rest, + label: `${rest.label} ${optionDisabled ? "(Plan upgrade required)" : ""}`, + disabled: !!optionDisabled, + }; + })} value={showCustomSchedule ? "custom" : syncOptions?.schedule || ""} onSelect={id => { if (id === "custom") { diff --git a/webapps/console/components/Workspace/WLink.tsx b/webapps/console/components/Workspace/WLink.tsx index 0c49f29cf..dc0153c08 100644 --- a/webapps/console/components/Workspace/WLink.tsx +++ b/webapps/console/components/Workspace/WLink.tsx @@ -6,12 +6,13 @@ import { useWorkspace } from "../../lib/context"; export type WLinkProps = LinkProps & { target?: string; rel?: string; + className?: string; }; export const WLink: React.FC> = ({ href, target, rel, children, ...props }) => { const workspace = useWorkspace(); return ( - + {children} ); diff --git a/webapps/console/lib/schema/index.ts b/webapps/console/lib/schema/index.ts index d3335d85d..20ac6c88c 100644 --- a/webapps/console/lib/schema/index.ts +++ b/webapps/console/lib/schema/index.ts @@ -20,8 +20,12 @@ export const ContextApiResponse = z.object({ }); export type ContextApiResponse = z.infer; +//Default values are for "free" (default) plan export const BillingSettings = z.object({ planId: z.string().default("free"), + dailyActiveSyncs: z.number().default(1).optional(), + dailyActiveSyncsOverage: z.number().default(10).optional(), + maximumSyncFrequency: z.number().optional(), //minutes planName: z.string().optional(), //if not set - will be taken from planId overagePricePer100k: z.number().optional(), canShowProvisionDbCredentials: z.boolean().default(false), diff --git a/webapps/console/pages/api/[workspaceId]/sources/run.ts b/webapps/console/pages/api/[workspaceId]/sources/run.ts index 57c0a4b09..bc7d3694b 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/run.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/run.ts @@ -3,12 +3,13 @@ import { z } from "zod"; import { createRoute, getUser, verifyAccess } from "../../../../lib/api"; import { requireDefined, rpc } from "juava"; import { randomUUID } from "crypto"; -import { ServiceConfig } from "../../../../lib/schema"; +import { ServiceConfig, SessionUser } from "../../../../lib/schema"; import { ApiError, syncError } from "../../../../lib/shared/errors"; import { getServerLog } from "../../../../lib/server/log"; import { getAppEndpoint } from "../../../../lib/domains"; import { tryManageOauthCreds } from "../../../../lib/server/oauth/services"; +import { createJwt, getEeConnection, isEEAvailable } from "../../../../lib/server/ee"; const log = getServerLog("sync-run"); @@ -27,6 +28,71 @@ const resultType = z.object({ .optional(), }); +async function checkQuota(opts: { + user?: SessionUser; + workspaceId: string; + taskId: string; + syncId: string; + package: string; + version: string; +}): Promise { + try { + const quotaCheck = `${getEeConnection().host}api/quotas/sync`; + let eeAuthToken: string | undefined; + if (opts.user) { + eeAuthToken = createJwt(opts.user.internalId, opts.user.email, opts.workspaceId, 60).jwt; + } else { + //automatic run, authorized via syncctl auth key. Authorize as admin + eeAuthToken = createJwt("admin-service-account@jitsu.com", "admin-service-account@jitsu.com", "$all", 60).jwt; + } + const quotaCheckResult = await rpc(quotaCheck, { + method: "POST", + query: { workspaceId: opts.workspaceId }, //db is created, so the slug won't be really used + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${eeAuthToken}`, + }, + }); + if (!quotaCheckResult.ok) { + if (!opts.user) { + //scheduled run. We need to create a failed task so user can see the error + await db.prisma().source_task.create({ + data: { + sync_id: opts.syncId, + task_id: opts.taskId, + status: "FAILED", + started_at: new Date(), + updated_at: new Date(), + description: quotaCheckResult.error, + package: "jitsu", + version: "0.0.1", + }, + }); + await db.prisma().task_log.create({ + data: { + logger: "sync", + task_id: opts.taskId, + sync_id: opts.syncId, + message: `Quota exceeded: ${quotaCheckResult.error}`, + level: "ERROR", + timestamp: new Date(), + }, + }); + } + return { + ok: false, + error: `Quota exceeded: ${quotaCheckResult.error}`, + }; + } + } catch (e) { + log.atError().log("Error checking quota", e); + return { + ok: false, + error: `Quota server is not available`, + }; + } +} + export default createRoute() .GET({ auth: false, @@ -39,10 +105,15 @@ export default createRoute() }) .handler(async ({ query, req, res }) => { const { workspaceId } = query; + //Since we need custom auth for syncctl, here we set auth: false in route config (see abouve) + // and we need to do auth manually const syncAuthKey = process.env.SYNCCTL_AUTH_KEY ?? ""; const token = req.headers.authorization ?? ""; + const taskId = randomUUID(); + let trigger: "manual" | "scheduled" = "manual"; + let user: SessionUser | undefined; if (token.replace("Bearer ", "") !== syncAuthKey || !token || !syncAuthKey) { - const user = await getUser(res, req); + user = await getUser(res, req); if (!user) { throw new ApiError("Authorization Required", {}, { status: 401 }); } @@ -54,6 +125,7 @@ export default createRoute() ); const authHeaders: any = {}; if (syncAuthKey) { + trigger = "scheduled"; authHeaders["Authorization"] = `Bearer ${syncAuthKey}`; } try { @@ -102,6 +174,19 @@ export default createRoute() error: `Service ${sync.from} not found`, }; } + if (isEEAvailable()) { + const checkResult = await checkQuota({ + user, + workspaceId, + taskId, + syncId: query.syncId as string, + package: (service.config as any).package, + version: (service.config as any).version, + }); + if (checkResult) { + return checkResult; + } + } let stateObj: any = undefined; if (query.fullSync === "true" || query.fullSync === "1") { await db.prisma().source_state.deleteMany({ @@ -169,7 +254,6 @@ export default createRoute() } const configuredCatalog = selectStreamsFromCatalog(catalog, (sync.data as any).streams); - const taskId = randomUUID(); const res = await rpc(syncURL + "/read", { method: "POST", headers: { @@ -183,6 +267,10 @@ export default createRoute() syncId: query.syncId, }, body: { + startedBy: { + trigger, + ...(user ? { userId: user.internalId } : {}), + }, config: await tryManageOauthCreds({ ...(service.config as ServiceConfig), id: sync.fromId }), catalog: configuredCatalog, ...(stateObj ? { state: stateObj } : {}), diff --git a/webapps/console/pages/api/sources/index.ts b/webapps/console/pages/api/sources/index.ts index b0bfb27b9..bc458f09f 100644 --- a/webapps/console/pages/api/sources/index.ts +++ b/webapps/console/pages/api/sources/index.ts @@ -11,6 +11,7 @@ export const SourceType = ConnectorPackageDbModel.merge( meta: z.object({ name: z.string(), license: z.string(), + mitVersions: z.array(z.string()).optional(), releaseStage: z.string(), dockerImageTag: z.string(), connectorSubtype: z.string(), @@ -40,6 +41,7 @@ export default createRoute() meta as any, "name", "license", + "mitVersions", "releaseStage", "dockerImageTag", "connectorSubtype", diff --git a/webapps/console/prisma/schema.prisma b/webapps/console/prisma/schema.prisma index 6d313c836..24bf14faa 100644 --- a/webapps/console/prisma/schema.prisma +++ b/webapps/console/prisma/schema.prisma @@ -198,6 +198,7 @@ model source_task { version String started_at DateTime @default(now()) @db.Timestamptz(3) /// @zod.custom(z.coerce.date()) updated_at DateTime @default(now()) @db.Timestamptz(3) /// @zod.custom(z.coerce.date()) + started_by Json? status String description String? diff --git a/webapps/ee-api/lib/auth.ts b/webapps/ee-api/lib/auth.ts index 9413651ce..3cb2b5867 100644 --- a/webapps/ee-api/lib/auth.ts +++ b/webapps/ee-api/lib/auth.ts @@ -65,7 +65,6 @@ export async function auth(req: NextApiRequest, res: NextApiResponse): Promise { + throw new Error( + `Email factory should not be called. When /quotas/sync is called, the subscription should already exist` + ); + }); + if (subscription.subscriptionStatus.planId !== "free" || subscription.noRestrictions) { + return { ok: true }; + } else { + const res = await query( + pg, + ` + select + "workspaceId", + count(distinct sync."fromId" || sync."toId") as "activeSyncs", + max(started_at) as "lastSync" + from newjitsu.source_task task + join newjitsu."ConfigurationObjectLink" sync on task.sync_id = sync."id" + where task.status = 'SUCCESS' and "workspaceId" = :workspaceId + and started_at > now() - interval '24 hour' + group by "workspaceId";`, + { workspaceId } + ); + if (res.length == 0) { + return { ok: true }; + } else { + const activeSyncs = res[0].activeSyncs; + if (activeSyncs > freePlanLimitations.dailyActiveSyncs) { + return { + ok: false, + error: `Daily active syncs limit exceeded. Current: ${activeSyncs}, limit: ${freePlanLimitations.dailyActiveSyncs}. Last sync completed at: ${res[0].lastSync}`, + }; + } + } + } + return { ok: true }; +}; + +export default withErrorHandler(handler); From 434af296486399250aeb2da4ebc52beed784311b Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Fri, 11 Aug 2023 16:38:02 +0400 Subject: [PATCH 0143/1353] fix: tasks API adjusted to match DB schema --- webapps/console/pages/api/[workspaceId]/sources/tasks.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/webapps/console/pages/api/[workspaceId]/sources/tasks.ts b/webapps/console/pages/api/[workspaceId]/sources/tasks.ts index 55f7919c6..7092d37d3 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/tasks.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/tasks.ts @@ -21,6 +21,7 @@ const aggregatedResultType = z.object({ task_id: z.string(), status: z.string(), description: z.string(), + started_by: z.any().optional(), started_at: z.date(), updated_at: z.date(), }) From a89396666fd103feae97dc2cd3dec293c949c0ad Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Fri, 11 Aug 2023 16:38:02 +0400 Subject: [PATCH 0144/1353] fix: tasks API adjusted to match DB schema --- webapps/console/lib/api.ts | 6 +++++- .../console/pages/api/[workspaceId]/sources/tasks.ts | 10 ++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/webapps/console/lib/api.ts b/webapps/console/lib/api.ts index 5cca6b3f7..eba577638 100644 --- a/webapps/console/lib/api.ts +++ b/webapps/console/lib/api.ts @@ -184,7 +184,11 @@ export function nextJsApiHandler(api: Api): NextApiHandler { log .atDebug() .log( - `Zod mismatch. Obj: ${JSON.stringify(result, null, 2)}. Zod error: ${JSON.stringify(parseResult.error)}` + `Api method zod mismatch at ${req.method} ${req.url}. Obj: ${JSON.stringify( + result, + null, + 2 + )}. Zod error: ${JSON.stringify(parseResult.error)}` ); throw new ApiError(`Response for ${req.method} ${req.url} doesn't match required schema`, { zodError: parseResult.error, diff --git a/webapps/console/pages/api/[workspaceId]/sources/tasks.ts b/webapps/console/pages/api/[workspaceId]/sources/tasks.ts index 7092d37d3..b025af1b2 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/tasks.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/tasks.ts @@ -7,6 +7,7 @@ import utc from "dayjs/plugin/utc"; import { syncError } from "../../../../lib/shared/errors"; import { getServerLog } from "../../../../lib/server/log"; import { getAppEndpoint } from "../../../../lib/domains"; + dayjs.extend(utc); const log = getServerLog("sync-tasks"); @@ -32,11 +33,16 @@ const aggregatedResultType = z.object({ type aggregatedResultType = z.infer; type source_task = z.infer; +//fix the type of started_by from weird prism type to any +const adjustedSourceTaskDBModel = source_taskDbModel + .omit({ started_by: true }) + .merge(z.object({ started_by: z.any().optional() })); + const tasksResultType = z.object({ ok: z.boolean(), error: z.string().optional(), - tasks: z.array(source_taskDbModel).optional(), - task: source_taskDbModel.optional(), + tasks: z.array(adjustedSourceTaskDBModel).optional(), + task: adjustedSourceTaskDBModel.optional(), logs: z.string().optional(), }); From 4ce15f42be8c8b6cec017a2b4368d7299e1d6aed Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Fri, 11 Aug 2023 17:27:58 +0400 Subject: [PATCH 0145/1353] fix: active syncs quota impl --- webapps/ee-api/pages/api/quotas/sync.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/webapps/ee-api/pages/api/quotas/sync.ts b/webapps/ee-api/pages/api/quotas/sync.ts index a741a4e87..6ca0f4b59 100644 --- a/webapps/ee-api/pages/api/quotas/sync.ts +++ b/webapps/ee-api/pages/api/quotas/sync.ts @@ -1,6 +1,6 @@ import { NextApiRequest, NextApiResponse } from "next"; import { auth } from "../../../lib/auth"; -import { assertTrue, requireDefined } from "juava"; +import { assertTrue, getLog, requireDefined } from "juava"; import { withErrorHandler } from "../../../lib/error-handler"; import { getOrCreateCurrentSubscription } from "../../../lib/stripe"; import { pg as pgService } from "../../../lib/services"; @@ -39,14 +39,19 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse group by "workspaceId";`, { workspaceId } ); + getLog() + .atInfo() + .log(`Quota check for ${workspaceId}: ${JSON.stringify(res, null, 2)}`); if (res.length == 0) { return { ok: true }; } else { const activeSyncs = res[0].activeSyncs; - if (activeSyncs > freePlanLimitations.dailyActiveSyncs) { + if (activeSyncs >= freePlanLimitations.dailyActiveSyncs) { return { ok: false, - error: `Daily active syncs limit exceeded. Current: ${activeSyncs}, limit: ${freePlanLimitations.dailyActiveSyncs}. Last sync completed at: ${res[0].lastSync}`, + error: `Daily active syncs limit exceeded. Syncs in last 24 hours: ${activeSyncs}, limit: ${ + freePlanLimitations.dailyActiveSyncs + }. Last sync completed at: ${new Date(res[0].lastSync).toISOString()}`, }; } } From 01784e19a4b63a6d970a06b53a295e50fb9fda0b Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Fri, 11 Aug 2023 17:50:42 +0400 Subject: [PATCH 0146/1353] feat: syncs visual improvements --- .../PageLayout/WorkspacePageLayout.tsx | 2 ++ .../pages/[workspaceId]/syncs/index.tsx | 26 ++++++++++++++++--- .../pages/api/[workspaceId]/sources/run.ts | 2 ++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index 921b08f5f..0af5036bc 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -25,6 +25,7 @@ import { LayoutDashboard, Loader2, PlugZap, + ScrollText, SearchCode, Server, ServerCog, @@ -521,6 +522,7 @@ function PageHeader() { items: [ { title: "Connections", path: "/services", icon: }, { title: "Syncs", path: "/syncs", icon: }, + { title: "All Logs", path: "/syncs/tasks", icon: }, ], }, diff --git a/webapps/console/pages/[workspaceId]/syncs/index.tsx b/webapps/console/pages/[workspaceId]/syncs/index.tsx index dbcc4a065..d18595df9 100644 --- a/webapps/console/pages/[workspaceId]/syncs/index.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/index.tsx @@ -1,5 +1,5 @@ import { WorkspacePageLayout } from "../../../components/PageLayout/WorkspacePageLayout"; -import { useAppConfig, useWorkspace } from "../../../lib/context"; +import { useAppConfig, useWorkspace, WorkspaceContext } from "../../../lib/context"; import { get } from "../../../lib/useApi"; import { DestinationConfig, ServiceConfig } from "../../../lib/schema"; import { ConfigurationObjectLinkDbModel } from "../../../prisma/schema"; @@ -16,7 +16,7 @@ import { useLinksQuery } from "../../../lib/queries"; import { jsonSerializationBase64, useQueryStringState } from "../../../lib/useQueryStringState"; import { TableProps } from "antd/es/table/InternalTable"; import { ColumnType, SortOrder } from "antd/es/table/interface"; -import { CalendarCheckIcon, Edit3, Inbox, ListMinusIcon, Loader2, RefreshCw } from "lucide-react"; +import { CalendarCheckIcon, Edit3, ExternalLink, Inbox, ListMinusIcon, Loader2, RefreshCw } from "lucide-react"; import { PlusOutlined } from "@ant-design/icons"; import { WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; import { ErrorCard } from "../../../components/GlobalError/GlobalError"; @@ -31,6 +31,7 @@ import { ButtonGroup, ButtonProps } from "../../../components/ButtonGroup/Button import { Overlay } from "../../../components/Overlay/Overlay"; import { CodeBlock } from "../../../components/CodeBlock/CodeBlock"; import { processTaskStatus, TaskStatus } from "./tasks"; +import { WLink } from "../../../components/Workspace/WLink"; dayjs.extend(utc); dayjs.extend(relativeTime); @@ -73,6 +74,23 @@ type SortingSettings = { columns: { order: SortOrder; field: string }[]; }; +export function displayTaskRunError(workspace: WorkspaceContext, error: { error: string; errorType?: string }) { + if (error.errorType === "quota_exceeded") { + feedbackError( +
    +
    Quota exceeded
    +
    {error.error}
    + + Please, update your plan here {" "} + +
    , + { placement: "top" } + ); + } else { + feedbackError(error.error, { placement: "top" }); + } +} + function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEntitiesProps) { const servicesById = index(services, "id"); const destinationsById = index(destinations, "id"); @@ -215,7 +233,7 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt try { const runStatus = await rpc(`/api/${workspace.id}/sources/run?syncId=${link.id}`); if (runStatus?.error) { - feedbackError(runStatus.error, { placement: "top" }); + displayTaskRunError(workspace, runStatus); } else { router.push( `/${workspace.slug || workspace.id}/syncs/tasks?query=${encodeURIComponent( @@ -258,7 +276,7 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt try { const runStatus = await rpc(`/api/${workspace.id}/sources/run?syncId=${link.id}&fullSync=true`); if (runStatus?.error) { - feedbackError(runStatus.error, { placement: "top" }); + displayTaskRunError(workspace, runStatus); } else { router.push( `/${workspace.slug || workspace.id}/syncs/tasks?query=${encodeURIComponent( diff --git a/webapps/console/pages/api/[workspaceId]/sources/run.ts b/webapps/console/pages/api/[workspaceId]/sources/run.ts index bc7d3694b..e4a52c414 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/run.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/run.ts @@ -16,6 +16,7 @@ const log = getServerLog("sync-run"); const resultType = z.object({ ok: z.boolean(), error: z.string().optional(), + errorType: z.string().optional(), taskId: z.string().optional(), status: z.string().optional(), logs: z.string().optional(), @@ -82,6 +83,7 @@ async function checkQuota(opts: { return { ok: false, error: `Quota exceeded: ${quotaCheckResult.error}`, + errorType: "quota_exceeded", }; } } catch (e) { From 282b415ff19afe2565cb5b882bb57a567ad11614 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Fri, 11 Aug 2023 18:12:44 +0400 Subject: [PATCH 0147/1353] feat: don't fail sync tasks if EE server is down --- webapps/console/pages/api/[workspaceId]/sources/run.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/webapps/console/pages/api/[workspaceId]/sources/run.ts b/webapps/console/pages/api/[workspaceId]/sources/run.ts index e4a52c414..d6d3a33d4 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/run.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/run.ts @@ -88,10 +88,7 @@ async function checkQuota(opts: { } } catch (e) { log.atError().log("Error checking quota", e); - return { - ok: false, - error: `Quota server is not available`, - }; + //ignore this error and proceed with the run. If billing server is down, we don't want to spoil the user experience } } From 9798f91dcc452dded254618e274b2a2101abe3d1 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 15 Aug 2023 17:29:03 +0400 Subject: [PATCH 0148/1353] fix for rotor_topic_offsets metric --- services/rotor/src/lib/rotor.ts | 11 ++++++++--- .../components/ConfigObjectEditor/SchemaForm.tsx | 2 ++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/services/rotor/src/lib/rotor.ts b/services/rotor/src/lib/rotor.ts index 4f8f34b63..342d6af37 100644 --- a/services/rotor/src/lib/rotor.ts +++ b/services/rotor/src/lib/rotor.ts @@ -78,12 +78,17 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { const interval = setInterval(async () => { try { - const offsets = await admin.fetchTopicOffsets(kafkaTopic); - for (const o of offsets) { - topicOffsets.set({ partition: o.partition, offset: "offset" }, parseInt(o.offset)); + const watermarks = await admin.fetchTopicOffsets(kafkaTopic); + for (const o of watermarks) { topicOffsets.set({ partition: o.partition, offset: "high" }, parseInt(o.high)); topicOffsets.set({ partition: o.partition, offset: "low" }, parseInt(o.low)); } + const offsets = await admin.fetchOffsets({ groupId: cfg.consumerGroupId, topics: [kafkaTopic] }); + for (const o of offsets) { + for (const p of o.partitions) { + topicOffsets.set({ partition: p.partition, offset: "offset" }, parseInt(p.offset)); + } + } } catch (e) { log.atError().withCause(e).log("Failed to commit offsets"); } diff --git a/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx b/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx index c21f9f095..cfe5f57ee 100644 --- a/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx +++ b/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx @@ -210,6 +210,8 @@ export const SchemaForm: React.FC<{ const options = f.items?.enum ?? []; return ; } + default: + return ; } })()} From 493ddf329c9b45245da6da2eca5af4c69f8c1130 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 15 Aug 2023 17:32:11 +0400 Subject: [PATCH 0149/1353] fix for unused import --- services/rotor/src/lib/rotor.ts | 1 - webapps/console/pages/[workspaceId]/syncs/index.tsx | 1 - 2 files changed, 2 deletions(-) diff --git a/services/rotor/src/lib/rotor.ts b/services/rotor/src/lib/rotor.ts index 342d6af37..d9d77978c 100644 --- a/services/rotor/src/lib/rotor.ts +++ b/services/rotor/src/lib/rotor.ts @@ -75,7 +75,6 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { // add `as const` here to enforce label names labelNames: ["partition", "offset"] as const, }); - const interval = setInterval(async () => { try { const watermarks = await admin.fetchTopicOffsets(kafkaTopic); diff --git a/webapps/console/pages/[workspaceId]/syncs/index.tsx b/webapps/console/pages/[workspaceId]/syncs/index.tsx index d18595df9..08ec246d3 100644 --- a/webapps/console/pages/[workspaceId]/syncs/index.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/index.tsx @@ -31,7 +31,6 @@ import { ButtonGroup, ButtonProps } from "../../../components/ButtonGroup/Button import { Overlay } from "../../../components/Overlay/Overlay"; import { CodeBlock } from "../../../components/CodeBlock/CodeBlock"; import { processTaskStatus, TaskStatus } from "./tasks"; -import { WLink } from "../../../components/Workspace/WLink"; dayjs.extend(utc); dayjs.extend(relativeTime); From c7dd88fc2187c2c879e329b01a71a29a303debf0 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 15 Aug 2023 19:04:39 +0400 Subject: [PATCH 0150/1353] functions-chain: use pipeline to commit multiple redis logs meassure webhook time --- libs/core-functions/src/context.ts | 7 +++- services/rotor/src/index.ts | 2 +- services/rotor/src/lib/functions-chain.ts | 49 ++++++++++++++++++----- types/protocols/functions.d.ts | 4 ++ 4 files changed, 49 insertions(+), 13 deletions(-) diff --git a/libs/core-functions/src/context.ts b/libs/core-functions/src/context.ts index 465491f1c..c283aa38d 100644 --- a/libs/core-functions/src/context.ts +++ b/libs/core-functions/src/context.ts @@ -1,6 +1,6 @@ import { EventContext, EventsStore, FetchOpts, FullContext, Store, SystemContext } from "@jitsu/protocols/functions"; import nodeFetch, { RequestInit } from "node-fetch-commonjs"; -import { getErrorMessage, getLog } from "juava"; +import { getErrorMessage, getLog, stopwatch } from "juava"; import { httpAgent, httpsAgent } from "./functions/lib/http-agent"; const log = getLog("functions-context"); @@ -21,6 +21,8 @@ export function createFullContext( props: props, store: store, async fetch(url: string, init?: FetchOpts, logToRedis: boolean = true): Promise { + //capture execution time + const sw = stopwatch(); const baseInfo = { functionId: id, functionType: type, @@ -46,7 +48,7 @@ export function createFullContext( fetchResult = await nodeFetch(url, internalInit); } catch (err) { if (logToRedis) { - eventsStore.log(true, { ...baseInfo, error: getErrorMessage(err) }); + eventsStore.log(true, { ...baseInfo, error: getErrorMessage(err), elapsedMs: sw.elapsedMs() }); } throw err; } @@ -57,6 +59,7 @@ export function createFullContext( ...baseInfo, status: fetchResult.status, statusText: fetchResult.statusText, + elapsedMs: sw.elapsedMs(), response: await tryJson(cloned), }); } diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index a31bd49ee..21863c536 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -227,7 +227,7 @@ export async function rotorMessageHandler(_message: string | undefined) { event, createFullContext( metricsFunction.id, - redisLogger, + { log: async () => {} }, store, { headers: message.httpHeaders }, {}, diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index fe12d821a..2e5966ff3 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -1,5 +1,6 @@ import { AnyEvent, + BatchEventsStore, EventContext, EventsStore, FuncReturn, @@ -38,7 +39,7 @@ export async function runChain( chain: FuncChain, event: AnyEvent, connection: EnrichedConnectionConfig, - eventsStore: EventsStore, + batchEventsStore: BatchEventsStore, store: Store, eventContext: EventContext ): Promise { @@ -50,6 +51,13 @@ export async function runChain( const event = events[i]; let result: FuncReturn; const sw = stopwatch(); + const logs: { error: boolean; msg: Record }[] = []; + const eventsStore: EventsStore = { + log(error: boolean, msg: Record): Promise { + logs.push({ error, msg }); + return Promise.resolve(); + }, + }; const funcCtx = createFullContext(f.id, eventsStore, store, eventContext, f.context, f.config, event); try { result = await f.exec(event, funcCtx); @@ -63,6 +71,8 @@ export async function runChain( ms: sw.elapsedMs(), }); continue; + } finally { + await batchEventsStore.log(logs); } execLog.push({ eventIndex: i, @@ -83,18 +93,37 @@ export async function runChain( return execLog; } -export function createRedisLogger(redis: Redis, key: (err: boolean) => string, storeDebug): EventsStore { +export function createRedisLogger(redis: Redis, key: (err: boolean) => string, storeDebug): BatchEventsStore { return { - log: async (error, msg) => { + log: async (logs: { error: boolean; msg: Record }[]) => { try { - if (msg.type === "log-debug" && !storeDebug) { - return; + if (logs.length === 1) { + const msg = logs[0].msg; + const error = logs[0].error; + if (msg.type === "log-debug" && !storeDebug) { + return; + } + const logEntry = JSON.stringify({ timestamp: new Date().toISOString(), error, ...msg }); + if (error) { + await redis.xadd(key(true), "MAXLEN", "~", eventsLogSize, "*", "event", logEntry); + } + await redis.xadd(key(false), "MAXLEN", "~", eventsLogSize, "*", "event", logEntry); + } else { + const pipeline = redis.pipeline(); + for (const log of logs) { + const msg = log.msg; + const error = log.error; + if (msg.type === "log-debug" && !storeDebug) { + continue; + } + const logEntry = JSON.stringify({ timestamp: new Date().toISOString(), error, ...msg }); + if (error) { + pipeline.xadd(key(true), "MAXLEN", "~", eventsLogSize, "*", "event", logEntry); + } + pipeline.xadd(key(false), "MAXLEN", "~", eventsLogSize, "*", "event", logEntry); + } + await pipeline.exec(); } - const logEntry = JSON.stringify({ timestamp: new Date().toISOString(), error, ...msg }); - if (error) { - await redis.xadd(key(true), "MAXLEN", "~", eventsLogSize, "*", "event", logEntry); - } - await redis.xadd(key(false), "MAXLEN", "~", eventsLogSize, "*", "event", logEntry); } catch (e) { log.atError().withCause(e).log("Failed to put event to redis events log"); } diff --git a/types/protocols/functions.d.ts b/types/protocols/functions.d.ts index dfb566184..4514710d9 100644 --- a/types/protocols/functions.d.ts +++ b/types/protocols/functions.d.ts @@ -19,6 +19,10 @@ interface EventsStore { log(error: boolean, msg: Record): Promise; } +interface BatchEventsStore { + log(logs: { error: boolean; msg: Record }[]): Promise; +} + /** * A special properties that user can set on an event to define how * event will be processed further From 17048fb3ee9ceb93763b294a13e0148fa7e1ede9 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 15 Aug 2023 20:11:51 +0400 Subject: [PATCH 0151/1353] support for multithreaded mode for webhook destinations --- services/rotor/src/index.ts | 66 +++++++++++-------- .../ConnectionEditorPage.tsx | 22 +++++++ webapps/console/lib/schema/destinations.tsx | 11 +++- 3 files changed, 69 insertions(+), 30 deletions(-) diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index 21863c536..ed0a5ca23 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -208,36 +208,44 @@ export async function rotorMessageHandler(_message: string | undefined) { await redisClient.hdel(`store:${connection.id}`, key); }, }; - const execLog = await runChain(funcChain, event, connection, redisLogger, store, ctx); - - if (metricsFunction) { - const processedIdx = execLog.findIndex(l => !l.dropped && l.functionId.startsWith("builtin.destination.")); - if (processedIdx >= 0) { - const d = new Date(message.messageCreated); - d.setMilliseconds(0); - d.setSeconds(0); - const event = { - timestamp: d.toISOString(), - workspaceId: connection.workspaceId, - messageId: message.messageId, - JITSU_TABLE_NAME: "active_incoming", - }; - try { - await metricsFunction.exec( - event, - createFullContext( - metricsFunction.id, - { log: async () => {} }, - store, - { headers: message.httpHeaders }, - {}, - metricsFunction.config - ) - ); - } catch (e) { - log.atError().withCause(e).log("Failed to send metrics"); + const chainCallback = async () => + runChain(funcChain, event, connection, redisLogger, store, ctx).then(async execLog => { + if (metricsFunction) { + const processedIdx = execLog.findIndex(l => !l.dropped && l.functionId.startsWith("builtin.destination.")); + if (processedIdx >= 0) { + const d = new Date(message.messageCreated); + d.setMilliseconds(0); + d.setSeconds(0); + const event = { + timestamp: d.toISOString(), + workspaceId: connection.workspaceId, + messageId: message.messageId, + JITSU_TABLE_NAME: "active_incoming", + }; + try { + await metricsFunction.exec( + event, + createFullContext( + metricsFunction.id, + { + log: async () => {}, + }, + store, + { headers: message.httpHeaders }, + {}, + metricsFunction.config + ) + ); + } catch (e) { + log.atError().withCause(e).log("Failed to send metrics"); + } + } } - } + }); + if (connectionData.multithreading) { + queueMicrotask(chainCallback); + } else { + await chainCallback(); } } diff --git a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx index 9a1e95e0c..84e03a195 100644 --- a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx +++ b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx @@ -546,6 +546,28 @@ function ConnectionEditor({ ), }); } + if (hasZodFields(connectionOptionsZodType, "multithreading")) { + console.log("multithreading", connectionOptions.multithreading); + configItems.push({ + group: "Advanced", + documentation: ( + <> + Use multiple threads to send data to the endpoint. Faster, but doesn't guarantee order of events. Recommended + on high volumes of data. + + ), + name: "Multithreading", + component: ( + { + updateOptions({ multithreading: m }); + }} + /> + ), + }); + } if (hasZodFields(connectionOptionsZodType, "functions")) { for (const func of functions) { const functionId = "udf." + func.id; diff --git a/webapps/console/lib/schema/destinations.tsx b/webapps/console/lib/schema/destinations.tsx index dced5a6b0..ac8655d0f 100644 --- a/webapps/console/lib/schema/destinations.tsx +++ b/webapps/console/lib/schema/destinations.tsx @@ -656,7 +656,16 @@ export const coreDestinations: DestinationType[] = [ }, { id: "webhook", - connectionOptions: CloudDestinationsConnectionOptions, + connectionOptions: CloudDestinationsConnectionOptions.merge( + z.object({ + multithreading: z + .boolean() + .optional() + .describe( + "Multithreading::Use multiple threads to send data to the endpoint. Faster but doesn't guarantee order of events" + ), + }) + ), icon: webhookIcon, title: "Webhook", tags: "Special", From 457d7dade5786f03aff487eb0391ed12e1940353 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 15 Aug 2023 20:37:20 +0400 Subject: [PATCH 0152/1353] redis: enableAutoPipelining set to true --- webapps/console/lib/server/redis.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/webapps/console/lib/server/redis.ts b/webapps/console/lib/server/redis.ts index a7f29ab99..85fd19c66 100644 --- a/webapps/console/lib/server/redis.ts +++ b/webapps/console/lib/server/redis.ts @@ -35,6 +35,7 @@ function createRedis(): Redis { maxRetriesPerRequest: 3, tls: tls, lazyConnect: false, + enableAutoPipelining: true, }); redisClient.on("error", err => { log From dd54dcc7adbd1e2f258f7b2269845cd1a2d2fa8b Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 15 Aug 2023 20:42:28 +0400 Subject: [PATCH 0153/1353] fix redis: enableAutoPipelining set to true --- services/rotor/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index ed0a5ca23..2468c02d3 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -209,7 +209,7 @@ export async function rotorMessageHandler(_message: string | undefined) { }, }; const chainCallback = async () => - runChain(funcChain, event, connection, redisLogger, store, ctx).then(async execLog => { + await runChain(funcChain, event, connection, redisLogger, store, ctx).then(async execLog => { if (metricsFunction) { const processedIdx = execLog.findIndex(l => !l.dropped && l.functionId.startsWith("builtin.destination.")); if (processedIdx >= 0) { From 296e3c9626d72c9766f730002c1aa5d9fd4b480d Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 15 Aug 2023 20:50:34 +0400 Subject: [PATCH 0154/1353] fix active_incoming metric --- services/rotor/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index 2468c02d3..beffa2dbe 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -213,7 +213,7 @@ export async function rotorMessageHandler(_message: string | undefined) { if (metricsFunction) { const processedIdx = execLog.findIndex(l => !l.dropped && l.functionId.startsWith("builtin.destination.")); if (processedIdx >= 0) { - const d = new Date(message.messageCreated); + const d = new Date(); d.setMilliseconds(0); d.setSeconds(0); const event = { From 68ee689d14e387803eac2ea4345a04b2b7274159 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 15 Aug 2023 23:02:20 +0400 Subject: [PATCH 0155/1353] rotor 50% to perform message in async fashion --- services/rotor/src/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index beffa2dbe..7495e03b6 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -242,7 +242,8 @@ export async function rotorMessageHandler(_message: string | undefined) { } } }); - if (connectionData.multithreading) { + //50% chance + if (connectionData.multithreading && Math.random() < 0.5) { queueMicrotask(chainCallback); } else { await chainCallback(); From ca274bdde745728cccb013eb0ad27e2e3e16d309 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 15 Aug 2023 23:14:18 +0400 Subject: [PATCH 0156/1353] rotor 95% to perform message in async fashion --- services/rotor/src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index 7495e03b6..c838f039d 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -242,8 +242,8 @@ export async function rotorMessageHandler(_message: string | undefined) { } } }); - //50% chance - if (connectionData.multithreading && Math.random() < 0.5) { + //95% chance + if (connectionData.multithreading && Math.random() < 0.95) { queueMicrotask(chainCallback); } else { await chainCallback(); From 66dade831584c6ad2a307d357afff91507a781cf Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 16 Aug 2023 12:12:51 +0400 Subject: [PATCH 0157/1353] use batching for flushing metrics use DEBUG level for all functions log --- libs/core-functions/src/context.ts | 10 ++-- services/rotor/src/index.ts | 55 ++----------------- services/rotor/src/lib/metrics.ts | 88 ++++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+), 56 deletions(-) create mode 100644 services/rotor/src/lib/metrics.ts diff --git a/libs/core-functions/src/context.ts b/libs/core-functions/src/context.ts index c283aa38d..ebbf10edf 100644 --- a/libs/core-functions/src/context.ts +++ b/libs/core-functions/src/context.ts @@ -68,7 +68,7 @@ export function createFullContext( }, log: { debug: (message, ...args: any[]) => { - log.atDebug().log(`[CON:${eventContext.connection?.id}]: [f:${id}]: ${message}`, ...args); + log.atDebug().log(`[CON:${eventContext.connection?.id}]: [f:${id}][DEBUG]: ${message}`, ...args); eventsStore.log(false, { type: "log-debug", functionId: id, @@ -80,7 +80,7 @@ export function createFullContext( }); }, warn: (message, ...args: any[]) => { - log.atWarn().log(`[CON:${eventContext.connection?.id}]: [f:${id}]: ${message}`, ...args); + log.atDebug().log(`[CON:${eventContext.connection?.id}]: [f:${id}][WARN]: ${message}`, ...args); eventsStore.log(false, { type: "log-warn", functionId: id, @@ -101,7 +101,7 @@ export function createFullContext( args: args.map(a => `${a}`), }, }); - const l = log.atError(); + const l = log.atDebug(); if (args.length > 0) { const last = args[args.length - 1]; if (last.stack) { @@ -109,10 +109,10 @@ export function createFullContext( args = args.slice(0, args.length - 1); } } - l.log(`[CON:${eventContext.connection?.id}]: [f:${id}]: ${message}`, ...args); + l.log(`[CON:${eventContext.connection?.id}]: [f:${id}][ERROR]: ${message}`, ...args); }, info: (message, ...args: any[]) => { - log.atInfo().log(`[CON:${eventContext.connection?.id}]: [f:${id}]: ${message}`, ...args); + log.atDebug().log(`[CON:${eventContext.connection?.id}]: [f:${id}][INFO]: ${message}`, ...args); eventsStore.log(false, { type: "log-info", functionId: id, diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index c838f039d..0e51c42d7 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -27,6 +27,7 @@ import NodeCache from "node-cache"; import hash from "object-hash"; import { UDFRunHandler } from "./http/udf"; import Prometheus from "prom-client"; +import { metrics } from "./lib/metrics"; setServerJsonFormat(process.env.LOG_FORMAT === "json"); @@ -48,24 +49,6 @@ udfCache.on("del", (key, value) => { const rotorHttpPort = process.env.ROTOR_HTTP_PORT || process.env.PORT || 3401; const bulkerBase = requireDefined(process.env.BULKER_URL, "env BULKER_URL is not defined"); const bulkerAuthKey = requireDefined(process.env.BULKER_AUTH_KEY, "env BULKER_AUTH_KEY is not defined"); -const metricsDestinationId = process.env.METRICS_DESTINATION_ID; - -const metricsFunction: Func | undefined = metricsDestinationId - ? { - id: "builtin.destination.bulker", - config: { - bulkerEndpoint: bulkerBase, - destinationId: metricsDestinationId, - authToken: bulkerAuthKey, - dataLayout: "passthrough", - }, - exec: requireDefined( - getBuiltinFunction("builtin.destination.bulker"), - `Unknown function builtin.destination.bulker` - ) as JitsuFunction, - context: {}, - } - : undefined; const getCachedOrLoad = async (cache: NodeCache, key: string, loader: (key: string) => Promise) => { const cached = cache.get(key); @@ -210,40 +193,10 @@ export async function rotorMessageHandler(_message: string | undefined) { }; const chainCallback = async () => await runChain(funcChain, event, connection, redisLogger, store, ctx).then(async execLog => { - if (metricsFunction) { - const processedIdx = execLog.findIndex(l => !l.dropped && l.functionId.startsWith("builtin.destination.")); - if (processedIdx >= 0) { - const d = new Date(); - d.setMilliseconds(0); - d.setSeconds(0); - const event = { - timestamp: d.toISOString(), - workspaceId: connection.workspaceId, - messageId: message.messageId, - JITSU_TABLE_NAME: "active_incoming", - }; - try { - await metricsFunction.exec( - event, - createFullContext( - metricsFunction.id, - { - log: async () => {}, - }, - store, - { headers: message.httpHeaders }, - {}, - metricsFunction.config - ) - ); - } catch (e) { - log.atError().withCause(e).log("Failed to send metrics"); - } - } - } + await metrics().logMetrics(connection.workspaceId, message.messageId, execLog); }); - //95% chance - if (connectionData.multithreading && Math.random() < 0.95) { + //97% chance + if (connectionData.multithreading && Math.random() < 0.97) { queueMicrotask(chainCallback); } else { await chainCallback(); diff --git a/services/rotor/src/lib/metrics.ts b/services/rotor/src/lib/metrics.ts new file mode 100644 index 000000000..1775788dd --- /dev/null +++ b/services/rotor/src/lib/metrics.ts @@ -0,0 +1,88 @@ +import { getSingleton } from "juava"; +import { requireDefined } from "juava"; +import { getServerLog } from "@jitsu-internal/console/lib/server/log"; +import { FunctionExecLog } from "./functions-chain"; +import fetch from "node-fetch-commonjs"; +import { Readable } from "stream"; + +export const log = getServerLog("metrics"); + +const bulkerBase = requireDefined(process.env.BULKER_URL, "env BULKER_URL is not defined"); +const bulkerAuthKey = requireDefined(process.env.BULKER_AUTH_KEY, "env BULKER_AUTH_KEY is not defined"); +const metricsDestinationId = process.env.METRICS_DESTINATION_ID; +const metricsTable = "active_incoming"; +const max_batch_size = 10000; +const flush_interval_ms = 60000; + +export const metrics = getSingleton("metrics", createMetrics); + +type MetricsEvent = { + timestamp: string; + workspaceId: string; + messageId: string; +}; + +interface Metrics { + logMetrics: (workspaceId: string, messageId: string, execLog: FunctionExecLog) => Promise; +} + +function createMetrics(): Metrics { + const buffer: MetricsEvent[] = []; + + const flush = async () => { + //create readable stream + const stream = new Readable(); + const res = fetch(`${bulkerBase}/bulk/${metricsDestinationId}?tableName=${metricsTable}&mode=batch`, { + method: "POST", + headers: { Authorization: `Bearer ${bulkerAuthKey}` }, + body: stream, + }); + buffer.forEach(e => { + stream.push(JSON.stringify(e)); + stream.push("\n"); + }); + //close stream + stream.push(null); + res + .then(r => { + if (!r.ok) { + log.atError().log(`Failed to flush metrics events: ${r.status} ${r.statusText}`); + } + }) + .catch(e => { + log.atError().withCause(e).log(`Failed to flush metrics events`); + }); + buffer.length = 0; + }; + + setInterval(async () => { + if (buffer.length > 0) { + log.atInfo().log(`Periodic flushing ${buffer.length} metrics events`); + await flush(); + } + }, flush_interval_ms); + + return { + logMetrics: async (workspaceId: string, messageId: string, execLog: FunctionExecLog) => { + if (!metricsDestinationId) { + return; + } + const processedIdx = execLog.findIndex(l => !l.dropped && l.functionId.startsWith("builtin.destination.")); + if (processedIdx < 0) { + return; + } + const d = new Date(); + d.setMilliseconds(0); + d.setSeconds(0); + buffer.push({ + timestamp: d.toISOString(), + workspaceId, + messageId, + }); + if (buffer.length >= max_batch_size) { + log.atInfo().log(`Flushing ${buffer.length} metrics events`); + setImmediate(flush); + } + }, + }; +} From 42c0865159afa7256d32212cb6ffdd8a95d4a0e7 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 16 Aug 2023 15:14:43 +0400 Subject: [PATCH 0158/1353] rotor: consume from 2 topics (added destination-messages-mt) rotor: properly handle devnull destination --- libs/core-functions/src/index.ts | 1 + services/rotor/src/index.ts | 7 +++-- services/rotor/src/lib/functions-chain.ts | 9 ++++-- services/rotor/src/lib/rotor.ts | 32 ++++++++++++---------- types/protocols/functions.d.ts | 2 +- webapps/console/lib/server/kafka-config.ts | 8 ++++++ 6 files changed, 38 insertions(+), 21 deletions(-) diff --git a/libs/core-functions/src/index.ts b/libs/core-functions/src/index.ts index e4c8e2d75..c424e6e28 100644 --- a/libs/core-functions/src/index.ts +++ b/libs/core-functions/src/index.ts @@ -23,6 +23,7 @@ const builtinDestinations: Record "builtin.destination.webhook": WebhookDestination as JitsuFunction, "builtin.destination.posthog": PosthogDestination as JitsuFunction, "builtin.destination.mongodb": MongodbDestination as JitsuFunction, + "builtin.destination.devnull": () => null, } as const; const builtinTransformations: Record = { diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index 0e51c42d7..50677f901 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -6,6 +6,7 @@ disableService("pg"); import { connectToKafka, destinationMessagesTopic, + destinationMessagesTopicMultiThreaded, getCredentialsFromEnv, rotorConsumerGroupId, } from "@jitsu-internal/console/lib/server/kafka-config"; @@ -274,11 +275,11 @@ async function main() { log.atInfo().log(`Received message: ${message.value}`); await consumer.disconnect(); } else { - const kafkaTopic = destinationMessagesTopic(); + const kafkaTopics = [destinationMessagesTopic(), destinationMessagesTopicMultiThreaded()]; const consumerGroupId = rotorConsumerGroupId(); const rotor = kafkaRotor({ credentials: getCredentialsFromEnv(), - kafkaTopic, + kafkaTopics: kafkaTopics, consumerGroupId, maxSecondsInQueueAfterFailure: retrySettings.maxMinutesInQueue * 60, handle: rotorMessageHandler, @@ -289,7 +290,7 @@ async function main() { rotor .start() .then(() => { - log.atInfo().log(`Kafka processing started. Listening for topic ${kafkaTopic} with group ${consumerGroupId}`); + log.atInfo().log(`Kafka processing started. Listening for topics ${kafkaTopics} with group ${consumerGroupId}`); http.get("/health", (req, res) => { res.send("OK"); }); diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index 2e5966ff3..b7936753f 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -78,11 +78,12 @@ export async function runChain( eventIndex: i, functionId: f.id, ms: sw.elapsedMs(), - dropped: result === "drop" || (Array.isArray(result) && result.length === 0), + dropped: isDropResult(result), }); - if (result === "drop" || (Array.isArray(result) && result.length === 0)) { + if (isDropResult(result)) { return execLog; } else if (result) { + // @ts-ignore newEvents.push(...(Array.isArray(result) ? result : [result])); } else { newEvents.push(event); @@ -93,6 +94,10 @@ export async function runChain( return execLog; } +function isDropResult(result: FuncReturn): boolean { + return result === "drop" || (Array.isArray(result) && result.length === 0) || result === null || result === false; +} + export function createRedisLogger(redis: Redis, key: (err: boolean) => string, storeDebug): BatchEventsStore { return { log: async (logs: { error: boolean; msg: Record }[]) => { diff --git a/services/rotor/src/lib/rotor.ts b/services/rotor/src/lib/rotor.ts index d9d77978c..6da04e488 100644 --- a/services/rotor/src/lib/rotor.ts +++ b/services/rotor/src/lib/rotor.ts @@ -1,5 +1,5 @@ import { getLog } from "juava"; -import { connectToKafka, KafkaCredentials } from "@jitsu-internal/console/lib/server/kafka-config"; +import { connectToKafka, deatLetterTopic, KafkaCredentials } from "@jitsu-internal/console/lib/server/kafka-config"; import Prometheus from "prom-client"; const log = getLog("kafka-rotor"); @@ -41,7 +41,7 @@ async function withRetries(f: () => Promise, opts: { maxRetries?: number; export type KafkaRotorConfig = { credentials: KafkaCredentials; consumerGroupId: string; - kafkaTopic?: string; + kafkaTopics: string[]; kafkaClientId?: string; maxSecondsInQueueAfterFailure?: number; handle: (message: string) => Promise; @@ -56,13 +56,13 @@ function shouldReturnToQueue(firstProcessed: Date, maxSecondsInQueueAfterFailure } export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { - const { kafkaTopic = "incoming-queue", kafkaClientId = "kafka-rotor", maxSecondsInQueueAfterFailure = 3600 } = cfg; + const { kafkaTopics, kafkaClientId = "kafka-rotor", maxSecondsInQueueAfterFailure = 3600 } = cfg; return { start: async () => { const kafka = connectToKafka({ defaultAppId: kafkaClientId, ...cfg.credentials }); const consumer = kafka.consumer({ groupId: cfg.consumerGroupId, allowAutoTopicCreation: false }); await consumer.connect(); - await consumer.subscribe({ topic: kafkaTopic, fromBeginning: true }); + await consumer.subscribe({ topics: kafkaTopics, fromBeginning: true }); const producer = kafka.producer({ allowAutoTopicCreation: false }); await producer.connect(); @@ -70,22 +70,24 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { const admin = kafka.admin(); const topicOffsets = new Prometheus.Gauge({ - name: "rotor_topic_offsets", + name: "rotor_topic_offsets2", help: "topic offsets", // add `as const` here to enforce label names - labelNames: ["partition", "offset"] as const, + labelNames: ["topic", "partition", "offset"] as const, }); const interval = setInterval(async () => { try { - const watermarks = await admin.fetchTopicOffsets(kafkaTopic); - for (const o of watermarks) { - topicOffsets.set({ partition: o.partition, offset: "high" }, parseInt(o.high)); - topicOffsets.set({ partition: o.partition, offset: "low" }, parseInt(o.low)); + for (const topic of kafkaTopics) { + const watermarks = await admin.fetchTopicOffsets(topic); + for (const o of watermarks) { + topicOffsets.set({ topic: topic, partition: o.partition, offset: "high" }, parseInt(o.high)); + topicOffsets.set({ topic: topic, partition: o.partition, offset: "low" }, parseInt(o.low)); + } } - const offsets = await admin.fetchOffsets({ groupId: cfg.consumerGroupId, topics: [kafkaTopic] }); + const offsets = await admin.fetchOffsets({ groupId: cfg.consumerGroupId, topics: kafkaTopics }); for (const o of offsets) { for (const p of o.partitions) { - topicOffsets.set({ partition: p.partition, offset: "offset" }, parseInt(p.offset)); + topicOffsets.set({ topic: o.topic, partition: p.partition, offset: "offset" }, parseInt(p.offset)); } } } catch (e) { @@ -96,7 +98,7 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { await consumer.run({ autoCommit: true, partitionsConsumedConcurrently: 4, - eachMessage: async ({ message }) => { + eachMessage: async ({ message, topic }) => { const firstProcessed = message.headers?.firstProcessed ? new Date(message.headers?.firstProcessed.toString()) : new Date(); @@ -125,10 +127,10 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { : "Message will be sent to dead-letter queue" }: ${message.value}` ); - const topic = returnToQueue ? kafkaTopic : kafkaTopic + "-dead-letter"; + const requeueTopic = returnToQueue ? topic : deatLetterTopic(); try { await producer.send({ - topic, + topic: requeueTopic, messages: [ { value: message.value, diff --git a/types/protocols/functions.d.ts b/types/protocols/functions.d.ts index 4514710d9..73ada249e 100644 --- a/types/protocols/functions.d.ts +++ b/types/protocols/functions.d.ts @@ -115,7 +115,7 @@ export type FullContext

    = EventContext & //equivalent to returning [] from a function export type FunctionCommand = "drop"; -export type FuncReturn = AnyEvent[] | AnyEvent | null | undefined | FunctionCommand; +export type FuncReturn = AnyEvent[] | AnyEvent | null | undefined | FunctionCommand | false; export interface JitsuFunction { (event: E, ctx: FullContext

    ): Promise | FuncReturn; diff --git a/webapps/console/lib/server/kafka-config.ts b/webapps/console/lib/server/kafka-config.ts index 92628a200..c4f136dbe 100644 --- a/webapps/console/lib/server/kafka-config.ts +++ b/webapps/console/lib/server/kafka-config.ts @@ -74,6 +74,14 @@ export function destinationMessagesTopic(): string { return process.env.KAFKA_DESTINATIONS_TOPIC_NAME || "destination-messages"; } +export function deatLetterTopic(): string { + return process.env.KAFKA_DESTINATIONS_DEAD_LETTER_TOPIC_NAME || "destination-messages-dead-letter"; +} + +export function destinationMessagesTopicMultiThreaded(): string { + return process.env.KAFKA_DESTINATIONS_MT_TOPIC_NAME || "destination-messages-mt"; +} + export function rotorConsumerGroupId(): string { return process.env.KAFKA_CONSUMER_GROUP_ID !== undefined ? process.env.KAFKA_CONSUMER_GROUP_ID.replace("$random", randomId(5)) From 7269fbf3dcf91b7911bf53c783709132f079aa92 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 16 Aug 2023 16:33:14 +0400 Subject: [PATCH 0159/1353] console: enable multhithreading option for all functions based destinations --- webapps/console/lib/schema/destinations.tsx | 34 ++++++++++----------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/webapps/console/lib/schema/destinations.tsx b/webapps/console/lib/schema/destinations.tsx index ac8655d0f..ea56362e6 100644 --- a/webapps/console/lib/schema/destinations.tsx +++ b/webapps/console/lib/schema/destinations.tsx @@ -95,6 +95,13 @@ export const CloudDestinationsConnectionOptions = z.object({ }); export type CloudDestinationsConnectionOptions = z.infer; +export const FunctionsBasedDestinationsConnectionOptions = CloudDestinationsConnectionOptions.merge( + z.object({ + multithreading: z.boolean().optional(), + }) +); +export type FunctionsBasedDestinationsConnectionOptions = z.infer; + //Auxiliary type for batch mode options export const BatchModeOptions = z.object({ batchSize: z.number().min(1).optional(), @@ -560,7 +567,7 @@ export const coreDestinations: DestinationType[] = [ icon: mixpanelIcon, title: "Mixpanel", tags: "Product Analytics", - connectionOptions: CloudDestinationsConnectionOptions, + connectionOptions: FunctionsBasedDestinationsConnectionOptions, credentials: meta.MixpanelCredentials, credentialsUi: meta.MixpanelCredentialsUi, description: "Mixpanel is a product analytics platform that provides insights into user behavior.", @@ -570,7 +577,7 @@ export const coreDestinations: DestinationType[] = [ icon: juneIcon, title: "June.so", tags: "Product Analytics", - connectionOptions: CloudDestinationsConnectionOptions, + connectionOptions: FunctionsBasedDestinationsConnectionOptions, credentials: meta.JuneCredentials, description: "June.so is a product analytics platform that provides insights into user behavior.", }, @@ -579,7 +586,7 @@ export const coreDestinations: DestinationType[] = [ icon: mongodbIcon, title: "MongoDB", tags: "Datawarehouse", - connectionOptions: CloudDestinationsConnectionOptions, + connectionOptions: FunctionsBasedDestinationsConnectionOptions, credentials: meta.MongodbDestinationConfig, credentialsUi: meta.MongodbDestinationConfigUi, description: @@ -590,7 +597,7 @@ export const coreDestinations: DestinationType[] = [ icon: ga4Icon, title: "Google Analytics 4", tags: "Product Analytics", - connectionOptions: CloudDestinationsConnectionOptions, + connectionOptions: FunctionsBasedDestinationsConnectionOptions, credentials: meta.Ga4Credentials, description: "Google Analytics 4 is a service offered by Google that reports website traffic data and marketing trends.", @@ -600,7 +607,7 @@ export const coreDestinations: DestinationType[] = [ icon: posthogIcon, title: "Posthog", tags: "Product Analytics", - connectionOptions: CloudDestinationsConnectionOptions, + connectionOptions: FunctionsBasedDestinationsConnectionOptions, credentials: meta.PosthogDestinationConfig, description: "Posthog is an open-source product analytics tool. Jitsu supports both self-hosted Posthog and Posthog Cloud.", @@ -608,7 +615,7 @@ export const coreDestinations: DestinationType[] = [ { id: "amplitude", icon: amplitudeIcon, - connectionOptions: CloudDestinationsConnectionOptions, + connectionOptions: FunctionsBasedDestinationsConnectionOptions, title: "Amplitude", tags: "Product Analytics", comingSoon: true, @@ -621,7 +628,7 @@ export const coreDestinations: DestinationType[] = [ id: "hubspot", icon: hubspotIcon, comingSoon: true, - connectionOptions: CloudDestinationsConnectionOptions, + connectionOptions: FunctionsBasedDestinationsConnectionOptions, title: "Hubspot", tags: "CRM", credentials: z.object({ @@ -642,7 +649,7 @@ export const coreDestinations: DestinationType[] = [ }, { id: "segment-proxy", - connectionOptions: CloudDestinationsConnectionOptions, + connectionOptions: FunctionsBasedDestinationsConnectionOptions, icon: segmentIcon, title: "Segment", tags: "Special", @@ -656,16 +663,7 @@ export const coreDestinations: DestinationType[] = [ }, { id: "webhook", - connectionOptions: CloudDestinationsConnectionOptions.merge( - z.object({ - multithreading: z - .boolean() - .optional() - .describe( - "Multithreading::Use multiple threads to send data to the endpoint. Faster but doesn't guarantee order of events" - ), - }) - ), + connectionOptions: FunctionsBasedDestinationsConnectionOptions, icon: webhookIcon, title: "Webhook", tags: "Special", From 2dba1d243cee85364d283a874481d75d4c565e47 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 16 Aug 2023 18:31:31 +0400 Subject: [PATCH 0160/1353] console: enable multhithreading option for all cloud destinations --- webapps/console/lib/schema/destinations.tsx | 26 ++++++++------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/webapps/console/lib/schema/destinations.tsx b/webapps/console/lib/schema/destinations.tsx index ea56362e6..28137b508 100644 --- a/webapps/console/lib/schema/destinations.tsx +++ b/webapps/console/lib/schema/destinations.tsx @@ -92,16 +92,10 @@ export type SchemaUI = Record; //Options of any source -> destination connection that are not specific to any particular destination export const CloudDestinationsConnectionOptions = z.object({ functions: z.array(z.object({ functionId: z.string(), functionOptions: z.any() })).optional(), + multithreading: z.boolean().optional(), }); export type CloudDestinationsConnectionOptions = z.infer; -export const FunctionsBasedDestinationsConnectionOptions = CloudDestinationsConnectionOptions.merge( - z.object({ - multithreading: z.boolean().optional(), - }) -); -export type FunctionsBasedDestinationsConnectionOptions = z.infer; - //Auxiliary type for batch mode options export const BatchModeOptions = z.object({ batchSize: z.number().min(1).optional(), @@ -567,7 +561,7 @@ export const coreDestinations: DestinationType[] = [ icon: mixpanelIcon, title: "Mixpanel", tags: "Product Analytics", - connectionOptions: FunctionsBasedDestinationsConnectionOptions, + connectionOptions: CloudDestinationsConnectionOptions, credentials: meta.MixpanelCredentials, credentialsUi: meta.MixpanelCredentialsUi, description: "Mixpanel is a product analytics platform that provides insights into user behavior.", @@ -577,7 +571,7 @@ export const coreDestinations: DestinationType[] = [ icon: juneIcon, title: "June.so", tags: "Product Analytics", - connectionOptions: FunctionsBasedDestinationsConnectionOptions, + connectionOptions: CloudDestinationsConnectionOptions, credentials: meta.JuneCredentials, description: "June.so is a product analytics platform that provides insights into user behavior.", }, @@ -586,7 +580,7 @@ export const coreDestinations: DestinationType[] = [ icon: mongodbIcon, title: "MongoDB", tags: "Datawarehouse", - connectionOptions: FunctionsBasedDestinationsConnectionOptions, + connectionOptions: CloudDestinationsConnectionOptions, credentials: meta.MongodbDestinationConfig, credentialsUi: meta.MongodbDestinationConfigUi, description: @@ -597,7 +591,7 @@ export const coreDestinations: DestinationType[] = [ icon: ga4Icon, title: "Google Analytics 4", tags: "Product Analytics", - connectionOptions: FunctionsBasedDestinationsConnectionOptions, + connectionOptions: CloudDestinationsConnectionOptions, credentials: meta.Ga4Credentials, description: "Google Analytics 4 is a service offered by Google that reports website traffic data and marketing trends.", @@ -607,7 +601,7 @@ export const coreDestinations: DestinationType[] = [ icon: posthogIcon, title: "Posthog", tags: "Product Analytics", - connectionOptions: FunctionsBasedDestinationsConnectionOptions, + connectionOptions: CloudDestinationsConnectionOptions, credentials: meta.PosthogDestinationConfig, description: "Posthog is an open-source product analytics tool. Jitsu supports both self-hosted Posthog and Posthog Cloud.", @@ -615,7 +609,7 @@ export const coreDestinations: DestinationType[] = [ { id: "amplitude", icon: amplitudeIcon, - connectionOptions: FunctionsBasedDestinationsConnectionOptions, + connectionOptions: CloudDestinationsConnectionOptions, title: "Amplitude", tags: "Product Analytics", comingSoon: true, @@ -628,7 +622,7 @@ export const coreDestinations: DestinationType[] = [ id: "hubspot", icon: hubspotIcon, comingSoon: true, - connectionOptions: FunctionsBasedDestinationsConnectionOptions, + connectionOptions: CloudDestinationsConnectionOptions, title: "Hubspot", tags: "CRM", credentials: z.object({ @@ -649,7 +643,7 @@ export const coreDestinations: DestinationType[] = [ }, { id: "segment-proxy", - connectionOptions: FunctionsBasedDestinationsConnectionOptions, + connectionOptions: CloudDestinationsConnectionOptions, icon: segmentIcon, title: "Segment", tags: "Special", @@ -663,7 +657,7 @@ export const coreDestinations: DestinationType[] = [ }, { id: "webhook", - connectionOptions: FunctionsBasedDestinationsConnectionOptions, + connectionOptions: CloudDestinationsConnectionOptions, icon: webhookIcon, title: "Webhook", tags: "Special", From 329ea9fffa043cb37af114fc0640413ac4cc0698 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 16 Aug 2023 20:05:43 +0400 Subject: [PATCH 0161/1353] Added batchSize connection option --- .../ConnectionEditorPage.tsx | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx index 84e03a195..fa540c445 100644 --- a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx +++ b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx @@ -381,6 +381,26 @@ function ConnectionEditor({ /> ), }); + configItems.push({ + name: "Max Batch Size", + documentation: ( + <> + Maximum number of events to send in one batch. If there are more events in queue than 'Batch Size', events + will be sent as a consequence of batches with provided size. + + ), + component: ( + updateOptions({ batchSize: batchSize ?? 10000 })} + /> + ), + }); } if (hasZodFields(connectionOptionsZodType, "dataLayout")) { configItems.push({ From f8918559d92dd9b689540cfb21f77fab38446f81 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 17 Aug 2023 13:41:10 +0400 Subject: [PATCH 0162/1353] rotor: async events log service --- services/rotor/src/lib/functions-chain.ts | 94 +++++++++++++---------- types/protocols/functions.d.ts | 5 -- 2 files changed, 55 insertions(+), 44 deletions(-) diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index b7936753f..c7720fa63 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -1,6 +1,5 @@ import { AnyEvent, - BatchEventsStore, EventContext, EventsStore, FuncReturn, @@ -39,7 +38,7 @@ export async function runChain( chain: FuncChain, event: AnyEvent, connection: EnrichedConnectionConfig, - batchEventsStore: BatchEventsStore, + eventsStore: EventsStore, store: Store, eventContext: EventContext ): Promise { @@ -51,13 +50,6 @@ export async function runChain( const event = events[i]; let result: FuncReturn; const sw = stopwatch(); - const logs: { error: boolean; msg: Record }[] = []; - const eventsStore: EventsStore = { - log(error: boolean, msg: Record): Promise { - logs.push({ error, msg }); - return Promise.resolve(); - }, - }; const funcCtx = createFullContext(f.id, eventsStore, store, eventContext, f.context, f.config, event); try { result = await f.exec(event, funcCtx); @@ -71,8 +63,6 @@ export async function runChain( ms: sw.elapsedMs(), }); continue; - } finally { - await batchEventsStore.log(logs); } execLog.push({ eventIndex: i, @@ -98,37 +88,63 @@ function isDropResult(result: FuncReturn): boolean { return result === "drop" || (Array.isArray(result) && result.length === 0) || result === null || result === false; } -export function createRedisLogger(redis: Redis, key: (err: boolean) => string, storeDebug): BatchEventsStore { +export function createRedisLogger(redis: Redis, key: (err: boolean) => string, storeDebug): EventsStore { + const buffer: Record = {}; + + const put = (key: string, logEntry: string) => { + let buf = buffer[key]; + if (!buf) { + buffer[key] = buf = []; + } + if (buf.length < eventsLogSize) { + buf.push(logEntry); + } + }; + + const flush = async () => { + if (Object.keys(buffer).length === 0) { + return; + } + try { + const pipeline = redis.pipeline(); + for (const [key, buf] of Object.entries(buffer)) { + for (let i = 0; i < buf.length; i++) { + const logEntry = buf[i]; + if (i == buf.length - 1) { + log.atDebug().log(`Posting ${buf.length} events to stream [${key}]`); + pipeline.xadd(key, "MAXLEN", "~", eventsLogSize, "*", "event", logEntry); + } else { + pipeline.xadd(key, "*", "event", logEntry); + } + } + } + await pipeline.exec(); + for (const key in buffer) { + delete buffer[key]; + } + } catch (e) { + log.atError().withCause(e).log(`Failed to flush events logs to redis`); + } + }; + + setInterval(async () => { + if (Object.keys(buffer).length === 0) { + return; + } + await flush(); + }, 5000); + return { - log: async (logs: { error: boolean; msg: Record }[]) => { + log: async (error, msg) => { try { - if (logs.length === 1) { - const msg = logs[0].msg; - const error = logs[0].error; - if (msg.type === "log-debug" && !storeDebug) { - return; - } - const logEntry = JSON.stringify({ timestamp: new Date().toISOString(), error, ...msg }); - if (error) { - await redis.xadd(key(true), "MAXLEN", "~", eventsLogSize, "*", "event", logEntry); - } - await redis.xadd(key(false), "MAXLEN", "~", eventsLogSize, "*", "event", logEntry); - } else { - const pipeline = redis.pipeline(); - for (const log of logs) { - const msg = log.msg; - const error = log.error; - if (msg.type === "log-debug" && !storeDebug) { - continue; - } - const logEntry = JSON.stringify({ timestamp: new Date().toISOString(), error, ...msg }); - if (error) { - pipeline.xadd(key(true), "MAXLEN", "~", eventsLogSize, "*", "event", logEntry); - } - pipeline.xadd(key(false), "MAXLEN", "~", eventsLogSize, "*", "event", logEntry); - } - await pipeline.exec(); + if (msg.type === "log-debug" && !storeDebug) { + return; + } + const logEntry = JSON.stringify({ timestamp: new Date().toISOString(), error, ...msg }); + if (error) { + put(key(true), logEntry); } + put(key(false), logEntry); } catch (e) { log.atError().withCause(e).log("Failed to put event to redis events log"); } diff --git a/types/protocols/functions.d.ts b/types/protocols/functions.d.ts index 73ada249e..0ad042db4 100644 --- a/types/protocols/functions.d.ts +++ b/types/protocols/functions.d.ts @@ -18,11 +18,6 @@ interface Store { interface EventsStore { log(error: boolean, msg: Record): Promise; } - -interface BatchEventsStore { - log(logs: { error: boolean; msg: Record }[]): Promise; -} - /** * A special properties that user can set on an event to define how * event will be processed further From e04790418e91dfe020af1f26074df410f6c50106 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Thu, 17 Aug 2023 15:09:42 +0400 Subject: [PATCH 0163/1353] Detect geo context based on headers from Vercel - PR#1028 Detect geo context based on headers from Vercel - PR#1028 --- services/rotor/src/index.ts | 34 ++++++++--- services/rotor/src/lib/eu.ts | 35 +++++++++++ types/protocols/async-request.d.ts | 2 + types/protocols/functions.d.ts | 94 +++++++++++++++++++++++++++++- 4 files changed, 157 insertions(+), 8 deletions(-) create mode 100644 services/rotor/src/lib/eu.ts diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index 50677f901..222a52277 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -1,8 +1,4 @@ import { disableService, getLog, newError, randomId, requireDefined, setServerJsonFormat } from "juava"; - -disableService("prisma"); -disableService("pg"); - import { connectToKafka, destinationMessagesTopic, @@ -19,9 +15,9 @@ import minimist from "minimist"; import { glob } from "glob"; import fs from "fs"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; -import { createRedisLogger, Func, FuncChain, runChain } from "./lib/functions-chain"; -import { createFullContext, getBuiltinFunction, mongoAnonymousEventsStore, UDFWrapper } from "@jitsu/core-functions"; -import { EventContext, JitsuFunction, Store, SystemContext } from "@jitsu/protocols/functions"; +import { createRedisLogger, FuncChain, runChain } from "./lib/functions-chain"; +import { getBuiltinFunction, mongoAnonymousEventsStore, UDFWrapper } from "@jitsu/core-functions"; +import { EventContext, Geo, JitsuFunction, Store, SystemContext } from "@jitsu/protocols/functions"; import { redis } from "@jitsu-internal/console/lib/server/redis"; import express from "express"; import NodeCache from "node-cache"; @@ -29,6 +25,10 @@ import hash from "object-hash"; import { UDFRunHandler } from "./http/udf"; import Prometheus from "prom-client"; import { metrics } from "./lib/metrics"; +import { isEU } from "./lib/eu"; + +disableService("prisma"); +disableService("pg"); setServerJsonFormat(process.env.LOG_FORMAT === "json"); @@ -61,6 +61,25 @@ const getCachedOrLoad = async (cache: NodeCache, key: string, loader: (key: stri return loaded; }; +function fromHeaders(httpHeaders: Record): Geo { + const country = httpHeaders["x-vercel-ip-country"]; + const region = httpHeaders["x-vercel-ip-country-region"]; + const city = httpHeaders["x-vercel-ip-city"]; + const lat = httpHeaders["x-vercel-ip-latitude"]; + const lon = httpHeaders["x-vercel-ip-longitude"]; + return { + country: country + ? { + code: country, + isEU: isEU(country), + } + : undefined, + city: city ? { name: city } : undefined, + region: region ? { code: region } : undefined, + location: lat && lon ? { latitude: parseFloat(lat), longitude: parseFloat(lon) } : undefined, + }; +} + export async function rotorMessageHandler(_message: string | undefined) { if (!_message) { return; @@ -158,6 +177,7 @@ export async function rotorMessageHandler(_message: string | undefined) { const event = message.httpPayload as AnalyticsServerEvent; const ctx: EventContext = { headers: message.httpHeaders, + geo: message.geo || fromHeaders(message.httpHeaders), source: { id: connection.streamId, domain: message.origin?.domain, diff --git a/services/rotor/src/lib/eu.ts b/services/rotor/src/lib/eu.ts new file mode 100644 index 000000000..6ac9879b6 --- /dev/null +++ b/services/rotor/src/lib/eu.ts @@ -0,0 +1,35 @@ +const _euCountryCodes = [ + "AT", // Austria + "BE", // Belgium + "BG", // Bulgaria + "CY", // Cyprus + "CZ", // Czech Republic + "DE", // Germany + "DK", // Denmark + "EE", // Estonia + "ES", // Spain + "FI", // Finland + "FR", // France + "GR", // Greece + "HR", // Croatia + "HU", // Hungary + "IE", // Ireland + "IT", // Italy + "LT", // Lithuania + "LU", // Luxembourg + "LV", // Latvia + "MT", // Malta + "NL", // Netherlands + "PL", // Poland + "PT", // Portugal + "RO", // Romania + "SE", // Sweden + "SI", // Slovenia + "SK", // Slovakia +]; + +export const euCountryCodes = new Set(_euCountryCodes); + +export function isEU(countryCode: string): boolean { + return euCountryCodes.has(countryCode.toUpperCase()); +} diff --git a/types/protocols/async-request.d.ts b/types/protocols/async-request.d.ts index b7b0e9f29..55933617f 100644 --- a/types/protocols/async-request.d.ts +++ b/types/protocols/async-request.d.ts @@ -1,8 +1,10 @@ import { ISO8601Date } from "./iso8601"; +import { Geo } from "./functions"; export type IngestType = "s2s" | "browser"; export type IngestMessage = { + geo?: Geo; ingestType: IngestType; messageCreated: ISO8601Date; writeKey: string; diff --git a/types/protocols/functions.d.ts b/types/protocols/functions.d.ts index 0ad042db4..76b1d38a2 100644 --- a/types/protocols/functions.d.ts +++ b/types/protocols/functions.d.ts @@ -1,5 +1,4 @@ import { AnalyticsServerEvent } from "./analytics"; -import { RequestOptions } from "http"; export type SetOpts = { ttlMs?: number } | { ttlSec?: number }; @@ -55,6 +54,27 @@ export type FunctionContext = { store: Store; }; +export type PrivacyOpts = { + /** + * IP address processing mode + * "keep" means that the IP address will be kept as is + * "reduce" means that the IP address will be reduced to the first 3 octets + * "hash" means that the IP address will be hashed with SHA256 (not implemented yet) + * + * "reduce" is the default behavior + */ + ip?: "reduce" | "keep" | "hash"; + /** + * Replaces cookie based anonymous ID with a fingerprint hash + * "hash1" means that anyonymous ID will be replaced with hash(ip + user_agent) + */ + anonymousId?: "hash1" | "keep" | ((opts: { ip: string; ip3octets: string; userAgent: string }) => string); +}; + +export type CoreLib = { + privacy(event: AnalyticsServerEvent, opts?: PrivacyOpts): AnalyticsServerEvent; +}; + export type AnonymousEventsStore = { addEvent(collectionName: string, anonymousId: string, event: AnalyticsServerEvent, ttlDays: number): Promise; evictEvents(collectionName: string, anonymousId: string): Promise; @@ -69,7 +89,79 @@ export type SystemContext = { }; }; +export type WithConfidence = T & { + //A value from 0-100 indicating how confident we are in the result + confidence?: number; +}; + +export type Geo = { + /** + * IP address of the incoming request + */ + continent?: { + code: "AF" | "AN" | "AS" | "EU" | "NA" | "OC" | "SA"; + }; + country?: { + /** + * Two-letter country code (ISO 3166-1 alpha-2): https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 + */ + code: string; + isEU: boolean; + }; + region?: WithConfidence<{ + /** + * Code of the region (ISO 3166-2): https://en.wikipedia.org/wiki/ISO_3166-2. + * For USA it's two-letter capitaluzed state code (such as NY) + */ + code: string; + }>; + city?: WithConfidence<{ + name: string; + }>; + + postalCode?: WithConfidence<{ + code: string; + }>; + + location?: { + latitude: number; + longitude: number; + accuracyRadius?: number; + /** + * Only for USA locations + */ + usaData?: { + populationDensity?: number; + metroCode?: number; + averageIncome?: number; + }; + }; + provider?: { + /** + * Autonomous system number + */ + as?: { + num: number; + name?: string; + }; + connectionType?: string; + domain: string; + isAnonymousVpn?: boolean; + isHostingProvider?: boolean; + isLegitimateProxy?: boolean; + isPublicProxy?: boolean; + isResidentialProxy?: boolean; + isTorExitNode?: boolean; + userType?: string; + isp?: string; + }; +}; + export type EventContext = { + /** + * Geo data of incoming request + */ + geo?: Geo; /** * Headers of incoming request */ From 2915e8c802840f50cb71791300f730d7b61cf8a8 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Thu, 17 Aug 2023 15:43:37 +0400 Subject: [PATCH 0164/1353] feat: moved geo detection from console to rotor --- services/rotor/src/http/udf.ts | 19 +++++++++++++ services/rotor/src/index.ts | 22 +-------------- .../lib => webapps/console/lib/shared}/eu.ts | 0 webapps/console/pages/api/s/[...type].ts | 27 +++++++++++++++++++ 4 files changed, 47 insertions(+), 21 deletions(-) rename {services/rotor/src/lib => webapps/console/lib/shared}/eu.ts (100%) diff --git a/services/rotor/src/http/udf.ts b/services/rotor/src/http/udf.ts index d24c3a094..566f0f7e1 100644 --- a/services/rotor/src/http/udf.ts +++ b/services/rotor/src/http/udf.ts @@ -21,6 +21,25 @@ export const UDFRunHandler = async (req, res) => { const logs: logType[] = []; try { const eventContext: EventContext = { + geo: { + country: { + code: "US", + isEU: false, + }, + city: { + name: "New York", + }, + region: { + code: "NY", + }, + location: { + latitude: 40.6808, + longitude: -73.9701, + }, + postalCode: { + code: "11238", + }, + }, headers: {}, source: { id: "functionsDebugger-streamId", diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index 222a52277..d1e1b4027 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -25,7 +25,6 @@ import hash from "object-hash"; import { UDFRunHandler } from "./http/udf"; import Prometheus from "prom-client"; import { metrics } from "./lib/metrics"; -import { isEU } from "./lib/eu"; disableService("prisma"); disableService("pg"); @@ -61,25 +60,6 @@ const getCachedOrLoad = async (cache: NodeCache, key: string, loader: (key: stri return loaded; }; -function fromHeaders(httpHeaders: Record): Geo { - const country = httpHeaders["x-vercel-ip-country"]; - const region = httpHeaders["x-vercel-ip-country-region"]; - const city = httpHeaders["x-vercel-ip-city"]; - const lat = httpHeaders["x-vercel-ip-latitude"]; - const lon = httpHeaders["x-vercel-ip-longitude"]; - return { - country: country - ? { - code: country, - isEU: isEU(country), - } - : undefined, - city: city ? { name: city } : undefined, - region: region ? { code: region } : undefined, - location: lat && lon ? { latitude: parseFloat(lat), longitude: parseFloat(lon) } : undefined, - }; -} - export async function rotorMessageHandler(_message: string | undefined) { if (!_message) { return; @@ -177,7 +157,7 @@ export async function rotorMessageHandler(_message: string | undefined) { const event = message.httpPayload as AnalyticsServerEvent; const ctx: EventContext = { headers: message.httpHeaders, - geo: message.geo || fromHeaders(message.httpHeaders), + geo: message.geo, source: { id: connection.streamId, domain: message.origin?.domain, diff --git a/services/rotor/src/lib/eu.ts b/webapps/console/lib/shared/eu.ts similarity index 100% rename from services/rotor/src/lib/eu.ts rename to webapps/console/lib/shared/eu.ts diff --git a/webapps/console/pages/api/s/[...type].ts b/webapps/console/pages/api/s/[...type].ts index 84a96f043..71f3d6ef3 100644 --- a/webapps/console/pages/api/s/[...type].ts +++ b/webapps/console/pages/api/s/[...type].ts @@ -12,6 +12,9 @@ import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import { fastStore, StreamWithDestinations } from "../../../lib/server/fast-store"; import { getCoreDestinationType } from "../../../lib/schema/destinations"; import { redis } from "../../../lib/server/redis"; +import { Geo } from "@jitsu/protocols/functions"; +import { isEU } from "../../../lib/shared/eu"; +import { IncomingHttpHeaders } from "http"; function isInternalHeader(headerName: string) { return headerName.toLowerCase().startsWith("x-jitsu-") || headerName.toLowerCase().startsWith("x-vercel"); @@ -61,6 +64,29 @@ async function getStream(loc: StreamLocator): Promise Date: Thu, 17 Aug 2023 16:34:12 +0400 Subject: [PATCH 0165/1353] rotor: improve metrics and events log service --- services/rotor/src/lib/functions-chain.ts | 11 ++++++----- services/rotor/src/lib/metrics.ts | 13 ++++++++----- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index c7720fa63..0c688183c 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -105,12 +105,16 @@ export function createRedisLogger(redis: Redis, key: (err: boolean) => string, s if (Object.keys(buffer).length === 0) { return; } + const copy = { ...buffer }; + for (const key in buffer) { + delete buffer[key]; + } try { const pipeline = redis.pipeline(); - for (const [key, buf] of Object.entries(buffer)) { + for (const [key, buf] of Object.entries(copy)) { for (let i = 0; i < buf.length; i++) { const logEntry = buf[i]; - if (i == buf.length - 1) { + if (i === buf.length - 1) { log.atDebug().log(`Posting ${buf.length} events to stream [${key}]`); pipeline.xadd(key, "MAXLEN", "~", eventsLogSize, "*", "event", logEntry); } else { @@ -119,9 +123,6 @@ export function createRedisLogger(redis: Redis, key: (err: boolean) => string, s } } await pipeline.exec(); - for (const key in buffer) { - delete buffer[key]; - } } catch (e) { log.atError().withCause(e).log(`Failed to flush events logs to redis`); } diff --git a/services/rotor/src/lib/metrics.ts b/services/rotor/src/lib/metrics.ts index 1775788dd..773f6c91a 100644 --- a/services/rotor/src/lib/metrics.ts +++ b/services/rotor/src/lib/metrics.ts @@ -4,6 +4,7 @@ import { getServerLog } from "@jitsu-internal/console/lib/server/log"; import { FunctionExecLog } from "./functions-chain"; import fetch from "node-fetch-commonjs"; import { Readable } from "stream"; +import { httpAgent, httpsAgent } from "@jitsu-internal/console/lib/server/http-agent"; export const log = getServerLog("metrics"); @@ -29,15 +30,16 @@ interface Metrics { function createMetrics(): Metrics { const buffer: MetricsEvent[] = []; - const flush = async () => { + const flush = async (buf: MetricsEvent[]) => { //create readable stream const stream = new Readable(); const res = fetch(`${bulkerBase}/bulk/${metricsDestinationId}?tableName=${metricsTable}&mode=batch`, { method: "POST", headers: { Authorization: `Bearer ${bulkerAuthKey}` }, body: stream, + agent: (bulkerBase.startsWith("https://") ? httpsAgent : httpAgent)(), }); - buffer.forEach(e => { + buf.forEach(e => { stream.push(JSON.stringify(e)); stream.push("\n"); }); @@ -52,13 +54,13 @@ function createMetrics(): Metrics { .catch(e => { log.atError().withCause(e).log(`Failed to flush metrics events`); }); - buffer.length = 0; }; setInterval(async () => { if (buffer.length > 0) { log.atInfo().log(`Periodic flushing ${buffer.length} metrics events`); - await flush(); + await flush([...buffer]); + buffer.length = 0; } }, flush_interval_ms); @@ -81,7 +83,8 @@ function createMetrics(): Metrics { }); if (buffer.length >= max_batch_size) { log.atInfo().log(`Flushing ${buffer.length} metrics events`); - setImmediate(flush); + setImmediate(() => flush([...buffer])); + buffer.length = 0; } }, }; From 60d6e578ef955352d98c58b4dbfd5f271a1dae1e Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 17 Aug 2023 17:29:59 +0400 Subject: [PATCH 0166/1353] rotor: increase node heap --- rotor.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rotor.Dockerfile b/rotor.Dockerfile index 8c5dc51e5..f033529d5 100644 --- a/rotor.Dockerfile +++ b/rotor.Dockerfile @@ -30,4 +30,4 @@ EXPOSE 3401 COPY --from=builder /app/services/rotor/dist . -ENTRYPOINT ["sh", "-c", "node main.js"] +ENTRYPOINT ["sh", "-c", "node --max-old-space-size=4096 main.js"] From 85a7f7b5d3a04ab2d0c77e2eba7bec90383f20b7 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 17 Aug 2023 18:14:44 +0400 Subject: [PATCH 0167/1353] rotor: bring back awaiting of func chain --- services/rotor/src/index.ts | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index d1e1b4027..2112afdd4 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -192,16 +192,9 @@ export async function rotorMessageHandler(_message: string | undefined) { await redisClient.hdel(`store:${connection.id}`, key); }, }; - const chainCallback = async () => - await runChain(funcChain, event, connection, redisLogger, store, ctx).then(async execLog => { - await metrics().logMetrics(connection.workspaceId, message.messageId, execLog); - }); - //97% chance - if (connectionData.multithreading && Math.random() < 0.97) { - queueMicrotask(chainCallback); - } else { - await chainCallback(); - } + await runChain(funcChain, event, connection, redisLogger, store, ctx).then(async execLog => { + await metrics().logMetrics(connection.workspaceId, message.messageId, execLog); + }); } const retrySettings = { From 929b68fbd03c73aa8139a3759d03898b0673de10 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 17 Aug 2023 19:43:19 +0400 Subject: [PATCH 0168/1353] rotor: tuning --- libs/core-functions/src/context.ts | 2 +- services/rotor/src/http/udf.ts | 3 +-- services/rotor/src/lib/functions-chain.ts | 2 +- services/rotor/src/lib/rotor.ts | 7 ++++++- types/protocols/functions.d.ts | 2 +- 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/libs/core-functions/src/context.ts b/libs/core-functions/src/context.ts index ebbf10edf..91ab405a5 100644 --- a/libs/core-functions/src/context.ts +++ b/libs/core-functions/src/context.ts @@ -36,7 +36,7 @@ export function createFullContext( const controller = new AbortController(); setTimeout(() => { controller.abort(); - }, 30000); + }, 15000); let internalInit: RequestInit = { ...init, diff --git a/services/rotor/src/http/udf.ts b/services/rotor/src/http/udf.ts index 566f0f7e1..4f0afe5a6 100644 --- a/services/rotor/src/http/udf.ts +++ b/services/rotor/src/http/udf.ts @@ -67,7 +67,7 @@ export const UDFRunHandler = async (req, res) => { }, }; const eventsStore: EventsStore = { - log(error: boolean, msg: Record): Promise { + log(error: boolean, msg: Record) { switch (msg.type) { case "log-info": case "log-warn": @@ -103,7 +103,6 @@ export const UDFRunHandler = async (req, res) => { }, }); } - return Promise.resolve(); }, }; const ctx = createFullContext(body.functionId, eventsStore, store, eventContext, {}, body.config); diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index 0c688183c..5c5fd5fd6 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -136,7 +136,7 @@ export function createRedisLogger(redis: Redis, key: (err: boolean) => string, s }, 5000); return { - log: async (error, msg) => { + log: (error, msg) => { try { if (msg.type === "log-debug" && !storeDebug) { return; diff --git a/services/rotor/src/lib/rotor.ts b/services/rotor/src/lib/rotor.ts index 6da04e488..0c87bc338 100644 --- a/services/rotor/src/lib/rotor.ts +++ b/services/rotor/src/lib/rotor.ts @@ -60,7 +60,12 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { return { start: async () => { const kafka = connectToKafka({ defaultAppId: kafkaClientId, ...cfg.credentials }); - const consumer = kafka.consumer({ groupId: cfg.consumerGroupId, allowAutoTopicCreation: false }); + const consumer = kafka.consumer({ + groupId: cfg.consumerGroupId, + allowAutoTopicCreation: false, + sessionTimeout: 60000, + maxInFlightRequests: 10000, + }); await consumer.connect(); await consumer.subscribe({ topics: kafkaTopics, fromBeginning: true }); diff --git a/types/protocols/functions.d.ts b/types/protocols/functions.d.ts index 76b1d38a2..6f41b05ce 100644 --- a/types/protocols/functions.d.ts +++ b/types/protocols/functions.d.ts @@ -15,7 +15,7 @@ interface Store { * Store for incoming events, destination results and function log messages */ interface EventsStore { - log(error: boolean, msg: Record): Promise; + log(error: boolean, msg: Record): void; } /** * A special properties that user can set on an event to define how From ee0a90ad286d1105ddb0381ab75176233ee6343b Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 18 Aug 2023 11:54:37 +0400 Subject: [PATCH 0169/1353] fixes and improvements --- libs/core-functions/src/context.ts | 23 +++---- services/rotor/src/http/udf.ts | 2 +- services/rotor/src/index.ts | 11 ++-- services/rotor/src/lib/functions-chain.ts | 68 -------------------- services/rotor/src/lib/redis-logger.ts | 76 +++++++++++++++++++++++ services/rotor/src/lib/rotor.ts | 38 ++++++++++-- types/protocols/functions.d.ts | 2 +- 7 files changed, 128 insertions(+), 92 deletions(-) create mode 100644 services/rotor/src/lib/redis-logger.ts diff --git a/libs/core-functions/src/context.ts b/libs/core-functions/src/context.ts index 91ab405a5..9b8268802 100644 --- a/libs/core-functions/src/context.ts +++ b/libs/core-functions/src/context.ts @@ -17,6 +17,7 @@ export function createFullContext( const ar = functionId.split("."); const id = ar.pop(); const type = ar.join("."); + const connectionId = eventContext.connection?.id ?? ""; return { props: props, store: store, @@ -36,7 +37,7 @@ export function createFullContext( const controller = new AbortController(); setTimeout(() => { controller.abort(); - }, 15000); + }, 60000); let internalInit: RequestInit = { ...init, @@ -48,14 +49,14 @@ export function createFullContext( fetchResult = await nodeFetch(url, internalInit); } catch (err) { if (logToRedis) { - eventsStore.log(true, { ...baseInfo, error: getErrorMessage(err), elapsedMs: sw.elapsedMs() }); + eventsStore.log(connectionId, true, { ...baseInfo, error: getErrorMessage(err), elapsedMs: sw.elapsedMs() }); } throw err; } //clone response to be able to read it twice const cloned = fetchResult.clone(); if (logToRedis) { - eventsStore.log(!fetchResult.ok, { + eventsStore.log(connectionId, !fetchResult.ok, { ...baseInfo, status: fetchResult.status, statusText: fetchResult.statusText, @@ -68,8 +69,8 @@ export function createFullContext( }, log: { debug: (message, ...args: any[]) => { - log.atDebug().log(`[CON:${eventContext.connection?.id}]: [f:${id}][DEBUG]: ${message}`, ...args); - eventsStore.log(false, { + log.atDebug().log(`[CON:${connectionId}]: [f:${id}][DEBUG]: ${message}`, ...args); + eventsStore.log(connectionId, false, { type: "log-debug", functionId: id, functionType: type, @@ -80,8 +81,8 @@ export function createFullContext( }); }, warn: (message, ...args: any[]) => { - log.atDebug().log(`[CON:${eventContext.connection?.id}]: [f:${id}][WARN]: ${message}`, ...args); - eventsStore.log(false, { + log.atDebug().log(`[CON:${connectionId}]: [f:${id}][WARN]: ${message}`, ...args); + eventsStore.log(connectionId, false, { type: "log-warn", functionId: id, functionType: type, @@ -92,7 +93,7 @@ export function createFullContext( }); }, error: (message, ...args: any[]) => { - eventsStore.log(true, { + eventsStore.log(connectionId, true, { type: "log-error", functionId: id, functionType: type, @@ -109,11 +110,11 @@ export function createFullContext( args = args.slice(0, args.length - 1); } } - l.log(`[CON:${eventContext.connection?.id}]: [f:${id}][ERROR]: ${message}`, ...args); + l.log(`[CON:${connectionId}]: [f:${id}][ERROR]: ${message}`, ...args); }, info: (message, ...args: any[]) => { - log.atDebug().log(`[CON:${eventContext.connection?.id}]: [f:${id}][INFO]: ${message}`, ...args); - eventsStore.log(false, { + log.atDebug().log(`[CON:${connectionId}]: [f:${id}][INFO]: ${message}`, ...args); + eventsStore.log(connectionId, false, { type: "log-info", functionId: id, functionType: type, diff --git a/services/rotor/src/http/udf.ts b/services/rotor/src/http/udf.ts index 4f0afe5a6..6d760cb1a 100644 --- a/services/rotor/src/http/udf.ts +++ b/services/rotor/src/http/udf.ts @@ -67,7 +67,7 @@ export const UDFRunHandler = async (req, res) => { }, }; const eventsStore: EventsStore = { - log(error: boolean, msg: Record) { + log(connectionId: string, error: boolean, msg: Record) { switch (msg.type) { case "log-info": case "log-warn": diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index 2112afdd4..b6545e084 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -15,7 +15,7 @@ import minimist from "minimist"; import { glob } from "glob"; import fs from "fs"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; -import { createRedisLogger, FuncChain, runChain } from "./lib/functions-chain"; +import { FuncChain, runChain } from "./lib/functions-chain"; import { getBuiltinFunction, mongoAnonymousEventsStore, UDFWrapper } from "@jitsu/core-functions"; import { EventContext, Geo, JitsuFunction, Store, SystemContext } from "@jitsu/protocols/functions"; import { redis } from "@jitsu-internal/console/lib/server/redis"; @@ -25,6 +25,7 @@ import hash from "object-hash"; import { UDFRunHandler } from "./http/udf"; import Prometheus from "prom-client"; import { metrics } from "./lib/metrics"; +import { redisLogger } from "./lib/redis-logger"; disableService("prisma"); disableService("pg"); @@ -175,11 +176,6 @@ export async function rotorMessageHandler(_message: string | undefined) { }, }; const redisClient = redis(); - const redisLogger = createRedisLogger( - redisClient, - isErr => `events_log:functions.${isErr ? "error" : "all"}#${connection.id}`, - false - ); const store: Store = { get: async (key: string) => { const res = await redisClient.hget(`store:${connection.id}`, key); @@ -192,7 +188,8 @@ export async function rotorMessageHandler(_message: string | undefined) { await redisClient.hdel(`store:${connection.id}`, key); }, }; - await runChain(funcChain, event, connection, redisLogger, store, ctx).then(async execLog => { + const rl = await redisLogger.waitInit(); + await runChain(funcChain, event, connection, rl, store, ctx).then(async execLog => { await metrics().logMetrics(connection.workspaceId, message.messageId, execLog); }); } diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index 5c5fd5fd6..871aae077 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -9,12 +9,9 @@ import { } from "@jitsu/protocols/functions"; import { createFullContext } from "@jitsu/core-functions"; -import Redis from "ioredis"; import { getErrorMessage, getLog, stopwatch } from "juava"; import { EnrichedConnectionConfig } from "@jitsu-internal/console/lib/server/fast-store"; -const eventsLogSize = process.env.EVENTS_LOG_MAX_SIZE ? parseInt(process.env.EVENTS_LOG_MAX_SIZE) : 1000; - export type Func = { id: string; exec: JitsuFunction; @@ -87,68 +84,3 @@ export async function runChain( function isDropResult(result: FuncReturn): boolean { return result === "drop" || (Array.isArray(result) && result.length === 0) || result === null || result === false; } - -export function createRedisLogger(redis: Redis, key: (err: boolean) => string, storeDebug): EventsStore { - const buffer: Record = {}; - - const put = (key: string, logEntry: string) => { - let buf = buffer[key]; - if (!buf) { - buffer[key] = buf = []; - } - if (buf.length < eventsLogSize) { - buf.push(logEntry); - } - }; - - const flush = async () => { - if (Object.keys(buffer).length === 0) { - return; - } - const copy = { ...buffer }; - for (const key in buffer) { - delete buffer[key]; - } - try { - const pipeline = redis.pipeline(); - for (const [key, buf] of Object.entries(copy)) { - for (let i = 0; i < buf.length; i++) { - const logEntry = buf[i]; - if (i === buf.length - 1) { - log.atDebug().log(`Posting ${buf.length} events to stream [${key}]`); - pipeline.xadd(key, "MAXLEN", "~", eventsLogSize, "*", "event", logEntry); - } else { - pipeline.xadd(key, "*", "event", logEntry); - } - } - } - await pipeline.exec(); - } catch (e) { - log.atError().withCause(e).log(`Failed to flush events logs to redis`); - } - }; - - setInterval(async () => { - if (Object.keys(buffer).length === 0) { - return; - } - await flush(); - }, 5000); - - return { - log: (error, msg) => { - try { - if (msg.type === "log-debug" && !storeDebug) { - return; - } - const logEntry = JSON.stringify({ timestamp: new Date().toISOString(), error, ...msg }); - if (error) { - put(key(true), logEntry); - } - put(key(false), logEntry); - } catch (e) { - log.atError().withCause(e).log("Failed to put event to redis events log"); - } - }, - }; -} diff --git a/services/rotor/src/lib/redis-logger.ts b/services/rotor/src/lib/redis-logger.ts new file mode 100644 index 000000000..bc47a8d1d --- /dev/null +++ b/services/rotor/src/lib/redis-logger.ts @@ -0,0 +1,76 @@ +import { getSingleton } from "juava"; +import { EventsStore } from "@jitsu/protocols/functions"; +import { redis } from "@jitsu-internal/console/lib/server/redis"; +import { getServerLog } from "@jitsu-internal/console/lib/server/log"; + +export const log = getServerLog("redisLogger"); + +const eventsLogSize = process.env.EVENTS_LOG_MAX_SIZE ? parseInt(process.env.EVENTS_LOG_MAX_SIZE) : 1000; + +export const redisLogger = getSingleton("redisLogger", createRedisLogger); + +export function createRedisLogger(): EventsStore { + const buffer: Record = {}; + + const put = (key: string, logEntry: string) => { + let buf = buffer[key]; + if (!buf) { + buffer[key] = buf = []; + } + if (buf.length < eventsLogSize) { + buf.push(logEntry); + } + }; + + const flush = async () => { + if (Object.keys(buffer).length === 0) { + return; + } + const copy = { ...buffer }; + for (const key in buffer) { + delete buffer[key]; + } + try { + const pipeline = redis().pipeline(); + for (const [key, buf] of Object.entries(copy)) { + for (let i = 0; i < buf.length; i++) { + const logEntry = buf[i]; + if (i === buf.length - 1) { + log.atDebug().log(`Posting ${buf.length} events to stream [${key}]`); + pipeline.xadd(key, "MAXLEN", "~", eventsLogSize, "*", "event", logEntry); + } else { + pipeline.xadd(key, "*", "event", logEntry); + } + } + } + await pipeline.exec(); + } catch (e) { + log.atError().withCause(e).log(`Failed to flush events logs to redis`); + } + }; + + setInterval(async () => { + if (Object.keys(buffer).length === 0) { + return; + } + await flush(); + }, 5000); + + return { + log: (connectionId: string, error, msg) => { + const key = (isErr: boolean) => `events_log:functions.${isErr ? "error" : "all"}#${connectionId}`; + try { + if (msg.type === "log-debug") { + return; + } + const logEntry = JSON.stringify({ timestamp: new Date().toISOString(), error, ...msg }); + if (error) { + put(key(true), logEntry); + } + put(key(false), logEntry); + } catch (e) { + log.atError().withCause(e).log("Failed to put event to redis events log"); + } + }, + }; +} diff --git a/services/rotor/src/lib/rotor.ts b/services/rotor/src/lib/rotor.ts index 0c87bc338..9b28dc1f6 100644 --- a/services/rotor/src/lib/rotor.ts +++ b/services/rotor/src/lib/rotor.ts @@ -63,8 +63,7 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { const consumer = kafka.consumer({ groupId: cfg.consumerGroupId, allowAutoTopicCreation: false, - sessionTimeout: 60000, - maxInFlightRequests: 10000, + sessionTimeout: 120000, }); await consumer.connect(); await consumer.subscribe({ topics: kafkaTopics, fromBeginning: true }); @@ -80,6 +79,30 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { // add `as const` here to enforce label names labelNames: ["topic", "partition", "offset"] as const, }); + const messagesConsumed = new Prometheus.Counter({ + name: "rotor_messages_consumed", + help: "messages consumed", + // add `as const` here to enforce label names + labelNames: ["topic", "partition"] as const, + }); + const messagesProcessed = new Prometheus.Counter({ + name: "rotor_messages_processed", + help: "messages processed", + // add `as const` here to enforce label names + labelNames: ["topic", "partition"] as const, + }); + const messagesRequeued = new Prometheus.Counter({ + name: "rotor_messages_requeued", + help: "messages requeued", + // add `as const` here to enforce label names + labelNames: ["topic"] as const, + }); + const messagesDeadLettered = new Prometheus.Counter({ + name: "rotor_messages_dead_lettered", + help: "messages dead lettered", + // add `as const` here to enforce label names + labelNames: ["topic"] as const, + }); const interval = setInterval(async () => { try { for (const topic of kafkaTopics) { @@ -102,8 +125,9 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { await consumer.run({ autoCommit: true, - partitionsConsumedConcurrently: 4, - eachMessage: async ({ message, topic }) => { + partitionsConsumedConcurrently: 64, + eachMessage: async ({ message, topic, partition }) => { + messagesConsumed.inc({ topic, partition }); const firstProcessed = message.headers?.firstProcessed ? new Date(message.headers?.firstProcessed.toString()) : new Date(); @@ -118,6 +142,7 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { }, { maxRetries: maxLocalRetries } ); + messagesProcessed.inc({ topic, partition }); } catch (e) { const returnToQueue = shouldReturnToQueue(firstProcessed, maxSecondsInQueueAfterFailure, e); log @@ -132,6 +157,11 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { : "Message will be sent to dead-letter queue" }: ${message.value}` ); + if (!returnToQueue) { + messagesDeadLettered.inc({ topic }); + } else { + messagesRequeued.inc({ topic }); + } const requeueTopic = returnToQueue ? topic : deatLetterTopic(); try { await producer.send({ diff --git a/types/protocols/functions.d.ts b/types/protocols/functions.d.ts index 6f41b05ce..28a2ca7ce 100644 --- a/types/protocols/functions.d.ts +++ b/types/protocols/functions.d.ts @@ -15,7 +15,7 @@ interface Store { * Store for incoming events, destination results and function log messages */ interface EventsStore { - log(error: boolean, msg: Record): void; + log(connectionId: string, error: boolean, msg: Record): void; } /** * A special properties that user can set on an event to define how From f0dc28d0623f8c9a01c1b43ebf271d2cee967c8c Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 18 Aug 2023 15:29:28 +0400 Subject: [PATCH 0170/1353] rotor: control number of concurrent message processings --- libs/core-functions/src/context.ts | 2 +- pnpm-lock.yaml | 3 + services/rotor/package.json | 1 + services/rotor/src/lib/rotor.ts | 130 +++++++++++++++++------------ 4 files changed, 81 insertions(+), 55 deletions(-) diff --git a/libs/core-functions/src/context.ts b/libs/core-functions/src/context.ts index 9b8268802..1896ef88f 100644 --- a/libs/core-functions/src/context.ts +++ b/libs/core-functions/src/context.ts @@ -37,7 +37,7 @@ export function createFullContext( const controller = new AbortController(); setTimeout(() => { controller.abort(); - }, 60000); + }, 30000); let internalInit: RequestInit = { ...init, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 524654a49..cb14d4ae3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -373,6 +373,9 @@ importers: object-hash: specifier: ^3.0.0 version: 3.0.0 + p-queue: + specifier: ^6.6.2 + version: 6.6.2 prom-client: specifier: ^14.2.0 version: 14.2.0 diff --git a/services/rotor/package.json b/services/rotor/package.json index 7b3461517..3f8aa2ca6 100644 --- a/services/rotor/package.json +++ b/services/rotor/package.json @@ -16,6 +16,7 @@ "rotor:dev": "dotenv -e ../../.env.local -- nodemon --watch \"src/**\" --ext \"ts,json,tsx\" --exec \"ts-node src/index.ts\"" }, "dependencies": { + "p-queue": "^6.6.2", "object-hash": "^3.0.0", "prom-client": "^14.2.0", "node-cache": "^5.1.2", diff --git a/services/rotor/src/lib/rotor.ts b/services/rotor/src/lib/rotor.ts index 9b28dc1f6..d24b07bab 100644 --- a/services/rotor/src/lib/rotor.ts +++ b/services/rotor/src/lib/rotor.ts @@ -1,6 +1,8 @@ import { getLog } from "juava"; import { connectToKafka, deatLetterTopic, KafkaCredentials } from "@jitsu-internal/console/lib/server/kafka-config"; import Prometheus from "prom-client"; +import PQueue from "p-queue"; +const concurrency = process.env.CONCURRENCY ? parseInt(process.env.CONCURRENCY) : 50; const log = getLog("kafka-rotor"); @@ -123,64 +125,84 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { } }, 60000); - await consumer.run({ - autoCommit: true, - partitionsConsumedConcurrently: 64, - eachMessage: async ({ message, topic, partition }) => { - messagesConsumed.inc({ topic, partition }); - const firstProcessed = message.headers?.firstProcessed - ? new Date(message.headers?.firstProcessed.toString()) - : new Date(); - const retries = message.headers?.retries ? parseInt(message.headers?.retries.toString()) : 0; + async function onMessage(message: any, topic: string, partition: number) { + messagesConsumed.inc({ topic, partition }); + const firstProcessed = message.headers?.firstProcessed + ? new Date(message.headers?.firstProcessed.toString()) + : new Date(); + const retries = message.headers?.retries ? parseInt(message.headers?.retries.toString()) : 0; - try { - await withRetries( - async () => { - if (message.value) { - await cfg.handle(message.value?.toString()); - } - }, - { maxRetries: maxLocalRetries } + try { + await withRetries( + async () => { + if (message.value) { + await cfg.handle(message.value?.toString()); + } + }, + { maxRetries: maxLocalRetries } + ); + messagesProcessed.inc({ topic, partition }); + } catch (e) { + const returnToQueue = shouldReturnToQueue(firstProcessed, maxSecondsInQueueAfterFailure, e); + log + .atError() + .withCause(e) + .log( + `Failed to process message for ${message.key || "(no key set)"} after ${maxLocalRetries} local retries. ${ + returnToQueue ? "Message will be returned to reprocessing" : "Message will be sent to dead-letter queue" + }: ${message.value}` ); - messagesProcessed.inc({ topic, partition }); - } catch (e) { - const returnToQueue = shouldReturnToQueue(firstProcessed, maxSecondsInQueueAfterFailure, e); - log - .atError() - .withCause(e) - .log( - `Failed to process message for ${ - message.key || "(no key set)" - } after ${maxLocalRetries} local retries. ${ - returnToQueue - ? "Message will be returned to reprocessing" - : "Message will be sent to dead-letter queue" - }: ${message.value}` - ); - if (!returnToQueue) { - messagesDeadLettered.inc({ topic }); - } else { - messagesRequeued.inc({ topic }); - } - const requeueTopic = returnToQueue ? topic : deatLetterTopic(); - try { - await producer.send({ - topic: requeueTopic, - messages: [ - { - value: message.value, - key: message.key, - headers: { - firstProcessed: firstProcessed.toISOString(), - retries: `${retries + 1}`, - }, + if (!returnToQueue) { + messagesDeadLettered.inc({ topic }); + } else { + messagesRequeued.inc({ topic }); + } + const requeueTopic = returnToQueue ? topic : deatLetterTopic(); + try { + await producer.send({ + topic: requeueTopic, + messages: [ + { + value: message.value, + key: message.key, + headers: { + firstProcessed: firstProcessed.toISOString(), + retries: `${retries + 1}`, }, - ], - }); - } catch (e) { - log.atDebug().withCause(e).log(`Failed to put message to ${topic}: ${message.value}`); - } + }, + ], + }); + } catch (e) { + log.atDebug().withCause(e).log(`Failed to put message to ${topic}: ${message.value}`); } + } + } + + const queue = new PQueue({ concurrency }); + + const onSizeLessThan = async (limit: number) => { + // Instantly resolve if the queue is empty. + if (queue.size < limit) { + return; + } + + return new Promise(resolve => { + const listener = () => { + if (queue.size < limit) { + queue.removeListener("next", listener); + resolve(); + } + }; + + queue.on("next", listener); + }); + }; + + await consumer.run({ + eachMessage: async ({ message, topic, partition }) => { + //make sure that queue has no more entities than concurrency + await onSizeLessThan(1); + queue.add(async () => onMessage(message, topic, partition)); }, }); }, From 884167ca43ec8c4a46a65433670007761805c50b Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 18 Aug 2023 17:40:57 +0400 Subject: [PATCH 0171/1353] rotor: try run on node 20 --- pnpm-lock.yaml | 110 +++++++++++++++++++++--------------- rotor.Dockerfile | 7 ++- services/rotor/package.json | 4 +- 3 files changed, 71 insertions(+), 50 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cb14d4ae3..a224c75d1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -368,8 +368,8 @@ importers: specifier: ^5.1.2 version: 5.1.2 node-fetch-commonjs: - specifier: ^3.2.4 - version: 3.2.4 + specifier: ^3.3.1 + version: 3.3.1 object-hash: specifier: ^3.0.0 version: 3.0.0 @@ -454,7 +454,7 @@ importers: version: 2.0.0(webpack@5.78.0) nodemon: specifier: ^2.0.20 - version: 2.0.22 + version: 2.0.20 rollup: specifier: ^3.2.5 version: 3.20.2 @@ -462,8 +462,8 @@ importers: specifier: ^9.4.2 version: 9.4.2(typescript@4.9.5)(webpack@5.78.0) ts-node: - specifier: ~10.8.1 - version: 10.8.2(@types/node@16.11.6)(typescript@4.9.5) + specifier: ~10.9.1 + version: 10.9.1(@types/node@16.11.6)(typescript@4.9.5) typescript: specifier: ^4.9.3 version: 4.9.5 @@ -5151,7 +5151,7 @@ packages: nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 - semver: 7.5.0 + semver: 7.5.4 tar: 6.1.13 transitivePeerDependencies: - encoding @@ -5459,7 +5459,7 @@ packages: read-package-json-fast: 2.0.3 readdir-scoped-modules: 1.1.0 rimraf: 3.0.2 - semver: 7.5.0 + semver: 7.5.4 ssri: 8.0.1 treeverse: 1.0.4 walk-up-path: 1.0.0 @@ -5471,14 +5471,14 @@ packages: resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} dependencies: '@gar/promisify': 1.1.3 - semver: 7.5.0 + semver: 7.5.4 /@npmcli/fs@2.1.2: resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: '@gar/promisify': 1.1.3 - semver: 7.5.0 + semver: 7.5.4 /@npmcli/git@2.1.0: resolution: {integrity: sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==} @@ -5489,7 +5489,7 @@ packages: npm-pick-manifest: 6.1.1 promise-inflight: 1.0.1 promise-retry: 2.0.1 - semver: 7.5.0 + semver: 7.5.4 which: 2.0.2 transitivePeerDependencies: - bluebird @@ -5518,7 +5518,7 @@ packages: cacache: 15.3.0 json-parse-even-better-errors: 2.3.1 pacote: 12.0.3 - semver: 7.5.0 + semver: 7.5.4 transitivePeerDependencies: - bluebird - supports-color @@ -8197,7 +8197,7 @@ packages: resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 16.11.6 + '@types/node': 18.15.11 /@types/graceful-fs@4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} @@ -8261,7 +8261,7 @@ packages: /@types/jsonwebtoken@8.5.9: resolution: {integrity: sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==} dependencies: - '@types/node': 18.11.12 + '@types/node': 18.15.11 dev: true /@types/jsonwebtoken@9.0.1: @@ -8332,12 +8332,14 @@ packages: /@types/node@16.11.6: resolution: {integrity: sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==} + dev: true /@types/node@16.18.23: resolution: {integrity: sha512-XAMpaw1s1+6zM+jn2tmw8MyaRDIJfXxqmIQIS0HfoGYPuf7dUWeiUKopwq13KFX9lEp1+THGtlaaYx39Nxr58g==} /@types/node@18.11.12: resolution: {integrity: sha512-FgD3NtTAKvyMmD44T07zz2fEf+OKwutgBCEVM8GcvMGVGaDktiLNTDvPwC/LUe3PinMW+X6CuLOF2Ui1mAlSXg==} + dev: false /@types/node@18.15.11: resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} @@ -8535,7 +8537,7 @@ packages: /@types/webpack@5.28.1(esbuild@0.16.3)(webpack-cli@5.0.1): resolution: {integrity: sha512-qw1MqGZclCoBrpiSe/hokSgQM/su8Ocpl3L/YHE0L6moyaypg4+5F7Uzq7NgaPKPxUxUbQ4fLPLpDWdR27bCZw==} dependencies: - '@types/node': 16.11.6 + '@types/node': 18.15.11 tapable: 2.2.1 webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) transitivePeerDependencies: @@ -8593,7 +8595,7 @@ packages: grapheme-splitter: 1.0.4 ignore: 5.2.4 natural-compare-lite: 1.4.0 - semver: 7.5.0 + semver: 7.5.4 tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: @@ -8717,7 +8719,7 @@ packages: debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.0 + semver: 7.5.4 tsutils: 3.21.0(typescript@4.9.4) typescript: 4.9.4 transitivePeerDependencies: @@ -8737,7 +8739,7 @@ packages: debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.0 + semver: 7.5.4 tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: @@ -8757,7 +8759,7 @@ packages: '@typescript-eslint/typescript-estree': 5.58.0(typescript@4.9.5) eslint: 8.38.0 eslint-scope: 5.1.1 - semver: 7.5.0 + semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript @@ -9006,7 +9008,7 @@ packages: recast: 0.21.5 remark-frontmatter: 4.0.1 remark-mdx-frontmatter: 1.1.1 - semver: 7.5.0 + semver: 7.5.4 sort-package-json: 1.57.0 tar-fs: 2.1.1 tsconfig-paths: 4.2.0 @@ -11182,7 +11184,7 @@ packages: postcss-modules-scope: 3.0.0(postcss@8.4.21) postcss-modules-values: 4.0.0(postcss@8.4.21) postcss-value-parser: 4.2.0 - semver: 7.5.0 + semver: 7.5.4 webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) dev: false @@ -13787,7 +13789,7 @@ packages: memfs: 3.5.0 minimatch: 3.1.2 schema-utils: 2.7.0 - semver: 7.5.0 + semver: 7.5.4 tapable: 1.1.3 typescript: 4.9.5 webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) @@ -16616,7 +16618,7 @@ packages: jest-util: 27.5.1 natural-compare: 1.4.0 pretty-format: 27.5.1 - semver: 7.5.0 + semver: 7.5.4 transitivePeerDependencies: - supports-color dev: false @@ -16647,7 +16649,7 @@ packages: jest-util: 28.1.3 natural-compare: 1.4.0 pretty-format: 28.1.3 - semver: 7.5.0 + semver: 7.5.4 transitivePeerDependencies: - supports-color dev: true @@ -16678,7 +16680,7 @@ packages: jest-util: 29.5.0 natural-compare: 1.4.0 pretty-format: 29.5.0 - semver: 7.5.0 + semver: 7.5.4 transitivePeerDependencies: - supports-color dev: true @@ -17193,7 +17195,7 @@ packages: jws: 3.2.2 lodash: 4.17.21 ms: 2.1.3 - semver: 7.5.0 + semver: 7.5.4 dev: false /jsx-ast-utils@3.3.3: @@ -19215,6 +19217,14 @@ packages: formdata-polyfill: 4.0.10 web-streams-polyfill: 3.2.1 + /node-fetch-commonjs@3.3.1: + resolution: {integrity: sha512-kN5TfyrGRWJOZEAx7GvDu7kjvMKjmt4VmaE3dVeDWwzqzNFYgYroRLvTRJAEQ9/Ka3TumTwDrCZ5u3FJUqFb8A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + formdata-polyfill: 4.0.10 + web-streams-polyfill: 3.2.1 + dev: false + /node-fetch@2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} @@ -19258,7 +19268,7 @@ packages: nopt: 5.0.0 npmlog: 6.0.2 rimraf: 3.0.2 - semver: 7.5.0 + semver: 7.5.4 tar: 6.1.13 which: 2.0.2 transitivePeerDependencies: @@ -19297,8 +19307,8 @@ packages: engines: {node: '>=6.0.0'} dev: false - /nodemon@2.0.22: - resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} + /nodemon@2.0.20: + resolution: {integrity: sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==} engines: {node: '>=8.10.0'} hasBin: true dependencies: @@ -19374,7 +19384,7 @@ packages: resolution: {integrity: sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==} engines: {node: '>=10'} dependencies: - semver: 7.5.0 + semver: 7.5.4 /npm-normalize-package-bin@1.0.1: resolution: {integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==} @@ -19388,7 +19398,7 @@ packages: engines: {node: '>=10'} dependencies: hosted-git-info: 4.1.0 - semver: 7.5.0 + semver: 7.5.4 validate-npm-package-name: 3.0.0 /npm-packlist@3.0.0: @@ -19407,7 +19417,7 @@ packages: npm-install-checks: 4.0.0 npm-normalize-package-bin: 1.0.1 npm-package-arg: 8.1.5 - semver: 7.5.0 + semver: 7.5.4 /npm-registry-fetch@12.0.2: resolution: {integrity: sha512-Df5QT3RaJnXYuOwtXBXS9BWs+tHH2olvkCLh6jcR/b/u3DvPMlp3J0TvvYwplPKxHMOwfg287PYih9QqaVFoKA==} @@ -20593,7 +20603,7 @@ packages: cosmiconfig: 7.1.0 klona: 2.0.6 postcss: 8.4.21 - semver: 7.5.0 + semver: 7.5.4 webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) dev: false @@ -21652,7 +21662,7 @@ packages: jsdoc: 4.0.2 minimist: 1.2.8 protobufjs: 7.2.3 - semver: 7.5.0 + semver: 7.5.4 tmp: 0.2.1 uglify-js: 3.17.4 dev: false @@ -23496,6 +23506,14 @@ packages: hasBin: true dependencies: lru-cache: 6.0.0 + dev: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 /send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} @@ -24175,7 +24193,7 @@ packages: resolution: {integrity: sha512-OUA32uhNoSoM6wOodyFbV+3IBCoO140uzdXmBArQ0S88D4EbH91xl2v+Ml1sKalcFKUBadHLeHfU/p9AbsOfGw==} engines: {node: '>=12.*'} dependencies: - '@types/node': 18.11.12 + '@types/node': 18.15.11 qs: 6.11.1 /strnum@1.0.5: @@ -24869,7 +24887,7 @@ packages: code-block-writer: 11.0.3 dev: true - /ts-node@10.8.2(@types/node@16.11.6)(typescript@4.9.5): + /ts-node@10.8.2(@types/node@18.15.11)(typescript@4.9.5): resolution: {integrity: sha512-LYdGnoGddf1D6v8REPtIH+5iq/gTDuZqv2/UJUU7tKjuEU8xVZorBM+buCGNjj+pGEud+sOoM4CX3/YzINpENA==} hasBin: true peerDependencies: @@ -24888,7 +24906,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 16.11.6 + '@types/node': 18.15.11 acorn: 8.8.2 acorn-walk: 8.2.0 arg: 4.1.3 @@ -24898,10 +24916,9 @@ packages: typescript: 4.9.5 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - dev: true - /ts-node@10.8.2(@types/node@18.15.11)(typescript@4.9.5): - resolution: {integrity: sha512-LYdGnoGddf1D6v8REPtIH+5iq/gTDuZqv2/UJUU7tKjuEU8xVZorBM+buCGNjj+pGEud+sOoM4CX3/YzINpENA==} + /ts-node@10.9.1(@types/node@14.18.33)(typescript@4.3.4): + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: '@swc/core': '>=1.2.50' @@ -24919,18 +24936,19 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 18.15.11 + '@types/node': 14.18.33 acorn: 8.8.2 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 4.9.5 + typescript: 4.3.4 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + dev: true - /ts-node@10.9.1(@types/node@14.18.33)(typescript@4.3.4): + /ts-node@10.9.1(@types/node@16.11.6)(typescript@4.9.5): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -24949,14 +24967,14 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 14.18.33 + '@types/node': 16.11.6 acorn: 8.8.2 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 4.3.4 + typescript: 4.9.5 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true @@ -26565,7 +26583,7 @@ packages: pacote: 12.0.3 preferred-pm: 3.0.3 pretty-bytes: 5.6.0 - semver: 7.5.0 + semver: 7.5.4 slash: 3.0.0 strip-ansi: 6.0.1 text-table: 0.2.0 @@ -26594,7 +26612,7 @@ packages: minimist: 1.2.8 read-pkg-up: 7.0.1 run-async: 2.4.1 - semver: 7.5.0 + semver: 7.5.4 shelljs: 0.8.5 sort-keys: 4.2.0 text-table: 0.2.0 diff --git a/rotor.Dockerfile b/rotor.Dockerfile index f033529d5..ebf2346d3 100644 --- a/rotor.Dockerfile +++ b/rotor.Dockerfile @@ -3,7 +3,7 @@ # docker buildx build --platform linux/amd64 . -f rotor.Dockerfile --push -t jitsucom/rotor:latest -FROM node:16-bullseye-slim as builder +FROM node:20-bullseye-slim as builder RUN apt-get update -y RUN apt-get install nano curl git openssl1.1 procps python3 make g++ bash -y @@ -18,7 +18,10 @@ RUN --mount=type=cache,id=onetag_pnpm,target=/root/.local/share/pnpm/store/v3 pn RUN --mount=type=cache,id=rotor_turborepo,target=/app/node_modules/.cache/turbo pnpm build --filter=@jitsu-internal/rotor -FROM node:16-bullseye-slim AS runner +FROM node:20-bullseye-slim AS runner + +RUN apt-get update -y +RUN apt-get install nano curl procps bash -y WORKDIR /app RUN addgroup --system --gid 1001 runner diff --git a/services/rotor/package.json b/services/rotor/package.json index 3f8aa2ca6..465cc4866 100644 --- a/services/rotor/package.json +++ b/services/rotor/package.json @@ -29,7 +29,7 @@ "json-grab": "0.1.0-alpha.2", "json5": "^2.1.0", "minimist": "^1.2.7", - "node-fetch-commonjs": "^3.2.4", + "node-fetch-commonjs": "^3.3.1", "tslib": "^2.4.0" }, "devDependencies": { @@ -59,7 +59,7 @@ "nodemon": "^2.0.20", "rollup": "^3.2.5", "ts-loader": "^9.4.2", - "ts-node": "~10.8.1", + "ts-node": "~10.9.1", "typescript": "^4.9.3", "webpack": "^5.75.0", "webpack-cli": "^5.0.0" From e9ec0cb30408fbfbee411bd5a746272d3760656a Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 18 Aug 2023 18:07:37 +0400 Subject: [PATCH 0172/1353] rotor: prebuffer some message from kafka before processing --- services/rotor/src/lib/rotor.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/rotor/src/lib/rotor.ts b/services/rotor/src/lib/rotor.ts index d24b07bab..6a913d95f 100644 --- a/services/rotor/src/lib/rotor.ts +++ b/services/rotor/src/lib/rotor.ts @@ -200,8 +200,8 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { await consumer.run({ eachMessage: async ({ message, topic, partition }) => { - //make sure that queue has no more entities than concurrency - await onSizeLessThan(1); + //make sure that queue has no more entities than concurrency limit (running tasks not included) + await onSizeLessThan(concurrency); queue.add(async () => onMessage(message, topic, partition)); }, }); From 8f034799dc6e61bbab332cf1a760352c76e8c256 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 25 Aug 2023 10:24:08 +0400 Subject: [PATCH 0173/1353] Feat/newjitsu segment batch (#1031) implement /v1/batch end-point --------- Co-authored-by: Vladimir Klimontovich --- .../components/DataView/EventsBrowser.tsx | 4 +- webapps/console/lib/domains.ts | 13 +- webapps/console/middleware.ts | 35 +- webapps/console/pages/api/s/[...type].ts | 400 +++++++++--------- webapps/console/pages/api/s/batch.ts | 50 +++ 5 files changed, 306 insertions(+), 196 deletions(-) create mode 100644 webapps/console/pages/api/s/batch.ts diff --git a/webapps/console/components/DataView/EventsBrowser.tsx b/webapps/console/components/DataView/EventsBrowser.tsx index 972dd2148..28b9cfb8d 100644 --- a/webapps/console/components/DataView/EventsBrowser.tsx +++ b/webapps/console/components/DataView/EventsBrowser.tsx @@ -785,12 +785,12 @@ const IncomingEventDrawer = ({ event }: { event: IncomingEvent }) => { drawerData.push({ name: "Page URL", value: ( - <> +

    {" "} {event.pageURL} - +
    ), }); drawerData.push({ diff --git a/webapps/console/lib/domains.ts b/webapps/console/lib/domains.ts index 205cfb0db..a184b5065 100644 --- a/webapps/console/lib/domains.ts +++ b/webapps/console/lib/domains.ts @@ -2,6 +2,7 @@ import { NextApiRequest } from "next"; import { getErrorMessage, getLog } from "juava"; import { MergeExclusive, Simplify } from "type-fest"; import { IngestType } from "@jitsu/protocols/async-request"; +import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; export type HttpProtocolVariant = "https" | "http"; @@ -35,13 +36,19 @@ export type StreamLocator = Simplify< * @param req * @param keyType type of a key */ -export function getDataLocator(req: NextApiRequest, keyType: IngestType): StreamLocator { +export function getDataLocator(req: NextApiRequest, keyType: IngestType, event: AnalyticsServerEvent): StreamLocator { const requestEndpoint = getReqEndpoint(req); const [dataHost] = getDataDomain(requestEndpoint)?.split(":") || [undefined]; //ignore port, port can be used only in dev env - if (requestEndpoint.hostname === dataHost) { - throw new Error(`Cannot get data slug from data hostname ${requestEndpoint.hostname}`); + + if (req.headers["authorization"]) { + const auth = Buffer.from(req.headers["authorization"].replace("Basic ", ""), "base64").toString("utf-8"); + return { writeKey: auth, keyType }; } else if (req.headers["x-write-key"]) { return { writeKey: req.headers["x-write-key"] as string, keyType }; + } else if (event.writeKey) { + return { writeKey: event.writeKey, keyType }; + } else if (requestEndpoint.hostname === dataHost) { + throw new Error(`Cannot get data slug from data hostname ${requestEndpoint.hostname}`); } else if (dataHost && requestEndpoint.hostname.endsWith(`.${dataHost}`)) { return { slug: requestEndpoint.hostname.replace(`.${dataHost}`, "") }; } else { diff --git a/webapps/console/middleware.ts b/webapps/console/middleware.ts index 60a03852d..e1c72d156 100644 --- a/webapps/console/middleware.ts +++ b/webapps/console/middleware.ts @@ -1,13 +1,44 @@ -import { NextResponse } from "next/server"; import type { NextRequest } from "next/server"; +import { NextResponse } from "next/server"; +import { getLog } from "juava"; + +function isTruish(val: any) { + return val === "true" || val === "1" || val === "yes" || val === true || val === 1; +} + +const logRequests = isTruish(process.env.DEBUG_REQUESTS); + +function prettifyBody(body: string) { + try { + const obj = JSON.parse(body); + return JSON.stringify(obj, null, 2); + } catch (e) { + return body; + } +} + +const log = getLog("request-logger"); -export function middleware(request: NextRequest) { +export async function middleware(request: NextRequest) { let response; if (request.nextUrl.pathname.startsWith("/p.js")) { response = NextResponse.rewrite(new URL("/api/s/javascript-library", request.url)); + } else if (request.nextUrl.pathname.startsWith("/v1/batch")) { + response = NextResponse.rewrite(new URL("/api/s/batch", request.url)); } else { response = NextResponse.next(); } + + if (logRequests) { + const method = request.method; + const body = request.body; + if (body) { + console.log(`${method} ${request.nextUrl.pathname}`, prettifyBody(await request.text())); + } else { + console.log(`${method} ${request.nextUrl.pathname}`); + } + } + response.headers.set("X-Frame-Options", "DENY"); return response; } diff --git a/webapps/console/pages/api/s/[...type].ts b/webapps/console/pages/api/s/[...type].ts index 71f3d6ef3..b07ee39ca 100644 --- a/webapps/console/pages/api/s/[...type].ts +++ b/webapps/console/pages/api/s/[...type].ts @@ -15,6 +15,7 @@ import { redis } from "../../../lib/server/redis"; import { Geo } from "@jitsu/protocols/functions"; import { isEU } from "../../../lib/shared/eu"; import { IncomingHttpHeaders } from "http"; +import { NextApiRequest, NextApiResponse } from "next"; function isInternalHeader(headerName: string) { return headerName.toLowerCase().startsWith("x-jitsu-") || headerName.toLowerCase().startsWith("x-vercel"); @@ -104,6 +105,213 @@ function buildResponse(baseUrl: string, stream: StreamWithDestinations): any { }; } +export function setResponseHeaders({ req, res }: { req: NextApiRequest; res: NextApiResponse }) { + res.setHeader("Access-Control-Allow-Origin", req.headers.origin || "*"); + res.setHeader("Access-Control-Allow-Methods", "*"); + res.setHeader("Access-Control-Allow-Headers", "x-enable-debug, x-write-key, authorization, content-type"); + res.setHeader("Access-Control-Allow-Credentials", "true"); +} + +export async function sendEventToBulker( + req: NextApiRequest, + ingestType: "s2s" | "browser", + event: AnalyticsServerEvent +) { + const bulkerAuthKey = process.env.BULKER_AUTH_KEY ?? ""; + const bulkerURLEnv: string | undefined = (process.env.BULKER_URL as string) || undefined; + const bulkerURLRetryAttempts = process.env.BULKER_URL_RETRY_ATTEMPTS + ? parseInt(process.env.BULKER_URL_RETRY_ATTEMPTS) + : bulkerURLDefaultRetryAttempts; + const bulkerURLRetryTimeoutMs = process.env.BULKER_URL_RETRY_TIMEOUT_MS + ? parseInt(process.env.BULKER_URL_RETRY_TIMEOUT_MS) + : bulkerURLDefaultRetryTimeout; + const isHttps = !!bulkerURLEnv && bulkerURLEnv.startsWith("https://"); + + const { slug, domain, writeKey } = getDataLocator(req, ingestType, event); + const type = event.type; + const message: IngestMessage = { + geo: fromHeaders(req.headers), + connectionId: "", + ingestType, + messageCreated: new Date().toISOString(), + messageId: event.messageId, + writeKey: writeKey ?? "", + type, + + origin: { + baseUrl: getReqEndpoint(req).baseUrl, + slug, + domain, + }, + httpHeaders: Object.entries(req.headers) + .filter(([k, v]) => v !== undefined && v !== null && !isInternalHeader(k)) + .map( + ([k, v]) => + (k.toLowerCase() === "x-write-key" ? [k, maskWriteKey(`${v}`)] : [k, v]) as [ + string, + string | string[] | undefined + ] + ) + .map(([k, v]) => [k, typeof v === "string" ? v : (v as string[]).join(",")]) + .reduce((acc, [k, v]) => ({ ...acc, [k]: v }), {}), + httpPayload: event, + }; + + log.atDebug().log(`Sending to bulker: ${JSON.stringify(message, null, 2)}`); + const payload = JSON.stringify(message); + // Options object + const options = { + method: "POST", + agent: (isHttps ? httpsAgent : httpAgent)(), + headers: { + "Content-Type": "application/json", + }, + }; + if (bulkerAuthKey) { + options.headers["Authorization"] = `Bearer ${bulkerAuthKey}`; + } + try { + let bulkerPromise; + let response: any; + let stream: StreamWithDestinations | undefined; + const loc = { + slug, + domain, + writeKey, + keyType: ingestType, + } as StreamLocator; + try { + stream = await getStream(loc); + if (stream) { + response = buildResponse(message.origin.baseUrl, stream); + } else { + const msg = `Source not found for ${JSON.stringify(loc)}`; + log.atWarn().log(msg); + response = { ok: false, error: msg }; + } + } catch (e) { + const msg = `Failed to get stream for ${JSON.stringify(loc)}: ${getErrorMessage(e)}`; + log.atWarn().withCause(e).log(msg); + response = { ok: false, error: msg }; + } + if (bulkerURLEnv) { + const injestUrl = bulkerURLEnv + "/ingest"; + bulkerPromise = httpRequest( + event.messageId, + injestUrl, + options, + { retryAttempts: bulkerURLRetryAttempts, retryTimeoutMs: bulkerURLRetryTimeoutMs }, + payload + ).then(response => + log + .atDebug() + .log( + `Event ID: ${type} / ${event.messageId} sent to bulker: ${injestUrl}. Response: ${JSON.stringify( + response + )} ` + ) + ); + if (stream?.backupEnabled) { + const backupUrl = `${bulkerURLEnv}/post/${stream.stream.workspaceId}_backup?tableName=backup`; + bulkerPromise = bulkerPromise + .then(() => + httpRequest( + event.messageId, + backupUrl, + options, + { retryAttempts: bulkerURLRetryAttempts, retryTimeoutMs: bulkerURLRetryTimeoutMs }, + payload + ) + ) + .then(response => + log + .atDebug() + .log( + `Event ID: ${type} / ${event.messageId} sent to backup: ${backupUrl}. Response: ${JSON.stringify( + response + )} ` + ) + ); + } + } else { + bulkerPromise = Promise.resolve(undefined); + log + .atWarn() + .log(`Bulker is not connected (BULKER_URL is not set). Request dump: ${JSON.stringify(message, null, 2)}`); + } + + const waitForBulker = req.query.sync as string; + if (waitForBulker === "true" || waitForBulker === "1") { + await bulkerPromise; + } else { + bulkerPromise.catch(e => { + log + .atError() + .withCause(e) + .log(`Failed to send event to bulker: ${getErrorMessage(e)}`); + }); + } + + if (response) { + return response; + } else { + return { ok: true }; + } + } catch (e: any) { + const errorMessage = `Failed to process event with ID ${event.messageId}: ${getErrorMessage(e)}`; + log.atDebug().withCause(e).log(errorMessage); + if (e.status && e.body) { + throw new ApiError(errorMessage, e.body, { status: e.status }); + } else { + throw new ApiError(errorMessage, undefined, { status: 500 }); + } + } +} + +export function patchEvent( + event: AnalyticsServerEvent, + type: string, + req: NextApiRequest, + ingestType: "s2s" | "browser" +) { + let typeFixed = + { + p: "page", + i: "identify", + t: "track", + g: "group", + a: "alias", + s: "screen", + e: "event", + }[type] || type; + + if (typeFixed === "event") { + typeFixed = requireDefined(event.type, `type property of event is required`); + } + + event.request_ip = + (req.headers["x-real-ip"] as string) || (req.headers["x-forwarded-for"] as string) || req.socket.remoteAddress; + + if (ingestType === "browser") { + event.context = event.context || {}; + event.context.ip = event.request_ip; + } + + const nowIsoDate = new Date().toISOString(); + event.receivedAt = nowIsoDate; + event.type = typeFixed as any; + if (!event.timestamp) { + event.timestamp = nowIsoDate; + } + if (!event.messageId) { + event.messageId = randomId(); + } + + if (!["page", "identify", "track", "group", "alias", "screen"].includes(typeFixed)) { + throw new ApiError(`Unknown event type: ${type}`, undefined, { status: 404 }); + } +} + const api: Api = { OPTIONS: { auth: false, @@ -129,202 +337,16 @@ const api: Api = { await redis.waitInit(); //TODO validate event messageId, timestamp - const bulkerURLEnv: string | undefined = (process.env.BULKER_URL as string) || undefined; - const bulkerURLRetryAttempts = process.env.BULKER_URL_RETRY_ATTEMPTS - ? parseInt(process.env.BULKER_URL_RETRY_ATTEMPTS) - : bulkerURLDefaultRetryAttempts; - const bulkerURLRetryTimeoutMs = process.env.BULKER_URL_RETRY_TIMEOUT_MS - ? parseInt(process.env.BULKER_URL_RETRY_TIMEOUT_MS) - : bulkerURLDefaultRetryTimeout; - const bulkerAuthKey = process.env.BULKER_AUTH_KEY ?? ""; - const isHttps = !!bulkerURLEnv && bulkerURLEnv.startsWith("https://"); const args = Array.isArray(req.query.type) ? req.query.type : [req.query.type]; const [prefix, ...rest] = args; const type: string = prefix === "s2s" ? rest.join("") : args.join(""); const ingestType: IngestType = prefix === "s2s" ? "s2s" : "browser"; - let typeFixed = - { - p: "page", - i: "identify", - t: "track", - g: "group", - a: "alias", - s: "screen", - e: "event", - }[type] || type; - const event = body as AnalyticsServerEvent; - if (typeFixed === "event") { - typeFixed = requireDefined(event.type, `type property of event is required`); - } - - event.request_ip = - (req.headers["x-real-ip"] as string) || (req.headers["x-forwarded-for"] as string) || req.socket.remoteAddress; - - if (ingestType === "browser") { - event.context = event.context || {}; - event.context.ip = event.request_ip; - } - - const nowIsoDate = new Date().toISOString(); - event.receivedAt = nowIsoDate; - event.type = typeFixed as any; - if (!event.timestamp) { - event.timestamp = nowIsoDate; - } - if (!event.messageId) { - event.messageId = randomId(); - } - - if (!["page", "identify", "track", "group", "alias", "screen"].includes(typeFixed)) { - throw new ApiError(`Unknown event type: ${type}`, undefined, { status: 404 }); - } - const { slug, domain, writeKey } = getDataLocator(req, ingestType); - if (!body.messageId) { - body.messageId = randomId(); - } - const message: IngestMessage = { - geo: fromHeaders(req.headers), - connectionId: "", - ingestType, - messageCreated: nowIsoDate, - messageId: body.messageId, - writeKey: writeKey ?? "", - type: typeFixed, - - origin: { - baseUrl: getReqEndpoint(req).baseUrl, - slug, - domain, - }, - httpHeaders: Object.entries(req.headers) - .filter(([k, v]) => v !== undefined && v !== null && !isInternalHeader(k)) - .map( - ([k, v]) => - (k.toLowerCase() === "x-write-key" ? [k, maskWriteKey(`${v}`)] : [k, v]) as [ - string, - string | string[] | undefined - ] - ) - .map(([k, v]) => [k, typeof v === "string" ? v : (v as string[]).join(",")]) - .reduce((acc, [k, v]) => ({ ...acc, [k]: v }), {}), - httpPayload: body, - }; - log.atDebug().log(`Sending to bulker: ${JSON.stringify(message, null, 2)}`); - const payload = JSON.stringify(message); - // Options object - const options = { - method: "POST", - agent: (isHttps ? httpsAgent : httpAgent)(), - headers: { - "Content-Type": "application/json", - }, - }; - if (bulkerAuthKey) { - options.headers["Authorization"] = `Bearer ${bulkerAuthKey}`; - } - res.setHeader("Access-Control-Allow-Origin", req.headers.origin || "*"); - res.setHeader("Access-Control-Allow-Methods", "*"); - res.setHeader("Access-Control-Allow-Headers", "x-enable-debug, x-write-key, authorization, content-type"); - res.setHeader("Access-Control-Allow-Credentials", "true"); - try { - let bulkerPromise; - let response: any; - let stream: StreamWithDestinations | undefined; - const loc = { - slug, - domain, - writeKey, - keyType: ingestType, - } as StreamLocator; - try { - stream = await getStream(loc); - if (stream) { - response = buildResponse(message.origin.baseUrl, stream); - } else { - const msg = `Source not found for ${JSON.stringify(loc)}`; - log.atWarn().log(msg); - response = { ok: false, error: msg }; - } - } catch (e) { - const msg = `Failed to get stream for ${JSON.stringify(loc)}: ${getErrorMessage(e)}`; - log.atWarn().withCause(e).log(msg); - response = { ok: false, error: msg }; - } - if (bulkerURLEnv) { - const injestUrl = bulkerURLEnv + "/ingest"; - bulkerPromise = httpRequest( - body.messageId, - injestUrl, - options, - { retryAttempts: bulkerURLRetryAttempts, retryTimeoutMs: bulkerURLRetryTimeoutMs }, - payload - ).then(response => - log - .atDebug() - .log( - `Event ID: ${typeFixed} / ${body.messageId} sent to bulker: ${injestUrl}. Response: ${JSON.stringify( - response - )} ` - ) - ); - if (stream?.backupEnabled) { - const backupUrl = `${bulkerURLEnv}/post/${stream.stream.workspaceId}_backup?tableName=backup`; - bulkerPromise = bulkerPromise - .then(() => - httpRequest( - body.messageId, - backupUrl, - options, - { retryAttempts: bulkerURLRetryAttempts, retryTimeoutMs: bulkerURLRetryTimeoutMs }, - payload - ) - ) - .then(response => - log - .atDebug() - .log( - `Event ID: ${typeFixed} / ${ - body.messageId - } sent to backup: ${backupUrl}. Response: ${JSON.stringify(response)} ` - ) - ); - } - } else { - bulkerPromise = Promise.resolve(undefined); - log - .atWarn() - .log(`Bulker is not connected (BULKER_URL is not set). Request dump: ${JSON.stringify(message, null, 2)}`); - } - - const waitForBulker = req.query.sync as string; - if (waitForBulker === "true" || waitForBulker === "1") { - await bulkerPromise; - } else { - bulkerPromise.catch(e => { - log - .atError() - .withCause(e) - .log(`Failed to send event to bulker: ${getErrorMessage(e)}`); - }); - } - - if (response) { - return response; - } else { - return { ok: true }; - } - } catch (e: any) { - const errorMessage = `Failed to process event with ID ${body.messageId}: ${getErrorMessage(e)}`; - log.atDebug().withCause(e).log(errorMessage); - if (e.status && e.body) { - throw new ApiError(errorMessage, e.body, { status: e.status }); - } else { - throw new ApiError(errorMessage, undefined, { status: 500 }); - } - } + patchEvent(event, type, req, ingestType); + setResponseHeaders({ res, req }); + return await sendEventToBulker(req, ingestType, event); }, }, }; diff --git a/webapps/console/pages/api/s/batch.ts b/webapps/console/pages/api/s/batch.ts new file mode 100644 index 000000000..8d88998e4 --- /dev/null +++ b/webapps/console/pages/api/s/batch.ts @@ -0,0 +1,50 @@ +import { createRoute } from "../../../lib/api"; +import { redis } from "../../../lib/server/redis"; +import { ApiError } from "../../../lib/shared/errors"; +import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; +import { getErrorMessage, getLog } from "juava"; +import { patchEvent, sendEventToBulker, setResponseHeaders } from "./[...type]"; +import { z } from "zod"; + +export default createRoute() + .POST({ + auth: false, + body: z.any(), + }) + .handler(async ({ body, req, res }) => { + //make sure that redis is initialized + await redis.waitInit(); + + const { batch } = body; + if (!batch) { + throw new ApiError("Payload should contain `batch` node", { status: 400 }); + } + + if (!Array.isArray(batch)) { + throw new ApiError("`batch` node should be an array", { status: 400 }); + } + + const size = (batch as any[]).length; + setResponseHeaders({ req, res }); + let okEvents = 0; + const errors: string[] = []; + for (let i = 0; i < size; i++) { + const _event = (batch as any[])[i]; + const event = _event as AnalyticsServerEvent; + try { + const ingestType = "s2s"; + patchEvent(event, "event", req, ingestType); + await sendEventToBulker(req, ingestType, event); + okEvents++; + } catch (e) { + getLog().atWarn().log(`Failed to process event ${i} / ${size} `, e); + errors.push(getErrorMessage(e)); + } + } + if (okEvents == size) { + return { ok: true, receivedEvents: size, okEvents: size }; + } else if (okEvents === 0) { + return { ok: false, receivedEvents: size, okEvents, errors }; + } + }) + .toNextApiHandler(); From 8edfbddb754c7b3e5ed679bbce02a989673fe98e Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 25 Aug 2023 10:30:15 +0400 Subject: [PATCH 0174/1353] don't read write key from body --- webapps/console/lib/domains.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/webapps/console/lib/domains.ts b/webapps/console/lib/domains.ts index a184b5065..74e4d8df6 100644 --- a/webapps/console/lib/domains.ts +++ b/webapps/console/lib/domains.ts @@ -45,8 +45,6 @@ export function getDataLocator(req: NextApiRequest, keyType: IngestType, event: return { writeKey: auth, keyType }; } else if (req.headers["x-write-key"]) { return { writeKey: req.headers["x-write-key"] as string, keyType }; - } else if (event.writeKey) { - return { writeKey: event.writeKey, keyType }; } else if (requestEndpoint.hostname === dataHost) { throw new Error(`Cannot get data slug from data hostname ${requestEndpoint.hostname}`); } else if (dataHost && requestEndpoint.hostname.endsWith(`.${dataHost}`)) { From 2b13ed56a75ebc2b6fc27caff4b1c207e6cbf4de Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 25 Aug 2023 12:43:32 +0400 Subject: [PATCH 0175/1353] batch endpoint: support shared context --- webapps/console/pages/api/s/[...type].ts | 8 ++++++-- webapps/console/pages/api/s/batch.ts | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/webapps/console/pages/api/s/[...type].ts b/webapps/console/pages/api/s/[...type].ts index b07ee39ca..6b05788fb 100644 --- a/webapps/console/pages/api/s/[...type].ts +++ b/webapps/console/pages/api/s/[...type].ts @@ -8,7 +8,7 @@ import { getServerLog } from "../../../lib/server/log"; import { checkHash, getErrorMessage, randomId, requireDefined } from "juava"; import { httpAgent, httpsAgent } from "../../../lib/server/http-agent"; -import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; +import { AnalyticsContext, AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import { fastStore, StreamWithDestinations } from "../../../lib/server/fast-store"; import { getCoreDestinationType } from "../../../lib/schema/destinations"; import { redis } from "../../../lib/server/redis"; @@ -272,7 +272,8 @@ export function patchEvent( event: AnalyticsServerEvent, type: string, req: NextApiRequest, - ingestType: "s2s" | "browser" + ingestType: "s2s" | "browser", + context?: AnalyticsContext ) { let typeFixed = { @@ -296,6 +297,9 @@ export function patchEvent( event.context = event.context || {}; event.context.ip = event.request_ip; } + if (context) { + event.context = { ...context, ...event.context }; + } const nowIsoDate = new Date().toISOString(); event.receivedAt = nowIsoDate; diff --git a/webapps/console/pages/api/s/batch.ts b/webapps/console/pages/api/s/batch.ts index 8d88998e4..6d08c1948 100644 --- a/webapps/console/pages/api/s/batch.ts +++ b/webapps/console/pages/api/s/batch.ts @@ -15,7 +15,7 @@ export default createRoute() //make sure that redis is initialized await redis.waitInit(); - const { batch } = body; + const { batch, context } = body; if (!batch) { throw new ApiError("Payload should contain `batch` node", { status: 400 }); } @@ -33,7 +33,7 @@ export default createRoute() const event = _event as AnalyticsServerEvent; try { const ingestType = "s2s"; - patchEvent(event, "event", req, ingestType); + patchEvent(event, "event", req, ingestType, context); await sendEventToBulker(req, ingestType, event); okEvents++; } catch (e) { From 1cc920d642fad0c6a8a96cf97714dea991cce5b6 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 25 Aug 2023 23:03:46 +0400 Subject: [PATCH 0176/1353] don't allow to create destinations that are coming soon. Add placeholder for 'hubspot' destination since it was already added to some projects --- libs/core-functions/src/index.ts | 1 + .../components/DestinationsCatalog/DestinationsCatalog.tsx | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/libs/core-functions/src/index.ts b/libs/core-functions/src/index.ts index c424e6e28..7d11d938e 100644 --- a/libs/core-functions/src/index.ts +++ b/libs/core-functions/src/index.ts @@ -23,6 +23,7 @@ const builtinDestinations: Record "builtin.destination.webhook": WebhookDestination as JitsuFunction, "builtin.destination.posthog": PosthogDestination as JitsuFunction, "builtin.destination.mongodb": MongodbDestination as JitsuFunction, + "builtin.destination.hubspot": () => null, "builtin.destination.devnull": () => null, } as const; diff --git a/webapps/console/components/DestinationsCatalog/DestinationsCatalog.tsx b/webapps/console/components/DestinationsCatalog/DestinationsCatalog.tsx index 5e337fa95..922f3ce6e 100644 --- a/webapps/console/components/DestinationsCatalog/DestinationsCatalog.tsx +++ b/webapps/console/components/DestinationsCatalog/DestinationsCatalog.tsx @@ -92,10 +92,10 @@ export const DestinationCatalog: React.FC<{ onClick: (destinationType: string) = {destinations.map(destination => (
    onClick(destination.id)} + onClick={!destination.comingSoon ? () => onClick(destination.id) : undefined} > {destination.comingSoon && (
    From 6e93c35c56af497591b211dabc02e3203251e3dc Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 28 Aug 2023 09:13:39 +0400 Subject: [PATCH 0177/1353] Limit Edge Middleware usage to specific requests --- webapps/console/middleware.ts | 4 +--- webapps/console/next.config.js | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/webapps/console/middleware.ts b/webapps/console/middleware.ts index e1c72d156..01fb5d1e2 100644 --- a/webapps/console/middleware.ts +++ b/webapps/console/middleware.ts @@ -28,7 +28,6 @@ export async function middleware(request: NextRequest) { } else { response = NextResponse.next(); } - if (logRequests) { const method = request.method; const body = request.body; @@ -39,10 +38,9 @@ export async function middleware(request: NextRequest) { } } - response.headers.set("X-Frame-Options", "DENY"); return response; } export const config = { - matcher: "", + matcher: !logRequests ? ["/p.js", "/v1/batch"] : "", }; diff --git a/webapps/console/next.config.js b/webapps/console/next.config.js index 2e334723c..7553cbaab 100644 --- a/webapps/console/next.config.js +++ b/webapps/console/next.config.js @@ -30,6 +30,20 @@ module.exports = { // skipDefaultConversion: true, // }, // }, + async headers() { + //set cors headers + return [ + { + source: "/:path*{/}?", + headers: [ + { + key: "X-Frame-Options", + value: "DENY", + }, + ], + }, + ]; + }, experimental: { outputFileTracingExcludes: { "*": [ From 7740e44b7e180a4280e1a5b711a3dfd9398b8351 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 30 Aug 2023 10:07:40 +0400 Subject: [PATCH 0178/1353] SchemaForm: workaround for buggy json schemas. support for nullable types --- webapps/console/components/ConfigObjectEditor/Editors.tsx | 6 +++++- .../console/components/ConfigObjectEditor/SchemaForm.tsx | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/webapps/console/components/ConfigObjectEditor/Editors.tsx b/webapps/console/components/ConfigObjectEditor/Editors.tsx index 821943294..f98d1fc53 100644 --- a/webapps/console/components/ConfigObjectEditor/Editors.tsx +++ b/webapps/console/components/ConfigObjectEditor/Editors.tsx @@ -69,7 +69,11 @@ export const NumberEditor: React.FC> = pro value={props.value} onChange={e => { const v = parseInt(e.target.value); - props.onChange(v); + if (isNaN(v)) { + props.onChange(undefined); + } else { + props.onChange(v); + } }} /> ); diff --git a/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx b/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx index cfe5f57ee..23ec44cb3 100644 --- a/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx +++ b/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx @@ -44,6 +44,10 @@ export const SchemaForm: React.FC<{ if (req && noValue) { return "Required"; } else if (!noValue) { + // workaround for buggy schema having null instead of "null" in type array + if (Array.isArray(fieldSchema.type)) { + fieldSchema.type = fieldSchema.type.map(t => (t === null ? "null" : t)); + } const validate = ajv.compile(fieldSchema); if (!validate(value)) { //show only one error message for the field @@ -159,7 +163,8 @@ export const SchemaForm: React.FC<{ /> ); } - switch (f.type) { + const typ = Array.isArray(f.type) ? f.type.find(t => t !== "null") : f.type; + switch (typ) { case "integer": case "number": return ; From 88ee4451a8692234980f7d65f34f0bb53c373ba3 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 30 Aug 2023 20:05:55 +0400 Subject: [PATCH 0179/1353] #1037 rotor: data layouts: fix idToSnakeCase bug --- libs/core-functions/__tests__/jitsu-legacy.test.ts | 14 +++++++++++--- .../src/functions/bulker-destination.ts | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/libs/core-functions/__tests__/jitsu-legacy.test.ts b/libs/core-functions/__tests__/jitsu-legacy.test.ts index a6eae7e0e..6e586572d 100644 --- a/libs/core-functions/__tests__/jitsu-legacy.test.ts +++ b/libs/core-functions/__tests__/jitsu-legacy.test.ts @@ -41,6 +41,8 @@ const identify: AnalyticsServerEvent = { timestamp: "2022-11-14T08:56:34.387Z", traits: { caseName: "basic-identify", + CaseLastName: "Doe", + User_Name: "jj", email: "john.doe2@gmail.com", }, type: "identify", @@ -66,6 +68,8 @@ const legacyIdentifyExpected: Omit & { loca id: "userId2", email: "john.doe2@gmail.com", case_name: "basic-identify", + case_last_name: "Doe", + user_name: "jj", }, user_agent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/107.0.5304.18 Safari/537.36", @@ -76,7 +80,7 @@ const legacyIdentifyExpected: Omit & { loca name: "campaign", source: "source", }, - vp_size: "", + vp_size: "1280x720", }; const page: AnalyticsServerEvent = { @@ -111,6 +115,8 @@ const page: AnalyticsServerEvent = { }, traits: { caseName: "identify-without-user-id", + CaseLastName: "Doe", + User_Name: "jj", email: "john.doe3@gmail.com", }, userAgent: @@ -149,6 +155,8 @@ const legacyPageExpected = { id: "userId2", email: "john.doe3@gmail.com", case_name: "identify-without-user-id", + case_last_name: "Doe", + user_name: "jj", }, user_agent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/107.0.5304.18 Safari/537.36", @@ -165,8 +173,8 @@ const legacyPageExpected = { test("legacy event", () => { const identifyLegacyResult = jitsuLegacy(identify).event; const pageLegacyResult = jitsuLegacy(page).event; - // console.log(JSON.stringify(identifyLegacyResult, null, 2)); - // expect(identifyLegacyResult).toStrictEqual(legacyIdentifyExpected); + console.log(JSON.stringify(identifyLegacyResult, null, 2)); + expect(identifyLegacyResult).toStrictEqual(legacyIdentifyExpected); console.log(JSON.stringify(pageLegacyResult, null, 2)); expect(pageLegacyResult).toStrictEqual(legacyPageExpected); diff --git a/libs/core-functions/src/functions/bulker-destination.ts b/libs/core-functions/src/functions/bulker-destination.ts index da09fef6b..9ef6abbab 100644 --- a/libs/core-functions/src/functions/bulker-destination.ts +++ b/libs/core-functions/src/functions/bulker-destination.ts @@ -21,7 +21,7 @@ function anonymizeIp(ip: string | undefined) { } function idToSnakeCase(id: string) { - return id.replace(/([A-Z])/g, "_$1").toLowerCase(); + return id.replace(/((?<=[a-zA-Z0-9])[A-Z])/g, "_$1").toLowerCase(); } function toSnakeCase(param: any): any { From 8be8b9f3dd83851e787b5b2aaea89b5924089062 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 30 Aug 2023 20:29:31 +0400 Subject: [PATCH 0180/1353] #1037 rotor: fix test --- libs/core-functions/__tests__/jitsu-legacy.test.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libs/core-functions/__tests__/jitsu-legacy.test.ts b/libs/core-functions/__tests__/jitsu-legacy.test.ts index 6e586572d..d642012e6 100644 --- a/libs/core-functions/__tests__/jitsu-legacy.test.ts +++ b/libs/core-functions/__tests__/jitsu-legacy.test.ts @@ -213,6 +213,8 @@ const pageSegmentExpected = { traits: { case_name: "identify-without-user-id", email: "john.doe3@gmail.com", + case_last_name: "Doe", + user_name: "jj", }, user_agent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/107.0.5304.18 Safari/537.36", From c116b8dc21bc6091f8192740f45c63ff3df42c89 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 5 Sep 2023 13:17:51 +0400 Subject: [PATCH 0181/1353] Added jitsu-made source to the connectors catalog --- .../ServicesCatalog/ServicesCatalog.tsx | 4 +- .../SyncEditorPage/SyncEditorPage.tsx | 49 ++++++++++---- .../api/sources/[packageType]/[packageId].ts | 10 +-- webapps/console/pages/api/sources/index.ts | 65 +++++++++++++++---- webapps/console/pages/api/sources/logo.ts | 9 +++ 5 files changed, 107 insertions(+), 30 deletions(-) diff --git a/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx b/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx index fa74a814c..395dc25f2 100644 --- a/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx +++ b/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx @@ -42,8 +42,8 @@ function groupByType(sources: SourceType[]): Record { export function getServiceIcon(source: SourceType) { const connectorSubtype = source.meta.connectorSubtype; - return source.logo ? ( - {source.meta.name} + return source.logoSvg ? ( + {source.meta.name} ) : connectorSubtype === "database" ? ( ) : ( diff --git a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx index f3f0931b8..712c12afa 100644 --- a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx +++ b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx @@ -298,9 +298,15 @@ function SyncEditor({ (storageKey: string, catalog: any, force?: boolean) => { const streams: SelectedStreams = {}; const currentStreams = force ? {} : syncOptions?.streams || {}; + const newSync = typeof syncOptions?.streams === "undefined" || force; for (const stream of catalog?.streams ?? []) { const name = stream.namespace ? `${stream.namespace}.${stream.name}` : stream.name; - streams[name] = currentStreams[name] || initStream(stream); + const currentStream = currentStreams[name]; + if (currentStream) { + streams[name] = currentStream; + } else if (newSync) { + streams[name] = initStream(stream); + } } if (xor(Object.keys(streams), Object.keys(currentStreams)).length > 0) { updateOptions({ streams, storageKey }); @@ -534,17 +540,18 @@ function SyncEditor({ value: m, label: createDisplayName(m), })); - let cursorFieldOptions: { value: string[]; label: string }[] = []; + let cursorFieldOptions: { value: string; label: string }[] = []; if (stream.supported_sync_modes.includes("incremental") && !stream.source_defined_cursor) { const props = Object.entries(stream.json_schema.properties as Record); cursorFieldOptions = props - .filter( - ([_, p]) => - p.format === "date-time" || - p.type === "integer" || - (Array.isArray(p.type) && p.type.includes("integer")) - ) - .map(([name, _]) => ({ value: [name], label: name })); + // .filter( + // ([_, p]) => + // p.format === "date-time" || + // p.type === "integer" || + // (Array.isArray(p.type) && p.type.includes("integer")) || + // true + // ) + .map(([name, _]) => ({ value: name, label: name })); } configItems.push({ @@ -579,9 +586,11 @@ function SyncEditor({ disabled={!syncOptions?.streams?.[name] || stream.source_defined_cursor} options={!stream.source_defined_cursor ? cursorFieldOptions : []} value={ - !stream.source_defined_cursor ? syncOptions?.streams?.[name]?.cursor_field ?? [] : undefined + !stream.source_defined_cursor ? syncOptions?.streams?.[name]?.cursor_field?.[0] : undefined } - onChange={v => updateSelectedStream(name, "cursor_field", v)} + onChange={v => { + updateSelectedStream(name, "cursor_field", v ? [v] : undefined); + }} /> @@ -722,4 +731,22 @@ function SyncEditor({ ); } +function CursorFieldSelector(props: { onAdd: (value: string) => void }) { + const [name, setName] = useState(""); + return ( +
    + setName(e.target.value)} /> + +
    + ); +} + export default SyncEditor; diff --git a/webapps/console/pages/api/sources/[packageType]/[packageId].ts b/webapps/console/pages/api/sources/[packageType]/[packageId].ts index e1b7e400c..9a6418e57 100644 --- a/webapps/console/pages/api/sources/[packageType]/[packageId].ts +++ b/webapps/console/pages/api/sources/[packageType]/[packageId].ts @@ -1,13 +1,17 @@ import { createRoute } from "../../../../lib/api"; import { db } from "../../../../lib/server/db"; import pick from "lodash/pick"; -import { SourceType } from "../index"; +import { JitsuSources, SourceType } from "../index"; export default createRoute() .GET({ auth: false }) .handler(async ({ req }): Promise => { const packageType = req.query.packageType as string; const packageId = req.query.packageId as string; + const jitsuSource = JitsuSources[packageId]; + if (jitsuSource) { + return jitsuSource; + } const connectorPackage = await db.prisma().connectorPackage.findFirst({ where: { packageType, packageId } }); if (!connectorPackage) { throw new Error(`Source ${packageId} of ${packageType} type not found`); @@ -16,9 +20,7 @@ export default createRoute() return { id, ...rest, - logo: logoSvg - ? `/api/sources/logo?type=${encodeURIComponent(rest.packageType)}&package=${encodeURIComponent(rest.packageId)}` - : undefined, + logoSvg, versions: `/api/sources/versions?type=${encodeURIComponent(rest.packageType)}&package=${encodeURIComponent( rest.packageId )}`, diff --git a/webapps/console/pages/api/sources/index.ts b/webapps/console/pages/api/sources/index.ts index bc458f09f..8815caa22 100644 --- a/webapps/console/pages/api/sources/index.ts +++ b/webapps/console/pages/api/sources/index.ts @@ -6,34 +6,73 @@ import pick from "lodash/pick"; export const SourceType = ConnectorPackageDbModel.merge( z.object({ - logo: z.string().optional(), versions: z.string(), meta: z.object({ name: z.string(), license: z.string(), mitVersions: z.array(z.string()).optional(), - releaseStage: z.string(), - dockerImageTag: z.string(), + releaseStage: z.string().optional(), + dockerImageTag: z.string().optional(), connectorSubtype: z.string(), - dockerRepository: z.string(), + dockerRepository: z.string().optional(), }), }) ); export type SourceType = z.infer; +const JitsuFirebaseSource: SourceType = { + id: "jitsu-firebase-source", + logoSvg: ` + + + + + `, + versions: `/api/sources/versions?type=airbyte&package=jitsucom%2Fsource-firebase`, + packageId: "jitsucom/source-firebase", + packageType: "airbyte", + meta: { + name: "Firebase", + license: "MIT", + connectorSubtype: "api", + }, + createdAt: new Date(), + updatedAt: new Date(), +}; + +const JitsuMongoDBSource: SourceType = { + id: "jitsu-mongodb-source", + logoSvg: ``, + versions: `/api/sources/versions?type=airbyte&package=jitsucom%2Fsource-mongodb`, + packageId: "jitsucom/source-mongodb", + packageType: "airbyte", + meta: { + name: "MongoDB", + license: "MIT", + connectorSubtype: "database", + }, + createdAt: new Date(), + updatedAt: new Date(), +}; + +export const JitsuSources: Record = { + "jitsucom/source-firebase": JitsuFirebaseSource, + "jitsucom/source-mongodb": JitsuMongoDBSource, +}; + export default createRoute() .GET({ auth: false }) .handler(async ({ req }): Promise<{ sources: SourceType[] }> => { - return { - sources: (await db.prisma().connectorPackage.findMany()).map(({ id, logoSvg, meta, ...rest }) => ({ + const sources: SourceType[] = (await db.prisma().connectorPackage.findMany()) + .filter(c => c.packageId !== "airbyte/source-mongodb-v2") + .map(({ id, logoSvg, meta, ...rest }) => ({ id, + logoSvg, ...rest, - logo: logoSvg - ? `/api/sources/logo?type=${encodeURIComponent(rest.packageType)}&package=${encodeURIComponent( - rest.packageId - )}` - : undefined, versions: `/api/sources/versions?type=${encodeURIComponent(rest.packageType)}&package=${encodeURIComponent( rest.packageId )}`, @@ -47,7 +86,7 @@ export default createRoute() "connectorSubtype", "dockerRepository" ), - })), - }; + })); + return { sources: [...Object.values(JitsuSources), ...sources] }; }) .toNextApiHandler(); diff --git a/webapps/console/pages/api/sources/logo.ts b/webapps/console/pages/api/sources/logo.ts index 83aca2133..696c0b06e 100644 --- a/webapps/console/pages/api/sources/logo.ts +++ b/webapps/console/pages/api/sources/logo.ts @@ -1,11 +1,20 @@ import { db } from "../../../lib/server/db"; import { getErrorMessage, requireDefined } from "juava"; +import { JitsuSources } from "./index"; export default async function handler(req, res) { try { const packageType = (req.query.type as string) || "airbyte"; const packageId = requireDefined(req.query.package as string, `GET param package is required`); + const jitsuSource = JitsuSources[packageId]; + if (jitsuSource) { + res.setHeader("Content-Type", "image/svg+xml"); + res.setHeader("Cache-Control", "public, max-age=2592000, immutable"); + res.status(200).send(jitsuSource.logoSvg); + return; + } + const data = await db .prisma() .connectorPackage.findFirst({ where: { packageId, packageType }, select: { logoSvg: true, meta: true } }); From f160156c0e1ca4fc258762455fcc78a4453d62dd Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 5 Sep 2023 16:36:14 +0400 Subject: [PATCH 0182/1353] syncs: added table name prefix parameter --- .../components/SyncEditorPage/SyncEditorPage.tsx | 16 ++++++++++++++++ .../pages/api/[workspaceId]/sources/run.ts | 6 ++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx index 712c12afa..d55847ff3 100644 --- a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx +++ b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx @@ -76,6 +76,7 @@ type SelectorProps = { type SyncOptionsType = { storageKey?: string; streams?: SelectedStreams; + tableNamePrefix?: string; schedule?: string; timezone?: string; }; @@ -436,6 +437,21 @@ function SyncEditor({ /> ), }, + { + name: "Table Name Prefix", + documentation: + "Prefix to add to all table names resulting from this sync. E.g. 'mysrc_'. Useful to avoid table names collisions with other syncs.", + component: ( +
    + updateOptions({ tableNamePrefix: e.target.value })} + /> +
    + ), + }, ]; if (appConfig.syncs.scheduler.enabled) { const disableScheduling = billing.enabled && !billing.loading && !billing.settings.maximumSyncFrequency; diff --git a/webapps/console/pages/api/[workspaceId]/sources/run.ts b/webapps/console/pages/api/[workspaceId]/sources/run.ts index d6d3a33d4..d6e6f5478 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/run.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/run.ts @@ -264,12 +264,10 @@ export default createRoute() version: (service.config as any).version, taskId, syncId: query.syncId, + startedBy: trigger === "manual" ? (user ? user.internalId : "manual") : "scheduled", + tableNamePrefix: sync.data?.["tableNamePrefix"] ?? "", }, body: { - startedBy: { - trigger, - ...(user ? { userId: user.internalId } : {}), - }, config: await tryManageOauthCreds({ ...(service.config as ServiceConfig), id: sync.fromId }), catalog: configuredCatalog, ...(stateObj ? { state: stateObj } : {}), From e7dfdc342b7ccd16d3c534b751cbc525c9cba77f Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 6 Sep 2023 11:33:23 +0400 Subject: [PATCH 0183/1353] provision db: fix credentials --- .../components/SyncEditorPage/SyncEditorPage.tsx | 2 +- .../console/pages/[workspaceId]/destinations.tsx | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx index d55847ff3..b38532db9 100644 --- a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx +++ b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx @@ -574,7 +574,7 @@ function SyncEditor({ group: "Streams", key: name, name: ( - + {name} ), diff --git a/webapps/console/pages/[workspaceId]/destinations.tsx b/webapps/console/pages/[workspaceId]/destinations.tsx index d25cd18d8..3717d7493 100644 --- a/webapps/console/pages/[workspaceId]/destinations.tsx +++ b/webapps/console/pages/[workspaceId]/destinations.tsx @@ -301,6 +301,7 @@ function CredentialsPopover(props: { credentials: ClickhouseConnectionCredential > {[ `clickhouse-client --host ${props.credentials.host} \\`, + `\t--accept-invalid-certificate \\`, `\t--database ${props.credentials.database} \\`, `\t--port ${props.credentials.tcpPort} --secure \\`, `\t--user ${props.credentials.username} \\`, @@ -316,16 +317,16 @@ function CredentialsPopover(props: { credentials: ClickhouseConnectionCredential {[ - `psql -host ${props.credentials.host} \\`, - `\t-p ${props.credentials.tcpPort} \\`, - `\t-u ${props.credentials.username} \\`, + `psql -h ${props.credentials.host} \\`, + `\t-p ${props.credentials.pgPort} \\`, + `\t-U ${props.credentials.username} \\`, `\t${props.credentials.database}`, ].join("\n")} @@ -338,7 +339,7 @@ function CredentialsPopover(props: { credentials: ClickhouseConnectionCredential {[ `echo 'SELECT * from events' |\\\n`, - `curl 'https://${props.credentials.username}:***@${props.credentials.host}:8123/?database=${props.credentials.database}' -d @-`, + `curl 'https://${props.credentials.username}:***@${props.credentials.host}:${props.credentials.httpPort}/?database=${props.credentials.database}' -d @-`, ].join("\n")} ), From 2fccc1cbba134980feeda84bc2febf3fd37bd316 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 6 Sep 2023 11:40:29 +0400 Subject: [PATCH 0184/1353] provision db: fix credentials --- webapps/console/pages/[workspaceId]/destinations.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/pages/[workspaceId]/destinations.tsx b/webapps/console/pages/[workspaceId]/destinations.tsx index 3717d7493..29f8a4744 100644 --- a/webapps/console/pages/[workspaceId]/destinations.tsx +++ b/webapps/console/pages/[workspaceId]/destinations.tsx @@ -346,7 +346,7 @@ function CredentialsPopover(props: { credentials: ClickhouseConnectionCredential }} > {[ - `echo 'SELECT * from events' |\\\n`, + `echo 'SELECT * from events' |\\`, `curl 'https://${props.credentials.username}:***@${props.credentials.host}:${props.credentials.httpPort}/?database=${props.credentials.database}' -d @-`, ].join("\n")} From 6e5c2d941cf6abb55c5762a6f8e56b6e66ce729a Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 6 Sep 2023 20:12:10 +0400 Subject: [PATCH 0185/1353] Correct Posthog API key description --- libs/core-functions/src/meta.ts | 2 +- webapps/console/components/DataView/DataView.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/core-functions/src/meta.ts b/libs/core-functions/src/meta.ts index 63ec2a751..b8f59f6c2 100644 --- a/libs/core-functions/src/meta.ts +++ b/libs/core-functions/src/meta.ts @@ -93,7 +93,7 @@ export const PosthogDestinationConfig = z.object({ key: z .string() .describe( - "API Key::Posthog API key. How to obtain" + "Project API Key::Posthog Project API Key. Can be found in Project Settings" ), host: z.string().optional().default(POSTHOG_DEFAULT_HOST).describe("Posthog host"), enableGroupAnalytics: z diff --git a/webapps/console/components/DataView/DataView.tsx b/webapps/console/components/DataView/DataView.tsx index 03f1dfbb6..8b16b1e4b 100644 --- a/webapps/console/components/DataView/DataView.tsx +++ b/webapps/console/components/DataView/DataView.tsx @@ -60,7 +60,7 @@ export function DataView() { }, { key: "functions", - label: `Functions Log`, + label: `API Destinations & Functions Logs`, children: ( Date: Thu, 7 Sep 2023 12:29:38 +0400 Subject: [PATCH 0186/1353] Fix billing link in FreePlanQuotaAlert --- webapps/console/components/PageLayout/WorkspacePageLayout.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index 0af5036bc..ca836a20b 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -483,7 +483,7 @@ const FreePlanQuotaAlert: React.FC<{}> = () => { You are projected to exceed your monthly events. Please upgrade your plan to avoid service disruption.{" "} Go to billing From cced0e98aa39274f2f83cfb75162ef2af9bdef2a Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 7 Sep 2023 16:46:45 +0400 Subject: [PATCH 0187/1353] rotor: bulker handles retrying of messages for destination-messages topic --- pnpm-lock.yaml | 3 + services/rotor/package.json | 1 + services/rotor/src/index.ts | 2 +- services/rotor/src/lib/rotor.ts | 92 +++++++++++----------- webapps/console/lib/server/kafka-config.ts | 4 + 5 files changed, 53 insertions(+), 49 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a224c75d1..dd4969748 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -343,6 +343,9 @@ importers: '@jitsu/core-functions': specifier: workspace:* version: link:../../libs/core-functions + dayjs: + specifier: ^1.11.7 + version: 1.11.7 express: specifier: ^4.18.2 version: 4.18.2 diff --git a/services/rotor/package.json b/services/rotor/package.json index 465cc4866..45dec2eb5 100644 --- a/services/rotor/package.json +++ b/services/rotor/package.json @@ -25,6 +25,7 @@ "juava": "workspace:*", "express": "^4.18.2", "glob": "^8.0.3", + "dayjs": "^1.11.7", "ioredis": "^5.2.3", "json-grab": "0.1.0-alpha.2", "json5": "^2.1.0", diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index b6545e084..778a1c7e8 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -123,7 +123,7 @@ export async function rotorMessageHandler(_message: string | undefined) { } else if (f.functionId.startsWith("udf.")) { const functionId = f.functionId.substring(4); const userFunctionObj = requireDefined( - await getCachedOrLoad(connectionsCache, functionId, key => { + await getCachedOrLoad(functionsCache, functionId, key => { return fastStore.getConfig("function", key); }), `Unknown function: ${functionId}` diff --git a/services/rotor/src/lib/rotor.ts b/services/rotor/src/lib/rotor.ts index 6a913d95f..983d83285 100644 --- a/services/rotor/src/lib/rotor.ts +++ b/services/rotor/src/lib/rotor.ts @@ -1,12 +1,38 @@ import { getLog } from "juava"; -import { connectToKafka, deatLetterTopic, KafkaCredentials } from "@jitsu-internal/console/lib/server/kafka-config"; +import { + connectToKafka, + deatLetterTopic, + KafkaCredentials, + retryTopic, +} from "@jitsu-internal/console/lib/server/kafka-config"; import Prometheus from "prom-client"; import PQueue from "p-queue"; const concurrency = process.env.CONCURRENCY ? parseInt(process.env.CONCURRENCY) : 50; +import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; +dayjs.extend(utc); const log = getLog("kafka-rotor"); -const maxLocalRetries = 2; +const RETRY_TIME_HEADER = "retry_time"; +const RETRY_COUNT_HEADER = "retries"; +const ORIGINAL_TOPIC_HEADER = "original_topic"; + +const MESSAGES_RETRY_COUNT = process.env.MESSAGES_RETRY_COUNT ? parseInt(process.env.MESSAGES_RETRY_COUNT) : 3; +// MESSAGES_RETRY_BACKOFF_BASE defines base for exponential backoff in minutes. +// For example, if MESSAGES_RETRY_COUNT is 3 and base is 5, then retry delays will be 5, 25, 125 minutes. +const MESSAGES_RETRY_BACKOFF_BASE = process.env.MESSAGES_RETRY_BACKOFF_BASE + ? parseInt(process.env.MESSAGES_RETRY_BACKOFF_BASE) + : 2; +// MESSAGES_RETRY_BACKOFF_MAX_DELAY defines maximum possible retry delay in minutes. Default: 1440 minutes = 24 hours +const MESSAGES_RETRY_BACKOFF_MAX_DELAY = process.env.MESSAGES_RETRY_BACKOFF_MAX_DELAY + ? parseInt(process.env.MESSAGES_RETRY_BACKOFF_MAX_DELAY) + : 1440; + +function RetryBackOffTime(attempt: number) { + const backOffDelayMin = Math.min(Math.pow(MESSAGES_RETRY_BACKOFF_BASE, attempt), MESSAGES_RETRY_BACKOFF_MAX_DELAY); + return dayjs().add(backOffDelayMin, "minute").utc().toISOString(); +} export class NotRetryableError extends Error { public doNotRetry: boolean = true; @@ -16,30 +42,6 @@ export class NotRetryableError extends Error { } } -async function withRetries(f: () => Promise, opts: { maxRetries?: number; pauseSeconds?: number } = {}) { - const { maxRetries = 2, pauseSeconds = 5 } = opts; - while (true) { - try { - await f(); - break; - } catch (e: any) { - if (e.doNotRetry) { - throw e; - } - log - .atDebug() - .withCause(e) - .log(`Failed to process message. (Local) retries left: ${maxRetries - 1}`); - if (maxRetries > 1) { - await new Promise(resolve => setTimeout(resolve, pauseSeconds * 1000)); - return withRetries(f, { maxRetries: maxRetries - 1, pauseSeconds }); - } else { - throw e; - } - } - } -} - export type KafkaRotorConfig = { credentials: KafkaCredentials; consumerGroupId: string; @@ -53,8 +55,8 @@ export type KafkaRotor = { start: () => Promise; }; -function shouldReturnToQueue(firstProcessed: Date, maxSecondsInQueueAfterFailure: number, error: any) { - return !error.doNotRetry && Date.now() - firstProcessed.getTime() <= maxSecondsInQueueAfterFailure * 1000; +function shouldRetry(retries: number, error: any) { + return !error.doNotRetry && retries < MESSAGES_RETRY_COUNT; } export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { @@ -127,37 +129,30 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { async function onMessage(message: any, topic: string, partition: number) { messagesConsumed.inc({ topic, partition }); - const firstProcessed = message.headers?.firstProcessed - ? new Date(message.headers?.firstProcessed.toString()) - : new Date(); - const retries = message.headers?.retries ? parseInt(message.headers?.retries.toString()) : 0; + const headers = message.headers || {}; + const retries = headers[RETRY_COUNT_HEADER] ? parseInt(headers[RETRY_COUNT_HEADER].toString()) : 0; try { - await withRetries( - async () => { - if (message.value) { - await cfg.handle(message.value?.toString()); - } - }, - { maxRetries: maxLocalRetries } - ); - messagesProcessed.inc({ topic, partition }); + if (message.value) { + await cfg.handle(message.value?.toString()); + messagesProcessed.inc({ topic, partition }); + } } catch (e) { - const returnToQueue = shouldReturnToQueue(firstProcessed, maxSecondsInQueueAfterFailure, e); + const retry = shouldRetry(retries, e); log .atError() .withCause(e) .log( - `Failed to process message for ${message.key || "(no key set)"} after ${maxLocalRetries} local retries. ${ - returnToQueue ? "Message will be returned to reprocessing" : "Message will be sent to dead-letter queue" + `Failed to process message for ${message.key || "(no key set)"} after ${retries} local retries. ${ + retry ? "Message will be returned to reprocessing" : "Message will be sent to dead-letter queue" }: ${message.value}` ); - if (!returnToQueue) { + if (!retry) { messagesDeadLettered.inc({ topic }); } else { messagesRequeued.inc({ topic }); } - const requeueTopic = returnToQueue ? topic : deatLetterTopic(); + const requeueTopic = retry ? retryTopic() : deatLetterTopic(); try { await producer.send({ topic: requeueTopic, @@ -166,8 +161,9 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { value: message.value, key: message.key, headers: { - firstProcessed: firstProcessed.toISOString(), - retries: `${retries + 1}`, + [RETRY_COUNT_HEADER]: `${retries}`, + [ORIGINAL_TOPIC_HEADER]: topic, + [RETRY_TIME_HEADER]: RetryBackOffTime(retries + 1), }, }, ], diff --git a/webapps/console/lib/server/kafka-config.ts b/webapps/console/lib/server/kafka-config.ts index c4f136dbe..5cb5b545b 100644 --- a/webapps/console/lib/server/kafka-config.ts +++ b/webapps/console/lib/server/kafka-config.ts @@ -78,6 +78,10 @@ export function deatLetterTopic(): string { return process.env.KAFKA_DESTINATIONS_DEAD_LETTER_TOPIC_NAME || "destination-messages-dead-letter"; } +export function retryTopic(): string { + return process.env.KAFKA_DESTINATIONS_RETRY_TOPIC_NAME || "destination-messages-retry"; +} + export function destinationMessagesTopicMultiThreaded(): string { return process.env.KAFKA_DESTINATIONS_MT_TOPIC_NAME || "destination-messages-mt"; } From 809178a6c4229e262349d5bd771a9c84fd0ed417 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 11 Sep 2023 12:00:31 +0400 Subject: [PATCH 0188/1353] ingest: more flexible logic for finding stream --- webapps/console/lib/domains.ts | 27 ++++----- webapps/console/pages/api/s/[...type].ts | 72 +++++++++++++----------- 2 files changed, 52 insertions(+), 47 deletions(-) diff --git a/webapps/console/lib/domains.ts b/webapps/console/lib/domains.ts index 74e4d8df6..42b252beb 100644 --- a/webapps/console/lib/domains.ts +++ b/webapps/console/lib/domains.ts @@ -1,6 +1,5 @@ import { NextApiRequest } from "next"; import { getErrorMessage, getLog } from "juava"; -import { MergeExclusive, Simplify } from "type-fest"; import { IngestType } from "@jitsu/protocols/async-request"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; @@ -25,9 +24,7 @@ export function getDataDomain({ hostname }: PublicEndpoint): string | undefined return undefined; } -export type StreamLocator = Simplify< - MergeExclusive, { writeKey: string; keyType: IngestType }> ->; +export type StreamCredentials = { domain?: string; slug?: string; writeKey?: string; ingestType: IngestType }; /** * Example: @@ -36,22 +33,26 @@ export type StreamLocator = Simplify< * @param req * @param keyType type of a key */ -export function getDataLocator(req: NextApiRequest, keyType: IngestType, event: AnalyticsServerEvent): StreamLocator { +export function getDataLocator( + req: NextApiRequest, + ingestType: IngestType, + event: AnalyticsServerEvent +): StreamCredentials { const requestEndpoint = getReqEndpoint(req); const [dataHost] = getDataDomain(requestEndpoint)?.split(":") || [undefined]; //ignore port, port can be used only in dev env - + const loc: Partial = { ingestType }; if (req.headers["authorization"]) { const auth = Buffer.from(req.headers["authorization"].replace("Basic ", ""), "base64").toString("utf-8"); - return { writeKey: auth, keyType }; + loc.writeKey = auth; } else if (req.headers["x-write-key"]) { - return { writeKey: req.headers["x-write-key"] as string, keyType }; - } else if (requestEndpoint.hostname === dataHost) { - throw new Error(`Cannot get data slug from data hostname ${requestEndpoint.hostname}`); - } else if (dataHost && requestEndpoint.hostname.endsWith(`.${dataHost}`)) { - return { slug: requestEndpoint.hostname.replace(`.${dataHost}`, "") }; + loc.writeKey = req.headers["x-write-key"] as string; + } + if (dataHost && requestEndpoint.hostname.endsWith(`.${dataHost}`)) { + loc.slug = requestEndpoint.hostname.replace(`.${dataHost}`, ""); } else { - return { domain: requestEndpoint.hostname }; + loc.domain = requestEndpoint.hostname; } + return loc as StreamCredentials; } export function getDefaultPort(protocol: HttpProtocolVariant) { diff --git a/webapps/console/pages/api/s/[...type].ts b/webapps/console/pages/api/s/[...type].ts index 6b05788fb..25b2de206 100644 --- a/webapps/console/pages/api/s/[...type].ts +++ b/webapps/console/pages/api/s/[...type].ts @@ -1,4 +1,4 @@ -import { getDataLocator, getReqEndpoint, StreamLocator } from "../../../lib/domains"; +import { getDataLocator, getReqEndpoint, StreamCredentials } from "../../../lib/domains"; import { Api, nextJsApiHandler } from "../../../lib/api"; import { z } from "zod"; import { ApiError } from "../../../lib/shared/errors"; @@ -28,7 +28,9 @@ const bulkerURLDefaultRetryAttempts = 3; const log = getServerLog("ingest-api"); -async function getStream(loc: StreamLocator): Promise { +type StreamLocator = (loc: StreamCredentials) => Promise; + +const WriteKeyStreamLocator: StreamLocator = async loc => { if (loc.writeKey) { const [keyId, keySecret] = loc.writeKey.split(":"); if (!keySecret) { @@ -37,31 +39,43 @@ async function getStream(loc: StreamLocator): Promise { + if (loc.slug) { return await fastStore.getStreamById(loc.slug); - } else if (loc.domain) { + } +}; + +const DomainStreamLocator: StreamLocator = async loc => { + if (loc.domain) { const streams = (await fastStore.getStreamsByDomain(loc.domain)) || []; if (streams.length == 1) { return streams[0]; - } else if (streams.length > 1) { - throw new Error(`Multiple streams found for domain ${loc.domain}`); - } else { - return undefined; } - } else { - return undefined; + } +}; + +async function getStream(loc: StreamCredentials): Promise { + const locators = + loc.ingestType === "s2s" + ? [WriteKeyStreamLocator, SlugStreamLocator, DomainStreamLocator] + : [SlugStreamLocator, DomainStreamLocator, WriteKeyStreamLocator]; + for (const locator of locators) { + const stream = await locator(loc); + if (stream) { + return stream; + } } } @@ -112,11 +126,7 @@ export function setResponseHeaders({ req, res }: { req: NextApiRequest; res: Nex res.setHeader("Access-Control-Allow-Credentials", "true"); } -export async function sendEventToBulker( - req: NextApiRequest, - ingestType: "s2s" | "browser", - event: AnalyticsServerEvent -) { +export async function sendEventToBulker(req: NextApiRequest, ingestType: IngestType, event: AnalyticsServerEvent) { const bulkerAuthKey = process.env.BULKER_AUTH_KEY ?? ""; const bulkerURLEnv: string | undefined = (process.env.BULKER_URL as string) || undefined; const bulkerURLRetryAttempts = process.env.BULKER_URL_RETRY_ATTEMPTS @@ -127,7 +137,7 @@ export async function sendEventToBulker( : bulkerURLDefaultRetryTimeout; const isHttps = !!bulkerURLEnv && bulkerURLEnv.startsWith("https://"); - const { slug, domain, writeKey } = getDataLocator(req, ingestType, event); + const loc = getDataLocator(req, ingestType, event); const type = event.type; const message: IngestMessage = { geo: fromHeaders(req.headers), @@ -135,13 +145,13 @@ export async function sendEventToBulker( ingestType, messageCreated: new Date().toISOString(), messageId: event.messageId, - writeKey: writeKey ?? "", + writeKey: loc.writeKey ?? "", type, origin: { baseUrl: getReqEndpoint(req).baseUrl, - slug, - domain, + slug: loc.slug, + domain: loc.domain, }, httpHeaders: Object.entries(req.headers) .filter(([k, v]) => v !== undefined && v !== null && !isInternalHeader(k)) @@ -174,12 +184,6 @@ export async function sendEventToBulker( let bulkerPromise; let response: any; let stream: StreamWithDestinations | undefined; - const loc = { - slug, - domain, - writeKey, - keyType: ingestType, - } as StreamLocator; try { stream = await getStream(loc); if (stream) { From 74bfa01f117768997637e4496e3d91972e353301 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 12 Sep 2023 13:52:45 +0400 Subject: [PATCH 0189/1353] OAuth support for Salesforce --- .../ServiceEditor/ServiceEditor.tsx | 4 +- webapps/console/lib/server/oauth/services.ts | 44 +++++++++++++++++++ 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/webapps/console/components/ServiceEditor/ServiceEditor.tsx b/webapps/console/components/ServiceEditor/ServiceEditor.tsx index 6ed9bdd0f..eb4d8c0b8 100644 --- a/webapps/console/components/ServiceEditor/ServiceEditor.tsx +++ b/webapps/console/components/ServiceEditor/ServiceEditor.tsx @@ -24,7 +24,6 @@ import { SchemaForm } from "../ConfigObjectEditor/SchemaForm"; import { TextEditor } from "../ConfigObjectEditor/Editors"; import { useAntdModal } from "../../lib/modal"; import hash from "stable-hash"; -import { nangoConfig } from "../../lib/server/oauth/nango-config"; type ServiceEditorProps = {} & EditorComponentProps; @@ -54,8 +53,7 @@ export const ServiceEditor: React.FC = props => { const [nangoError, setNangoError] = useState(undefined); const [loadingSpecs, setLoadingSpecs] = useState(true); const [specs, setSpecs] = useState(undefined); - - const oauthConnector = nangoConfig.enabled ? oauthDecorators.find(d => d.packageId === obj.package) : ""; + const oauthConnector = appConfig.nango ? oauthDecorators.find(d => d.packageId === obj.package) : ""; const [manualAuth, setManualAuth] = useState(typeof oauthConnector === "undefined"); const ajv = useMemo( () => new Ajv({ allErrors: true, strictSchema: false, useDefaults: true, allowUnionTypes: true }), diff --git a/webapps/console/lib/server/oauth/services.ts b/webapps/console/lib/server/oauth/services.ts index 53a1d0f8c..24e926bb3 100644 --- a/webapps/console/lib/server/oauth/services.ts +++ b/webapps/console/lib/server/oauth/services.ts @@ -92,6 +92,48 @@ const github: OauthDecorator = { }, }; +const salesforce: OauthDecorator = { + stripSchema: (schema: any) => { + return { + ...schema, + refresh_token: JITSU_MANAGED, + client_id: JITSU_MANAGED, + client_secret: JITSU_MANAGED, + }; + }, + packageId: "airbyte/source-salesforce", + packageType: "airbyte", + nangoProvider: "salesforce", + merge: (opts, integrationObj, connectionObj) => { + const mCred = { ...opts }; + mCred.refresh_token = manage(mCred.refresh_token, connectionObj.refresh_token); + mCred.client_id = manage(mCred.client_id, integrationObj.client_id); + mCred.client_secret = manage(mCred.client_secret, integrationObj.client_secret); + return mCred; + }, +}; + +const salesforceSinger: OauthDecorator = { + stripSchema: (schema: any) => { + return { + ...schema, + refresh_token: JITSU_MANAGED, + client_id: JITSU_MANAGED, + client_secret: JITSU_MANAGED, + }; + }, + packageId: "airbyte/source-salesforce-singer", + packageType: "airbyte", + nangoProvider: "salesforce", + merge: (opts, integrationObj, connectionObj) => { + const mCred = { ...opts }; + mCred.refresh_token = manage(mCred.refresh_token, connectionObj.refresh_token); + mCred.client_id = manage(mCred.client_id, integrationObj.client_id); + mCred.client_secret = manage(mCred.client_secret, integrationObj.client_secret); + return mCred; + }, +}; + const _googleBase: Omit = { stripSchema: (schema: any) => { return { @@ -200,6 +242,8 @@ const facebookMarketing: OauthDecorator = { export const oauthDecorators = [ github, + salesforce, + salesforceSinger, googleAnalytics, googleAnalyticsGA4, googleAds, From 59d7d79ffc4903a38d57e1d0554e261b1d8c3515 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 13 Sep 2023 16:38:24 +0400 Subject: [PATCH 0190/1353] Amplitude destination --- libs/core-functions/package.json | 1 + .../src/functions/amplitude-destination.ts | 163 ++++++++++++++++++ .../src/functions/posthog-destination.ts | 2 +- libs/core-functions/src/index.ts | 2 + libs/core-functions/src/meta.ts | 26 +++ pnpm-lock.yaml | 22 +++ .../PageLayout/WorkspacePageLayout.tsx | 2 + webapps/console/lib/schema/destinations.tsx | 5 +- 8 files changed, 218 insertions(+), 5 deletions(-) create mode 100644 libs/core-functions/src/functions/amplitude-destination.ts diff --git a/libs/core-functions/package.json b/libs/core-functions/package.json index 9e6014006..a21209132 100644 --- a/libs/core-functions/package.json +++ b/libs/core-functions/package.json @@ -38,6 +38,7 @@ "lodash": "^4.17.21", "mongodb": "^5.1.0", "posthog-node": "^2.4.0", + "@amplitude/analytics-node": "^1.3.3", "tslib": "^2.4.0", "zod": "3.21.4", "agentkeepalive": "4.3.0" diff --git a/libs/core-functions/src/functions/amplitude-destination.ts b/libs/core-functions/src/functions/amplitude-destination.ts new file mode 100644 index 000000000..ec31bee86 --- /dev/null +++ b/libs/core-functions/src/functions/amplitude-destination.ts @@ -0,0 +1,163 @@ +import { JitsuFunction } from "@jitsu/protocols/functions"; +import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; +import { getEventCustomProperties } from "./lib"; +import { parseUserAgent } from "./lib/browser"; +import { init, track, flush, identify, Identify, groupIdentify } from "@amplitude/analytics-node"; +import { AmplitudeDestinationConfig } from "../meta"; + +function getHostFromUrl(url: string | undefined): string | undefined { + if (!url) { + return undefined; + } + try { + return new URL(url).hostname; + } catch (e) { + return undefined; + } +} + +function getPathFromUrl(url: string | undefined): string | undefined { + if (!url) { + return undefined; + } + try { + return new URL(url).pathname; + } catch (e) { + return undefined; + } +} + +function getEventProperties(event: AnalyticsServerEvent) { + //see https://github.com/PostHog/posthog-js-lite/blob/master/posthog-web/src/context.ts + const browser = event.context?.userAgent + ? parseUserAgent(event.context?.userAgent, event.context?.userAgentVendor) + : undefined; + return { + referrer: event.context?.page?.referrer, + referring_domain: event.context?.page?.referring_domain || getHostFromUrl(event.context?.page?.referrer), + url: event.context?.page?.url, + host: event.context?.page?.host || getHostFromUrl(event.context?.page?.url), + pathname: event.context?.page?.path || getPathFromUrl(event.context?.page?.url), + + browser: browser?.name, + device: browser?.deviceType, + os: browser?.os, + browser_version: browser?.browserVersion, + + //implement when it's implemented on a client, doesn't seem like a very important data points + screen_dpi: event.context?.screen?.density, + screen_height: event.context?.screen?.height, + screen_width: event.context?.screen?.width, + ...getEventCustomProperties(event, { + exclude: obj => { + delete obj.traits; + delete obj.referer; + delete obj.groupId; + delete obj.referring_domain; + delete obj.url; + delete obj.host; + delete obj.path; + delete obj.screen; + delete obj.page; + delete obj.width; + delete obj.height; + }, + }), + }; +} + +const AmplitudeDestination: JitsuFunction = async ( + event, + { props, fetch, log, geo } +) => { + const groupType = props.groupType || "group"; + const deviceId = event.anonymousId; + await init(props.key, { + logLevel: 0, + serverZone: props.dataResidency, + }).promise; + if (event.type === "identify") { + const identifyObj = new Identify(); + for (const [key, value] of Object.entries(event.traits || {})) { + if (value) { + identifyObj.set(key, `${value}`); + } + } + identify(identifyObj, { + user_id: event.userId, + }).promise.then(res => { + if (res.code === 200) { + log.info(`Amplitude identify OK: ${res.code} message: ${res.message}`); + } else { + log.error(`Amplitude identify Error: ${res.code} message: ${res.message}`); + } + }); + } else if (event.type === "group" && props.enableGroupAnalytics) { + const identifyObj = new Identify(); + for (const [key, value] of Object.entries(event.traits || {})) { + if (value) { + identifyObj.set(key, `${value}`); + } + } + groupIdentify(groupType, event.groupId ?? "", identifyObj, { + user_id: event.userId, + }).promise.then(res => { + if (res.code === 200) { + log.info(`Amplitude groupIdentify OK: ${res.code} message: ${res.message}`); + } else { + log.error(`Amplitude groupIdentify Error: ${res.code} message: ${res.message}`); + } + }); + } else if (event.type === "page" || event.type === "track") { + const userId = event.userId; + if (userId || props.enableAnonymousUserProfiles) { + const eventName = event.type === "page" ? "pageview" : event.event || event.name || "Unknown Event"; + let groups = {}; + if (event.context?.groupId && props.enableGroupAnalytics) { + groups = { [groupType]: event.context?.groupId }; + } + let geoObj: any = {}; + if (geo) { + geoObj = { + country: geo.country?.code, + region: geo.region?.code, + city: geo.city?.name, + dma: geo.location?.usaData ? geo.location.usaData.metroCode : undefined, + location_lat: geo.location?.latitude, + location_lng: geo.location?.longitude, + }; + } + const browser = event.context?.userAgent + ? parseUserAgent(event.context?.userAgent, event.context?.userAgentVendor) + : undefined; + track( + { + event_type: eventName, + event_properties: event.properties, + groups, + user_properties: event.context?.traits, + }, + undefined, + { + user_id: userId, + device_id: deviceId ?? undefined, + os_name: browser?.os, + language: event.context?.locale, + ip: event.request_ip, + insert_id: event.messageId, + user_agent: event.context?.userAgent, + ...geoObj, + } + ).promise.then(res => { + if (res.code === 200) { + log.info(`Amplitude track OK: ${res.code} message: ${res.message}`); + } else { + log.error(`Amplitude track Error: ${res.code} message: ${res.message}`); + } + }); + } + } + await flush().promise; +}; + +export default AmplitudeDestination; diff --git a/libs/core-functions/src/functions/posthog-destination.ts b/libs/core-functions/src/functions/posthog-destination.ts index 9bf1eac7a..df60862fd 100644 --- a/libs/core-functions/src/functions/posthog-destination.ts +++ b/libs/core-functions/src/functions/posthog-destination.ts @@ -105,7 +105,7 @@ const PosthogDestination: JitsuFunction = { "builtin.destination.bulker": BulkerDestination as JitsuFunction, @@ -23,6 +24,7 @@ const builtinDestinations: Record "builtin.destination.webhook": WebhookDestination as JitsuFunction, "builtin.destination.posthog": PosthogDestination as JitsuFunction, "builtin.destination.mongodb": MongodbDestination as JitsuFunction, + "builtin.destination.amplitude": AmplitudeDestination as JitsuFunction, "builtin.destination.hubspot": () => null, "builtin.destination.devnull": () => null, } as const; diff --git a/libs/core-functions/src/meta.ts b/libs/core-functions/src/meta.ts index b8f59f6c2..1182653b4 100644 --- a/libs/core-functions/src/meta.ts +++ b/libs/core-functions/src/meta.ts @@ -120,6 +120,32 @@ export const PosthogDestinationConfig = z.object({ export type PosthogDestinationConfig = z.infer; +export const AmplitudeDestinationConfig = z.object({ + key: z.string().describe("Project API Key::Amplitude Project API Key."), + enableGroupAnalytics: z + .boolean() + .optional() + .default(false) + .describe( + "Build an analysis around aggregated units of measure like accounts, charts, or order IDs. Requires The Amplitude Accounts add-on. Learn more." + ), + groupType: z + .string() + .optional() + .default("company") + .describe( + "Group type is the abstract type of whatever our group represents (e.g. accounts, charts, or order IDs)." + ), + enableAnonymousUserProfiles: z + .boolean() + .optional() + .default(false) + .describe("If enabled, anonymous users will be tracked in Amplitude"), + dataResidency: z.enum(["US", "EU"]).optional().default("US"), +}); + +export type AmplitudeDestinationConfig = z.infer; + export const MongodbDestinationConfig = z.object({ url: z.string().optional(), protocol: z diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dd4969748..4644b811f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -135,6 +135,9 @@ importers: libs/core-functions: dependencies: + '@amplitude/analytics-node': + specifier: ^1.3.3 + version: 1.3.3 '@swc/core': specifier: ^1.3.40 version: 1.3.49 @@ -865,6 +868,25 @@ packages: resolution: {integrity: sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==} dev: true + /@amplitude/analytics-core@1.2.3: + resolution: {integrity: sha512-3WADE8IcxU7ZERMkBb0+JP7t6EekyFPM0djtNKXQaxgGgH3oqQzMmBCg19UnYYiBSHrZkpiMBLHNAvXL6HM7zg==} + dependencies: + '@amplitude/analytics-types': 1.3.3 + tslib: 2.5.0 + dev: false + + /@amplitude/analytics-node@1.3.3: + resolution: {integrity: sha512-G+5EoGcVOOclcNRR57AQcGqg46xNXjG6tsSdF71+Npzc6zTfvDzKDY97ZULBju9TT/FXvhP8LnppAI8umT6qkQ==} + dependencies: + '@amplitude/analytics-core': 1.2.3 + '@amplitude/analytics-types': 1.3.3 + tslib: 2.5.0 + dev: false + + /@amplitude/analytics-types@1.3.3: + resolution: {integrity: sha512-V4/h+izhG7NyVfIva1uhe6bToI/l5n+UnEomL3KEO9DkFoKiOG7KmXo/fmzfU6UmD1bUEWmy//hUFF16BfrEww==} + dev: false + /@ampproject/remapping@2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index ca836a20b..39985f916 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -362,6 +362,7 @@ function Breadcrumbs() { function UserProfileMenu({ user }: { user: { name: string; email: string } }) { const router = useRouter(); + const { analytics } = useJitsu(); const sessionControl = useUserSessionControls(); return (
    @@ -377,6 +378,7 @@ function UserProfileMenu({ user }: { user: { name: string; email: string } }) { { await sessionControl.logout(); + analytics.reset(); router.push("/", undefined, { shallow: true }); }} > diff --git a/webapps/console/lib/schema/destinations.tsx b/webapps/console/lib/schema/destinations.tsx index 28137b508..3c9d57ccc 100644 --- a/webapps/console/lib/schema/destinations.tsx +++ b/webapps/console/lib/schema/destinations.tsx @@ -612,10 +612,7 @@ export const coreDestinations: DestinationType[] = [ connectionOptions: CloudDestinationsConnectionOptions, title: "Amplitude", tags: "Product Analytics", - comingSoon: true, - credentials: z.object({ - apiKey: z.string().describe("API Key::Amplitude API Key"), - }), + credentials: meta.AmplitudeDestinationConfig, description: "Amplitude is a product analytics platform", }, { From c13f2618d97b22a8123d19e439efba4d9116fa63 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 20 Sep 2023 15:24:11 +0400 Subject: [PATCH 0191/1353] Amplitude destination: use our fetch wrapper --- libs/core-functions/package.json | 4 +++- .../src/functions/amplitude-destination.ts | 20 +++++++++++++++++++ pnpm-lock.yaml | 16 +++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/libs/core-functions/package.json b/libs/core-functions/package.json index a21209132..cfe9ccb57 100644 --- a/libs/core-functions/package.json +++ b/libs/core-functions/package.json @@ -28,7 +28,8 @@ "jest": "^29.5.0", "json5": "^2.1.0", "node-fetch-commonjs": "^3.2.4", - "ts-jest": "29.0.5" + "ts-jest": "29.0.5", + "@amplitude/analytics-types": "^2.2.0" }, "dependencies": { "@swc/core": "^1.3.40", @@ -38,6 +39,7 @@ "lodash": "^4.17.21", "mongodb": "^5.1.0", "posthog-node": "^2.4.0", + "@amplitude/analytics-core": "^2.0.5", "@amplitude/analytics-node": "^1.3.3", "tslib": "^2.4.0", "zod": "3.21.4", diff --git a/libs/core-functions/src/functions/amplitude-destination.ts b/libs/core-functions/src/functions/amplitude-destination.ts index ec31bee86..23e9a6a4f 100644 --- a/libs/core-functions/src/functions/amplitude-destination.ts +++ b/libs/core-functions/src/functions/amplitude-destination.ts @@ -2,7 +2,9 @@ import { JitsuFunction } from "@jitsu/protocols/functions"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import { getEventCustomProperties } from "./lib"; import { parseUserAgent } from "./lib/browser"; +import { BaseTransport } from "@amplitude/analytics-core"; import { init, track, flush, identify, Identify, groupIdentify } from "@amplitude/analytics-node"; +import { Payload, Response, Transport } from "@amplitude/analytics-types"; import { AmplitudeDestinationConfig } from "../meta"; function getHostFromUrl(url: string | undefined): string | undefined { @@ -72,9 +74,27 @@ const AmplitudeDestination: JitsuFunction { const groupType = props.groupType || "group"; const deviceId = event.anonymousId; + class FetchTransport extends BaseTransport implements Transport { + async send(serverUrl: string, payload: Payload): Promise { + const options = { + headers: { + "Content-Type": "application/json", + Accept: "*/*", + }, + body: JSON.stringify(payload), + method: "POST", + }; + const response = await fetch(serverUrl, options); + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const responsePayload: Record = await response.json(); + return this.buildResponse(responsePayload); + } + } + const transport = new FetchTransport(); await init(props.key, { logLevel: 0, serverZone: props.dataResidency, + transportProvider: transport, }).promise; if (event.type === "identify") { const identifyObj = new Identify(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4644b811f..7faac5248 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -135,6 +135,9 @@ importers: libs/core-functions: dependencies: + '@amplitude/analytics-core': + specifier: ^2.0.5 + version: 2.0.5 '@amplitude/analytics-node': specifier: ^1.3.3 version: 1.3.3 @@ -169,6 +172,9 @@ importers: specifier: 3.21.4 version: 3.21.4 devDependencies: + '@amplitude/analytics-types': + specifier: ^2.2.0 + version: 2.2.0 '@jitsu/protocols': specifier: workspace:* version: link:../../types/protocols @@ -875,6 +881,13 @@ packages: tslib: 2.5.0 dev: false + /@amplitude/analytics-core@2.0.5: + resolution: {integrity: sha512-ke937QKOHFeUuQxwu5fQ5X9x9KUJoe+5XnJ589Fuz0VStWwqQZl7AkgSe85cX45z0bMUdbG7q8u9y/9uaqf2SQ==} + dependencies: + '@amplitude/analytics-types': 2.2.0 + tslib: 2.5.0 + dev: false + /@amplitude/analytics-node@1.3.3: resolution: {integrity: sha512-G+5EoGcVOOclcNRR57AQcGqg46xNXjG6tsSdF71+Npzc6zTfvDzKDY97ZULBju9TT/FXvhP8LnppAI8umT6qkQ==} dependencies: @@ -887,6 +900,9 @@ packages: resolution: {integrity: sha512-V4/h+izhG7NyVfIva1uhe6bToI/l5n+UnEomL3KEO9DkFoKiOG7KmXo/fmzfU6UmD1bUEWmy//hUFF16BfrEww==} dev: false + /@amplitude/analytics-types@2.2.0: + resolution: {integrity: sha512-HThPlsX5KnxCorQnPVNQR8WZy0/PdgAzlT5n8bubjSmzPEWQgvn8bQzD48wYXoAkEZxlfYlaSnx7IxD5j3N1Dw==} + /@ampproject/remapping@2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} From 62edb67b26713be955f72940f3890ca5b4d6e189 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 20 Sep 2023 15:43:25 +0400 Subject: [PATCH 0192/1353] Amplitude destination: set retries for client --- libs/core-functions/src/functions/amplitude-destination.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/core-functions/src/functions/amplitude-destination.ts b/libs/core-functions/src/functions/amplitude-destination.ts index 23e9a6a4f..a839542ce 100644 --- a/libs/core-functions/src/functions/amplitude-destination.ts +++ b/libs/core-functions/src/functions/amplitude-destination.ts @@ -95,6 +95,7 @@ const AmplitudeDestination: JitsuFunction Date: Wed, 20 Sep 2023 17:54:53 +0400 Subject: [PATCH 0193/1353] Amplitude destination: move from client lib to http api --- libs/core-functions/package.json | 6 +- .../src/functions/amplitude-destination.ts | 237 ++++++------------ pnpm-lock.yaml | 72 ++---- services/rotor/package.json | 2 +- webapps/console/package.json | 2 +- 5 files changed, 106 insertions(+), 213 deletions(-) diff --git a/libs/core-functions/package.json b/libs/core-functions/package.json index cfe9ccb57..fc652ca99 100644 --- a/libs/core-functions/package.json +++ b/libs/core-functions/package.json @@ -28,10 +28,10 @@ "jest": "^29.5.0", "json5": "^2.1.0", "node-fetch-commonjs": "^3.2.4", - "ts-jest": "29.0.5", - "@amplitude/analytics-types": "^2.2.0" + "ts-jest": "29.0.5" }, "dependencies": { + "dayjs": "^1.11.10", "@swc/core": "^1.3.40", "@swc/wasm": "^1.3.40", "vm2": "^3.9.14", @@ -39,8 +39,6 @@ "lodash": "^4.17.21", "mongodb": "^5.1.0", "posthog-node": "^2.4.0", - "@amplitude/analytics-core": "^2.0.5", - "@amplitude/analytics-node": "^1.3.3", "tslib": "^2.4.0", "zod": "3.21.4", "agentkeepalive": "4.3.0" diff --git a/libs/core-functions/src/functions/amplitude-destination.ts b/libs/core-functions/src/functions/amplitude-destination.ts index a839542ce..939437de7 100644 --- a/libs/core-functions/src/functions/amplitude-destination.ts +++ b/libs/core-functions/src/functions/amplitude-destination.ts @@ -1,184 +1,111 @@ import { JitsuFunction } from "@jitsu/protocols/functions"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; -import { getEventCustomProperties } from "./lib"; +import { randomUUID } from "crypto"; import { parseUserAgent } from "./lib/browser"; -import { BaseTransport } from "@amplitude/analytics-core"; -import { init, track, flush, identify, Identify, groupIdentify } from "@amplitude/analytics-node"; -import { Payload, Response, Transport } from "@amplitude/analytics-types"; import { AmplitudeDestinationConfig } from "../meta"; - -function getHostFromUrl(url: string | undefined): string | undefined { - if (!url) { - return undefined; - } - try { - return new URL(url).hostname; - } catch (e) { - return undefined; - } -} - -function getPathFromUrl(url: string | undefined): string | undefined { - if (!url) { - return undefined; - } - try { - return new URL(url).pathname; - } catch (e) { - return undefined; - } -} - -function getEventProperties(event: AnalyticsServerEvent) { - //see https://github.com/PostHog/posthog-js-lite/blob/master/posthog-web/src/context.ts - const browser = event.context?.userAgent - ? parseUserAgent(event.context?.userAgent, event.context?.userAgentVendor) - : undefined; - return { - referrer: event.context?.page?.referrer, - referring_domain: event.context?.page?.referring_domain || getHostFromUrl(event.context?.page?.referrer), - url: event.context?.page?.url, - host: event.context?.page?.host || getHostFromUrl(event.context?.page?.url), - pathname: event.context?.page?.path || getPathFromUrl(event.context?.page?.url), - - browser: browser?.name, - device: browser?.deviceType, - os: browser?.os, - browser_version: browser?.browserVersion, - - //implement when it's implemented on a client, doesn't seem like a very important data points - screen_dpi: event.context?.screen?.density, - screen_height: event.context?.screen?.height, - screen_width: event.context?.screen?.width, - ...getEventCustomProperties(event, { - exclude: obj => { - delete obj.traits; - delete obj.referer; - delete obj.groupId; - delete obj.referring_domain; - delete obj.url; - delete obj.host; - delete obj.path; - delete obj.screen; - delete obj.page; - delete obj.width; - delete obj.height; - }, - }), - }; -} +import dayjs from "dayjs"; const AmplitudeDestination: JitsuFunction = async ( event, - { props, fetch, log, geo } + { props, fetch, log, geo, destination } ) => { const groupType = props.groupType || "group"; const deviceId = event.anonymousId; - class FetchTransport extends BaseTransport implements Transport { - async send(serverUrl: string, payload: Payload): Promise { - const options = { - headers: { - "Content-Type": "application/json", - Accept: "*/*", + const endpoint = + props.dataResidency === "EU" ? "https://api.eu.amplitude.com/2/httpapi" : "https://api2.amplitude.com/2/httpapi"; + let payload: any = undefined; + if (event.type === "identify") { + payload = { + api_key: props.key, + events: [ + { + time: dayjs(event.timestamp).valueOf(), + insert_id: event.messageId || randomUUID(), + user_id: event.userId, + event_type: "$identify", + user_properties: { + $set: { + ...event.traits, + }, + }, }, - body: JSON.stringify(payload), - method: "POST", + ], + }; + } else if (event.type === "group" && props.enableGroupAnalytics) { + payload = { + api_key: props.key, + events: [ + { + time: dayjs(event.timestamp).valueOf(), + insert_id: event.messageId || randomUUID(), + user_id: event.userId, + event_type: "$groupidentify", + group_properties: { + $set: { + ...event.traits, + }, + }, + groups: { + [groupType]: event.groupId, + }, + }, + ], + }; + } else if ((event.type === "page" || event.type === "track") && (event.userId || props.enableAnonymousUserProfiles)) { + let geoObj: any = {}; + if (geo) { + geoObj = { + country: geo.country?.code, + region: geo.region?.code, + city: geo.city?.name, + dma: geo.location?.usaData ? geo.location.usaData.metroCode : undefined, + location_lat: geo.location?.latitude, + location_lng: geo.location?.longitude, }; - const response = await fetch(serverUrl, options); - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const responsePayload: Record = await response.json(); - return this.buildResponse(responsePayload); } - } - const transport = new FetchTransport(); - await init(props.key, { - logLevel: 0, - serverZone: props.dataResidency, - transportProvider: transport, - flushMaxRetries: 3, - }).promise; - if (event.type === "identify") { - const identifyObj = new Identify(); - for (const [key, value] of Object.entries(event.traits || {})) { - if (value) { - identifyObj.set(key, `${value}`); - } + const browser = event.context?.userAgent + ? parseUserAgent(event.context?.userAgent, event.context?.userAgentVendor) + : undefined; + let groups = {}; + if (event.context?.groupId && props.enableGroupAnalytics) { + groups = { [groupType]: event.context?.groupId }; } - identify(identifyObj, { - user_id: event.userId, - }).promise.then(res => { - if (res.code === 200) { - log.info(`Amplitude identify OK: ${res.code} message: ${res.message}`); - } else { - log.error(`Amplitude identify Error: ${res.code} message: ${res.message}`); - } - }); - } else if (event.type === "group" && props.enableGroupAnalytics) { - const identifyObj = new Identify(); - for (const [key, value] of Object.entries(event.traits || {})) { - if (value) { - identifyObj.set(key, `${value}`); - } - } - groupIdentify(groupType, event.groupId ?? "", identifyObj, { - user_id: event.userId, - }).promise.then(res => { - if (res.code === 200) { - log.info(`Amplitude groupIdentify OK: ${res.code} message: ${res.message}`); - } else { - log.error(`Amplitude groupIdentify Error: ${res.code} message: ${res.message}`); - } - }); - } else if (event.type === "page" || event.type === "track") { - const userId = event.userId; - if (userId || props.enableAnonymousUserProfiles) { - const eventName = event.type === "page" ? "pageview" : event.event || event.name || "Unknown Event"; - let groups = {}; - if (event.context?.groupId && props.enableGroupAnalytics) { - groups = { [groupType]: event.context?.groupId }; - } - let geoObj: any = {}; - if (geo) { - geoObj = { - country: geo.country?.code, - region: geo.region?.code, - city: geo.city?.name, - dma: geo.location?.usaData ? geo.location.usaData.metroCode : undefined, - location_lat: geo.location?.latitude, - location_lng: geo.location?.longitude, - }; - } - const browser = event.context?.userAgent - ? parseUserAgent(event.context?.userAgent, event.context?.userAgentVendor) - : undefined; - track( + payload = { + api_key: props.key, + events: [ { - event_type: eventName, + time: dayjs(event.timestamp).valueOf(), + insert_id: event.messageId || randomUUID(), + event_type: event.type === "page" ? "pageview" : event.event || event.name || "Unknown Event", event_properties: event.properties, groups, user_properties: event.context?.traits, - }, - undefined, - { - user_id: userId, + user_id: event.userId, device_id: deviceId ?? undefined, os_name: browser?.os, language: event.context?.locale, ip: event.request_ip, - insert_id: event.messageId, user_agent: event.context?.userAgent, ...geoObj, - } - ).promise.then(res => { - if (res.code === 200) { - log.info(`Amplitude track OK: ${res.code} message: ${res.message}`); - } else { - log.error(`Amplitude track Error: ${res.code} message: ${res.message}`); - } - }); + }, + ], + }; + } + if (payload) { + const res = await fetch(endpoint, { + headers: { + "Content-Type": "application/json", + Accept: "*/*", + }, + method: "POST", + body: JSON.stringify(payload), + }); + if (res.status === 200) { + log.info(`Amplitude ${event.type} OK: ${res.status} message: ${await res.text()}`); + } else { + log.error(`Amplitude ${event.type} Error: ${res.status} message: ${await res.text()}`); } } - await flush().promise; }; export default AmplitudeDestination; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7faac5248..d9974e3b9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -135,12 +135,6 @@ importers: libs/core-functions: dependencies: - '@amplitude/analytics-core': - specifier: ^2.0.5 - version: 2.0.5 - '@amplitude/analytics-node': - specifier: ^1.3.3 - version: 1.3.3 '@swc/core': specifier: ^1.3.40 version: 1.3.49 @@ -150,6 +144,9 @@ importers: agentkeepalive: specifier: 4.3.0 version: 4.3.0 + dayjs: + specifier: ^1.11.10 + version: 1.11.10 juava: specifier: workspace:* version: link:../juava @@ -159,6 +156,9 @@ importers: mongodb: specifier: ^5.1.0 version: 5.2.0 + object-hash: + specifier: ^3.0.0 + version: 3.0.0 posthog-node: specifier: ^2.4.0 version: 2.6.0 @@ -172,9 +172,6 @@ importers: specifier: 3.21.4 version: 3.21.4 devDependencies: - '@amplitude/analytics-types': - specifier: ^2.2.0 - version: 2.2.0 '@jitsu/protocols': specifier: workspace:* version: link:../../types/protocols @@ -353,8 +350,8 @@ importers: specifier: workspace:* version: link:../../libs/core-functions dayjs: - specifier: ^1.11.7 - version: 1.11.7 + specifier: ^1.11.10 + version: 1.11.10 express: specifier: ^4.18.2 version: 4.18.2 @@ -531,7 +528,7 @@ importers: version: 4.12.0(prisma@4.12.0) '@rjsf/antd': specifier: 5.10.0 - version: 5.10.0(@ant-design/icons@5.0.1)(@rjsf/core@5.10.0)(@rjsf/utils@5.10.0)(antd@5.4.2)(dayjs@1.11.7)(react-dom@18.2.0)(react@18.2.0) + version: 5.10.0(@ant-design/icons@5.0.1)(@rjsf/core@5.10.0)(@rjsf/utils@5.10.0)(antd@5.4.2)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) '@rjsf/core': specifier: 5.10.0 version: 5.10.0(@rjsf/utils@5.10.0)(react@18.2.0) @@ -572,8 +569,8 @@ importers: specifier: ^2.1.8 version: 2.1.8 dayjs: - specifier: ^1.11.7 - version: 1.11.7 + specifier: ^1.11.10 + version: 1.11.10 firebase: specifier: ^9.17.1 version: 9.19.1 @@ -874,35 +871,6 @@ packages: resolution: {integrity: sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==} dev: true - /@amplitude/analytics-core@1.2.3: - resolution: {integrity: sha512-3WADE8IcxU7ZERMkBb0+JP7t6EekyFPM0djtNKXQaxgGgH3oqQzMmBCg19UnYYiBSHrZkpiMBLHNAvXL6HM7zg==} - dependencies: - '@amplitude/analytics-types': 1.3.3 - tslib: 2.5.0 - dev: false - - /@amplitude/analytics-core@2.0.5: - resolution: {integrity: sha512-ke937QKOHFeUuQxwu5fQ5X9x9KUJoe+5XnJ589Fuz0VStWwqQZl7AkgSe85cX45z0bMUdbG7q8u9y/9uaqf2SQ==} - dependencies: - '@amplitude/analytics-types': 2.2.0 - tslib: 2.5.0 - dev: false - - /@amplitude/analytics-node@1.3.3: - resolution: {integrity: sha512-G+5EoGcVOOclcNRR57AQcGqg46xNXjG6tsSdF71+Npzc6zTfvDzKDY97ZULBju9TT/FXvhP8LnppAI8umT6qkQ==} - dependencies: - '@amplitude/analytics-core': 1.2.3 - '@amplitude/analytics-types': 1.3.3 - tslib: 2.5.0 - dev: false - - /@amplitude/analytics-types@1.3.3: - resolution: {integrity: sha512-V4/h+izhG7NyVfIva1uhe6bToI/l5n+UnEomL3KEO9DkFoKiOG7KmXo/fmzfU6UmD1bUEWmy//hUFF16BfrEww==} - dev: false - - /@amplitude/analytics-types@2.2.0: - resolution: {integrity: sha512-HThPlsX5KnxCorQnPVNQR8WZy0/PdgAzlT5n8bubjSmzPEWQgvn8bQzD48wYXoAkEZxlfYlaSnx7IxD5j3N1Dw==} - /@ampproject/remapping@2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} @@ -5940,7 +5908,7 @@ packages: source-map: 0.7.4 dev: true - /@rjsf/antd@5.10.0(@ant-design/icons@5.0.1)(@rjsf/core@5.10.0)(@rjsf/utils@5.10.0)(antd@5.4.2)(dayjs@1.11.7)(react-dom@18.2.0)(react@18.2.0): + /@rjsf/antd@5.10.0(@ant-design/icons@5.0.1)(@rjsf/core@5.10.0)(@rjsf/utils@5.10.0)(antd@5.4.2)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-dj0BVL/g2wtrvNxnlya069H8M9hoserMTEWtRtutLf99nsmiargCei34OhM+MxkKkk+c8SsSv5DlEqPiUa+Low==} engines: {node: '>=14'} peerDependencies: @@ -5956,7 +5924,7 @@ packages: '@rjsf/utils': 5.10.0(react@18.2.0) antd: 5.4.2(react-dom@18.2.0)(react@18.2.0) classnames: 2.3.2 - dayjs: 1.11.7 + dayjs: 1.11.10 lodash: 4.17.21 lodash-es: 4.17.21 rc-picker: 2.7.2(react-dom@18.2.0)(react@18.2.0) @@ -9517,7 +9485,7 @@ packages: '@rc-component/trigger': 1.8.0(react-dom@18.2.0)(react@18.2.0) classnames: 2.3.2 copy-to-clipboard: 3.3.3 - dayjs: 1.11.7 + dayjs: 1.11.10 qrcode.react: 3.1.0(react@18.2.0) rc-cascader: 3.10.1(react-dom@18.2.0)(react@18.2.0) rc-checkbox: 3.0.0(react-dom@18.2.0)(react@18.2.0) @@ -9534,7 +9502,7 @@ packages: rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) rc-notification: 5.0.3(react-dom@18.2.0)(react@18.2.0) rc-pagination: 3.3.1(react-dom@18.2.0)(react@18.2.0) - rc-picker: 3.6.2(dayjs@1.11.7)(react-dom@18.2.0)(react@18.2.0) + rc-picker: 3.6.2(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) rc-progress: 3.4.1(react-dom@18.2.0)(react@18.2.0) rc-rate: 2.10.0(react-dom@18.2.0)(react@18.2.0) rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) @@ -11543,8 +11511,8 @@ packages: /dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} - /dayjs@1.11.7: - resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==} + /dayjs@1.11.10: + resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} /deasync@0.1.28: resolution: {integrity: sha512-QqLF6inIDwiATrfROIyQtwOQxjZuek13WRYZ7donU5wJPLoP67MnYxA6QtqdvdBy2mMqv5m3UefBVdJjvevOYg==} @@ -22160,7 +22128,7 @@ packages: '@babel/runtime': 7.21.0 classnames: 2.3.2 date-fns: 2.29.3 - dayjs: 1.11.7 + dayjs: 1.11.10 moment: 2.29.4 rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0) rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) @@ -22169,7 +22137,7 @@ packages: shallowequal: 1.1.0 dev: false - /rc-picker@3.6.2(dayjs@1.11.7)(react-dom@18.2.0)(react@18.2.0): + /rc-picker@3.6.2(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-acLNCi2WTNAuvTtcEzKp72mU15ni0sqrIKVlEcj04KgLZxhlVPMabCS+Sc8VuOCPJbOcW0XeOydbNnJbWTvzxg==} engines: {node: '>=8.x'} peerDependencies: @@ -22192,7 +22160,7 @@ packages: '@babel/runtime': 7.21.0 '@rc-component/trigger': 1.8.0(react-dom@18.2.0)(react@18.2.0) classnames: 2.3.2 - dayjs: 1.11.7 + dayjs: 1.11.10 rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) diff --git a/services/rotor/package.json b/services/rotor/package.json index 45dec2eb5..664449d62 100644 --- a/services/rotor/package.json +++ b/services/rotor/package.json @@ -25,7 +25,7 @@ "juava": "workspace:*", "express": "^4.18.2", "glob": "^8.0.3", - "dayjs": "^1.11.7", + "dayjs": "^1.11.10", "ioredis": "^5.2.3", "json-grab": "0.1.0-alpha.2", "json5": "^2.1.0", diff --git a/webapps/console/package.json b/webapps/console/package.json index 69599d092..18b71a3de 100644 --- a/webapps/console/package.json +++ b/webapps/console/package.json @@ -48,7 +48,7 @@ "classnames": "^2.3.1", "cookie": "^0.5.0", "cuid": "^2.1.8", - "dayjs": "^1.11.7", + "dayjs": "^1.11.10", "firebase": "^9.17.1", "firebase-admin": "^11.5.0", "googleapis": "^100.0.0", From 845bbcb0a27de525e90f47d31c1de04b73c9cd4c Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 20 Sep 2023 17:59:18 +0400 Subject: [PATCH 0194/1353] update pnpm-lock.yaml --- pnpm-lock.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d9974e3b9..266426517 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -156,9 +156,6 @@ importers: mongodb: specifier: ^5.1.0 version: 5.2.0 - object-hash: - specifier: ^3.0.0 - version: 3.0.0 posthog-node: specifier: ^2.4.0 version: 2.6.0 From aaac49392f0cc8ef270688d02c749d1c06e76a81 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 22 Sep 2023 17:37:59 +0400 Subject: [PATCH 0195/1353] console: added /v1/b alias for /batch endpoint --- webapps/console/middleware.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/webapps/console/middleware.ts b/webapps/console/middleware.ts index 01fb5d1e2..78d2b2b1d 100644 --- a/webapps/console/middleware.ts +++ b/webapps/console/middleware.ts @@ -25,6 +25,8 @@ export async function middleware(request: NextRequest) { response = NextResponse.rewrite(new URL("/api/s/javascript-library", request.url)); } else if (request.nextUrl.pathname.startsWith("/v1/batch")) { response = NextResponse.rewrite(new URL("/api/s/batch", request.url)); + } else if (request.nextUrl.pathname.startsWith("/v1/b")) { + response = NextResponse.rewrite(new URL("/api/s/batch", request.url)); } else { response = NextResponse.next(); } From 68d8f1e38e42a72a5a3a71160665fa7cfb3438f7 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 22 Sep 2023 17:42:41 +0400 Subject: [PATCH 0196/1353] console: added /v1/b alias for /batch endpoint --- webapps/console/middleware.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/webapps/console/middleware.ts b/webapps/console/middleware.ts index 78d2b2b1d..34fa03808 100644 --- a/webapps/console/middleware.ts +++ b/webapps/console/middleware.ts @@ -27,6 +27,10 @@ export async function middleware(request: NextRequest) { response = NextResponse.rewrite(new URL("/api/s/batch", request.url)); } else if (request.nextUrl.pathname.startsWith("/v1/b")) { response = NextResponse.rewrite(new URL("/api/s/batch", request.url)); + } else if (request.nextUrl.pathname.startsWith("/v1/projects/")) { + // mimic segments setting endpoint + // https://cdn-settings.segment.com/v1/projects//settings + response = NextResponse.json({}); } else { response = NextResponse.next(); } From 07762262e33087488d245724279863b1aaff94c2 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Fri, 22 Sep 2023 19:08:17 +0300 Subject: [PATCH 0197/1353] feat: handle past due subscriptions in UI --- .../Billing/BillingBlockingDialog.tsx | 35 +++++++++++++++++-- .../components/Billing/BillingManager.tsx | 28 ++++++++++++++- webapps/console/lib/schema/index.ts | 1 + webapps/ee-api/lib/stripe.ts | 24 ++++++++----- 4 files changed, 76 insertions(+), 12 deletions(-) diff --git a/webapps/console/components/Billing/BillingBlockingDialog.tsx b/webapps/console/components/Billing/BillingBlockingDialog.tsx index 586d96156..928a9eecc 100644 --- a/webapps/console/components/Billing/BillingBlockingDialog.tsx +++ b/webapps/console/components/Billing/BillingBlockingDialog.tsx @@ -23,7 +23,38 @@ function LoadAndBlockIfNeed() { return <>; } assertDefined(usage); - if (usage.usagePercentage > 1) { + if (billing.settings?.pastDue) { + return ( + + +

    Your subscription is past-due.

    +
    + } + closable={false} + footer={ +
    + } + > + Manage Billing {"&"} Plan + +
    + } + > +
    + You have unpaid invoices. Please arrange the payment as soon as possible to avoid service interruption +
    + + ); + } else if (usage.usagePercentage > 1) { return ( = () => { const billing = useBilling(); + const workspace = useWorkspace(); assertTrue(billing.enabled); assertFalse(billing.loading, "Billing must be loaded before using UsageSection component"); @@ -98,6 +99,31 @@ const UsageSection: React.FC<{}> = () => { {formatNumber(Math.round(usage?.events))} / {formatNumber(usage.maxAllowedDestinatonEvents)} destination events used from {startStr} to {endStr}. The quota will be reset on {endStr}.
    + {billing.settings?.pastDue && ( +
    + You have unpaid invoices!} + description={ +
    + Please{" "} + + + update your payment method + + + {" "} + to avoid service interruption +
    + } + type="error" + showIcon + /> +
    + )} {usageExceeded && (
    ; //Default values are for "free" (default) plan export const BillingSettings = z.object({ planId: z.string().default("free"), + pastDue: z.boolean().default(false).optional(), dailyActiveSyncs: z.number().default(1).optional(), dailyActiveSyncsOverage: z.number().default(10).optional(), maximumSyncFrequency: z.number().optional(), //minutes diff --git a/webapps/ee-api/lib/stripe.ts b/webapps/ee-api/lib/stripe.ts index 9d2b0beb2..e35d9e717 100644 --- a/webapps/ee-api/lib/stripe.ts +++ b/webapps/ee-api/lib/stripe.ts @@ -57,28 +57,34 @@ export async function getActivePlan(customerId: string): Promise { + const activeSubscription = subscriptions.data.find(sub => { const product = requireDefined(sub2product.get(sub.id), `Can't find product for subscription ${sub.id}`); - return sub.status === "active" && product.metadata?.object_tag === getStripeObjectTag(); + return sub.status === "active" || product.metadata?.object_tag === getStripeObjectTag(); }); - if (activeNonLegacy) { + const pastDueSubscription = subscriptions.data.find(sub => { + const product = requireDefined(sub2product.get(sub.id), `Can't find product for subscription ${sub.id}`); + return sub.status === "past_due" || product.metadata?.object_tag === getStripeObjectTag(); + }); + const subscription = activeSubscription || pastDueSubscription; + if (subscription) { const product = requireDefined( - sub2product.get(activeNonLegacy.id), - `Can't find product for subscription ${activeNonLegacy.id}` + sub2product.get(subscription.id), + `Can't find product for subscription ${subscription.id}` ); return { planId: requireDefined(product.metadata?.jitsu_plan_id), planName: product.name, - expiresAt: new Date(activeNonLegacy.current_period_end * 1000).toISOString(), - renewAfterExpiration: !activeNonLegacy.cancel_at_period_end, + expiresAt: new Date(subscription.current_period_end * 1000).toISOString(), + renewAfterExpiration: !subscription.cancel_at_period_end, + pastDue: pastDueSubscription && !activeSubscription, ...JSON.parse(requireDefined(product.metadata?.plan_data, `Can't find plan data for product ${product.id}`)), }; } //second, look for just cancelled non-legacy plans - const canceledNonLegacy = subscriptions.data.find(sub => { + const pastDue = subscriptions.data.find(sub => { const product = requireDefined(sub2product.get(sub.id), `Can't find product for subscription ${sub.id}`); if ( - sub.status === "canceled" && + sub.status === "past_due" && product.metadata?.object_tag === getStripeObjectTag() && sub.cancel_at_period_end ) { From fc992fdce06d4e17d2c0f4a65c2922ca7d2342ab Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 26 Sep 2023 11:11:58 +0400 Subject: [PATCH 0198/1353] Functions CLI (#1046) * Functions CLI * Function Debugger improvements * get rid of vm2 in favor of isolated-vm * analytics-plugin: use tldts lib for cookie domain detection --- .gitignore | 3 + cli/jitsu-cli/babel.config.cjs | 4 + cli/jitsu-cli/bin/jitsu-cli | 3 + cli/jitsu-cli/package.json | 58 +- cli/jitsu-cli/src/commands/build.ts | 69 + cli/jitsu-cli/src/commands/deploy.ts | 187 + cli/jitsu-cli/src/commands/init.ts | 60 + cli/jitsu-cli/src/commands/login.ts | 93 + cli/jitsu-cli/src/commands/run.ts | 136 + cli/jitsu-cli/src/commands/shared.ts | 17 + cli/jitsu-cli/src/commands/test.ts | 16 + cli/jitsu-cli/src/index.ts | 93 +- cli/jitsu-cli/src/lib/chalk-code-highlight.ts | 49 + cli/jitsu-cli/src/lib/indent.ts | 42 + cli/jitsu-cli/src/lib/template.ts | 37 + cli/jitsu-cli/src/lib/version.ts | 36 + cli/jitsu-cli/src/main.ts | 3 - cli/jitsu-cli/src/templates/functions.ts | 82 + cli/jitsu-cli/tsconfig.json | 28 +- cli/jitsu-cli/webpack.config.js | 48 + examples/react-app/package.json | 2 +- .../__tests__/lib/testing-lib.ts | 13 +- libs/core-functions/__tests__/udf.test.ts | 166 +- .../__tests__/user-recognition.test.ts | 14 +- libs/core-functions/package.json | 11 +- .../src/functions/lib/http-agent.ts | 4 +- .../src/functions/lib/mongodb.ts | 4 +- .../src/functions/udf_isolated_vm.ts | 39 - libs/core-functions/src/functions/udf_vm2.ts | 79 - .../src/functions/udf_wrapper.ts | 359 + libs/core-functions/src/index.ts | 8 +- libs/core-functions/tsconfig.json | 1 + libs/jitsu-js/__tests__/node/nodejs.test.ts | 11 + libs/jitsu-js/package.json | 1 + libs/jitsu-js/src/analytics-plugin.ts | 10 +- libs/jitsu-react/package.json | 2 +- libs/juava/src/id.ts | 5 + libs/juava/src/security.ts | 12 + libs/juava/src/singleton.ts | 19 +- package.json | 6 +- pnpm-lock.yaml | 10371 ++++++++-------- services/rotor/dist_package.json | 2 +- services/rotor/rollup.config.js | 5 +- services/rotor/src/http/udf.ts | 126 +- services/rotor/src/index.ts | 19 +- services/rotor/src/lib/functions-chain.ts | 6 +- services/rotor/tsconfig.json | 3 +- services/rotor/webpack.config.js | 2 +- tsconfig.base.json | 3 +- types/protocols/functions.d.ts | 11 +- .../components/ApiKeyEditor/ApiKeyEditor.tsx | 134 +- .../components/CodeBlock/CodeBlock.tsx | 12 +- .../FunctionsDebugger/FunctionsDebugger.tsx | 123 +- .../components/GlobalError/GlobalError.tsx | 8 +- webapps/console/lib/api.ts | 1 + webapps/console/lib/schema/index.ts | 6 + webapps/console/lib/server/http-agent.ts | 4 +- webapps/console/next.config.js | 2 +- webapps/console/package.json | 17 +- webapps/console/pages/_app.tsx | 2 +- .../api/[workspaceId]/config/[type]/[id].ts | 8 + .../api/[workspaceId]/config/[type]/index.ts | 8 + .../api/[workspaceId]/config/[type]/test.ts | 8 + .../pages/api/[workspaceId]/function/run.ts | 15 +- webapps/console/pages/api/user/cli-key.ts | 30 + webapps/console/pages/api/user/keys.ts | 2 +- webapps/console/pages/cli.tsx | 40 + webapps/console/pages/index.tsx | 52 +- webapps/console/prisma/schema.prisma | 1 + webapps/console/vercel.sh | 14 +- webapps/ee-api/package.json | 8 +- 71 files changed, 7434 insertions(+), 5439 deletions(-) create mode 100644 cli/jitsu-cli/babel.config.cjs create mode 100755 cli/jitsu-cli/bin/jitsu-cli create mode 100644 cli/jitsu-cli/src/commands/build.ts create mode 100644 cli/jitsu-cli/src/commands/deploy.ts create mode 100644 cli/jitsu-cli/src/commands/init.ts create mode 100644 cli/jitsu-cli/src/commands/login.ts create mode 100644 cli/jitsu-cli/src/commands/run.ts create mode 100644 cli/jitsu-cli/src/commands/shared.ts create mode 100644 cli/jitsu-cli/src/commands/test.ts create mode 100644 cli/jitsu-cli/src/lib/chalk-code-highlight.ts create mode 100644 cli/jitsu-cli/src/lib/indent.ts create mode 100644 cli/jitsu-cli/src/lib/template.ts create mode 100644 cli/jitsu-cli/src/lib/version.ts delete mode 100644 cli/jitsu-cli/src/main.ts create mode 100644 cli/jitsu-cli/src/templates/functions.ts create mode 100644 cli/jitsu-cli/webpack.config.js delete mode 100644 libs/core-functions/src/functions/udf_isolated_vm.ts delete mode 100644 libs/core-functions/src/functions/udf_vm2.ts create mode 100644 libs/core-functions/src/functions/udf_wrapper.ts create mode 100644 webapps/console/pages/api/user/cli-key.ts create mode 100644 webapps/console/pages/cli.tsx diff --git a/.gitignore b/.gitignore index cdf117c1a..4defa27cb 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,6 @@ node_modules /libs/jitsu-react/dist/ /examples/nextjs-app/.next/ +/examples/hubspot-function/dist/ +/cli/jitsu-cli/compiled/ +/cli/jitsu-cli/dist/ diff --git a/cli/jitsu-cli/babel.config.cjs b/cli/jitsu-cli/babel.config.cjs new file mode 100644 index 000000000..e60440a86 --- /dev/null +++ b/cli/jitsu-cli/babel.config.cjs @@ -0,0 +1,4 @@ +module.exports = { + presets: ["@babel/preset-env", "@babel/preset-typescript"], + plugins: [], +}; diff --git a/cli/jitsu-cli/bin/jitsu-cli b/cli/jitsu-cli/bin/jitsu-cli new file mode 100755 index 000000000..864e6337f --- /dev/null +++ b/cli/jitsu-cli/bin/jitsu-cli @@ -0,0 +1,3 @@ +#!/usr/bin/env node + +require("../dist/main.js"); \ No newline at end of file diff --git a/cli/jitsu-cli/package.json b/cli/jitsu-cli/package.json index aa1a145c6..e751bff68 100644 --- a/cli/jitsu-cli/package.json +++ b/cli/jitsu-cli/package.json @@ -6,17 +6,63 @@ "publishConfig": { "access": "public" }, + "bin": "./bin/jitsu-cli", "license": "MIT", "private": false, - "scripts": {}, + "scripts": { + "clean": "rm -rf ./dist", + "compile": "tsc -p . ", + "build": "pnpm compile && webpack", + "run": "node dist/main.js" + }, "dependencies": { - "chalk": "^5.0.1", - "minimist": "^1.2.6", - "tslib": "^2.4.0", - "juava": "workspace:*" + "isolated-vm": "^4.6.0", + "jest-cli": "^29.7.0", + "@swc/core": "^1.3.88", + "@swc/wasm": "^1.3.89", + "figlet": "^1.6.0", + "tslib": "^2.6.2" }, "devDependencies": { + "juava": "workspace:*", + "@jitsu/core-functions": "workspace:*", + "typescript": "^5.2.2", + "express": "^4.18.2", + "lodash": "^4.17.21", + "etag": "^1.8.1", + "open": "^9.1.0", + "chalk": "^5.3.0", + "prismjs": "^1.29.0", + "semver": "^7.5.4", + "inquirer": "^9.2.11", + "commander": "^11.0.0", + "cross-fetch": "^4.0.0", + "@rollup/plugin-typescript": "^11.1.3", + "@rollup/plugin-commonjs": "^25.0.4", + "@rollup/plugin-json": "^6.0.0", + "@rollup/plugin-node-resolve": "^15.2.1", + "@rollup/plugin-terser": "^0.4.3", + "rollup": "^3.29.1", + "jest": "^29.7.0", + "ts-jest": "^29.1.1", + "node-fetch": "^3.3.2", + "json5": "^2.2.3", + "cuid": "^2.1.8", + "@babel/preset-env": "^7.22.15", + "@babel/preset-typescript": "^7.22.15", + "@types/node": "^18.15.3", + "@types/jest": "^29.5.5", + "@types/express": "^4.17.17", "@types/chalk": "^2.2.0", - "@types/minimist": "^1.2.2" + "@types/inquirer": "^9.0.3", + "@types/commander": "^2.12.2", + "@types/lodash": "^4.14.198", + "webpack": "^5.88.2", + "webpack-cli": "^5.1.4", + "@types/webpack": "^5.28.2", + "@webpack-cli/generators": "^3.0.7", + "babel-loader": "^9.1.3", + "node-loader": "^2.0.0", + "ts-loader": "^9.4.4" } } diff --git a/cli/jitsu-cli/src/commands/build.ts b/cli/jitsu-cli/src/commands/build.ts new file mode 100644 index 000000000..43a6e7492 --- /dev/null +++ b/cli/jitsu-cli/src/commands/build.ts @@ -0,0 +1,69 @@ +import chalk from "chalk"; +import path from "path"; +import { existsSync, writeFileSync, mkdirSync, readdirSync } from "fs"; +import typescript from "@rollup/plugin-typescript"; +import resolve from "@rollup/plugin-node-resolve"; +import commonjs from "@rollup/plugin-commonjs"; +import rollupJson from "@rollup/plugin-json"; +import { ModuleFormat, rollup } from "rollup"; +import { exec } from "child_process"; +import { loadPackageJson } from "./shared"; +import { b } from "../lib/chalk-code-highlight"; + +export async function build({ dir }: { dir?: string }) { + const projectDir = dir || process.cwd(); + const packageJson = loadPackageJson(projectDir); + + console.log(`Building ${b(packageJson.name)} project`); + + //list files in src directory + const functionsDir = path.resolve(projectDir, "src/functions"); + const files = readdirSync(functionsDir); + if (files.length === 0) { + console.error(`No functions found in ${b("/src/functions")} directory`); + process.exit(0); + } + for (const file of files) { + console.log(`Building function ${b(file)}`); + const funcFile = path.resolve(functionsDir, file); + + process.chdir(projectDir); + + const rollupPlugins = [ + typescript(), + resolve({ preferBuiltins: false }), + commonjs(), + rollupJson(), + // terser(), + ]; + + const bundle = await rollup({ + input: [funcFile], + plugins: rollupPlugins, + logLevel: "silent", + }); + + let format: ModuleFormat = "es"; + let output = await bundle.generate({ + dir: projectDir, + format: format, + }); + + mkdirSync(path.resolve(projectDir, "dist/functions"), { recursive: true }); + writeFileSync(path.resolve(projectDir, `dist/functions/${file.replace(".ts", ".js")}`), output.output[0].code); + } + + console.log(`${b("Build finished.")}`); +} + +const run = async cmd => { + const child = exec(cmd, err => { + if (err) { + console.error(err); + return; + } + }); + child.stdout?.pipe(process.stdout); + child.stderr?.pipe(process.stderr); + return new Promise(resolve => child.on("close", resolve)); +}; diff --git a/cli/jitsu-cli/src/commands/deploy.ts b/cli/jitsu-cli/src/commands/deploy.ts new file mode 100644 index 000000000..1107c2369 --- /dev/null +++ b/cli/jitsu-cli/src/commands/deploy.ts @@ -0,0 +1,187 @@ +import path from "path"; +import { homedir } from "os"; +import inquirer from "inquirer"; +import { existsSync, readdirSync, readFileSync } from "fs"; +import { loadPackageJson } from "./shared"; +import fetch from "node-fetch"; +import { UDFWrapper } from "@jitsu/core-functions"; +import cuid from "cuid"; +import { b, red } from "../lib/chalk-code-highlight"; + +export async function deploy({ dir, workspace, name: names }: { dir?: string; workspace?: string; name?: string[] }) { + const projectDir = dir || process.cwd(); + const selected = names ? names.flatMap(n => n.split(",")).map(n => n.trim()) : undefined; + + const packageJson = loadPackageJson(projectDir); + + const configFile = `${homedir()}/.jitsu/jitsu-cli.json`; + if (!existsSync(configFile)) { + console.error(red("Please login first.")); + process.exit(1); + } + + const functionsDir = path.resolve(projectDir, "dist/functions"); + if (!existsSync(functionsDir)) { + console.error(red(`Can't find dist directory: ${b(functionsDir)} . Please build project first.`)); + process.exit(1); + } + + console.log( + `Deploying ${b(packageJson.name)} project.${selected ? ` (selected functions: ${selected.join(",")})` : ""}` + ); + const functionsFiles = readdirSync(functionsDir); + if (functionsFiles.length === 0) { + console.error( + red( + `Can't find function files in ${b( + "dist/functions" + )} directory. Please make sure that you have built the project.` + ) + ); + process.exit(1); + } + const selectedFiles: string[] = []; + if (selected) { + const s = selected.map(n => (n.endsWith(".js") ? n : `${n.replace(".ts", "")}.js`)); + for (const file of s) { + if (functionsFiles.includes(file)) { + selectedFiles.push(file); + } else { + console.error( + red( + `Can't find function file ${b(file)} in ${b( + "dist/functions" + )} directory. Please make sure that you have built the project.` + ) + ); + process.exit(1); + } + } + } else { + selectedFiles.push(...functionsFiles); + } + + const { host, apikey } = JSON.parse(readFileSync(configFile, "utf-8")); + const res = await fetch(`${host}/api/workspace`, { + method: "GET", + headers: { + Authorization: `Bearer ${apikey}`, + }, + }); + if (!res.ok) { + console.error(red(`Cannot get workspace list:\n${b(await res.text())}`)); + process.exit(1); + } + const workspaces = (await res.json()) as any[]; + + let workspaceId = workspace; + if (!workspace) { + if (workspaces.length === 0) { + console.error(`${red("No workspaces found")}`); + process.exit(1); + } else if (workspaces.length === 1) { + workspaceId = workspaces[0].id; + } else { + workspaceId = ( + await inquirer.prompt([ + { + type: "list", + name: "workspaceId", + message: `Select workspace:`, + choices: workspaces.map(w => ({ + name: `${w.name} (${w.id})`, + value: w.id, + })), + }, + ]) + ).workspaceId; + } + } + + const workspaceName = workspaces.find(w => w.id === workspaceId)?.name; + if (!workspaceId || !workspaceName) { + console.error(red(`Workspace with id ${workspaceId} not found`)); + process.exit(1); + } + for (const file of selectedFiles) { + console.log(b(`Deploying function ${b(file)} to workspace '${workspaceName}'`)); + const code = readFileSync(path.resolve(functionsDir, file), "utf-8"); + const wrapped = UDFWrapper(file, file, code); + const meta = wrapped.meta; + if (meta) { + console.log(`Function ${b(file)} meta: slug=${meta.slug}, name=${meta.name}, description=${meta.description}`); + } else { + console.log(`File ${b(file)} doesn't have function meta information. ${red("Skipping")}`); + continue; + } + let existingFunctionId: string | undefined; + if (meta.slug) { + const res = await fetch(`${host}/api/${workspaceId}/config/function`, { + headers: { + Authorization: `Bearer ${apikey}`, + }, + }); + if (!res.ok) { + console.error(red(`Cannot add function to workspace:\n${b(await res.text())}`)); + process.exit(1); + } else { + const existing = (await res.json()) as any; + existingFunctionId = existing.objects.find(f => f.slug === meta.slug)?.id; + } + } + + if (!existingFunctionId) { + const id = cuid(); + const res = await fetch(`${host}/api/${workspaceId}/config/function`, { + method: "POST", + headers: { + Authorization: `Bearer ${apikey}`, + }, + body: JSON.stringify({ + id, + workspaceId, + type: "function", + origin: "jitsu-cli", + slug: meta.slug, + description: meta.description, + version: packageJson.version, + name: meta.name, + code, + }), + }); + if (!res.ok) { + console.error(red(`Cannot add function to workspace:\n${b(await res.text())}`)); + process.exit(1); + } else { + console.log(`Function ${b(meta.name)} was successfully added to workspace ${workspaceName} with id: ${b(id)}`); + } + } else { + const id = existingFunctionId; + const res = await fetch(`${host}/api/${workspaceId}/config/function/${id}`, { + method: "PUT", + headers: { + Authorization: `Bearer ${apikey}`, + }, + body: JSON.stringify({ + id: id, + workspaceId, + type: "function", + origin: "jitsu-cli", + slug: meta.slug, + description: meta.description, + version: packageJson.version, + name: meta.name, + code, + }), + }); + if (!res.ok) { + console.error(red(`Cannot patch function ${name}(${id}):\n${b(await res.text())}`)); + process.exit(1); + } else { + console.log( + `Function ${b(meta.name)} (id: ${b(id)}) was successfully updated in workspace ${b(workspaceName)}` + ); + } + } + } +} diff --git a/cli/jitsu-cli/src/commands/init.ts b/cli/jitsu-cli/src/commands/init.ts new file mode 100644 index 000000000..9d84f4d61 --- /dev/null +++ b/cli/jitsu-cli/src/commands/init.ts @@ -0,0 +1,60 @@ +import inquirer from "inquirer"; +import path from "path"; +import { sanitize } from "juava"; +import { write } from "../lib/template"; +import { functionProjectTemplate } from "../templates/functions"; +import { jitsuCliVersion } from "../lib/version"; +import { b } from "../lib/chalk-code-highlight"; + +export async function init({ name, parent, displayname }: { name?: string; parent?: string; displayname?: string }) { + const currentDir = process.cwd(); + + const projectName = + name || + ( + await inquirer.prompt([ + { + type: "input", + name: "project", + message: `Enter project name. It will be used as a package name and directory name:`, + }, + ]) + ).project; + + const parentDir = + parent || + ( + await inquirer.prompt([ + { + type: "input", + name: "dir", + default: currentDir, + message: `Enter parent directory of project:`, + }, + ]) + ).dir; + + const functionName = + displayname || + ( + await inquirer.prompt([ + { + type: "input", + name: "functionName", + message: `Enter function name. Human readable function name that will be used in Jitsu:`, + }, + ]) + ).functionName; + + const projectDir = path.resolve(parentDir, sanitize(projectName)); + + console.log(`Creating project ${b(projectName)}. Path: ${projectDir}`); + + write(projectDir, functionProjectTemplate, { + packageName: projectName, + functionName: functionName, + jitsuVersion: jitsuCliVersion, + }); + + console.log(`Project ${b(projectName)} created!`); +} diff --git a/cli/jitsu-cli/src/commands/login.ts b/cli/jitsu-cli/src/commands/login.ts new file mode 100644 index 000000000..a3afbc117 --- /dev/null +++ b/cli/jitsu-cli/src/commands/login.ts @@ -0,0 +1,93 @@ +import open from "open"; +import express from "express"; +import { decrypt, randomId } from "juava"; +import { writeFileSync, mkdirSync } from "fs"; +import { homedir } from "os"; +import readline from "readline"; +import { red } from "../lib/chalk-code-highlight"; + +const origin = "jitsu-cli"; + +export async function login({ host, apikey }: { host: string; apikey?: string }) { + if (apikey) { + writeFileSync(`${homedir()}/.jitsu/jitsu-cli.json`, JSON.stringify({ host, apikey }, null, 2)); + console.info(`\nSuccess!`); + return; + } + let url = host; + if (!url.startsWith("http")) { + if (url.startsWith("localhost") || url.match(/^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/)) { + url = "http://" + url; + } else { + url = "https://" + url; + } + } + if (!url.endsWith("/")) { + url += "/"; + } + try { + const app = express(); + const c = randomId(32); + const server = app.listen(0, async () => { + const addr = server.address() as any; + const r = await open(`${url}?origin=${origin}&c=${c}&redirect=http://localhost:${addr.port}/`); + const int = setInterval(() => { + if (r.exitCode !== null) { + clearInterval(int); + if (r.exitCode !== 0) { + console.log(`Please open this url in your browser:\n${url}?origin=${origin}&c=${c}`); + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, + }); + console.log("\nSuccessful authorization will provide you with a code."); + rl.question("Please paste it here: ", code => { + processCode(code, c, host); + rl.close(); + }); + server.close(); + } else { + console.log("Opening a browser window to proceed with authorization..."); + } + } + }, 100); + }); + app.get("/", (req, res) => { + if (req.query.code) { + processCode(req.query.code as string, c, host); + res.setHeader("Location", `${url}/cli`); + res.status(302).send(); + server.close(); + process.exit(0); + } else { + const err = req.query.err as string; + console.error(red(`Error: ${err}`)); + res.setHeader("Location", `${url}/cli?err=${err}`); + res.status(302).send(); + server.close(); + process.exit(1); + } + }); + } catch (e) { + console.error(e); + process.exit(1); + } +} + +function processCode(code: string, key: string, host: string) { + try { + const iv = `${origin}${code.substring(0, 16 - origin.length)}`; + const enc = code.substring(16 - origin.length); + const decoded = decrypt(key, iv, enc); + const { plaintext, id } = JSON.parse(decoded); + mkdirSync(`${homedir()}/.jitsu`, { recursive: true }); + writeFileSync( + `${homedir()}/.jitsu/jitsu-cli.json`, + JSON.stringify({ host, apikey: `${id}:${plaintext}` }, null, 2) + ); + console.info(`\nSuccess!`); + } catch (e) { + console.error(`\n${red("Incorrect code value")}`); + process.exit(1); + } +} diff --git a/cli/jitsu-cli/src/commands/run.ts b/cli/jitsu-cli/src/commands/run.ts new file mode 100644 index 000000000..8bce71a69 --- /dev/null +++ b/cli/jitsu-cli/src/commands/run.ts @@ -0,0 +1,136 @@ +import chalk from "chalk"; +import { readFileSync, existsSync, readdirSync } from "fs"; +import path from "path"; +import { UDFTestRun } from "@jitsu/core-functions"; +import { getLog } from "juava"; +import { httpAgent, httpsAgent } from "@jitsu/core-functions/src/functions/lib/http-agent"; +import JSON5 from "json5"; +import { loadPackageJson } from "./shared"; +import isEqual from "lodash/isEqual"; +import { b, red } from "../lib/chalk-code-highlight"; + +const currentDir = process.cwd(); + +export async function run({ + dir, + name, + event, + store, + props, +}: { + dir?: string; + name; + event: any; + store?: any; + props?: any; +}) { + const projectDir = dir || currentDir; + const packageJson = loadPackageJson(projectDir); + + const eventJson = parseJson5("event", event); + const propsJson = parseJson5("props", props); + const storeJson = parseJson5("store", store); + const originalStore = { ...storeJson }; + + await httpAgent.waitInit(); + await httpsAgent.waitInit(); + + const functionsDir = path.resolve(projectDir, "dist/functions"); + if (!existsSync(functionsDir)) { + console.error(red(`Can't find dist directory: ${b(functionsDir)} . Please build project first.`)); + process.exit(1); + } + const fname = name ? (name.endsWith(".js") ? name : `${name.replace(".ts", "")}.js`) : undefined; + const functionsFiles = readdirSync(functionsDir); + let functionFile: string | undefined = undefined; + if (!name && functionsFiles.length === 1) { + functionFile = functionsFiles[0]; + } + if (name) { + functionFile = functionsFiles.find(f => f === fname); + } else { + console.error( + red( + `Directory ${b("dist/functions")} contain multiple functions. Please choose the one to run with ${b( + "-n" + )} parameter.` + ) + ); + process.exit(1); + } + if (!functionFile) { + console.error( + red( + `Can't find function file: ${b(fname)} in ${b( + "dist/functions" + )} directory. Please make sure that you have built the project.` + ) + ); + process.exit(1); + } + console.log(`Running ${b(functionFile)}`); + const n = functionFile.replace(".js", ""); + const log = getLog({ + level: "debug", + component: n, + }); + const result = await UDFTestRun({ + functionId: n, + functionName: n, + event: eventJson, + config: propsJson, + store: storeJson, + code: readFileSync(path.resolve(functionsDir, functionFile), "utf-8"), + workspaceId: "test", + }); + console.log(b("Function logs:")); + for (const logItem of result.logs) { + const logFunc = (() => { + switch (logItem.level) { + case "error": + return log.atError(); + case "warn": + return log.atWarn(); + case "debug": + return log.atDebug(); + default: + return log.atInfo(); + } + })(); + logFunc.log(logItem.message); + } + console.log(b("Function result:")); + if (result.error) { + log.atError().log("Error:", result.error); + } else if (result.dropped) { + log.atInfo().log(`Further processing will be SKIPPED. Function returned: ${JSON.stringify(result)}`); + } else { + console.log(JSON.stringify(result.result, null, 2)); + } + //if store was changed - print it + if (!isEqual(originalStore, storeJson)) { + console.log(b("Function store was changed:")); + console.log(JSON.stringify(storeJson, null, 2)); + } + process.exit(0); +} + +function parseJson5(name: string, jsonOrFilename?: string) { + if (!jsonOrFilename) { + return {}; + } + if (jsonOrFilename.startsWith("{")) { + try { + return JSON5.parse(jsonOrFilename); + } catch (e: any) { + throw new Error(`Failed to parse JSON for ${chalk.underline(name)}: ${e.message}`); + } + } else { + const jsonPath = path.resolve(currentDir, jsonOrFilename); + try { + return JSON5.parse(readFileSync(jsonPath, "utf-8")); + } catch (e: any) { + throw new Error(`Failed to parse JSON for ${chalk.underline(name)} from ${jsonPath}: ${e.message}`); + } + } +} diff --git a/cli/jitsu-cli/src/commands/shared.ts b/cli/jitsu-cli/src/commands/shared.ts new file mode 100644 index 000000000..496a91e80 --- /dev/null +++ b/cli/jitsu-cli/src/commands/shared.ts @@ -0,0 +1,17 @@ +import path from "path"; +import { existsSync, readFileSync } from "fs"; +import { b, red } from "../lib/chalk-code-highlight"; + +export function loadPackageJson(projectDir: string): any { + const packageJsonPath = path.resolve(projectDir, "package.json"); + if (!existsSync(packageJsonPath)) { + console.error(red(`Can't find node.js project in: ${b(projectDir)}`)); + process.exit(1); + } + const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8")); + // if (!packageJson.devDependencies?.["jitsu-cli"]) { + // console.error(`${red("jitsu-cli can work only with projects that was created by jitsu-cli")}`); + // process.exit(1); + // } + return packageJson; +} diff --git a/cli/jitsu-cli/src/commands/test.ts b/cli/jitsu-cli/src/commands/test.ts new file mode 100644 index 000000000..d10707b47 --- /dev/null +++ b/cli/jitsu-cli/src/commands/test.ts @@ -0,0 +1,16 @@ +import { run as jest } from "jest-cli"; +import { loadPackageJson } from "./shared"; +import chalk from "chalk"; +import { b } from "../lib/chalk-code-highlight"; + +export async function test({ dir }: { dir?: string }) { + const projectDir = dir || process.cwd(); + + const packageJson = loadPackageJson(projectDir); + + console.log(`Running tests for ${b(packageJson.name)}`); + + const jestArgs = ["--passWithNoTests", "--projects", projectDir, "--preset", "ts-jest"]; + + await jest(jestArgs); +} diff --git a/cli/jitsu-cli/src/index.ts b/cli/jitsu-cli/src/index.ts index 9716b9898..9c424cbf7 100644 --- a/cli/jitsu-cli/src/index.ts +++ b/cli/jitsu-cli/src/index.ts @@ -1,16 +1,77 @@ -import { main } from "./main"; -import minimist from "minimist"; -import chalk from "chalk"; -import { getErrorMessage } from "juava"; - -(async function (): Promise { - try { - const exitCode = await main(minimist(process.argv.slice(2))); - process.exit(exitCode || 0); - } catch (e: any) { - process.stderr.write(chalk.red("Error!") + " - " + getErrorMessage(e) + "\n"); - if (e?.stack) { - process.stderr.write(`\n${e?.stack}\n`); - } - } -})(); +import figlet from "figlet"; +import { Command } from "commander"; +import { login } from "./commands/login"; +import { deploy } from "./commands/deploy"; +import { init } from "./commands/init"; +import { build } from "./commands/build"; +import { test } from "./commands/test"; +import { run } from "./commands/run"; + +import { jitsuCliVersion, jitsuCliPackageName } from "./lib/version"; + +console.log(figlet.textSync("Jitsu CLI", { horizontalLayout: "full" })); + +const p = new Command(); + +p.name(jitsuCliPackageName).description("CLI command to create, test and deploy extensions for Jitsu Next"); + +p.command("init") + .description("Initialize a new Jitsu extension project") + .option( + "-n, --name ", + "the name of the project. It will be used as a package name and directory name. (Optional). By default, interactive prompt is shown to enter the name." + ) + .option( + "-N, --displayname ", + "human-readable function name that will be used in Jitsu. (Optional). By default, interactive prompt is shown to enter the name." + ) + .option( + "-p, --parent ", + "the parent directory of project. (Optional). By default, interactive prompt is shown to enter the parent directory." + ) + .action(init); + +p.command("build") + .description("Build the extension") + .option("-d, --dir ", "the directory of project. (Optional). By default, current directory is used") + .action(build); + +p.command("test") + .description("Run test provided with the extension") + .option("-d, --dir ", "the directory of project. (Optional). By default, current directory is used") + .action(test); + +p.command("run") + .description("Check extensions on provided event, config and persistent storage state") + .option("-d, --dir ", "the directory of project. (Optional). By default, current directory is used") + .option( + "-n, --name ", + "name of function file to check (optional). Required if multiple functions are defined in project" + ) + .option("-t, --type ", "entity type to run", "function") + .requiredOption("-e, --event ", "path to file with event json or event json as a string") + .option("-p, --props ", "path to file with config json or config json as a string. (Optional)") + .option("-s, --store ", "path to file with state json or state json as a string. (Optional)") + .action(run); + +p.command("login") + .description("Login to Jitsu and remember credentials in `~/.jitsu/jitsu-cli.json` file") + .option("--host ", "Jitsu host or base url", "https://use.jitsu.com") + .option("-k, --apikey ", "Jitsu user's Api Key. (Optional). Disables interactive login.") + .action(login); + +p.command("deploy") + .description("Deploy functions to Jitsu project") + .option("-d, --dir ", "the directory of project. (Optional). By default, current directory is used") + .option( + "-w, --workspace ", + "Id of workspace where to deploy function (Optional). By default, interactive prompt is shown to select workspace" + ) + .option("-t, --type ", "entity type to deploy", "function") + .option("-n, --name ", "limit deploy to provided entities only. (Optional)") + .action(deploy); + +//version +p.version(jitsuCliPackageName + " " + jitsuCliVersion, "-v, --version"); + +p.parse(); diff --git a/cli/jitsu-cli/src/lib/chalk-code-highlight.ts b/cli/jitsu-cli/src/lib/chalk-code-highlight.ts new file mode 100644 index 000000000..3777a061f --- /dev/null +++ b/cli/jitsu-cli/src/lib/chalk-code-highlight.ts @@ -0,0 +1,49 @@ +import Prism, { Grammar } from "prismjs"; +import chalk from "chalk"; + +export type ColorScheme = Record; + +export const defaultColorScheme = { + punctuation: "#999", + operator: "#9a6e3a", + string: "#9a6e3a", + keyword: "b#07a", + "function-variable": null, +}; + +export const b = chalk.bold; +export const red = chalk.red; + +function chalkString(expr: string, str: string): string { + if (expr.startsWith("b")) { + return b(chalkString(expr.substring(1), str)); + } else { + return chalk.hex(expr)(str); + } +} + +/** + * Highlights code with Prism and the applies Chalk to color + * output for terminal + * @param code + */ +export function chalkCode(code: string, lang: Grammar, colorScheme: ColorScheme = defaultColorScheme): string { + return Prism.tokenize(code, Prism.languages.javascript) + .map(element => { + if (typeof element === "string") { + return element; + } else { + let highlight = colorScheme[element.type]; + return highlight ? chalkString(highlight, element.content.toString()) : `${element.content}`; + } + }) + .join(""); +} + +chalkCode.typescript = (code: TemplateStringsArray | string, colorScheme: ColorScheme = defaultColorScheme) => { + return chalkCode(typeof code === "string" ? code : code.join("\n"), Prism.languages.typescript, colorScheme); +}; + +chalkCode.json = (code: TemplateStringsArray | string, colorScheme: ColorScheme = defaultColorScheme) => { + return chalkCode(typeof code === "string" ? code : code.join("\n"), Prism.languages.json, colorScheme); +}; diff --git a/cli/jitsu-cli/src/lib/indent.ts b/cli/jitsu-cli/src/lib/indent.ts new file mode 100644 index 000000000..391fdfeec --- /dev/null +++ b/cli/jitsu-cli/src/lib/indent.ts @@ -0,0 +1,42 @@ +function getIndentSize(line): number { + let idx = 0; + for (; line.charAt(idx) === " " && idx < line.length; idx++) {} + return idx; +} + +/** + * Finds a common indentation in text and removes it + */ +export function removeIndentation(text: string, { trimLines = true } = {}): string { + let lines = text.split("\n"); + if (trimLines) { + let start = 0, + end = lines.length - 1; + for (; lines[start].trim().length == 0 && start <= end; start++) {} + for (; lines[end].trim().length == 0 && end >= start; end--) {} + lines = lines.slice(start, end + 1); + } + let commonIndent = Math.min(...lines.filter(ln => ln.trim().length > 0).map(getIndentSize)); + + return lines.map(ln => ln.substring(commonIndent)).join("\n"); +} + +export function align(text: string, { indent = 0, lnBefore = 0, lnAfter = 0 } = {}) { + const cleanText = removeIndentation(text, { trimLines: true }); + return [ + ...new Array(lnBefore).fill(""), + ...cleanText.split("\n").map(ln => " ".repeat(indent) + ln), + ...new Array(lnAfter).fill(""), + ].join("\n"); +} + +export function jsonify(obj: any) { + if (typeof obj === "string") { + try { + return JSON.parse(obj); + } catch (e) { + return obj; + } + } + return obj; +} diff --git a/cli/jitsu-cli/src/lib/template.ts b/cli/jitsu-cli/src/lib/template.ts new file mode 100644 index 000000000..f07ba8d00 --- /dev/null +++ b/cli/jitsu-cli/src/lib/template.ts @@ -0,0 +1,37 @@ +import path from "path"; +import * as fs from "fs"; +import { removeIndentation } from "./indent"; + +export type TemplateVars = Record; +export type TemplateFunction = (vars: T) => any; +export type FileTemplate = TemplateFunction | string | any; + +export type ProjectTemplate = (vars: T) => Record>; + +function toTemplateFunction(template: FileTemplate): TemplateFunction { + if (template === null || template === undefined) { + return () => undefined; + } else if (typeof template === "function") { + return template; + } else { + return () => template; + } +} + +export function write(dir: string, template: ProjectTemplate, vars: T) { + Object.entries(template(vars)).forEach(([fileName, template]) => { + let filePath = path.resolve(dir, fileName); + let fileDir = path.dirname(filePath); + if (!fs.existsSync(fileDir)) { + fs.mkdirSync(fileDir, { recursive: true }); + } + let content = toTemplateFunction(template)(vars); + if (typeof content === "object") { + content = JSON.stringify(content, null, 2); + } + if (content) { + let data = removeIndentation(content); + fs.writeFileSync(filePath, data); + } + }); +} diff --git a/cli/jitsu-cli/src/lib/version.ts b/cli/jitsu-cli/src/lib/version.ts new file mode 100644 index 000000000..c491d6bc3 --- /dev/null +++ b/cli/jitsu-cli/src/lib/version.ts @@ -0,0 +1,36 @@ +import pkg from "../../package.json"; +import chalk from "chalk"; +import semver from "semver/preload"; +import { b } from "./chalk-code-highlight"; +const fetch = require("cross-fetch"); + +export const jitsuCliVersion = pkg.version; +export const jitsuCliPackageName = pkg.name; +let newVersion = undefined; + +export function getUpgradeMessage(newVersion: string, oldVersion: string) { + return box( + `🚀 New version of Jitsu CLI is available: ${oldVersion} → ${chalk.green(newVersion)} \n Run ${b( + "npm install -g " + jitsuCliPackageName + )} or ${b("yarn global install " + jitsuCliPackageName)}` + ); +} +function padRight(str: string, minLen: number, symbol: string = " ") { + return str.length >= minLen ? str : str + symbol.repeat(minLen - str.length); +} +export function box(msg: string) { + let lines = msg.split("\n"); + return ["──".repeat(80), ...lines.map(ln => ` ${ln}`), "──".repeat(80)].join("\n"); +} + +export async function hasNewerVersion(): Promise { + try { + let json = (await ( + await fetch(`https://registry.npmjs.org/-/package/${jitsuCliPackageName}/dist-tags`) + ).json()) as any; + let latestVersion = json.latest; + return semver.gt(latestVersion, jitsuCliVersion) ? latestVersion : undefined; + } catch (e: any) { + console.debug(`Failed to fetch latest version of ${jitsuCliPackageName}: ${e?.message}`); + } +} diff --git a/cli/jitsu-cli/src/main.ts b/cli/jitsu-cli/src/main.ts deleted file mode 100644 index a23d2231a..000000000 --- a/cli/jitsu-cli/src/main.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { ParsedArgs } from "minimist"; - -export async function main(args): Promise {} diff --git a/cli/jitsu-cli/src/templates/functions.ts b/cli/jitsu-cli/src/templates/functions.ts new file mode 100644 index 000000000..a43b6613f --- /dev/null +++ b/cli/jitsu-cli/src/templates/functions.ts @@ -0,0 +1,82 @@ +import { ProjectTemplate } from "../lib/template"; +import { jitsuCliVersion, jitsuCliPackageName } from "../lib/version"; +import { sanitize } from "juava"; + +export type TemplateVars = { + license?: "MIT" | "Other"; + packageName: string; + functionName: string; + jitsuVersion?: string; +}; + +export const packageJsonTemplate = ({ packageName, license = "MIT", jitsuVersion = undefined }: TemplateVars) => ({ + name: `${packageName}`, + version: "0.0.1", + description: `Jitsu extension - ${packageName}`, + license: license, + keywords: ["jitsu", "jitsu-cli", "function", `jitsu-extension`], + scripts: { + clean: "rm -rf ./dist", + build: `${jitsuCliPackageName} build`, + test: `${jitsuCliPackageName} test`, + deploy: `${jitsuCliPackageName} deploy`, + }, + devDependencies: { + "jitsu-cli": `${jitsuCliVersion}`, + "@jitsu/protocols": `${jitsuVersion || "^" + jitsuCliVersion}`, + "@types/jest": "^29.5.5", + "ts-jest": "^29.1.1", + }, + dependencies: {}, +}); + +let functionTest = ({ packageName }: TemplateVars) => { + return ` +test("${sanitize(packageName)} test", () => { + //TODO: implement test +}); +`; +}; + +let functionCode = ({ packageName, functionName }: TemplateVars) => { + return ` +import { JitsuFunction } from "@jitsu/protocols/functions"; +import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; + +export const config = { + slug: "${sanitize(packageName)}", //id (uniq per workspace) used to identify function in Jitsu + name: "${functionName.replaceAll('"', '\\"')}", //human readable name of function + description: "" +}; + +const ${sanitize( + packageName + )}: JitsuFunction = async (event, { log, fetch, props, store, geo, ...meta }) => { + //TODO: implement function logic +}; + +export default ${sanitize(packageName)}; +`; +}; + +export const functionProjectTemplate: ProjectTemplate = ({ packageName }: TemplateVars) => ({ + [`__test__/functions/${sanitize(packageName)}.test.ts`]: functionTest, + [`src/functions/${sanitize(packageName)}.ts`]: functionCode, + "package.json": packageJsonTemplate, + "tsconfig.json": { + compilerOptions: { + rootDir: "./src", + outDir: "./dist", + declaration: true, + esModuleInterop: true, + moduleResolution: "node", + importHelpers: false, + module: "esnext", + lib: ["esnext", "dom"], + noEmit: false, + target: "esnext", + }, + target: "esnext", + exclude: ["__tests__", "node_modules", "dist"], + }, +}); diff --git a/cli/jitsu-cli/tsconfig.json b/cli/jitsu-cli/tsconfig.json index e9878393e..3b3ffd3c2 100644 --- a/cli/jitsu-cli/tsconfig.json +++ b/cli/jitsu-cli/tsconfig.json @@ -1,14 +1,28 @@ { - "extends": "../../tsconfig.base.json", "compilerOptions": { - "sourceMap": true, + "outDir": "./compiled", "rootDir": ".", - "outDir": "./dist", - "declaration": true + "noImplicitAny": false, + "allowSyntheticDefaultImports": true, + "importHelpers": true, + "removeComments": true, + "target": "ES2021", + "module": "commonjs", + "lib": [ + "dom","esnext" + ], + "allowJs": true, + "strict": true, + "esModuleInterop": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "skipLibCheck": true }, + "exclude": [ + "node_modules" + ], "include": [ - "./src", - "package.json" + "src/**/*" ] +} -} \ No newline at end of file diff --git a/cli/jitsu-cli/webpack.config.js b/cli/jitsu-cli/webpack.config.js new file mode 100644 index 000000000..986724063 --- /dev/null +++ b/cli/jitsu-cli/webpack.config.js @@ -0,0 +1,48 @@ +const path = require("path"); +const webpack = require("webpack"); + +const config = { + entry: "./src/index.ts", + target: "node", + externals: { + figlet: "require('figlet')", + "@swc/core": "require('@swc/core')", + "@swc/wasm": "require('@swc/wasm')", + "isolated-vm": "require('isolated-vm')", + "jest-cli": "require('jest-cli')", + "../../package.json": "require('../package.json')", + }, + node: { + __dirname: false, + }, + devtool: "source-map", + output: { + path: path.resolve(__dirname, "dist"), + }, + plugins: [ + new webpack.IgnorePlugin({ resourceRegExp: /^fsevents$/ }), // Ignore MacOS-only module + ], + module: { + rules: [ + { + test: /\.(ts|tsx)$/i, + use: { + loader: "babel-loader", + }, + }, + { + test: /\.node$/, + loader: "node-loader", + }, + ], + }, + optimization: { + minimize: false, + }, + resolve: { + extensions: [".tsx", ".ts", ".jsx", ".js", ".node", "..."], + }, + mode: "production", +}; + +module.exports = () => config; diff --git a/examples/react-app/package.json b/examples/react-app/package.json index ef950336d..24f73ae56 100644 --- a/examples/react-app/package.json +++ b/examples/react-app/package.json @@ -9,7 +9,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.4.3", - "react-scripts": "^5.1.0-next.14", + "react-scripts": "^5.0.1", "web-vitals": "^2.1.4" }, "scripts": { diff --git a/libs/core-functions/__tests__/lib/testing-lib.ts b/libs/core-functions/__tests__/lib/testing-lib.ts index 79a5309aa..8ce6a05a5 100644 --- a/libs/core-functions/__tests__/lib/testing-lib.ts +++ b/libs/core-functions/__tests__/lib/testing-lib.ts @@ -1,6 +1,13 @@ import { AnalyticsInterface, AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import { requireDefined } from "juava"; -import { AnyEvent, EventContext, FuncReturn, JitsuFunction, SystemContext } from "@jitsu/protocols/functions"; +import { + AnyEvent, + EventContext, + FuncReturn, + FunctionContext, + JitsuFunction, + SystemContext, +} from "@jitsu/protocols/functions"; import nodeFetch from "node-fetch-commonjs"; import { createStore } from "./mem-store"; import * as JSON5 from "json5"; @@ -12,11 +19,11 @@ export type Or = export type TestOptions = { mockFetch?: boolean; func: JitsuFunction; - ctx?: SystemContext & EventContext; + ctx?: SystemContext & EventContext & FunctionContext; } & Or<{ config: T }, { configEnvVar: string }> & Or<{ generateEvents: (jitsu: AnalyticsInterface) => void }, { events: AnalyticsServerEvent[] }>; -function prefixLogMessage(level: string, msg: any) { +export function prefixLogMessage(level: string, msg: any) { return `[${level}] ${msg}`; } diff --git a/libs/core-functions/__tests__/udf.test.ts b/libs/core-functions/__tests__/udf.test.ts index a49ed984d..bcad94bbf 100644 --- a/libs/core-functions/__tests__/udf.test.ts +++ b/libs/core-functions/__tests__/udf.test.ts @@ -1,7 +1,85 @@ -import { NodeVM } from "vm2"; -import * as swc from "@swc/core"; +import { Isolate } from "isolated-vm"; +import { UDFTestRun, UDFWrapper } from "../src"; +import express from "express"; -const moduleCode = ` +test("UDFWrapper", async () => { + const app = express(); + app.get("/", (req, res) => { + return res.send("FETCH RESPONSE"); + }); + var promiseResolve; + let prom = new Promise((resolve, reject) => { + promiseResolve = resolve; + }); + const server = app.listen(0, async () => { + const addr = server.address() as any; + promiseResolve(addr.port); + }); + const port = await prom; + + const udfCode = ` +export const config = { + slug: "udf", + name: "UDF Wrapper test", + description: "Description of UDF Wrapper test" +}; +const udf = async (event, { log, fetch, props, store, geo, ...meta }) => { + console.log("udf") + event.test = "test123" + const url = \`http://localhost:${port}/\`; + console.log("url", url) + const result = await fetch(url).then(r => r.text()); + console.log("result", result) + event.prop1 = props.prop1 + event.store1 = await store.get("store1") + event.fetch_result = result + store.set("test", result) + console.log("done") + return event; +}; + +export default udf; +`; + + const wrapper = UDFWrapper("udf", "UDF Wrapper test", udfCode); + console.log("wrapper", wrapper.meta); + const res = await UDFTestRun({ + functionId: "udf", + functionName: "UDF Wrapper test", + code: wrapper, + event: { + messageId: "test", + type: "page", + context: {}, + }, + config: { + prop1: "test_prop1", + }, + store: { + store1: "test_store1", + }, + workspaceId: "test", + }); + console.log("res", res); + + expect(res.result).toEqual({ + messageId: "test", + type: "page", + context: {}, + test: "test123", + prop1: "test_prop1", + store1: "test_store1", + fetch_result: "FETCH RESPONSE", + }); + expect(res.store).toEqual({ + store1: "test_store1", + test: "FETCH RESPONSE", + }); + server.close(); +}); + +test("isolate", async () => { + const moduleCode = ` let adder=0; export const myConst = 123; @@ -12,64 +90,34 @@ function inc() { } export default inc; `; + const isolate = new Isolate({ memoryLimit: 10 }); + const context = await isolate.createContext(); + const jail = context.global; -test("vm2", async () => { - const vm = new NodeVM({ - timeout: 1000, - allowAsync: true, - require: false, + // This make the global object available in the context as 'global'. We use 'derefInto()' here + // because otherwise 'global' would actually be a Reference{} object in the new isolate. + jail.setSync("global", jail.derefInto()); + const module = isolate.compileModuleSync(moduleCode, { filename: "udf.js" }); + module.instantiateSync(context, (specifier: string) => { + throw new Error(`import not allowed: ${specifier}`); }); - const transpiled = swc.transformSync(moduleCode, { - filename: `index.js`, - module: { type: "commonjs" }, - }).code; - console.log("transpiled", transpiled); - // const transpiled = transformSync(moduleCode, { - // presets: ["@babel/preset-env"], - // filename: `index.js`, - // plugins: [plugin], - // }).code; - const r = vm.run(` -${transpiled} -return module.exports; - `); - console.log("exports", r); - const inc = r.default; - expect(inc()).toEqual(1); - expect(inc()).toEqual(2); - expect(inc()).toEqual(3); + module.evaluateSync(); + const exported = module.namespace; + + let ref = exported.getSync("default", { + reference: true, + }); + const inc = async () => + await ref.applySync(undefined, [], { arguments: { reference: true }, result: { promise: true } }); + const myConst = exported.getSync("myConst"); + + console.log("udf", exported); + console.log("myConst", myConst); + console.log("inc", inc); + + expect(await inc()).toEqual(1); + expect(await inc()).toEqual(2); + expect(await inc()).toEqual(3); return []; }); -// -// test("isolate", async () => { -// const isolate = new ivm.Isolate({ memoryLimit: 10 }); -// const context = await isolate.createContext(); -// const jail = context.global; -// -// // This make the global object available in the context as 'global'. We use 'derefInto()' here -// // because otherwise 'global' would actually be a Reference{} object in the new isolate. -// jail.setSync("global", jail.derefInto()); -// const module = isolate.compileModuleSync("let exports = {}\n" + moduleCode, { filename: "udf.js" }); -// module.instantiateSync(context, (specifier: string) => { -// throw new Error(`import not allowed: ${specifier}`); -// }); -// module.evaluateSync(); -// const exported = module.namespace; -// -// let ref = exported.getSync("default", { -// reference: true, -// }); -// let add = ref.deref(); -// const myConst = exported.getSync("myConst2"); -// -// console.log("udf", exported); -// console.log("myConst", myConst); -// console.log("add", add); -// -// console.log("add", add(1, 2)); -// console.log("add", add(1, 2)); -// console.log("add", add(1, 2)); -// -// return []; -// }); diff --git a/libs/core-functions/__tests__/user-recognition.test.ts b/libs/core-functions/__tests__/user-recognition.test.ts index d7573eef7..07ba26190 100644 --- a/libs/core-functions/__tests__/user-recognition.test.ts +++ b/libs/core-functions/__tests__/user-recognition.test.ts @@ -1,7 +1,9 @@ import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import UserRecognitionFunction, { UserRecognitionConfig } from "../src/functions/user-recognition"; -import { testJitsuFunction, TestOptions } from "./lib/testing-lib"; -import { createAnonymousEventsStore } from "./lib/mem-store"; +import { prefixLogMessage, testJitsuFunction, TestOptions } from "./lib/testing-lib"; +import { createAnonymousEventsStore, createStore } from "./lib/mem-store"; +import nodeFetch from "node-fetch-commonjs"; +import { FetchOpts, FetchResponse, FetchType } from "@jitsu/protocols/functions"; const anonymousEvents: AnalyticsServerEvent[] = [ { @@ -100,6 +102,14 @@ test("user-recognition-test", async () => { deduplicate: true, }, }, + fetch: nodeFetch as unknown as FetchType, + store: createStore(), + log: { + info: (msg: any, ...args: any[]) => console.log(prefixLogMessage("INFO", msg), args), + error: (msg: any, ...args: any[]) => console.error(prefixLogMessage("ERROR", msg), args), + debug: (msg: any, ...args: any[]) => console.debug(prefixLogMessage("DEBUG", msg), args), + warn: (msg: any, ...args: any[]) => console.warn(prefixLogMessage("WARN", msg), args), + }, $system: { anonymousEventsStore: createAnonymousEventsStore(), }, diff --git a/libs/core-functions/package.json b/libs/core-functions/package.json index fc652ca99..6548c7a0b 100644 --- a/libs/core-functions/package.json +++ b/libs/core-functions/package.json @@ -28,16 +28,17 @@ "jest": "^29.5.0", "json5": "^2.1.0", "node-fetch-commonjs": "^3.2.4", - "ts-jest": "29.0.5" + "ts-jest": "29.0.5", + "express": "^4.18.2" }, "dependencies": { "dayjs": "^1.11.10", - "@swc/core": "^1.3.40", - "@swc/wasm": "^1.3.40", - "vm2": "^3.9.14", + "@swc/core": "^1.3.88", + "@swc/wasm": "^1.3.89", + "isolated-vm": "^4.6.0", "juava": "workspace:*", "lodash": "^4.17.21", - "mongodb": "^5.1.0", + "mongodb": "^5.9.0", "posthog-node": "^2.4.0", "tslib": "^2.4.0", "zod": "3.21.4", diff --git a/libs/core-functions/src/functions/lib/http-agent.ts b/libs/core-functions/src/functions/lib/http-agent.ts index c67ef7c4b..0b79a2158 100644 --- a/libs/core-functions/src/functions/lib/http-agent.ts +++ b/libs/core-functions/src/functions/lib/http-agent.ts @@ -1,8 +1,8 @@ import { getSingleton } from "juava"; import Agent, { HttpsAgent } from "agentkeepalive"; -export const httpAgent = getSingleton("http-agent", createHTTPAgent); -export const httpsAgent = getSingleton("https-agent", createHTTPSAgent); +export const httpAgent = getSingleton("http-agent", createHTTPAgent, { silent: true }); +export const httpsAgent = getSingleton("https-agent", createHTTPSAgent, { silent: true }); async function createHTTPAgent(): Promise { const agent = new Agent({ timeout: 300000, freeSocketTimeout: 30000, maxSockets: 1024 }); diff --git a/libs/core-functions/src/functions/lib/mongodb.ts b/libs/core-functions/src/functions/lib/mongodb.ts index 3dff82622..22180944e 100644 --- a/libs/core-functions/src/functions/lib/mongodb.ts +++ b/libs/core-functions/src/functions/lib/mongodb.ts @@ -7,7 +7,9 @@ const AnonymousEventsStoreIdField = "_jitsu_anonymous_id_"; const log = getLog("mongodb"); -export const mongodb = getSingleton("mongodb", createClient); +export const mongodb = getSingleton("mongodb", createClient, { + optional: true, +}); async function createClient() { const mongodbURL = requireDefined(process.env.MONGODB_URL, "env MONGODB_URL is not defined"); diff --git a/libs/core-functions/src/functions/udf_isolated_vm.ts b/libs/core-functions/src/functions/udf_isolated_vm.ts deleted file mode 100644 index 3f781e6cf..000000000 --- a/libs/core-functions/src/functions/udf_isolated_vm.ts +++ /dev/null @@ -1,39 +0,0 @@ -// import { JitsuFunction } from "@jitsu/protocols/functions"; -// import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; -// import ivm from "isolated-vm"; -// -// export const UDFWrapper = (functionId, functionCode: string) => { -// const startMs = new Date().getTime(); -// const isolate = new ivm.Isolate({ memoryLimit: 10 }); -// const context = isolate.createContextSync(); -// const jail = context.global; -// // This make the global object available in the context as 'global'. We use 'derefInto()' here -// // because otherwise 'global' would actually be a Reference{} object in the new isolate. -// jail.setSync("global", jail.derefInto()); -// const module = isolate.compileModuleSync(functionCode, { filename: `${functionId}.js` }); -// module.instantiateSync(context, (specifier: string) => { -// throw new Error(`import not allowed: ${specifier}`); -// }); -// module.evaluateSync(); -// const exported = module.namespace; -// let userFunction = exported.getSync("default", { -// reference: true, -// }); -// if (!userFunction) { -// userFunction = exported.getSync("onEvent", { -// reference: true, -// }); -// } -// if (!userFunction) { -// throw new Error("Function not found. Please export default function or 'onEvent' function."); -// } -// console.log(`udf compile time ${new Date().getTime() - startMs}ms`); -// return { -// // userFunction: async (event, ctx) => { -// // return userFunction.apply(jail, [event, ctx], { arguments: { reference: true }, result: { promise: true } }); -// // }, -// close: () => { -// isolate.dispose(); -// }, -// }; -// }; diff --git a/libs/core-functions/src/functions/udf_vm2.ts b/libs/core-functions/src/functions/udf_vm2.ts deleted file mode 100644 index 7978176b6..000000000 --- a/libs/core-functions/src/functions/udf_vm2.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { NodeVM } from "vm2"; -import { getLog } from "juava"; -import * as swc from "@swc/core"; - -const log = getLog("udf-vm2-wrapper"); - -export const UDFWrapper = (functionId, name, functionCode: string) => { - log.atInfo().log(`[${functionId}] Compiling UDF function '${name}'`); - - const startMs = new Date().getTime(); - try { - functionCode = swc.transformSync(functionCode, { - filename: `index.js`, - module: { type: "commonjs" }, - }).code; - // functionCode = transformSync(functionCode, { - // presets: [preset], - // filename: `index.js`, - // plugins: [plugin], - // }).code; - const vm = new NodeVM({ - require: { - external: [functionId], - context: "sandbox", - }, - }); - - //const userFunction = vm.run(functionCode, `${functionId}.js`); - const userFunction = vm.run( - `${functionCode} -const exported = module.exports; -let userFunction; -if (typeof exported === "function") { - userFunction = exported; -} else { - userFunction = exported.default; - if (!userFunction && Object.keys(exported).length === 1) { - userFunction = exported[Object.keys(exported)[0]]; - } -} -const wrapped = async function(event, ctx) { - if (!userFunction || typeof userFunction !== "function") { - throw new Error("Function not found. Please export default function."); - } - console = {...console, - log: ctx.log.info, - error: ctx.log.error, - warn: ctx.log.warn, - debug: ctx.log.debug, - info: ctx.log.info, - assert: (asrt, ...args) => { - if (!asrt) { - ctx.log.error("Assertion failed",...args); - } - } - }; - return userFunction(event, ctx); -} -module.exports = wrapped; -`, - `${functionId}.js` - ); - if (!userFunction || typeof userFunction !== "function") { - throw new Error("Function not found. Please export default function."); - } - log.atInfo().log(`[${functionId}] udf compile time ${new Date().getTime() - startMs}ms`); - return { - userFunction, - close: () => {}, - }; - } catch (e) { - return { - userFunction: () => { - throw new Error(`Cannot compile function: ${e}`); - }, - close: () => {}, - }; - } -}; diff --git a/libs/core-functions/src/functions/udf_wrapper.ts b/libs/core-functions/src/functions/udf_wrapper.ts new file mode 100644 index 000000000..559b9b2db --- /dev/null +++ b/libs/core-functions/src/functions/udf_wrapper.ts @@ -0,0 +1,359 @@ +import { getLog } from "juava"; +import { Isolate, ExternalCopy, Callback, Reference } from "isolated-vm"; +import * as swc from "@swc/core"; +import { + EventContext, + EventsStore, + FetchOpts, + FetchResponse, + FuncReturn, + JitsuFunction, + Store, +} from "@jitsu/protocols/functions"; +import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; +import { createFullContext } from "../context"; +import { isDropResult } from "../index"; + +const log = getLog("udf-wrapper"); + +export type logType = { + message: string; + level: string; + timestamp: Date; + type: string; + data?: any; +}; + +export type UDFWrapperResult = { + userFunction: JitsuFunction; + meta: any; + close: () => void; +}; + +const wrapperJs = ` +const exported = exports; +let $userFunction; +let $config; +if (typeof exported === "function") { + $userFunction = exported; +} else { + $userFunction = exported.default; + $config = exported.config; + if (!$userFunction && Object.keys(exported).length > 0) { + $userFunction = Object.values(exported).find(v => typeof v === "function"); + } +} +const $wrappedUserFunction = async function (eventcopy, ctxcopy) { + const c = ctxcopy.copy(); + const ctx = { + ...c, + store: { + ...c.store, + get: async key => { + const res = await c.store.get.apply(undefined, [key], { arguments: { copy: true }, result: { promise: true } }); + return res ? JSON.parse(res) : undefined; + }, + }, + fetch: async (url, opts) => { + const res = await c.fetch.apply(undefined, [url, opts], { arguments: { copy: true }, result: { promise: true } }); + const r = JSON.parse(res); + + return { + ...r, + json: async () => { + return JSON.parse(r.body); + }, + text: async () => { + return r.body; + }, + arrayBuffer: async () => { + throw new Error("Method 'arrayBuffer' is not implemented"); + }, + blob: async () => { + throw new Error("Method 'blob' is not implemented"); + }, + formData: async () => { + throw new Error("Method 'formData' is not implemented"); + }, + clone: async () => { + throw new Error("Method 'clone' is not implemented"); + } + }; + }, + }; + const event = eventcopy.copy(); + if (!$userFunction || typeof $userFunction !== "function") { + throw new Error("Function not found. Please export default function."); + } + console = { + ...console, + log: ctx.log.info, + error: ctx.log.error, + warn: ctx.log.warn, + debug: ctx.log.debug, + info: ctx.log.info, + assert: (asrt, ...args) => { + if (!asrt) { + ctx.log.error("Assertion failed", ...args); + } + }, + }; + return $userFunction(event, ctx); +}; +export const meta = $config; +export default $wrappedUserFunction; +`; + +export const UDFWrapper = (functionId, name, functionCode: string): UDFWrapperResult => { + log.atInfo().log(`[${functionId}] Compiling UDF function '${name}'`); + functionCode = swc.transformSync(functionCode, { + filename: `index.js`, + module: { type: "commonjs" }, + }).code; + const startMs = new Date().getTime(); + try { + const wrappedCode = `let exports = {}\n${functionCode}\n${wrapperJs}`; + const isolate = new Isolate({ memoryLimit: 10 }); + const context = isolate.createContextSync(); + const jail = context.global; + + // This make the global object available in the context as 'global'. We use 'derefInto()' here + // because otherwise 'global' would actually be a Reference{} object in the new isolate. + jail.setSync("global", jail.derefInto()); + const module = isolate.compileModuleSync(wrappedCode, { filename: "udf.js" }); + module.instantiateSync(context, (specifier: string) => { + throw new Error(`import is not allowed: ${specifier}`); + }); + module.evaluateSync(); + const exported = module.namespace; + + const ref = exported.getSync("default", { + reference: true, + }); + if (!ref || ref.typeof !== "function") { + throw new Error("Function not found. Please export default function."); + } + const meta = exported.getSync("meta", { + copy: true, + }); + const userFunction: JitsuFunction = async (event, ctx) => { + if (isolate.isDisposed) { + throw new Error("Isolate is disposed"); + } + try { + const res = await ref.apply( + undefined, + [ + new ExternalCopy(event), + new ExternalCopy({ + ...ctx, + log: { + info: new Callback(ctx.log.info), + warn: new Callback(ctx.log.warn), + debug: new Callback(ctx.log.debug), + error: new Callback(ctx.log.error), + }, + fetch: new Reference(async (url: string, opts?: FetchOpts) => { + const res = await ctx.fetch(url, opts); + const headers: any = {}; + res.headers.forEach((v, k) => { + headers[k] = v; + }); + const text = await res.text(); + const j = { + status: res.status, + statusText: res.statusText, + type: res.type, + redirected: res.redirected, + body: text, + bodyUsed: true, + url: res.url, + ok: res.ok, + headers: headers, + }; + return JSON.stringify(j); + }), + store: { + get: new Reference(async (key: string) => { + const res = await ctx.store.get(key); + return JSON.stringify(res); + }), + set: new Callback(ctx.store.set, { ignored: true }), + del: new Callback(ctx.store.del, { ignored: true }), + }, + }), + ], + { + result: { promise: true }, + } + ); + switch (typeof res) { + case "undefined": + return undefined; + case "string": + case "number": + case "boolean": + return res; + default: + return (res as Reference).copy(); + } + } catch (e) { + if (isolate.isDisposed) { + throw new Error("Isolate is disposed"); + } + throw e; + } + }; + log.atInfo().log(`[${functionId}] udf compile time ${new Date().getTime() - startMs}ms`); + return { + userFunction, + meta, + close: () => {}, + }; + } catch (e) { + return { + userFunction: () => { + throw new Error(`Cannot compile function: ${e}`); + }, + meta: {}, + close: () => {}, + }; + } +}; + +export type UDFTestRequest = { + functionId: string; + functionName: string; + code: string | UDFWrapperResult; + event: AnalyticsServerEvent; + config: any; + store: any; + workspaceId: string; +}; + +export type UDFTestResponse = { + error?: any; + dropped?: boolean; + result: FuncReturn; + store: any; + logs: logType[]; +}; + +export async function UDFTestRun({ + functionId: id, + functionName: name, + code, + store, + event, + config, +}: UDFTestRequest): Promise { + const logs: logType[] = []; + try { + const eventContext: EventContext = { + geo: { + country: { + code: "US", + isEU: false, + }, + city: { + name: "New York", + }, + region: { + code: "NY", + }, + location: { + latitude: 40.6808, + longitude: -73.9701, + }, + postalCode: { + code: "11238", + }, + }, + headers: {}, + source: { + id: "functionsDebugger-streamId", + }, + destination: { + id: "functionsDebugger-destinationId", + type: "clickhouse", + updatedAt: new Date(), + hash: "hash", + }, + connection: { + id: "functionsDebugger", + }, + }; + + const storeImpl: Store = { + get: async (key: string) => { + return store[key]; + }, + set: async (key: string, obj: any) => { + store[key] = obj; + }, + del: async (key: string) => { + delete store[key]; + }, + }; + const eventsStore: EventsStore = { + log(connectionId: string, error: boolean, msg: Record) { + switch (msg.type) { + case "log-info": + case "log-warn": + case "log-debug": + case "log-error": + logs.push({ + message: + msg.message?.text + + (Array.isArray(msg.message?.args) && msg.message.args.length > 0 + ? `, ${msg.message?.args.join(",")}` + : ""), + level: msg.type.replace("log-", ""), + timestamp: new Date(), + type: "log", + }); + break; + case "http-request": + let statusText; + if (msg.error) { + statusText = `${msg.error}`; + } else { + statusText = `${msg.statusText ?? ""}${msg.status ? `(${msg.status})` : ""}`; + } + logs.push({ + message: `${msg.method} ${msg.url} :: ${statusText}`, + level: msg.error ? "error" : "info", + timestamp: new Date(), + type: "http", + data: { + body: msg.body, + headers: msg.headers, + response: msg.response, + }, + }); + } + }, + }; + const ctx = createFullContext(id, eventsStore, storeImpl, eventContext, {}, config); + let wrapper: UDFWrapperResult; + if (typeof code === "string") { + wrapper = UDFWrapper(id, name, code); + } else { + wrapper = code; + } + const result = await wrapper.userFunction(event, ctx); + return { + dropped: isDropResult(result), + result: typeof result === "undefined" ? event : result, + store: store, + logs, + }; + } catch (e) { + return { + error: `${e}`, + result: {}, + store: store ?? {}, + logs, + }; + } +} diff --git a/libs/core-functions/src/index.ts b/libs/core-functions/src/index.ts index b02716731..2a917a965 100644 --- a/libs/core-functions/src/index.ts +++ b/libs/core-functions/src/index.ts @@ -2,6 +2,7 @@ import { BuiltinDestinationFunctionName, BuiltinFunctionName, BuiltinTransformationFunctionName, + FuncReturn, JitsuFunction, } from "@jitsu/protocols/functions"; import BulkerDestination from "./functions/bulker-destination"; @@ -43,8 +44,13 @@ export function getBuiltinFunction(id: string): JitsuFunction | undefined { return builtinFunctions[fixedId]; } +export function isDropResult(result: FuncReturn): boolean { + return result === "drop" || (Array.isArray(result) && result.length === 0) || result === null || result === false; +} + export * as bulkerDestination from "./functions/bulker-destination"; -export { UDFWrapper } from "./functions/udf_vm2"; +export { UDFWrapper, UDFTestRun } from "./functions/udf_wrapper"; +export type { UDFTestRequest, UDFTestResponse, logType } from "./functions/udf_wrapper"; export { createFullContext } from "./context"; export * as mixpanelDestination from "./functions/mixpanel-destination"; export * as ga4Destination from "./functions/ga4-destination"; diff --git a/libs/core-functions/tsconfig.json b/libs/core-functions/tsconfig.json index 87a377bb5..03f740fd6 100644 --- a/libs/core-functions/tsconfig.json +++ b/libs/core-functions/tsconfig.json @@ -4,6 +4,7 @@ "outDir": "./dist", "declaration": true, "esModuleInterop": true, + "target": "ES2019", "module": "commonjs", "lib": ["ES2019", "dom"], "noEmit": true diff --git a/libs/jitsu-js/__tests__/node/nodejs.test.ts b/libs/jitsu-js/__tests__/node/nodejs.test.ts index fa67d7f80..bac3b3eda 100644 --- a/libs/jitsu-js/__tests__/node/nodejs.test.ts +++ b/libs/jitsu-js/__tests__/node/nodejs.test.ts @@ -1,5 +1,6 @@ import { createServer, SimpleSyrup } from "../simple-syrup"; import { AnalyticsClientEvent, AnalyticsInterface } from "@jitsu/protocols/analytics"; +import { parse } from "tldts"; const jitsuAnalytics = require("../../dist/jitsu.cjs.js").jitsuAnalytics; const fetchImpl = require("node-fetch-commonjs"); @@ -89,4 +90,14 @@ describe("Test Jitsu NodeJS client", () => { await shutdownServer(); } }); + + test("tld", async () => { + expect(parse("http://www.google.com").domain).toBe("google.com"); + expect(parse("www.trendstyle.com.au").domain).toBe("trendstyle.com.au"); + expect(parse("http://localhost:3000").domain).toBe(null); + expect(parse("http://localhost:3000").hostname).toBe("localhost"); + expect(parse("http://use.jitsu.com").domain).toBe("jitsu.com"); + expect(parse("use.jitsu.com").domain).toBe("jitsu.com"); + //console.log(parse("http://localhost:3000")); + }); }); diff --git a/libs/jitsu-js/package.json b/libs/jitsu-js/package.json index dcf5a37dc..25a887bbe 100644 --- a/libs/jitsu-js/package.json +++ b/libs/jitsu-js/package.json @@ -20,6 +20,7 @@ "build": "tsc -p . && rollup -c && cp compiled/src/*.d.ts dist" }, "devDependencies": { + "tldts": "^6.0.15", "@jitsu/protocols": "workspace:*", "@playwright/test": "1.31.2", "@rollup/plugin-commonjs": "^23.0.2", diff --git a/libs/jitsu-js/src/analytics-plugin.ts b/libs/jitsu-js/src/analytics-plugin.ts index 612054664..06f0d6a73 100644 --- a/libs/jitsu-js/src/analytics-plugin.ts +++ b/libs/jitsu-js/src/analytics-plugin.ts @@ -3,6 +3,7 @@ import { JitsuOptions, PersistentStorage, RuntimeFacade } from "./jitsu"; import { AnalyticsClientEvent, Callback, ID, JSONObject, Options } from "@jitsu/protocols/analytics"; import parse from "./index"; +import { parse as parseTLD } from "tldts"; import { AnalyticsInstance, AnalyticsPlugin } from "analytics"; import { loadScript } from "./script-loader"; import { internalDestinationPlugins } from "./destination-plugins"; @@ -73,12 +74,11 @@ export function getTopLevelDomain(opts: JitsuOptions = {}) { if (opts.cookieDomain) { return opts.cookieDomain; } - const [domain] = window.location.hostname.split(":"); - const parts = domain.split("."); - if (parts[parts.length - 1] === "localhost" || parts.length < 2) { - return parts[parts.length - 1]; + const tld = parseTLD(window.location.hostname); + if (tld.domain === null) { + return tld.hostname; } else { - return parts[parts.length - 2] + "." + parts[parts.length - 1]; + return tld.domain; } } diff --git a/libs/jitsu-react/package.json b/libs/jitsu-react/package.json index 28b0fab5a..3d09f6ec7 100644 --- a/libs/jitsu-react/package.json +++ b/libs/jitsu-react/package.json @@ -30,7 +30,7 @@ }, "devDependencies": { "ts-toolbelt": "^9.6.0", - "@testing-library/jest-dom": "^5.16.5", + "@testing-library/jest-dom": "^6.1.3", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^14.4.3", "@types/jest": "^29.2.3", diff --git a/libs/juava/src/id.ts b/libs/juava/src/id.ts index 96c974820..3469bde58 100644 --- a/libs/juava/src/id.ts +++ b/libs/juava/src/id.ts @@ -25,3 +25,8 @@ function randomChar(noDigits?: boolean) { } } } + +//sanitizes string for usage in file name +export function sanitize(name: string) { + return name.replace(/[^a-zA-Z0-9]+/gi, "-").toLowerCase(); +} diff --git a/libs/juava/src/security.ts b/libs/juava/src/security.ts index b9eaf99ce..29b343725 100644 --- a/libs/juava/src/security.ts +++ b/libs/juava/src/security.ts @@ -50,3 +50,15 @@ export function createAuthorized(tokens: string): Authorizer { ); return (secret: string) => authorizers.find(auth => auth(secret)) !== undefined; } + +export function encrypt(secret: string, iv: string, value: string): string { + const cipher = crypto.createCipheriv("aes-256-ctr", Buffer.from(secret), Buffer.from(iv)); + const encrypted = Buffer.concat([cipher.update(value), cipher.final()]); + return encrypted.toString("hex"); +} + +export function decrypt(secret: string, iv: string, value: string): string { + const decipher = crypto.createDecipheriv("aes-256-ctr", Buffer.from(secret), Buffer.from(iv)); + const decrypted = Buffer.concat([decipher.update(Buffer.from(value, "hex")), decipher.final()]); + return decrypted.toString(); +} diff --git a/libs/juava/src/singleton.ts b/libs/juava/src/singleton.ts index 7ab401321..4d16208b3 100644 --- a/libs/juava/src/singleton.ts +++ b/libs/juava/src/singleton.ts @@ -46,7 +46,12 @@ function getDisableServiceVar(globalName: string) { export function getSingleton( globalName: string, factory: () => T | Promise, - opts: { ttlSec: number; errorTtlSec?: number; cleanupFunc?: (t: T) => {} } = { ttlSec: 0, errorTtlSec: 0 } + opts: { ttlSec?: number; optional?: boolean; silent?: boolean; errorTtlSec?: number; cleanupFunc?: (t: T) => {} } = { + ttlSec: 0, + errorTtlSec: 0, + optional: false, + silent: false, + } ): Singleton { const disableServiceVar = getDisableServiceVar(globalName); if (process.env[disableServiceVar]) { @@ -67,14 +72,20 @@ export function getSingleton( success: true, value, debounceCleanup: - opts.ttlSec > 0 ? debounce(() => clearSingleton(globalName, opts.cleanupFunc), 1000 * opts.ttlSec) : () => {}, + opts.ttlSec && opts.ttlSec > 0 + ? debounce(() => clearSingleton(globalName, opts.cleanupFunc), 1000 * opts.ttlSec) + : () => {}, }; - log.atInfo().log(`️⚡️⚡️⚡️ ${globalName} connected in ${Date.now() - startedAtTs}ms!`); + if (!opts.silent) { + log.atInfo().log(`️⚡️⚡️⚡️ ${globalName} connected in ${Date.now() - startedAtTs}ms!`); + } return value; }; const handleError = (error: any): any => { - log.atError().log(`❌ ❌ ❌ ${globalName} connection failed. The application isn't functional.`, error); + if (!opts.optional) { + log.atError().log(`❌ ❌ ❌ ${globalName} connection failed. The application isn't functional.`, error); + } global[`singletons_${globalName}`] = { success: false, error, diff --git a/package.json b/package.json index 157f8ec06..898c2e605 100644 --- a/package.json +++ b/package.json @@ -22,8 +22,8 @@ "factory-reset": "pnpm clean ; pnpm clean:turbo ; rm -rf `find . -type d -name node_modules`", "clean": "turbo run clean || exit 0", "lint": "turbo run lint --", - "release": "monorel --filter ./libs/jitsu-js --filter ./libs/jitsu-react --npm-tag latest", - "release:canary": "monorel --filter ./libs/jitsu-js --filter ./libs/jitsu-react --version '1.1.0-canary.{rev}.{time}' --npm-tag canary --git-tag 'canary-v{version}' --push-tag --publish" + "release": "monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/jitsu-js --filter ./libs/jitsu-react --npm-tag latest", + "release:canary": "monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/jitsu-js --filter ./libs/jitsu-react --version '1.3.0-canary.{rev}.{time}' --npm-tag canary --git-tag 'canary-v{version}' --push-tag --publish" }, "devDependencies": { "dotenv-cli": "^6.0.0", @@ -33,7 +33,7 @@ "ts-node": "~10.8.2", "turbo": "~1.2.16", "typescript": "^4.9.5", - "vercel": "28.18.5" + "vercel": "^32.3.1" }, "engines": { "yarn": ">=1000", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 266426517..6ddef8e3c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,30 +26,150 @@ importers: specifier: ^4.9.5 version: 4.9.5 vercel: - specifier: 28.18.5 - version: 28.18.5(@types/node@18.15.11)(ts-node@10.8.2) + specifier: ^32.3.1 + version: 32.3.1 cli/jitsu-cli: dependencies: - chalk: - specifier: ^5.0.1 - version: 5.2.0 - juava: - specifier: workspace:* - version: link:../../libs/juava - minimist: - specifier: ^1.2.6 - version: 1.2.8 + '@swc/core': + specifier: ^1.3.88 + version: 1.3.88 + '@swc/wasm': + specifier: ^1.3.89 + version: 1.3.89 + figlet: + specifier: ^1.6.0 + version: 1.6.0 + isolated-vm: + specifier: ^4.6.0 + version: 4.6.0 + jest-cli: + specifier: ^29.7.0 + version: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) tslib: - specifier: ^2.4.0 - version: 2.5.0 + specifier: ^2.6.2 + version: 2.6.2 devDependencies: + '@babel/preset-env': + specifier: ^7.22.15 + version: 7.22.15(@babel/core@7.21.4) + '@babel/preset-typescript': + specifier: ^7.22.15 + version: 7.22.15(@babel/core@7.21.4) + '@jitsu/core-functions': + specifier: workspace:* + version: link:../../libs/core-functions + '@rollup/plugin-commonjs': + specifier: ^25.0.4 + version: 25.0.4(rollup@3.29.1) + '@rollup/plugin-json': + specifier: ^6.0.0 + version: 6.0.0(rollup@3.29.1) + '@rollup/plugin-node-resolve': + specifier: ^15.2.1 + version: 15.2.1(rollup@3.29.1) + '@rollup/plugin-terser': + specifier: ^0.4.3 + version: 0.4.3(rollup@3.29.1) + '@rollup/plugin-typescript': + specifier: ^11.1.3 + version: 11.1.3(rollup@3.29.1)(tslib@2.6.2)(typescript@5.2.2) '@types/chalk': specifier: ^2.2.0 version: 2.2.0 - '@types/minimist': - specifier: ^1.2.2 - version: 1.2.2 + '@types/commander': + specifier: ^2.12.2 + version: 2.12.2 + '@types/express': + specifier: ^4.17.17 + version: 4.17.17 + '@types/inquirer': + specifier: ^9.0.3 + version: 9.0.3 + '@types/jest': + specifier: ^29.5.5 + version: 29.5.5 + '@types/lodash': + specifier: ^4.14.198 + version: 4.14.198 + '@types/node': + specifier: ^18.15.3 + version: 18.15.11 + '@types/webpack': + specifier: ^5.28.2 + version: 5.28.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + '@webpack-cli/generators': + specifier: ^3.0.7 + version: 3.0.7(mem-fs-editor@9.7.0)(mem-fs@2.3.0)(prettier@2.8.7)(webpack-cli@5.1.4)(webpack@5.88.2) + babel-loader: + specifier: ^9.1.3 + version: 9.1.3(@babel/core@7.21.4)(webpack@5.88.2) + chalk: + specifier: ^5.3.0 + version: 5.3.0 + commander: + specifier: ^11.0.0 + version: 11.0.0 + cross-fetch: + specifier: ^4.0.0 + version: 4.0.0 + cuid: + specifier: ^2.1.8 + version: 2.1.8 + etag: + specifier: ^1.8.1 + version: 1.8.1 + express: + specifier: ^4.18.2 + version: 4.18.2 + inquirer: + specifier: ^9.2.11 + version: 9.2.11 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) + json5: + specifier: ^2.2.3 + version: 2.2.3 + juava: + specifier: workspace:* + version: link:../../libs/juava + lodash: + specifier: ^4.17.21 + version: 4.17.21 + node-fetch: + specifier: ^3.3.2 + version: 3.3.2 + node-loader: + specifier: ^2.0.0 + version: 2.0.0(webpack@5.88.2) + open: + specifier: ^9.1.0 + version: 9.1.0 + prismjs: + specifier: ^1.29.0 + version: 1.29.0 + rollup: + specifier: ^3.29.1 + version: 3.29.1 + semver: + specifier: ^7.5.4 + version: 7.5.4 + ts-jest: + specifier: ^29.1.1 + version: 29.1.1(@babel/core@7.21.4)(jest@29.7.0)(typescript@5.2.2) + ts-loader: + specifier: ^9.4.4 + version: 9.4.4(typescript@5.2.2)(webpack@5.88.2) + typescript: + specifier: ^5.2.2 + version: 5.2.2 + webpack: + specifier: ^5.88.2 + version: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack-cli: + specifier: ^5.1.4 + version: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.88.2) e2e: devDependencies: @@ -85,7 +205,7 @@ importers: version: 9.4.0 ts-jest: specifier: 29.0.5 - version: 29.0.5(@babel/core@7.21.4)(esbuild@0.16.3)(jest@29.5.0)(typescript@4.9.5) + version: 29.0.5(@babel/core@7.21.4)(jest@29.5.0)(typescript@4.9.5) tslib: specifier: ^2.4.0 version: 2.5.0 @@ -111,8 +231,8 @@ importers: specifier: ^6.4.3 version: 6.10.0(react-dom@18.2.0)(react@18.2.0) react-scripts: - specifier: ^5.1.0-next.14 - version: 5.1.0-next.14(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.21.0)(esbuild@0.16.3)(react@18.2.0)(ts-node@10.8.2)(typescript@4.9.5) + specifier: ^5.0.1 + version: 5.0.1(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.21.0)(eslint@8.29.0)(react@18.2.0)(ts-node@10.8.2)(typescript@4.9.5) web-vitals: specifier: ^2.1.4 version: 2.1.4 @@ -128,7 +248,7 @@ importers: version: 18.0.11 tailwindcss: specifier: ^3.0.24 - version: 3.3.1(postcss@8.4.22)(ts-node@10.8.2) + version: 3.3.1(postcss@8.4.30)(ts-node@10.8.2) typescript: specifier: ^4.9.3 version: 4.9.5 @@ -136,17 +256,20 @@ importers: libs/core-functions: dependencies: '@swc/core': - specifier: ^1.3.40 - version: 1.3.49 + specifier: ^1.3.88 + version: 1.3.88 '@swc/wasm': - specifier: ^1.3.40 - version: 1.3.49 + specifier: ^1.3.89 + version: 1.3.89 agentkeepalive: specifier: 4.3.0 version: 4.3.0 dayjs: specifier: ^1.11.10 version: 1.11.10 + isolated-vm: + specifier: ^4.6.0 + version: 4.6.0 juava: specifier: workspace:* version: link:../juava @@ -154,17 +277,14 @@ importers: specifier: ^4.17.21 version: 4.17.21 mongodb: - specifier: ^5.1.0 - version: 5.2.0 + specifier: ^5.9.0 + version: 5.9.0 posthog-node: specifier: ^2.4.0 version: 2.6.0 tslib: specifier: ^2.4.0 version: 2.5.0 - vm2: - specifier: ^3.9.14 - version: 3.9.16 zod: specifier: 3.21.4 version: 3.21.4 @@ -184,6 +304,9 @@ importers: '@types/node': specifier: ^18.15.3 version: 18.15.11 + express: + specifier: ^4.18.2 + version: 4.18.2 jest: specifier: ^29.5.0 version: 29.5.0(@types/node@18.15.11)(ts-node@10.8.2) @@ -195,7 +318,7 @@ importers: version: 3.2.4 ts-jest: specifier: 29.0.5 - version: 29.0.5(@babel/core@7.21.4)(esbuild@0.16.3)(jest@29.5.0)(typescript@4.9.5) + version: 29.0.5(@babel/core@7.21.4)(jest@29.5.0)(typescript@4.9.5) libs/jitsu-js: dependencies: @@ -262,13 +385,16 @@ importers: version: 1.3.1 raw-loader: specifier: ^4.0.2 - version: 4.0.2(webpack@5.79.0) + version: 4.0.2(webpack@5.88.2) rollup: specifier: ^3.2.5 version: 3.20.2 + tldts: + specifier: ^6.0.15 + version: 6.0.15 ts-jest: specifier: 29.0.5 - version: 29.0.5(@babel/core@7.21.4)(esbuild@0.16.3)(jest@29.5.0)(typescript@4.9.5) + version: 29.0.5(@babel/core@7.21.4)(jest@29.5.0)(typescript@4.9.5) typescript: specifier: ^4.9.5 version: 4.9.5 @@ -292,8 +418,8 @@ importers: specifier: ^7.20.5 version: 7.20.5(@babel/core@7.21.4) '@testing-library/jest-dom': - specifier: ^5.16.5 - version: 5.16.5 + specifier: ^6.1.3 + version: 6.1.3(@types/jest@29.5.0) '@testing-library/react': specifier: ^13.4.0 version: 13.4.0(react-dom@18.2.0)(react@18.2.0) @@ -336,7 +462,7 @@ importers: version: 29.5.0(@types/node@18.15.11)(ts-node@10.8.2) ts-jest: specifier: 29.0.5 - version: 29.0.5(@babel/core@7.21.4)(esbuild@0.16.3)(jest@29.5.0)(typescript@4.9.5) + version: 29.0.5(@babel/core@7.21.4)(jest@29.5.0)(typescript@4.9.5) services/rotor: dependencies: @@ -436,7 +562,7 @@ importers: version: 0.0.69 '@types/webpack': specifier: ^5.28.0 - version: 5.28.1(esbuild@0.16.3)(webpack-cli@5.0.1) + version: 5.28.1(webpack-cli@5.0.1) '@webpack-cli/generators': specifier: ^3.0.0 version: 3.0.1(mem-fs-editor@9.7.0)(mem-fs@2.3.0)(prettier@2.8.7)(webpack-cli@5.0.1)(webpack@5.78.0) @@ -475,7 +601,7 @@ importers: version: 4.9.5 webpack: specifier: ^5.75.0 - version: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) + version: 5.78.0(webpack-cli@5.0.1) webpack-cli: specifier: ^5.0.0 version: 5.0.1(@webpack-cli/generators@3.0.1)(webpack@5.78.0) @@ -539,8 +665,8 @@ importers: specifier: ^0.9.2 version: 0.9.2(kafkajs@2.2.4) '@sentry/nextjs': - specifier: ^7.57.0 - version: 7.57.0(next@13.3.0)(react@18.2.0)(webpack@5.79.0) + specifier: ^7.70.0 + version: 7.70.0(next@13.3.0)(react@18.2.0)(webpack@5.88.2) '@tanstack/react-query': specifier: ^4.2.1 version: 4.29.1(react-dom@18.2.0)(react@18.2.0) @@ -569,14 +695,14 @@ importers: specifier: ^1.11.10 version: 1.11.10 firebase: - specifier: ^9.17.1 - version: 9.19.1 + specifier: ^10.4.0 + version: 10.4.0 firebase-admin: - specifier: ^11.5.0 - version: 11.6.0 + specifier: ^11.10.1 + version: 11.10.1 googleapis: - specifier: ^100.0.0 - version: 100.0.0 + specifier: ^126.0.1 + version: 126.0.1 highlight.js: specifier: ^11.6.0 version: 11.7.0 @@ -590,8 +716,8 @@ importers: specifier: ^2.2.3 version: 2.2.3 jsonwebtoken: - specifier: ^8.5.1 - version: 8.5.1 + specifier: ^9.0.2 + version: 9.0.2 juava: specifier: workspace:* version: link:../../libs/juava @@ -684,8 +810,8 @@ importers: specifier: ^0.5.7 version: 0.5.9(tailwindcss@3.3.1) '@testing-library/jest-dom': - specifier: ^5.16.4 - version: 5.16.5 + specifier: ^6.1.3 + version: 6.1.3(jest@28.1.3) '@testing-library/react': specifier: ^13.1.1 version: 13.4.0(react-dom@18.2.0)(react@18.2.0) @@ -719,12 +845,15 @@ importers: '@types/react-dom': specifier: 18.0.11 version: 18.0.11 + ansi-to-html: + specifier: ^0.7.2 + version: 0.7.2 antd: specifier: ^5.2.1 version: 5.4.2(react-dom@18.2.0)(react@18.2.0) autoprefixer: specifier: ^10.4.5 - version: 10.4.14(postcss@8.4.21) + version: 10.4.14(postcss@8.4.30) dotenv-cli: specifier: ^6.0.0 version: 6.0.0 @@ -745,7 +874,7 @@ importers: version: 4.1.3 less-loader: specifier: ^10.2.0 - version: 10.2.0(less@4.1.3)(webpack@5.79.0) + version: 10.2.0(less@4.1.3)(webpack@5.88.2) minimist: specifier: ^1.2.7 version: 1.2.8 @@ -753,14 +882,14 @@ importers: specifier: ^10.0.0 version: 10.0.0 postcss: - specifier: ^8.4.12 - version: 8.4.21 + specifier: ^8.4.30 + version: 8.4.30 raw-loader: specifier: ^4.0.2 - version: 4.0.2(webpack@5.79.0) + version: 4.0.2(webpack@5.88.2) tailwindcss: specifier: ^3.0.24 - version: 3.3.1(postcss@8.4.21)(ts-node@10.8.2) + version: 3.3.1(postcss@8.4.30)(ts-node@10.8.2) ts-node: specifier: ~10.8.1 version: 10.8.2(@types/node@18.15.11)(typescript@4.9.5) @@ -777,8 +906,8 @@ importers: webapps/ee-api: dependencies: '@aws-sdk/client-s3': - specifier: ~3.341.0 - version: 3.341.0 + specifier: ^3.418.0 + version: 3.418.0 '@clickhouse/client': specifier: ^0.0.11 version: 0.0.11 @@ -801,8 +930,8 @@ importers: specifier: 13.0.0 version: 13.0.0(eslint@8.29.0)(typescript@4.9.4) firebase-admin: - specifier: ^11.5.0 - version: 11.6.0 + specifier: ^11.10.1 + version: 11.10.1 is-valid-domain: specifier: ^0.1.6 version: 0.1.6 @@ -810,8 +939,8 @@ importers: specifier: ^2.2.3 version: 2.2.3 jsonwebtoken: - specifier: ^8.5.1 - version: 8.5.1 + specifier: ^9.0.2 + version: 9.0.2 juava: specifier: workspace:* version: link:../../libs/juava @@ -820,7 +949,7 @@ importers: version: 4.17.21 next: specifier: 13.0.0 - version: 13.0.0(@babel/core@7.21.4)(react-dom@18.2.0)(react@18.2.0) + version: 13.0.0(react-dom@18.2.0)(react@18.2.0) node-fetch-commonjs: specifier: ^3.2.4 version: 3.2.4 @@ -844,8 +973,8 @@ importers: specifier: ^4.1.1 version: 4.1.1 '@types/jsonwebtoken': - specifier: ^8.5.9 - version: 8.5.9 + specifier: ^9.0.3 + version: 9.0.3 '@types/lodash': specifier: ^4.14.185 version: 4.14.192 @@ -864,8 +993,8 @@ importers: packages: - /@adobe/css-tools@4.2.0: - resolution: {integrity: sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==} + /@adobe/css-tools@4.3.1: + resolution: {integrity: sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==} dev: true /@ampproject/remapping@2.2.1: @@ -990,7 +1119,7 @@ packages: resolution: {integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==} dependencies: '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.341.0 + '@aws-sdk/types': 3.418.0 tslib: 1.14.1 dev: false @@ -998,7 +1127,7 @@ packages: resolution: {integrity: sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==} dependencies: '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.341.0 + '@aws-sdk/types': 3.418.0 tslib: 1.14.1 dev: false @@ -1014,7 +1143,7 @@ packages: '@aws-crypto/ie11-detection': 3.0.0 '@aws-crypto/supports-web-crypto': 3.0.0 '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.341.0 + '@aws-sdk/types': 3.418.0 '@aws-sdk/util-locate-window': 3.310.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 @@ -1027,7 +1156,7 @@ packages: '@aws-crypto/sha256-js': 3.0.0 '@aws-crypto/supports-web-crypto': 3.0.0 '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.341.0 + '@aws-sdk/types': 3.418.0 '@aws-sdk/util-locate-window': 3.310.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 @@ -1037,7 +1166,7 @@ packages: resolution: {integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==} dependencies: '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.341.0 + '@aws-sdk/types': 3.418.0 tslib: 1.14.1 dev: false @@ -1050,1162 +1179,952 @@ packages: /@aws-crypto/util@3.0.0: resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==} dependencies: - '@aws-sdk/types': 3.341.0 + '@aws-sdk/types': 3.418.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 dev: false - /@aws-sdk/abort-controller@3.341.0: - resolution: {integrity: sha512-D27hLlUPJTM4rNtMBPduD1vdPSmbUs0Eat8DZWCv3bg+v60loairha87oYL5x6Kj4IhbK93shI1OfzbxDqG1Yw==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 - dev: false - - /@aws-sdk/chunked-blob-reader@3.310.0: - resolution: {integrity: sha512-CrJS3exo4mWaLnWxfCH+w88Ou0IcAZSIkk4QbmxiHl/5Dq705OLoxf4385MVyExpqpeVJYOYQ2WaD8i/pQZ2fg==} - dependencies: - tslib: 2.5.0 - dev: false - - /@aws-sdk/client-s3@3.341.0: - resolution: {integrity: sha512-ftIH5JuL7JhEKQVsaHUx+kBcTA1t6FNDeb12yOoG5KS9ituoyl7tY2emdXM2rBuQZa2bKOSjls2GS03vdlF/BQ==} + /@aws-sdk/client-s3@3.418.0: + resolution: {integrity: sha512-VdDM9xS84t8W1B2/QJTK6mYVCnf7Hovg8Aum9NHm+bD7F0Ni2NTLVjm8+qq9STi4YSeXAy3Pe+FBUP9Wthw7Iw==} engines: {node: '>=14.0.0'} dependencies: '@aws-crypto/sha1-browser': 3.0.0 '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.341.0 - '@aws-sdk/config-resolver': 3.341.0 - '@aws-sdk/credential-provider-node': 3.341.0 - '@aws-sdk/eventstream-serde-browser': 3.341.0 - '@aws-sdk/eventstream-serde-config-resolver': 3.341.0 - '@aws-sdk/eventstream-serde-node': 3.341.0 - '@aws-sdk/fetch-http-handler': 3.341.0 - '@aws-sdk/hash-blob-browser': 3.341.0 - '@aws-sdk/hash-node': 3.341.0 - '@aws-sdk/hash-stream-node': 3.341.0 - '@aws-sdk/invalid-dependency': 3.341.0 - '@aws-sdk/md5-js': 3.341.0 - '@aws-sdk/middleware-bucket-endpoint': 3.341.0 - '@aws-sdk/middleware-content-length': 3.341.0 - '@aws-sdk/middleware-endpoint': 3.341.0 - '@aws-sdk/middleware-expect-continue': 3.341.0 - '@aws-sdk/middleware-flexible-checksums': 3.341.0 - '@aws-sdk/middleware-host-header': 3.341.0 - '@aws-sdk/middleware-location-constraint': 3.341.0 - '@aws-sdk/middleware-logger': 3.341.0 - '@aws-sdk/middleware-recursion-detection': 3.341.0 - '@aws-sdk/middleware-retry': 3.341.0 - '@aws-sdk/middleware-sdk-s3': 3.341.0 - '@aws-sdk/middleware-serde': 3.341.0 - '@aws-sdk/middleware-signing': 3.341.0 - '@aws-sdk/middleware-ssec': 3.341.0 - '@aws-sdk/middleware-stack': 3.341.0 - '@aws-sdk/middleware-user-agent': 3.341.0 - '@aws-sdk/node-config-provider': 3.341.0 - '@aws-sdk/node-http-handler': 3.341.0 - '@aws-sdk/signature-v4-multi-region': 3.341.0 - '@aws-sdk/smithy-client': 3.341.0 - '@aws-sdk/types': 3.341.0 - '@aws-sdk/url-parser': 3.341.0 - '@aws-sdk/util-base64': 3.310.0 - '@aws-sdk/util-body-length-browser': 3.310.0 - '@aws-sdk/util-body-length-node': 3.310.0 - '@aws-sdk/util-defaults-mode-browser': 3.341.0 - '@aws-sdk/util-defaults-mode-node': 3.341.0 - '@aws-sdk/util-endpoints': 3.341.0 - '@aws-sdk/util-retry': 3.341.0 - '@aws-sdk/util-stream-browser': 3.341.0 - '@aws-sdk/util-stream-node': 3.341.0 - '@aws-sdk/util-user-agent-browser': 3.341.0 - '@aws-sdk/util-user-agent-node': 3.341.0 - '@aws-sdk/util-utf8': 3.310.0 - '@aws-sdk/util-waiter': 3.341.0 + '@aws-sdk/client-sts': 3.418.0 + '@aws-sdk/credential-provider-node': 3.418.0 + '@aws-sdk/middleware-bucket-endpoint': 3.418.0 + '@aws-sdk/middleware-expect-continue': 3.418.0 + '@aws-sdk/middleware-flexible-checksums': 3.418.0 + '@aws-sdk/middleware-host-header': 3.418.0 + '@aws-sdk/middleware-location-constraint': 3.418.0 + '@aws-sdk/middleware-logger': 3.418.0 + '@aws-sdk/middleware-recursion-detection': 3.418.0 + '@aws-sdk/middleware-sdk-s3': 3.418.0 + '@aws-sdk/middleware-signing': 3.418.0 + '@aws-sdk/middleware-ssec': 3.418.0 + '@aws-sdk/middleware-user-agent': 3.418.0 + '@aws-sdk/region-config-resolver': 3.418.0 + '@aws-sdk/signature-v4-multi-region': 3.418.0 + '@aws-sdk/types': 3.418.0 + '@aws-sdk/util-endpoints': 3.418.0 + '@aws-sdk/util-user-agent-browser': 3.418.0 + '@aws-sdk/util-user-agent-node': 3.418.0 '@aws-sdk/xml-builder': 3.310.0 - '@smithy/protocol-http': 1.0.1 - '@smithy/types': 1.0.0 - fast-xml-parser: 4.1.2 - tslib: 2.5.0 - transitivePeerDependencies: - - '@aws-sdk/signature-v4-crt' - - aws-crt - dev: false - - /@aws-sdk/client-sso-oidc@3.341.0: - resolution: {integrity: sha512-BjG4E7E1StsHCM0Mex7EZA6oPMQ+PLZY5axr554ErYxlzYlzE8b/Aq3N/mCCqeUSIdz4zAGr8di7XYCUB3CRdg==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/config-resolver': 3.341.0 - '@aws-sdk/fetch-http-handler': 3.341.0 - '@aws-sdk/hash-node': 3.341.0 - '@aws-sdk/invalid-dependency': 3.341.0 - '@aws-sdk/middleware-content-length': 3.341.0 - '@aws-sdk/middleware-endpoint': 3.341.0 - '@aws-sdk/middleware-host-header': 3.341.0 - '@aws-sdk/middleware-logger': 3.341.0 - '@aws-sdk/middleware-recursion-detection': 3.341.0 - '@aws-sdk/middleware-retry': 3.341.0 - '@aws-sdk/middleware-serde': 3.341.0 - '@aws-sdk/middleware-stack': 3.341.0 - '@aws-sdk/middleware-user-agent': 3.341.0 - '@aws-sdk/node-config-provider': 3.341.0 - '@aws-sdk/node-http-handler': 3.341.0 - '@aws-sdk/smithy-client': 3.341.0 - '@aws-sdk/types': 3.341.0 - '@aws-sdk/url-parser': 3.341.0 - '@aws-sdk/util-base64': 3.310.0 - '@aws-sdk/util-body-length-browser': 3.310.0 - '@aws-sdk/util-body-length-node': 3.310.0 - '@aws-sdk/util-defaults-mode-browser': 3.341.0 - '@aws-sdk/util-defaults-mode-node': 3.341.0 - '@aws-sdk/util-endpoints': 3.341.0 - '@aws-sdk/util-retry': 3.341.0 - '@aws-sdk/util-user-agent-browser': 3.341.0 - '@aws-sdk/util-user-agent-node': 3.341.0 - '@aws-sdk/util-utf8': 3.310.0 - '@smithy/protocol-http': 1.0.1 - '@smithy/types': 1.0.0 - tslib: 2.5.0 + '@smithy/config-resolver': 2.0.10 + '@smithy/eventstream-serde-browser': 2.0.9 + '@smithy/eventstream-serde-config-resolver': 2.0.9 + '@smithy/eventstream-serde-node': 2.0.9 + '@smithy/fetch-http-handler': 2.1.5 + '@smithy/hash-blob-browser': 2.0.9 + '@smithy/hash-node': 2.0.9 + '@smithy/hash-stream-node': 2.0.9 + '@smithy/invalid-dependency': 2.0.9 + '@smithy/md5-js': 2.0.9 + '@smithy/middleware-content-length': 2.0.11 + '@smithy/middleware-endpoint': 2.0.9 + '@smithy/middleware-retry': 2.0.12 + '@smithy/middleware-serde': 2.0.9 + '@smithy/middleware-stack': 2.0.3 + '@smithy/node-config-provider': 2.0.12 + '@smithy/node-http-handler': 2.1.5 + '@smithy/protocol-http': 3.0.5 + '@smithy/smithy-client': 2.1.7 + '@smithy/types': 2.3.3 + '@smithy/url-parser': 2.0.9 + '@smithy/util-base64': 2.0.0 + '@smithy/util-body-length-browser': 2.0.0 + '@smithy/util-body-length-node': 2.1.0 + '@smithy/util-defaults-mode-browser': 2.0.11 + '@smithy/util-defaults-mode-node': 2.0.13 + '@smithy/util-retry': 2.0.2 + '@smithy/util-stream': 2.0.12 + '@smithy/util-utf8': 2.0.0 + '@smithy/util-waiter': 2.0.9 + fast-xml-parser: 4.2.5 + tslib: 2.6.2 transitivePeerDependencies: - aws-crt dev: false - /@aws-sdk/client-sso@3.341.0: - resolution: {integrity: sha512-RWFKz3DBgEy92mce3TTgcq/UOKr/LKNyC189M8UXhWRyyoaQpE9gIyHUQwuh7a2bbnI7XKgpa2rO54Ns0rFJzw==} + /@aws-sdk/client-sso@3.418.0: + resolution: {integrity: sha512-fakz3YeSW/kCAOJ5w4ObrrQBxsYO8sU8i6WHLv6iWAsYZKAws2Mqa8g89P61+GitSH4z9waksdLouS6ep78/5A==} engines: {node: '>=14.0.0'} dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/config-resolver': 3.341.0 - '@aws-sdk/fetch-http-handler': 3.341.0 - '@aws-sdk/hash-node': 3.341.0 - '@aws-sdk/invalid-dependency': 3.341.0 - '@aws-sdk/middleware-content-length': 3.341.0 - '@aws-sdk/middleware-endpoint': 3.341.0 - '@aws-sdk/middleware-host-header': 3.341.0 - '@aws-sdk/middleware-logger': 3.341.0 - '@aws-sdk/middleware-recursion-detection': 3.341.0 - '@aws-sdk/middleware-retry': 3.341.0 - '@aws-sdk/middleware-serde': 3.341.0 - '@aws-sdk/middleware-stack': 3.341.0 - '@aws-sdk/middleware-user-agent': 3.341.0 - '@aws-sdk/node-config-provider': 3.341.0 - '@aws-sdk/node-http-handler': 3.341.0 - '@aws-sdk/smithy-client': 3.341.0 - '@aws-sdk/types': 3.341.0 - '@aws-sdk/url-parser': 3.341.0 - '@aws-sdk/util-base64': 3.310.0 - '@aws-sdk/util-body-length-browser': 3.310.0 - '@aws-sdk/util-body-length-node': 3.310.0 - '@aws-sdk/util-defaults-mode-browser': 3.341.0 - '@aws-sdk/util-defaults-mode-node': 3.341.0 - '@aws-sdk/util-endpoints': 3.341.0 - '@aws-sdk/util-retry': 3.341.0 - '@aws-sdk/util-user-agent-browser': 3.341.0 - '@aws-sdk/util-user-agent-node': 3.341.0 - '@aws-sdk/util-utf8': 3.310.0 - '@smithy/protocol-http': 1.0.1 - '@smithy/types': 1.0.0 - tslib: 2.5.0 + '@aws-sdk/middleware-host-header': 3.418.0 + '@aws-sdk/middleware-logger': 3.418.0 + '@aws-sdk/middleware-recursion-detection': 3.418.0 + '@aws-sdk/middleware-user-agent': 3.418.0 + '@aws-sdk/region-config-resolver': 3.418.0 + '@aws-sdk/types': 3.418.0 + '@aws-sdk/util-endpoints': 3.418.0 + '@aws-sdk/util-user-agent-browser': 3.418.0 + '@aws-sdk/util-user-agent-node': 3.418.0 + '@smithy/config-resolver': 2.0.10 + '@smithy/fetch-http-handler': 2.1.5 + '@smithy/hash-node': 2.0.9 + '@smithy/invalid-dependency': 2.0.9 + '@smithy/middleware-content-length': 2.0.11 + '@smithy/middleware-endpoint': 2.0.9 + '@smithy/middleware-retry': 2.0.12 + '@smithy/middleware-serde': 2.0.9 + '@smithy/middleware-stack': 2.0.3 + '@smithy/node-config-provider': 2.0.12 + '@smithy/node-http-handler': 2.1.5 + '@smithy/protocol-http': 3.0.5 + '@smithy/smithy-client': 2.1.7 + '@smithy/types': 2.3.3 + '@smithy/url-parser': 2.0.9 + '@smithy/util-base64': 2.0.0 + '@smithy/util-body-length-browser': 2.0.0 + '@smithy/util-body-length-node': 2.1.0 + '@smithy/util-defaults-mode-browser': 2.0.11 + '@smithy/util-defaults-mode-node': 2.0.13 + '@smithy/util-retry': 2.0.2 + '@smithy/util-utf8': 2.0.0 + tslib: 2.6.2 transitivePeerDependencies: - aws-crt dev: false - /@aws-sdk/client-sts@3.341.0: - resolution: {integrity: sha512-Ec8lzyPkd7N6VE4O73RuY04hgxMSXCD+uyWmYCoCCuamAx+xEP4ifVL0spApr8tttm51QLBgc01pVKNL62Oprw==} + /@aws-sdk/client-sts@3.418.0: + resolution: {integrity: sha512-L0n0Hw+Pm+BhXTN1bYZ0y4JAMArYgazdHf1nUSlEHndgZicCCuQtlMLxfo3i/IbtWi0dzfZcZ9d/MdAM8p4Jyw==} engines: {node: '>=14.0.0'} dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/config-resolver': 3.341.0 - '@aws-sdk/credential-provider-node': 3.341.0 - '@aws-sdk/fetch-http-handler': 3.341.0 - '@aws-sdk/hash-node': 3.341.0 - '@aws-sdk/invalid-dependency': 3.341.0 - '@aws-sdk/middleware-content-length': 3.341.0 - '@aws-sdk/middleware-endpoint': 3.341.0 - '@aws-sdk/middleware-host-header': 3.341.0 - '@aws-sdk/middleware-logger': 3.341.0 - '@aws-sdk/middleware-recursion-detection': 3.341.0 - '@aws-sdk/middleware-retry': 3.341.0 - '@aws-sdk/middleware-sdk-sts': 3.341.0 - '@aws-sdk/middleware-serde': 3.341.0 - '@aws-sdk/middleware-signing': 3.341.0 - '@aws-sdk/middleware-stack': 3.341.0 - '@aws-sdk/middleware-user-agent': 3.341.0 - '@aws-sdk/node-config-provider': 3.341.0 - '@aws-sdk/node-http-handler': 3.341.0 - '@aws-sdk/smithy-client': 3.341.0 - '@aws-sdk/types': 3.341.0 - '@aws-sdk/url-parser': 3.341.0 - '@aws-sdk/util-base64': 3.310.0 - '@aws-sdk/util-body-length-browser': 3.310.0 - '@aws-sdk/util-body-length-node': 3.310.0 - '@aws-sdk/util-defaults-mode-browser': 3.341.0 - '@aws-sdk/util-defaults-mode-node': 3.341.0 - '@aws-sdk/util-endpoints': 3.341.0 - '@aws-sdk/util-retry': 3.341.0 - '@aws-sdk/util-user-agent-browser': 3.341.0 - '@aws-sdk/util-user-agent-node': 3.341.0 - '@aws-sdk/util-utf8': 3.310.0 - '@smithy/protocol-http': 1.0.1 - '@smithy/types': 1.0.0 - fast-xml-parser: 4.1.2 - tslib: 2.5.0 + '@aws-sdk/credential-provider-node': 3.418.0 + '@aws-sdk/middleware-host-header': 3.418.0 + '@aws-sdk/middleware-logger': 3.418.0 + '@aws-sdk/middleware-recursion-detection': 3.418.0 + '@aws-sdk/middleware-sdk-sts': 3.418.0 + '@aws-sdk/middleware-signing': 3.418.0 + '@aws-sdk/middleware-user-agent': 3.418.0 + '@aws-sdk/region-config-resolver': 3.418.0 + '@aws-sdk/types': 3.418.0 + '@aws-sdk/util-endpoints': 3.418.0 + '@aws-sdk/util-user-agent-browser': 3.418.0 + '@aws-sdk/util-user-agent-node': 3.418.0 + '@smithy/config-resolver': 2.0.10 + '@smithy/fetch-http-handler': 2.1.5 + '@smithy/hash-node': 2.0.9 + '@smithy/invalid-dependency': 2.0.9 + '@smithy/middleware-content-length': 2.0.11 + '@smithy/middleware-endpoint': 2.0.9 + '@smithy/middleware-retry': 2.0.12 + '@smithy/middleware-serde': 2.0.9 + '@smithy/middleware-stack': 2.0.3 + '@smithy/node-config-provider': 2.0.12 + '@smithy/node-http-handler': 2.1.5 + '@smithy/protocol-http': 3.0.5 + '@smithy/smithy-client': 2.1.7 + '@smithy/types': 2.3.3 + '@smithy/url-parser': 2.0.9 + '@smithy/util-base64': 2.0.0 + '@smithy/util-body-length-browser': 2.0.0 + '@smithy/util-body-length-node': 2.1.0 + '@smithy/util-defaults-mode-browser': 2.0.11 + '@smithy/util-defaults-mode-node': 2.0.13 + '@smithy/util-retry': 2.0.2 + '@smithy/util-utf8': 2.0.0 + fast-xml-parser: 4.2.5 + tslib: 2.6.2 transitivePeerDependencies: - aws-crt dev: false - /@aws-sdk/config-resolver@3.341.0: - resolution: {integrity: sha512-BpU6JTvT2SJLrsKxe4hjDDVbFnLc5iRcD+dwF/uV4rltFlXPOhqrx1S4NtRLpRaT3oYwA3DnBGC5CkV6QHWW5Q==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.341.0 - '@aws-sdk/util-config-provider': 3.310.0 - '@aws-sdk/util-middleware': 3.341.0 - tslib: 2.5.0 - dev: false - - /@aws-sdk/credential-provider-env@3.341.0: - resolution: {integrity: sha512-oqFMmGvtKjqcY6Io4CweHz0blgyyZtlfxWJbttPK7dSLk9EtRUuvVilcRtzXWXuAB2hk9zUN9wavd8nyaTcidA==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/property-provider': 3.341.0 - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 - dev: false - - /@aws-sdk/credential-provider-imds@3.341.0: - resolution: {integrity: sha512-dkvc7WcKxFR0KgAScbRQ16wg0qH8tKxaVS3hfgHDYJR4UIKqV/sM6r5H2OvAdegY9/T180O2srtq2N4pyywPSQ==} + /@aws-sdk/credential-provider-env@3.418.0: + resolution: {integrity: sha512-e74sS+x63EZUBO+HaI8zor886YdtmULzwKdctsZp5/37Xho1CVUNtEC+fYa69nigBD9afoiH33I4JggaHgrekQ==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/node-config-provider': 3.341.0 - '@aws-sdk/property-provider': 3.341.0 - '@aws-sdk/types': 3.341.0 - '@aws-sdk/url-parser': 3.341.0 - tslib: 2.5.0 + '@aws-sdk/types': 3.418.0 + '@smithy/property-provider': 2.0.10 + '@smithy/types': 2.3.3 + tslib: 2.6.2 dev: false - /@aws-sdk/credential-provider-ini@3.341.0: - resolution: {integrity: sha512-o+44n3VFErRNOHZi4Psbu0JQWB7RT15QJzRtYquAPohgKNDT9jQ/VN0JesEVyktpIklsPJBNAbDb68fExsjKUg==} + /@aws-sdk/credential-provider-ini@3.418.0: + resolution: {integrity: sha512-LTAeKKV85unlSqGNIeqEZ4N9gufaSoH+670n5YTUEk564zHCkUQW0PJomzLF5jKBco6Yfzv6rPBTukd+x9XWqw==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/credential-provider-env': 3.341.0 - '@aws-sdk/credential-provider-imds': 3.341.0 - '@aws-sdk/credential-provider-process': 3.341.0 - '@aws-sdk/credential-provider-sso': 3.341.0 - '@aws-sdk/credential-provider-web-identity': 3.341.0 - '@aws-sdk/property-provider': 3.341.0 - '@aws-sdk/shared-ini-file-loader': 3.341.0 - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 + '@aws-sdk/credential-provider-env': 3.418.0 + '@aws-sdk/credential-provider-process': 3.418.0 + '@aws-sdk/credential-provider-sso': 3.418.0 + '@aws-sdk/credential-provider-web-identity': 3.418.0 + '@aws-sdk/types': 3.418.0 + '@smithy/credential-provider-imds': 2.0.12 + '@smithy/property-provider': 2.0.10 + '@smithy/shared-ini-file-loader': 2.0.11 + '@smithy/types': 2.3.3 + tslib: 2.6.2 transitivePeerDependencies: - aws-crt dev: false - /@aws-sdk/credential-provider-node@3.341.0: - resolution: {integrity: sha512-O4gxP5PLu86361sGgnyxcwP5L2Ek7N65KM3MYJNgDpXRig+FP/pxBmdOtYkTYJYymPspGxnsNM6p2tbARJ1WMw==} + /@aws-sdk/credential-provider-node@3.418.0: + resolution: {integrity: sha512-VveTjtSC6m8YXj3fQDkMKEZuHv+CR2Z4u/NAN51Fi4xOtIWUtOBj5rfZ8HmBYoBjRF0DtRlPXuMiNnXAzTctfQ==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/credential-provider-env': 3.341.0 - '@aws-sdk/credential-provider-imds': 3.341.0 - '@aws-sdk/credential-provider-ini': 3.341.0 - '@aws-sdk/credential-provider-process': 3.341.0 - '@aws-sdk/credential-provider-sso': 3.341.0 - '@aws-sdk/credential-provider-web-identity': 3.341.0 - '@aws-sdk/property-provider': 3.341.0 - '@aws-sdk/shared-ini-file-loader': 3.341.0 - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 + '@aws-sdk/credential-provider-env': 3.418.0 + '@aws-sdk/credential-provider-ini': 3.418.0 + '@aws-sdk/credential-provider-process': 3.418.0 + '@aws-sdk/credential-provider-sso': 3.418.0 + '@aws-sdk/credential-provider-web-identity': 3.418.0 + '@aws-sdk/types': 3.418.0 + '@smithy/credential-provider-imds': 2.0.12 + '@smithy/property-provider': 2.0.10 + '@smithy/shared-ini-file-loader': 2.0.11 + '@smithy/types': 2.3.3 + tslib: 2.6.2 transitivePeerDependencies: - aws-crt dev: false - /@aws-sdk/credential-provider-process@3.341.0: - resolution: {integrity: sha512-t+12surwkdZO7dAdtA7xz+O6Hk0H3yOVqXH+Y8UINXbFc9/uUgstPZq5qhpQIeDPRes/lqYUiZ4tho5mhpGItw==} + /@aws-sdk/credential-provider-process@3.418.0: + resolution: {integrity: sha512-xPbdm2WKz1oH6pTkrJoUmr3OLuqvvcPYTQX0IIlc31tmDwDWPQjXGGFD/vwZGIZIkKaFpFxVMgAzfFScxox7dw==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/property-provider': 3.341.0 - '@aws-sdk/shared-ini-file-loader': 3.341.0 - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 + '@aws-sdk/types': 3.418.0 + '@smithy/property-provider': 2.0.10 + '@smithy/shared-ini-file-loader': 2.0.11 + '@smithy/types': 2.3.3 + tslib: 2.6.2 dev: false - /@aws-sdk/credential-provider-sso@3.341.0: - resolution: {integrity: sha512-ooOntFPVwawHO8WwwTSDFysno+nZFt1+GPlAr9N9QxIWQSRZYLaNFeplnxT/58jJoMcyHH5JjY4Zu4g46htmkw==} + /@aws-sdk/credential-provider-sso@3.418.0: + resolution: {integrity: sha512-tUF5Hg/HfaU5t+E7IuvohYlodSIlBXa28xAJPPFxhKrUnvP6AIoW6JLazOtCIQjQgJYEUILV29XX+ojUuITcaw==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/client-sso': 3.341.0 - '@aws-sdk/property-provider': 3.341.0 - '@aws-sdk/shared-ini-file-loader': 3.341.0 - '@aws-sdk/token-providers': 3.341.0 - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 + '@aws-sdk/client-sso': 3.418.0 + '@aws-sdk/token-providers': 3.418.0 + '@aws-sdk/types': 3.418.0 + '@smithy/property-provider': 2.0.10 + '@smithy/shared-ini-file-loader': 2.0.11 + '@smithy/types': 2.3.3 + tslib: 2.6.2 transitivePeerDependencies: - aws-crt dev: false - /@aws-sdk/credential-provider-web-identity@3.341.0: - resolution: {integrity: sha512-NxoyxnxiycO1IG3FG7/soE3CYLLwuc4pv5PWoMHwy6VjH5yiUIeC8CQHHCF5ndCvB/p5XW1TT5z3YmWKknGqaw==} + /@aws-sdk/credential-provider-web-identity@3.418.0: + resolution: {integrity: sha512-do7ang565n9p3dS1JdsQY01rUfRx8vkxQqz5M8OlcEHBNiCdi2PvSjNwcBdrv/FKkyIxZb0TImOfBSt40hVdxQ==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/property-provider': 3.341.0 - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 - dev: false - - /@aws-sdk/eventstream-codec@3.341.0: - resolution: {integrity: sha512-pzrtuDTqiZG9L7ArOzhVHmXwtcVUsf5nckjerTSSjYeGTb4SPMVAas95NkawBJ9bTUGQZKH0aQGqplVLL6i98Q==} - dependencies: - '@aws-crypto/crc32': 3.0.0 - '@aws-sdk/types': 3.341.0 - '@aws-sdk/util-hex-encoding': 3.310.0 - tslib: 2.5.0 + '@aws-sdk/types': 3.418.0 + '@smithy/property-provider': 2.0.10 + '@smithy/types': 2.3.3 + tslib: 2.6.2 dev: false - /@aws-sdk/eventstream-serde-browser@3.341.0: - resolution: {integrity: sha512-9Z0fyF+9hlHfxL+yo2zwuKxWO07Qd+8fwwy1zTa0Gwd5mI5jm0idBMHdayIlX7MgijDX5Be+hzjAR2nmAlYKLg==} + /@aws-sdk/middleware-bucket-endpoint@3.418.0: + resolution: {integrity: sha512-gj/mj1UfbKkGbQ1N4YUvjTTp8BVs5fO1QAL2AjFJ+jfJOToLReX72aNEkm7sPGbHML0TqOY4cQbJuWYy+zdD5g==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/eventstream-serde-universal': 3.341.0 - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 + '@aws-sdk/types': 3.418.0 + '@aws-sdk/util-arn-parser': 3.310.0 + '@smithy/node-config-provider': 2.0.12 + '@smithy/protocol-http': 3.0.5 + '@smithy/types': 2.3.3 + '@smithy/util-config-provider': 2.0.0 + tslib: 2.6.2 dev: false - /@aws-sdk/eventstream-serde-config-resolver@3.341.0: - resolution: {integrity: sha512-+MzhKD3pqTGrN2jTbmvoQ1b3yX94TjTyTUFZHaaTUEoSPPnFmaAIBH29EvfsyukwqcDJZ4+/6a8VKZz6IfRIJQ==} + /@aws-sdk/middleware-expect-continue@3.418.0: + resolution: {integrity: sha512-6x4rcIj685EmqDLQkbWoCur3Dg5DRClHMen6nHXmD3CR5Xyt3z1Gk/+jmZICxyJo9c6M4AeZht8o95BopkmYAQ==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 + '@aws-sdk/types': 3.418.0 + '@smithy/protocol-http': 3.0.5 + '@smithy/types': 2.3.3 + tslib: 2.6.2 dev: false - /@aws-sdk/eventstream-serde-node@3.341.0: - resolution: {integrity: sha512-4Px+8phhjgcPjSaOdxqxbsrwuLsqoVhDOray+DZXxjvOTnRjnfzoAXXhhzcxTbRttyDJZ9KLSfuDl1YI8yXPoA==} + /@aws-sdk/middleware-flexible-checksums@3.418.0: + resolution: {integrity: sha512-3O203dqS2JU5P1TAAbo7p1qplXQh59pevw9nqzPVb3EG8B+mSucVf2kKmF7kGHqKSk+nK/mB/4XGSsZBzGt6Wg==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/eventstream-serde-universal': 3.341.0 - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 + '@aws-crypto/crc32': 3.0.0 + '@aws-crypto/crc32c': 3.0.0 + '@aws-sdk/types': 3.418.0 + '@smithy/is-array-buffer': 2.0.0 + '@smithy/protocol-http': 3.0.5 + '@smithy/types': 2.3.3 + '@smithy/util-utf8': 2.0.0 + tslib: 2.6.2 dev: false - /@aws-sdk/eventstream-serde-universal@3.341.0: - resolution: {integrity: sha512-LUn2k/3KJtfBnvcXNGFPOJxJu6FOm3aksdl+NQ6Qr3T3DbsbOdjakZrXv93POcxAyXqtLs9ItJcC75dm1pOQ8Q==} + /@aws-sdk/middleware-host-header@3.418.0: + resolution: {integrity: sha512-LrMTdzalkPw/1ujLCKPLwCGvPMCmT4P+vOZQRbSEVZPnlZk+Aj++aL/RaHou0jL4kJH3zl8iQepriBt4a7UvXQ==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/eventstream-codec': 3.341.0 - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 - dev: false - - /@aws-sdk/fetch-http-handler@3.341.0: - resolution: {integrity: sha512-GclHYOFKmhft9Bp+wX4CgVv4q48P/md/xiKN7kJpGUvazCRhBN7DqfcvMoMCPhobh+llYSefyiqJBxEccEq/TA==} - dependencies: - '@aws-sdk/protocol-http': 3.341.0 - '@aws-sdk/querystring-builder': 3.341.0 - '@aws-sdk/types': 3.341.0 - '@aws-sdk/util-base64': 3.310.0 - tslib: 2.5.0 - dev: false - - /@aws-sdk/hash-blob-browser@3.341.0: - resolution: {integrity: sha512-qlSGkcbSpJs/vQYuD4dEnbHAFi8/+ealpAL46Lg3hkjFKiL6khoMwnEljF5QdmHtI/LNN9Hhtz6oJu2ipFAXRg==} - dependencies: - '@aws-sdk/chunked-blob-reader': 3.310.0 - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 + '@aws-sdk/types': 3.418.0 + '@smithy/protocol-http': 3.0.5 + '@smithy/types': 2.3.3 + tslib: 2.6.2 dev: false - /@aws-sdk/hash-node@3.341.0: - resolution: {integrity: sha512-legGgjmhQnA8veIuVjJEVNE18YIhWj6JaLNm47xgiBbEoZ1BApoBY1GsX1AunV6FrA18fRpCeTynW3u4MVIIow==} + /@aws-sdk/middleware-location-constraint@3.418.0: + resolution: {integrity: sha512-cc8M3VEaESHJhDsDV8tTpt2QYUprDWhvAVVSlcL43cTdZ54Quc0W+toDiaVOUlwrAZz2Y7g5NDj22ibJGFbOvw==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.341.0 - '@aws-sdk/util-buffer-from': 3.310.0 - '@aws-sdk/util-utf8': 3.310.0 - tslib: 2.5.0 + '@aws-sdk/types': 3.418.0 + '@smithy/types': 2.3.3 + tslib: 2.6.2 dev: false - /@aws-sdk/hash-stream-node@3.341.0: - resolution: {integrity: sha512-6IXzBgEt5+IK5OCD2F6dR8uA1MHzaDkU1n/vyhNl3w9jadtt0gcyinnTFJHbVmyKM+HcZFgr/nRaoUIwNJlFKA==} + /@aws-sdk/middleware-logger@3.418.0: + resolution: {integrity: sha512-StKGmyPVfoO/wdNTtKemYwoJsqIl4l7oqarQY7VSf2Mp3mqaa+njLViHsQbirYpyqpgUEusOnuTlH5utxJ1NsQ==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.341.0 - '@aws-sdk/util-utf8': 3.310.0 - tslib: 2.5.0 - dev: false - - /@aws-sdk/invalid-dependency@3.341.0: - resolution: {integrity: sha512-1GNk+J/Q76bzuj27OqPOqTmFGEYXtyB02afn0cIeadDf0qbjo3G7qkRd3jrJrBIdHNg+DYbBYEHfFB5EuK1s8g==} - dependencies: - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 + '@aws-sdk/types': 3.418.0 + '@smithy/types': 2.3.3 + tslib: 2.6.2 dev: false - /@aws-sdk/is-array-buffer@3.310.0: - resolution: {integrity: sha512-urnbcCR+h9NWUnmOtet/s4ghvzsidFmspfhYaHAmSRdy9yDjdjBJMFjjsn85A1ODUktztm+cVncXjQ38WCMjMQ==} + /@aws-sdk/middleware-recursion-detection@3.418.0: + resolution: {integrity: sha512-kKFrIQglBLUFPbHSDy1+bbe3Na2Kd70JSUC3QLMbUHmqipXN8KeXRfAj7vTv97zXl0WzG0buV++WcNwOm1rFjg==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.5.0 - dev: false - - /@aws-sdk/md5-js@3.341.0: - resolution: {integrity: sha512-0e24Kf8Wu0my2sSQvNUoKqFVvUEflBkZv4ZNiJTm2ccKy6cRbMaTcHrPWj9mc8RdTzgGKB8lSoafNRGpVN/oJw==} - dependencies: - '@aws-sdk/types': 3.341.0 - '@aws-sdk/util-utf8': 3.310.0 - tslib: 2.5.0 + '@aws-sdk/types': 3.418.0 + '@smithy/protocol-http': 3.0.5 + '@smithy/types': 2.3.3 + tslib: 2.6.2 dev: false - /@aws-sdk/middleware-bucket-endpoint@3.341.0: - resolution: {integrity: sha512-SiufX5/msEn9fBhGMM0gXBYZPSvnRGKOOkxcygTan6OGLpKctZL5+MVTzZ2BkcMsqNQ2YtAmYVDW/UrmrS0Yow==} + /@aws-sdk/middleware-sdk-s3@3.418.0: + resolution: {integrity: sha512-rei32LF45SyqL3NlWDjEOfMwAca9A5F4QgUyXJqvASc43oWC1tJnLIhiCxNh8qkWAiRyRzFpcanTeqyaRSsZpA==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/protocol-http': 3.341.0 - '@aws-sdk/types': 3.341.0 + '@aws-sdk/types': 3.418.0 '@aws-sdk/util-arn-parser': 3.310.0 - '@aws-sdk/util-config-provider': 3.310.0 - tslib: 2.5.0 + '@smithy/protocol-http': 3.0.5 + '@smithy/smithy-client': 2.1.7 + '@smithy/types': 2.3.3 + tslib: 2.6.2 dev: false - /@aws-sdk/middleware-content-length@3.341.0: - resolution: {integrity: sha512-m663QyL1qvMnXOsXUtLvQz5B5l1kulQMTOwVxxhefPxO0nZbIlXdMQurEOwI1FHfaMnR8UQ1FfPLY6GIkJkX/g==} + /@aws-sdk/middleware-sdk-sts@3.418.0: + resolution: {integrity: sha512-cW8ijrCTP+mgihvcq4+TbhAcE/we5lFl4ydRqvTdtcSnYQAVQADg47rnTScQiFsPFEB3NKq7BGeyTJF9MKolPA==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/protocol-http': 3.341.0 - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 + '@aws-sdk/middleware-signing': 3.418.0 + '@aws-sdk/types': 3.418.0 + '@smithy/types': 2.3.3 + tslib: 2.6.2 dev: false - /@aws-sdk/middleware-endpoint@3.341.0: - resolution: {integrity: sha512-IucQO8JjAjxnA+7RI1tkxOjUtpuUpkS3v56u5vk6Oypq1iovVBvD8yiFBR2wPh9X/O+3Ts7eWsZ4jhuf4JQQUQ==} + /@aws-sdk/middleware-signing@3.418.0: + resolution: {integrity: sha512-onvs5KoYQE8OlOE740RxWBGtsUyVIgAo0CzRKOQO63ZEYqpL1Os+MS1CGzdNhvQnJgJruE1WW+Ix8fjN30zKPA==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/middleware-serde': 3.341.0 - '@aws-sdk/types': 3.341.0 - '@aws-sdk/url-parser': 3.341.0 - '@aws-sdk/util-middleware': 3.341.0 - tslib: 2.5.0 + '@aws-sdk/types': 3.418.0 + '@smithy/property-provider': 2.0.10 + '@smithy/protocol-http': 3.0.5 + '@smithy/signature-v4': 2.0.9 + '@smithy/types': 2.3.3 + '@smithy/util-middleware': 2.0.2 + tslib: 2.6.2 dev: false - /@aws-sdk/middleware-expect-continue@3.341.0: - resolution: {integrity: sha512-bu8ICil5HFVJO8wohLIah+Nq863Y6EiLeSYfY2Sh5q6cJakt5uS6yRJ4nICLN9mf4nMD79wqH3pSLfCdVMBlSA==} + /@aws-sdk/middleware-ssec@3.418.0: + resolution: {integrity: sha512-J7K+5h6aP7IYMlu/NwHEIjb0+WDu1eFvO8TCPo6j1H9xYRi8B/6h+6pa9Rk9IgRUzFnrdlDu9FazG8Tp0KKLyg==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/protocol-http': 3.341.0 - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 + '@aws-sdk/types': 3.418.0 + '@smithy/types': 2.3.3 + tslib: 2.6.2 dev: false - /@aws-sdk/middleware-flexible-checksums@3.341.0: - resolution: {integrity: sha512-EM6qls2110+9Ioz1XHIDOtHrNTfDzcnqHm5YV51o2srD3nyR0uPLZgBMxNqolnRIsAn+1TVNQAlML/bEP4ZUEw==} + /@aws-sdk/middleware-user-agent@3.418.0: + resolution: {integrity: sha512-Jdcztg9Tal9SEAL0dKRrnpKrm6LFlWmAhvuwv0dQ7bNTJxIxyEFbpqdgy7mpQHsLVZgq1Aad/7gT/72c9igyZw==} engines: {node: '>=14.0.0'} dependencies: - '@aws-crypto/crc32': 3.0.0 - '@aws-crypto/crc32c': 3.0.0 - '@aws-sdk/is-array-buffer': 3.310.0 - '@aws-sdk/protocol-http': 3.341.0 - '@aws-sdk/types': 3.341.0 - '@aws-sdk/util-utf8': 3.310.0 - tslib: 2.5.0 + '@aws-sdk/types': 3.418.0 + '@aws-sdk/util-endpoints': 3.418.0 + '@smithy/protocol-http': 3.0.5 + '@smithy/types': 2.3.3 + tslib: 2.6.2 dev: false - /@aws-sdk/middleware-host-header@3.341.0: - resolution: {integrity: sha512-1AidcDDtGd7LUGtDV+F+FuLb6NmBlpupY2FpuqasUDH5f7ExcEbPaGYjOp4ozktQ6Qb0c0oJ4qxhv5sDos5Qww==} + /@aws-sdk/region-config-resolver@3.418.0: + resolution: {integrity: sha512-lJRZ/9TjZU6yLz+mAwxJkcJZ6BmyYoIJVo1p5+BN//EFdEmC8/c0c9gXMRzfISV/mqWSttdtccpAyN4/goHTYA==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/protocol-http': 3.341.0 - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 + '@smithy/node-config-provider': 2.0.12 + '@smithy/types': 2.3.3 + '@smithy/util-config-provider': 2.0.0 + '@smithy/util-middleware': 2.0.2 + tslib: 2.6.2 dev: false - /@aws-sdk/middleware-location-constraint@3.341.0: - resolution: {integrity: sha512-uBiiEfM0ctvdHIADZkcMnrv5ZxcA1KPkelTrjsXod9IfiWIMAhCGJVS1OLbjCQevGB1e1XdgNrFmRVq2Dvs7hQ==} + /@aws-sdk/signature-v4-multi-region@3.418.0: + resolution: {integrity: sha512-LeVYMZeUQUURFqDf4yZxTEv016g64hi0LqYBjU0mjwd8aPc0k6hckwvshezc80jCNbuLyjNfQclvlg3iFliItQ==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 + '@aws-sdk/types': 3.418.0 + '@smithy/protocol-http': 3.0.5 + '@smithy/signature-v4': 2.0.9 + '@smithy/types': 2.3.3 + tslib: 2.6.2 dev: false - /@aws-sdk/middleware-logger@3.341.0: - resolution: {integrity: sha512-JQgnPQMlNs542SL/ANbQSWbPMeWeY4+GW/fEfSRgM9uVBZaKPO5dZW7F761odxoK7f3qPSujEZb0ECmTYaEqgg==} + /@aws-sdk/token-providers@3.418.0: + resolution: {integrity: sha512-9P7Q0VN0hEzTngy3Sz5eya2qEOEf0Q8qf1vB3um0gE6ID6EVAdz/nc/DztfN32MFxk8FeVBrCP5vWdoOzmd72g==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/middleware-host-header': 3.418.0 + '@aws-sdk/middleware-logger': 3.418.0 + '@aws-sdk/middleware-recursion-detection': 3.418.0 + '@aws-sdk/middleware-user-agent': 3.418.0 + '@aws-sdk/types': 3.418.0 + '@aws-sdk/util-endpoints': 3.418.0 + '@aws-sdk/util-user-agent-browser': 3.418.0 + '@aws-sdk/util-user-agent-node': 3.418.0 + '@smithy/config-resolver': 2.0.10 + '@smithy/fetch-http-handler': 2.1.5 + '@smithy/hash-node': 2.0.9 + '@smithy/invalid-dependency': 2.0.9 + '@smithy/middleware-content-length': 2.0.11 + '@smithy/middleware-endpoint': 2.0.9 + '@smithy/middleware-retry': 2.0.12 + '@smithy/middleware-serde': 2.0.9 + '@smithy/middleware-stack': 2.0.3 + '@smithy/node-config-provider': 2.0.12 + '@smithy/node-http-handler': 2.1.5 + '@smithy/property-provider': 2.0.10 + '@smithy/protocol-http': 3.0.5 + '@smithy/shared-ini-file-loader': 2.0.11 + '@smithy/smithy-client': 2.1.7 + '@smithy/types': 2.3.3 + '@smithy/url-parser': 2.0.9 + '@smithy/util-base64': 2.0.0 + '@smithy/util-body-length-browser': 2.0.0 + '@smithy/util-body-length-node': 2.1.0 + '@smithy/util-defaults-mode-browser': 2.0.11 + '@smithy/util-defaults-mode-node': 2.0.13 + '@smithy/util-retry': 2.0.2 + '@smithy/util-utf8': 2.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt dev: false - /@aws-sdk/middleware-recursion-detection@3.341.0: - resolution: {integrity: sha512-DAfZgW7Bb4MB4ZHsjAhiaCXKqTeUFWazrgmNHAa8FkSE8MmgJv/4k8tvnWDtxkAO2GBOwqg7wG9LspeBG/RGMw==} + /@aws-sdk/types@3.418.0: + resolution: {integrity: sha512-y4PQSH+ulfFLY0+FYkaK4qbIaQI9IJNMO2xsxukW6/aNoApNymN1D2FSi2la8Qbp/iPjNDKsG8suNPm9NtsWXQ==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/protocol-http': 3.341.0 - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 + '@smithy/types': 2.3.3 + tslib: 2.6.2 dev: false - /@aws-sdk/middleware-retry@3.341.0: - resolution: {integrity: sha512-EyL2N4ohUQc4CdlccydPuybd4ngVx12MTSIGQVc0PcMZ39ayPbgYOZyCkAGb1rRCEIMayMrF9hF4GfNo4BvV5g==} + /@aws-sdk/util-arn-parser@3.310.0: + resolution: {integrity: sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/protocol-http': 3.341.0 - '@aws-sdk/service-error-classification': 3.341.0 - '@aws-sdk/types': 3.341.0 - '@aws-sdk/util-middleware': 3.341.0 - '@aws-sdk/util-retry': 3.341.0 - tslib: 2.5.0 - uuid: 8.3.2 + tslib: 2.6.2 dev: false - /@aws-sdk/middleware-sdk-s3@3.341.0: - resolution: {integrity: sha512-xN5e8JCq6TfBSWLjPfAbKW5ISk80fUVOE2yen0KA0HuqVI0LW6CaIvQuezRtZRpnzFVG/cgLzIBFaUktTh48Aw==} + /@aws-sdk/util-endpoints@3.418.0: + resolution: {integrity: sha512-sYSDwRTl7yE7LhHkPzemGzmIXFVHSsi3AQ1KeNEk84eBqxMHHcCc2kqklaBk2roXWe50QDgRMy1ikZUxvtzNHQ==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/protocol-http': 3.341.0 - '@aws-sdk/types': 3.341.0 - '@aws-sdk/util-arn-parser': 3.310.0 - tslib: 2.5.0 + '@aws-sdk/types': 3.418.0 + tslib: 2.6.2 dev: false - /@aws-sdk/middleware-sdk-sts@3.341.0: - resolution: {integrity: sha512-A7sXKhL9wzVqeq7sy3eWx7D5FPWdzrJTVpRRBYez/qBY4UjfLcxF9zpB0mw/xhQ7PUta7iJ5tSlPmZZQ4MBnmg==} + /@aws-sdk/util-locate-window@3.310.0: + resolution: {integrity: sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/middleware-signing': 3.341.0 - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 + tslib: 2.6.2 dev: false - /@aws-sdk/middleware-serde@3.341.0: - resolution: {integrity: sha512-FaPpbEGo/OETxnexg+TYet71fP6dM+y3NPXRUrd5dAulVhmr+CkdzOxqkqtMC1HinKAqHdUpjlsuf7gYg14deQ==} - engines: {node: '>=14.0.0'} + /@aws-sdk/util-user-agent-browser@3.418.0: + resolution: {integrity: sha512-c4p4mc0VV/jIeNH0lsXzhJ1MpWRLuboGtNEpqE4s1Vl9ck2amv9VdUUZUmHbg+bVxlMgRQ4nmiovA4qIrqGuyg==} dependencies: - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 + '@aws-sdk/types': 3.418.0 + '@smithy/types': 2.3.3 + bowser: 2.11.0 + tslib: 2.6.2 dev: false - /@aws-sdk/middleware-signing@3.341.0: - resolution: {integrity: sha512-KbyBIblgrGRizFJF3sLvx+ON84qOBHrDztNc++Xg2/UmdjLuEtm1sVvpQ2SxrKcfumx+ztVOuDpbD5pd0lBkOA==} + /@aws-sdk/util-user-agent-node@3.418.0: + resolution: {integrity: sha512-BXMskXFtg+dmzSCgmnWOffokxIbPr1lFqa1D9kvM3l3IFRiFGx2IyDg+8MAhq11aPDLvoa/BDuQ0Yqma5izOhg==} engines: {node: '>=14.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true dependencies: - '@aws-sdk/property-provider': 3.341.0 - '@aws-sdk/protocol-http': 3.341.0 - '@aws-sdk/signature-v4': 3.341.0 - '@aws-sdk/types': 3.341.0 - '@aws-sdk/util-middleware': 3.341.0 - tslib: 2.5.0 + '@aws-sdk/types': 3.418.0 + '@smithy/node-config-provider': 2.0.12 + '@smithy/types': 2.3.3 + tslib: 2.6.2 dev: false - /@aws-sdk/middleware-ssec@3.341.0: - resolution: {integrity: sha512-Ij7u1R5aIrBk08MGTU2tXejKYeGEeayapmAg3TbwJroYZ78ZueWf/lJKWOOhLKQ9O3Jd31sQEAMt2n5rDaMCuA==} - engines: {node: '>=14.0.0'} + /@aws-sdk/util-utf8-browser@3.259.0: + resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} dependencies: - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 + tslib: 2.6.2 dev: false - /@aws-sdk/middleware-stack@3.341.0: - resolution: {integrity: sha512-pBAN9T4tBSHp7gJKu0Ma0MepZqP3GvecEh7eZWwTrJrRMgY1k8M1zpUOXBFG6EVRzVdyy7A4DWSuD4kcXE+BIw==} + /@aws-sdk/xml-builder@3.310.0: + resolution: {integrity: sha512-TqELu4mOuSIKQCqj63fGVs86Yh+vBx5nHRpWKNUNhB2nPTpfbziTs5c1X358be3peVWA4wPxW7Nt53KIg1tnNw==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.5.0 + tslib: 2.6.2 dev: false - /@aws-sdk/middleware-user-agent@3.341.0: - resolution: {integrity: sha512-9gpVXPMkgwv0yV1Lbuc9bvb3MHLEjj5whgbM1WNrtRiogeFwWB0cxOQQgb2cY+xgQLMLnH7VvfRGN79TNVnI7w==} - engines: {node: '>=14.0.0'} + /@babel/code-frame@7.21.4: + resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} + engines: {node: '>=6.9.0'} dependencies: - '@aws-sdk/protocol-http': 3.341.0 - '@aws-sdk/types': 3.341.0 - '@aws-sdk/util-endpoints': 3.341.0 - tslib: 2.5.0 - dev: false + '@babel/highlight': 7.22.13 + dev: true - /@aws-sdk/node-config-provider@3.341.0: - resolution: {integrity: sha512-Le/WSf9t0ItrHuGhOlEPiA+J/nYpYJaC1WgLefRG9j17xKF/fp7X+XSylF1xQ+cOMbHFMi7SNcXRhyfwFreU0w==} - engines: {node: '>=14.0.0'} + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + engines: {node: '>=6.9.0'} dependencies: - '@aws-sdk/property-provider': 3.341.0 - '@aws-sdk/shared-ini-file-loader': 3.341.0 - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 - dev: false + '@babel/highlight': 7.22.13 + chalk: 2.4.2 - /@aws-sdk/node-http-handler@3.341.0: - resolution: {integrity: sha512-pXkX1amhWhkgffs76bf+pR814JnBUa199Nb6Wm2l20LLPgSsQrRX0IwucM/KtAdEhFeJTR8bLhRJBzrm3ONMwQ==} - engines: {node: '>=14.0.0'} + /@babel/compat-data@7.21.4: + resolution: {integrity: sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==} + engines: {node: '>=6.9.0'} + + /@babel/compat-data@7.22.9: + resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} + engines: {node: '>=6.9.0'} + + /@babel/core@7.21.4: + resolution: {integrity: sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==} + engines: {node: '>=6.9.0'} dependencies: - '@aws-sdk/abort-controller': 3.341.0 - '@aws-sdk/protocol-http': 3.341.0 - '@aws-sdk/querystring-builder': 3.341.0 - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 - dev: false + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.21.4 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.22.17(@babel/core@7.21.4) + '@babel/helpers': 7.21.0 + '@babel/parser': 7.22.16 + '@babel/template': 7.22.15 + '@babel/traverse': 7.21.4 + '@babel/types': 7.22.17 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color - /@aws-sdk/property-provider@3.341.0: - resolution: {integrity: sha512-5Ynks9iUS/VJcZa/J3c5G+XAaUw4SkWltQp4Y7dzWpJXS3AaUm9gby7DsWYopbH5dLeeSmvKENHTsKpsM5pQoQ==} - engines: {node: '>=14.0.0'} + /@babel/eslint-parser@7.21.3(@babel/core@7.21.4)(eslint@8.29.0): + resolution: {integrity: sha512-kfhmPimwo6k4P8zxNs8+T7yR44q1LdpsZdE1NkCsVlfiuTPRfnGgjaF8Qgug9q9Pou17u6wneYF0lDCZJATMFg==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + peerDependencies: + '@babel/core': '>=7.11.0' + eslint: ^7.5.0 || ^8.0.0 dependencies: - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 + '@babel/core': 7.21.4 + '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 + eslint: 8.29.0 + eslint-visitor-keys: 2.1.0 + semver: 6.3.1 dev: false - /@aws-sdk/protocol-http@3.341.0: - resolution: {integrity: sha512-Av+qcOA+gYXWgYYtzbTn2goHGlNdt+nbrzhUI6dWczYPzBe8aNnMR5d/ACNt0mD7O41muULmSTQBHOKBmOmNJA==} - engines: {node: '>=14.0.0'} + /@babel/generator@7.21.4: + resolution: {integrity: sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==} + engines: {node: '>=6.9.0'} dependencies: - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 - dev: false + '@babel/types': 7.22.17 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + jsesc: 2.5.2 - /@aws-sdk/querystring-builder@3.341.0: - resolution: {integrity: sha512-71RNU1VB8tSfqeu9t61YWDmMS/5C9NH8ua6LXb5HGzlnq68BSLq3lGa4zx/h2K0OpZ6ERUORFdw6pmqA17pDmg==} - engines: {node: '>=14.0.0'} + /@babel/helper-annotate-as-pure@7.18.6: + resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} + engines: {node: '>=6.9.0'} dependencies: - '@aws-sdk/types': 3.341.0 - '@aws-sdk/util-uri-escape': 3.310.0 - tslib: 2.5.0 - dev: false + '@babel/types': 7.22.17 - /@aws-sdk/querystring-parser@3.341.0: - resolution: {integrity: sha512-7O61bRUdo2x73TTeyyriibLpx9tUPO13gBdI9oHpJTZEkOiUYxoxjMdo5s7ofis12MdmzelqIUjPmAvJNtB5wA==} - engines: {node: '>=14.0.0'} + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} dependencies: - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 - dev: false + '@babel/types': 7.22.17 - /@aws-sdk/service-error-classification@3.341.0: - resolution: {integrity: sha512-mqf9rV/j8Ry2RWDQsaJDPyDm/VDQ4ZDdmi8rzm/AeSgEDaNWublt31zlWtgUWfjISfTtbBgzI48n6ZBJqyYmUA==} - engines: {node: '>=14.0.0'} - dev: false + /@babel/helper-builder-binary-assignment-operator-visitor@7.18.9: + resolution: {integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-explode-assignable-expression': 7.18.6 + '@babel/types': 7.22.17 + dev: true - /@aws-sdk/shared-ini-file-loader@3.341.0: - resolution: {integrity: sha512-/ikCc2XRL8zG//EB2g6SXFvMMa7KD2T8RpM4dYEisdvHDoF9khVX3/SLLUs2Y32rr1x9tnh7X9DdV8lX9MP/ZA==} - engines: {node: '>=14.0.0'} + /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: + resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} + engines: {node: '>=6.9.0'} dependencies: - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 - dev: false + '@babel/types': 7.22.17 - /@aws-sdk/signature-v4-multi-region@3.341.0: - resolution: {integrity: sha512-1YCciA4740Ev9Rj2YSTzuN3ea/xgGxlcrwC4OBOKslO4YQkwFvIogL7GToZzrWeObGImW6PPsS+tN44Rkk2Jyg==} - engines: {node: '>=14.0.0'} - peerDependencies: - '@aws-sdk/signature-v4-crt': ^3.118.0 - peerDependenciesMeta: - '@aws-sdk/signature-v4-crt': - optional: true - dependencies: - '@aws-sdk/protocol-http': 3.341.0 - '@aws-sdk/signature-v4': 3.341.0 - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 - dev: false - - /@aws-sdk/signature-v4@3.341.0: - resolution: {integrity: sha512-4nWgDiw68lEFBwrQY1JsKBvcMmcRhClpWzi3iKHwU1PJogId6g4XRU89Zo0QzBQihmFZIKklRSF/150pbNGdcg==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/is-array-buffer': 3.310.0 - '@aws-sdk/types': 3.341.0 - '@aws-sdk/util-hex-encoding': 3.310.0 - '@aws-sdk/util-middleware': 3.341.0 - '@aws-sdk/util-uri-escape': 3.310.0 - '@aws-sdk/util-utf8': 3.310.0 - tslib: 2.5.0 - dev: false - - /@aws-sdk/smithy-client@3.341.0: - resolution: {integrity: sha512-4ReKR+UciZ012W8OimFZfGy1LRZeWcl/i7h6lTIiXasni4Q+5k1rqneCRtJpBgfB5YbJg4EawmWxsxChrX9pwQ==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/middleware-stack': 3.341.0 - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 - dev: false - - /@aws-sdk/token-providers@3.341.0: - resolution: {integrity: sha512-PNskQMWVV6hUTPZmwcfAU0nknY0+Ge60ZVdNx6B4bpor6oEXl/jUCDOmymyHJl85LiIN7AZDrwq1gpdsDDVhZw==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/client-sso-oidc': 3.341.0 - '@aws-sdk/property-provider': 3.341.0 - '@aws-sdk/shared-ini-file-loader': 3.341.0 - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 - transitivePeerDependencies: - - aws-crt - dev: false - - /@aws-sdk/types@3.341.0: - resolution: {integrity: sha512-2KJf64BhJly/Ty35oWKlCElIqUP4kQ0LA+meSrgAmwl7oE0AYuO7V0ar1nsTGlsubYkLRvOuEhMcuNuumaUdoQ==} - engines: {node: '>=14.0.0'} + /@babel/helper-compilation-targets@7.21.4(@babel/core@7.21.4): + resolution: {integrity: sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: - tslib: 2.5.0 - dev: false + '@babel/compat-data': 7.21.4 + '@babel/core': 7.21.4 + '@babel/helper-validator-option': 7.21.0 + browserslist: 4.21.10 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true - /@aws-sdk/url-parser@3.341.0: - resolution: {integrity: sha512-pAT+4Yp3NkHKnLhYjbFj9DGKTRavBIVoe0fbQLm1G/MD11FAlUOlswf5EYFjgz0wfdgnbyFE3ai837/eO0fGjw==} + /@babel/helper-compilation-targets@7.22.15: + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + engines: {node: '>=6.9.0'} dependencies: - '@aws-sdk/querystring-parser': 3.341.0 - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 - dev: false + '@babel/compat-data': 7.22.9 + '@babel/helper-validator-option': 7.22.15 + browserslist: 4.21.10 + lru-cache: 5.1.1 + semver: 6.3.1 - /@aws-sdk/util-arn-parser@3.310.0: - resolution: {integrity: sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA==} - engines: {node: '>=14.0.0'} + /@babel/helper-create-class-features-plugin@7.21.4(@babel/core@7.21.4): + resolution: {integrity: sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: - tslib: 2.5.0 - dev: false - - /@aws-sdk/util-base64@3.310.0: - resolution: {integrity: sha512-v3+HBKQvqgdzcbL+pFswlx5HQsd9L6ZTlyPVL2LS9nNXnCcR3XgGz9jRskikRUuUvUXtkSG1J88GAOnJ/apTPg==} - engines: {node: '>=14.0.0'} + '@babel/core': 7.21.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-member-expression-to-functions': 7.22.15 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.9(@babel/core@7.21.4) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + + /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.21.4): + resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: - '@aws-sdk/util-buffer-from': 3.310.0 - tslib: 2.5.0 - dev: false + '@babel/core': 7.21.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-member-expression-to-functions': 7.22.15 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.9(@babel/core@7.21.4) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 - /@aws-sdk/util-body-length-browser@3.310.0: - resolution: {integrity: sha512-sxsC3lPBGfpHtNTUoGXMQXLwjmR0zVpx0rSvzTPAuoVILVsp5AU/w5FphNPxD5OVIjNbZv9KsKTuvNTiZjDp9g==} + /@babel/helper-create-regexp-features-plugin@7.21.4(@babel/core@7.21.4): + resolution: {integrity: sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: - tslib: 2.5.0 - dev: false + '@babel/core': 7.21.4 + '@babel/helper-annotate-as-pure': 7.22.5 + regexpu-core: 5.3.2 - /@aws-sdk/util-body-length-node@3.310.0: - resolution: {integrity: sha512-2tqGXdyKhyA6w4zz7UPoS8Ip+7sayOg9BwHNidiGm2ikbDxm1YrCfYXvCBdwaJxa4hJfRVz+aL9e+d3GqPI9pQ==} - engines: {node: '>=14.0.0'} + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.21.4): + resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: - tslib: 2.5.0 - dev: false + '@babel/core': 7.21.4 + '@babel/helper-annotate-as-pure': 7.22.5 + regexpu-core: 5.3.2 + semver: 6.3.1 - /@aws-sdk/util-buffer-from@3.310.0: - resolution: {integrity: sha512-i6LVeXFtGih5Zs8enLrt+ExXY92QV25jtEnTKHsmlFqFAuL3VBeod6boeMXkN2p9lbSVVQ1sAOOYZOHYbYkntw==} - engines: {node: '>=14.0.0'} + /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.21.4): + resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} + peerDependencies: + '@babel/core': ^7.4.0-0 dependencies: - '@aws-sdk/is-array-buffer': 3.310.0 - tslib: 2.5.0 - dev: false + '@babel/core': 7.21.4 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color - /@aws-sdk/util-config-provider@3.310.0: - resolution: {integrity: sha512-xIBaYo8dwiojCw8vnUcIL4Z5tyfb1v3yjqyJKJWV/dqKUFOOS0U591plmXbM+M/QkXyML3ypon1f8+BoaDExrg==} - engines: {node: '>=14.0.0'} + /@babel/helper-define-polyfill-provider@0.4.2(@babel/core@7.21.4): + resolution: {integrity: sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - tslib: 2.5.0 - dev: false + '@babel/core': 7.21.4 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.2 + transitivePeerDependencies: + - supports-color - /@aws-sdk/util-defaults-mode-browser@3.341.0: - resolution: {integrity: sha512-FjZg0T/7lcEgeMTdC8iMaNcHlHwqVzS0FlyUdJrMZqXEo70h3KlByijv8N9VlV8XQUfiCPuTNlhpLpDEDMdtbw==} - engines: {node: '>= 10.0.0'} - dependencies: - '@aws-sdk/property-provider': 3.341.0 - '@aws-sdk/types': 3.341.0 - bowser: 2.11.0 - tslib: 2.5.0 - dev: false + /@babel/helper-environment-visitor@7.18.9: + resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} + engines: {node: '>=6.9.0'} + dev: true - /@aws-sdk/util-defaults-mode-node@3.341.0: - resolution: {integrity: sha512-I943vmtUHqOdHvWCCnO3Vv/XXKCZ4O3XPNl9jvIC8m0n6CXqf7qjs9R72t3PQCTBAbsbIRGfkKMKfH2ab5ci/g==} - engines: {node: '>= 10.0.0'} - dependencies: - '@aws-sdk/config-resolver': 3.341.0 - '@aws-sdk/credential-provider-imds': 3.341.0 - '@aws-sdk/node-config-provider': 3.341.0 - '@aws-sdk/property-provider': 3.341.0 - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 - dev: false + /@babel/helper-environment-visitor@7.22.5: + resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} + engines: {node: '>=6.9.0'} - /@aws-sdk/util-endpoints@3.341.0: - resolution: {integrity: sha512-J15adxRV+YwWasOcCHDZoxXXQS7l8yBgWbId2ozGond/GwHifKhElF0RX9QKB4R/Vq1Cj7WVTyQsugYJAlLWrw==} - engines: {node: '>=14.0.0'} + /@babel/helper-explode-assignable-expression@7.18.6: + resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} + engines: {node: '>=6.9.0'} dependencies: - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 - dev: false + '@babel/types': 7.22.17 + dev: true - /@aws-sdk/util-hex-encoding@3.310.0: - resolution: {integrity: sha512-sVN7mcCCDSJ67pI1ZMtk84SKGqyix6/0A1Ab163YKn+lFBQRMKexleZzpYzNGxYzmQS6VanP/cfU7NiLQOaSfA==} - engines: {node: '>=14.0.0'} + /@babel/helper-function-name@7.21.0: + resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} + engines: {node: '>=6.9.0'} dependencies: - tslib: 2.5.0 - dev: false + '@babel/template': 7.22.15 + '@babel/types': 7.22.17 + dev: true - /@aws-sdk/util-locate-window@3.310.0: - resolution: {integrity: sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==} - engines: {node: '>=14.0.0'} + /@babel/helper-function-name@7.22.5: + resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} + engines: {node: '>=6.9.0'} dependencies: - tslib: 2.5.0 - dev: false + '@babel/template': 7.22.15 + '@babel/types': 7.22.17 - /@aws-sdk/util-middleware@3.341.0: - resolution: {integrity: sha512-JsuZGZw9pMYMHzaJW31Y3Zl1Dh/R2PNVxnlQPsPy37RhHoSLPZ6wR9G828Y1ZY2thBpR+DU3D/VfNJOxBmWGkw==} - engines: {node: '>=14.0.0'} + /@babel/helper-hoist-variables@7.18.6: + resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} + engines: {node: '>=6.9.0'} dependencies: - tslib: 2.5.0 - dev: false + '@babel/types': 7.22.17 + dev: true - /@aws-sdk/util-retry@3.341.0: - resolution: {integrity: sha512-UxAZiajjj65Zi9Q8PJ53vGydsa6dv9ZJC+bfO70czGGTWjB+L7kb2UoRdtGo9NBzRTFYXV6OjP6yBw5yFb39kw==} - engines: {node: '>= 14.0.0'} + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} dependencies: - '@aws-sdk/service-error-classification': 3.341.0 - tslib: 2.5.0 - dev: false + '@babel/types': 7.22.17 - /@aws-sdk/util-stream-browser@3.341.0: - resolution: {integrity: sha512-TLP5CBDebTtYZYpvFE+2L8jrcuFPCuhNDehhnp0NJZ2Uf2e7KlD8tn1Y40CctVOcpZ6vUQtGvHcc5ZWiNbHTLQ==} + /@babel/helper-member-expression-to-functions@7.22.15: + resolution: {integrity: sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA==} + engines: {node: '>=6.9.0'} dependencies: - '@aws-sdk/fetch-http-handler': 3.341.0 - '@aws-sdk/types': 3.341.0 - '@aws-sdk/util-base64': 3.310.0 - '@aws-sdk/util-hex-encoding': 3.310.0 - '@aws-sdk/util-utf8': 3.310.0 - tslib: 2.5.0 - dev: false + '@babel/types': 7.22.17 - /@aws-sdk/util-stream-node@3.341.0: - resolution: {integrity: sha512-tdPrw1YieZYwTJgOwBqNSwaVsiEov9LwegC+1fme9vw3KOmFHuEOXb0myAdrNP+u38Yn/G2C/SzcnEIQQtOkTQ==} - engines: {node: '>=14.0.0'} + /@babel/helper-module-imports@7.21.4: + resolution: {integrity: sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==} + engines: {node: '>=6.9.0'} dependencies: - '@aws-sdk/node-http-handler': 3.341.0 - '@aws-sdk/types': 3.341.0 - '@aws-sdk/util-buffer-from': 3.310.0 - tslib: 2.5.0 - dev: false + '@babel/types': 7.21.4 - /@aws-sdk/util-uri-escape@3.310.0: - resolution: {integrity: sha512-drzt+aB2qo2LgtDoiy/3sVG8w63cgLkqFIa2NFlGpUgHFWTXkqtbgf4L5QdjRGKWhmZsnqkbtL7vkSWEcYDJ4Q==} - engines: {node: '>=14.0.0'} + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} dependencies: - tslib: 2.5.0 - dev: false + '@babel/types': 7.22.17 - /@aws-sdk/util-user-agent-browser@3.341.0: - resolution: {integrity: sha512-VCgWM03lbcfjBQFhJJcF7Gs+XKxdtSYuK5txFiXy/glin5eCY+9VB3vqMrYwvEgIlwZynUYXvh9+OkU2AeRaBg==} + /@babel/helper-module-transforms@7.21.2: + resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==} + engines: {node: '>=6.9.0'} dependencies: - '@aws-sdk/types': 3.341.0 - bowser: 2.11.0 - tslib: 2.5.0 - dev: false + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.15 + '@babel/template': 7.22.15 + '@babel/traverse': 7.21.4 + '@babel/types': 7.22.17 + transitivePeerDependencies: + - supports-color + dev: true - /@aws-sdk/util-user-agent-node@3.341.0: - resolution: {integrity: sha512-ac1VcSQOn4fhif51hoSZtrfkFGZHNqXXv2mWzNo1xgsyDwCJh2/H6fPBBGtjT3TNc/o5yOuyBFRP4BIjJ5GkPA==} - engines: {node: '>=14.0.0'} + /@babel/helper-module-transforms@7.22.17(@babel/core@7.21.4): + resolution: {integrity: sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==} + engines: {node: '>=6.9.0'} peerDependencies: - aws-crt: '>=1.0.0' - peerDependenciesMeta: - aws-crt: - optional: true + '@babel/core': ^7.0.0 dependencies: - '@aws-sdk/node-config-provider': 3.341.0 - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 - dev: false + '@babel/core': 7.21.4 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.15 - /@aws-sdk/util-utf8-browser@3.259.0: - resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} + /@babel/helper-optimise-call-expression@7.18.6: + resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} + engines: {node: '>=6.9.0'} dependencies: - tslib: 2.5.0 - dev: false + '@babel/types': 7.22.17 + dev: true - /@aws-sdk/util-utf8@3.310.0: - resolution: {integrity: sha512-DnLfFT8uCO22uOJc0pt0DsSNau1GTisngBCDw8jQuWT5CqogMJu4b/uXmwEqfj8B3GX6Xsz8zOd6JpRlPftQoA==} - engines: {node: '>=14.0.0'} + /@babel/helper-optimise-call-expression@7.22.5: + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} dependencies: - '@aws-sdk/util-buffer-from': 3.310.0 - tslib: 2.5.0 - dev: false + '@babel/types': 7.22.17 - /@aws-sdk/util-waiter@3.341.0: - resolution: {integrity: sha512-YNKFk3xwq3lgyZ+udgvwACE0thV6bWtSBeEoSuVIOVz6yR0Td9NsA+5gOBgAMKLWSoWP/4II57+ZnEEuhuyzzg==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/abort-controller': 3.341.0 - '@aws-sdk/types': 3.341.0 - tslib: 2.5.0 - dev: false + /@babel/helper-plugin-utils@7.20.2: + resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} + engines: {node: '>=6.9.0'} - /@aws-sdk/xml-builder@3.310.0: - resolution: {integrity: sha512-TqELu4mOuSIKQCqj63fGVs86Yh+vBx5nHRpWKNUNhB2nPTpfbziTs5c1X358be3peVWA4wPxW7Nt53KIg1tnNw==} - engines: {node: '>=14.0.0'} - dependencies: - tslib: 2.5.0 - dev: false + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} - /@babel/code-frame@7.21.4: - resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} + /@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.21.4): + resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: - '@babel/highlight': 7.18.6 + '@babel/core': 7.21.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-wrap-function': 7.22.17 + '@babel/types': 7.22.17 + dev: true - /@babel/compat-data@7.21.4: - resolution: {integrity: sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==} + /@babel/helper-remap-async-to-generator@7.22.17(@babel/core@7.21.4): + resolution: {integrity: sha512-bxH77R5gjH3Nkde6/LuncQoLaP16THYPscurp1S8z7S9ZgezCyV3G8Hc+TZiCmY8pz4fp8CvKSgtJMW0FkLAxA==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-wrap-function': 7.22.17 - /@babel/core@7.21.4: - resolution: {integrity: sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==} + /@babel/helper-replace-supers@7.20.7: + resolution: {integrity: sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==} engines: {node: '>=6.9.0'} dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.21.4 - '@babel/generator': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) - '@babel/helper-module-transforms': 7.21.2 - '@babel/helpers': 7.21.0 - '@babel/parser': 7.21.4 - '@babel/template': 7.20.7 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-member-expression-to-functions': 7.22.15 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/template': 7.22.15 '@babel/traverse': 7.21.4 - '@babel/types': 7.21.4 - convert-source-map: 1.9.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.0 + '@babel/types': 7.22.17 transitivePeerDependencies: - supports-color - /@babel/eslint-parser@7.21.3(@babel/core@7.21.4)(eslint@8.38.0): - resolution: {integrity: sha512-kfhmPimwo6k4P8zxNs8+T7yR44q1LdpsZdE1NkCsVlfiuTPRfnGgjaF8Qgug9q9Pou17u6wneYF0lDCZJATMFg==} - engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + /@babel/helper-replace-supers@7.22.9(@babel/core@7.21.4): + resolution: {integrity: sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==} + engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': '>=7.11.0' - eslint: ^7.5.0 || ^8.0.0 + '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.21.4 - '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 8.38.0 - eslint-visitor-keys: 2.1.0 - semver: 6.3.0 - dev: false + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-member-expression-to-functions': 7.22.15 + '@babel/helper-optimise-call-expression': 7.22.5 - /@babel/generator@7.21.4: - resolution: {integrity: sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==} + /@babel/helper-simple-access@7.20.2: + resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.4 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - jsesc: 2.5.2 + '@babel/types': 7.22.17 + dev: true - /@babel/helper-annotate-as-pure@7.18.6: - resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.4 + '@babel/types': 7.22.17 - /@babel/helper-builder-binary-assignment-operator-visitor@7.18.9: - resolution: {integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-explode-assignable-expression': 7.18.6 - '@babel/types': 7.21.4 - - /@babel/helper-compilation-targets@7.21.4(@babel/core@7.21.4): - resolution: {integrity: sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.21.4 - '@babel/core': 7.21.4 - '@babel/helper-validator-option': 7.21.0 - browserslist: 4.21.5 - lru-cache: 5.1.1 - semver: 6.3.0 - - /@babel/helper-create-class-features-plugin@7.21.4(@babel/core@7.21.4): - resolution: {integrity: sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.21.0 - '@babel/helper-member-expression-to-functions': 7.21.0 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-replace-supers': 7.20.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/helper-split-export-declaration': 7.18.6 - transitivePeerDependencies: - - supports-color - - /@babel/helper-create-regexp-features-plugin@7.21.4(@babel/core@7.21.4): - resolution: {integrity: sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.18.6 - regexpu-core: 5.3.2 - - /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.21.4): - resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} - peerDependencies: - '@babel/core': ^7.4.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.20.2 - debug: 4.3.4 - lodash.debounce: 4.0.8 - resolve: 1.22.2 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - - /@babel/helper-environment-visitor@7.18.9: - resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} - engines: {node: '>=6.9.0'} - - /@babel/helper-explode-assignable-expression@7.18.6: - resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.21.4 - - /@babel/helper-function-name@7.21.0: - resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.20.7 - '@babel/types': 7.21.4 - - /@babel/helper-hoist-variables@7.18.6: - resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.21.4 - - /@babel/helper-member-expression-to-functions@7.21.0: - resolution: {integrity: sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.21.4 - - /@babel/helper-module-imports@7.21.4: - resolution: {integrity: sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.21.4 - - /@babel/helper-module-transforms@7.21.2: - resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-module-imports': 7.21.4 - '@babel/helper-simple-access': 7.20.2 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/helper-validator-identifier': 7.19.1 - '@babel/template': 7.20.7 - '@babel/traverse': 7.21.4 - '@babel/types': 7.21.4 - transitivePeerDependencies: - - supports-color - - /@babel/helper-optimise-call-expression@7.18.6: - resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.21.4 - - /@babel/helper-plugin-utils@7.20.2: - resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} - engines: {node: '>=6.9.0'} - - /@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.21.4): - resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-wrap-function': 7.20.5 - '@babel/types': 7.21.4 - transitivePeerDependencies: - - supports-color - - /@babel/helper-replace-supers@7.20.7: - resolution: {integrity: sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==} + /@babel/helper-skip-transparent-expression-wrappers@7.20.0: + resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-member-expression-to-functions': 7.21.0 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/template': 7.20.7 - '@babel/traverse': 7.21.4 - '@babel/types': 7.21.4 - transitivePeerDependencies: - - supports-color + '@babel/types': 7.22.17 + dev: true - /@babel/helper-simple-access@7.20.2: - resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.4 + '@babel/types': 7.22.17 - /@babel/helper-skip-transparent-expression-wrappers@7.20.0: - resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} + /@babel/helper-split-export-declaration@7.18.6: + resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.4 + '@babel/types': 7.22.17 - /@babel/helper-split-export-declaration@7.18.6: - resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.4 + '@babel/types': 7.22.17 /@babel/helper-string-parser@7.19.4: resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} engines: {node: '>=6.9.0'} + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier@7.19.1: resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier@7.22.15: + resolution: {integrity: sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==} + engines: {node: '>=6.9.0'} + /@babel/helper-validator-option@7.21.0: resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} engines: {node: '>=6.9.0'} - /@babel/helper-wrap-function@7.20.5: - resolution: {integrity: sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==} + /@babel/helper-validator-option@7.22.15: + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + engines: {node: '>=6.9.0'} + + /@babel/helper-wrap-function@7.22.17: + resolution: {integrity: sha512-nAhoheCMlrqU41tAojw9GpVEKDlTS8r3lzFmF0lP52LwblCPbuFSO7nGIZoIcoU5NIm1ABrna0cJExE4Ay6l2Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-function-name': 7.21.0 - '@babel/template': 7.20.7 - '@babel/traverse': 7.21.4 - '@babel/types': 7.21.4 - transitivePeerDependencies: - - supports-color + '@babel/helper-function-name': 7.22.5 + '@babel/template': 7.22.15 + '@babel/types': 7.22.17 /@babel/helpers@7.21.0: resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.20.7 + '@babel/template': 7.22.15 '@babel/traverse': 7.21.4 - '@babel/types': 7.21.4 + '@babel/types': 7.22.17 transitivePeerDependencies: - supports-color - /@babel/highlight@7.18.6: - resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + /@babel/highlight@7.22.13: + resolution: {integrity: sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.19.1 + '@babel/helper-validator-identifier': 7.22.15 chalk: 2.4.2 js-tokens: 4.0.0 @@ -2214,7 +2133,15 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.21.4 + '@babel/types': 7.22.17 + dev: true + + /@babel/parser@7.22.16: + resolution: {integrity: sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.22.17 /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} @@ -2224,6 +2151,16 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.15(@babel/core@7.21.4): + resolution: {integrity: sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.20.7(@babel/core@7.21.4): resolution: {integrity: sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==} @@ -2235,6 +2172,18 @@ packages: '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.21.4) + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.15(@babel/core@7.21.4): + resolution: {integrity: sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-transform-optional-chaining': 7.22.15(@babel/core@7.21.4) /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.21.4): resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} @@ -2247,8 +2196,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.21.4) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) - transitivePeerDependencies: - - supports-color + dev: true /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} @@ -2259,8 +2207,6 @@ packages: '@babel/core': 7.21.4 '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 - transitivePeerDependencies: - - supports-color /@babel/plugin-proposal-class-properties@7.7.4(@babel/core@7.21.4): resolution: {integrity: sha512-EcuXeV4Hv1X3+Q1TsuOmyyxeTRiSqurGJ26+I/FW1WbymmRRapVORm6x1Zl3iDIHyRxEs+VXWp6qnlcfcJSbbw==} @@ -2269,9 +2215,7 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.20.2 - transitivePeerDependencies: - - supports-color + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-proposal-class-static-block@7.21.0(@babel/core@7.21.4): @@ -2284,8 +2228,7 @@ packages: '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.4) - transitivePeerDependencies: - - supports-color + dev: true /@babel/plugin-proposal-decorators@7.21.0(@babel/core@7.21.4): resolution: {integrity: sha512-MfgX49uRrFUTL/HvWtmx3zmpyzMMr4MTj3d527MLlr/4RTT9G/ytFFP7qet2uM2Ve03b+BkpWUpK+lRXnQ+v9w==} @@ -2295,7 +2238,7 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-replace-supers': 7.20.7 '@babel/helper-split-export-declaration': 7.18.6 '@babel/plugin-syntax-decorators': 7.21.0(@babel/core@7.21.4) @@ -2311,6 +2254,7 @@ packages: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.4) + dev: true /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} @@ -2321,6 +2265,7 @@ packages: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.4) + dev: true /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} @@ -2331,6 +2276,7 @@ packages: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) + dev: true /@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.21.4): resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} @@ -2341,6 +2287,7 @@ packages: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) + dev: true /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} @@ -2374,6 +2321,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) '@babel/plugin-transform-parameters': 7.21.3(@babel/core@7.21.4) + dev: true /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} @@ -2384,6 +2332,7 @@ packages: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) + dev: true /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.21.4): resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} @@ -2392,8 +2341,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.21.4): @@ -2405,8 +2354,6 @@ packages: '@babel/core': 7.21.4 '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 - transitivePeerDependencies: - - supports-color /@babel/plugin-proposal-private-property-in-object@7.21.0(@babel/core@7.21.4): resolution: {integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==} @@ -2419,8 +2366,14 @@ packages: '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.4) - transitivePeerDependencies: - - supports-color + + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.21.4): + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} @@ -2431,6 +2384,7 @@ packages: '@babel/core': 7.21.4 '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 + dev: true /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.21.4): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} @@ -2438,7 +2392,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.21.4): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} @@ -2446,7 +2400,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.21.4): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} @@ -2454,7 +2408,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.21.4): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} @@ -2463,7 +2417,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-decorators@7.21.0(@babel/core@7.21.4): resolution: {integrity: sha512-tIoPpGBR8UuM4++ccWN3gifhVvQu7ZizuR1fklhRJrd5ewgbkUS+0KVFeWWxELtn18NTLoW32XV7zyOgIAiz+w==} @@ -2472,7 +2426,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.21.4): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} @@ -2480,7 +2434,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.21.4): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} @@ -2488,7 +2442,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-flow@7.21.4(@babel/core@7.21.4): resolution: {integrity: sha512-l9xd3N+XG4fZRxEP3vXdK6RW7vN1Uf5dxzRC/09wV86wqZ/YYQooBIGNsiRdfNR3/q2/5pPzV4B54J/9ctX5jw==} @@ -2497,7 +2451,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.21.4): resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} @@ -2507,6 +2461,25 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.21.4): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} @@ -2514,7 +2487,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.21.4): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} @@ -2522,7 +2495,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-jsx@7.21.4(@babel/core@7.21.4): resolution: {integrity: sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==} @@ -2531,7 +2504,17 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.21.4): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} @@ -2539,7 +2522,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.21.4): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} @@ -2547,7 +2530,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.21.4): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} @@ -2555,7 +2538,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.21.4): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} @@ -2563,7 +2546,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.21.4): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} @@ -2571,7 +2554,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.21.4): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} @@ -2579,7 +2562,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.21.4): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} @@ -2588,7 +2571,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.21.4): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} @@ -2597,7 +2580,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-typescript@7.21.4(@babel/core@7.21.4): resolution: {integrity: sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==} @@ -2606,7 +2589,27 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.21.4): + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-arrow-functions@7.20.7(@babel/core@7.21.4): resolution: {integrity: sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==} @@ -2616,6 +2619,28 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-async-generator-functions@7.22.15(@babel/core@7.21.4): + resolution: {integrity: sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.17(@babel/core@7.21.4) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) /@babel/plugin-transform-async-to-generator@7.20.7(@babel/core@7.21.4): resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} @@ -2627,8 +2652,18 @@ packages: '@babel/helper-module-imports': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.21.4) - transitivePeerDependencies: - - supports-color + dev: true + + /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.17(@babel/core@7.21.4) /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} @@ -2638,6 +2673,16 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-block-scoping@7.21.0(@babel/core@7.21.4): resolution: {integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==} @@ -2647,6 +2692,37 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-block-scoping@7.22.15(@babel/core@7.21.4): + resolution: {integrity: sha512-G1czpdJBZCtngoK1sJgloLiOHUnkb/bLZwqVZD8kXmq0ZnVfTTWUcs9OWtp0mBtYJ+4LQY1fllqBkOIPhXmFmw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.21.4) + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.21.4): + resolution: {integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.21.4) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.4) /@babel/plugin-transform-classes@7.21.0(@babel/core@7.21.4): resolution: {integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==} @@ -2666,6 +2742,24 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color + dev: true + + /@babel/plugin-transform-classes@7.22.15(@babel/core@7.21.4): + resolution: {integrity: sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.9(@babel/core@7.21.4) + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 /@babel/plugin-transform-computed-properties@7.20.7(@babel/core@7.21.4): resolution: {integrity: sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==} @@ -2676,6 +2770,17 @@ packages: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 '@babel/template': 7.20.7 + dev: true + + /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/template': 7.22.15 /@babel/plugin-transform-destructuring@7.21.3(@babel/core@7.21.4): resolution: {integrity: sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==} @@ -2685,6 +2790,16 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-destructuring@7.22.15(@babel/core@7.21.4): + resolution: {integrity: sha512-HzG8sFl1ZVGTme74Nw+X01XsUTqERVQ6/RLHo3XjGRzm7XD6QTtfS3NJotVgCGy8BzkDqRjRBD8dAyJn5TuvSQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} @@ -2695,6 +2810,17 @@ packages: '@babel/core': 7.21.4 '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.21.4) + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} @@ -2704,6 +2830,26 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.21.4): + resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.4) /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} @@ -2714,6 +2860,27 @@ packages: '@babel/core': 7.21.4 '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.21.4): + resolution: {integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.4) /@babel/plugin-transform-flow-strip-types@7.21.0(@babel/core@7.21.4): resolution: {integrity: sha512-FlFA2Mj87a6sDkW4gfGrQQqwY/dLlBAyJa2dJEZ+FHXUVHBflO2wyKvg+OOEzXfrKYIa4HWl0mgmbCzt0cMb7w==} @@ -2722,7 +2889,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-flow': 7.21.4(@babel/core@7.21.4) /@babel/plugin-transform-for-of@7.21.0(@babel/core@7.21.4): @@ -2733,6 +2900,16 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.21.4): + resolution: {integrity: sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} @@ -2744,6 +2921,28 @@ packages: '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) '@babel/helper-function-name': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.21.4): + resolution: {integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) /@babel/plugin-transform-literals@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} @@ -2753,6 +2952,26 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-literals@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.21.4): + resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} @@ -2762,6 +2981,16 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-modules-amd@7.20.11(@babel/core@7.21.4): resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} @@ -2774,6 +3003,17 @@ packages: '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color + dev: true + + /@babel/plugin-transform-modules-amd@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-module-transforms': 7.22.17(@babel/core@7.21.4) + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-modules-commonjs@7.21.2(@babel/core@7.21.4): resolution: {integrity: sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==} @@ -2787,6 +3027,18 @@ packages: '@babel/helper-simple-access': 7.20.2 transitivePeerDependencies: - supports-color + dev: true + + /@babel/plugin-transform-modules-commonjs@7.22.15(@babel/core@7.21.4): + resolution: {integrity: sha512-jWL4eh90w0HQOTKP2MoXXUpVxilxsB2Vl4ji69rSjS3EcZ/v4sBmn+A3NpepuJzBhOaEBbR7udonlHHn5DWidg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-module-transforms': 7.22.17(@babel/core@7.21.4) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-simple-access': 7.22.5 /@babel/plugin-transform-modules-systemjs@7.20.11(@babel/core@7.21.4): resolution: {integrity: sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==} @@ -2801,6 +3053,19 @@ packages: '@babel/helper-validator-identifier': 7.19.1 transitivePeerDependencies: - supports-color + dev: true + + /@babel/plugin-transform-modules-systemjs@7.22.11(@babel/core@7.21.4): + resolution: {integrity: sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.22.17(@babel/core@7.21.4) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-identifier': 7.22.15 /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} @@ -2813,6 +3078,17 @@ packages: '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color + dev: true + + /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-module-transforms': 7.22.17(@babel/core@7.21.4) + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-named-capturing-groups-regex@7.20.5(@babel/core@7.21.4): resolution: {integrity: sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==} @@ -2823,6 +3099,17 @@ packages: '@babel/core': 7.21.4 '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.21.4) + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-new-target@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} @@ -2832,119 +3119,257 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 + dev: true - /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} + /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-replace-supers': 7.20.7 - transitivePeerDependencies: - - supports-color + '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-parameters@7.21.3(@babel/core@7.21.4): - resolution: {integrity: sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==} + /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.21.4): + resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) - /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} + /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.21.4): + resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) - /@babel/plugin-transform-react-constant-elements@7.21.3(@babel/core@7.21.4): - resolution: {integrity: sha512-4DVcFeWe/yDYBLp0kBmOGFJ6N2UYg7coGid1gdxb4co62dy/xISDMaYBXBVXEDhfgMk7qkbcYiGtwd5Q/hwDDQ==} + /@babel/plugin-transform-object-rest-spread@7.22.15(@babel/core@7.21.4): + resolution: {integrity: sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/compat-data': 7.22.9 '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.21.4) - /@babel/plugin-transform-react-display-name@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==} + /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.21.4): + resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-replace-supers': 7.20.7 + transitivePeerDependencies: + - supports-color + dev: true - /@babel/plugin-transform-react-jsx-development@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==} + /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/plugin-transform-react-jsx': 7.21.0(@babel/core@7.21.4) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.9(@babel/core@7.21.4) - /@babel/plugin-transform-react-jsx@7.21.0(@babel/core@7.21.4): - resolution: {integrity: sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg==} + /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.21.4): + resolution: {integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-module-imports': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.21.4) - '@babel/types': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) - /@babel/plugin-transform-react-pure-annotations@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==} + /@babel/plugin-transform-optional-chaining@7.22.15(@babel/core@7.21.4): + resolution: {integrity: sha512-ngQ2tBhq5vvSJw2Q2Z9i7ealNkpDMU0rGWnHPKqRZO0tzZ5tlaoz4hDvhXioOoaE0X2vfNss1djwg0DXlfu30A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) - /@babel/plugin-transform-regenerator@7.20.5(@babel/core@7.21.4): - resolution: {integrity: sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==} + /@babel/plugin-transform-parameters@7.21.3(@babel/core@7.21.4): + resolution: {integrity: sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - regenerator-transform: 0.15.1 + dev: true - /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} + /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.21.4): + resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-runtime@7.21.4(@babel/core@7.21.4): - resolution: {integrity: sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA==} + /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.21.4) + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.21.4): + resolution: {integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.21.4) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.4) + + /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.21.4): + resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-react-constant-elements@7.21.3(@babel/core@7.21.4): + resolution: {integrity: sha512-4DVcFeWe/yDYBLp0kBmOGFJ6N2UYg7coGid1gdxb4co62dy/xISDMaYBXBVXEDhfgMk7qkbcYiGtwd5Q/hwDDQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-react-display-name@7.18.6(@babel/core@7.21.4): + resolution: {integrity: sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-transform-react-jsx-development@7.18.6(@babel/core@7.21.4): + resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/plugin-transform-react-jsx': 7.21.0(@babel/core@7.21.4) + + /@babel/plugin-transform-react-jsx@7.21.0(@babel/core@7.21.4): + resolution: {integrity: sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-module-imports': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.21.4) + '@babel/types': 7.22.17 + + /@babel/plugin-transform-react-pure-annotations@7.18.6(@babel/core@7.21.4): + resolution: {integrity: sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-transform-regenerator@7.20.5(@babel/core@7.21.4): + resolution: {integrity: sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.20.2 + regenerator-transform: 0.15.1 + dev: true + + /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.21.4): + resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 + regenerator-transform: 0.15.2 + + /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.21.4): + resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-runtime@7.21.4(@babel/core@7.21.4): + resolution: {integrity: sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.21.4) babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.21.4) babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.21.4) - semver: 6.3.0 + semver: 6.3.1 transitivePeerDependencies: - supports-color dev: false @@ -2957,6 +3382,16 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-spread@7.20.7(@babel/core@7.21.4): resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} @@ -2967,6 +3402,17 @@ packages: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + dev: true + + /@babel/plugin-transform-spread@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} @@ -2976,6 +3422,16 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} @@ -2985,6 +3441,16 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} @@ -2994,6 +3460,16 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-typescript@7.21.3(@babel/core@7.21.4): resolution: {integrity: sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==} @@ -3006,8 +3482,19 @@ packages: '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.21.4) - transitivePeerDependencies: - - supports-color + dev: true + + /@babel/plugin-transform-typescript@7.22.15(@babel/core@7.21.4): + resolution: {integrity: sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.21.4) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.21.4) /@babel/plugin-transform-unicode-escapes@7.18.10(@babel/core@7.21.4): resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} @@ -3017,6 +3504,26 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.21.4): + resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.21.4) + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} @@ -3027,6 +3534,27 @@ packages: '@babel/core': 7.21.4 '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.21.4) + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.21.4) + '@babel/helper-plugin-utils': 7.22.5 /@babel/preset-env@7.21.4(@babel/core@7.21.4): resolution: {integrity: sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==} @@ -3109,7 +3637,98 @@ packages: babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.21.4) babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.21.4) core-js-compat: 3.30.1 - semver: 6.3.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/preset-env@7.22.15(@babel/core@7.21.4): + resolution: {integrity: sha512-tZFHr54GBkHk6hQuVA8w4Fmq+MSPsfvMG0vPnOYyTnJpyfMqybL8/MbNCPRT9zc2KBO2pe4tq15g6Uno4Jpoag==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/core': 7.21.4 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.15 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.15(@babel/core@7.21.4) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.15(@babel/core@7.21.4) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.21.4) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.21.4) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.4) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.21.4) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.4) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.21.4) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-transform-async-generator-functions': 7.22.15(@babel/core@7.21.4) + '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-transform-block-scoping': 7.22.15(@babel/core@7.21.4) + '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-transform-class-static-block': 7.22.11(@babel/core@7.21.4) + '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.21.4) + '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-transform-destructuring': 7.22.15(@babel/core@7.21.4) + '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-transform-dynamic-import': 7.22.11(@babel/core@7.21.4) + '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-transform-export-namespace-from': 7.22.11(@babel/core@7.21.4) + '@babel/plugin-transform-for-of': 7.22.15(@babel/core@7.21.4) + '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-transform-json-strings': 7.22.11(@babel/core@7.21.4) + '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-transform-logical-assignment-operators': 7.22.11(@babel/core@7.21.4) + '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-transform-modules-amd': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-transform-modules-commonjs': 7.22.15(@babel/core@7.21.4) + '@babel/plugin-transform-modules-systemjs': 7.22.11(@babel/core@7.21.4) + '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-transform-nullish-coalescing-operator': 7.22.11(@babel/core@7.21.4) + '@babel/plugin-transform-numeric-separator': 7.22.11(@babel/core@7.21.4) + '@babel/plugin-transform-object-rest-spread': 7.22.15(@babel/core@7.21.4) + '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-transform-optional-catch-binding': 7.22.11(@babel/core@7.21.4) + '@babel/plugin-transform-optional-chaining': 7.22.15(@babel/core@7.21.4) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.21.4) + '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-transform-private-property-in-object': 7.22.11(@babel/core@7.21.4) + '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-transform-regenerator': 7.22.10(@babel/core@7.21.4) + '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-transform-unicode-escapes': 7.22.10(@babel/core@7.21.4) + '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.21.4) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.21.4) + '@babel/types': 7.22.17 + babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.21.4) + babel-plugin-polyfill-corejs3: 0.8.3(@babel/core@7.21.4) + babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.21.4) + core-js-compat: 3.32.2 + semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -3120,8 +3739,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-validator-option': 7.21.0 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.15 '@babel/plugin-transform-flow-strip-types': 7.21.0(@babel/core@7.21.4) dev: true @@ -3136,6 +3755,17 @@ packages: '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.21.4) '@babel/types': 7.21.4 esutils: 2.0.3 + dev: true + + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.21.4): + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/types': 7.22.17 + esutils: 2.0.3 /@babel/preset-react@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==} @@ -3165,16 +3795,24 @@ packages: '@babel/plugin-transform-typescript': 7.21.3(@babel/core@7.21.4) transitivePeerDependencies: - supports-color + dev: true + + /@babel/preset-typescript@7.22.15(@babel/core@7.21.4): + resolution: {integrity: sha512-HblhNmh6yM+cU4VwbBRpxFhxsTdfS1zsvH9W+gEjD0ARV9+8B4sNfpI6GuhePti84nuvhiwKS539jKPFHskA9A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.15 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-transform-modules-commonjs': 7.22.15(@babel/core@7.21.4) + '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.21.4) /@babel/regjsgen@0.8.0: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - /@babel/runtime@7.12.1: - resolution: {integrity: sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==} - dependencies: - regenerator-runtime: 0.13.11 - dev: true - /@babel/runtime@7.21.0: resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} engines: {node: '>=6.9.0'} @@ -3185,22 +3823,31 @@ packages: resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.21.4 - '@babel/parser': 7.21.4 - '@babel/types': 7.21.4 + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.22.16 + '@babel/types': 7.22.17 + dev: true + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.22.16 + '@babel/types': 7.22.17 /@babel/traverse@7.21.4: resolution: {integrity: sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.21.4 + '@babel/code-frame': 7.22.13 '@babel/generator': 7.21.4 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.21.0 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.21.4 - '@babel/types': 7.21.4 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.22.16 + '@babel/types': 7.22.17 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: @@ -3214,6 +3861,14 @@ packages: '@babel/helper-validator-identifier': 7.19.1 to-fast-properties: 2.0.0 + /@babel/types@7.22.17: + resolution: {integrity: sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.15 + to-fast-properties: 2.0.0 + /@balena/dockerignore@1.0.2: resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} dev: true @@ -3238,582 +3893,209 @@ packages: resolution: {integrity: sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==} dev: false - /@csstools/postcss-cascade-layers@1.1.1(postcss@8.4.21): + /@csstools/postcss-cascade-layers@1.1.1(postcss@8.4.30): resolution: {integrity: sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.0.11) - postcss: 8.4.21 + postcss: 8.4.30 postcss-selector-parser: 6.0.11 dev: false - /@csstools/postcss-color-function@1.1.1(postcss@8.4.21): + /@csstools/postcss-color-function@1.1.1(postcss@8.4.30): resolution: {integrity: sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.21) - postcss: 8.4.21 + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.30) + postcss: 8.4.30 postcss-value-parser: 4.2.0 dev: false - /@csstools/postcss-font-format-keywords@1.0.1(postcss@8.4.21): + /@csstools/postcss-font-format-keywords@1.0.1(postcss@8.4.30): resolution: {integrity: sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-value-parser: 4.2.0 dev: false - /@csstools/postcss-hwb-function@1.0.2(postcss@8.4.21): + /@csstools/postcss-hwb-function@1.0.2(postcss@8.4.30): resolution: {integrity: sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.2 - dependencies: - postcss: 8.4.21 - postcss-value-parser: 4.2.0 - dev: false - - /@csstools/postcss-ic-unit@1.0.1(postcss@8.4.21): - resolution: {integrity: sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 - dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.21) - postcss: 8.4.21 - postcss-value-parser: 4.2.0 - dev: false - - /@csstools/postcss-is-pseudo-class@2.0.7(postcss@8.4.21): - resolution: {integrity: sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 - dependencies: - '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.0.11) - postcss: 8.4.21 - postcss-selector-parser: 6.0.11 - dev: false - - /@csstools/postcss-nested-calc@1.0.0(postcss@8.4.21): - resolution: {integrity: sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 - dependencies: - postcss: 8.4.21 - postcss-value-parser: 4.2.0 - dev: false - - /@csstools/postcss-normalize-display-values@1.0.1(postcss@8.4.21): - resolution: {integrity: sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 - dependencies: - postcss: 8.4.21 - postcss-value-parser: 4.2.0 - dev: false - - /@csstools/postcss-oklab-function@1.1.1(postcss@8.4.21): - resolution: {integrity: sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 - dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.21) - postcss: 8.4.21 - postcss-value-parser: 4.2.0 - dev: false - - /@csstools/postcss-progressive-custom-properties@1.3.0(postcss@8.4.21): - resolution: {integrity: sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.3 - dependencies: - postcss: 8.4.21 - postcss-value-parser: 4.2.0 - dev: false - - /@csstools/postcss-stepped-value-functions@1.0.1(postcss@8.4.21): - resolution: {integrity: sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 - dependencies: - postcss: 8.4.21 - postcss-value-parser: 4.2.0 - dev: false - - /@csstools/postcss-text-decoration-shorthand@1.0.0(postcss@8.4.21): - resolution: {integrity: sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 - dependencies: - postcss: 8.4.21 - postcss-value-parser: 4.2.0 - dev: false - - /@csstools/postcss-trigonometric-functions@1.0.2(postcss@8.4.21): - resolution: {integrity: sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==} - engines: {node: ^14 || >=16} - peerDependencies: - postcss: ^8.2 - dependencies: - postcss: 8.4.21 - postcss-value-parser: 4.2.0 - dev: false - - /@csstools/postcss-unset-value@1.0.2(postcss@8.4.21): - resolution: {integrity: sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 - dependencies: - postcss: 8.4.21 - dev: false - - /@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.0.11): - resolution: {integrity: sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss-selector-parser: ^6.0.10 - dependencies: - postcss-selector-parser: 6.0.11 - dev: false - - /@ctrl/tinycolor@3.6.0: - resolution: {integrity: sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==} - engines: {node: '>=10'} - - /@discoveryjs/json-ext@0.5.7: - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} - - /@edge-runtime/format@1.1.0: - resolution: {integrity: sha512-MkLDDtPhXZIMx83NykdFmOpF7gVWIdd6GBHYb8V/E+PKWvD2pK/qWx9B30oN1iDJ2XBm0SGDjz02S8nDHI9lMQ==} - dev: true - - /@edge-runtime/primitives@2.0.0: - resolution: {integrity: sha512-AXqUq1zruTJAICrllUvZcgciIcEGHdF6KJ3r6FM0n4k8LpFxZ62tPWVIJ9HKm+xt+ncTBUZxwgUaQ73QMUQEKw==} - dev: true - - /@edge-runtime/vm@2.0.0: - resolution: {integrity: sha512-BOLrAX8IWHRXu1siZocwLguKJPEUv7cr+rG8tI4hvHgMdIsBWHJlLeB8EjuUVnIURFrUiM49lVKn8DRrECmngw==} - dependencies: - '@edge-runtime/primitives': 2.0.0 - dev: true - - /@emotion/hash@0.8.0: - resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} - - /@emotion/hash@0.9.0: - resolution: {integrity: sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==} - dev: true - - /@emotion/unitless@0.7.5: - resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} - - /@esbuild-plugins/node-modules-polyfill@0.1.4(esbuild@0.16.3): - resolution: {integrity: sha512-uZbcXi0zbmKC/050p3gJnne5Qdzw8vkXIv+c2BW0Lsc1ji1SkrxbKPUy5Efr0blbTu1SL8w4eyfpnSdPg3G0Qg==} - peerDependencies: - esbuild: '*' - dependencies: - esbuild: 0.16.3 - escape-string-regexp: 4.0.0 - rollup-plugin-node-polyfills: 0.2.1 - dev: true - - /@esbuild/android-arm64@0.16.3: - resolution: {integrity: sha512-RolFVeinkeraDvN/OoRf1F/lP0KUfGNb5jxy/vkIMeRRChkrX/HTYN6TYZosRJs3a1+8wqpxAo5PI5hFmxyPRg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - optional: true - - /@esbuild/android-arm64@0.17.6: - resolution: {integrity: sha512-YnYSCceN/dUzUr5kdtUzB+wZprCafuD89Hs0Aqv9QSdwhYQybhXTaSTcrl6X/aWThn1a/j0eEpUBGOE7269REg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.16.3: - resolution: {integrity: sha512-mueuEoh+s1eRbSJqq9KNBQwI4QhQV6sRXIfTyLXSHGMpyew61rOK4qY21uKbXl1iBoMb0AdL1deWFCQVlN2qHA==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - optional: true - - /@esbuild/android-arm@0.17.6: - resolution: {integrity: sha512-bSC9YVUjADDy1gae8RrioINU6e1lCkg3VGVwm0QQ2E1CWcC4gnMce9+B6RpxuSsrsXsk1yojn7sp1fnG8erE2g==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.16.3: - resolution: {integrity: sha512-SFpTUcIT1bIJuCCBMCQWq1bL2gPTjWoLZdjmIhjdcQHaUfV41OQfho6Ici5uvvkMmZRXIUGpM3GxysP/EU7ifQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - optional: true - - /@esbuild/android-x64@0.17.6: - resolution: {integrity: sha512-MVcYcgSO7pfu/x34uX9u2QIZHmXAB7dEiLQC5bBl5Ryqtpj9lT2sg3gNDEsrPEmimSJW2FXIaxqSQ501YLDsZQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.16.3: - resolution: {integrity: sha512-DO8WykMyB+N9mIDfI/Hug70Dk1KipavlGAecxS3jDUwAbTpDXj0Lcwzw9svkhxfpCagDmpaTMgxWK8/C/XcXvw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - optional: true - - /@esbuild/darwin-arm64@0.17.6: - resolution: {integrity: sha512-bsDRvlbKMQMt6Wl08nHtFz++yoZHsyTOxnjfB2Q95gato+Yi4WnRl13oC2/PJJA9yLCoRv9gqT/EYX0/zDsyMA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.16.3: - resolution: {integrity: sha512-uEqZQ2omc6BvWqdCiyZ5+XmxuHEi1SPzpVxXCSSV2+Sh7sbXbpeNhHIeFrIpRjAs0lI1FmA1iIOxFozKBhKgRQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - optional: true - - /@esbuild/darwin-x64@0.17.6: - resolution: {integrity: sha512-xh2A5oPrYRfMFz74QXIQTQo8uA+hYzGWJFoeTE8EvoZGHb+idyV4ATaukaUvnnxJiauhs/fPx3vYhU4wiGfosg==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.16.3: - resolution: {integrity: sha512-nJansp3sSXakNkOD5i5mIz2Is/HjzIhFs49b1tjrPrpCmwgBmH9SSzhC/Z1UqlkivqMYkhfPwMw1dGFUuwmXhw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - optional: true - - /@esbuild/freebsd-arm64@0.17.6: - resolution: {integrity: sha512-EnUwjRc1inT4ccZh4pB3v1cIhohE2S4YXlt1OvI7sw/+pD+dIE4smwekZlEPIwY6PhU6oDWwITrQQm5S2/iZgg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.16.3: - resolution: {integrity: sha512-TfoDzLw+QHfc4a8aKtGSQ96Wa+6eimljjkq9HKR0rHlU83vw8aldMOUSJTUDxbcUdcgnJzPaX8/vGWm7vyV7ug==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - optional: true - - /@esbuild/freebsd-x64@0.17.6: - resolution: {integrity: sha512-Uh3HLWGzH6FwpviUcLMKPCbZUAFzv67Wj5MTwK6jn89b576SR2IbEp+tqUHTr8DIl0iDmBAf51MVaP7pw6PY5Q==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.16.3: - resolution: {integrity: sha512-7I3RlsnxEFCHVZNBLb2w7unamgZ5sVwO0/ikE2GaYvYuUQs9Qte/w7TqWcXHtCwxvZx/2+F97ndiUQAWs47ZfQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-arm64@0.17.6: - resolution: {integrity: sha512-bUR58IFOMJX523aDVozswnlp5yry7+0cRLCXDsxnUeQYJik1DukMY+apBsLOZJblpH+K7ox7YrKrHmJoWqVR9w==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.16.3: - resolution: {integrity: sha512-VwswmSYwVAAq6LysV59Fyqk3UIjbhuc6wb3vEcJ7HEJUtFuLK9uXWuFoH1lulEbE4+5GjtHi3MHX+w1gNHdOWQ==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-arm@0.17.6: - resolution: {integrity: sha512-7YdGiurNt7lqO0Bf/U9/arrPWPqdPqcV6JCZda4LZgEn+PTQ5SMEI4MGR52Bfn3+d6bNEGcWFzlIxiQdS48YUw==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.16.3: - resolution: {integrity: sha512-X8FDDxM9cqda2rJE+iblQhIMYY49LfvW4kaEjoFbTTQ4Go8G96Smj2w3BRTwA8IHGoi9dPOPGAX63dhuv19UqA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-ia32@0.17.6: - resolution: {integrity: sha512-ujp8uoQCM9FRcbDfkqECoARsLnLfCUhKARTP56TFPog8ie9JG83D5GVKjQ6yVrEVdMie1djH86fm98eY3quQkQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.16.3: - resolution: {integrity: sha512-hIbeejCOyO0X9ujfIIOKjBjNAs9XD/YdJ9JXAy1lHA+8UXuOqbFe4ErMCqMr8dhlMGBuvcQYGF7+kO7waj2KHw==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-loong64@0.17.6: - resolution: {integrity: sha512-y2NX1+X/Nt+izj9bLoiaYB9YXT/LoaQFYvCkVD77G/4F+/yuVXYCWz4SE9yr5CBMbOxOfBcy/xFL4LlOeNlzYQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.16.3: - resolution: {integrity: sha512-znFRzICT/V8VZQMt6rjb21MtAVJv/3dmKRMlohlShrbVXdBuOdDrGb+C2cZGQAR8RFyRe7HS6klmHq103WpmVw==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-mips64el@0.17.6: - resolution: {integrity: sha512-09AXKB1HDOzXD+j3FdXCiL/MWmZP0Ex9eR8DLMBVcHorrWJxWmY8Nms2Nm41iRM64WVx7bA/JVHMv081iP2kUA==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true + postcss: ^8.2 + dependencies: + postcss: 8.4.30 + postcss-value-parser: 4.2.0 + dev: false - /@esbuild/linux-ppc64@0.16.3: - resolution: {integrity: sha512-EV7LuEybxhXrVTDpbqWF2yehYRNz5e5p+u3oQUS2+ZFpknyi1NXxr8URk4ykR8Efm7iu04//4sBg249yNOwy5Q==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - optional: true + /@csstools/postcss-ic-unit@1.0.1(postcss@8.4.30): + resolution: {integrity: sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.30) + postcss: 8.4.30 + postcss-value-parser: 4.2.0 + dev: false - /@esbuild/linux-ppc64@0.17.6: - resolution: {integrity: sha512-AmLhMzkM8JuqTIOhxnX4ubh0XWJIznEynRnZAVdA2mMKE6FAfwT2TWKTwdqMG+qEaeyDPtfNoZRpJbD4ZBv0Tg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true + /@csstools/postcss-is-pseudo-class@2.0.7(postcss@8.4.30): + resolution: {integrity: sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.0.11) + postcss: 8.4.30 + postcss-selector-parser: 6.0.11 + dev: false - /@esbuild/linux-riscv64@0.16.3: - resolution: {integrity: sha512-uDxqFOcLzFIJ+r/pkTTSE9lsCEaV/Y6rMlQjUI9BkzASEChYL/aSQjZjchtEmdnVxDKETnUAmsaZ4pqK1eE5BQ==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - optional: true + /@csstools/postcss-nested-calc@1.0.0(postcss@8.4.30): + resolution: {integrity: sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.30 + postcss-value-parser: 4.2.0 + dev: false - /@esbuild/linux-riscv64@0.17.6: - resolution: {integrity: sha512-Y4Ri62PfavhLQhFbqucysHOmRamlTVK10zPWlqjNbj2XMea+BOs4w6ASKwQwAiqf9ZqcY9Ab7NOU4wIgpxwoSQ==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true + /@csstools/postcss-normalize-display-values@1.0.1(postcss@8.4.30): + resolution: {integrity: sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.30 + postcss-value-parser: 4.2.0 + dev: false - /@esbuild/linux-s390x@0.16.3: - resolution: {integrity: sha512-NbeREhzSxYwFhnCAQOQZmajsPYtX71Ufej3IQ8W2Gxskfz9DK58ENEju4SbpIj48VenktRASC52N5Fhyf/aliQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - optional: true + /@csstools/postcss-oklab-function@1.1.1(postcss@8.4.30): + resolution: {integrity: sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.30) + postcss: 8.4.30 + postcss-value-parser: 4.2.0 + dev: false - /@esbuild/linux-s390x@0.17.6: - resolution: {integrity: sha512-SPUiz4fDbnNEm3JSdUW8pBJ/vkop3M1YwZAVwvdwlFLoJwKEZ9L98l3tzeyMzq27CyepDQ3Qgoba44StgbiN5Q==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true + /@csstools/postcss-progressive-custom-properties@1.3.0(postcss@8.4.30): + resolution: {integrity: sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.3 + dependencies: + postcss: 8.4.30 + postcss-value-parser: 4.2.0 + dev: false - /@esbuild/linux-x64@0.16.3: - resolution: {integrity: sha512-SDiG0nCixYO9JgpehoKgScwic7vXXndfasjnD5DLbp1xltANzqZ425l7LSdHynt19UWOcDjG9wJJzSElsPvk0w==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - optional: true + /@csstools/postcss-stepped-value-functions@1.0.1(postcss@8.4.30): + resolution: {integrity: sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.30 + postcss-value-parser: 4.2.0 + dev: false - /@esbuild/linux-x64@0.17.6: - resolution: {integrity: sha512-a3yHLmOodHrzuNgdpB7peFGPx1iJ2x6m+uDvhP2CKdr2CwOaqEFMeSqYAHU7hG+RjCq8r2NFujcd/YsEsFgTGw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true + /@csstools/postcss-text-decoration-shorthand@1.0.0(postcss@8.4.30): + resolution: {integrity: sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.30 + postcss-value-parser: 4.2.0 + dev: false - /@esbuild/netbsd-x64@0.16.3: - resolution: {integrity: sha512-AzbsJqiHEq1I/tUvOfAzCY15h4/7Ivp3ff/o1GpP16n48JMNAtbW0qui2WCgoIZArEHD0SUQ95gvR0oSO7ZbdA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - optional: true + /@csstools/postcss-trigonometric-functions@1.0.2(postcss@8.4.30): + resolution: {integrity: sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==} + engines: {node: ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.30 + postcss-value-parser: 4.2.0 + dev: false - /@esbuild/netbsd-x64@0.17.6: - resolution: {integrity: sha512-EanJqcU/4uZIBreTrnbnre2DXgXSa+Gjap7ifRfllpmyAU7YMvaXmljdArptTHmjrkkKm9BK6GH5D5Yo+p6y5A==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true + /@csstools/postcss-unset-value@1.0.2(postcss@8.4.30): + resolution: {integrity: sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.30 + dev: false - /@esbuild/openbsd-x64@0.16.3: - resolution: {integrity: sha512-gSABi8qHl8k3Cbi/4toAzHiykuBuWLZs43JomTcXkjMZVkp0gj3gg9mO+9HJW/8GB5H89RX/V0QP4JGL7YEEVg==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - optional: true + /@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.0.11): + resolution: {integrity: sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss-selector-parser: ^6.0.10 + dependencies: + postcss-selector-parser: 6.0.11 + dev: false - /@esbuild/openbsd-x64@0.17.6: - resolution: {integrity: sha512-xaxeSunhQRsTNGFanoOkkLtnmMn5QbA0qBhNet/XLVsc+OVkpIWPHcr3zTW2gxVU5YOHFbIHR9ODuaUdNza2Vw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true + /@ctrl/tinycolor@3.6.0: + resolution: {integrity: sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==} + engines: {node: '>=10'} - /@esbuild/sunos-x64@0.16.3: - resolution: {integrity: sha512-SF9Kch5Ete4reovvRO6yNjMxrvlfT0F0Flm+NPoUw5Z4Q3r1d23LFTgaLwm3Cp0iGbrU/MoUI+ZqwCv5XJijCw==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - optional: true + /@discoveryjs/json-ext@0.5.7: + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} - /@esbuild/sunos-x64@0.17.6: - resolution: {integrity: sha512-gnMnMPg5pfMkZvhHee21KbKdc6W3GR8/JuE0Da1kjwpK6oiFU3nqfHuVPgUX2rsOx9N2SadSQTIYV1CIjYG+xw==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true + /@edge-runtime/cookies@3.4.1: + resolution: {integrity: sha512-z27BvgPxI73CgSlxU/NAUf1Q/shnqi6cobHEowf6VuLdSjGR3NjI2Y5dZUIBbK2zOJVZbXcHsVzJjz8LklteFQ==} + engines: {node: '>=16'} dev: true - optional: true - /@esbuild/win32-arm64@0.16.3: - resolution: {integrity: sha512-u5aBonZIyGopAZyOnoPAA6fGsDeHByZ9CnEzyML9NqntK6D/xl5jteZUKm/p6nD09+v3pTM6TuUIqSPcChk5gg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - optional: true + /@edge-runtime/format@2.2.0: + resolution: {integrity: sha512-gPrS6AVw/qJJL0vcxMXv4kFXCU3ZTCD1uuJpwX15YxHV8BgU9OG5v9LrkkXcr96PBT/9epypfNJMhlWADuEziw==} + engines: {node: '>=16'} + dev: true - /@esbuild/win32-arm64@0.17.6: - resolution: {integrity: sha512-G95n7vP1UnGJPsVdKXllAJPtqjMvFYbN20e8RK8LVLhlTiSOH1sd7+Gt7rm70xiG+I5tM58nYgwWrLs6I1jHqg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true + /@edge-runtime/node-utils@2.2.1: + resolution: {integrity: sha512-RUl/439BHKshkhSGFRlZ1kzy68wL4mn8VNKDSZr3p0tciyZ33Mjfpl+vofqnHqXRmDI6nLnZpfJvhY3D88o0pA==} + engines: {node: '>=16'} + dependencies: + '@edge-runtime/cookies': 3.4.1 dev: true - optional: true - /@esbuild/win32-ia32@0.16.3: - resolution: {integrity: sha512-GlgVq1WpvOEhNioh74TKelwla9KDuAaLZrdxuuUgsP2vayxeLgVc+rbpIv0IYF4+tlIzq2vRhofV+KGLD+37EQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - optional: true + /@edge-runtime/primitives@3.1.1: + resolution: {integrity: sha512-ROO22py+KdAfzqWZu6CtVMC4qV6mS0W1jPI51jGXE+uenyBUN7cQTWB9ReQc8Bm4cnjqmhajvpqEx3j7Y9iSOg==} + engines: {node: '>=16'} + dev: true - /@esbuild/win32-ia32@0.17.6: - resolution: {integrity: sha512-96yEFzLhq5bv9jJo5JhTs1gI+1cKQ83cUpyxHuGqXVwQtY5Eq54ZEsKs8veKtiKwlrNimtckHEkj4mRh4pPjsg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true + /@edge-runtime/vm@3.1.1: + resolution: {integrity: sha512-6NJRRG04/91qnWLZj+wZm27q6fJkTbkZdIJdo/Ig++GTxkAv8Wh/45nIcz9Xg7AzIAMpAkflFdiCrCoZ3hp1Iw==} + engines: {node: '>=16'} + dependencies: + '@edge-runtime/primitives': 3.1.1 dev: true - optional: true - /@esbuild/win32-x64@0.16.3: - resolution: {integrity: sha512-5/JuTd8OWW8UzEtyf19fbrtMJENza+C9JoPIkvItgTBQ1FO2ZLvjbPO6Xs54vk0s5JB5QsfieUEshRQfu7ZHow==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - optional: true + /@emotion/hash@0.8.0: + resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} - /@esbuild/win32-x64@0.17.6: - resolution: {integrity: sha512-n6d8MOyUrNp6G4VSpRcgjs5xj4A91svJSaiwLIDWVWEsZtpN5FA9NlBbZHDmAJc2e8e6SF4tkBD3HAvPF+7igA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true + /@emotion/unitless@0.7.5: + resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} - /@eslint-community/eslint-utils@4.4.0(eslint@8.38.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.29.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.38.0 + eslint: 8.29.0 eslint-visitor-keys: 3.4.0 dev: false @@ -3838,28 +4120,6 @@ packages: transitivePeerDependencies: - supports-color - /@eslint/eslintrc@2.0.2: - resolution: {integrity: sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.5.1 - globals: 13.20.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@eslint/js@8.38.0: - resolution: {integrity: sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: false - /@fastify/busboy@1.2.1: resolution: {integrity: sha512-7PQA7EH43S0CxcOa9OeAnaeA0oQ+e/DHNPZwSQM9CQHW76jle5+OvLdibRp/Aafs9KXbLhxyjOTkRjWUbQEd3Q==} engines: {node: '>=14'} @@ -3867,103 +4127,104 @@ packages: text-decoding: 1.0.0 dev: false - /@firebase/analytics-compat@0.2.5(@firebase/app-compat@0.2.7)(@firebase/app@0.9.7): - resolution: {integrity: sha512-ohKUrwSoXvyUJdSLuDr82mOqrzgWKyHMUt9/TfYKkyDXnFjNlBcFBpkpl/UHMAOJe0M60YYXiVCZoGQYldCslA==} + /@firebase/analytics-compat@0.2.6(@firebase/app-compat@0.2.19)(@firebase/app@0.9.19): + resolution: {integrity: sha512-4MqpVLFkGK7NJf/5wPEEP7ePBJatwYpyjgJ+wQHQGHfzaCDgntOnl9rL2vbVGGKCnRqWtZDIWhctB86UWXaX2Q==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/analytics': 0.9.5(@firebase/app@0.9.7) + '@firebase/analytics': 0.10.0(@firebase/app@0.9.19) '@firebase/analytics-types': 0.8.0 - '@firebase/app-compat': 0.2.7 + '@firebase/app-compat': 0.2.19 '@firebase/component': 0.6.4 '@firebase/util': 1.9.3 - tslib: 2.5.0 + tslib: 2.6.2 transitivePeerDependencies: - '@firebase/app' /@firebase/analytics-types@0.8.0: resolution: {integrity: sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw==} - /@firebase/analytics@0.9.5(@firebase/app@0.9.7): - resolution: {integrity: sha512-hJTVs2jLxPXE7hs7D/jaEsgGivrm7tSEl65kb5NkDBWV7QQBUnRfVML/xra9nTFLLJhAdbExZPHg6HfIuMSYEQ==} + /@firebase/analytics@0.10.0(@firebase/app@0.9.19): + resolution: {integrity: sha512-Locv8gAqx0e+GX/0SI3dzmBY5e9kjVDtD+3zCFLJ0tH2hJwuCAiL+5WkHuxKj92rqQj/rvkBUCfA1ewlX2hehg==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.9.7 + '@firebase/app': 0.9.19 '@firebase/component': 0.6.4 - '@firebase/installations': 0.6.4(@firebase/app@0.9.7) + '@firebase/installations': 0.6.4(@firebase/app@0.9.19) '@firebase/logger': 0.4.0 '@firebase/util': 1.9.3 - tslib: 2.5.0 + tslib: 2.6.2 - /@firebase/app-check-compat@0.3.4(@firebase/app-compat@0.2.7)(@firebase/app@0.9.7): - resolution: {integrity: sha512-s6ON0ixPKe99M1DNYMI2eR5aLwQZgy0z8fuW1tnEbzg5p/N/GKFmqiIHSV4gfp8+X7Fw5NLm7qMfh4xrcPgQCw==} + /@firebase/app-check-compat@0.3.7(@firebase/app-compat@0.2.19)(@firebase/app@0.9.19): + resolution: {integrity: sha512-cW682AxsyP1G+Z0/P7pO/WT2CzYlNxoNe5QejVarW2o5ZxeWSSPAiVEwpEpQR/bUlUmdeWThYTMvBWaopdBsqw==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-check': 0.6.4(@firebase/app@0.9.7) + '@firebase/app-check': 0.8.0(@firebase/app@0.9.19) '@firebase/app-check-types': 0.5.0 - '@firebase/app-compat': 0.2.7 + '@firebase/app-compat': 0.2.19 '@firebase/component': 0.6.4 '@firebase/logger': 0.4.0 '@firebase/util': 1.9.3 - tslib: 2.5.0 + tslib: 2.6.2 transitivePeerDependencies: - '@firebase/app' - /@firebase/app-check-interop-types@0.2.0: - resolution: {integrity: sha512-+3PQIeX6/eiVK+x/yg8r6xTNR97fN7MahFDm+jiQmDjcyvSefoGuTTNQuuMScGyx3vYUBeZn+Cp9kC0yY/9uxQ==} + /@firebase/app-check-interop-types@0.3.0: + resolution: {integrity: sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg==} /@firebase/app-check-types@0.5.0: resolution: {integrity: sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ==} - /@firebase/app-check@0.6.4(@firebase/app@0.9.7): - resolution: {integrity: sha512-M9qyVTWkEkHXmgwGtObvXQqKcOe9iKAOPqm0pCe74mzgKVTNq157ff39+fxHPb4nFbipToY+GuvtabLUzkHehQ==} + /@firebase/app-check@0.8.0(@firebase/app@0.9.19): + resolution: {integrity: sha512-dRDnhkcaC2FspMiRK/Vbp+PfsOAEP6ZElGm9iGFJ9fDqHoPs0HOPn7dwpJ51lCFi1+2/7n5pRPGhqF/F03I97g==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.9.7 + '@firebase/app': 0.9.19 '@firebase/component': 0.6.4 '@firebase/logger': 0.4.0 '@firebase/util': 1.9.3 - tslib: 2.5.0 + tslib: 2.6.2 - /@firebase/app-compat@0.2.7: - resolution: {integrity: sha512-KYBUKoRrvSGW8jqKgARRsma0lJie9M0zyWhPF3PNjqc9pYsw7SZXp5s5SzsheeCXzIDFydP5uEA4f1Z87D7CxQ==} + /@firebase/app-compat@0.2.19: + resolution: {integrity: sha512-QkJDqYqjhvs4fTMcRVXQkP9hbo5yfoJXDWkhU4VA5Vzs8Qsp76VPzYbqx5SD5OmBy+bz/Ot1UV8qySPGI4aKuw==} dependencies: - '@firebase/app': 0.9.7 + '@firebase/app': 0.9.19 '@firebase/component': 0.6.4 '@firebase/logger': 0.4.0 '@firebase/util': 1.9.3 - tslib: 2.5.0 + tslib: 2.6.2 /@firebase/app-types@0.9.0: resolution: {integrity: sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==} - /@firebase/app@0.9.7: - resolution: {integrity: sha512-ADnRXaW4XQF11QYYhZQEJEtOGnmLkGl2FCixCxPighLrmJmGwCZrzSFtwITd8w/EU3dRYaU5Og37VfnY+gKxGw==} + /@firebase/app@0.9.19: + resolution: {integrity: sha512-t/SHyZ3xWkR77ZU9VMoobDNFLdDKQ5xqoCAn4o16gTsA1C8sJ6ZOMZ02neMOPxNHuQXVE4tA8ukilnDbnK7uJA==} dependencies: '@firebase/component': 0.6.4 '@firebase/logger': 0.4.0 '@firebase/util': 1.9.3 - idb: 7.0.1 - tslib: 2.5.0 + idb: 7.1.1 + tslib: 2.6.2 - /@firebase/auth-compat@0.3.7(@firebase/app-compat@0.2.7)(@firebase/app-types@0.9.0)(@firebase/app@0.9.7): - resolution: {integrity: sha512-+r8/++hYZLA/to6Iq8A70LTUsZvhkdT2R4mB4oJGxryJ7vNjpuP5m5hfAd42h/VvX8eT1OXJCENCfEZoDyhksA==} + /@firebase/auth-compat@0.4.6(@firebase/app-compat@0.2.19)(@firebase/app-types@0.9.0)(@firebase/app@0.9.19): + resolution: {integrity: sha512-pKp1d4fSf+yoy1EBjTx9ISxlunqhW0vTICk0ByZ3e+Lp6ZIXThfUy4F1hAJlEafD/arM0oepRiAh7LXS1xn/BA==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.2.7 - '@firebase/auth': 0.22.0(@firebase/app@0.9.7) + '@firebase/app-compat': 0.2.19 + '@firebase/auth': 1.3.0(@firebase/app@0.9.19) '@firebase/auth-types': 0.12.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.3) '@firebase/component': 0.6.4 '@firebase/util': 1.9.3 node-fetch: 2.6.7 - tslib: 2.5.0 + tslib: 2.6.2 transitivePeerDependencies: - '@firebase/app' - '@firebase/app-types' + - '@react-native-async-storage/async-storage' - encoding /@firebase/auth-interop-types@0.2.1: @@ -3978,17 +4239,21 @@ packages: '@firebase/app-types': 0.9.0 '@firebase/util': 1.9.3 - /@firebase/auth@0.22.0(@firebase/app@0.9.7): - resolution: {integrity: sha512-4PiaDJEhJ7FNo48WG0TAlqHiCuRBXxUow2q+0emh+PhmM0cLT1UdqK1EuWWGc5CY+ztNQZUh+Yzeh+nv9tZL0w==} + /@firebase/auth@1.3.0(@firebase/app@0.9.19): + resolution: {integrity: sha512-vjK4CHbY9aWdiVOrKi6mpa8z6uxeaf7LB/MZTHuZOiGHMcUoTGB6TeMbRShyqk1uaMrxhhZ5Ar/dR0965E1qyA==} peerDependencies: '@firebase/app': 0.x + '@react-native-async-storage/async-storage': ^1.18.1 + peerDependenciesMeta: + '@react-native-async-storage/async-storage': + optional: true dependencies: - '@firebase/app': 0.9.7 + '@firebase/app': 0.9.19 '@firebase/component': 0.6.4 '@firebase/logger': 0.4.0 '@firebase/util': 1.9.3 node-fetch: 2.6.7 - tslib: 2.5.0 + tslib: 2.6.2 transitivePeerDependencies: - encoding @@ -3996,7 +4261,7 @@ packages: resolution: {integrity: sha512-rLMyrXuO9jcAUCaQXCMjCMUsWrba5fzHlNK24xz5j2W6A/SRmK8mZJ/hn7V0fViLbxC0lPMtrK1eYzk6Fg03jA==} dependencies: '@firebase/util': 1.9.3 - tslib: 2.5.0 + tslib: 2.6.2 /@firebase/database-compat@0.3.4: resolution: {integrity: sha512-kuAW+l+sLMUKBThnvxvUZ+Q1ZrF/vFJ58iUY9kAcbX48U03nVzIF6Tmkf0p3WVQwMqiXguSgtOPIB6ZCeF+5Gg==} @@ -4006,42 +4271,71 @@ packages: '@firebase/database-types': 0.10.4 '@firebase/logger': 0.4.0 '@firebase/util': 1.9.3 - tslib: 2.5.0 + tslib: 2.6.2 + dev: false + + /@firebase/database-compat@1.0.1: + resolution: {integrity: sha512-ky82yLIboLxtAIWyW/52a6HLMVTzD2kpZlEilVDok73pNPLjkJYowj8iaIWK5nTy7+6Gxt7d00zfjL6zckGdXQ==} + dependencies: + '@firebase/component': 0.6.4 + '@firebase/database': 1.0.1 + '@firebase/database-types': 1.0.0 + '@firebase/logger': 0.4.0 + '@firebase/util': 1.9.3 + tslib: 2.6.2 /@firebase/database-types@0.10.4: resolution: {integrity: sha512-dPySn0vJ/89ZeBac70T+2tWWPiJXWbmRygYv0smT5TfE3hDrQ09eKMF3Y+vMlTdrMWq7mUdYW5REWPSGH4kAZQ==} dependencies: '@firebase/app-types': 0.9.0 '@firebase/util': 1.9.3 + dev: false + + /@firebase/database-types@1.0.0: + resolution: {integrity: sha512-SjnXStoE0Q56HcFgNQ+9SsmJc0c8TqGARdI/T44KXy+Ets3r6x/ivhQozT66bMnCEjJRywYoxNurRTMlZF8VNg==} + dependencies: + '@firebase/app-types': 0.9.0 + '@firebase/util': 1.9.3 + + /@firebase/database@0.14.4: + resolution: {integrity: sha512-+Ea/IKGwh42jwdjCyzTmeZeLM3oy1h0mFPsTy6OqCWzcu/KFqRAr5Tt1HRCOBlNOdbh84JPZC47WLU18n2VbxQ==} + dependencies: + '@firebase/auth-interop-types': 0.2.1 + '@firebase/component': 0.6.4 + '@firebase/logger': 0.4.0 + '@firebase/util': 1.9.3 + faye-websocket: 0.11.4 + tslib: 2.6.2 + dev: false - /@firebase/database@0.14.4: - resolution: {integrity: sha512-+Ea/IKGwh42jwdjCyzTmeZeLM3oy1h0mFPsTy6OqCWzcu/KFqRAr5Tt1HRCOBlNOdbh84JPZC47WLU18n2VbxQ==} + /@firebase/database@1.0.1: + resolution: {integrity: sha512-VAhF7gYwunW4Lw/+RQZvW8dlsf2r0YYqV9W0Gi2Mz8+0TGg1mBJWoUtsHfOr8kPJXhcLsC4eP/z3x6L/Fvjk/A==} dependencies: '@firebase/auth-interop-types': 0.2.1 '@firebase/component': 0.6.4 '@firebase/logger': 0.4.0 '@firebase/util': 1.9.3 faye-websocket: 0.11.4 - tslib: 2.5.0 + tslib: 2.6.2 - /@firebase/firestore-compat@0.3.6(@firebase/app-compat@0.2.7)(@firebase/app-types@0.9.0)(@firebase/app@0.9.7): - resolution: {integrity: sha512-svS8oV0nwTyoHW5mslFV0gRb3FLpRQGjz2F7nc5imnPUTjSJmAfXECtgs5HG5MSJM/laSimfAeGuQVh5FM1AEw==} + /@firebase/firestore-compat@0.3.18(@firebase/app-compat@0.2.19)(@firebase/app-types@0.9.0)(@firebase/app@0.9.19): + resolution: {integrity: sha512-hkqv4mb1oScKbEtzfcK8Go8c0VpDWmbAvbD6B6XnphLqi27pkXgo9Rp+aSKlD7cBL29VMEekP5bEm9lSVfZpNw==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.2.7 + '@firebase/app-compat': 0.2.19 '@firebase/component': 0.6.4 - '@firebase/firestore': 3.10.0(@firebase/app@0.9.7) - '@firebase/firestore-types': 2.5.1(@firebase/app-types@0.9.0)(@firebase/util@1.9.3) + '@firebase/firestore': 4.2.0(@firebase/app@0.9.19) + '@firebase/firestore-types': 3.0.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.3) '@firebase/util': 1.9.3 - tslib: 2.5.0 + tslib: 2.6.2 transitivePeerDependencies: - '@firebase/app' - '@firebase/app-types' - encoding - /@firebase/firestore-types@2.5.1(@firebase/app-types@0.9.0)(@firebase/util@1.9.3): - resolution: {integrity: sha512-xG0CA6EMfYo8YeUxC8FeDzf6W3FX1cLlcAGBYV6Cku12sZRI81oWcu61RSKM66K6kUENP+78Qm8mvroBcm1whw==} + /@firebase/firestore-types@3.0.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.3): + resolution: {integrity: sha512-Meg4cIezHo9zLamw0ymFYBD4SMjLb+ZXIbuN7T7ddXN6MGoICmOTq3/ltdCGoDCS2u+H1XJs2u/cYp75jsX9Qw==} peerDependencies: '@firebase/app-types': 0.x '@firebase/util': 1.x @@ -4049,35 +4343,35 @@ packages: '@firebase/app-types': 0.9.0 '@firebase/util': 1.9.3 - /@firebase/firestore@3.10.0(@firebase/app@0.9.7): - resolution: {integrity: sha512-St6yy2r7zYxJiAEiI19aQJqxVV8LDvlmeK52R9KMn2nZsgdDVOurch1cH7bBl0OxEgfiVxBmAQJLYvZc+qwAgw==} + /@firebase/firestore@4.2.0(@firebase/app@0.9.19): + resolution: {integrity: sha512-iKZqIdOBJpJUcwY5airLX0W04TLrQSJuActOP1HG5WoIY5oyGTQE4Ml7hl5GW7mBqFieT4ojtUuDXj6MLrn1lA==} engines: {node: '>=10.10.0'} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.9.7 + '@firebase/app': 0.9.19 '@firebase/component': 0.6.4 '@firebase/logger': 0.4.0 '@firebase/util': 1.9.3 - '@firebase/webchannel-wrapper': 0.9.0 - '@grpc/grpc-js': 1.7.3 - '@grpc/proto-loader': 0.6.13 + '@firebase/webchannel-wrapper': 0.10.3 + '@grpc/grpc-js': 1.9.3 + '@grpc/proto-loader': 0.7.10 node-fetch: 2.6.7 - tslib: 2.5.0 + tslib: 2.6.2 transitivePeerDependencies: - encoding - /@firebase/functions-compat@0.3.4(@firebase/app-compat@0.2.7)(@firebase/app@0.9.7): - resolution: {integrity: sha512-kxVxTGyLV1MBR3sp3mI+eQ6JBqz0G5bk310F8eX4HzDFk4xjk5xY0KdHktMH+edM2xs1BOg0vwvvsAHczIjB+w==} + /@firebase/functions-compat@0.3.5(@firebase/app-compat@0.2.19)(@firebase/app@0.9.19): + resolution: {integrity: sha512-uD4jwgwVqdWf6uc3NRKF8cSZ0JwGqSlyhPgackyUPe+GAtnERpS4+Vr66g0b3Gge0ezG4iyHo/EXW/Hjx7QhHw==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.2.7 + '@firebase/app-compat': 0.2.19 '@firebase/component': 0.6.4 - '@firebase/functions': 0.9.4(@firebase/app@0.9.7) + '@firebase/functions': 0.10.0(@firebase/app@0.9.19) '@firebase/functions-types': 0.6.0 '@firebase/util': 1.9.3 - tslib: 2.5.0 + tslib: 2.6.2 transitivePeerDependencies: - '@firebase/app' - encoding @@ -4085,33 +4379,33 @@ packages: /@firebase/functions-types@0.6.0: resolution: {integrity: sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw==} - /@firebase/functions@0.9.4(@firebase/app@0.9.7): - resolution: {integrity: sha512-3H2qh6U+q+nepO5Hds+Ddl6J0pS+zisuBLqqQMRBHv9XpWfu0PnDHklNmE8rZ+ccTEXvBj6zjkPfdxt6NisvlQ==} + /@firebase/functions@0.10.0(@firebase/app@0.9.19): + resolution: {integrity: sha512-2U+fMNxTYhtwSpkkR6WbBcuNMOVaI7MaH3cZ6UAeNfj7AgEwHwMIFLPpC13YNZhno219F0lfxzTAA0N62ndWzA==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.9.7 - '@firebase/app-check-interop-types': 0.2.0 + '@firebase/app': 0.9.19 + '@firebase/app-check-interop-types': 0.3.0 '@firebase/auth-interop-types': 0.2.1 '@firebase/component': 0.6.4 '@firebase/messaging-interop-types': 0.2.0 '@firebase/util': 1.9.3 node-fetch: 2.6.7 - tslib: 2.5.0 + tslib: 2.6.2 transitivePeerDependencies: - encoding - /@firebase/installations-compat@0.2.4(@firebase/app-compat@0.2.7)(@firebase/app-types@0.9.0)(@firebase/app@0.9.7): + /@firebase/installations-compat@0.2.4(@firebase/app-compat@0.2.19)(@firebase/app-types@0.9.0)(@firebase/app@0.9.19): resolution: {integrity: sha512-LI9dYjp0aT9Njkn9U4JRrDqQ6KXeAmFbRC0E7jI7+hxl5YmRWysq5qgQl22hcWpTk+cm3es66d/apoDU/A9n6Q==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.2.7 + '@firebase/app-compat': 0.2.19 '@firebase/component': 0.6.4 - '@firebase/installations': 0.6.4(@firebase/app@0.9.7) + '@firebase/installations': 0.6.4(@firebase/app@0.9.19) '@firebase/installations-types': 0.5.0(@firebase/app-types@0.9.0) '@firebase/util': 1.9.3 - tslib: 2.5.0 + tslib: 2.6.2 transitivePeerDependencies: - '@firebase/app' - '@firebase/app-types' @@ -4123,122 +4417,122 @@ packages: dependencies: '@firebase/app-types': 0.9.0 - /@firebase/installations@0.6.4(@firebase/app@0.9.7): + /@firebase/installations@0.6.4(@firebase/app@0.9.19): resolution: {integrity: sha512-u5y88rtsp7NYkCHC3ElbFBrPtieUybZluXyzl7+4BsIz4sqb4vSAuwHEUgCgCeaQhvsnxDEU6icly8U9zsJigA==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.9.7 + '@firebase/app': 0.9.19 '@firebase/component': 0.6.4 '@firebase/util': 1.9.3 idb: 7.0.1 - tslib: 2.5.0 + tslib: 2.6.2 /@firebase/logger@0.4.0: resolution: {integrity: sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==} dependencies: - tslib: 2.5.0 + tslib: 2.6.2 - /@firebase/messaging-compat@0.2.4(@firebase/app-compat@0.2.7)(@firebase/app@0.9.7): + /@firebase/messaging-compat@0.2.4(@firebase/app-compat@0.2.19)(@firebase/app@0.9.19): resolution: {integrity: sha512-lyFjeUhIsPRYDPNIkYX1LcZMpoVbBWXX4rPl7c/rqc7G+EUea7IEtSt4MxTvh6fDfPuzLn7+FZADfscC+tNMfg==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.2.7 + '@firebase/app-compat': 0.2.19 '@firebase/component': 0.6.4 - '@firebase/messaging': 0.12.4(@firebase/app@0.9.7) + '@firebase/messaging': 0.12.4(@firebase/app@0.9.19) '@firebase/util': 1.9.3 - tslib: 2.5.0 + tslib: 2.6.2 transitivePeerDependencies: - '@firebase/app' /@firebase/messaging-interop-types@0.2.0: resolution: {integrity: sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ==} - /@firebase/messaging@0.12.4(@firebase/app@0.9.7): + /@firebase/messaging@0.12.4(@firebase/app@0.9.19): resolution: {integrity: sha512-6JLZct6zUaex4g7HI3QbzeUrg9xcnmDAPTWpkoMpd/GoSVWH98zDoWXMGrcvHeCAIsLpFMe4MPoZkJbrPhaASw==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.9.7 + '@firebase/app': 0.9.19 '@firebase/component': 0.6.4 - '@firebase/installations': 0.6.4(@firebase/app@0.9.7) + '@firebase/installations': 0.6.4(@firebase/app@0.9.19) '@firebase/messaging-interop-types': 0.2.0 '@firebase/util': 1.9.3 idb: 7.0.1 - tslib: 2.5.0 + tslib: 2.6.2 - /@firebase/performance-compat@0.2.4(@firebase/app-compat@0.2.7)(@firebase/app@0.9.7): + /@firebase/performance-compat@0.2.4(@firebase/app-compat@0.2.19)(@firebase/app@0.9.19): resolution: {integrity: sha512-nnHUb8uP9G8islzcld/k6Bg5RhX62VpbAb/Anj7IXs/hp32Eb2LqFPZK4sy3pKkBUO5wcrlRWQa6wKOxqlUqsg==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.2.7 + '@firebase/app-compat': 0.2.19 '@firebase/component': 0.6.4 '@firebase/logger': 0.4.0 - '@firebase/performance': 0.6.4(@firebase/app@0.9.7) + '@firebase/performance': 0.6.4(@firebase/app@0.9.19) '@firebase/performance-types': 0.2.0 '@firebase/util': 1.9.3 - tslib: 2.5.0 + tslib: 2.6.2 transitivePeerDependencies: - '@firebase/app' /@firebase/performance-types@0.2.0: resolution: {integrity: sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA==} - /@firebase/performance@0.6.4(@firebase/app@0.9.7): + /@firebase/performance@0.6.4(@firebase/app@0.9.19): resolution: {integrity: sha512-HfTn/bd8mfy/61vEqaBelNiNnvAbUtME2S25A67Nb34zVuCSCRIX4SseXY6zBnOFj3oLisaEqhVcJmVPAej67g==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.9.7 + '@firebase/app': 0.9.19 '@firebase/component': 0.6.4 - '@firebase/installations': 0.6.4(@firebase/app@0.9.7) + '@firebase/installations': 0.6.4(@firebase/app@0.9.19) '@firebase/logger': 0.4.0 '@firebase/util': 1.9.3 - tslib: 2.5.0 + tslib: 2.6.2 - /@firebase/remote-config-compat@0.2.4(@firebase/app-compat@0.2.7)(@firebase/app@0.9.7): + /@firebase/remote-config-compat@0.2.4(@firebase/app-compat@0.2.19)(@firebase/app@0.9.19): resolution: {integrity: sha512-FKiki53jZirrDFkBHglB3C07j5wBpitAaj8kLME6g8Mx+aq7u9P7qfmuSRytiOItADhWUj7O1JIv7n9q87SuwA==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.2.7 + '@firebase/app-compat': 0.2.19 '@firebase/component': 0.6.4 '@firebase/logger': 0.4.0 - '@firebase/remote-config': 0.4.4(@firebase/app@0.9.7) + '@firebase/remote-config': 0.4.4(@firebase/app@0.9.19) '@firebase/remote-config-types': 0.3.0 '@firebase/util': 1.9.3 - tslib: 2.5.0 + tslib: 2.6.2 transitivePeerDependencies: - '@firebase/app' /@firebase/remote-config-types@0.3.0: resolution: {integrity: sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA==} - /@firebase/remote-config@0.4.4(@firebase/app@0.9.7): + /@firebase/remote-config@0.4.4(@firebase/app@0.9.19): resolution: {integrity: sha512-x1ioTHGX8ZwDSTOVp8PBLv2/wfwKzb4pxi0gFezS5GCJwbLlloUH4YYZHHS83IPxnua8b6l0IXUaWd0RgbWwzQ==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.9.7 + '@firebase/app': 0.9.19 '@firebase/component': 0.6.4 - '@firebase/installations': 0.6.4(@firebase/app@0.9.7) + '@firebase/installations': 0.6.4(@firebase/app@0.9.19) '@firebase/logger': 0.4.0 '@firebase/util': 1.9.3 - tslib: 2.5.0 + tslib: 2.6.2 - /@firebase/storage-compat@0.3.2(@firebase/app-compat@0.2.7)(@firebase/app-types@0.9.0)(@firebase/app@0.9.7): + /@firebase/storage-compat@0.3.2(@firebase/app-compat@0.2.19)(@firebase/app-types@0.9.0)(@firebase/app@0.9.19): resolution: {integrity: sha512-wvsXlLa9DVOMQJckbDNhXKKxRNNewyUhhbXev3t8kSgoCotd1v3MmqhKKz93ePhDnhHnDs7bYHy+Qa8dRY6BXw==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.2.7 + '@firebase/app-compat': 0.2.19 '@firebase/component': 0.6.4 - '@firebase/storage': 0.11.2(@firebase/app@0.9.7) + '@firebase/storage': 0.11.2(@firebase/app@0.9.19) '@firebase/storage-types': 0.8.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.3) '@firebase/util': 1.9.3 - tslib: 2.5.0 + tslib: 2.6.2 transitivePeerDependencies: - '@firebase/app' - '@firebase/app-types' @@ -4253,26 +4547,26 @@ packages: '@firebase/app-types': 0.9.0 '@firebase/util': 1.9.3 - /@firebase/storage@0.11.2(@firebase/app@0.9.7): + /@firebase/storage@0.11.2(@firebase/app@0.9.19): resolution: {integrity: sha512-CtvoFaBI4hGXlXbaCHf8humajkbXhs39Nbh6MbNxtwJiCqxPy9iH3D3CCfXAvP0QvAAwmJUTK3+z9a++Kc4nkA==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.9.7 + '@firebase/app': 0.9.19 '@firebase/component': 0.6.4 '@firebase/util': 1.9.3 node-fetch: 2.6.7 - tslib: 2.5.0 + tslib: 2.6.2 transitivePeerDependencies: - encoding /@firebase/util@1.9.3: resolution: {integrity: sha512-DY02CRhOZwpzO36fHpuVysz6JZrscPiBXD0fXp6qSrL9oNOx5KWICKdR95C0lSITzxp0TZosVyHqzatE8JbcjA==} dependencies: - tslib: 2.5.0 + tslib: 2.6.2 - /@firebase/webchannel-wrapper@0.9.0: - resolution: {integrity: sha512-BpiZLBWdLFw+qFel9p3Zs1jD6QmH7Ii4aTDu6+vx8ShdidChZUXqDhYJly4ZjSgQh54miXbBgBrk0S+jTIh/Qg==} + /@firebase/webchannel-wrapper@0.10.3: + resolution: {integrity: sha512-+ZplYUN3HOpgCfgInqgdDAbkGGVzES1cs32JJpeqoh87SkRobGXElJx+1GZSaDqzFL+bYiX18qEcBK76mYs8uA==} /@fontsource/inter@4.5.15: resolution: {integrity: sha512-FzleM9AxZQK2nqsTDtBiY0PMEVWvnKnuu2i09+p6DHvrHsuucoV2j0tmw+kAT3L4hvsLdAIDv6MdGehsPIdT+Q==} @@ -4285,15 +4579,15 @@ packages: /@gar/promisify@1.1.3: resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} - /@google-cloud/firestore@6.5.0: - resolution: {integrity: sha512-U0QwG6pEQxO5c0v0eUylswozmuvlvz7iXSW+I18jzqR2hAFrUq2Weu1wm3NaH8wGD4ZL7W9Be4cMHG5CYU8LuQ==} + /@google-cloud/firestore@6.7.0: + resolution: {integrity: sha512-bkH2jb5KkQSUa+NAvpip9HQ+rpYhi77IaqHovWuN07adVmvNXX08gPpvPWEzoXYa/wDjEVI7LiAtCWkJJEYTNg==} engines: {node: '>=12.0.0'} requiresBuild: true dependencies: fast-deep-equal: 3.1.3 functional-red-black-tree: 1.0.1 google-gax: 3.6.0 - protobufjs: 7.2.3 + protobufjs: 7.2.5 transitivePeerDependencies: - encoding - supports-color @@ -4359,31 +4653,30 @@ packages: dev: false optional: true - /@grpc/grpc-js@1.7.3: - resolution: {integrity: sha512-H9l79u4kJ2PVSxUNA08HMYAnUBLj9v6KjYQ7SQ71hOZcEXhShE/y5iQCesP8+6/Ik/7i2O0a10bPquIcYfufog==} + /@grpc/grpc-js@1.8.13: + resolution: {integrity: sha512-iY3jsdfbc0ARoCLFvbvUB8optgyb0r1XLPb142u+QtgBcKJYkCIFt3Fd/881KqjLYWjsBJF57N3b8Eop9NDfUA==} engines: {node: ^8.13.0 || >=10.10.0} dependencies: '@grpc/proto-loader': 0.7.6 '@types/node': 18.15.11 + dev: false - /@grpc/grpc-js@1.8.13: - resolution: {integrity: sha512-iY3jsdfbc0ARoCLFvbvUB8optgyb0r1XLPb142u+QtgBcKJYkCIFt3Fd/881KqjLYWjsBJF57N3b8Eop9NDfUA==} + /@grpc/grpc-js@1.9.3: + resolution: {integrity: sha512-b8iWtdrYIeT5fdZdS4Br/6h/kuk0PW5EVBUGk1amSbrpL8DlktJD43CdcCWwRdd6+jgwHhADSbL9CsNnm6EUPA==} engines: {node: ^8.13.0 || >=10.10.0} dependencies: - '@grpc/proto-loader': 0.7.6 + '@grpc/proto-loader': 0.7.10 '@types/node': 18.15.11 - dev: false - /@grpc/proto-loader@0.6.13: - resolution: {integrity: sha512-FjxPYDRTn6Ec3V0arm1FtSpmP6V50wuph2yILpyvTKzjc76oDdoihXqM1DzOW5ubvCC8GivfCnNtfaRE8myJ7g==} + /@grpc/proto-loader@0.7.10: + resolution: {integrity: sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==} engines: {node: '>=6'} hasBin: true dependencies: - '@types/long': 4.0.2 lodash.camelcase: 4.3.0 - long: 4.0.0 - protobufjs: 6.11.3 - yargs: 16.2.0 + long: 5.2.1 + protobufjs: 7.2.5 + yargs: 17.7.2 /@grpc/proto-loader@0.7.6: resolution: {integrity: sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==} @@ -4393,8 +4686,9 @@ packages: '@types/long': 4.0.2 lodash.camelcase: 4.3.0 long: 4.0.0 - protobufjs: 7.2.4 + protobufjs: 7.2.5 yargs: 16.2.0 + dev: false /@humanwhocodes/config-array@0.10.7: resolution: {integrity: sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==} @@ -4475,14 +4769,25 @@ packages: resolution: {integrity: sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.5.0 + '@jest/types': 29.6.3 '@types/node': 18.15.11 chalk: 4.1.2 - jest-message-util: 29.5.0 - jest-util: 29.5.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 slash: 3.0.0 dev: true + /@jest/console@29.7.0: + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 18.15.11 + chalk: 4.1.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + /@jest/core@27.5.1(ts-node@10.8.2): resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -4584,7 +4889,7 @@ packages: '@jest/reporters': 29.5.0 '@jest/test-result': 29.5.0 '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 + '@jest/types': 29.6.3 '@types/node': 18.15.11 ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -4601,7 +4906,7 @@ packages: jest-runner: 29.5.0 jest-runtime: 29.5.0 jest-snapshot: 29.5.0 - jest-util: 29.5.0 + jest-util: 29.7.0 jest-validate: 29.5.0 jest-watcher: 29.5.0 micromatch: 4.0.5 @@ -4609,10 +4914,53 @@ packages: slash: 3.0.0 strip-ansi: 6.0.1 transitivePeerDependencies: + - babel-plugin-macros - supports-color - ts-node dev: true + /@jest/core@29.7.0(ts-node@10.8.2): + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.15.11 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.8.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + /@jest/environment@27.5.1: resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -4643,6 +4991,15 @@ packages: jest-mock: 29.5.0 dev: true + /@jest/environment@29.7.0: + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.15.11 + jest-mock: 29.7.0 + /@jest/expect-utils@28.1.3: resolution: {integrity: sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -4654,9 +5011,15 @@ packages: resolution: {integrity: sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - jest-get-type: 29.4.3 + jest-get-type: 29.6.3 dev: true + /@jest/expect-utils@29.7.0: + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.6.3 + /@jest/expect@28.1.3: resolution: {integrity: sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -4677,6 +5040,15 @@ packages: - supports-color dev: true + /@jest/expect@29.7.0: + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + /@jest/fake-timers@27.5.1: resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -4705,14 +5077,25 @@ packages: resolution: {integrity: sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.5.0 + '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.0.2 '@types/node': 18.15.11 - jest-message-util: 29.5.0 + jest-message-util: 29.7.0 jest-mock: 29.5.0 - jest-util: 29.5.0 + jest-util: 29.7.0 dev: true + /@jest/fake-timers@29.7.0: + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.0.2 + '@types/node': 18.15.11 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + /@jest/globals@27.5.1: resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -4745,6 +5128,17 @@ packages: - supports-color dev: true + /@jest/globals@29.7.0: + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 + transitivePeerDependencies: + - supports-color + /@jest/reporters@27.5.1: resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -4831,10 +5225,10 @@ packages: optional: true dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.5.0 - '@jest/test-result': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.18 '@types/node': 18.15.11 chalk: 4.1.2 @@ -4847,9 +5241,9 @@ packages: istanbul-lib-report: 3.0.0 istanbul-lib-source-maps: 4.0.1 istanbul-reports: 3.1.5 - jest-message-util: 29.5.0 - jest-util: 29.5.0 - jest-worker: 29.5.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 slash: 3.0.0 string-length: 4.0.2 strip-ansi: 6.0.1 @@ -4858,6 +5252,42 @@ packages: - supports-color dev: true + /@jest/reporters@29.7.0: + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.18 + '@types/node': 18.15.11 + chalk: 4.1.2 + collect-v8-coverage: 1.0.1 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 6.0.0 + istanbul-lib-report: 3.0.0 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.5 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.1.0 + transitivePeerDependencies: + - supports-color + /@jest/schemas@28.1.3: resolution: {integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -4871,6 +5301,12 @@ packages: '@sinclair/typebox': 0.25.24 dev: true + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + /@jest/source-map@27.5.1: resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -4898,6 +5334,14 @@ packages: graceful-fs: 4.2.11 dev: true + /@jest/source-map@29.6.3: + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jridgewell/trace-mapping': 0.3.18 + callsites: 3.1.0 + graceful-fs: 4.2.11 + /@jest/test-result@27.5.1: resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -4921,12 +5365,21 @@ packages: resolution: {integrity: sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/console': 29.5.0 - '@jest/types': 29.5.0 + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 '@types/istanbul-lib-coverage': 2.0.4 collect-v8-coverage: 1.0.1 dev: true + /@jest/test-result@29.7.0: + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.1 + /@jest/test-sequencer@27.5.1: resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -4949,15 +5402,14 @@ packages: slash: 3.0.0 dev: true - /@jest/test-sequencer@29.5.0: - resolution: {integrity: sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==} + /@jest/test-sequencer@29.7.0: + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/test-result': 29.5.0 + '@jest/test-result': 29.7.0 graceful-fs: 4.2.11 - jest-haste-map: 29.5.0 + jest-haste-map: 29.7.0 slash: 3.0.0 - dev: true /@jest/transform@27.5.1: resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} @@ -5010,16 +5462,16 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/core': 7.21.4 - '@jest/types': 29.5.0 + '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.18 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.11 - jest-haste-map: 29.5.0 - jest-regex-util: 29.4.3 - jest-util: 29.5.0 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 micromatch: 4.0.5 pirates: 4.0.5 slash: 3.0.0 @@ -5028,6 +5480,28 @@ packages: - supports-color dev: true + /@jest/transform@29.7.0: + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.21.4 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.18 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.5 + pirates: 4.0.5 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + /@jest/types@27.5.1: resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -5062,6 +5536,17 @@ packages: chalk: 4.1.2 dev: true + /@jest/types@29.6.3: + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 18.15.11 + '@types/yargs': 17.0.24 + chalk: 4.1.2 + /@jitsu/sdk-js@3.1.5: resolution: {integrity: sha512-e7P8uvGBNwWCC864MItcYSv0IT2+nwYiX8QXZ0lfyG8hutEXXX9Yt2/+MynXuGxMIoIrJ+j0bWVu20k9rrhxSg==} dev: true @@ -5122,6 +5607,11 @@ packages: resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} dev: false + /@ljharb/through@2.3.9: + resolution: {integrity: sha512-yN599ZBuMPPK4tdoToLlvgJB4CLK8fGl7ntfy0Wn7U6ttNvHYurd81bfUiK/6sMkiIwm65R6ck4L6+Y3DfVbNQ==} + engines: {node: '>= 0.4'} + dev: true + /@loadable/component@5.15.3(react@18.2.0): resolution: {integrity: sha512-VOgYgCABn6+/7aGIpg7m0Ruj34tGetaJzt4bQ345FwEovDQZ+dua+NWLmuJKv8rWZyxOUSfoJkmGnzyDXH2BAQ==} engines: {node: '>=8'} @@ -5153,7 +5643,7 @@ packages: detect-libc: 2.0.1 https-proxy-agent: 5.0.1 make-dir: 3.1.0 - node-fetch: 2.6.9 + node-fetch: 2.7.0 nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 @@ -5186,6 +5676,14 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@mongodb-js/saslprep@1.1.0: + resolution: {integrity: sha512-Xfijy7HvfzzqiOAhAepF4SGN5e9leLkMvg/OPOF97XemjfVCYN/oWa75wnkc6mltMSTwY+XlbhWgUOJmkFspSw==} + requiresBuild: true + dependencies: + sparse-bitfield: 3.0.3 + dev: false + optional: true + /@nangohq/frontend@0.21.11: resolution: {integrity: sha512-oNOqM8gZhRaaHt63zyaWxsWi3pip4a78S9IzstEBVvUUzEFOU3+ys0r3TmyQCbA1veaAZjzeMyq+LtZem/Nt9g==} dev: false @@ -5556,13 +6054,6 @@ packages: dependencies: json-parse-even-better-errors: 2.3.1 - /@npmcli/package-json@2.0.0: - resolution: {integrity: sha512-42jnZ6yl16GzjWSH7vtrmWyJDGVa/LXPdpN2rcUWolFjc9ON2N3uz0qdBbQACfmhuJZ2lbKYtmK5qx68ZPLHMA==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - json-parse-even-better-errors: 2.3.1 - dev: true - /@npmcli/promise-spawn@1.3.2: resolution: {integrity: sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==} dependencies: @@ -5654,7 +6145,7 @@ packages: '@octokit/request-error': 2.1.0 '@octokit/types': 6.41.0 is-plain-object: 5.0.0 - node-fetch: 2.6.9 + node-fetch: 2.7.0 universal-user-agent: 6.0.0 transitivePeerDependencies: - encoding @@ -5687,7 +6178,7 @@ packages: open: 8.4.2 picocolors: 1.0.0 tiny-glob: 0.2.9 - tslib: 2.5.0 + tslib: 2.6.2 dev: true /@playwright/test@1.31.2: @@ -5701,7 +6192,7 @@ packages: fsevents: 2.3.2 dev: true - /@pmmmwh/react-refresh-webpack-plugin@0.5.10(react-refresh@0.11.0)(webpack-dev-server@4.13.2)(webpack@5.78.0): + /@pmmmwh/react-refresh-webpack-plugin@0.5.10(react-refresh@0.11.0)(webpack-dev-server@4.13.2)(webpack@5.88.2): resolution: {integrity: sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==} engines: {node: '>= 10.13'} peerDependencies: @@ -5735,10 +6226,10 @@ packages: html-entities: 2.3.3 loader-utils: 2.0.4 react-refresh: 0.11.0 - schema-utils: 3.1.1 + schema-utils: 3.3.0 source-map: 0.7.4 - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) - webpack-dev-server: 4.13.2(webpack@5.78.0) + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack-dev-server: 4.13.2(webpack@5.88.2) dev: false /@prisma/client@4.12.0(prisma@4.12.0): @@ -5891,19 +6382,7 @@ packages: /@remix-run/router@1.5.0: resolution: {integrity: sha512-bkUDCp8o1MvFO+qxkODcbhSqRa6P2GXgrGZVpt0dCXNW2HCSCqYI0ZoAqEOSAjRWmmlKcYgFvN4B4S+zo/f8kg==} engines: {node: '>=14'} - - /@remix-run/server-runtime@1.15.0: - resolution: {integrity: sha512-DL9xjHfYYrEcOq5VbhYtrjJUWo/nFQAT7Y+Np/oC55HokyU6cb2jGhl52nx96aAxKwaFCse5N90GeodFsRzX7w==} - engines: {node: '>=14'} - dependencies: - '@remix-run/router': 1.5.0 - '@types/cookie': 0.4.1 - '@types/react': 18.0.28 - '@web3-storage/multipart-parser': 1.0.0 - cookie: 0.4.2 - set-cookie-parser: 2.6.0 - source-map: 0.7.4 - dev: true + dev: false /@rjsf/antd@5.10.0(@ant-design/icons@5.0.1)(@rjsf/core@5.10.0)(@rjsf/utils@5.10.0)(antd@5.4.2)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-dj0BVL/g2wtrvNxnlya069H8M9hoserMTEWtRtutLf99nsmiargCei34OhM+MxkKkk+c8SsSv5DlEqPiUa+Low==} @@ -5994,7 +6473,7 @@ packages: optional: true dependencies: '@babel/core': 7.21.4 - '@babel/helper-module-imports': 7.21.4 + '@babel/helper-module-imports': 7.22.15 '@rollup/pluginutils': 3.1.0(rollup@2.79.1) rollup: 2.79.1 dev: false @@ -6070,6 +6549,24 @@ packages: rollup: 2.78.0 dev: false + /@rollup/plugin-commonjs@25.0.4(rollup@3.29.1): + resolution: {integrity: sha512-L92Vz9WUZXDnlQQl3EwbypJR4+DM2EbsO+/KOcEkP4Mc6Ct453EeDB2uH9lgRwj4w5yflgNpq9pHOiY8aoUXBQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.68.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.2(rollup@3.29.1) + commondir: 1.0.1 + estree-walker: 2.0.2 + glob: 8.1.0 + is-reference: 1.2.1 + magic-string: 0.27.0 + rollup: 3.29.1 + dev: true + /@rollup/plugin-json@4.1.0(rollup@1.32.1): resolution: {integrity: sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==} peerDependencies: @@ -6092,6 +6589,19 @@ packages: rollup: 3.20.2 dev: true + /@rollup/plugin-json@6.0.0(rollup@3.29.1): + resolution: {integrity: sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.2(rollup@3.29.1) + rollup: 3.29.1 + dev: true + /@rollup/plugin-multi-entry@6.0.0(rollup@3.20.2): resolution: {integrity: sha512-msBgVncGQwh/ahxeP/rc8MXVZNBOjoVCsBuDk6uqyFzDv/SZN7jksfAsu6DJ2w4r5PaBX3/OXOjVPeCxya2waA==} engines: {node: '>=14.0.0'} @@ -6139,6 +6649,24 @@ packages: rollup: 3.20.2 dev: true + /@rollup/plugin-node-resolve@15.2.1(rollup@3.29.1): + resolution: {integrity: sha512-nsbUg588+GDSu8/NS8T4UAshO6xeaOfINNuXeVHcKV02LJtoRaM1SiOacClw4kws1SFiNhdLGxlbMY9ga/zs/w==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.2(rollup@3.29.1) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-builtin-module: 3.2.1 + is-module: 1.0.0 + resolve: 1.22.2 + rollup: 3.29.1 + dev: true + /@rollup/plugin-node-resolve@6.1.0(rollup@1.32.1): resolution: {integrity: sha512-Cv7PDIvxdE40SWilY5WgZpqfIUEaDxFxs89zCAHjqyRwlTSuql4M5hjIuc5QYJkOH0/vyiyNXKD72O+LhRipGA==} engines: {node: '>= 8.0.0'} @@ -6181,13 +6709,48 @@ packages: resolution: {integrity: sha512-N2KK+qUfHX2hBzVzM41UWGLrEmcjVC37spC8R3c9mt3oEDFKh3N2e12/lLp9aVSt86veR0TQiCNQXrm8C6aiUQ==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^2.x || ^3.x + rollup: ^2.x || ^3.x + peerDependenciesMeta: + rollup: + optional: true + dependencies: + rollup: 3.20.2 + terser: 5.16.9 + dev: true + + /@rollup/plugin-terser@0.4.3(rollup@3.29.1): + resolution: {integrity: sha512-EF0oejTMtkyhrkwCdg0HJ0IpkcaVg1MMSf2olHb2Jp+1mnLM04OhjpJWGma4HobiDTF0WCyViWuvadyE9ch2XA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.x || ^3.x + peerDependenciesMeta: + rollup: + optional: true + dependencies: + rollup: 3.29.1 + serialize-javascript: 6.0.1 + smob: 1.4.0 + terser: 5.19.4 + dev: true + + /@rollup/plugin-typescript@11.1.3(rollup@3.29.1)(tslib@2.6.2)(typescript@5.2.2): + resolution: {integrity: sha512-8o6cNgN44kQBcpsUJTbTXMTtb87oR1O0zgP3Dxm71hrNgparap3VujgofEilTYJo+ivf2ke6uy3/E5QEaiRlDA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.14.0||^3.0.0 + tslib: '*' + typescript: '>=3.7.0' peerDependenciesMeta: rollup: optional: true + tslib: + optional: true dependencies: - rollup: 3.20.2 - terser: 5.16.9 + '@rollup/pluginutils': 5.0.2(rollup@3.29.1) + resolve: 1.22.2 + rollup: 3.29.1 + tslib: 2.6.2 + typescript: 5.2.2 dev: true /@rollup/plugin-typescript@9.0.2(rollup@3.20.2)(tslib@2.5.0)(typescript@4.9.5): @@ -6284,6 +6847,21 @@ packages: rollup: 3.20.2 dev: true + /@rollup/pluginutils@5.0.2(rollup@3.29.1): + resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.1 + estree-walker: 2.0.2 + picomatch: 2.3.1 + rollup: 3.29.1 + dev: true + /@rushstack/eslint-patch@1.2.0: resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==} @@ -6292,7 +6870,7 @@ packages: dependencies: '@lukeed/uuid': 2.0.1 dset: 3.1.2 - tslib: 2.5.0 + tslib: 2.6.2 dev: true /@segment/analytics-next@1.51.3: @@ -6305,9 +6883,9 @@ packages: '@segment/tsub': 1.0.1 dset: 3.1.2 js-cookie: 3.0.1 - node-fetch: 2.6.9 + node-fetch: 2.7.0 spark-md5: 3.0.2 - tslib: 2.5.0 + tslib: 2.6.2 unfetch: 4.2.0 transitivePeerDependencies: - encoding @@ -6357,30 +6935,30 @@ packages: kafkajs: ^1.16.0 || ^2.0.2 dependencies: kafkajs: 2.2.4 - tslib: 2.5.0 + tslib: 2.6.2 zstd-napi: 0.0.6 dev: false - /@sentry-internal/tracing@7.57.0: - resolution: {integrity: sha512-tpViyDd8AhQGYYhI94xi2aaDopXOPfL2Apwrtb3qirWkomIQ2K86W1mPmkce+B0cFOnW2Dxv/ZTFKz6ghjK75A==} + /@sentry-internal/tracing@7.70.0: + resolution: {integrity: sha512-SpbE6wZhs6QwG2ORWCt8r28o1T949qkWx/KeRTCdK4Ub95PQ3Y3DgnqD8Wz//3q50Wt6EZDEibmz4t067g6PPg==} engines: {node: '>=8'} dependencies: - '@sentry/core': 7.57.0 - '@sentry/types': 7.57.0 - '@sentry/utils': 7.57.0 - tslib: 2.5.0 + '@sentry/core': 7.70.0 + '@sentry/types': 7.70.0 + '@sentry/utils': 7.70.0 + tslib: 2.6.2 dev: false - /@sentry/browser@7.57.0: - resolution: {integrity: sha512-E0HaYYlaqHFiIRZXxcvOO8Odvlt+TR1vFFXzqUWXPOvDRxURglTOCQ3EN/u6bxtAGJ6y/Zc2obgihTtypuel/w==} + /@sentry/browser@7.70.0: + resolution: {integrity: sha512-PB+IP49/TLcnDHCj9eJ5tcHE0pzXg23wBakmF3KGMSd5nxEbUvmOsaFPZcgUUlL9JlU3v1Y40We7HdPStrY6oA==} engines: {node: '>=8'} dependencies: - '@sentry-internal/tracing': 7.57.0 - '@sentry/core': 7.57.0 - '@sentry/replay': 7.57.0 - '@sentry/types': 7.57.0 - '@sentry/utils': 7.57.0 - tslib: 2.5.0 + '@sentry-internal/tracing': 7.70.0 + '@sentry/core': 7.70.0 + '@sentry/replay': 7.70.0 + '@sentry/types': 7.70.0 + '@sentry/utils': 7.70.0 + tslib: 2.6.2 dev: false /@sentry/cli@1.75.2: @@ -6389,184 +6967,603 @@ packages: hasBin: true requiresBuild: true dependencies: - https-proxy-agent: 5.0.1 - mkdirp: 0.5.6 - node-fetch: 2.6.9 - progress: 2.0.3 - proxy-from-env: 1.1.0 - which: 2.0.2 - transitivePeerDependencies: - - encoding - - supports-color + https-proxy-agent: 5.0.1 + mkdirp: 0.5.6 + node-fetch: 2.7.0 + progress: 2.0.3 + proxy-from-env: 1.1.0 + which: 2.0.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@sentry/core@7.70.0: + resolution: {integrity: sha512-voUsGVM+jwRp99AQYFnRvr7sVd2tUhIMj1L6F42LtD3vp7t5ZnKp3NpXagtFW2vWzXESfyJUBhM0qI/bFvn7ZA==} + engines: {node: '>=8'} + dependencies: + '@sentry/types': 7.70.0 + '@sentry/utils': 7.70.0 + tslib: 2.6.2 + dev: false + + /@sentry/integrations@7.70.0: + resolution: {integrity: sha512-ffIEuiElROzl4IpYX0O7vtPaadXVycPtyjq86YTHjd2TUFcYuQTPBm5UjEVE0/sSNNCdfWYxNThU/fVyq93l1g==} + engines: {node: '>=8'} + dependencies: + '@sentry/types': 7.70.0 + '@sentry/utils': 7.70.0 + localforage: 1.10.0 + tslib: 2.6.2 + dev: false + + /@sentry/nextjs@7.70.0(next@13.3.0)(react@18.2.0)(webpack@5.88.2): + resolution: {integrity: sha512-Mpto8+LY4ZohRUOy1KJIM6r0oAJ+vo/lVAYXtO3L1rgSIcKD422XqBvJAQIQhQjru1/FpWVdOd2BKl+gD1emFw==} + engines: {node: '>=8'} + peerDependencies: + next: ^10.0.8 || ^11.0 || ^12.0 || ^13.0 + react: 16.x || 17.x || 18.x + webpack: '>= 4.0.0' + peerDependenciesMeta: + webpack: + optional: true + dependencies: + '@rollup/plugin-commonjs': 24.0.0(rollup@2.78.0) + '@sentry/core': 7.70.0 + '@sentry/integrations': 7.70.0 + '@sentry/node': 7.70.0 + '@sentry/react': 7.70.0(react@18.2.0) + '@sentry/types': 7.70.0 + '@sentry/utils': 7.70.0 + '@sentry/vercel-edge': 7.70.0 + '@sentry/webpack-plugin': 1.20.0 + chalk: 3.0.0 + next: 13.3.0(@babel/core@7.21.4)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + rollup: 2.78.0 + stacktrace-parser: 0.1.10 + tslib: 2.6.2 + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@sentry/node@7.70.0: + resolution: {integrity: sha512-GeGlnu3QnJX0GN2FvZ3E31e48ZhRzEpREyC0Wa4BRvYHnyiGvsQjo/0RKeq6vvlggRhVnuoMg/jESyUmdntrAA==} + engines: {node: '>=8'} + dependencies: + '@sentry-internal/tracing': 7.70.0 + '@sentry/core': 7.70.0 + '@sentry/types': 7.70.0 + '@sentry/utils': 7.70.0 + cookie: 0.5.0 + https-proxy-agent: 5.0.1 + lru_map: 0.3.3 + tslib: 2.6.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@sentry/react@7.70.0(react@18.2.0): + resolution: {integrity: sha512-oFd1NEG6S3nczZY8ZFQdEY9ZOfgOvJT1KRoXaSaBIC1KjL0+ngX9TKg+eiYxvI0euxnY5jCwozbA0NsDXqwN7A==} + engines: {node: '>=8'} + peerDependencies: + react: 15.x || 16.x || 17.x || 18.x + dependencies: + '@sentry/browser': 7.70.0 + '@sentry/types': 7.70.0 + '@sentry/utils': 7.70.0 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /@sentry/replay@7.70.0: + resolution: {integrity: sha512-XjnyE6ORREz9kBWWHdXaIjS9P2Wo7uEw+y23vfLQwzV0Nx3xJ+FG4dwf8onyIoeCZDKbz7cqQIbugU1gkgUtZw==} + engines: {node: '>=12'} + dependencies: + '@sentry/core': 7.70.0 + '@sentry/types': 7.70.0 + '@sentry/utils': 7.70.0 + dev: false + + /@sentry/types@7.70.0: + resolution: {integrity: sha512-rY4DqpiDBtXSk4MDNBH3dwWqfPbNBI/9GA7Y5WJSIcObBtfBKp0fzYliHJZD0pgM7d4DPFrDn42K9Iiumgymkw==} + engines: {node: '>=8'} + dev: false + + /@sentry/utils@7.70.0: + resolution: {integrity: sha512-0cChMH0lsGp+5I3D4wOHWwjFN19HVrGUs7iWTLTO5St3EaVbdeLbI1vFXHxMxvopbwgpeZafbreHw/loIdZKpw==} + engines: {node: '>=8'} + dependencies: + '@sentry/types': 7.70.0 + tslib: 2.6.2 + dev: false + + /@sentry/vercel-edge@7.70.0: + resolution: {integrity: sha512-YveyP23ALodINciALKPyw6zDflujGCywzOKh249WzVkO4/3MkFstk82luuPWIbn3Aba4L7MqUB8xHZQANw/dMw==} + engines: {node: '>=8'} + dependencies: + '@sentry/core': 7.70.0 + '@sentry/types': 7.70.0 + '@sentry/utils': 7.70.0 + tslib: 2.6.2 + dev: false + + /@sentry/webpack-plugin@1.20.0: + resolution: {integrity: sha512-Ssj1mJVFsfU6vMCOM2d+h+KQR7QHSfeIP16t4l20Uq/neqWXZUQ2yvQfe4S3BjdbJXz/X4Rw8Hfy1Sd0ocunYw==} + engines: {node: '>= 8'} + dependencies: + '@sentry/cli': 1.75.2 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@sinclair/typebox@0.24.51: + resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} + + /@sinclair/typebox@0.25.24: + resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} + dev: true + + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + /@sinonjs/commons@1.8.6: + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + dependencies: + type-detect: 4.0.8 + + /@sinonjs/commons@2.0.0: + resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} + dependencies: + type-detect: 4.0.8 + + /@sinonjs/fake-timers@10.0.2: + resolution: {integrity: sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==} + dependencies: + '@sinonjs/commons': 2.0.0 + + /@sinonjs/fake-timers@8.1.0: + resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} + dependencies: + '@sinonjs/commons': 1.8.6 + dev: false + + /@sinonjs/fake-timers@9.1.2: + resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==} + dependencies: + '@sinonjs/commons': 1.8.6 + dev: true + + /@smithy/abort-controller@2.0.9: + resolution: {integrity: sha512-8liHOEbx99xcy4VndeQNQhyA0LS+e7UqsuRnDTSIA26IKBv/7vA9w09KOd4fgNULrvX0r3WpA6cwsQTRJpSWkg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.3.3 + tslib: 2.6.2 + dev: false + + /@smithy/chunked-blob-reader-native@2.0.0: + resolution: {integrity: sha512-HM8V2Rp1y8+1343tkZUKZllFhEQPNmpNdgFAncbTsxkZ18/gqjk23XXv3qGyXWp412f3o43ZZ1UZHVcHrpRnCQ==} + dependencies: + '@smithy/util-base64': 2.0.0 + tslib: 2.6.2 + dev: false + + /@smithy/chunked-blob-reader@2.0.0: + resolution: {integrity: sha512-k+J4GHJsMSAIQPChGBrjEmGS+WbPonCXesoqP9fynIqjn7rdOThdH8FAeCmokP9mxTYKQAKoHCLPzNlm6gh7Wg==} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/config-resolver@2.0.10: + resolution: {integrity: sha512-MwToDsCltHjumkCuRn883qoNeJUawc2b8sX9caSn5vLz6J5crU1IklklNxWCaMO2z2nDL91Po4b/aI1eHv5PfA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/node-config-provider': 2.0.12 + '@smithy/types': 2.3.3 + '@smithy/util-config-provider': 2.0.0 + '@smithy/util-middleware': 2.0.2 + tslib: 2.6.2 + dev: false + + /@smithy/credential-provider-imds@2.0.12: + resolution: {integrity: sha512-S3lUNe+2fEFwKcmiQniXGPXt69vaHvQCw8kYQOBL4OvJsgwfpkIYDZdroHbTshYi0M6WaKL26Mw+hvgma6dZqA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/node-config-provider': 2.0.12 + '@smithy/property-provider': 2.0.10 + '@smithy/types': 2.3.3 + '@smithy/url-parser': 2.0.9 + tslib: 2.6.2 + dev: false + + /@smithy/eventstream-codec@2.0.9: + resolution: {integrity: sha512-sy0pcbKnawt1iu+qCoSFbs/h9PAaUgvlJEO3lqkE1HFFj4p5RgL98vH+9CyDoj6YY82cG5XsorFmcLqQJHTOYw==} + dependencies: + '@aws-crypto/crc32': 3.0.0 + '@smithy/types': 2.3.3 + '@smithy/util-hex-encoding': 2.0.0 + tslib: 2.6.2 + dev: false + + /@smithy/eventstream-serde-browser@2.0.9: + resolution: {integrity: sha512-g70enHZau2hGj1Uxedrn8AAjH9E7RnpHdwkuPKapagah53ztbwI7xaNeA5SLD4MjSjdrjathyQBCQKIzwXrR1g==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/eventstream-serde-universal': 2.0.9 + '@smithy/types': 2.3.3 + tslib: 2.6.2 + dev: false + + /@smithy/eventstream-serde-config-resolver@2.0.9: + resolution: {integrity: sha512-+15GzIMtdSuRPyuCeGZ7gzgD94Ejv6eM1vKcqvipdzS+i36KTZ2A9aZsJk+gDw//OCD1EMx9SqpV6bUvMS4PWg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.3.3 + tslib: 2.6.2 + dev: false + + /@smithy/eventstream-serde-node@2.0.9: + resolution: {integrity: sha512-UEJcvN2WXXEjkewtFkj1S2HSZLbyCgzUnfoFPrTuKy4+xRfakO5dNx6ws2h1pvb8Vc7mTuBL+Webl1R5mnVsXA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/eventstream-serde-universal': 2.0.9 + '@smithy/types': 2.3.3 + tslib: 2.6.2 + dev: false + + /@smithy/eventstream-serde-universal@2.0.9: + resolution: {integrity: sha512-dAHQEYlK/1tjjieBE7jjXwpLQFgKdkvC4HSQf+/Jj4t34XbUmXWHbw92/EuLp9+vjNB/JQPvkwpMtN31jxIDeg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/eventstream-codec': 2.0.9 + '@smithy/types': 2.3.3 + tslib: 2.6.2 + dev: false + + /@smithy/fetch-http-handler@2.1.5: + resolution: {integrity: sha512-BIeCHGfr5JCGN+EMTwZK74ELvjPXOIrI7OLM5OhZJJ6AmZyRv2S9ANJk18AtLwht0TsSm+8WoXIEp8LuxNgUyA==} + dependencies: + '@smithy/protocol-http': 3.0.5 + '@smithy/querystring-builder': 2.0.9 + '@smithy/types': 2.3.3 + '@smithy/util-base64': 2.0.0 + tslib: 2.6.2 + dev: false + + /@smithy/hash-blob-browser@2.0.9: + resolution: {integrity: sha512-JNWOV1ci9vIg4U82klNr07bZXsA6OCumqHugpvZdvvn6cNGwTa4rvpS5FpPcqKeh3Rdg1rr4h8g+X6zyOamnZw==} + dependencies: + '@smithy/chunked-blob-reader': 2.0.0 + '@smithy/chunked-blob-reader-native': 2.0.0 + '@smithy/types': 2.3.3 + tslib: 2.6.2 + dev: false + + /@smithy/hash-node@2.0.9: + resolution: {integrity: sha512-XP3yWd5wyCtiVmsY5Nuq/FUwyCEQ6YG7DsvRh7ThldNukGpCzyFdP8eivZJVjn4Fx7oYrrOnVoYZ0WEgpW1AvQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.3.3 + '@smithy/util-buffer-from': 2.0.0 + '@smithy/util-utf8': 2.0.0 + tslib: 2.6.2 + dev: false + + /@smithy/hash-stream-node@2.0.9: + resolution: {integrity: sha512-3nrkMpiOrhsJvJS6K4OkP0qvA3U5r8PpseXULeGd1ZD1EbfcZ30Lvl72FGaaHskwWZyTPR4czr1d/RwLRCVHNA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.3.3 + '@smithy/util-utf8': 2.0.0 + tslib: 2.6.2 + dev: false + + /@smithy/invalid-dependency@2.0.9: + resolution: {integrity: sha512-RuJqhYf8nViK96IIO9JbTtjDUuFItVfuuJhWw2yk7fv67yltQ7fZD6IQ2OsHHluoVmstnQJuCg5raXJR696Ubw==} + dependencies: + '@smithy/types': 2.3.3 + tslib: 2.6.2 + dev: false + + /@smithy/is-array-buffer@2.0.0: + resolution: {integrity: sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/md5-js@2.0.9: + resolution: {integrity: sha512-ALHGoTZDgBXBbjCpQzVy6hpa6Rdr6e2jyEw51d6CQOUpHkUnFH7G96UWhVwUnkP0xozPCvmWy+3+j2QUX+oK9w==} + dependencies: + '@smithy/types': 2.3.3 + '@smithy/util-utf8': 2.0.0 + tslib: 2.6.2 + dev: false + + /@smithy/middleware-content-length@2.0.11: + resolution: {integrity: sha512-Malj4voNTL4+a5ZL3a6+Ij7JTUMTa2R7c3ZIBzMxN5OUUgAspU7uFi1Q97f4B0afVh2joQBAWH5IQJUG25nl8g==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/protocol-http': 3.0.5 + '@smithy/types': 2.3.3 + tslib: 2.6.2 + dev: false + + /@smithy/middleware-endpoint@2.0.9: + resolution: {integrity: sha512-72/o8R6AAO4+nyTI6h4z6PYGTSA4dr1M7tZz29U8DEUHuh1YkhC77js0P6RyF9G0wDLuYqxb+Yh0crI5WG2pJg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/middleware-serde': 2.0.9 + '@smithy/types': 2.3.3 + '@smithy/url-parser': 2.0.9 + '@smithy/util-middleware': 2.0.2 + tslib: 2.6.2 + dev: false + + /@smithy/middleware-retry@2.0.12: + resolution: {integrity: sha512-YQ/ufXX4/d9/+Jf1QQ4J+CVeupC7BW52qldBTvRV33PDX9vxndlAwkFwzBcmnUFC3Hjf1//HW6I77EItcjNSCA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/node-config-provider': 2.0.12 + '@smithy/protocol-http': 3.0.5 + '@smithy/service-error-classification': 2.0.2 + '@smithy/types': 2.3.3 + '@smithy/util-middleware': 2.0.2 + '@smithy/util-retry': 2.0.2 + tslib: 2.6.2 + uuid: 8.3.2 + dev: false + + /@smithy/middleware-serde@2.0.9: + resolution: {integrity: sha512-GVbauxrr6WmtCaesakktg3t5LR/yDbajpC7KkWc8rtCpddMI4ShAVO5Q6DqwX8MDFi4CLaY8H7eTGcxhl3jbLg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.3.3 + tslib: 2.6.2 + dev: false + + /@smithy/middleware-stack@2.0.3: + resolution: {integrity: sha512-AlhPmbwpkC4lQBVaVHXczmjFvsAhDHhrakqLt038qFLotnJcvDLhmMzAtu23alBeOSkKxkTQq0LsAt2N0WpAbw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.3.3 + tslib: 2.6.2 + dev: false + + /@smithy/node-config-provider@2.0.12: + resolution: {integrity: sha512-df9y9ywv+JmS40Y60ZqJ4jfZiTCmyHQffwzIqjBjLJLJl0imf9F6DWBd+jiEWHvlohR+sFhyY+KL/qzKgnAq1A==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/property-provider': 2.0.10 + '@smithy/shared-ini-file-loader': 2.0.11 + '@smithy/types': 2.3.3 + tslib: 2.6.2 + dev: false + + /@smithy/node-http-handler@2.1.5: + resolution: {integrity: sha512-52uF+BrZaFiBh+NT/bADiVDCQO91T+OwDRsuaAeWZC1mlCXFjAPPQdxeQohtuYOe9m7mPP/xIMNiqbe8jvndHA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/abort-controller': 2.0.9 + '@smithy/protocol-http': 3.0.5 + '@smithy/querystring-builder': 2.0.9 + '@smithy/types': 2.3.3 + tslib: 2.6.2 + dev: false + + /@smithy/property-provider@2.0.10: + resolution: {integrity: sha512-YMBVfh0ZMmJtbsUn+WfSwR32iRljZPdRN0Tn2GAcdJ+ejX8WrBXD7Z0jIkQDrQZr8fEuuv5x8WxMIj+qVbsPQw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.3.3 + tslib: 2.6.2 + dev: false + + /@smithy/protocol-http@3.0.5: + resolution: {integrity: sha512-3t3fxj+ip4EPHRC2fQ0JimMxR/qCQ1LSQJjZZVZFgROnFLYWPDgUZqpoi7chr+EzatxJVXF/Rtoi5yLHOWCoZQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.3.3 + tslib: 2.6.2 + dev: false + + /@smithy/querystring-builder@2.0.9: + resolution: {integrity: sha512-Yt6CPF4j3j1cuwod/DRflbuXxBFjJm7gAjy6W1RE21Rz5/kfGFqiZBXWmmXwGtnnhiLThYwoHK4S6/TQtnx0Fg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.3.3 + '@smithy/util-uri-escape': 2.0.0 + tslib: 2.6.2 + dev: false + + /@smithy/querystring-parser@2.0.9: + resolution: {integrity: sha512-U6z4N743s4vrcxPW8p8+reLV0PjMCYEyb1/wtMVvv3VnbJ74gshdI8SR1sBnEh95cF8TxonmX5IxY25tS9qGfg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.3.3 + tslib: 2.6.2 + dev: false + + /@smithy/service-error-classification@2.0.2: + resolution: {integrity: sha512-GTUd2j63gKy7A+ggvSdn2hc4sejG7LWfE+ZMF17vzWoNyqERWbRP7HTPS0d0Lwg1p6OQCAzvNigSrEIWVFt6iA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.3.3 dev: false - /@sentry/core@7.57.0: - resolution: {integrity: sha512-l014NudPH0vQlzybtXajPxYFfs9w762NoarjObC3gu76D1jzBBFzhdRelkGpDbSLNTIsKhEDDRpgAjBWJ9icfw==} - engines: {node: '>=8'} + /@smithy/shared-ini-file-loader@2.0.11: + resolution: {integrity: sha512-Sf0u5C5px6eykXi6jImDTp+edvG3REtPjXnFWU/J+b7S2wkXwUqFXqBL5DdM4zC1F+M8u57ZT7NRqDwMOw7/Tw==} + engines: {node: '>=14.0.0'} dependencies: - '@sentry/types': 7.57.0 - '@sentry/utils': 7.57.0 - tslib: 2.5.0 + '@smithy/types': 2.3.3 + tslib: 2.6.2 dev: false - /@sentry/integrations@7.57.0: - resolution: {integrity: sha512-C3WZo5AGI2L0dj+mIjeZpdAwDEG2nDYvZbTzq5J9hVoHFdP3t7fOWBHSPkSFVtTdMaJrv+82aKnUefVCeAjxGg==} - engines: {node: '>=8'} + /@smithy/signature-v4@2.0.9: + resolution: {integrity: sha512-RkHP0joSI1j2EI+mU55sOi33/aMMkKdL9ZY+SWrPxsiCe1oyzzuy79Tpn8X7uT+t0ilNmQlwPpkP/jUy940pEA==} + engines: {node: '>=14.0.0'} dependencies: - '@sentry/types': 7.57.0 - '@sentry/utils': 7.57.0 - localforage: 1.10.0 - tslib: 2.5.0 + '@smithy/eventstream-codec': 2.0.9 + '@smithy/is-array-buffer': 2.0.0 + '@smithy/types': 2.3.3 + '@smithy/util-hex-encoding': 2.0.0 + '@smithy/util-middleware': 2.0.2 + '@smithy/util-uri-escape': 2.0.0 + '@smithy/util-utf8': 2.0.0 + tslib: 2.6.2 dev: false - /@sentry/nextjs@7.57.0(next@13.3.0)(react@18.2.0)(webpack@5.79.0): - resolution: {integrity: sha512-TH7Hhs833j1k2rM5K3AqiQ7+bxrTzANZazBLEK1YVec02PpnqflVuBHSdFxT6dG7ypxOpMkN36BN5INY5HHT0Q==} - engines: {node: '>=8'} - peerDependencies: - next: ^10.0.8 || ^11.0 || ^12.0 || ^13.0 - react: 16.x || 17.x || 18.x - webpack: '>= 4.0.0' - peerDependenciesMeta: - webpack: - optional: true + /@smithy/smithy-client@2.1.7: + resolution: {integrity: sha512-r6T/oiBQ8vCbGqObH4/h0YqD0jFB1hAS9KFRmuTfaNJueu/L2hjmjqFjv3PV5lkbNHTgUYraSv4cFQ1naxiELQ==} + engines: {node: '>=14.0.0'} dependencies: - '@rollup/plugin-commonjs': 24.0.0(rollup@2.78.0) - '@sentry/core': 7.57.0 - '@sentry/integrations': 7.57.0 - '@sentry/node': 7.57.0 - '@sentry/react': 7.57.0(react@18.2.0) - '@sentry/types': 7.57.0 - '@sentry/utils': 7.57.0 - '@sentry/webpack-plugin': 1.20.0 - chalk: 3.0.0 - next: 13.3.0(@babel/core@7.21.4)(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - rollup: 2.78.0 - stacktrace-parser: 0.1.10 - tslib: 2.5.0 - webpack: 5.79.0(esbuild@0.16.3) - transitivePeerDependencies: - - encoding - - supports-color + '@smithy/middleware-stack': 2.0.3 + '@smithy/types': 2.3.3 + '@smithy/util-stream': 2.0.12 + tslib: 2.6.2 dev: false - /@sentry/node@7.57.0: - resolution: {integrity: sha512-63mjyUVM6sfJFVQ5TGVRVGUsoEfESl5ABzIW1W0s9gUiQPaG8SOdaQJglb2VNrkMYxnRHgD8Q9LUh/qcmUyPGw==} - engines: {node: '>=8'} + /@smithy/types@2.3.3: + resolution: {integrity: sha512-zTdIPR9PvFVNRdIKMQu4M5oyTaycIbUqLheQqaOi9rTWPkgjGO2wDBxMA1rBHQB81aqAEv+DbSS4jfKyQMnXRA==} + engines: {node: '>=14.0.0'} dependencies: - '@sentry-internal/tracing': 7.57.0 - '@sentry/core': 7.57.0 - '@sentry/types': 7.57.0 - '@sentry/utils': 7.57.0 - cookie: 0.4.2 - https-proxy-agent: 5.0.1 - lru_map: 0.3.3 - tslib: 2.5.0 - transitivePeerDependencies: - - supports-color + tslib: 2.6.2 dev: false - /@sentry/react@7.57.0(react@18.2.0): - resolution: {integrity: sha512-XGNTjIoCG3naSmCU8qObd+y+CqAB6NQkGWOp2yyBwp2inyKF2ehJvDh6bIQloBYq2TmOJDa4NfXdMrkilxaLFQ==} - engines: {node: '>=8'} - peerDependencies: - react: 15.x || 16.x || 17.x || 18.x + /@smithy/url-parser@2.0.9: + resolution: {integrity: sha512-NBnJ0NiY8z6E82Xd5VYUFQfKwK/wA/+QkKmpYUYP+cpH3aCzE6g2gvixd9vQKYjsIdRfNPCf+SFAozt8ljozOw==} dependencies: - '@sentry/browser': 7.57.0 - '@sentry/types': 7.57.0 - '@sentry/utils': 7.57.0 - hoist-non-react-statics: 3.3.2 - react: 18.2.0 - tslib: 2.5.0 + '@smithy/querystring-parser': 2.0.9 + '@smithy/types': 2.3.3 + tslib: 2.6.2 dev: false - /@sentry/replay@7.57.0: - resolution: {integrity: sha512-pN4ryNS3J5EYbkXvR+O/+hseAJha7XDl8mPFtK0OGTHG10JzCi4tQJazblHQdpb5QBaMMPCeZ+isyfoQLDNXnw==} - engines: {node: '>=12'} + /@smithy/util-base64@2.0.0: + resolution: {integrity: sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==} + engines: {node: '>=14.0.0'} dependencies: - '@sentry/core': 7.57.0 - '@sentry/types': 7.57.0 - '@sentry/utils': 7.57.0 + '@smithy/util-buffer-from': 2.0.0 + tslib: 2.6.2 dev: false - /@sentry/types@7.57.0: - resolution: {integrity: sha512-D7ifoUfxuVCUyktIr5Gc+jXUbtcUMmfHdTtTbf1XCZHua5mJceK9wtl3YCg3eq/HK2Ppd52BKnTzEcS5ZKQM+w==} - engines: {node: '>=8'} + /@smithy/util-body-length-browser@2.0.0: + resolution: {integrity: sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==} + dependencies: + tslib: 2.6.2 dev: false - /@sentry/utils@7.57.0: - resolution: {integrity: sha512-YXrkMCiNklqkXctn4mKYkrzNCf/dfVcRUQrkXjeBC+PHXbcpPyaJgInNvztR7Skl8lE3JPGPN4v5XhLxK1bUUg==} - engines: {node: '>=8'} + /@smithy/util-body-length-node@2.1.0: + resolution: {integrity: sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==} + engines: {node: '>=14.0.0'} dependencies: - '@sentry/types': 7.57.0 - tslib: 2.5.0 + tslib: 2.6.2 dev: false - /@sentry/webpack-plugin@1.20.0: - resolution: {integrity: sha512-Ssj1mJVFsfU6vMCOM2d+h+KQR7QHSfeIP16t4l20Uq/neqWXZUQ2yvQfe4S3BjdbJXz/X4Rw8Hfy1Sd0ocunYw==} - engines: {node: '>= 8'} + /@smithy/util-buffer-from@2.0.0: + resolution: {integrity: sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==} + engines: {node: '>=14.0.0'} dependencies: - '@sentry/cli': 1.75.2 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - encoding - - supports-color + '@smithy/is-array-buffer': 2.0.0 + tslib: 2.6.2 dev: false - /@sinclair/typebox@0.24.51: - resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} + /@smithy/util-config-provider@2.0.0: + resolution: {integrity: sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false - /@sinclair/typebox@0.25.24: - resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} - dev: true + /@smithy/util-defaults-mode-browser@2.0.11: + resolution: {integrity: sha512-0syV1Mz/mCQ7CG/MHKQfH+w86xq59jpD0EOXv5oe0WBXLmq2lWPpVHl2Y6+jQ+/9fYzyZ5NF+NC/WEIuiv690A==} + engines: {node: '>= 10.0.0'} + dependencies: + '@smithy/property-provider': 2.0.10 + '@smithy/smithy-client': 2.1.7 + '@smithy/types': 2.3.3 + bowser: 2.11.0 + tslib: 2.6.2 + dev: false - /@sindresorhus/is@4.6.0: - resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} - engines: {node: '>=10'} - dev: true + /@smithy/util-defaults-mode-node@2.0.13: + resolution: {integrity: sha512-6BtCHYdw5Z8r6KpW8tRCc3yURgvcQwfIEeHhR70BeSOfx8T/TXPPjb8A+K45+KASspa3fzrsSxeIwB0sAeMoHA==} + engines: {node: '>= 10.0.0'} + dependencies: + '@smithy/config-resolver': 2.0.10 + '@smithy/credential-provider-imds': 2.0.12 + '@smithy/node-config-provider': 2.0.12 + '@smithy/property-provider': 2.0.10 + '@smithy/smithy-client': 2.1.7 + '@smithy/types': 2.3.3 + tslib: 2.6.2 + dev: false - /@sinonjs/commons@1.8.6: - resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + /@smithy/util-hex-encoding@2.0.0: + resolution: {integrity: sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==} + engines: {node: '>=14.0.0'} dependencies: - type-detect: 4.0.8 + tslib: 2.6.2 + dev: false - /@sinonjs/commons@2.0.0: - resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} + /@smithy/util-middleware@2.0.2: + resolution: {integrity: sha512-UGPZM+Ja/vke5pc/S8G0LNiHpVirtjppsXO+GK9m9wbzRGzPJTfnZA/gERUUN/AfxEy/8SL7U1kd7u4t2X8K1w==} + engines: {node: '>=14.0.0'} dependencies: - type-detect: 4.0.8 - dev: true + '@smithy/types': 2.3.3 + tslib: 2.6.2 + dev: false - /@sinonjs/fake-timers@10.0.2: - resolution: {integrity: sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==} + /@smithy/util-retry@2.0.2: + resolution: {integrity: sha512-ovWiayUB38moZcLhSFFfUgB2IMb7R1JfojU20qSahjxAgfOZvDWme3eOYUMtAVnouZ9kYJiFgHLy27qRH4NeeA==} + engines: {node: '>= 14.0.0'} dependencies: - '@sinonjs/commons': 2.0.0 - dev: true + '@smithy/service-error-classification': 2.0.2 + '@smithy/types': 2.3.3 + tslib: 2.6.2 + dev: false - /@sinonjs/fake-timers@8.1.0: - resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} + /@smithy/util-stream@2.0.12: + resolution: {integrity: sha512-FOCpRLaj6gvSyUC5mJAACT+sPMPmp9sD1o+hVbUH/QxwZfulypA3ZIFdAg/59/IY0d/1Q4CTztsiHEB5LgjN4g==} + engines: {node: '>=14.0.0'} dependencies: - '@sinonjs/commons': 1.8.6 + '@smithy/fetch-http-handler': 2.1.5 + '@smithy/node-http-handler': 2.1.5 + '@smithy/types': 2.3.3 + '@smithy/util-base64': 2.0.0 + '@smithy/util-buffer-from': 2.0.0 + '@smithy/util-hex-encoding': 2.0.0 + '@smithy/util-utf8': 2.0.0 + tslib: 2.6.2 dev: false - /@sinonjs/fake-timers@9.1.2: - resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==} + /@smithy/util-uri-escape@2.0.0: + resolution: {integrity: sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==} + engines: {node: '>=14.0.0'} dependencies: - '@sinonjs/commons': 1.8.6 - dev: true + tslib: 2.6.2 + dev: false - /@smithy/protocol-http@1.0.1: - resolution: {integrity: sha512-9OrEn0WfOVtBNYJUjUAn9AOiJ4lzERCJJ/JeZs8E6yajTGxBaFRxUnNBHiNqoDJVg076hY36UmEnPx7xXrvUSg==} + /@smithy/util-utf8@2.0.0: + resolution: {integrity: sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/types': 1.0.0 - tslib: 2.5.0 + '@smithy/util-buffer-from': 2.0.0 + tslib: 2.6.2 dev: false - /@smithy/types@1.0.0: - resolution: {integrity: sha512-kc1m5wPBHQCTixwuaOh9vnak/iJm21DrSf9UK6yDE5S3mQQ4u11pqAUiKWnlrZnYkeLfAI9UEHj9OaMT1v5Umg==} + /@smithy/util-waiter@2.0.9: + resolution: {integrity: sha512-Hy9Cs0FtIacC1aVFk98bm/7CYqim9fnHAPRnV/SB2mj02ExYs/9Dn5SrNQmtTBTLCn65KqYnNVBNS8GuGpZOOw==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.5.0 + '@smithy/abort-controller': 2.0.9 + '@smithy/types': 2.3.3 + tslib: 2.6.2 dev: false /@stdlib/array-float32@0.0.6: @@ -7668,7 +8665,7 @@ packages: resolution: {integrity: sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==} engines: {node: '>=10'} dependencies: - '@babel/types': 7.21.4 + '@babel/types': 7.22.17 /@svgr/plugin-jsx@5.5.0: resolution: {integrity: sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==} @@ -7695,7 +8692,7 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/plugin-transform-react-constant-elements': 7.21.3(@babel/core@7.21.4) - '@babel/preset-env': 7.21.4(@babel/core@7.21.4) + '@babel/preset-env': 7.22.15(@babel/core@7.21.4) '@babel/preset-react': 7.18.6(@babel/core@7.21.4) '@svgr/core': 5.5.0 '@svgr/plugin-jsx': 5.5.0 @@ -7711,7 +8708,7 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/plugin-transform-react-constant-elements': 7.21.3(@babel/core@7.21.4) - '@babel/preset-env': 7.21.4(@babel/core@7.21.4) + '@babel/preset-env': 7.22.15(@babel/core@7.21.4) '@babel/preset-react': 7.18.6(@babel/core@7.21.4) '@svgr/core': 5.5.0 '@svgr/plugin-jsx': 5.5.0 @@ -7721,98 +8718,88 @@ packages: - supports-color dev: false - /@swc/core-darwin-arm64@1.3.49: - resolution: {integrity: sha512-g7aIfXh6uPHmhLXdjXQq5t3HAyS/EdvujasW1DIS5k8UqOBaSoCcSGtLIjzcLv3KujqNfYcm118E+12H0nY6fQ==} + /@swc/core-darwin-arm64@1.3.88: + resolution: {integrity: sha512-Nb7kKydSQK3FE90pw/GPRFmAkquDQcTixLijNcki2xFBXh/DcGdFUPE/GShQjk8gtQelj2vqZrsGs/GZPGA1mA==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] requiresBuild: true - dev: false optional: true - /@swc/core-darwin-x64@1.3.49: - resolution: {integrity: sha512-eSIxVX0YDw40Bre5sAx2BV3DzdIGzmQvCf2yiBvLqiiL6GC0mmuDeWbUCAzdUX6fJ6FUVEBMUVqNOc9oJ2/d5w==} + /@swc/core-darwin-x64@1.3.88: + resolution: {integrity: sha512-RcCrnjkmLXL1izSHPYLaJKVaxwd64LYiYLqjX2jXG4U50D6LOlmuLeqTJ8aAnENZP19gNpsY9ggY9jD5UQqHAw==} engines: {node: '>=10'} cpu: [x64] os: [darwin] requiresBuild: true - dev: false optional: true - /@swc/core-linux-arm-gnueabihf@1.3.49: - resolution: {integrity: sha512-8mj3IcRVr/OJY0mVITz6Z5osNAMJK5GiKDaZ+3QejPLbl6aiu4sH4GmTHDRN14RnaVXOpecsGcUoQmNoNa3u3w==} + /@swc/core-linux-arm-gnueabihf@1.3.88: + resolution: {integrity: sha512-/H7QhpgbWX4xe6jbkgPrhjY543oCCmbPRvBMvZ3iuLb81bEtOFiEp9LYe/95ZW/BTz2z9a6fQtQMqkhAjcrV5w==} engines: {node: '>=10'} cpu: [arm] os: [linux] requiresBuild: true - dev: false optional: true - /@swc/core-linux-arm64-gnu@1.3.49: - resolution: {integrity: sha512-Rmg9xw6tmpOpf6GKKjpHQGmjfHzqSths5ebI2ahrHlhekzZF2HYmPkVw4bHda8Bja6mbaw8FVBgBHjPU8mMeDA==} + /@swc/core-linux-arm64-gnu@1.3.88: + resolution: {integrity: sha512-ar/oQJxisjn/Su9rsg+XcBqA54Ylh1SyrZiLslv37OnGr785Xw+C//rw+JGoFmCZSjhGAU5hriOiHJd2S8mtqA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] requiresBuild: true - dev: false optional: true - /@swc/core-linux-arm64-musl@1.3.49: - resolution: {integrity: sha512-nlKPYMogAI3Aak6Mlkag8/2AlHAZ/DpH7RjhfMazsaGhD/sQOmYdyY9Al69ejpa419YJuREeeeLoojFlSsd30g==} + /@swc/core-linux-arm64-musl@1.3.88: + resolution: {integrity: sha512-ZyUtCk1Y4GpOajbHcnm2JwkFm/m8M/wP3I8iaAm/0yAPIYwQInVdD0Hn++eig2Y+nLJ7gT0QI82fFUDPEIP6Jw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] requiresBuild: true - dev: false optional: true - /@swc/core-linux-x64-gnu@1.3.49: - resolution: {integrity: sha512-QOyeJQ6NVi73SJcizbwvIZTiGA/N+BxX9liRrvibumaQmRh8fWjJiLNsv3ODSHeuonak7E8Bf7a7NnSTyu48Mw==} + /@swc/core-linux-x64-gnu@1.3.88: + resolution: {integrity: sha512-VrwGCzKLwimL0Js1yWRQNpcJCLGYkETku9mEI9sM4yF6kzT/jwfOe94udBe9O4GGUv24QkzHXRk+EnGR2LFSOQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] requiresBuild: true - dev: false optional: true - /@swc/core-linux-x64-musl@1.3.49: - resolution: {integrity: sha512-WlDMz+SOpYC9O/ZBUw1oiyWI7HyUCMlf/HS8Fy/kRI3eGoGCUxVTCJ1mP57GdQr4Wg32Y/ZpO2KSNQFWnT8mAw==} + /@swc/core-linux-x64-musl@1.3.88: + resolution: {integrity: sha512-cur5h0JmNfF4ZHb+FBPLePX86lu3FUjxltObWUhqO4QiXzHxWfde6g+pgdqfUAer0cd9VEEjEKGA5OQncXqyCQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] requiresBuild: true - dev: false optional: true - /@swc/core-win32-arm64-msvc@1.3.49: - resolution: {integrity: sha512-41LZOeI94Za3twib8KOIjnHYAZ+nkBFmboaREsFR1760S7jiMVywqWX8nFZvn/CXj15Fjjgdgyuig+zMREwXwQ==} + /@swc/core-win32-arm64-msvc@1.3.88: + resolution: {integrity: sha512-f9OVuWrey7X0gjCZlVD4d5/9/d0yyxu8KFUOEjyjJ2Kd+pvzRys1U3E0FE1PiiDOng3qrfdOt4HQxyAy2jts9Q==} engines: {node: '>=10'} cpu: [arm64] os: [win32] requiresBuild: true - dev: false optional: true - /@swc/core-win32-ia32-msvc@1.3.49: - resolution: {integrity: sha512-IdqLPoMKssyAoOCZdNXmnAd6/uyx+Hb9KSfZUHepZaNfwMy6J5XXrOsbYs3v53FH8MtekUUdV+mMX4me9bcv9w==} + /@swc/core-win32-ia32-msvc@1.3.88: + resolution: {integrity: sha512-7KCeTVe8wWRbuiuAwXoHKBkr9nugCAHQe/JGxoevHXxn2h+WwBuWHog1AbS6PvRWSKK8dVhKAAPDNWwdEltA5A==} engines: {node: '>=10'} cpu: [ia32] os: [win32] requiresBuild: true - dev: false optional: true - /@swc/core-win32-x64-msvc@1.3.49: - resolution: {integrity: sha512-7Fqjo5pS3uIohhSbYSaR0+e/bJdxmQb4oG97FIh5qvlCCGQaQ9UiaEeYy4uK0Ad+Menum1IXCAEiG7RHcl6Eyw==} + /@swc/core-win32-x64-msvc@1.3.88: + resolution: {integrity: sha512-x0wr9kCS2Hmpx7H6gvJHA17G0DnvwToqWDSO1VmePt5hQZZfLzxiHHDHKFv4YYsVPbAU283q4Wa39QSPZeJbTA==} engines: {node: '>=10'} cpu: [x64] os: [win32] requiresBuild: true - dev: false optional: true - /@swc/core@1.3.49: - resolution: {integrity: sha512-br44ZHOfE9YyRGcORSLkHFQHTvhwRcaithBJ1Q5y5iMGpLbH0Wai3GN49L60RvmGwxNJfWzT+E7+rNNR7ewKgA==} + /@swc/core@1.3.88: + resolution: {integrity: sha512-kaJ5t6Fg/DmJPNeI+jdtCEt7NVKxhUYToq7PF2fMRPFPLKSJzJCZajcp6/gZNcEUCVWaK6pWi/XL79Tzz1FqzQ==} engines: {node: '>=10'} requiresBuild: true peerDependencies: @@ -7820,41 +8807,42 @@ packages: peerDependenciesMeta: '@swc/helpers': optional: true + dependencies: + '@swc/counter': 0.1.1 + '@swc/types': 0.1.5 optionalDependencies: - '@swc/core-darwin-arm64': 1.3.49 - '@swc/core-darwin-x64': 1.3.49 - '@swc/core-linux-arm-gnueabihf': 1.3.49 - '@swc/core-linux-arm64-gnu': 1.3.49 - '@swc/core-linux-arm64-musl': 1.3.49 - '@swc/core-linux-x64-gnu': 1.3.49 - '@swc/core-linux-x64-musl': 1.3.49 - '@swc/core-win32-arm64-msvc': 1.3.49 - '@swc/core-win32-ia32-msvc': 1.3.49 - '@swc/core-win32-x64-msvc': 1.3.49 - dev: false + '@swc/core-darwin-arm64': 1.3.88 + '@swc/core-darwin-x64': 1.3.88 + '@swc/core-linux-arm-gnueabihf': 1.3.88 + '@swc/core-linux-arm64-gnu': 1.3.88 + '@swc/core-linux-arm64-musl': 1.3.88 + '@swc/core-linux-x64-gnu': 1.3.88 + '@swc/core-linux-x64-musl': 1.3.88 + '@swc/core-win32-arm64-msvc': 1.3.88 + '@swc/core-win32-ia32-msvc': 1.3.88 + '@swc/core-win32-x64-msvc': 1.3.88 + + /@swc/counter@0.1.1: + resolution: {integrity: sha512-xVRaR4u9hcYjFvcSg71Lz5Bo4//CyjAAfMxa7UsaDSYxAshflUkVJWiyVWrfxC59z2kP1IzI4/1BEpnhI9o3Mw==} /@swc/helpers@0.4.11: resolution: {integrity: sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==} dependencies: - tslib: 2.5.0 + tslib: 2.6.2 dev: false /@swc/helpers@0.4.14: resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} dependencies: - tslib: 2.5.0 + tslib: 2.6.2 dev: false - /@swc/wasm@1.3.49: - resolution: {integrity: sha512-OMWybhrtnJrJR3POwvO6X/RA4HksVKPOsDyGwl5JaCxty8Mu6jlizzmjEhQDMaHF9VNY5kqMMeHypQdxS1Tc+w==} - dev: false + /@swc/types@0.1.5: + resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} - /@szmarczak/http-timer@4.0.6: - resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} - engines: {node: '>=10'} - dependencies: - defer-to-connect: 2.0.1 - dev: true + /@swc/wasm@1.3.89: + resolution: {integrity: sha512-S60dSgTxz6cXACbmxx1Hcj/5t2E3j/FV8scwJewPJ4HmrjxosREAjedB0UlZQ5RzE0Ox53tW+Uio++Kn6W7UKw==} + dev: false /@tailwindcss/typography@0.5.9(tailwindcss@3.3.1): resolution: {integrity: sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg==} @@ -7865,7 +8853,7 @@ packages: lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.3.1(postcss@8.4.21)(ts-node@10.8.2) + tailwindcss: 3.3.1(postcss@8.4.30)(ts-node@10.8.2) dev: true /@tanstack/query-core@4.29.1: @@ -7908,7 +8896,7 @@ packages: resolution: {integrity: sha512-xTEnpUKiV/bMyEsE5bT4oYA0x0Z/colMtxzUY8bKyPXBNLn/e0V4ZjBZkEhms0xE4pv9QsPfSRu9AWS4y5wGvA==} engines: {node: '>=14'} dependencies: - '@babel/code-frame': 7.21.4 + '@babel/code-frame': 7.22.13 '@babel/runtime': 7.21.0 '@types/aria-query': 5.0.1 aria-query: 5.1.3 @@ -7918,17 +8906,60 @@ packages: pretty-format: 27.5.1 dev: true - /@testing-library/jest-dom@5.16.5: - resolution: {integrity: sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA==} - engines: {node: '>=8', npm: '>=6', yarn: '>=1'} + /@testing-library/jest-dom@6.1.3(@types/jest@29.5.0): + resolution: {integrity: sha512-YzpjRHoCBWPzpPNtg6gnhasqtE/5O4qz8WCwDEaxtfnPO6gkaLrnuXusrGSPyhIGPezr1HM7ZH0CFaUTY9PJEQ==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + peerDependencies: + '@jest/globals': '>= 28' + '@types/jest': '>= 28' + jest: '>= 28' + vitest: '>= 0.32' + peerDependenciesMeta: + '@jest/globals': + optional: true + '@types/jest': + optional: true + jest: + optional: true + vitest: + optional: true + dependencies: + '@adobe/css-tools': 4.3.1 + '@babel/runtime': 7.21.0 + '@types/jest': 29.5.0 + aria-query: 5.1.3 + chalk: 3.0.0 + css.escape: 1.5.1 + dom-accessibility-api: 0.5.16 + lodash: 4.17.21 + redent: 3.0.0 + dev: true + + /@testing-library/jest-dom@6.1.3(jest@28.1.3): + resolution: {integrity: sha512-YzpjRHoCBWPzpPNtg6gnhasqtE/5O4qz8WCwDEaxtfnPO6gkaLrnuXusrGSPyhIGPezr1HM7ZH0CFaUTY9PJEQ==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + peerDependencies: + '@jest/globals': '>= 28' + '@types/jest': '>= 28' + jest: '>= 28' + vitest: '>= 0.32' + peerDependenciesMeta: + '@jest/globals': + optional: true + '@types/jest': + optional: true + jest: + optional: true + vitest: + optional: true dependencies: - '@adobe/css-tools': 4.2.0 + '@adobe/css-tools': 4.3.1 '@babel/runtime': 7.21.0 - '@types/testing-library__jest-dom': 5.14.5 aria-query: 5.1.3 chalk: 3.0.0 css.escape: 1.5.1 dom-accessibility-api: 0.5.16 + jest: 28.1.3(@types/node@18.15.11)(ts-node@10.8.2) lodash: 4.17.21 redent: 3.0.0 dev: true @@ -7999,12 +9030,6 @@ packages: /@tsconfig/node16@1.0.3: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} - /@types/acorn@4.0.6: - resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} - dependencies: - '@types/estree': 1.0.1 - dev: true - /@types/archiver@5.3.2: resolution: {integrity: sha512-IctHreBuWE5dvBDz/0WeKtyVKVRs4h75IblxOACL92wU66v+HGAfEYAOyXkOFphvRJMhuXdI9huDXpX0FC6lCw==} dependencies: @@ -8018,8 +9043,8 @@ packages: /@types/babel__core@7.20.0: resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} dependencies: - '@babel/parser': 7.21.4 - '@babel/types': 7.21.4 + '@babel/parser': 7.22.16 + '@babel/types': 7.22.17 '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.18.3 @@ -8027,25 +9052,24 @@ packages: /@types/babel__generator@7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: - '@babel/types': 7.21.4 + '@babel/types': 7.22.17 /@types/babel__template@7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: - '@babel/parser': 7.21.4 - '@babel/types': 7.21.4 + '@babel/parser': 7.22.16 + '@babel/types': 7.22.17 /@types/babel__traverse@7.18.3: resolution: {integrity: sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==} dependencies: - '@babel/types': 7.21.4 + '@babel/types': 7.22.17 /@types/body-parser@1.19.2: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 '@types/node': 18.15.11 - dev: false /@types/bonjour@3.5.10: resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} @@ -8053,20 +9077,11 @@ packages: '@types/node': 18.15.11 dev: false - /@types/cacheable-request@6.0.3: - resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} - dependencies: - '@types/http-cache-semantics': 4.0.1 - '@types/keyv': 3.1.4 - '@types/node': 18.15.11 - '@types/responselike': 1.0.0 - dev: true - /@types/chalk@2.2.0: resolution: {integrity: sha512-1zzPV9FDe1I/WHhRkf9SNgqtRJWZqrBWgu7JGveuHmmyR9CnAPCie2N/x+iHrgnpYBIcCJWHBoMRv2TRWktsvw==} deprecated: This is a stub types definition for chalk (https://github.com/chalk/chalk). chalk provides its own type definitions, so you don't need @types/chalk installed! dependencies: - chalk: 5.2.0 + chalk: 5.3.0 dev: true /@types/cli-progress@3.11.0: @@ -8075,6 +9090,13 @@ packages: '@types/node': 18.15.11 dev: true + /@types/commander@2.12.2: + resolution: {integrity: sha512-0QEFiR8ljcHp9bAbWxecjVRuAMr16ivPiGOw6KFQBVrVd0RQIcM3xKdRisH2EDWgVWujiYtHwhSkSUoAAGzH7Q==} + deprecated: This is a stub types definition for commander (https://github.com/tj/commander.js). commander provides its own type definitions, so you don't need @types/commander installed! + dependencies: + commander: 11.0.0 + dev: true + /@types/connect-history-api-fallback@1.3.5: resolution: {integrity: sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==} dependencies: @@ -8086,11 +9108,6 @@ packages: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: '@types/node': 18.15.11 - dev: false - - /@types/cookie@0.4.1: - resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} - dev: true /@types/cookie@0.5.1: resolution: {integrity: sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==} @@ -8142,23 +9159,12 @@ packages: '@types/estree': 1.0.1 '@types/json-schema': 7.0.11 - /@types/estree-jsx@0.0.1: - resolution: {integrity: sha512-gcLAYiMfQklDCPjQegGn0TBAn9it05ISEsEhlKQUddIk7o2XDokOcTN7HBO8tznM0D9dGezvHEfRZBfZf6me0A==} - dependencies: - '@types/estree': 1.0.1 - dev: true - - /@types/estree-jsx@1.0.0: - resolution: {integrity: sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==} - dependencies: - '@types/estree': 1.0.1 - dev: true - /@types/estree@0.0.39: resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} /@types/estree@0.0.51: resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} + dev: true /@types/estree@1.0.1: resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} @@ -8172,7 +9178,6 @@ packages: '@types/node': 18.15.11 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 - dev: false /@types/express@4.17.17: resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} @@ -8181,14 +9186,14 @@ packages: '@types/express-serve-static-core': 4.17.33 '@types/qs': 6.9.7 '@types/serve-static': 1.15.1 - dev: false /@types/firebase@3.2.1: resolution: {integrity: sha512-G8XgHMu2jHlElfc2xVNaYP50F0qrqeTCjgeG1v5b4SRwWG4XKC4fCuEdVZuZaMRmVygcnbRZBAo9O7RsDvmkGQ==} deprecated: This is a stub types definition for Firebase API (https://www.firebase.com/docs/javascript/firebase). Firebase API provides its own type definitions, so you don't need @types/firebase installed! dependencies: - firebase: 9.19.1 + firebase: 10.4.0 transitivePeerDependencies: + - '@react-native-async-storage/async-storage' - encoding dev: true @@ -8210,26 +9215,23 @@ packages: dependencies: '@types/node': 18.15.11 - /@types/hast@2.3.4: - resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==} - dependencies: - '@types/unist': 2.0.6 - dev: true - /@types/html-minifier-terser@6.1.0: resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} dev: false - /@types/http-cache-semantics@4.0.1: - resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} - dev: true - /@types/http-proxy@1.17.10: resolution: {integrity: sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g==} dependencies: '@types/node': 18.15.11 dev: false + /@types/inquirer@9.0.3: + resolution: {integrity: sha512-CzNkWqQftcmk2jaCWdBTf9Sm7xSw4rkI1zpU/Udw3HX5//adEZUIm9STtoRP1qgWj0CWQtJ9UTvqmO2NNjhMJw==} + dependencies: + '@types/through': 0.0.31 + rxjs: 7.8.0 + dev: true + /@types/istanbul-lib-coverage@2.0.4: resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} @@ -8250,6 +9252,13 @@ packages: pretty-format: 29.5.0 dev: true + /@types/jest@29.5.5: + resolution: {integrity: sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg==} + dependencies: + expect: 29.5.0 + pretty-format: 29.5.0 + dev: true + /@types/js-cookie@2.2.7: resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} dev: false @@ -8264,23 +9273,10 @@ packages: /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - /@types/jsonwebtoken@8.5.9: - resolution: {integrity: sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==} - dependencies: - '@types/node': 18.15.11 - dev: true - - /@types/jsonwebtoken@9.0.1: - resolution: {integrity: sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw==} - dependencies: - '@types/node': 18.15.11 - dev: false - - /@types/keyv@3.1.4: - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + /@types/jsonwebtoken@9.0.3: + resolution: {integrity: sha512-b0jGiOgHtZ2jqdPgPnP6WLCXZk1T8p06A/vPGzUvxpFGgKMbjXJDjC5m52ErqBnIuWZFgGoIJyRdeG5AyreJjA==} dependencies: '@types/node': 18.15.11 - dev: true /@types/linkify-it@3.0.2: resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==} @@ -8291,8 +9287,13 @@ packages: resolution: {integrity: sha512-km+Vyn3BYm5ytMO13k9KTp27O75rbQ0NFw+U//g+PX7VZyjCioXaRFisqSIJRECljcTv73G3i6BpglNGHgUQ5A==} dev: true + /@types/lodash@4.14.198: + resolution: {integrity: sha512-trNJ/vtMZYMLhfN45uLq4ShQSw0/S7xCTLLVM+WM1rmFpba/VS42jVUgaO3w/NOLiWR/09lnYk0yMaA/atdIsg==} + dev: true + /@types/long@4.0.2: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + dev: false /@types/markdown-it@12.2.3: resolution: {integrity: sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==} @@ -8302,18 +9303,13 @@ packages: dev: false optional: true - /@types/mdast@3.0.11: - resolution: {integrity: sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==} - dependencies: - '@types/unist': 2.0.6 - dev: true - /@types/mdurl@1.0.2: resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==} + dev: false + optional: true /@types/mime@3.0.1: resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} - dev: false /@types/minimatch@3.0.5: resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} @@ -8399,11 +9395,9 @@ packages: /@types/qs@6.9.7: resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} - dev: false /@types/range-parser@1.2.4: resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} - dev: false /@types/react-dom@18.0.11: resolution: {integrity: sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==} @@ -8439,12 +9433,6 @@ packages: resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} dev: true - /@types/responselike@1.0.0: - resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} - dependencies: - '@types/node': 18.15.11 - dev: true - /@types/retry@0.12.0: resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} dev: false @@ -8475,7 +9463,6 @@ packages: dependencies: '@types/mime': 3.0.1 '@types/node': 18.15.11 - dev: false /@types/sockjs@0.3.33: resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} @@ -8512,20 +9499,16 @@ packages: stripe: 11.18.0 dev: true - /@types/testing-library__jest-dom@5.14.5: - resolution: {integrity: sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ==} + /@types/through@0.0.31: + resolution: {integrity: sha512-LpKpmb7FGevYgXnBXYs6HWnmiFyVG07Pt1cnbgM1IhEacITTiUaBXXvOR3Y50ksaJWGSfhbEvQFivQEFGCC55w==} dependencies: - '@types/jest': 29.5.0 + '@types/node': 18.15.11 dev: true /@types/trusted-types@2.0.3: resolution: {integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==} dev: false - /@types/unist@2.0.6: - resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} - dev: true - /@types/vinyl@2.0.7: resolution: {integrity: sha512-4UqPv+2567NhMQuMLdKAyK4yzrfCqwaTt6bLhHEs8PFcxbHILsrxaY63n4wgE/BRLDWDQeI+WcTmkXKExh9hQg==} dependencies: @@ -8540,12 +9523,25 @@ packages: resolution: {integrity: sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==} dev: false - /@types/webpack@5.28.1(esbuild@0.16.3)(webpack-cli@5.0.1): + /@types/webpack@5.28.1(webpack-cli@5.0.1): resolution: {integrity: sha512-qw1MqGZclCoBrpiSe/hokSgQM/su8Ocpl3L/YHE0L6moyaypg4+5F7Uzq7NgaPKPxUxUbQ4fLPLpDWdR27bCZw==} dependencies: '@types/node': 18.15.11 tapable: 2.2.1 - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + - webpack-cli + dev: true + + /@types/webpack@5.28.2(@swc/core@1.3.88)(webpack-cli@5.1.4): + resolution: {integrity: sha512-7tcxyrIOd7WGimZIcWU6pDsNh2edGGnwYExOvd3l/nMvuxqwVPrFXnnTbYCnplqV9BJoU7Mo2mfFtiH8CNFvYw==} + dependencies: + '@types/node': 18.15.11 + tapable: 2.2.1 + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -8580,7 +9576,7 @@ packages: dependencies: '@types/yargs-parser': 21.0.0 - /@typescript-eslint/eslint-plugin@5.58.0(@typescript-eslint/parser@5.58.0)(eslint@8.38.0)(typescript@4.9.5): + /@typescript-eslint/eslint-plugin@5.58.0(@typescript-eslint/parser@5.58.0)(eslint@8.29.0)(typescript@4.9.5): resolution: {integrity: sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -8592,12 +9588,12 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.5.0 - '@typescript-eslint/parser': 5.58.0(eslint@8.38.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.58.0(eslint@8.29.0)(typescript@4.9.5) '@typescript-eslint/scope-manager': 5.58.0 - '@typescript-eslint/type-utils': 5.58.0(eslint@8.38.0)(typescript@4.9.5) - '@typescript-eslint/utils': 5.58.0(eslint@8.38.0)(typescript@4.9.5) + '@typescript-eslint/type-utils': 5.58.0(eslint@8.29.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.58.0(eslint@8.29.0)(typescript@4.9.5) debug: 4.3.4 - eslint: 8.38.0 + eslint: 8.29.0 grapheme-splitter: 1.0.4 ignore: 5.2.4 natural-compare-lite: 1.4.0 @@ -8608,14 +9604,14 @@ packages: - supports-color dev: false - /@typescript-eslint/experimental-utils@5.58.0(eslint@8.38.0)(typescript@4.9.5): + /@typescript-eslint/experimental-utils@5.58.0(eslint@8.29.0)(typescript@4.9.5): resolution: {integrity: sha512-LA/sRPaynZlrlYxdefrZbMx8dqs/1Kc0yNG+XOk5CwwZx7tTv263ix3AJNioF0YBVt7hADpAUR20owl6pv4MIQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.58.0(eslint@8.38.0)(typescript@4.9.5) - eslint: 8.38.0 + '@typescript-eslint/utils': 5.58.0(eslint@8.29.0)(typescript@4.9.5) + eslint: 8.29.0 transitivePeerDependencies: - supports-color - typescript @@ -8660,7 +9656,7 @@ packages: transitivePeerDependencies: - supports-color - /@typescript-eslint/parser@5.58.0(eslint@8.38.0)(typescript@4.9.5): + /@typescript-eslint/parser@5.58.0(eslint@8.29.0)(typescript@4.9.5): resolution: {integrity: sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -8674,7 +9670,7 @@ packages: '@typescript-eslint/types': 5.58.0 '@typescript-eslint/typescript-estree': 5.58.0(typescript@4.9.5) debug: 4.3.4 - eslint: 8.38.0 + eslint: 8.29.0 typescript: 4.9.5 transitivePeerDependencies: - supports-color @@ -8687,7 +9683,7 @@ packages: '@typescript-eslint/types': 5.58.0 '@typescript-eslint/visitor-keys': 5.58.0 - /@typescript-eslint/type-utils@5.58.0(eslint@8.38.0)(typescript@4.9.5): + /@typescript-eslint/type-utils@5.58.0(eslint@8.29.0)(typescript@4.9.5): resolution: {integrity: sha512-FF5vP/SKAFJ+LmR9PENql7fQVVgGDOS+dq3j+cKl9iW/9VuZC/8CFmzIP0DLKXfWKpRHawJiG70rVH+xZZbp8w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -8698,9 +9694,9 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 5.58.0(typescript@4.9.5) - '@typescript-eslint/utils': 5.58.0(eslint@8.38.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.58.0(eslint@8.29.0)(typescript@4.9.5) debug: 4.3.4 - eslint: 8.38.0 + eslint: 8.29.0 tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: @@ -8751,19 +9747,19 @@ packages: transitivePeerDependencies: - supports-color - /@typescript-eslint/utils@5.58.0(eslint@8.38.0)(typescript@4.9.5): + /@typescript-eslint/utils@5.58.0(eslint@8.29.0)(typescript@4.9.5): resolution: {integrity: sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.38.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.29.0) '@types/json-schema': 7.0.11 '@types/semver': 7.3.13 '@typescript-eslint/scope-manager': 5.58.0 '@typescript-eslint/types': 5.58.0 '@typescript-eslint/typescript-estree': 5.58.0(typescript@4.9.5) - eslint: 8.38.0 + eslint: 8.29.0 eslint-scope: 5.1.1 semver: 7.5.4 transitivePeerDependencies: @@ -8777,103 +9773,84 @@ packages: dependencies: '@typescript-eslint/types': 5.58.0 eslint-visitor-keys: 3.4.0 - - /@vanilla-extract/babel-plugin-debug-ids@1.0.2: - resolution: {integrity: sha512-LjnbQWGeMwaydmovx8jWUR8BxLtLiPyq0xz5C8G5OvFhsuJxvavLdrBHNNizvr1dq7/3qZGlPv0znsvU4P44YA==} - dependencies: - '@babel/core': 7.21.4 - transitivePeerDependencies: - - supports-color + + /@vercel/build-utils@7.2.1: + resolution: {integrity: sha512-WCqSBCPNlANEOsmroCzCZq6ZxArV20RHBbdaZzhZjkGtEReSZx5BSOsrnkewFJFuu5pNGYegAaVi0VCkA1irZQ==} dev: true - /@vanilla-extract/css@1.11.0: - resolution: {integrity: sha512-uohj+8cGWbnrVzTfrjlJeXqdGjH3d3TcscdQxKe3h5bb5QQXTpPSq+c+SeWADIGiZybzcW0CBvZV8jsy1ywY9w==} - dependencies: - '@emotion/hash': 0.9.0 - '@vanilla-extract/private': 1.0.3 - ahocorasick: 1.0.2 - chalk: 4.1.2 - css-what: 5.1.0 - cssesc: 3.0.0 - csstype: 3.1.2 - deep-object-diff: 1.1.9 - deepmerge: 4.3.1 - media-query-parser: 2.0.2 - outdent: 0.8.0 + /@vercel/error-utils@2.0.1: + resolution: {integrity: sha512-ZUVpRFArh5eyKpJmdfEuCaMpZKQvZgUq0pQ7PdK8m5FgRYEvF4I0TMJH3JnkbYaMMUH82aYWZr+/hFJtEBcmTQ==} dev: true - /@vanilla-extract/integration@6.2.1(@types/node@18.15.11): - resolution: {integrity: sha512-+xYJz07G7TFAMZGrOqArOsURG+xcYvqctujEkANjw2McCBvGEK505RxQqOuNiA9Mi9hgGdNp2JedSa94f3eoLg==} + /@vercel/fun@1.1.0: + resolution: {integrity: sha512-SpuPAo+MlAYMtcMcC0plx7Tv4Mp7SQhJJj1iIENlOnABL24kxHpL09XLQMGzZIzIW7upR8c3edwgfpRtp+dhVw==} + engines: {node: '>= 10'} dependencies: - '@babel/core': 7.21.4 - '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.21.4) - '@vanilla-extract/babel-plugin-debug-ids': 1.0.2 - '@vanilla-extract/css': 1.11.0 - esbuild: 0.17.6 - eval: 0.1.6 - find-up: 5.0.0 - javascript-stringify: 2.1.0 - lodash: 4.17.21 - mlly: 1.2.0 - outdent: 0.8.0 - vite: 4.2.2(@types/node@18.15.11) - vite-node: 0.28.5(@types/node@18.15.11) + '@tootallnate/once': 2.0.0 + async-listen: 1.2.0 + debug: 4.1.1 + execa: 3.2.0 + fs-extra: 8.1.0 + generic-pool: 3.4.2 + micro: 9.3.5-canary.3 + ms: 2.1.1 + node-fetch: 2.6.7 + path-match: 1.2.4 + promisepipe: 3.0.0 + semver: 7.3.5 + stat-mode: 0.3.0 + stream-to-promise: 2.2.0 + tar: 4.4.18 + tree-kill: 1.2.2 + uid-promise: 1.0.0 + uuid: 3.3.2 + xdg-app-paths: 5.1.0 + yauzl-promise: 2.1.3 transitivePeerDependencies: - - '@types/node' - - less - - sass - - stylus - - sugarss + - encoding - supports-color - - terser - dev: true - - /@vanilla-extract/private@1.0.3: - resolution: {integrity: sha512-17kVyLq3ePTKOkveHxXuIJZtGYs+cSoev7BlP+Lf4916qfDhk/HBjvlYDe8egrea7LNPHKwSZJK/bzZC+Q6AwQ==} - dev: true - - /@vercel/build-utils@6.7.1: - resolution: {integrity: sha512-Ecc9oQBSVwk1suENcRcj1L6gQrUt4+0XA9oPFxrUpoFEk04lP/ZV3qAQPk+ex08N+vfUulYdqb+cmVTnwqsmqw==} dev: true - /@vercel/gatsby-plugin-vercel-analytics@1.0.9: - resolution: {integrity: sha512-JEzoLxjAVFZT1569dEZKKrhq9UvMjJZ13ACMAsGx33hf2QeH/okkVnIeAiy1yGQKFFRKyhFQ6N29JSdV7zD/Zg==} + /@vercel/gatsby-plugin-vercel-analytics@1.0.11: + resolution: {integrity: sha512-iTEA0vY6RBPuEzkwUTVzSHDATo1aF6bdLLspI68mQ/BTbi5UQEGjpjyzdKOVcSYApDtFU6M6vypZ1t4vIEnHvw==} dependencies: - '@babel/runtime': 7.12.1 web-vitals: 0.2.4 dev: true - /@vercel/gatsby-plugin-vercel-builder@1.2.8: - resolution: {integrity: sha512-Z2HDeD/XzGxLIgaLEKBCwGKhI0aorzmY1gYccq8yaC2pXMKBJblZfU87QQwgQgXI+BWigXM0xmtIca6ijbyALg==} + /@vercel/gatsby-plugin-vercel-builder@2.0.6: + resolution: {integrity: sha512-ne6Xkqm/Naxc6KON3RwhE3irJVevCRwdMp+VMSXgC8ik+q9tWxtmMa4tbdnregKWEk1cw3ToHN6MkXRdcchpYA==} dependencies: '@sinclair/typebox': 0.25.24 - '@vercel/build-utils': 6.7.1 - '@vercel/node': 2.10.3 - '@vercel/routing-utils': 2.2.0 + '@vercel/build-utils': 7.2.1 + '@vercel/routing-utils': 3.0.0 esbuild: 0.14.47 etag: 1.8.1 fs-extra: 11.1.0 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - encoding dev: true - /@vercel/go@2.4.4: - resolution: {integrity: sha512-JXez+dQ6nXv68SnBor6FJqYy3X71FKnFc+OL4nxrsEsTzhCbqjLS/9hm4ztB0KQslWJvDp+2aRr++zLtyiCeQQ==} + /@vercel/go@3.0.2: + resolution: {integrity: sha512-g1i1X/h6SfIiCj+wVfNPZPqxhoOQbQXDximoGywTgKpRWZD40ReAjYIL4siemsHHX26ihhaJX2eHX8vWyQ57EQ==} dev: true - /@vercel/hydrogen@0.0.62: - resolution: {integrity: sha512-A1Ttgc4pBrLEK5CpeLuf4TQp0IsXjISDMZVnRrpWhu10hKUV/KfJ8r8df1w+dEq5Qd9LmJAwvVXlpX5vcJLDRQ==} + /@vercel/hydrogen@1.0.1: + resolution: {integrity: sha512-4PYk4LeIWPTjGtgnxvB0Hdw7aqCau843/96K2xX3z9pa0Hn//pUnZBMz2jrs5MRseCm1Li1LdQAK3u8/vaUnVQ==} + dependencies: + '@vercel/static-config': 3.0.0 + ts-morph: 12.0.0 dev: true - /@vercel/next@3.7.4: - resolution: {integrity: sha512-ADM6ZvAOldy0QZCmKP4pMad145bcO3bZK+pAS7SQ/68jFun50Boz7Ophb5J/CYvRyCybIraJ1TxDEf+dyo9GeA==} + /@vercel/next@4.0.8: + resolution: {integrity: sha512-rKP63aGivXyw6ihNL+P67qxIQ0de5OTzGV5s650GzkF1RwNLs3coy1NSWlspWL3SlaAXwqWJSIQmhcA8EYaSKA==} + dependencies: + '@vercel/nft': 0.24.1 + transitivePeerDependencies: + - encoding + - supports-color dev: true - /@vercel/nft@0.22.5: - resolution: {integrity: sha512-mug57Wd1BL7GMj9gXMgMeKUjdqO0e4u+0QLPYMFE1rwdJ+55oPy6lp3nIBCS8gOvigT62UI4QKUL2sGqcoW4Hw==} - engines: {node: '>=14'} + /@vercel/nft@0.24.1: + resolution: {integrity: sha512-bGYrA/w98LNl9edxXcAezKs+Ixa2a+RkAvxXK38gH3815v+WkNa2AGY+wQv59vu2f9il9+zIKj6YrnlYIbh+jA==} + engines: {node: '>=16'} hasBin: true dependencies: '@mapbox/node-pre-gyp': 1.0.10 @@ -8892,198 +9869,123 @@ packages: - supports-color dev: true - /@vercel/node-bridge@4.0.1: - resolution: {integrity: sha512-XEfKfnLGzlIBpad7eGNPql1HnMhoSTv9q3uDNC4axdaAC/kI5yvl8kXjuCPAXYvpbJnVQPpcSUC5/r5ap8F3jA==} - dev: true - - /@vercel/node@2.10.3: - resolution: {integrity: sha512-R6YwD7YTV4OPEjXnthTP2Zn96ZF2TAjmBhGKfYC9ZuqlmFzSxqyuHn+RUSkknkKBO46b4OzaNdi5XVnAdJizLA==} + /@vercel/node@3.0.6: + resolution: {integrity: sha512-QYsmc5rtuyjSAryAo4qRwsEw9NXhapAbF/OBM0Fdq3kPiwHDfbElJpb7UbeQH19u3q4d+E7Z6wZTbO6bsrzw4g==} dependencies: - '@edge-runtime/vm': 2.0.0 + '@edge-runtime/node-utils': 2.2.1 + '@edge-runtime/primitives': 3.1.1 + '@edge-runtime/vm': 3.1.1 '@types/node': 14.18.33 - '@vercel/build-utils': 6.7.1 - '@vercel/node-bridge': 4.0.1 - '@vercel/static-config': 2.0.15 - edge-runtime: 2.0.0 + '@vercel/build-utils': 7.2.1 + '@vercel/error-utils': 2.0.1 + '@vercel/nft': 0.24.1 + '@vercel/static-config': 3.0.0 + async-listen: 3.0.0 + edge-runtime: 2.5.1 esbuild: 0.14.47 + etag: 1.8.1 exit-hook: 2.2.1 - node-fetch: 2.6.7 - ts-node: 10.9.1(@types/node@14.18.33)(typescript@4.3.4) - typescript: 4.3.4 + node-fetch: 2.6.9 + path-to-regexp: 6.2.1 + ts-morph: 12.0.0 + ts-node: 10.9.1(@types/node@14.18.33)(typescript@4.9.5) + typescript: 4.9.5 + undici: 5.23.0 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' - encoding + - supports-color dev: true - /@vercel/python@3.1.58: - resolution: {integrity: sha512-RZJkNLyxZMuNcBwJMU589noyuNAq2pNxwAqrMs7bdBucWkNRTURiEh3/rWjUSADOq3eUx4vhfQDzwvaeZyRxoA==} + /@vercel/python@4.0.2: + resolution: {integrity: sha512-mmUeR3GBuDnaJK3IIHRoPl3bNevcWO3N/YrNAx+zxLPSHzfzmCLZbFVVXbzoKBi/cALiOPcApVhlQXwU26y7xg==} dev: true - /@vercel/redwood@1.1.14: - resolution: {integrity: sha512-QFIhLegvfVp2OLdv96krTyz6C5/cUncUg4CEEfx3U48+l31hWaWcnjI6+MhgN4PZC4YN+s21vKZNz/UWnGnTiA==} + /@vercel/redwood@2.0.3: + resolution: {integrity: sha512-efUqJjRxRhB+nw6OpYw3ptQyXAoWKA/qnzz1UKWfcL2yunCDrdvh2IL3O+Kjt2YqixJAH6DTK1B8lc6NhMoY/g==} dependencies: - '@vercel/nft': 0.22.5 - '@vercel/routing-utils': 2.2.0 - semver: 6.1.1 + '@vercel/nft': 0.24.1 + '@vercel/routing-utils': 3.0.0 + semver: 6.3.1 transitivePeerDependencies: - encoding - supports-color dev: true - /@vercel/remix-builder@1.8.4(@types/node@18.15.11)(ts-node@10.8.2): - resolution: {integrity: sha512-bexJo+z0kCZf2nhlne5TBcxWHQ4/xGT2JgmOJ5SaJOhhuZXt0BUZ3B38+2MPScUnItNWPSmn86xzp/VMWNuzuw==} + /@vercel/remix-builder@2.0.8: + resolution: {integrity: sha512-PQA4Iu47qKOEyOa0WqS3u9lSnVEGfq/9ZVY6+IlZfR1+bmCVx7c2PW7BOSBucwhn1qMD6TF2kka0fz48UXpVXQ==} dependencies: - '@remix-run/dev': /@vercel/remix-run-dev@1.15.0(@types/node@18.15.11)(ts-node@10.8.2) - '@vercel/build-utils': 6.7.1 - '@vercel/nft': 0.22.5 - '@vercel/static-config': 2.0.15 - path-to-regexp: 6.2.1 - semver: 7.3.8 + '@vercel/nft': 0.24.1 + '@vercel/static-config': 3.0.0 ts-morph: 12.0.0 transitivePeerDependencies: - - '@remix-run/serve' - - '@types/node' - - bluebird - - bufferutil - - encoding - - less - - sass - - stylus - - sugarss - - supports-color - - terser - - ts-node - - utf-8-validate - dev: true - - /@vercel/remix-run-dev@1.15.0(@types/node@18.15.11)(ts-node@10.8.2): - resolution: {integrity: sha512-pQTM5WmOzrvhpPSHFDShwqX71YnLaTUxffhnly4MxVNKJ2WKV9zqx8bGQ/7cLfpEu9JfY2c+pVjYYb3wAMBt+Q==} - engines: {node: '>=14'} - hasBin: true - peerDependencies: - '@remix-run/serve': ^1.15.0 - peerDependenciesMeta: - '@remix-run/serve': - optional: true - dependencies: - '@babel/core': 7.21.4 - '@babel/generator': 7.21.4 - '@babel/parser': 7.21.4 - '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.21.4) - '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.21.4) - '@babel/preset-env': 7.21.4(@babel/core@7.21.4) - '@babel/preset-typescript': 7.21.4(@babel/core@7.21.4) - '@babel/traverse': 7.21.4 - '@babel/types': 7.21.4 - '@esbuild-plugins/node-modules-polyfill': 0.1.4(esbuild@0.16.3) - '@npmcli/package-json': 2.0.0 - '@remix-run/server-runtime': 1.15.0 - '@vanilla-extract/integration': 6.2.1(@types/node@18.15.11) - arg: 5.0.2 - cacache: 15.3.0 - chalk: 4.1.2 - chokidar: 3.5.3 - dotenv: 16.0.3 - esbuild: 0.16.3 - execa: 5.1.1 - exit-hook: 2.2.1 - express: 4.18.2 - fast-glob: 3.2.11 - fs-extra: 10.1.0 - get-port: 5.1.1 - glob-to-regexp: 0.4.1 - gunzip-maybe: 1.4.2 - inquirer: 8.2.5 - jsesc: 3.0.2 - json5: 2.2.3 - lodash: 4.17.21 - lodash.debounce: 4.0.8 - lru-cache: 7.18.3 - minimatch: 3.1.2 - node-fetch: 2.6.9 - ora: 5.4.1 - postcss: 8.4.22 - postcss-discard-duplicates: 5.1.0(postcss@8.4.22) - postcss-load-config: 4.0.1(postcss@8.4.22)(ts-node@10.8.2) - postcss-modules: 6.0.0(postcss@8.4.22) - prettier: 2.7.1 - pretty-ms: 7.0.1 - proxy-agent: 5.0.0 - react-refresh: 0.14.0 - recast: 0.21.5 - remark-frontmatter: 4.0.1 - remark-mdx-frontmatter: 1.1.1 - semver: 7.5.4 - sort-package-json: 1.57.0 - tar-fs: 2.1.1 - tsconfig-paths: 4.2.0 - ws: 7.5.9 - xdm: 2.1.0 - transitivePeerDependencies: - - '@types/node' - - bluebird - - bufferutil - encoding - - less - - sass - - stylus - - sugarss - supports-color - - terser - - ts-node - - utf-8-validate dev: true - /@vercel/routing-utils@2.2.0: - resolution: {integrity: sha512-Ro90s1mStpbgu2HV8I4LFEKNG8GVxkWm238ebD/23BCO9/DxIJ3+wCzga8j8BMmG57x4etVlaHNV25bbzW5r2g==} + /@vercel/routing-utils@3.0.0: + resolution: {integrity: sha512-u+SoHnL+RzRQIRP+YxvigzzKXQcbgYQF9qCTIuWuoLw5h9thIYWcDJvz3KxrUzxjGZ3dWboXA29KAlT6eeaeFw==} dependencies: path-to-regexp: 6.1.0 optionalDependencies: ajv: 6.12.6 dev: true - /@vercel/ruby@1.3.75: - resolution: {integrity: sha512-sUmzJnd9O1N7StFEpKG9JvHJvHmJjgfrmhgQsQLEQ7OOQJkO9DYoLomlrIDW9qNdu7dNOeyj7gQY5B8y8RMntw==} + /@vercel/ruby@2.0.2: + resolution: {integrity: sha512-MqFynhtZ905L210DWAbgkiEQEK39LTtp9eL2Nm6PjzhjNzU6hV0UfK8Z24vU9CC6J4mrUTTZx396fH7XTYJWqg==} dev: true - /@vercel/static-build@1.3.23: - resolution: {integrity: sha512-SjlOOqZRoe/10Af3iSWKEo2+pFpTwroZj6pwF1iP7I9Y3G5IDObzOfpxgdpsKCWSlmUIr1sGOjf1fgoPctbdLw==} + /@vercel/static-build@2.0.7: + resolution: {integrity: sha512-MjEgxf9HaK7tjVqS/bSlVSGBxFw3hNHdrVEoGJNwMZEfocgBiFxFGaw0Vxki8FTs+F3cciXdxwi6+O1bjj91GA==} dependencies: - '@vercel/gatsby-plugin-vercel-analytics': 1.0.9 - '@vercel/gatsby-plugin-vercel-builder': 1.2.8 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - encoding + '@vercel/gatsby-plugin-vercel-analytics': 1.0.11 + '@vercel/gatsby-plugin-vercel-builder': 2.0.6 + '@vercel/static-config': 3.0.0 + ts-morph: 12.0.0 dev: true - /@vercel/static-config@2.0.15: - resolution: {integrity: sha512-A/N3ZGiOOMql9JArwBTIfhFngFtmVC7ndKQKp0FoFq8MO79AS5qBBtdpILS5QA71M5v+9CPjVkHxN6QweU55Xg==} + /@vercel/static-config@3.0.0: + resolution: {integrity: sha512-2qtvcBJ1bGY0dYGYh3iM7yGKkk971FujLEDXzuW5wcZsPr1GSEjO/w2iSr3qve6nDDtBImsGoDEnus5FI4+fIw==} dependencies: ajv: 8.6.3 json-schema-to-ts: 1.6.4 ts-morph: 12.0.0 dev: true - /@web3-storage/multipart-parser@1.0.0: - resolution: {integrity: sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==} - dev: true - /@webassemblyjs/ast@1.11.1: resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==} dependencies: '@webassemblyjs/helper-numbers': 1.11.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.1 + dev: true + + /@webassemblyjs/ast@1.11.6: + resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 /@webassemblyjs/floating-point-hex-parser@1.11.1: resolution: {integrity: sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==} + dev: true + + /@webassemblyjs/floating-point-hex-parser@1.11.6: + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} /@webassemblyjs/helper-api-error@1.11.1: resolution: {integrity: sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==} + dev: true + + /@webassemblyjs/helper-api-error@1.11.6: + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} /@webassemblyjs/helper-buffer@1.11.1: resolution: {integrity: sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==} + dev: true + + /@webassemblyjs/helper-buffer@1.11.6: + resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} /@webassemblyjs/helper-numbers@1.11.1: resolution: {integrity: sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==} @@ -9091,9 +9993,21 @@ packages: '@webassemblyjs/floating-point-hex-parser': 1.11.1 '@webassemblyjs/helper-api-error': 1.11.1 '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/helper-numbers@1.11.6: + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 /@webassemblyjs/helper-wasm-bytecode@1.11.1: resolution: {integrity: sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==} + dev: true + + /@webassemblyjs/helper-wasm-bytecode@1.11.6: + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} /@webassemblyjs/helper-wasm-section@1.11.1: resolution: {integrity: sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==} @@ -9102,19 +10016,44 @@ packages: '@webassemblyjs/helper-buffer': 1.11.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.1 '@webassemblyjs/wasm-gen': 1.11.1 + dev: true + + /@webassemblyjs/helper-wasm-section@1.11.6: + resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 /@webassemblyjs/ieee754@1.11.1: resolution: {integrity: sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==} dependencies: '@xtuc/ieee754': 1.2.0 + dev: true + + /@webassemblyjs/ieee754@1.11.6: + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + dependencies: + '@xtuc/ieee754': 1.2.0 /@webassemblyjs/leb128@1.11.1: resolution: {integrity: sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==} dependencies: '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/leb128@1.11.6: + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + dependencies: + '@xtuc/long': 4.2.2 /@webassemblyjs/utf8@1.11.1: resolution: {integrity: sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==} + dev: true + + /@webassemblyjs/utf8@1.11.6: + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} /@webassemblyjs/wasm-edit@1.11.1: resolution: {integrity: sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==} @@ -9127,6 +10066,19 @@ packages: '@webassemblyjs/wasm-opt': 1.11.1 '@webassemblyjs/wasm-parser': 1.11.1 '@webassemblyjs/wast-printer': 1.11.1 + dev: true + + /@webassemblyjs/wasm-edit@1.11.6: + resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-opt': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/wast-printer': 1.11.6 /@webassemblyjs/wasm-gen@1.11.1: resolution: {integrity: sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==} @@ -9136,6 +10088,16 @@ packages: '@webassemblyjs/ieee754': 1.11.1 '@webassemblyjs/leb128': 1.11.1 '@webassemblyjs/utf8': 1.11.1 + dev: true + + /@webassemblyjs/wasm-gen@1.11.6: + resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 /@webassemblyjs/wasm-opt@1.11.1: resolution: {integrity: sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==} @@ -9144,6 +10106,15 @@ packages: '@webassemblyjs/helper-buffer': 1.11.1 '@webassemblyjs/wasm-gen': 1.11.1 '@webassemblyjs/wasm-parser': 1.11.1 + dev: true + + /@webassemblyjs/wasm-opt@1.11.6: + resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 /@webassemblyjs/wasm-parser@1.11.1: resolution: {integrity: sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==} @@ -9154,12 +10125,30 @@ packages: '@webassemblyjs/ieee754': 1.11.1 '@webassemblyjs/leb128': 1.11.1 '@webassemblyjs/utf8': 1.11.1 + dev: true + + /@webassemblyjs/wasm-parser@1.11.6: + resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 /@webassemblyjs/wast-printer@1.11.1: resolution: {integrity: sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==} dependencies: '@webassemblyjs/ast': 1.11.1 '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/wast-printer@1.11.6: + resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@xtuc/long': 4.2.2 /@webpack-cli/configtest@2.0.1(webpack-cli@5.0.1)(webpack@5.78.0): resolution: {integrity: sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A==} @@ -9168,8 +10157,19 @@ packages: webpack: 5.x.x webpack-cli: 5.x.x dependencies: - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) + webpack: 5.78.0(webpack-cli@5.0.1) webpack-cli: 5.0.1(@webpack-cli/generators@3.0.1)(webpack@5.78.0) + dev: true + + /@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.88.2): + resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + dependencies: + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.88.2) /@webpack-cli/generators@3.0.1(mem-fs-editor@9.7.0)(mem-fs@2.3.0)(prettier@2.8.7)(webpack-cli@5.0.1)(webpack@5.78.0): resolution: {integrity: sha512-kgtqwN13udxC2wV2LfEmJQ/yGz6+j8cgy17jE9ybyHrmT0PJcwjSpsvj1fDWYUb7brSOB4B03s1mEPjZTRfwCQ==} @@ -9183,7 +10183,7 @@ packages: optional: true dependencies: prettier: 2.8.7 - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) + webpack: 5.78.0(webpack-cli@5.0.1) webpack-cli: 5.0.1(@webpack-cli/generators@3.0.1)(webpack@5.78.0) yeoman-environment: 3.15.1(mem-fs-editor@9.7.0)(mem-fs@2.3.0) yeoman-generator: 5.8.0(mem-fs@2.3.0)(yeoman-environment@3.15.1) @@ -9193,6 +10193,30 @@ packages: - mem-fs - mem-fs-editor - supports-color + dev: true + + /@webpack-cli/generators@3.0.7(mem-fs-editor@9.7.0)(mem-fs@2.3.0)(prettier@2.8.7)(webpack-cli@5.1.4)(webpack@5.88.2): + resolution: {integrity: sha512-H4dlEX8CzO5EHBYYZQop9x4w6lG9FenSF/1spLRlvRAULDgTs0VfmwOuwp03tTLml9jpMsouuVw6vEN8KpwE/w==} + engines: {node: '>=14.15.0'} + peerDependencies: + prettier: '*' + webpack: 5.x.x + webpack-cli: 5.x.x + peerDependenciesMeta: + prettier: + optional: true + dependencies: + prettier: 2.8.7 + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.88.2) + yeoman-environment: 3.15.1(mem-fs-editor@9.7.0)(mem-fs@2.3.0) + yeoman-generator: 5.8.0(mem-fs@2.3.0)(yeoman-environment@3.15.1) + transitivePeerDependencies: + - bluebird + - encoding + - mem-fs + - mem-fs-editor + - supports-color /@webpack-cli/info@2.0.1(webpack-cli@5.0.1)(webpack@5.78.0): resolution: {integrity: sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==} @@ -9201,8 +10225,19 @@ packages: webpack: 5.x.x webpack-cli: 5.x.x dependencies: - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) + webpack: 5.78.0(webpack-cli@5.0.1) webpack-cli: 5.0.1(@webpack-cli/generators@3.0.1)(webpack@5.78.0) + dev: true + + /@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.88.2): + resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + dependencies: + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.88.2) /@webpack-cli/serve@2.0.1(webpack-cli@5.0.1)(webpack@5.78.0): resolution: {integrity: sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw==} @@ -9215,8 +10250,23 @@ packages: webpack-dev-server: optional: true dependencies: - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) + webpack: 5.78.0(webpack-cli@5.0.1) webpack-cli: 5.0.1(@webpack-cli/generators@3.0.1)(webpack@5.78.0) + dev: true + + /@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.88.2): + resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + webpack-dev-server: '*' + peerDependenciesMeta: + webpack-dev-server: + optional: true + dependencies: + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.88.2) /@xobotyi/scrollbar-width@1.9.5: resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} @@ -9262,6 +10312,14 @@ packages: acorn: ^8 dependencies: acorn: 8.8.2 + dev: true + + /acorn-import-assertions@1.9.0(acorn@8.8.2): + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.8.2 /acorn-jsx@5.3.2(acorn@8.8.2): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -9336,10 +10394,6 @@ packages: clean-stack: 2.2.0 indent-string: 4.0.0 - /ahocorasick@1.0.2: - resolution: {integrity: sha512-hCOfMzbFx5IDutmWLAt6MZwOUjIfSM9G9FyVxytmE4Rs/5YDPWQrD/+IR1w+FweD9H2oOZEnv36TmkjhNURBVA==} - dev: true - /ajv-formats@2.1.1(ajv@8.12.0): resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -9465,6 +10519,14 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} + /ansi-to-html@0.7.2: + resolution: {integrity: sha512-v6MqmEpNlxF+POuyhKkidusCHWWkaLcGRURzivcU3I9tv7k4JVhFcnukrM5Rlk2rUywdZuzYAZ+kbZqWCnfN3g==} + engines: {node: '>=8.0.0'} + hasBin: true + dependencies: + entities: 2.2.0 + dev: true + /antd@5.4.2(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-OxXZ7joFf6Um4zeXm07tyJ9WV6eMwUw1KUmewfM/BDceUFVtJVf7YbBTBfX3JTl+jOuSpMSb4naFhOCgVwtyFw==} peerDependencies: @@ -9593,6 +10655,10 @@ packages: delegates: 1.0.0 readable-stream: 3.6.2 + /arg@4.1.0: + resolution: {integrity: sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==} + dev: true + /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} @@ -9716,23 +10782,18 @@ packages: /ast-types-flow@0.0.7: resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} - /ast-types@0.13.4: - resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} - engines: {node: '>=4'} - dependencies: - tslib: 2.5.0 + /async-listen@1.2.0: + resolution: {integrity: sha512-CcEtRh/oc9Jc4uWeUwdpG/+Mb2YUHKmdaTf0gUr7Wa+bfp4xx70HOb3RuSTJMvqKNB1TkdTfjLdrcz2X4rkkZA==} dev: true - /ast-types@0.15.2: - resolution: {integrity: sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==} - engines: {node: '>=4'} - dependencies: - tslib: 2.5.0 + /async-listen@3.0.0: + resolution: {integrity: sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg==} + engines: {node: '>= 14'} dev: true - /astring@1.8.4: - resolution: {integrity: sha512-97a+l2LBU3Op3bBQEff79i/E4jMD2ZLFD8rHx9B6mXyB2uQwhJQYfiDqUwtfjF4QA1F2qs//N6Cw8LetMbQjcw==} - hasBin: true + /async-listen@3.0.1: + resolution: {integrity: sha512-cWMaNwUJnf37C/S5TfCkk/15MwbPRwVYALA2jtjkbHjCmAPiDXyNJy2q3p1KAZzDLHAWyarUWSujUoHR4pEgrA==} + engines: {node: '>= 14'} dev: true /async-lock@1.4.0: @@ -9769,7 +10830,7 @@ packages: engines: {node: '>= 4.0.0'} dev: false - /autoprefixer@10.4.14(postcss@8.4.21): + /autoprefixer@10.4.14(postcss@8.4.30): resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} engines: {node: ^10 || ^12 || >=14} hasBin: true @@ -9781,14 +10842,14 @@ packages: fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.21 + postcss: 8.4.30 postcss-value-parser: 4.2.0 /autoprefixer@9.8.8: resolution: {integrity: sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==} hasBin: true dependencies: - browserslist: 4.21.5 + browserslist: 4.21.10 caniuse-lite: 1.0.30001478 normalize-range: 0.1.2 num2fraction: 1.2.2 @@ -9856,25 +10917,24 @@ packages: - supports-color dev: true - /babel-jest@29.5.0(@babel/core@7.21.4): - resolution: {integrity: sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==} + /babel-jest@29.7.0(@babel/core@7.21.4): + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: '@babel/core': 7.21.4 - '@jest/transform': 29.5.0 + '@jest/transform': 29.7.0 '@types/babel__core': 7.20.0 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.5.0(@babel/core@7.21.4) + babel-preset-jest: 29.6.3(@babel/core@7.21.4) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 transitivePeerDependencies: - supports-color - dev: true - /babel-loader@8.3.0(@babel/core@7.21.4)(webpack@5.78.0): + /babel-loader@8.3.0(@babel/core@7.21.4)(webpack@5.88.2): resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} engines: {node: '>= 8.9'} peerDependencies: @@ -9886,7 +10946,7 @@ packages: loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) dev: false /babel-loader@9.1.2(@babel/core@7.21.4)(webpack@5.78.0): @@ -9899,14 +10959,27 @@ packages: '@babel/core': 7.21.4 find-cache-dir: 3.3.2 schema-utils: 4.0.0 - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) + webpack: 5.78.0(webpack-cli@5.0.1) + dev: true + + /babel-loader@9.1.3(@babel/core@7.21.4)(webpack@5.88.2): + resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} + engines: {node: '>= 14.15.0'} + peerDependencies: + '@babel/core': ^7.12.0 + webpack: '>=5' + dependencies: + '@babel/core': 7.21.4 + find-cache-dir: 4.0.0 + schema-utils: 4.0.0 + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) dev: true /babel-plugin-istanbul@6.1.1: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -9918,8 +10991,8 @@ packages: resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/template': 7.20.7 - '@babel/types': 7.21.4 + '@babel/template': 7.22.15 + '@babel/types': 7.22.17 '@types/babel__core': 7.20.0 '@types/babel__traverse': 7.18.3 dev: false @@ -9928,21 +11001,20 @@ packages: resolution: {integrity: sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - '@babel/template': 7.20.7 - '@babel/types': 7.21.4 + '@babel/template': 7.22.15 + '@babel/types': 7.22.17 '@types/babel__core': 7.20.0 '@types/babel__traverse': 7.18.3 dev: true - /babel-plugin-jest-hoist@29.5.0: - resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==} + /babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/template': 7.20.7 - '@babel/types': 7.21.4 + '@babel/template': 7.22.15 + '@babel/types': 7.22.17 '@types/babel__core': 7.20.0 '@types/babel__traverse': 7.18.3 - dev: true /babel-plugin-macros@2.8.0: resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==} @@ -9961,8 +11033,8 @@ packages: resolve: 1.22.2 dev: false - /babel-plugin-named-asset-import@0.4.0-next.14(@babel/core@7.21.4): - resolution: {integrity: sha512-MazwHExK09ffj7qGS++lmcPNXG7dB2BDF8vLmO1dgkK3p10fV4NNE9hljmwoiDM52vgeMd9hJW9GBOCEnEpL/Q==} + /babel-plugin-named-asset-import@0.3.8(@babel/core@7.21.4): + resolution: {integrity: sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==} peerDependencies: '@babel/core': ^7.1.0 dependencies: @@ -9977,7 +11049,19 @@ packages: '@babel/compat-data': 7.21.4 '@babel/core': 7.21.4 '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) - semver: 6.3.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /babel-plugin-polyfill-corejs2@0.4.5(@babel/core@7.21.4): + resolution: {integrity: sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/core': 7.21.4 + '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.21.4) + semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -9992,13 +11076,34 @@ packages: transitivePeerDependencies: - supports-color + /babel-plugin-polyfill-corejs3@0.8.3(@babel/core@7.21.4): + resolution: {integrity: sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.21.4) + core-js-compat: 3.32.2 + transitivePeerDependencies: + - supports-color + /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.21.4): resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) + transitivePeerDependencies: + - supports-color + + /babel-plugin-polyfill-regenerator@0.5.2(@babel/core@7.21.4): + resolution: {integrity: sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) + '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.21.4) transitivePeerDependencies: - supports-color @@ -10060,19 +11165,18 @@ packages: babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.4) dev: true - /babel-preset-jest@29.5.0(@babel/core@7.21.4): - resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} + /babel-preset-jest@29.6.3(@babel/core@7.21.4): + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.21.4 - babel-plugin-jest-hoist: 29.5.0 + babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.4) - dev: true - /babel-preset-react-app@10.1.0-next.14: - resolution: {integrity: sha512-/xYDXmFaTFqny9vVvsaNigvt0zzFRjjgi/3oTCeg3UzPKcWW1O6WG9JyeAV3d47Sewyr7i5B57nL5or32Vnn6A==} + /babel-preset-react-app@10.0.1: + resolution: {integrity: sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==} dependencies: '@babel/core': 7.21.4 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.21.4) @@ -10081,12 +11185,13 @@ packages: '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.21.4) '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.21.4) '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-proposal-private-property-in-object': 7.21.0(@babel/core@7.21.4) '@babel/plugin-transform-flow-strip-types': 7.21.0(@babel/core@7.21.4) '@babel/plugin-transform-react-display-name': 7.18.6(@babel/core@7.21.4) '@babel/plugin-transform-runtime': 7.21.4(@babel/core@7.21.4) - '@babel/preset-env': 7.21.4(@babel/core@7.21.4) + '@babel/preset-env': 7.22.15(@babel/core@7.21.4) '@babel/preset-react': 7.18.6(@babel/core@7.21.4) - '@babel/preset-typescript': 7.21.4(@babel/core@7.21.4) + '@babel/preset-typescript': 7.22.15(@babel/core@7.21.4) '@babel/runtime': 7.21.0 babel-plugin-macros: 3.1.0 babel-plugin-transform-react-remove-prop-types: 0.4.24 @@ -10101,10 +11206,6 @@ packages: regenerator-runtime: 0.10.5 dev: false - /bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - dev: true - /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -10141,7 +11242,6 @@ packages: /big-integer@1.6.51: resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} engines: {node: '>=0.6'} - dev: false /big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} @@ -10229,6 +11329,13 @@ packages: resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} dev: false + /bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + dependencies: + big-integer: 1.6.51 + dev: true + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -10257,11 +11364,15 @@ packages: resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} dev: false - /browserify-zlib@0.1.4: - resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} + /browserslist@4.21.10: + resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true dependencies: - pako: 0.2.9 - dev: true + caniuse-lite: 1.0.30001534 + electron-to-chromium: 1.4.520 + node-releases: 2.0.13 + update-browserslist-db: 1.0.11(browserslist@4.21.10) /browserslist@4.21.5: resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} @@ -10285,8 +11396,8 @@ packages: dependencies: node-int64: 0.4.0 - /bson@5.2.0: - resolution: {integrity: sha512-HevkSpDbpUfsrHWmWiAsNavANKYIErV2ePXllp1bwq5CDreAaFVj6RVlZpJnxK4WWDCJ/5jMUpaY6G526q3Hjg==} + /bson@5.5.0: + resolution: {integrity: sha512-B+QB4YmDx9RStKv8LLSl/aVIEV3nYJc3cJNNTK2Cd1TL+7P+cNpw9mAPeCgc5K+j01Dv6sxUzcITXDx7ZU3F0w==} engines: {node: '>=14.20.1'} dev: false @@ -10324,12 +11435,18 @@ packages: /builtins@1.0.3: resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} + /bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + dependencies: + run-applescript: 5.0.0 + dev: true + /busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} dependencies: streamsearch: 1.1.0 - dev: false /byline@5.0.0: resolution: {integrity: sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==} @@ -10341,15 +11458,15 @@ packages: engines: {node: '>= 0.8'} dev: false + /bytes@3.1.0: + resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==} + engines: {node: '>= 0.8'} + dev: true + /bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - /cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - dev: true - /cacache@15.3.0: resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} engines: {node: '>= 10'} @@ -10400,24 +11517,6 @@ packages: transitivePeerDependencies: - bluebird - /cacheable-lookup@5.0.4: - resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} - engines: {node: '>=10.6.0'} - dev: true - - /cacheable-request@7.0.2: - resolution: {integrity: sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==} - engines: {node: '>=8'} - dependencies: - clone-response: 1.0.3 - get-stream: 5.2.0 - http-cache-semantics: 4.1.1 - keyv: 4.5.2 - lowercase-keys: 2.0.0 - normalize-url: 6.1.0 - responselike: 2.0.1 - dev: true - /call-bind@1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: @@ -10458,7 +11557,7 @@ packages: resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} dependencies: pascal-case: 3.1.2 - tslib: 2.5.0 + tslib: 2.6.2 dev: false /camelcase-css@2.0.1: @@ -10476,8 +11575,8 @@ packages: /caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: - browserslist: 4.21.5 - caniuse-lite: 1.0.30001480 + browserslist: 4.21.10 + caniuse-lite: 1.0.30001534 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 @@ -10487,6 +11586,9 @@ packages: /caniuse-lite@1.0.30001480: resolution: {integrity: sha512-q7cpoPPvZYgtyC4VaBSN0Bt+PJ4c4EYRf0DrduInOz2SkFpHD5p3LnvEpqBp7UnJn+8x1Ogl1s38saUxe+ihQQ==} + /caniuse-lite@1.0.30001534: + resolution: {integrity: sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==} + /case-sensitive-paths-webpack-plugin@2.4.0: resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} engines: {node: '>=4'} @@ -10533,9 +11635,10 @@ packages: ansi-styles: 4.3.0 supports-color: 7.2.0 - /chalk@5.2.0: - resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true /char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} @@ -10546,22 +11649,6 @@ packages: engines: {node: '>=12.20'} dev: false - /character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - dev: true - - /character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - dev: true - - /character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - dev: true - - /character-reference-invalid@2.0.1: - resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - dev: true - /chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} @@ -10593,6 +11680,21 @@ packages: parse5-htmlparser2-tree-adapter: 7.0.0 dev: false + /chokidar@3.3.1: + resolution: {integrity: sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.3.0 + optionalDependencies: + fsevents: 2.1.3 + dev: true + /chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} @@ -10653,7 +11755,7 @@ packages: webpack: '>=4.0.0 <6.0.0' dependencies: del: 4.1.1 - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) + webpack: 5.78.0(webpack-cli@5.0.1) dev: true /cli-cursor@3.1.0: @@ -10676,6 +11778,11 @@ packages: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} + /cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + dev: true + /client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} dev: false @@ -10686,6 +11793,7 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + dev: false /cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} @@ -10694,7 +11802,6 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: true /clone-buffer@1.0.0: resolution: {integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==} @@ -10708,12 +11815,6 @@ packages: kind-of: 6.0.3 shallow-clone: 3.0.1 - /clone-response@1.0.3: - resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} - dependencies: - mimic-response: 1.0.1 - dev: true - /clone-stats@1.0.0: resolution: {integrity: sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==} @@ -10821,8 +11922,13 @@ packages: delayed-stream: 1.0.0 dev: false - /comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + /commander@11.0.0: + resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} + engines: {node: '>=16'} dev: true /commander@2.20.3: @@ -10854,13 +11960,13 @@ packages: /commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} + dev: true /common-ancestor-path@1.0.1: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} /common-path-prefix@3.0.0: resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} - dev: false /common-tags@1.8.2: resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} @@ -10938,8 +12044,8 @@ packages: proto-list: 1.2.4 dev: false - /confusing-browser-globals@1.1.0-next.14: - resolution: {integrity: sha512-shpUugMlZFU47qCZ4BuoAoAlUKOjiO7Nhn1aVFx1RADeAbKdgJ1iFc18b9KPY5GRr4EnU22boZrMSlo/NfQzwQ==} + /confusing-browser-globals@1.0.11: + resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} dev: false /connect-history-api-fallback@2.0.0: @@ -10956,6 +12062,11 @@ packages: dependencies: safe-buffer: 5.2.1 + /content-type@1.0.4: + resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} + engines: {node: '>= 0.6'} + dev: true + /content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} @@ -10970,7 +12081,6 @@ packages: /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true /cookie-parser@1.4.6: resolution: {integrity: sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==} @@ -10988,10 +12098,6 @@ packages: engines: {node: '>= 0.6'} dev: true - /cookie@0.4.2: - resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} - engines: {node: '>= 0.6'} - /cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} @@ -11019,13 +12125,18 @@ packages: normalize-path: 3.0.0 schema-utils: 4.0.0 serialize-javascript: 6.0.1 - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) + webpack: 5.78.0(webpack-cli@5.0.1) dev: true /core-js-compat@3.30.1: resolution: {integrity: sha512-d690npR7MC6P0gq4npTl5n2VQeNAmUrJ90n+MHiKS7W2+xno4o3F5GDEuylSdi6EJ3VssibSGXOa1r3YXD3Mhw==} dependencies: - browserslist: 4.21.5 + browserslist: 4.21.10 + + /core-js-compat@3.32.2: + resolution: {integrity: sha512-+GjlguTDINOijtVRUxrQOv3kfu9rl+qPNdX2LTbJ/ZyVTuxK+ksVSAGX1nHstu4hrv1En/uPTtWgq2gI5wt4AQ==} + dependencies: + browserslist: 4.21.10 /core-js-pure@3.30.0: resolution: {integrity: sha512-+2KbMFGeBU0ln/csoPqTe0i/yfHbrd2EUhNMObsGtXMKS/RTtlkYyi+/3twLcevbgNR0yM/r0Psa3TEoQRpFMQ==} @@ -11100,6 +12211,43 @@ packages: readable-stream: 3.6.2 dev: true + /create-jest@29.7.0(@types/node@16.18.23)(ts-node@10.8.2): + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@16.18.23)(ts-node@10.8.2) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + /create-jest@29.7.0(@types/node@18.15.11)(ts-node@10.8.2): + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -11111,6 +12259,14 @@ packages: - encoding dev: false + /cross-fetch@4.0.0: + resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: true + /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -11128,14 +12284,14 @@ packages: engines: {node: '>=8'} dev: false - /css-blank-pseudo@3.0.3(postcss@8.4.21): + /css-blank-pseudo@3.0.3(postcss@8.4.30): resolution: {integrity: sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==} engines: {node: ^12 || ^14 || >=16} hasBin: true peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-selector-parser: 6.0.11 dev: false @@ -11151,23 +12307,23 @@ packages: timsort: 0.3.0 dev: true - /css-declaration-sorter@6.4.0(postcss@8.4.21): + /css-declaration-sorter@6.4.0(postcss@8.4.30): resolution: {integrity: sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew==} engines: {node: ^10 || ^12 || >=14} peerDependencies: postcss: ^8.0.9 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 dev: false - /css-has-pseudo@3.0.4(postcss@8.4.21): + /css-has-pseudo@3.0.4(postcss@8.4.30): resolution: {integrity: sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==} engines: {node: ^12 || ^14 || >=16} hasBin: true peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-selector-parser: 6.0.11 dev: false @@ -11177,24 +12333,24 @@ packages: hyphenate-style-name: 1.0.4 dev: false - /css-loader@6.7.3(webpack@5.78.0): + /css-loader@6.7.3(webpack@5.88.2): resolution: {integrity: sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.21) - postcss: 8.4.21 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.21) - postcss-modules-local-by-default: 4.0.0(postcss@8.4.21) - postcss-modules-scope: 3.0.0(postcss@8.4.21) - postcss-modules-values: 4.0.0(postcss@8.4.21) + icss-utils: 5.1.0(postcss@8.4.30) + postcss: 8.4.30 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.30) + postcss-modules-local-by-default: 4.0.0(postcss@8.4.30) + postcss-modules-scope: 3.0.0(postcss@8.4.30) + postcss-modules-values: 4.0.0(postcss@8.4.30) postcss-value-parser: 4.2.0 semver: 7.5.4 - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) dev: false - /css-minimizer-webpack-plugin@3.4.1(esbuild@0.16.3)(webpack@5.78.0): + /css-minimizer-webpack-plugin@3.4.1(webpack@5.88.2): resolution: {integrity: sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -11213,14 +12369,13 @@ packages: esbuild: optional: true dependencies: - cssnano: 5.1.15(postcss@8.4.21) - esbuild: 0.16.3 + cssnano: 5.1.15(postcss@8.4.30) jest-worker: 27.5.1 - postcss: 8.4.21 + postcss: 8.4.30 schema-utils: 4.0.0 serialize-javascript: 6.0.1 source-map: 0.6.1 - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) dev: false /css-modules-loader-core@1.1.0: @@ -11234,14 +12389,14 @@ packages: postcss-modules-values: 1.3.0 dev: true - /css-prefers-color-scheme@6.0.3(postcss@8.4.21): + /css-prefers-color-scheme@6.0.3(postcss@8.4.30): resolution: {integrity: sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==} engines: {node: ^12 || ^14 || >=16} hasBin: true peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 dev: false /css-select-base-adapter@0.1.1: @@ -11300,11 +12455,6 @@ packages: resolution: {integrity: sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==} engines: {node: '>= 6'} - /css-what@5.1.0: - resolution: {integrity: sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==} - engines: {node: '>= 6'} - dev: true - /css-what@6.1.0: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'} @@ -11359,42 +12509,42 @@ packages: postcss-unique-selectors: 4.0.1 dev: true - /cssnano-preset-default@5.2.14(postcss@8.4.21): + /cssnano-preset-default@5.2.14(postcss@8.4.30): resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - css-declaration-sorter: 6.4.0(postcss@8.4.21) - cssnano-utils: 3.1.0(postcss@8.4.21) - postcss: 8.4.21 - postcss-calc: 8.2.4(postcss@8.4.21) - postcss-colormin: 5.3.1(postcss@8.4.21) - postcss-convert-values: 5.1.3(postcss@8.4.21) - postcss-discard-comments: 5.1.2(postcss@8.4.21) - postcss-discard-duplicates: 5.1.0(postcss@8.4.21) - postcss-discard-empty: 5.1.1(postcss@8.4.21) - postcss-discard-overridden: 5.1.0(postcss@8.4.21) - postcss-merge-longhand: 5.1.7(postcss@8.4.21) - postcss-merge-rules: 5.1.4(postcss@8.4.21) - postcss-minify-font-values: 5.1.0(postcss@8.4.21) - postcss-minify-gradients: 5.1.1(postcss@8.4.21) - postcss-minify-params: 5.1.4(postcss@8.4.21) - postcss-minify-selectors: 5.2.1(postcss@8.4.21) - postcss-normalize-charset: 5.1.0(postcss@8.4.21) - postcss-normalize-display-values: 5.1.0(postcss@8.4.21) - postcss-normalize-positions: 5.1.1(postcss@8.4.21) - postcss-normalize-repeat-style: 5.1.1(postcss@8.4.21) - postcss-normalize-string: 5.1.0(postcss@8.4.21) - postcss-normalize-timing-functions: 5.1.0(postcss@8.4.21) - postcss-normalize-unicode: 5.1.1(postcss@8.4.21) - postcss-normalize-url: 5.1.0(postcss@8.4.21) - postcss-normalize-whitespace: 5.1.1(postcss@8.4.21) - postcss-ordered-values: 5.1.3(postcss@8.4.21) - postcss-reduce-initial: 5.1.2(postcss@8.4.21) - postcss-reduce-transforms: 5.1.0(postcss@8.4.21) - postcss-svgo: 5.1.0(postcss@8.4.21) - postcss-unique-selectors: 5.1.1(postcss@8.4.21) + css-declaration-sorter: 6.4.0(postcss@8.4.30) + cssnano-utils: 3.1.0(postcss@8.4.30) + postcss: 8.4.30 + postcss-calc: 8.2.4(postcss@8.4.30) + postcss-colormin: 5.3.1(postcss@8.4.30) + postcss-convert-values: 5.1.3(postcss@8.4.30) + postcss-discard-comments: 5.1.2(postcss@8.4.30) + postcss-discard-duplicates: 5.1.0(postcss@8.4.30) + postcss-discard-empty: 5.1.1(postcss@8.4.30) + postcss-discard-overridden: 5.1.0(postcss@8.4.30) + postcss-merge-longhand: 5.1.7(postcss@8.4.30) + postcss-merge-rules: 5.1.4(postcss@8.4.30) + postcss-minify-font-values: 5.1.0(postcss@8.4.30) + postcss-minify-gradients: 5.1.1(postcss@8.4.30) + postcss-minify-params: 5.1.4(postcss@8.4.30) + postcss-minify-selectors: 5.2.1(postcss@8.4.30) + postcss-normalize-charset: 5.1.0(postcss@8.4.30) + postcss-normalize-display-values: 5.1.0(postcss@8.4.30) + postcss-normalize-positions: 5.1.1(postcss@8.4.30) + postcss-normalize-repeat-style: 5.1.1(postcss@8.4.30) + postcss-normalize-string: 5.1.0(postcss@8.4.30) + postcss-normalize-timing-functions: 5.1.0(postcss@8.4.30) + postcss-normalize-unicode: 5.1.1(postcss@8.4.30) + postcss-normalize-url: 5.1.0(postcss@8.4.30) + postcss-normalize-whitespace: 5.1.1(postcss@8.4.30) + postcss-ordered-values: 5.1.3(postcss@8.4.30) + postcss-reduce-initial: 5.1.2(postcss@8.4.30) + postcss-reduce-transforms: 5.1.0(postcss@8.4.30) + postcss-svgo: 5.1.0(postcss@8.4.30) + postcss-unique-selectors: 5.1.1(postcss@8.4.30) dev: false /cssnano-util-get-arguments@4.0.0: @@ -11419,13 +12569,13 @@ packages: engines: {node: '>=6.9.0'} dev: true - /cssnano-utils@3.1.0(postcss@8.4.21): + /cssnano-utils@3.1.0(postcss@8.4.30): resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 dev: false /cssnano@4.1.11: @@ -11438,15 +12588,15 @@ packages: postcss: 7.0.39 dev: true - /cssnano@5.1.15(postcss@8.4.21): + /cssnano@5.1.15(postcss@8.4.30): resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-preset-default: 5.2.14(postcss@8.4.21) + cssnano-preset-default: 5.2.14(postcss@8.4.30) lilconfig: 2.1.0 - postcss: 8.4.21 + postcss: 8.4.30 yaml: 1.10.2 dev: false @@ -11477,7 +12627,6 @@ packages: /cuid@2.1.8: resolution: {integrity: sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg==} deprecated: Cuid and other k-sortable and non-cryptographic ids (Ulid, ObjectId, KSUID, all UUIDs) are all insecure. Use @paralleldrive/cuid2 instead. - dev: false /damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -11486,9 +12635,9 @@ packages: resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} engines: {node: '>=8'} - /data-uri-to-buffer@3.0.1: - resolution: {integrity: sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==} - engines: {node: '>= 6'} + /data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} dev: true /data-urls@2.0.0: @@ -11511,16 +12660,6 @@ packages: /dayjs@1.11.10: resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} - /deasync@0.1.28: - resolution: {integrity: sha512-QqLF6inIDwiATrfROIyQtwOQxjZuek13WRYZ7donU5wJPLoP67MnYxA6QtqdvdBy2mMqv5m3UefBVdJjvevOYg==} - engines: {node: '>=0.11.0'} - requiresBuild: true - dependencies: - bindings: 1.5.0 - node-addon-api: 1.7.2 - dev: true - optional: true - /debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -11542,6 +12681,18 @@ packages: ms: 2.1.3 supports-color: 5.5.0 + /debug@4.1.1: + resolution: {integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==} + deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -11564,12 +12715,6 @@ packages: resolution: {integrity: sha512-bgeoSOZYTOOdiNUZd/U8K6Z+6IrM/X+DgUcm3/VI1l130lzOBeL+ObetjIkKksxcj0zUJbLaFRFumFGYDOQ9fg==} dev: true - /decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} - dependencies: - character-entities: 2.0.2 - dev: true - /decompress-response@4.2.1: resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} engines: {node: '>=8'} @@ -11582,11 +12727,19 @@ packages: engines: {node: '>=10'} dependencies: mimic-response: 3.1.0 - dev: true + dev: false /dedent@0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + /dedent@1.5.1: + resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + /deep-equal@2.2.0: resolution: {integrity: sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==} dependencies: @@ -11615,14 +12768,28 @@ packages: /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - /deep-object-diff@1.1.9: - resolution: {integrity: sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==} - dev: true - /deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} + /default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + dependencies: + bplist-parser: 0.2.0 + untildify: 4.0.0 + dev: true + + /default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + dependencies: + bundle-name: 3.0.0 + default-browser-id: 3.0.0 + execa: 7.2.0 + titleize: 3.0.0 + dev: true + /default-gateway@6.0.3: resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} engines: {node: '>= 10'} @@ -11635,15 +12802,15 @@ packages: dependencies: clone: 1.0.4 - /defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} - dev: true - /define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} + /define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + dev: true + /define-properties@1.2.0: resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} engines: {node: '>= 0.4'} @@ -11651,16 +12818,6 @@ packages: has-property-descriptors: 1.0.0 object-keys: 1.1.1 - /degenerator@3.0.3: - resolution: {integrity: sha512-FTq/qYMeBJACu1gHcXJvzsRBTK6aw5zWCYbEnIOyamOt5UJufWJRQ5XfDb6OuayfJWvmWAHgcZyt43vm/hbj7g==} - engines: {node: '>= 6'} - dependencies: - ast-types: 0.13.4 - escodegen: 1.14.3 - esprima: 4.0.1 - vm2: 3.9.17 - dev: true - /del@4.1.1: resolution: {integrity: sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==} engines: {node: '>=6'} @@ -11689,7 +12846,6 @@ packages: /depd@1.1.2: resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} engines: {node: '>= 0.6'} - dev: false /depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} @@ -11698,20 +12854,10 @@ packages: /deprecation@2.3.1: resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} - /dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - dev: true - /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - /detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - dev: true - /detect-libc@1.0.3: resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} engines: {node: '>=0.10'} @@ -11721,7 +12867,6 @@ packages: /detect-libc@2.0.1: resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} engines: {node: '>=8'} - dev: true /detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} @@ -11770,6 +12915,10 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -11935,7 +13084,7 @@ packages: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dependencies: no-case: 3.0.4 - tslib: 2.5.0 + tslib: 2.6.2 dev: false /dot-prop@5.3.0: @@ -11986,15 +13135,6 @@ packages: /duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - /duplexify@3.7.1: - resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} - dependencies: - end-of-stream: 1.4.4 - inherits: 2.0.4 - readable-stream: 2.3.8 - stream-shift: 1.0.1 - dev: true - /duplexify@4.1.2: resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==} dependencies: @@ -12010,18 +13150,19 @@ packages: safe-buffer: 5.2.1 dev: false - /edge-runtime@2.0.0: - resolution: {integrity: sha512-TmRJhKi4mlM1e+zgF4CSzVU5gJ1sWj7ia+XhVgZ8PYyYUxk4PPjJU8qScpSLsAbdSxoBghLxdMuwuCzdYLd1sQ==} + /edge-runtime@2.5.1: + resolution: {integrity: sha512-E0kY1Dqvwvk9yh7dvR56KnCjXf/dlbrrGjO5Sjnz9Ja3WqYT3csv2B8O4erxJiOWfWy9NTukBk4Kb3yrR66gBw==} + engines: {node: '>=16'} hasBin: true dependencies: - '@edge-runtime/format': 1.1.0 - '@edge-runtime/vm': 2.0.0 - exit-hook: 2.2.1 - http-status: 1.5.3 + '@edge-runtime/format': 2.2.0 + '@edge-runtime/vm': 3.1.1 + async-listen: 3.0.1 mri: 1.2.0 picocolors: 1.0.0 pretty-bytes: 5.6.0 pretty-ms: 7.0.1 + signal-exit: 4.0.2 time-span: 4.0.0 dev: true @@ -12048,6 +13189,9 @@ packages: /electron-to-chromium@1.4.368: resolution: {integrity: sha512-e2aeCAixCj9M7nJxdB/wDjO6mbYX+lJJxSJCXDzlr5YPGYVofuJwGN9nKg2o6wWInjX6XmxRinn3AeJMK81ltw==} + /electron-to-chromium@1.4.520: + resolution: {integrity: sha512-Frfus2VpYADsrh1lB3v/ft/WVFlVzOIm+Q0p7U7VqHI6qr7NWHYKe+Wif3W50n7JAFoBsWVsoU0+qDks6WQ60g==} + /emittery@0.10.2: resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} engines: {node: '>=12'} @@ -12055,7 +13199,6 @@ packages: /emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} - dev: true /emittery@0.8.1: resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} @@ -12083,6 +13226,12 @@ packages: iconv-lite: 0.6.3 optional: true + /end-of-stream@1.1.0: + resolution: {integrity: sha512-EoulkdKF/1xa92q25PbjuDcgJ9RDHYU2Rs3SCIvs2/dSQ3BpmxneNHmA/M7fe60M3PrV7nNGTTNbkK62l6vXiQ==} + dependencies: + once: 1.3.3 + dev: true + /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: @@ -12094,6 +13243,7 @@ packages: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 + dev: true /enhanced-resolve@5.13.0: resolution: {integrity: sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==} @@ -12101,6 +13251,14 @@ packages: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 + dev: true + + /enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 /ent@2.2.0: resolution: {integrity: sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==} @@ -12212,6 +13370,7 @@ packages: /es-module-lexer@0.9.3: resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} + dev: true /es-module-lexer@1.2.1: resolution: {integrity: sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==} @@ -12449,65 +13608,6 @@ packages: esbuild-windows-arm64: 0.14.47 dev: true - /esbuild@0.16.3: - resolution: {integrity: sha512-71f7EjPWTiSguen8X/kxEpkAS7BFHwtQKisCDDV3Y4GLGWBaoSCyD5uXkaUew6JDzA9FEN1W23mdnSwW9kqCeg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.16.3 - '@esbuild/android-arm64': 0.16.3 - '@esbuild/android-x64': 0.16.3 - '@esbuild/darwin-arm64': 0.16.3 - '@esbuild/darwin-x64': 0.16.3 - '@esbuild/freebsd-arm64': 0.16.3 - '@esbuild/freebsd-x64': 0.16.3 - '@esbuild/linux-arm': 0.16.3 - '@esbuild/linux-arm64': 0.16.3 - '@esbuild/linux-ia32': 0.16.3 - '@esbuild/linux-loong64': 0.16.3 - '@esbuild/linux-mips64el': 0.16.3 - '@esbuild/linux-ppc64': 0.16.3 - '@esbuild/linux-riscv64': 0.16.3 - '@esbuild/linux-s390x': 0.16.3 - '@esbuild/linux-x64': 0.16.3 - '@esbuild/netbsd-x64': 0.16.3 - '@esbuild/openbsd-x64': 0.16.3 - '@esbuild/sunos-x64': 0.16.3 - '@esbuild/win32-arm64': 0.16.3 - '@esbuild/win32-ia32': 0.16.3 - '@esbuild/win32-x64': 0.16.3 - - /esbuild@0.17.6: - resolution: {integrity: sha512-TKFRp9TxrJDdRWfSsSERKEovm6v30iHnrjlcGhLBOtReE28Yp1VSBRfO3GTaOFMoxsNerx4TjrhzSuma9ha83Q==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.17.6 - '@esbuild/android-arm64': 0.17.6 - '@esbuild/android-x64': 0.17.6 - '@esbuild/darwin-arm64': 0.17.6 - '@esbuild/darwin-x64': 0.17.6 - '@esbuild/freebsd-arm64': 0.17.6 - '@esbuild/freebsd-x64': 0.17.6 - '@esbuild/linux-arm': 0.17.6 - '@esbuild/linux-arm64': 0.17.6 - '@esbuild/linux-ia32': 0.17.6 - '@esbuild/linux-loong64': 0.17.6 - '@esbuild/linux-mips64el': 0.17.6 - '@esbuild/linux-ppc64': 0.17.6 - '@esbuild/linux-riscv64': 0.17.6 - '@esbuild/linux-s390x': 0.17.6 - '@esbuild/linux-x64': 0.17.6 - '@esbuild/netbsd-x64': 0.17.6 - '@esbuild/openbsd-x64': 0.17.6 - '@esbuild/sunos-x64': 0.17.6 - '@esbuild/win32-arm64': 0.17.6 - '@esbuild/win32-ia32': 0.17.6 - '@esbuild/win32-x64': 0.17.6 - dev: true - /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -12532,6 +13632,11 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: true + /escodegen@1.14.3: resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} engines: {node: '>=4.0'} @@ -12543,6 +13648,8 @@ packages: optionator: 0.8.3 optionalDependencies: source-map: 0.6.1 + dev: false + optional: true /escodegen@2.0.0: resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} @@ -12607,27 +13714,32 @@ packages: - supports-color dev: true - /eslint-config-react-app@7.1.0-next.14(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.21.0)(eslint@8.38.0)(jest@27.5.1)(typescript@4.9.5): - resolution: {integrity: sha512-E7nP1tWYDe2y3bS6MVIt/Iw3R3fYqhRqcQXGeMf066ohUaYoIZMbPpi69MjCxwjaqQOJUoYTKNO5oPwwc5Wpkg==} + /eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.21.0)(eslint@8.29.0)(jest@27.5.1)(typescript@4.9.5): + resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} engines: {node: '>=14.0.0'} peerDependencies: eslint: ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true dependencies: '@babel/core': 7.21.4 - '@babel/eslint-parser': 7.21.3(@babel/core@7.21.4)(eslint@8.38.0) + '@babel/eslint-parser': 7.21.3(@babel/core@7.21.4)(eslint@8.29.0) '@rushstack/eslint-patch': 1.2.0 - '@typescript-eslint/eslint-plugin': 5.58.0(@typescript-eslint/parser@5.58.0)(eslint@8.38.0)(typescript@4.9.5) - '@typescript-eslint/parser': 5.58.0(eslint@8.38.0)(typescript@4.9.5) - babel-preset-react-app: 10.1.0-next.14 - confusing-browser-globals: 1.1.0-next.14 - eslint: 8.38.0 - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.21.0)(eslint@8.38.0) + '@typescript-eslint/eslint-plugin': 5.58.0(@typescript-eslint/parser@5.58.0)(eslint@8.29.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.58.0(eslint@8.29.0)(typescript@4.9.5) + babel-preset-react-app: 10.0.1 + confusing-browser-globals: 1.0.11 + eslint: 8.29.0 + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.21.0)(eslint@8.29.0) eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.29.0) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.58.0)(eslint@8.38.0)(jest@27.5.1)(typescript@4.9.5) - eslint-plugin-jsx-a11y: 6.7.1(eslint@8.38.0) - eslint-plugin-react: 7.32.2(eslint@8.38.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.38.0) - eslint-plugin-testing-library: 5.10.2(eslint@8.38.0)(typescript@4.9.5) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.58.0)(eslint@8.29.0)(jest@27.5.1)(typescript@4.9.5) + eslint-plugin-jsx-a11y: 6.7.1(eslint@8.29.0) + eslint-plugin-react: 7.32.2(eslint@8.29.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.29.0) + eslint-plugin-testing-library: 5.10.2(eslint@8.29.0)(typescript@4.9.5) + typescript: 4.9.5 transitivePeerDependencies: - '@babel/plugin-syntax-flow' - '@babel/plugin-transform-react-jsx' @@ -12635,7 +13747,6 @@ packages: - eslint-import-resolver-webpack - jest - supports-color - - typescript dev: false /eslint-import-resolver-node@0.3.7: @@ -12672,7 +13783,7 @@ packages: eslint-plugin-import: '*' dependencies: debug: 4.3.4 - enhanced-resolve: 5.12.0 + enhanced-resolve: 5.15.0 eslint: 8.24.0 eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.24.0) eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.29.0) @@ -12747,7 +13858,7 @@ packages: - supports-color dev: true - /eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.21.0)(eslint@8.38.0): + /eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.21.0)(eslint@8.29.0): resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -12757,7 +13868,7 @@ packages: dependencies: '@babel/plugin-syntax-flow': 7.21.4(@babel/core@7.21.4) '@babel/plugin-transform-react-jsx': 7.21.0(@babel/core@7.21.4) - eslint: 8.38.0 + eslint: 8.29.0 lodash: 4.17.21 string-natural-compare: 3.0.1 dev: false @@ -12787,14 +13898,14 @@ packages: minimatch: 3.1.2 object.values: 1.1.6 resolve: 1.22.2 - semver: 6.3.0 + semver: 6.3.1 tsconfig-paths: 3.14.2 transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.58.0)(eslint@8.38.0)(jest@27.5.1)(typescript@4.9.5): + /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.58.0)(eslint@8.29.0)(jest@27.5.1)(typescript@4.9.5): resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} peerDependencies: @@ -12807,9 +13918,9 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.58.0(@typescript-eslint/parser@5.58.0)(eslint@8.38.0)(typescript@4.9.5) - '@typescript-eslint/experimental-utils': 5.58.0(eslint@8.38.0)(typescript@4.9.5) - eslint: 8.38.0 + '@typescript-eslint/eslint-plugin': 5.58.0(@typescript-eslint/parser@5.58.0)(eslint@8.29.0)(typescript@4.9.5) + '@typescript-eslint/experimental-utils': 5.58.0(eslint@8.29.0)(typescript@4.9.5) + eslint: 8.29.0 jest: 27.5.1(ts-node@10.8.2) transitivePeerDependencies: - supports-color @@ -12838,7 +13949,7 @@ packages: minimatch: 3.1.2 object.entries: 1.1.6 object.fromentries: 2.0.6 - semver: 6.3.0 + semver: 6.3.1 dev: true /eslint-plugin-jsx-a11y@6.7.1(eslint@8.29.0): @@ -12863,32 +13974,7 @@ packages: minimatch: 3.1.2 object.entries: 1.1.6 object.fromentries: 2.0.6 - semver: 6.3.0 - dev: false - - /eslint-plugin-jsx-a11y@6.7.1(eslint@8.38.0): - resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - dependencies: - '@babel/runtime': 7.21.0 - aria-query: 5.1.3 - array-includes: 3.1.6 - array.prototype.flatmap: 1.3.1 - ast-types-flow: 0.0.7 - axe-core: 4.6.3 - axobject-query: 3.1.1 - damerau-levenshtein: 1.0.8 - emoji-regex: 9.2.2 - eslint: 8.38.0 - has: 1.0.3 - jsx-ast-utils: 3.3.3 - language-tags: 1.0.5 - minimatch: 3.1.2 - object.entries: 1.1.6 - object.fromentries: 2.0.6 - semver: 6.3.0 + semver: 6.3.1 dev: false /eslint-plugin-react-hooks@4.6.0(eslint@8.24.0): @@ -12897,25 +13983,16 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: - eslint: 8.24.0 - dev: true - - /eslint-plugin-react-hooks@4.6.0(eslint@8.29.0): - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - dependencies: - eslint: 8.29.0 - dev: false + eslint: 8.24.0 + dev: true - /eslint-plugin-react-hooks@4.6.0(eslint@8.38.0): + /eslint-plugin-react-hooks@4.6.0(eslint@8.29.0): resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: - eslint: 8.38.0 + eslint: 8.29.0 dev: false /eslint-plugin-react@7.32.2(eslint@8.24.0): @@ -12938,7 +14015,7 @@ packages: object.values: 1.1.6 prop-types: 15.8.1 resolve: 2.0.0-next.4 - semver: 6.3.0 + semver: 6.3.1 string.prototype.matchall: 4.0.8 dev: true @@ -12962,42 +14039,18 @@ packages: object.values: 1.1.6 prop-types: 15.8.1 resolve: 2.0.0-next.4 - semver: 6.3.0 - string.prototype.matchall: 4.0.8 - dev: false - - /eslint-plugin-react@7.32.2(eslint@8.38.0): - resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - dependencies: - array-includes: 3.1.6 - array.prototype.flatmap: 1.3.1 - array.prototype.tosorted: 1.1.1 - doctrine: 2.1.0 - eslint: 8.38.0 - estraverse: 5.3.0 - jsx-ast-utils: 3.3.3 - minimatch: 3.1.2 - object.entries: 1.1.6 - object.fromentries: 2.0.6 - object.hasown: 1.1.2 - object.values: 1.1.6 - prop-types: 15.8.1 - resolve: 2.0.0-next.4 - semver: 6.3.0 + semver: 6.3.1 string.prototype.matchall: 4.0.8 dev: false - /eslint-plugin-testing-library@5.10.2(eslint@8.38.0)(typescript@4.9.5): + /eslint-plugin-testing-library@5.10.2(eslint@8.29.0)(typescript@4.9.5): resolution: {integrity: sha512-f1DmDWcz5SDM+IpCkEX0lbFqrrTs8HRsEElzDEqN/EBI0hpRj8Cns5+IVANXswE8/LeybIJqPAOQIFu2j5Y5sw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} peerDependencies: eslint: ^7.5.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.58.0(eslint@8.38.0)(typescript@4.9.5) - eslint: 8.38.0 + '@typescript-eslint/utils': 5.58.0(eslint@8.29.0)(typescript@4.9.5) + eslint: 8.29.0 transitivePeerDependencies: - supports-color - typescript @@ -13063,7 +14116,7 @@ packages: resolution: {integrity: sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /eslint-webpack-plugin@3.2.0(eslint@8.38.0)(webpack@5.78.0): + /eslint-webpack-plugin@3.2.0(eslint@8.29.0)(webpack@5.88.2): resolution: {integrity: sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -13071,12 +14124,12 @@ packages: webpack: ^5.0.0 dependencies: '@types/eslint': 8.37.0 - eslint: 8.38.0 + eslint: 8.29.0 jest-worker: 28.1.3 micromatch: 4.0.5 normalize-path: 3.0.0 schema-utils: 4.0.0 - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) dev: false /eslint@8.24.0: @@ -13174,55 +14227,6 @@ packages: transitivePeerDependencies: - supports-color - /eslint@8.38.0: - resolution: {integrity: sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.38.0) - '@eslint-community/regexpp': 4.5.0 - '@eslint/eslintrc': 2.0.2 - '@eslint/js': 8.38.0 - '@humanwhocodes/config-array': 0.11.8 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.1.1 - eslint-visitor-keys: 3.4.0 - espree: 9.5.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.20.0 - grapheme-splitter: 1.0.4 - ignore: 5.2.4 - import-fresh: 3.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-sdsl: 4.4.0 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.1 - strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: false - /espree@9.5.1: resolution: {integrity: sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -13256,42 +14260,6 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} - /estree-util-attach-comments@2.1.1: - resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} - dependencies: - '@types/estree': 1.0.1 - dev: true - - /estree-util-build-jsx@2.2.2: - resolution: {integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==} - dependencies: - '@types/estree-jsx': 1.0.0 - estree-util-is-identifier-name: 2.1.0 - estree-walker: 3.0.3 - dev: true - - /estree-util-is-identifier-name@1.1.0: - resolution: {integrity: sha512-OVJZ3fGGt9By77Ix9NhaRbzfbDV/2rx9EP7YIDJTmsZSEc5kYn2vWcNccYyahJL2uAQZK2a5Or2i0wtIKTPoRQ==} - dev: true - - /estree-util-is-identifier-name@2.1.0: - resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} - dev: true - - /estree-util-value-to-estree@1.3.0: - resolution: {integrity: sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw==} - engines: {node: '>=12.0.0'} - dependencies: - is-plain-obj: 3.0.0 - dev: true - - /estree-util-visit@1.2.1: - resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} - dependencies: - '@types/estree-jsx': 1.0.0 - '@types/unist': 2.0.6 - dev: true - /estree-walker@0.6.1: resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} dev: true @@ -13302,12 +14270,6 @@ packages: /estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - /estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - dependencies: - '@types/estree': 1.0.1 - dev: true - /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -13316,13 +14278,6 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} - /eval@0.1.6: - resolution: {integrity: sha512-o0XUw+5OGkXw4pJZzQoXUk+H87DHuC+7ZE//oSrRGtatTmr12oTnLfg6QOq9DyTt0c/p4TwzgmkKrBzWTSizyQ==} - engines: {node: '>= 0.8'} - dependencies: - require-like: 0.1.2 - dev: true - /event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} @@ -13331,10 +14286,30 @@ packages: /eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + /events-intercept@2.0.0: + resolution: {integrity: sha512-blk1va0zol9QOrdZt0rFXo5KMkNPVSp92Eju/Qz8THwKWKRKeE0T8Br/1aW6+Edkyq9xHYgYxn2QtOnUKPUp+Q==} + dev: true + /events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} + /execa@3.2.0: + resolution: {integrity: sha512-kJJfVbI/lZE1PZYDI5VPxp8zXPO9rtxOkhpZ0jMKha56AI9y2gGVC6bkukStQf0ka5Rh15BA5m7cCCH4jmHqkw==} + engines: {node: ^8.12.0 || >=9.7.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + p-finally: 2.0.1 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -13349,6 +14324,21 @@ packages: signal-exit: 3.0.7 strip-final-newline: 2.0.0 + /execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: true + /exit-hook@2.2.1: resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} engines: {node: '>=6'} @@ -13395,6 +14385,16 @@ packages: jest-util: 29.5.0 dev: true + /expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + /express@4.18.2: resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} engines: {node: '>= 0.10.0'} @@ -13435,6 +14435,7 @@ packages: /extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: false /external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} @@ -13447,17 +14448,6 @@ packages: /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - /fast-glob@3.2.11: - resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: true - /fast-glob@3.2.12: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} @@ -13485,9 +14475,10 @@ packages: /fast-text-encoding@1.0.6: resolution: {integrity: sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==} dev: false + optional: true - /fast-xml-parser@4.1.2: - resolution: {integrity: sha512-CDYeykkle1LiA/uqQyNwYpFbyF6Axec6YapmpUP+/RHWIoR1zKjocdvNaTsxCxZzQ6v9MLXaSYm9Qq0thv0DHg==} + /fast-xml-parser@4.2.5: + resolution: {integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==} hasBin: true dependencies: strnum: 1.0.5 @@ -13510,12 +14501,6 @@ packages: dependencies: reusify: 1.0.4 - /fault@2.0.1: - resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} - dependencies: - format: 0.2.2 - dev: true - /faye-websocket@0.11.4: resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} engines: {node: '>=0.8.0'} @@ -13553,6 +14538,12 @@ packages: - encoding dev: false + /fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + dev: true + /fetch-blob@3.2.0: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} @@ -13560,6 +14551,12 @@ packages: node-domexception: 1.0.0 web-streams-polyfill: 3.2.1 + /figlet@1.6.0: + resolution: {integrity: sha512-31EQGhCEITv6+hi2ORRPyn3bulaV9Fl4xOdR169cBzH/n1UqcxsiSB/noo6SJdD7Kfb1Ljit+IgR1USvF/XbdA==} + engines: {node: '>= 0.4.0'} + hasBin: true + dev: false + /figures@1.7.0: resolution: {integrity: sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==} engines: {node: '>=0.10.0'} @@ -13574,32 +14571,35 @@ packages: dependencies: escape-string-regexp: 1.0.5 + /figures@5.0.0: + resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} + engines: {node: '>=14'} + dependencies: + escape-string-regexp: 5.0.0 + is-unicode-supported: 1.3.0 + dev: true + /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.0.4 - /file-loader@6.2.0(webpack@5.78.0): + /file-loader@6.2.0(webpack@5.88.2): resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} engines: {node: '>= 10.13.0'} peerDependencies: webpack: ^4.0.0 || ^5.0.0 dependencies: loader-utils: 2.0.4 - schema-utils: 3.1.1 - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) + schema-utils: 3.3.0 + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) dev: false /file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} dev: true - /file-uri-to-path@2.0.0: - resolution: {integrity: sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==} - engines: {node: '>= 6'} - dev: true - /filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} dependencies: @@ -13643,6 +14643,14 @@ packages: make-dir: 3.1.0 pkg-dir: 4.2.0 + /find-cache-dir@4.0.0: + resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} + engines: {node: '>=14.16'} + dependencies: + common-path-prefix: 3.0.0 + pkg-dir: 7.0.0 + dev: true + /find-free-port@2.0.0: resolution: {integrity: sha512-J1j8gfEVf5FN4PR5w5wrZZ7NYs2IvqsHcd03cAeQx3Ec/mo+lKceaVNhpsRKoZpZKbId88o8qh+dwUwzBV6WCg==} dev: true @@ -13668,62 +14676,71 @@ packages: locate-path: 6.0.0 path-exists: 4.0.0 + /find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + dev: true + /find-yarn-workspace-root2@1.2.16: resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} dependencies: micromatch: 4.0.5 pkg-dir: 4.2.0 - /firebase-admin@11.6.0: - resolution: {integrity: sha512-Kvjs+u/EHs+8B4pNOehbXkazEVMNmTQjkz+B5vUIvWWWR44GOiZj4lBf/hM5An4k3rFkBfO6G4s0kWi7QMOm3g==} + /firebase-admin@11.10.1: + resolution: {integrity: sha512-atv1E6GbuvcvWaD3eHwrjeP5dAVs+EaHEJhu9CThMzPY6In8QYDiUR6tq5SwGl4SdA/GcAU0nhwWc/FSJsAzfQ==} engines: {node: '>=14'} dependencies: '@fastify/busboy': 1.2.1 '@firebase/database-compat': 0.3.4 '@firebase/database-types': 0.10.4 '@types/node': 18.15.11 - jsonwebtoken: 9.0.0 + jsonwebtoken: 9.0.2 jwks-rsa: 3.0.1 node-forge: 1.3.1 uuid: 9.0.0 optionalDependencies: - '@google-cloud/firestore': 6.5.0 + '@google-cloud/firestore': 6.7.0 '@google-cloud/storage': 6.9.5 transitivePeerDependencies: - encoding - supports-color dev: false - /firebase@9.19.1: - resolution: {integrity: sha512-MeukV4NIk6usV1ZbnoA36gumK62JzxOZmF6OZyqkFwJ7edpAEyYNZXvExQlFsvnx2ery0UwNIvu4pKIZS3HiEQ==} + /firebase@10.4.0: + resolution: {integrity: sha512-3Z8WsNwA7kbcKGZ+nrTZ/ES518pk0K440ZJYD8nUNKN5hV6ll+unhUw30t1msedN6yIFjhsC/9OwT4Z0ohwO2w==} dependencies: - '@firebase/analytics': 0.9.5(@firebase/app@0.9.7) - '@firebase/analytics-compat': 0.2.5(@firebase/app-compat@0.2.7)(@firebase/app@0.9.7) - '@firebase/app': 0.9.7 - '@firebase/app-check': 0.6.4(@firebase/app@0.9.7) - '@firebase/app-check-compat': 0.3.4(@firebase/app-compat@0.2.7)(@firebase/app@0.9.7) - '@firebase/app-compat': 0.2.7 + '@firebase/analytics': 0.10.0(@firebase/app@0.9.19) + '@firebase/analytics-compat': 0.2.6(@firebase/app-compat@0.2.19)(@firebase/app@0.9.19) + '@firebase/app': 0.9.19 + '@firebase/app-check': 0.8.0(@firebase/app@0.9.19) + '@firebase/app-check-compat': 0.3.7(@firebase/app-compat@0.2.19)(@firebase/app@0.9.19) + '@firebase/app-compat': 0.2.19 '@firebase/app-types': 0.9.0 - '@firebase/auth': 0.22.0(@firebase/app@0.9.7) - '@firebase/auth-compat': 0.3.7(@firebase/app-compat@0.2.7)(@firebase/app-types@0.9.0)(@firebase/app@0.9.7) - '@firebase/database': 0.14.4 - '@firebase/database-compat': 0.3.4 - '@firebase/firestore': 3.10.0(@firebase/app@0.9.7) - '@firebase/firestore-compat': 0.3.6(@firebase/app-compat@0.2.7)(@firebase/app-types@0.9.0)(@firebase/app@0.9.7) - '@firebase/functions': 0.9.4(@firebase/app@0.9.7) - '@firebase/functions-compat': 0.3.4(@firebase/app-compat@0.2.7)(@firebase/app@0.9.7) - '@firebase/installations': 0.6.4(@firebase/app@0.9.7) - '@firebase/installations-compat': 0.2.4(@firebase/app-compat@0.2.7)(@firebase/app-types@0.9.0)(@firebase/app@0.9.7) - '@firebase/messaging': 0.12.4(@firebase/app@0.9.7) - '@firebase/messaging-compat': 0.2.4(@firebase/app-compat@0.2.7)(@firebase/app@0.9.7) - '@firebase/performance': 0.6.4(@firebase/app@0.9.7) - '@firebase/performance-compat': 0.2.4(@firebase/app-compat@0.2.7)(@firebase/app@0.9.7) - '@firebase/remote-config': 0.4.4(@firebase/app@0.9.7) - '@firebase/remote-config-compat': 0.2.4(@firebase/app-compat@0.2.7)(@firebase/app@0.9.7) - '@firebase/storage': 0.11.2(@firebase/app@0.9.7) - '@firebase/storage-compat': 0.3.2(@firebase/app-compat@0.2.7)(@firebase/app-types@0.9.0)(@firebase/app@0.9.7) + '@firebase/auth': 1.3.0(@firebase/app@0.9.19) + '@firebase/auth-compat': 0.4.6(@firebase/app-compat@0.2.19)(@firebase/app-types@0.9.0)(@firebase/app@0.9.19) + '@firebase/database': 1.0.1 + '@firebase/database-compat': 1.0.1 + '@firebase/firestore': 4.2.0(@firebase/app@0.9.19) + '@firebase/firestore-compat': 0.3.18(@firebase/app-compat@0.2.19)(@firebase/app-types@0.9.0)(@firebase/app@0.9.19) + '@firebase/functions': 0.10.0(@firebase/app@0.9.19) + '@firebase/functions-compat': 0.3.5(@firebase/app-compat@0.2.19)(@firebase/app@0.9.19) + '@firebase/installations': 0.6.4(@firebase/app@0.9.19) + '@firebase/installations-compat': 0.2.4(@firebase/app-compat@0.2.19)(@firebase/app-types@0.9.0)(@firebase/app@0.9.19) + '@firebase/messaging': 0.12.4(@firebase/app@0.9.19) + '@firebase/messaging-compat': 0.2.4(@firebase/app-compat@0.2.19)(@firebase/app@0.9.19) + '@firebase/performance': 0.6.4(@firebase/app@0.9.19) + '@firebase/performance-compat': 0.2.4(@firebase/app-compat@0.2.19)(@firebase/app@0.9.19) + '@firebase/remote-config': 0.4.4(@firebase/app@0.9.19) + '@firebase/remote-config-compat': 0.2.4(@firebase/app-compat@0.2.19)(@firebase/app@0.9.19) + '@firebase/storage': 0.11.2(@firebase/app@0.9.19) + '@firebase/storage-compat': 0.3.2(@firebase/app-compat@0.2.19)(@firebase/app-types@0.9.0)(@firebase/app@0.9.19) '@firebase/util': 1.9.3 transitivePeerDependencies: + - '@react-native-async-storage/async-storage' - encoding /first-chunk-stream@2.0.0: @@ -13769,7 +14786,7 @@ packages: dependencies: is-callable: 1.2.7 - /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.38.0)(typescript@4.9.5)(webpack@5.78.0): + /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.29.0)(typescript@4.9.5)(webpack@5.88.2): resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} engines: {node: '>=10', yarn: '>=1.0.0'} peerDependencies: @@ -13783,13 +14800,13 @@ packages: vue-template-compiler: optional: true dependencies: - '@babel/code-frame': 7.21.4 + '@babel/code-frame': 7.22.13 '@types/json-schema': 7.0.11 chalk: 4.1.2 chokidar: 3.5.3 cosmiconfig: 6.0.0 deepmerge: 4.3.1 - eslint: 8.38.0 + eslint: 8.29.0 fs-extra: 9.1.0 glob: 7.2.3 memfs: 3.5.0 @@ -13798,7 +14815,7 @@ packages: semver: 7.5.4 tapable: 1.1.3 typescript: 4.9.5 - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) dev: false /form-data@3.0.1: @@ -13819,11 +14836,6 @@ packages: mime-types: 2.1.35 dev: false - /format@0.2.2: - resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} - engines: {node: '>=0.4.x'} - dev: true - /formdata-polyfill@4.0.10: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} @@ -13851,6 +14863,7 @@ packages: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.0 + dev: false /fs-extra@11.1.0: resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} @@ -13880,6 +14893,12 @@ packages: universalify: 2.0.0 dev: false + /fs-minipass@1.2.7: + resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} + dependencies: + minipass: 2.9.0 + dev: true + /fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} @@ -13893,6 +14912,15 @@ packages: /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + /fsevents@2.1.3: + resolution: {integrity: sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + deprecated: '"Please update to latest v2.3 or v2.2"' + requiresBuild: true + dev: true + optional: true + /fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -13900,14 +14928,6 @@ packages: requiresBuild: true optional: true - /ftp@0.3.10: - resolution: {integrity: sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==} - engines: {node: '>=0.8.0'} - dependencies: - readable-stream: 1.1.14 - xregexp: 2.0.0 - dev: true - /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} @@ -13968,20 +14988,6 @@ packages: strip-ansi: 6.0.1 wide-align: 1.1.5 - /gaxios@4.3.3: - resolution: {integrity: sha512-gSaYYIO1Y3wUtdfHmjDUZ8LWaxJQpiavzbF5Kq53akSzvmVg0RfyOcFDbO1KJ/KCGRFz2qG+lS81F0nkr7cRJA==} - engines: {node: '>=10'} - dependencies: - abort-controller: 3.0.0 - extend: 3.0.2 - https-proxy-agent: 5.0.1 - is-stream: 2.0.1 - node-fetch: 2.6.9 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - /gaxios@5.1.0: resolution: {integrity: sha512-aezGIjb+/VfsJtIcHGcBSerNEDdfdHeMros+RbYbGpmonKWQCOVOes0LVZhn1lDtIgq55qq0HaxymIoae3Fl/A==} engines: {node: '>=12'} @@ -13989,7 +14995,7 @@ packages: extend: 3.0.2 https-proxy-agent: 5.0.1 is-stream: 2.0.1 - node-fetch: 2.6.9 + node-fetch: 2.7.0 transitivePeerDependencies: - encoding - supports-color @@ -14003,18 +15009,7 @@ packages: extend: 3.0.2 https-proxy-agent: 7.0.1 is-stream: 2.0.1 - node-fetch: 2.6.9 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /gcp-metadata@4.3.1: - resolution: {integrity: sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==} - engines: {node: '>=10'} - dependencies: - gaxios: 4.3.3 - json-bigint: 1.0.0 + node-fetch: 2.7.0 transitivePeerDependencies: - encoding - supports-color @@ -14049,10 +15044,9 @@ packages: loader-utils: 1.4.2 dev: true - /generic-names@4.0.0: - resolution: {integrity: sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==} - dependencies: - loader-utils: 3.2.1 + /generic-pool@3.4.2: + resolution: {integrity: sha512-H7cUpwCQSiJmAHM4c/aFu6fUfrhWXW1ncyh8ftxEPMu6AiYkHw9K8br720TGPZJbk5eOH2bynjZD1yPvdDAmag==} + engines: {node: '>= 4'} dev: true /gensync@1.0.0-beta.2: @@ -14105,24 +15099,6 @@ packages: resolution: {integrity: sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==} dev: true - /get-uri@3.0.2: - resolution: {integrity: sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==} - engines: {node: '>= 6'} - dependencies: - '@tootallnate/once': 1.1.2 - data-uri-to-buffer: 3.0.1 - debug: 4.3.4 - file-uri-to-path: 2.0.0 - fs-extra: 8.1.0 - ftp: 0.3.10 - transitivePeerDependencies: - - supports-color - dev: true - - /git-hooks-list@1.0.3: - resolution: {integrity: sha512-Y7wLWcrLUXwk2noSka166byGCvhMtDRpgHdzCno1UQv/n/Hegp++a2xBWJL1lJarnKD3SWaljD+0z1ztqxuKyQ==} - dev: true - /github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} dev: false @@ -14226,20 +15202,6 @@ packages: resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} dev: true - /globby@10.0.0: - resolution: {integrity: sha512-3LifW9M4joGZasyYPz2A1U74zbC/45fvpXUvO/9KbSa+VV0aGZarWkfdgKyR9sExNP0t0x0ss/UMJpNpcaTspw==} - engines: {node: '>=8'} - dependencies: - '@types/glob': 7.2.0 - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.2.12 - glob: 7.2.3 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - dev: true - /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -14277,24 +15239,6 @@ packages: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} dev: true - /google-auth-library@7.14.1: - resolution: {integrity: sha512-5Rk7iLNDFhFeBYc3s8l1CqzbEBcdhwR193RlD4vSNFajIcINKI8W8P0JLmBpwymHqqWbX34pJDQu39cSy/6RsA==} - engines: {node: '>=10'} - dependencies: - arrify: 2.0.1 - base64-js: 1.5.1 - ecdsa-sig-formatter: 1.0.11 - fast-text-encoding: 1.0.6 - gaxios: 4.3.3 - gcp-metadata: 4.3.1 - gtoken: 5.3.2 - jws: 4.0.0 - lru-cache: 6.0.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - /google-auth-library@8.7.0: resolution: {integrity: sha512-1M0NG5VDIvJZEnstHbRdckLZESoJwguinwN8Dhae0j2ZKIQFIV63zxm6Fo6nM4xkgqUr2bbMtV5Dgo+Hy6oo0Q==} engines: {node: '>=12'} @@ -14336,7 +15280,7 @@ packages: hasBin: true dependencies: '@grpc/grpc-js': 1.8.13 - '@grpc/proto-loader': 0.7.6 + '@grpc/proto-loader': 0.7.10 '@types/long': 4.0.2 '@types/rimraf': 3.0.2 abort-controller: 3.0.0 @@ -14344,7 +15288,7 @@ packages: fast-text-encoding: 1.0.6 google-auth-library: 8.7.0 is-stream-ended: 0.1.4 - node-fetch: 2.6.9 + node-fetch: 2.7.0 object-hash: 3.0.0 proto3-json-serializer: 1.1.1 protobufjs: 7.2.3 @@ -14366,7 +15310,7 @@ packages: abort-controller: 3.0.0 duplexify: 4.1.2 google-auth-library: 9.0.0 - node-fetch: 2.6.9 + node-fetch: 2.7.0 object-hash: 3.0.0 proto3-json-serializer: 1.1.1 protobufjs: 7.2.4 @@ -14376,14 +15320,6 @@ packages: - supports-color dev: false - /google-p12-pem@3.1.4: - resolution: {integrity: sha512-HHuHmkLgwjdmVRngf5+gSmpkyaRI6QmOg77J8tkNBHhNEI62sGHyw4/+UkgyZEI7h84NbWprXDJ+sa3xOYFvTg==} - engines: {node: '>=10'} - hasBin: true - dependencies: - node-forge: 1.3.1 - dev: false - /google-p12-pem@4.0.1: resolution: {integrity: sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==} engines: {node: '>=12.0.0'} @@ -14393,27 +15329,27 @@ packages: dev: false optional: true - /googleapis-common@5.1.0: - resolution: {integrity: sha512-RXrif+Gzhq1QAzfjxulbGvAY3FPj8zq/CYcvgjzDbaBNCD6bUl+86I7mUs4DKWHGruuK26ijjR/eDpWIDgNROA==} - engines: {node: '>=10.10.0'} + /googleapis-common@7.0.0: + resolution: {integrity: sha512-58iSybJPQZ8XZNMpjrklICefuOuyJ0lMxfKmBqmaC0/xGT4SiOs4BE60LAOOGtBURy1n8fHa2X2YUNFEWWbXyQ==} + engines: {node: '>=14.0.0'} dependencies: extend: 3.0.2 - gaxios: 4.3.3 - google-auth-library: 7.14.1 + gaxios: 6.0.4 + google-auth-library: 9.0.0 qs: 6.11.1 url-template: 2.0.8 - uuid: 8.3.2 + uuid: 9.0.0 transitivePeerDependencies: - encoding - supports-color dev: false - /googleapis@100.0.0: - resolution: {integrity: sha512-RToFQGY54B756IDbjdyjb1vWFmn03bYpXHB2lIf0eq2UBYsIbYOLZ0kqSomfJnpclEukwEmMF7Jn6Wsev871ew==} - engines: {node: '>=10'} + /googleapis@126.0.1: + resolution: {integrity: sha512-4N8LLi+hj6ytK3PhE52KcM8iSGhJjtXnCDYB4fp6l+GdLbYz4FoDmx074WqMbl7iYMDN87vqD/8drJkhxW92mQ==} + engines: {node: '>=14.0.0'} dependencies: - google-auth-library: 7.14.1 - googleapis-common: 5.1.0 + google-auth-library: 9.0.0 + googleapis-common: 7.0.0 transitivePeerDependencies: - encoding - supports-color @@ -14424,23 +15360,6 @@ packages: dependencies: get-intrinsic: 1.2.0 - /got@11.8.6: - resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} - engines: {node: '>=10.19.0'} - dependencies: - '@sindresorhus/is': 4.6.0 - '@szmarczak/http-timer': 4.0.6 - '@types/cacheable-request': 6.0.3 - '@types/responselike': 1.0.0 - cacheable-lookup: 5.0.4 - cacheable-request: 7.0.2 - decompress-response: 6.0.0 - http2-wrapper: 1.0.3 - lowercase-keys: 2.0.0 - p-cancelable: 2.1.1 - responselike: 2.0.1 - dev: true - /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -14451,18 +15370,6 @@ packages: resolution: {integrity: sha512-/PiFUa7WIsl48dUeCvhIHnwNmAAzlI/eHoJl0vu3nsFA366JleY7Ff8EVTplZu5kO0MIdZjKTTnzItL61ahbnw==} engines: {node: '>=8.0.0'} - /gtoken@5.3.2: - resolution: {integrity: sha512-gkvEKREW7dXWF8NV8pVrKfW7WqReAmjjkMBh6lNCCGOM4ucS0r0YyXXl0r/9Yj8wcW/32ISkfc8h5mPTDbtifQ==} - engines: {node: '>=10'} - dependencies: - gaxios: 4.3.3 - google-p12-pem: 3.1.4 - jws: 4.0.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - /gtoken@6.1.2: resolution: {integrity: sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==} engines: {node: '>=12.0.0'} @@ -14487,18 +15394,6 @@ packages: - supports-color dev: false - /gunzip-maybe@1.4.2: - resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} - hasBin: true - dependencies: - browserify-zlib: 0.1.4 - is-deflate: 1.0.0 - is-gzip: 1.0.0 - peek-stream: 1.1.3 - pumpify: 1.5.1 - through2: 2.0.5 - dev: true - /gzip-size@3.0.0: resolution: {integrity: sha512-6s8trQiK+OMzSaCSVXX+iqIcLV9tC+E73jrJrJTyS4h/AJhlxHvzFKqM1YLDJWRGgHX8uLkBeXkA0njNj39L4w==} engines: {node: '>=0.12.0'} @@ -14580,32 +15475,6 @@ packages: dependencies: function-bind: 1.1.1 - /hast-util-to-estree@2.3.2: - resolution: {integrity: sha512-YYDwATNdnvZi3Qi84iatPIl1lWpXba1MeNrNbDfJfVzEBZL8uUmtR7mt7bxKBC8kuAuvb0bkojXYZzsNHyHCLg==} - dependencies: - '@types/estree': 1.0.1 - '@types/estree-jsx': 1.0.0 - '@types/hast': 2.3.4 - '@types/unist': 2.0.6 - comma-separated-tokens: 2.0.3 - estree-util-attach-comments: 2.1.1 - estree-util-is-identifier-name: 2.1.0 - hast-util-whitespace: 2.0.1 - mdast-util-mdx-expression: 1.3.2 - mdast-util-mdxjs-esm: 1.3.1 - property-information: 6.2.0 - space-separated-tokens: 2.0.2 - style-to-object: 0.4.1 - unist-util-position: 4.0.4 - zwitch: 2.0.4 - transitivePeerDependencies: - - supports-color - dev: true - - /hast-util-whitespace@2.0.1: - resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} - dev: true - /he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true @@ -14682,7 +15551,7 @@ packages: he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.16.9 + terser: 5.19.4 dev: false /html-minifier@4.0.0: @@ -14699,7 +15568,7 @@ packages: uglify-js: 3.17.4 dev: false - /html-webpack-plugin@5.5.0(webpack@5.78.0): + /html-webpack-plugin@5.5.0(webpack@5.88.2): resolution: {integrity: sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==} engines: {node: '>=10.13.0'} peerDependencies: @@ -14710,7 +15579,7 @@ packages: lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) dev: false /htmlparser2@5.0.1: @@ -14747,6 +15616,14 @@ packages: resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} dev: false + /http-errors@1.4.0: + resolution: {integrity: sha512-oLjPqve1tuOl5aRhv8GK5eHpqP1C9fb+Ol+XTLjKfLltE44zdDbEdjPSbU7Ch5rSNsVFqZn97SrMmZLdu1/YMw==} + engines: {node: '>= 0.6'} + dependencies: + inherits: 2.0.1 + statuses: 1.5.0 + dev: true + /http-errors@1.6.3: resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} engines: {node: '>= 0.6'} @@ -14757,6 +15634,17 @@ packages: statuses: 1.5.0 dev: false + /http-errors@1.7.3: + resolution: {integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.1.1 + statuses: 1.5.0 + toidentifier: 1.0.0 + dev: true + /http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} @@ -14820,19 +15708,6 @@ packages: - debug dev: false - /http-status@1.5.3: - resolution: {integrity: sha512-jCClqdnnwigYslmtfb28vPplOgoiZ0siP2Z8C5Ua+3UKbx410v+c+jT+jh1bbI4TvcEySuX0vd/CfFZFbDkJeQ==} - engines: {node: '>= 0.4.0'} - dev: true - - /http2-wrapper@1.0.3: - resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} - engines: {node: '>=10.19.0'} - dependencies: - quick-lru: 5.1.1 - resolve-alpn: 1.2.1 - dev: true - /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -14852,10 +15727,20 @@ packages: - supports-color dev: false + /human-signals@1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + dev: true + /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + /human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + dev: true + /humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} dependencies: @@ -14887,30 +15772,20 @@ packages: resolution: {integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==} dev: true - /icss-utils@5.1.0(postcss@8.4.21): + /icss-utils@5.1.0(postcss@8.4.30): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 dev: false - /icss-utils@5.1.0(postcss@8.4.22): - resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - postcss: 8.4.22 - dev: true - /idb@7.0.1: resolution: {integrity: sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==} /idb@7.1.1: resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} - dev: false /identity-obj-proxy@3.0.0: resolution: {integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==} @@ -15024,6 +15899,10 @@ packages: once: 1.4.0 wrappy: 1.0.2 + /inherits@2.0.1: + resolution: {integrity: sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==} + dev: true + /inherits@2.0.3: resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} dev: false @@ -15035,10 +15914,6 @@ packages: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} dev: false - /inline-style-parser@0.1.1: - resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - dev: true - /inline-style-prefixer@6.0.4: resolution: {integrity: sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg==} dependencies: @@ -15060,12 +15935,33 @@ packages: mute-stream: 0.0.8 ora: 5.4.1 run-async: 2.4.1 - rxjs: 7.8.0 + rxjs: 7.8.1 string-width: 4.2.3 strip-ansi: 6.0.1 through: 2.3.8 wrap-ansi: 7.0.0 + /inquirer@9.2.11: + resolution: {integrity: sha512-B2LafrnnhbRzCWfAdOXisUzL89Kg8cVJlYmhqoi3flSiV/TveO+nsXwgKr9h9PIo+J1hz7nBSk6gegRIMBBf7g==} + engines: {node: '>=14.18.0'} + dependencies: + '@ljharb/through': 2.3.9 + ansi-escapes: 4.3.2 + chalk: 5.3.0 + cli-cursor: 3.1.0 + cli-width: 4.1.0 + external-editor: 3.1.0 + figures: 5.0.0 + lodash: 4.17.21 + mute-stream: 1.0.0 + ora: 5.4.1 + run-async: 3.0.0 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: true + /internal-slot@1.0.5: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} @@ -15098,10 +15994,6 @@ packages: transitivePeerDependencies: - supports-color - /ip@1.1.8: - resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} - dev: true - /ip@2.0.0: resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} @@ -15119,17 +16011,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /is-alphabetical@2.0.1: - resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} - dev: true - - /is-alphanumerical@2.0.1: - resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - dependencies: - is-alphabetical: 2.0.1 - is-decimal: 2.0.1 - dev: true - /is-arguments@1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} @@ -15168,11 +16049,6 @@ packages: call-bind: 1.0.2 has-tostringtag: 1.0.0 - /is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - dev: true - /is-builtin-module@3.2.1: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} @@ -15206,14 +16082,6 @@ packages: dependencies: has-tostringtag: 1.0.0 - /is-decimal@2.0.1: - resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - dev: true - - /is-deflate@1.0.0: - resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} - dev: true - /is-directory@0.3.1: resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} engines: {node: '>=0.10.0'} @@ -15224,6 +16092,12 @@ packages: engines: {node: '>=8'} hasBin: true + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: true + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -15249,13 +16123,12 @@ packages: dependencies: is-extglob: 2.1.1 - /is-gzip@1.0.0: - resolution: {integrity: sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==} - engines: {node: '>=0.10.0'} - dev: true - - /is-hexadecimal@2.0.1: - resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 dev: true /is-interactive@1.0.0: @@ -15325,11 +16198,7 @@ packages: /is-plain-obj@3.0.0: resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} engines: {node: '>=10'} - - /is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - dev: true + dev: false /is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} @@ -15350,12 +16219,6 @@ packages: dependencies: '@types/estree': 1.0.1 - /is-reference@3.0.1: - resolution: {integrity: sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==} - dependencies: - '@types/estree': 1.0.1 - dev: true - /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -15400,6 +16263,11 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} @@ -15430,6 +16298,11 @@ packages: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} + /is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + dev: true + /is-utf8@0.2.1: resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} @@ -15488,6 +16361,14 @@ packages: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} + /isolated-vm@4.6.0: + resolution: {integrity: sha512-MEnfC/54q5PED3VJ9UJYJPOlU6mYFHS3ivR9E8yeNNBEFRFUNBnY0xO4Rj3D/SOtFKPNmsQp9NWUYSKZqAoZiA==} + engines: {node: '>=16.0.0'} + requiresBuild: true + dependencies: + prebuild-install: 7.1.1 + dev: false + /istanbul-lib-coverage@3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} @@ -15497,10 +16378,22 @@ packages: engines: {node: '>=8'} dependencies: '@babel/core': 7.21.4 - '@babel/parser': 7.21.4 + '@babel/parser': 7.22.16 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /istanbul-lib-instrument@6.0.0: + resolution: {integrity: sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==} + engines: {node: '>=10'} + dependencies: + '@babel/core': 7.21.4 + '@babel/parser': 7.22.16 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 - semver: 6.3.0 + semver: 7.5.4 transitivePeerDependencies: - supports-color @@ -15539,10 +16432,6 @@ packages: filelist: 1.0.4 minimatch: 3.1.2 - /javascript-stringify@2.1.0: - resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==} - dev: true - /jest-changed-files@27.5.1: resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -15568,6 +16457,14 @@ packages: p-limit: 3.1.0 dev: true + /jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + execa: 5.1.1 + jest-util: 29.7.0 + p-limit: 3.1.0 + /jest-circus@27.5.1: resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -15622,33 +16519,33 @@ packages: - supports-color dev: true - /jest-circus@29.5.0: - resolution: {integrity: sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==} + /jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.5.0 - '@jest/expect': 29.5.0 - '@jest/test-result': 29.5.0 - '@jest/types': 29.5.0 + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 '@types/node': 18.15.11 chalk: 4.1.2 co: 4.6.0 - dedent: 0.7.0 + dedent: 1.5.1 is-generator-fn: 2.1.0 - jest-each: 29.5.0 - jest-matcher-utils: 29.5.0 - jest-message-util: 29.5.0 - jest-runtime: 29.5.0 - jest-snapshot: 29.5.0 - jest-util: 29.5.0 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 p-limit: 3.1.0 - pretty-format: 29.5.0 + pretty-format: 29.7.0 pure-rand: 6.0.1 slash: 3.0.0 stack-utils: 2.0.6 transitivePeerDependencies: + - babel-plugin-macros - supports-color - dev: true /jest-cli@27.5.1(ts-node@10.8.2): resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} @@ -15708,8 +16605,8 @@ packages: - ts-node dev: true - /jest-cli@29.5.0(@types/node@16.18.23)(ts-node@10.8.2): - resolution: {integrity: sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==} + /jest-cli@29.7.0(@types/node@16.18.23)(ts-node@10.8.2): + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -15718,26 +16615,26 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.5.0(ts-node@10.8.2) - '@jest/test-result': 29.5.0 - '@jest/types': 29.5.0 + '@jest/core': 29.7.0(ts-node@10.8.2) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 chalk: 4.1.2 + create-jest: 29.7.0(@types/node@16.18.23)(ts-node@10.8.2) exit: 0.1.2 - graceful-fs: 4.2.11 import-local: 3.1.0 - jest-config: 29.5.0(@types/node@16.18.23)(ts-node@10.8.2) - jest-util: 29.5.0 - jest-validate: 29.5.0 - prompts: 2.4.2 + jest-config: 29.7.0(@types/node@16.18.23)(ts-node@10.8.2) + jest-util: 29.7.0 + jest-validate: 29.7.0 yargs: 17.7.1 transitivePeerDependencies: - '@types/node' + - babel-plugin-macros - supports-color - ts-node dev: true - /jest-cli@29.5.0(@types/node@18.15.11)(ts-node@10.8.2): - resolution: {integrity: sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==} + /jest-cli@29.7.0(@types/node@18.15.11)(ts-node@10.8.2): + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -15746,23 +16643,22 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.5.0(ts-node@10.8.2) - '@jest/test-result': 29.5.0 - '@jest/types': 29.5.0 + '@jest/core': 29.7.0(ts-node@10.8.2) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 chalk: 4.1.2 + create-jest: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) exit: 0.1.2 - graceful-fs: 4.2.11 import-local: 3.1.0 - jest-config: 29.5.0(@types/node@18.15.11)(ts-node@10.8.2) - jest-util: 29.5.0 - jest-validate: 29.5.0 - prompts: 2.4.2 + jest-config: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) + jest-util: 29.7.0 + jest-validate: 29.7.0 yargs: 17.7.1 transitivePeerDependencies: - '@types/node' + - babel-plugin-macros - supports-color - ts-node - dev: true /jest-config@27.5.1(ts-node@10.8.2): resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} @@ -15845,7 +16741,7 @@ packages: - supports-color dev: true - /jest-config@29.5.0(@types/node@16.18.23)(ts-node@10.8.2): + /jest-config@29.5.0(@types/node@18.15.11)(ts-node@10.8.2): resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -15858,35 +16754,77 @@ packages: optional: true dependencies: '@babel/core': 7.21.4 - '@jest/test-sequencer': 29.5.0 - '@jest/types': 29.5.0 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.15.11 + babel-jest: 29.7.0(@babel/core@7.21.4) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.8.2(@types/node@18.15.11)(typescript@4.9.5) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + + /jest-config@29.7.0(@types/node@16.18.23)(ts-node@10.8.2): + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.21.4 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 '@types/node': 16.18.23 - babel-jest: 29.5.0(@babel/core@7.21.4) + babel-jest: 29.7.0(@babel/core@7.21.4) chalk: 4.1.2 ci-info: 3.8.0 deepmerge: 4.3.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-circus: 29.5.0 - jest-environment-node: 29.5.0 - jest-get-type: 29.4.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.5.0 - jest-runner: 29.5.0 - jest-util: 29.5.0 - jest-validate: 29.5.0 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 micromatch: 4.0.5 parse-json: 5.2.0 - pretty-format: 29.5.0 + pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 ts-node: 10.8.2(@types/node@18.15.11)(typescript@4.9.5) transitivePeerDependencies: + - babel-plugin-macros - supports-color dev: true - /jest-config@29.5.0(@types/node@18.15.11)(ts-node@10.8.2): - resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} + /jest-config@29.7.0(@types/node@18.15.11)(ts-node@10.8.2): + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@types/node': '*' @@ -15898,32 +16836,32 @@ packages: optional: true dependencies: '@babel/core': 7.21.4 - '@jest/test-sequencer': 29.5.0 - '@jest/types': 29.5.0 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 '@types/node': 18.15.11 - babel-jest: 29.5.0(@babel/core@7.21.4) + babel-jest: 29.7.0(@babel/core@7.21.4) chalk: 4.1.2 ci-info: 3.8.0 deepmerge: 4.3.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-circus: 29.5.0 - jest-environment-node: 29.5.0 - jest-get-type: 29.4.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.5.0 - jest-runner: 29.5.0 - jest-util: 29.5.0 - jest-validate: 29.5.0 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 micromatch: 4.0.5 parse-json: 5.2.0 - pretty-format: 29.5.0 + pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 ts-node: 10.8.2(@types/node@18.15.11)(typescript@4.9.5) transitivePeerDependencies: + - babel-plugin-macros - supports-color - dev: true /jest-diff@27.5.1: resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} @@ -15951,10 +16889,19 @@ packages: dependencies: chalk: 4.1.2 diff-sequences: 29.4.3 - jest-get-type: 29.4.3 - pretty-format: 29.5.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 dev: true + /jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + /jest-docblock@27.5.1: resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -15976,6 +16923,12 @@ packages: detect-newline: 3.1.0 dev: true + /jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + detect-newline: 3.1.0 + /jest-each@27.5.1: resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -15998,16 +16951,15 @@ packages: pretty-format: 28.1.3 dev: true - /jest-each@29.5.0: - resolution: {integrity: sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==} + /jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.5.0 + '@jest/types': 29.6.3 chalk: 4.1.2 - jest-get-type: 29.4.3 - jest-util: 29.5.0 - pretty-format: 29.5.0 - dev: true + jest-get-type: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 /jest-environment-jsdom@27.5.1: resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==} @@ -16051,17 +17003,16 @@ packages: jest-util: 28.1.3 dev: true - /jest-environment-node@29.5.0: - resolution: {integrity: sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==} + /jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.5.0 - '@jest/fake-timers': 29.5.0 - '@jest/types': 29.5.0 + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 '@types/node': 18.15.11 - jest-mock: 29.5.0 - jest-util: 29.5.0 - dev: true + jest-mock: 29.7.0 + jest-util: 29.7.0 /jest-get-type@27.5.1: resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} @@ -16078,6 +17029,10 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true + /jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /jest-haste-map@27.5.1: resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -16121,21 +17076,39 @@ packages: resolution: {integrity: sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.5.0 + '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.6 '@types/node': 18.15.11 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 - jest-regex-util: 29.4.3 - jest-util: 29.5.0 - jest-worker: 29.5.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 micromatch: 4.0.5 walker: 1.0.8 optionalDependencies: fsevents: 2.3.2 dev: true + /jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.6 + '@types/node': 18.15.11 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.2 + /jest-jasmine2@27.5.1: resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -16181,10 +17154,17 @@ packages: resolution: {integrity: sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - jest-get-type: 29.4.3 - pretty-format: 29.5.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 dev: true + /jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + /jest-matcher-utils@27.5.1: resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -16211,15 +17191,24 @@ packages: dependencies: chalk: 4.1.2 jest-diff: 29.5.0 - jest-get-type: 29.4.3 - pretty-format: 29.5.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 dev: true + /jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + /jest-message-util@27.5.1: resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/code-frame': 7.21.4 + '@babel/code-frame': 7.22.13 '@jest/types': 27.5.1 '@types/stack-utils': 2.0.1 chalk: 4.1.2 @@ -16234,7 +17223,7 @@ packages: resolution: {integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - '@babel/code-frame': 7.21.4 + '@babel/code-frame': 7.22.13 '@jest/types': 28.1.3 '@types/stack-utils': 2.0.1 chalk: 4.1.2 @@ -16248,17 +17237,31 @@ packages: resolution: {integrity: sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.21.4 - '@jest/types': 29.5.0 + '@babel/code-frame': 7.22.13 + '@jest/types': 29.6.3 '@types/stack-utils': 2.0.1 chalk: 4.1.2 graceful-fs: 4.2.11 micromatch: 4.0.5 - pretty-format: 29.5.0 + pretty-format: 29.7.0 slash: 3.0.0 stack-utils: 2.0.6 dev: true + /jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/code-frame': 7.22.13 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + /jest-mock@27.5.1: resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -16284,6 +17287,14 @@ packages: jest-util: 29.5.0 dev: true + /jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 18.15.11 + jest-util: 29.7.0 + /jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} @@ -16320,6 +17331,17 @@ packages: jest-resolve: 29.5.0 dev: true + /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 29.7.0 + /jest-regex-util@27.5.1: resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -16334,6 +17356,10 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true + /jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /jest-resolve-dependencies@27.5.1: resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -16359,12 +17385,21 @@ packages: resolution: {integrity: sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - jest-regex-util: 29.4.3 - jest-snapshot: 29.5.0 + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color dev: true + /jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + /jest-resolve@27.5.1: resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -16402,15 +17437,29 @@ packages: dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 - jest-haste-map: 29.5.0 + jest-haste-map: 29.7.0 jest-pnp-resolver: 1.2.3(jest-resolve@29.5.0) - jest-util: 29.5.0 - jest-validate: 29.5.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 resolve: 1.22.2 resolve.exports: 2.0.2 slash: 3.0.0 dev: true + /jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + resolve: 1.22.2 + resolve.exports: 2.0.2 + slash: 3.0.0 + /jest-runner@27.5.1: resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -16476,31 +17525,59 @@ packages: resolution: {integrity: sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/console': 29.5.0 + '@jest/console': 29.7.0 '@jest/environment': 29.5.0 - '@jest/test-result': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 '@types/node': 18.15.11 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 jest-docblock: 29.4.3 - jest-environment-node: 29.5.0 - jest-haste-map: 29.5.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 jest-leak-detector: 29.5.0 - jest-message-util: 29.5.0 - jest-resolve: 29.5.0 - jest-runtime: 29.5.0 - jest-util: 29.5.0 - jest-watcher: 29.5.0 - jest-worker: 29.5.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 p-limit: 3.1.0 source-map-support: 0.5.13 transitivePeerDependencies: - supports-color dev: true + /jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.7.0 + '@jest/environment': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.15.11 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + jest-docblock: 29.7.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 + jest-leak-detector: 29.7.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + /jest-runtime@27.5.1: resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -16569,28 +17646,57 @@ packages: '@jest/fake-timers': 29.5.0 '@jest/globals': 29.5.0 '@jest/source-map': 29.4.3 - '@jest/test-result': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 '@types/node': 18.15.11 chalk: 4.1.2 cjs-module-lexer: 1.2.2 collect-v8-coverage: 1.0.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-haste-map: 29.5.0 - jest-message-util: 29.5.0 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 jest-mock: 29.5.0 - jest-regex-util: 29.4.3 - jest-resolve: 29.5.0 - jest-snapshot: 29.5.0 - jest-util: 29.5.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: - supports-color dev: true + /jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/globals': 29.7.0 + '@jest/source-map': 29.6.3 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.15.11 + chalk: 4.1.2 + cjs-module-lexer: 1.2.2 + collect-v8-coverage: 1.0.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + /jest-serializer@27.5.1: resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -16605,9 +17711,9 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/generator': 7.21.4 - '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.21.4) + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.21.4) '@babel/traverse': 7.21.4 - '@babel/types': 7.21.4 + '@babel/types': 7.22.17 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 '@types/babel__traverse': 7.18.3 @@ -16635,9 +17741,9 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/generator': 7.21.4 - '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.21.4) + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.21.4) '@babel/traverse': 7.21.4 - '@babel/types': 7.21.4 + '@babel/types': 7.22.17 '@jest/expect-utils': 28.1.3 '@jest/transform': 28.1.3 '@jest/types': 28.1.3 @@ -16666,13 +17772,13 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/generator': 7.21.4 - '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.21.4) - '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.21.4) + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.21.4) '@babel/traverse': 7.21.4 - '@babel/types': 7.21.4 + '@babel/types': 7.22.17 '@jest/expect-utils': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 '@types/babel__traverse': 7.18.3 '@types/prettier': 2.7.2 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.4) @@ -16680,17 +17786,44 @@ packages: expect: 29.5.0 graceful-fs: 4.2.11 jest-diff: 29.5.0 - jest-get-type: 29.4.3 + jest-get-type: 29.6.3 jest-matcher-utils: 29.5.0 - jest-message-util: 29.5.0 - jest-util: 29.5.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 natural-compare: 1.4.0 - pretty-format: 29.5.0 + pretty-format: 29.7.0 semver: 7.5.4 transitivePeerDependencies: - supports-color dev: true + /jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.21.4 + '@babel/generator': 7.21.4 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.21.4) + '@babel/types': 7.22.17 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.4) + chalk: 4.1.2 + expect: 29.7.0 + graceful-fs: 4.2.11 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + natural-compare: 1.4.0 + pretty-format: 29.7.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + /jest-util@27.5.1: resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -16718,7 +17851,7 @@ packages: resolution: {integrity: sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.5.0 + '@jest/types': 29.6.3 '@types/node': 18.15.11 chalk: 4.1.2 ci-info: 3.8.0 @@ -16726,6 +17859,17 @@ packages: picomatch: 2.3.1 dev: true + /jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 18.15.11 + chalk: 4.1.2 + ci-info: 3.8.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + /jest-validate@27.5.1: resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -16754,14 +17898,25 @@ packages: resolution: {integrity: sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.5.0 + '@jest/types': 29.6.3 camelcase: 6.3.0 chalk: 4.1.2 - jest-get-type: 29.4.3 + jest-get-type: 29.6.3 leven: 3.1.0 - pretty-format: 29.5.0 + pretty-format: 29.7.0 dev: true + /jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + /jest-watch-typeahead@1.1.0(jest@27.5.1): resolution: {integrity: sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -16808,16 +17963,29 @@ packages: resolution: {integrity: sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/test-result': 29.5.0 - '@jest/types': 29.5.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 '@types/node': 18.15.11 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 - jest-util: 29.5.0 + jest-util: 29.7.0 string-length: 4.0.2 dev: true + /jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.15.11 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.7.0 + string-length: 4.0.2 + /jest-worker@24.9.0: resolution: {integrity: sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==} engines: {node: '>= 6'} @@ -16851,15 +18019,14 @@ packages: merge-stream: 2.0.0 supports-color: 8.1.1 - /jest-worker@29.5.0: - resolution: {integrity: sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==} + /jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@types/node': 18.15.11 - jest-util: 29.5.0 + jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - dev: true /jest@27.5.1(ts-node@10.8.2): resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==} @@ -16915,9 +18082,10 @@ packages: '@jest/core': 29.5.0(ts-node@10.8.2) '@jest/types': 29.5.0 import-local: 3.1.0 - jest-cli: 29.5.0(@types/node@16.18.23)(ts-node@10.8.2) + jest-cli: 29.7.0(@types/node@16.18.23)(ts-node@10.8.2) transitivePeerDependencies: - '@types/node' + - babel-plugin-macros - supports-color - ts-node dev: true @@ -16935,9 +18103,31 @@ packages: '@jest/core': 29.5.0(ts-node@10.8.2) '@jest/types': 29.5.0 import-local: 3.1.0 - jest-cli: 29.5.0(@types/node@18.15.11)(ts-node@10.8.2) + jest-cli: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + /jest@29.7.0(@types/node@18.15.11)(ts-node@10.8.2): + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.7.0(ts-node@10.8.2) + '@jest/types': 29.6.3 + import-local: 3.1.0 + jest-cli: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) transitivePeerDependencies: - '@types/node' + - babel-plugin-macros - supports-color - ts-node dev: true @@ -17001,7 +18191,7 @@ packages: engines: {node: '>=12.0.0'} hasBin: true dependencies: - '@babel/parser': 7.21.4 + '@babel/parser': 7.22.16 '@jsdoc/salty': 0.2.5 '@types/markdown-it': 12.2.3 bluebird: 3.7.2 @@ -17070,22 +18260,12 @@ packages: engines: {node: '>=4'} hasBin: true - /jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} - hasBin: true - dev: true - /json-bigint@1.0.0: resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} dependencies: bignumber.js: 9.1.1 dev: false - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true - /json-grab@0.1.0-alpha.2: resolution: {integrity: sha512-9aoAuQ+32pyfOhsLbPfAY9cYg0XuUkhTw8FDDX2SS+9gsz+Z0VtnMjE0SLIlarfdJ9uVN+xTPoDeuWLNnWKQxw==} engines: {node: 16.x} @@ -17152,10 +18332,6 @@ packages: engines: {node: '>=6'} hasBin: true - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true - /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: @@ -17178,9 +18354,9 @@ packages: engines: {node: '>=0.10.0'} dev: false - /jsonwebtoken@8.5.1: - resolution: {integrity: sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==} - engines: {node: '>=4', npm: '>=1.4.28'} + /jsonwebtoken@9.0.2: + resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} + engines: {node: '>=12', npm: '>=6'} dependencies: jws: 3.2.2 lodash.includes: 4.3.0 @@ -17191,16 +18367,6 @@ packages: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 5.7.1 - dev: false - - /jsonwebtoken@9.0.0: - resolution: {integrity: sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==} - engines: {node: '>=12', npm: '>=6'} - dependencies: - jws: 3.2.2 - lodash: 4.17.21 - ms: 2.1.3 semver: 7.5.4 dev: false @@ -17252,7 +18418,7 @@ packages: engines: {node: '>=14'} dependencies: '@types/express': 4.17.17 - '@types/jsonwebtoken': 9.0.1 + '@types/jsonwebtoken': 9.0.3 debug: 4.3.4 jose: 4.13.1 limiter: 1.1.5 @@ -17287,12 +18453,6 @@ packages: engines: {node: '>=14.0.0'} dev: false - /keyv@4.5.2: - resolution: {integrity: sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==} - dependencies: - json-buffer: 3.0.1 - dev: true - /kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -17308,11 +18468,6 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} - /kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - dev: true - /klona@2.0.6: resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} engines: {node: '>= 8'} @@ -17339,7 +18494,7 @@ packages: readable-stream: 2.3.8 dev: true - /less-loader@10.2.0(less@4.1.3)(webpack@5.79.0): + /less-loader@10.2.0(less@4.1.3)(webpack@5.88.2): resolution: {integrity: sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -17348,7 +18503,7 @@ packages: dependencies: klona: 2.0.6 less: 4.1.3 - webpack: 5.79.0(esbuild@0.16.3) + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) dev: true /less@4.1.3: @@ -17358,7 +18513,7 @@ packages: dependencies: copy-anything: 2.0.6 parse-node-version: 1.0.1 - tslib: 2.5.0 + tslib: 2.6.2 optionalDependencies: errno: 0.1.8 graceful-fs: 4.2.11 @@ -17381,6 +18536,7 @@ packages: dependencies: prelude-ls: 1.1.2 type-check: 0.3.2 + dev: false /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} @@ -17446,6 +18602,7 @@ packages: /loader-utils@3.2.1: resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==} engines: {node: '>= 12.13.0'} + dev: false /localforage@1.10.0: resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} @@ -17473,6 +18630,13 @@ packages: dependencies: p-locate: 5.0.0 + /locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-locate: 6.0.0 + dev: true + /lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} dev: false @@ -17569,14 +18733,11 @@ packages: /long@4.0.0: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + dev: false /long@5.2.1: resolution: {integrity: sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==} - /longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - dev: true - /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -17590,14 +18751,9 @@ packages: /lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} dependencies: - tslib: 2.5.0 + tslib: 2.6.2 dev: false - /lowercase-keys@2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} - dev: true - /lru-cache@4.0.2: resolution: {integrity: sha512-uQw9OqphAGiZhkuPlpFGmdTU2tEuhxTourM/19qGJrxBPHAr/f8BT1a0i/lOclESnGatdJG/UCkP9kZB/Lh1iw==} dependencies: @@ -17682,7 +18838,7 @@ packages: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} dependencies: - semver: 6.3.0 + semver: 6.3.1 /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} @@ -17740,11 +18896,6 @@ packages: dependencies: tmpl: 1.0.5 - /markdown-extensions@1.1.1: - resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} - engines: {node: '>=0.10.0'} - dev: true - /markdown-it-anchor@8.6.7(@types/markdown-it@12.2.3)(markdown-it@12.3.2): resolution: {integrity: sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==} peerDependencies: @@ -17799,129 +18950,7 @@ packages: chalk: 1.1.3 figures: 1.7.0 gzip-size: 3.0.0 - pretty-bytes: 3.0.1 - dev: true - - /mdast-util-definitions@5.1.2: - resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} - dependencies: - '@types/mdast': 3.0.11 - '@types/unist': 2.0.6 - unist-util-visit: 4.1.2 - dev: true - - /mdast-util-from-markdown@1.3.0: - resolution: {integrity: sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g==} - dependencies: - '@types/mdast': 3.0.11 - '@types/unist': 2.0.6 - decode-named-character-reference: 1.0.2 - mdast-util-to-string: 3.2.0 - micromark: 3.1.0 - micromark-util-decode-numeric-character-reference: 1.0.0 - micromark-util-decode-string: 1.0.2 - micromark-util-normalize-identifier: 1.0.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - unist-util-stringify-position: 3.0.3 - uvu: 0.5.6 - transitivePeerDependencies: - - supports-color - dev: true - - /mdast-util-frontmatter@1.0.1: - resolution: {integrity: sha512-JjA2OjxRqAa8wEG8hloD0uTU0kdn8kbtOWpPP94NBkfAlbxn4S8gCGf/9DwFtEeGPXrDcNXdiDjVaRdUFqYokw==} - dependencies: - '@types/mdast': 3.0.11 - mdast-util-to-markdown: 1.5.0 - micromark-extension-frontmatter: 1.1.0 - dev: true - - /mdast-util-mdx-expression@1.3.2: - resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} - dependencies: - '@types/estree-jsx': 1.0.0 - '@types/hast': 2.3.4 - '@types/mdast': 3.0.11 - mdast-util-from-markdown: 1.3.0 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - dev: true - - /mdast-util-mdx-jsx@1.2.0: - resolution: {integrity: sha512-5+ot/kfxYd3ChgEMwsMUO71oAfYjyRI3pADEK4I7xTmWLGQ8Y7ghm1CG36zUoUvDPxMlIYwQV/9DYHAUWdG4dA==} - dependencies: - '@types/estree-jsx': 0.0.1 - '@types/mdast': 3.0.11 - mdast-util-to-markdown: 1.5.0 - parse-entities: 4.0.1 - stringify-entities: 4.0.3 - unist-util-remove-position: 4.0.2 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 - dev: true - - /mdast-util-mdx@1.1.0: - resolution: {integrity: sha512-leKb9uG7laXdyFlTleYV4ZEaCpsxeU1LlkkR/xp35pgKrfV1Y0fNCuOw9vaRc2a9YDpH22wd145Wt7UY5yzeZw==} - dependencies: - mdast-util-mdx-expression: 1.3.2 - mdast-util-mdx-jsx: 1.2.0 - mdast-util-mdxjs-esm: 1.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /mdast-util-mdxjs-esm@1.3.1: - resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} - dependencies: - '@types/estree-jsx': 1.0.0 - '@types/hast': 2.3.4 - '@types/mdast': 3.0.11 - mdast-util-from-markdown: 1.3.0 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - dev: true - - /mdast-util-phrasing@3.0.1: - resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} - dependencies: - '@types/mdast': 3.0.11 - unist-util-is: 5.2.1 - dev: true - - /mdast-util-to-hast@11.3.0: - resolution: {integrity: sha512-4o3Cli3hXPmm1LhB+6rqhfsIUBjnKFlIUZvudaermXB+4/KONdd/W4saWWkC+LBLbPMqhFSSTSRgafHsT5fVJw==} - dependencies: - '@types/hast': 2.3.4 - '@types/mdast': 3.0.11 - '@types/mdurl': 1.0.2 - mdast-util-definitions: 5.1.2 - mdurl: 1.0.1 - unist-builder: 3.0.1 - unist-util-generated: 2.0.1 - unist-util-position: 4.0.4 - unist-util-visit: 4.1.2 - dev: true - - /mdast-util-to-markdown@1.5.0: - resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} - dependencies: - '@types/mdast': 3.0.11 - '@types/unist': 2.0.6 - longest-streak: 3.1.0 - mdast-util-phrasing: 3.0.1 - mdast-util-to-string: 3.2.0 - micromark-util-decode-string: 1.0.2 - unist-util-visit: 4.1.2 - zwitch: 2.0.4 - dev: true - - /mdast-util-to-string@3.2.0: - resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} - dependencies: - '@types/mdast': 3.0.11 + pretty-bytes: 3.0.1 dev: true /mdn-data@2.0.14: @@ -17932,12 +18961,8 @@ packages: /mdurl@1.0.1: resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} - - /media-query-parser@2.0.2: - resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==} - dependencies: - '@babel/runtime': 7.21.0 - dev: true + dev: false + optional: true /media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} @@ -18003,6 +19028,16 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} + /micro@9.3.5-canary.3: + resolution: {integrity: sha512-viYIo9PefV+w9dvoIBh1gI44Mvx1BOk67B4BpC2QK77qdY0xZF0Q+vWLt/BII6cLkIc8rLmSIcJaB/OrXXKe1g==} + engines: {node: '>= 8.0.0'} + hasBin: true + dependencies: + arg: 4.1.0 + content-type: 1.0.4 + raw-body: 2.4.1 + dev: true + /microbundle-crl@0.13.11: resolution: {integrity: sha512-3roSSgtJdIvvIOJdhefWD8BoEjHkbInkJzUoSE+ER6NGcpTuPWXNFyAbXamCL9Qg8rTU4urbYtXusk/d1ZpteA==} hasBin: true @@ -18014,7 +19049,7 @@ packages: '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.21.4) '@babel/plugin-transform-flow-strip-types': 7.21.0(@babel/core@7.21.4) '@babel/plugin-transform-react-jsx': 7.21.0(@babel/core@7.21.4) - '@babel/preset-env': 7.21.4(@babel/core@7.21.4) + '@babel/preset-env': 7.22.15(@babel/core@7.21.4) '@babel/preset-flow': 7.21.4(@babel/core@7.21.4) '@rollup/plugin-alias': 3.1.9(rollup@1.32.1) '@rollup/plugin-commonjs': 11.1.0(rollup@1.32.1) @@ -18052,274 +19087,6 @@ packages: - supports-color dev: true - /micromark-core-commonmark@1.0.6: - resolution: {integrity: sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==} - dependencies: - decode-named-character-reference: 1.0.2 - micromark-factory-destination: 1.0.0 - micromark-factory-label: 1.0.2 - micromark-factory-space: 1.0.0 - micromark-factory-title: 1.0.2 - micromark-factory-whitespace: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-chunked: 1.0.0 - micromark-util-classify-character: 1.0.0 - micromark-util-html-tag-name: 1.1.0 - micromark-util-normalize-identifier: 1.0.0 - micromark-util-resolve-all: 1.0.0 - micromark-util-subtokenize: 1.0.2 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: true - - /micromark-extension-frontmatter@1.1.0: - resolution: {integrity: sha512-0nLelmvXR5aZ+F2IL6/Ed4cDnHLpL/VD/EELKuclsTWHrLI8UgxGHEmeoumeX2FXiM6z2WrBIOEcbKUZR8RYNg==} - dependencies: - fault: 2.0.1 - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - dev: true - - /micromark-extension-mdx-expression@1.0.4: - resolution: {integrity: sha512-TCgLxqW6ReQ3AJgtj1P0P+8ZThBTloLbeb7jNaqr6mCOLDpxUiBFE/9STgooMZttEwOQu5iEcCCa3ZSDhY9FGw==} - dependencies: - micromark-factory-mdx-expression: 1.0.7 - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-events-to-acorn: 1.2.1 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: true - - /micromark-extension-mdx-jsx@1.0.3: - resolution: {integrity: sha512-VfA369RdqUISF0qGgv2FfV7gGjHDfn9+Qfiv5hEwpyr1xscRj/CiVRkU7rywGFCO7JwJ5L0e7CJz60lY52+qOA==} - dependencies: - '@types/acorn': 4.0.6 - estree-util-is-identifier-name: 2.1.0 - micromark-factory-mdx-expression: 1.0.7 - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - vfile-message: 3.1.4 - dev: true - - /micromark-extension-mdx-md@1.0.0: - resolution: {integrity: sha512-xaRAMoSkKdqZXDAoSgp20Azm0aRQKGOl0RrS81yGu8Hr/JhMsBmfs4wR7m9kgVUIO36cMUQjNyiyDKPrsv8gOw==} - dependencies: - micromark-util-types: 1.0.2 - dev: true - - /micromark-extension-mdxjs-esm@1.0.3: - resolution: {integrity: sha512-2N13ol4KMoxb85rdDwTAC6uzs8lMX0zeqpcyx7FhS7PxXomOnLactu8WI8iBNXW8AVyea3KIJd/1CKnUmwrK9A==} - dependencies: - micromark-core-commonmark: 1.0.6 - micromark-util-character: 1.1.0 - micromark-util-events-to-acorn: 1.2.1 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - unist-util-position-from-estree: 1.1.2 - uvu: 0.5.6 - vfile-message: 3.1.4 - dev: true - - /micromark-extension-mdxjs@1.0.0: - resolution: {integrity: sha512-TZZRZgeHvtgm+IhtgC2+uDMR7h8eTKF0QUX9YsgoL9+bADBpBY6SiLvWqnBlLbCEevITmTqmEuY3FoxMKVs1rQ==} - dependencies: - acorn: 8.8.2 - acorn-jsx: 5.3.2(acorn@8.8.2) - micromark-extension-mdx-expression: 1.0.4 - micromark-extension-mdx-jsx: 1.0.3 - micromark-extension-mdx-md: 1.0.0 - micromark-extension-mdxjs-esm: 1.0.3 - micromark-util-combine-extensions: 1.0.0 - micromark-util-types: 1.0.2 - dev: true - - /micromark-factory-destination@1.0.0: - resolution: {integrity: sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==} - dependencies: - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - dev: true - - /micromark-factory-label@1.0.2: - resolution: {integrity: sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==} - dependencies: - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: true - - /micromark-factory-mdx-expression@1.0.7: - resolution: {integrity: sha512-QAdFbkQagTZ/eKb8zDGqmjvgevgJH3+aQpvvKrXWxNJp3o8/l2cAbbrBd0E04r0Gx6nssPpqWIjnbHFvZu5qsQ==} - dependencies: - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-events-to-acorn: 1.2.1 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - unist-util-position-from-estree: 1.1.2 - uvu: 0.5.6 - vfile-message: 3.1.4 - dev: true - - /micromark-factory-space@1.0.0: - resolution: {integrity: sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==} - dependencies: - micromark-util-character: 1.1.0 - micromark-util-types: 1.0.2 - dev: true - - /micromark-factory-title@1.0.2: - resolution: {integrity: sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==} - dependencies: - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: true - - /micromark-factory-whitespace@1.0.0: - resolution: {integrity: sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==} - dependencies: - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - dev: true - - /micromark-util-character@1.1.0: - resolution: {integrity: sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==} - dependencies: - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - dev: true - - /micromark-util-chunked@1.0.0: - resolution: {integrity: sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==} - dependencies: - micromark-util-symbol: 1.0.1 - dev: true - - /micromark-util-classify-character@1.0.0: - resolution: {integrity: sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==} - dependencies: - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - dev: true - - /micromark-util-combine-extensions@1.0.0: - resolution: {integrity: sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==} - dependencies: - micromark-util-chunked: 1.0.0 - micromark-util-types: 1.0.2 - dev: true - - /micromark-util-decode-numeric-character-reference@1.0.0: - resolution: {integrity: sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==} - dependencies: - micromark-util-symbol: 1.0.1 - dev: true - - /micromark-util-decode-string@1.0.2: - resolution: {integrity: sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==} - dependencies: - decode-named-character-reference: 1.0.2 - micromark-util-character: 1.1.0 - micromark-util-decode-numeric-character-reference: 1.0.0 - micromark-util-symbol: 1.0.1 - dev: true - - /micromark-util-encode@1.0.1: - resolution: {integrity: sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==} - dev: true - - /micromark-util-events-to-acorn@1.2.1: - resolution: {integrity: sha512-mkg3BaWlw6ZTkQORrKVBW4o9ICXPxLtGz51vml5mQpKFdo9vqIX68CAx5JhTOdjQyAHH7JFmm4rh8toSPQZUmg==} - dependencies: - '@types/acorn': 4.0.6 - '@types/estree': 1.0.1 - estree-util-visit: 1.2.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - vfile-location: 4.1.0 - vfile-message: 3.1.4 - dev: true - - /micromark-util-html-tag-name@1.1.0: - resolution: {integrity: sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==} - dev: true - - /micromark-util-normalize-identifier@1.0.0: - resolution: {integrity: sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==} - dependencies: - micromark-util-symbol: 1.0.1 - dev: true - - /micromark-util-resolve-all@1.0.0: - resolution: {integrity: sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==} - dependencies: - micromark-util-types: 1.0.2 - dev: true - - /micromark-util-sanitize-uri@1.1.0: - resolution: {integrity: sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==} - dependencies: - micromark-util-character: 1.1.0 - micromark-util-encode: 1.0.1 - micromark-util-symbol: 1.0.1 - dev: true - - /micromark-util-subtokenize@1.0.2: - resolution: {integrity: sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==} - dependencies: - micromark-util-chunked: 1.0.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - dev: true - - /micromark-util-symbol@1.0.1: - resolution: {integrity: sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==} - dev: true - - /micromark-util-types@1.0.2: - resolution: {integrity: sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==} - dev: true - - /micromark@3.1.0: - resolution: {integrity: sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==} - dependencies: - '@types/debug': 4.1.7 - debug: 4.3.4 - decode-named-character-reference: 1.0.2 - micromark-core-commonmark: 1.0.6 - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-chunked: 1.0.0 - micromark-util-combine-extensions: 1.0.0 - micromark-util-decode-numeric-character-reference: 1.0.0 - micromark-util-encode: 1.0.1 - micromark-util-normalize-identifier: 1.0.0 - micromark-util-resolve-all: 1.0.0 - micromark-util-sanitize-uri: 1.1.0 - micromark-util-subtokenize: 1.0.2 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 - transitivePeerDependencies: - - supports-color - dev: true - /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -18358,9 +19125,9 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - /mimic-response@1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} - engines: {node: '>=4'} + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} dev: true /mimic-response@2.1.0: @@ -18371,21 +19138,21 @@ packages: /mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - dev: true + dev: false /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} dev: true - /mini-css-extract-plugin@2.7.5(webpack@5.78.0): + /mini-css-extract-plugin@2.7.5(webpack@5.88.2): resolution: {integrity: sha512-9HaR++0mlgom81s95vvNjxkg52n2b5s//3ZTI1EtzFb98awsLSivs2LMsVqnQ3ay0PVhqWcGNyDaTE961FOcjQ==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 dependencies: schema-utils: 4.0.0 - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) dev: false /minimalistic-assert@1.0.1: @@ -18462,6 +19229,13 @@ packages: dependencies: minipass: 3.3.6 + /minipass@2.9.0: + resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} + dependencies: + safe-buffer: 5.2.1 + yallist: 3.1.1 + dev: true + /minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} @@ -18472,6 +19246,12 @@ packages: resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} engines: {node: '>=8'} + /minizlib@1.3.3: + resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} + dependencies: + minipass: 2.9.0 + dev: true + /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} @@ -18880,15 +19660,6 @@ packages: engines: {node: '>=10'} hasBin: true - /mlly@1.2.0: - resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} - dependencies: - acorn: 8.8.2 - pathe: 1.1.0 - pkg-types: 1.0.2 - ufo: 1.1.1 - dev: true - /module-details-from-path@1.0.3: resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} dev: true @@ -18908,26 +19679,32 @@ packages: whatwg-url: 11.0.0 dev: false - /mongodb@5.2.0: - resolution: {integrity: sha512-nLgo95eP1acvjBcOdrUV3aqpWwHZCZwhYA2opB8StybbtQL/WoE5pk92qUUfjbKOWcGLYJczTqQbfOQhYtrkKg==} + /mongodb@5.9.0: + resolution: {integrity: sha512-g+GCMHN1CoRUA+wb1Agv0TI4YTSiWr42B5ulkiAfLLHitGK1R+PkSAf3Lr5rPZwi/3F04LiaZEW0Kxro9Fi2TA==} engines: {node: '>=14.20.1'} peerDependencies: - '@aws-sdk/credential-providers': ^3.201.0 - mongodb-client-encryption: ^2.3.0 + '@aws-sdk/credential-providers': ^3.188.0 + '@mongodb-js/zstd': ^1.0.0 + kerberos: ^1.0.0 || ^2.0.0 + mongodb-client-encryption: '>=2.3.0 <3' snappy: ^7.2.2 peerDependenciesMeta: '@aws-sdk/credential-providers': optional: true + '@mongodb-js/zstd': + optional: true + kerberos: + optional: true mongodb-client-encryption: optional: true snappy: optional: true dependencies: - bson: 5.2.0 + bson: 5.5.0 mongodb-connection-string-url: 2.6.0 socks: 2.7.1 optionalDependencies: - saslprep: 1.0.3 + '@mongodb-js/saslprep': 1.1.0 dev: false /monorel@0.4.2: @@ -18935,7 +19712,7 @@ packages: hasBin: true dependencies: minimist: 1.2.8 - tslib: 2.5.0 + tslib: 2.6.2 dev: true /mri@1.2.0: @@ -18946,6 +19723,10 @@ packages: /ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + /ms@2.1.1: + resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==} + dev: true + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -18973,6 +19754,11 @@ packages: /mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + /mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + /mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} dependencies: @@ -19040,11 +19826,6 @@ packages: /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - /netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} - engines: {node: '>= 0.4.0'} - dev: true - /new-date@1.0.3: resolution: {integrity: sha512-0fsVvQPbo2I18DT2zVHpezmeeNYV2JaJSrseiHLc17GNOxJzUdx5mvSigPu8LtIfZSij5i1wXnXFspEs2CD6hA==} dependencies: @@ -19084,7 +19865,7 @@ packages: enhanced-resolve: 5.12.0 dev: true - /next@13.0.0(@babel/core@7.21.4)(react-dom@18.2.0)(react@18.2.0): + /next@13.0.0(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-puH1WGM6rGeFOoFdXXYfUxN9Sgi4LMytCV5HkQJvVUOhHfC1DoVqOfvzaEteyp6P04IW+gbtK2Q9pInVSrltPA==} engines: {node: '>=14.6.0'} hasBin: true @@ -19108,7 +19889,7 @@ packages: postcss: 8.4.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.0(@babel/core@7.21.4)(react@18.2.0) + styled-jsx: 5.1.0(react@18.2.0) use-sync-external-store: 1.2.0(react@18.2.0) optionalDependencies: '@next/swc-android-arm-eabi': 13.0.0 @@ -19183,7 +19964,7 @@ packages: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: lower-case: 2.0.2 - tslib: 2.5.0 + tslib: 2.6.2 dev: false /node-abi@2.30.1: @@ -19192,15 +19973,17 @@ packages: semver: 5.7.1 dev: false + /node-abi@3.47.0: + resolution: {integrity: sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: false + /node-abort-controller@3.1.1: resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} dev: false - /node-addon-api@1.7.2: - resolution: {integrity: sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==} - dev: true - optional: true - /node-addon-api@2.0.2: resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} dev: false @@ -19252,6 +20035,27 @@ packages: optional: true dependencies: whatwg-url: 5.0.0 + dev: true + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + + /node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + dev: true /node-forge@1.3.1: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} @@ -19291,7 +20095,17 @@ packages: webpack: ^5.0.0 dependencies: loader-utils: 2.0.4 - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) + webpack: 5.78.0(webpack-cli@5.0.1) + dev: true + + /node-loader@2.0.0(webpack@5.88.2): + resolution: {integrity: sha512-I5VN34NO4/5UYJaUBtkrODPWxbobrE4hgDqPrjB25yPkonFhCmZ146vTH+Zg417E9Iwoh1l/MbRs1apc5J295Q==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^5.0.0 + dependencies: + loader-utils: 2.0.4 + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) dev: true /node-postgres@0.6.2: @@ -19301,6 +20115,9 @@ packages: /node-releases@2.0.10: resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + /node-sql-parser@4.6.6: resolution: {integrity: sha512-zpash5xnRY6+0C9HFru32iRJV1LTkwtrVpO90i385tYVF6efyXK/B3Nsq/15Fuv2utxrqHNjKtL55OHb8sl+eQ==} engines: {node: '>=8'} @@ -19380,6 +20197,7 @@ packages: /normalize-url@6.1.0: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} + dev: false /npm-bundled@1.1.2: resolution: {integrity: sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==} @@ -19445,6 +20263,13 @@ packages: dependencies: path-key: 3.1.1 + /npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + /npmlog@4.1.2: resolution: {integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==} dependencies: @@ -19597,6 +20422,12 @@ packages: engines: {node: '>= 0.8'} dev: false + /once@1.3.3: + resolution: {integrity: sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==} + dependencies: + wrappy: 1.0.2 + dev: true + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -19608,6 +20439,13 @@ packages: dependencies: mimic-fn: 2.1.0 + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + /open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -19616,6 +20454,16 @@ packages: is-docker: 2.2.1 is-wsl: 2.2.0 + /open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + dependencies: + default-browser: 4.0.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 2.2.0 + dev: true + /openid-client@5.4.0: resolution: {integrity: sha512-hgJa2aQKcM2hn3eyVtN12tEA45ECjTJPXCgUh5YzTzy9qwapCvmDTVPWOcWVL0d34zeQoQ/hbG9lJhl3AYxJlQ==} dependencies: @@ -19635,6 +20483,7 @@ packages: prelude-ls: 1.1.2 type-check: 0.3.2 word-wrap: 1.2.3 + dev: false /optionator@0.9.1: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} @@ -19661,23 +20510,24 @@ packages: strip-ansi: 6.0.1 wcwidth: 1.0.1 + /os-paths@4.4.0: + resolution: {integrity: sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg==} + engines: {node: '>= 6.0'} + dev: true + /os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} - /outdent@0.8.0: - resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==} - dev: true - - /p-cancelable@2.1.1: - resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} - engines: {node: '>=8'} - dev: true - /p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} + /p-finally@2.0.1: + resolution: {integrity: sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==} + engines: {node: '>=8'} + dev: true + /p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -19690,6 +20540,13 @@ packages: dependencies: yocto-queue: 0.1.0 + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + /p-locate@3.0.0: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} engines: {node: '>=6'} @@ -19709,6 +20566,13 @@ packages: dependencies: p-limit: 3.1.0 + /p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-limit: 4.0.0 + dev: true + /p-map@2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} @@ -19754,32 +20618,6 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - /pac-proxy-agent@5.0.0: - resolution: {integrity: sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==} - engines: {node: '>= 8'} - dependencies: - '@tootallnate/once': 1.1.2 - agent-base: 6.0.2 - debug: 4.3.4 - get-uri: 3.0.2 - http-proxy-agent: 4.0.1 - https-proxy-agent: 5.0.1 - pac-resolver: 5.0.1 - raw-body: 2.5.2 - socks-proxy-agent: 5.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /pac-resolver@5.0.1: - resolution: {integrity: sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==} - engines: {node: '>= 8'} - dependencies: - degenerator: 3.0.3 - ip: 1.1.8 - netmask: 2.0.2 - dev: true - /packet-reader@1.0.0: resolution: {integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==} @@ -19811,10 +20649,6 @@ packages: - bluebird - supports-color - /pako@0.2.9: - resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} - dev: true - /param-case@2.1.1: resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} dependencies: @@ -19825,7 +20659,7 @@ packages: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} dependencies: dot-case: 3.0.4 - tslib: 2.5.0 + tslib: 2.6.2 dev: false /parent-module@1.0.1: @@ -19846,19 +20680,6 @@ packages: just-diff: 5.2.0 just-diff-apply: 5.5.0 - /parse-entities@4.0.1: - resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} - dependencies: - '@types/unist': 2.0.6 - character-entities: 2.0.2 - character-entities-legacy: 3.0.0 - character-reference-invalid: 2.0.1 - decode-named-character-reference: 1.0.2 - is-alphanumerical: 2.0.1 - is-decimal: 2.0.1 - is-hexadecimal: 2.0.1 - dev: true - /parse-json@4.0.0: resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} engines: {node: '>=4'} @@ -19871,7 +20692,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.21.4 + '@babel/code-frame': 7.22.13 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -19911,7 +20732,7 @@ packages: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} dependencies: no-case: 3.0.4 - tslib: 2.5.0 + tslib: 2.6.2 dev: false /path-browserify@1.0.1: @@ -19927,6 +20748,11 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + /path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -19939,12 +20765,30 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + + /path-match@1.2.4: + resolution: {integrity: sha512-UWlehEdqu36jmh4h5CWJ7tARp1OEVKGHKm6+dg9qMq5RKUTV5WJrGgaZ3dN2m7WFAXDbjlHzvJvL/IUpy84Ktw==} + dependencies: + http-errors: 1.4.0 + path-to-regexp: 1.8.0 + dev: true + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} /path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + /path-to-regexp@1.8.0: + resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} + dependencies: + isarray: 0.0.1 + dev: true + /path-to-regexp@6.1.0: resolution: {integrity: sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==} dev: true @@ -19957,30 +20801,14 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - /pathe@1.1.0: - resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} - dev: true - - /peek-stream@1.1.3: - resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} - dependencies: - buffer-from: 1.1.2 - duplexify: 3.7.1 - through2: 2.0.5 + /pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} dev: true /performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} dev: false - /periscopic@3.1.0: - resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} - dependencies: - '@types/estree': 1.0.1 - estree-walker: 3.0.3 - is-reference: 3.0.1 - dev: true - /pg-cloudflare@1.1.1: resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} requiresBuild: true @@ -20145,12 +20973,11 @@ packages: dependencies: find-up: 4.1.0 - /pkg-types@1.0.2: - resolution: {integrity: sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==} + /pkg-dir@7.0.0: + resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} + engines: {node: '>=14.16'} dependencies: - jsonc-parser: 3.2.0 - mlly: 1.2.0 - pathe: 1.1.0 + find-up: 6.3.0 dev: true /pkg-up@3.1.0: @@ -20166,25 +20993,25 @@ packages: hasBin: true dev: true - /postcss-attribute-case-insensitive@5.0.2(postcss@8.4.21): + /postcss-attribute-case-insensitive@5.0.2(postcss@8.4.30): resolution: {integrity: sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-selector-parser: 6.0.11 dev: false - /postcss-browser-comments@4.0.0(browserslist@4.21.5)(postcss@8.4.21): + /postcss-browser-comments@4.0.0(browserslist@4.21.10)(postcss@8.4.30): resolution: {integrity: sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==} engines: {node: '>=8'} peerDependencies: browserslist: '>=4' postcss: '>=8' dependencies: - browserslist: 4.21.5 - postcss: 8.4.21 + browserslist: 4.21.10 + postcss: 8.4.30 dev: false /postcss-calc@7.0.5: @@ -20195,53 +21022,53 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-calc@8.2.4(postcss@8.4.21): + /postcss-calc@8.2.4(postcss@8.4.30): resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} peerDependencies: postcss: ^8.2.2 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 dev: false - /postcss-clamp@4.1.0(postcss@8.4.21): + /postcss-clamp@4.1.0(postcss@8.4.30): resolution: {integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==} engines: {node: '>=7.6.0'} peerDependencies: postcss: ^8.4.6 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-value-parser: 4.2.0 dev: false - /postcss-color-functional-notation@4.2.4(postcss@8.4.21): + /postcss-color-functional-notation@4.2.4(postcss@8.4.30): resolution: {integrity: sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-value-parser: 4.2.0 dev: false - /postcss-color-hex-alpha@8.0.4(postcss@8.4.21): + /postcss-color-hex-alpha@8.0.4(postcss@8.4.30): resolution: {integrity: sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-value-parser: 4.2.0 dev: false - /postcss-color-rebeccapurple@7.1.1(postcss@8.4.21): + /postcss-color-rebeccapurple@7.1.1(postcss@8.4.30): resolution: {integrity: sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-value-parser: 4.2.0 dev: false @@ -20249,23 +21076,23 @@ packages: resolution: {integrity: sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.21.5 + browserslist: 4.21.10 color: 3.2.1 has: 1.0.3 postcss: 7.0.39 postcss-value-parser: 3.3.1 dev: true - /postcss-colormin@5.3.1(postcss@8.4.21): + /postcss-colormin@5.3.1(postcss@8.4.30): resolution: {integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.5 + browserslist: 4.21.10 caniuse-api: 3.0.0 colord: 2.9.3 - postcss: 8.4.21 + postcss: 8.4.30 postcss-value-parser: 4.2.0 dev: false @@ -20277,54 +21104,54 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-convert-values@5.1.3(postcss@8.4.21): + /postcss-convert-values@5.1.3(postcss@8.4.30): resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.5 - postcss: 8.4.21 + browserslist: 4.21.10 + postcss: 8.4.30 postcss-value-parser: 4.2.0 dev: false - /postcss-custom-media@8.0.2(postcss@8.4.21): + /postcss-custom-media@8.0.2(postcss@8.4.30): resolution: {integrity: sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.3 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-value-parser: 4.2.0 dev: false - /postcss-custom-properties@12.1.11(postcss@8.4.21): + /postcss-custom-properties@12.1.11(postcss@8.4.30): resolution: {integrity: sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-value-parser: 4.2.0 dev: false - /postcss-custom-selectors@6.0.3(postcss@8.4.21): + /postcss-custom-selectors@6.0.3(postcss@8.4.30): resolution: {integrity: sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.3 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-selector-parser: 6.0.11 dev: false - /postcss-dir-pseudo-class@6.0.5(postcss@8.4.21): + /postcss-dir-pseudo-class@6.0.5(postcss@8.4.30): resolution: {integrity: sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-selector-parser: 6.0.11 dev: false @@ -20335,39 +21162,30 @@ packages: postcss: 7.0.39 dev: true - /postcss-discard-comments@5.1.2(postcss@8.4.21): + /postcss-discard-comments@5.1.2(postcss@8.4.30): resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 dev: false /postcss-discard-duplicates@4.0.2: resolution: {integrity: sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==} engines: {node: '>=6.9.0'} dependencies: - postcss: 7.0.39 - dev: true - - /postcss-discard-duplicates@5.1.0(postcss@8.4.21): - resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.21 - dev: false + postcss: 7.0.39 + dev: true - /postcss-discard-duplicates@5.1.0(postcss@8.4.22): + /postcss-discard-duplicates@5.1.0(postcss@8.4.30): resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.22 - dev: true + postcss: 8.4.30 + dev: false /postcss-discard-empty@4.0.1: resolution: {integrity: sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==} @@ -20376,13 +21194,13 @@ packages: postcss: 7.0.39 dev: true - /postcss-discard-empty@5.1.1(postcss@8.4.21): + /postcss-discard-empty@5.1.1(postcss@8.4.30): resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 dev: false /postcss-discard-overridden@4.0.1: @@ -20392,149 +21210,127 @@ packages: postcss: 7.0.39 dev: true - /postcss-discard-overridden@5.1.0(postcss@8.4.21): + /postcss-discard-overridden@5.1.0(postcss@8.4.30): resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 dev: false - /postcss-double-position-gradients@3.1.2(postcss@8.4.21): + /postcss-double-position-gradients@3.1.2(postcss@8.4.30): resolution: {integrity: sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.21) - postcss: 8.4.21 + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.30) + postcss: 8.4.30 postcss-value-parser: 4.2.0 dev: false - /postcss-env-function@4.0.6(postcss@8.4.21): + /postcss-env-function@4.0.6(postcss@8.4.30): resolution: {integrity: sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-value-parser: 4.2.0 dev: false - /postcss-flexbugs-fixes@5.0.2(postcss@8.4.21): + /postcss-flexbugs-fixes@5.0.2(postcss@8.4.30): resolution: {integrity: sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==} peerDependencies: postcss: ^8.1.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 dev: false - /postcss-focus-visible@6.0.4(postcss@8.4.21): + /postcss-focus-visible@6.0.4(postcss@8.4.30): resolution: {integrity: sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-selector-parser: 6.0.11 dev: false - /postcss-focus-within@5.0.4(postcss@8.4.21): + /postcss-focus-within@5.0.4(postcss@8.4.30): resolution: {integrity: sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-selector-parser: 6.0.11 dev: false - /postcss-font-variant@5.0.0(postcss@8.4.21): + /postcss-font-variant@5.0.0(postcss@8.4.30): resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 dev: false - /postcss-gap-properties@3.0.5(postcss@8.4.21): + /postcss-gap-properties@3.0.5(postcss@8.4.30): resolution: {integrity: sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 dev: false - /postcss-image-set-function@4.0.7(postcss@8.4.21): + /postcss-image-set-function@4.0.7(postcss@8.4.30): resolution: {integrity: sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-value-parser: 4.2.0 dev: false - /postcss-import@14.1.0(postcss@8.4.21): - resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} - engines: {node: '>=10.0.0'} - peerDependencies: - postcss: ^8.0.0 - dependencies: - postcss: 8.4.21 - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.2 - - /postcss-import@14.1.0(postcss@8.4.22): + /postcss-import@14.1.0(postcss@8.4.30): resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} engines: {node: '>=10.0.0'} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.22 + postcss: 8.4.30 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.2 - dev: true - /postcss-initial@4.0.1(postcss@8.4.21): + /postcss-initial@4.0.1(postcss@8.4.30): resolution: {integrity: sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 dev: false - /postcss-js@4.0.1(postcss@8.4.21): - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 - dependencies: - camelcase-css: 2.0.1 - postcss: 8.4.21 - - /postcss-js@4.0.1(postcss@8.4.22): + /postcss-js@4.0.1(postcss@8.4.30): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: postcss: ^8.4.21 dependencies: camelcase-css: 2.0.1 - postcss: 8.4.22 - dev: true + postcss: 8.4.30 - /postcss-lab-function@4.2.1(postcss@8.4.21): + /postcss-lab-function@4.2.1(postcss@8.4.30): resolution: {integrity: sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.21) - postcss: 8.4.21 + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.30) + postcss: 8.4.30 postcss-value-parser: 4.2.0 dev: false @@ -20546,24 +21342,7 @@ packages: import-cwd: 2.1.0 dev: true - /postcss-load-config@3.1.4(postcss@8.4.21)(ts-node@10.8.2): - resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} - engines: {node: '>= 10'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - dependencies: - lilconfig: 2.1.0 - postcss: 8.4.21 - ts-node: 10.8.2(@types/node@18.15.11)(typescript@4.9.5) - yaml: 1.10.2 - - /postcss-load-config@3.1.4(postcss@8.4.22)(ts-node@10.8.2): + /postcss-load-config@3.1.4(postcss@8.4.30)(ts-node@10.8.2): resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} peerDependencies: @@ -20576,30 +21355,11 @@ packages: optional: true dependencies: lilconfig: 2.1.0 - postcss: 8.4.22 + postcss: 8.4.30 ts-node: 10.8.2(@types/node@18.15.11)(typescript@4.9.5) yaml: 1.10.2 - dev: true - - /postcss-load-config@4.0.1(postcss@8.4.22)(ts-node@10.8.2): - resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} - engines: {node: '>= 14'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - dependencies: - lilconfig: 2.1.0 - postcss: 8.4.22 - ts-node: 10.8.2(@types/node@18.15.11)(typescript@4.9.5) - yaml: 2.2.1 - dev: true - /postcss-loader@6.2.1(postcss@8.4.21)(webpack@5.78.0): + /postcss-loader@6.2.1(postcss@8.4.30)(webpack@5.88.2): resolution: {integrity: sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -20608,27 +21368,27 @@ packages: dependencies: cosmiconfig: 7.1.0 klona: 2.0.6 - postcss: 8.4.21 + postcss: 8.4.30 semver: 7.5.4 - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) dev: false - /postcss-logical@5.0.4(postcss@8.4.21): + /postcss-logical@5.0.4(postcss@8.4.30): resolution: {integrity: sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 dev: false - /postcss-media-minmax@5.0.0(postcss@8.4.21): + /postcss-media-minmax@5.0.0(postcss@8.4.30): resolution: {integrity: sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==} engines: {node: '>=10.0.0'} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 dev: false /postcss-merge-longhand@4.0.11: @@ -20641,22 +21401,22 @@ packages: stylehacks: 4.0.3 dev: true - /postcss-merge-longhand@5.1.7(postcss@8.4.21): + /postcss-merge-longhand@5.1.7(postcss@8.4.30): resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-value-parser: 4.2.0 - stylehacks: 5.1.1(postcss@8.4.21) + stylehacks: 5.1.1(postcss@8.4.30) dev: false /postcss-merge-rules@4.0.3: resolution: {integrity: sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.21.5 + browserslist: 4.21.10 caniuse-api: 3.0.0 cssnano-util-same-parent: 4.0.1 postcss: 7.0.39 @@ -20664,16 +21424,16 @@ packages: vendors: 1.0.4 dev: true - /postcss-merge-rules@5.1.4(postcss@8.4.21): + /postcss-merge-rules@5.1.4(postcss@8.4.30): resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.5 + browserslist: 4.21.10 caniuse-api: 3.0.0 - cssnano-utils: 3.1.0(postcss@8.4.21) - postcss: 8.4.21 + cssnano-utils: 3.1.0(postcss@8.4.30) + postcss: 8.4.30 postcss-selector-parser: 6.0.11 dev: false @@ -20685,13 +21445,13 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-minify-font-values@5.1.0(postcss@8.4.21): + /postcss-minify-font-values@5.1.0(postcss@8.4.30): resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-value-parser: 4.2.0 dev: false @@ -20705,15 +21465,15 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-minify-gradients@5.1.1(postcss@8.4.21): + /postcss-minify-gradients@5.1.1(postcss@8.4.30): resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: colord: 2.9.3 - cssnano-utils: 3.1.0(postcss@8.4.21) - postcss: 8.4.21 + cssnano-utils: 3.1.0(postcss@8.4.30) + postcss: 8.4.30 postcss-value-parser: 4.2.0 dev: false @@ -20722,22 +21482,22 @@ packages: engines: {node: '>=6.9.0'} dependencies: alphanum-sort: 1.0.2 - browserslist: 4.21.5 + browserslist: 4.21.10 cssnano-util-get-arguments: 4.0.0 postcss: 7.0.39 postcss-value-parser: 3.3.1 uniqs: 2.0.0 dev: true - /postcss-minify-params@5.1.4(postcss@8.4.21): + /postcss-minify-params@5.1.4(postcss@8.4.30): resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.5 - cssnano-utils: 3.1.0(postcss@8.4.21) - postcss: 8.4.21 + browserslist: 4.21.10 + cssnano-utils: 3.1.0(postcss@8.4.30) + postcss: 8.4.30 postcss-value-parser: 4.2.0 dev: false @@ -20751,13 +21511,13 @@ packages: postcss-selector-parser: 3.1.2 dev: true - /postcss-minify-selectors@5.2.1(postcss@8.4.21): + /postcss-minify-selectors@5.2.1(postcss@8.4.30): resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-selector-parser: 6.0.11 dev: false @@ -20767,24 +21527,15 @@ packages: postcss: 6.0.1 dev: true - /postcss-modules-extract-imports@3.0.0(postcss@8.4.21): + /postcss-modules-extract-imports@3.0.0(postcss@8.4.30): resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 dev: false - /postcss-modules-extract-imports@3.0.0(postcss@8.4.22): - resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - postcss: 8.4.22 - dev: true - /postcss-modules-local-by-default@1.2.0: resolution: {integrity: sha512-X4cquUPIaAd86raVrBwO8fwRfkIdbwFu7CTfEOjiZQHVQwlHRSkTgH5NLDmMm5+1hQO8u6dZ+TOOJDbay1hYpA==} dependencies: @@ -20792,30 +21543,18 @@ packages: postcss: 6.0.1 dev: true - /postcss-modules-local-by-default@4.0.0(postcss@8.4.21): + /postcss-modules-local-by-default@4.0.0(postcss@8.4.30): resolution: {integrity: sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.21) - postcss: 8.4.21 + icss-utils: 5.1.0(postcss@8.4.30) + postcss: 8.4.30 postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 dev: false - /postcss-modules-local-by-default@4.0.0(postcss@8.4.22): - resolution: {integrity: sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - icss-utils: 5.1.0(postcss@8.4.22) - postcss: 8.4.22 - postcss-selector-parser: 6.0.11 - postcss-value-parser: 4.2.0 - dev: true - /postcss-modules-scope@1.1.0: resolution: {integrity: sha512-LTYwnA4C1He1BKZXIx1CYiHixdSe9LWYVKadq9lK5aCCMkoOkFyZ7aigt+srfjlRplJY3gIol6KUNefdMQJdlw==} dependencies: @@ -20823,26 +21562,16 @@ packages: postcss: 6.0.1 dev: true - /postcss-modules-scope@3.0.0(postcss@8.4.21): + /postcss-modules-scope@3.0.0(postcss@8.4.30): resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-selector-parser: 6.0.11 dev: false - /postcss-modules-scope@3.0.0(postcss@8.4.22): - resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - postcss: 8.4.22 - postcss-selector-parser: 6.0.11 - dev: true - /postcss-modules-values@1.3.0: resolution: {integrity: sha512-i7IFaR9hlQ6/0UgFuqM6YWaCfA1Ej8WMg8A5DggnH1UGKJvTV/ugqq/KaULixzzOi3T/tF6ClBXcHGCzdd5unA==} dependencies: @@ -20850,26 +21579,16 @@ packages: postcss: 6.0.1 dev: true - /postcss-modules-values@4.0.0(postcss@8.4.21): + /postcss-modules-values@4.0.0(postcss@8.4.30): resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.21) - postcss: 8.4.21 + icss-utils: 5.1.0(postcss@8.4.30) + postcss: 8.4.30 dev: false - /postcss-modules-values@4.0.0(postcss@8.4.22): - resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - icss-utils: 5.1.0(postcss@8.4.22) - postcss: 8.4.22 - dev: true - /postcss-modules@2.0.0: resolution: {integrity: sha512-eqp+Bva+U2cwQO7dECJ8/V+X+uH1HduNeITB0CPPFAu6d/8LKQ32/j+p9rQ2YL1QytVcrNU0X+fBqgGmQIA1Rw==} dependencies: @@ -20880,49 +21599,23 @@ packages: string-hash: 1.1.3 dev: true - /postcss-modules@6.0.0(postcss@8.4.22): - resolution: {integrity: sha512-7DGfnlyi/ju82BRzTIjWS5C4Tafmzl3R79YP/PASiocj+aa6yYphHhhKUOEoXQToId5rgyFgJ88+ccOUydjBXQ==} - peerDependencies: - postcss: ^8.0.0 - dependencies: - generic-names: 4.0.0 - icss-utils: 5.1.0(postcss@8.4.22) - lodash.camelcase: 4.3.0 - postcss: 8.4.22 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.22) - postcss-modules-local-by-default: 4.0.0(postcss@8.4.22) - postcss-modules-scope: 3.0.0(postcss@8.4.22) - postcss-modules-values: 4.0.0(postcss@8.4.22) - string-hash: 1.1.3 - dev: true - - /postcss-nested@6.0.0(postcss@8.4.21): - resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - dependencies: - postcss: 8.4.21 - postcss-selector-parser: 6.0.11 - - /postcss-nested@6.0.0(postcss@8.4.22): + /postcss-nested@6.0.0(postcss@8.4.30): resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 dependencies: - postcss: 8.4.22 + postcss: 8.4.30 postcss-selector-parser: 6.0.11 - dev: true - /postcss-nesting@10.2.0(postcss@8.4.21): + /postcss-nesting@10.2.0(postcss@8.4.30): resolution: {integrity: sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.0.11) - postcss: 8.4.21 + postcss: 8.4.30 postcss-selector-parser: 6.0.11 dev: false @@ -20933,13 +21626,13 @@ packages: postcss: 7.0.39 dev: true - /postcss-normalize-charset@5.1.0(postcss@8.4.21): + /postcss-normalize-charset@5.1.0(postcss@8.4.30): resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 dev: false /postcss-normalize-display-values@4.0.2: @@ -20951,13 +21644,13 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-display-values@5.1.0(postcss@8.4.21): + /postcss-normalize-display-values@5.1.0(postcss@8.4.30): resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-value-parser: 4.2.0 dev: false @@ -20971,13 +21664,13 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-positions@5.1.1(postcss@8.4.21): + /postcss-normalize-positions@5.1.1(postcss@8.4.30): resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-value-parser: 4.2.0 dev: false @@ -20991,13 +21684,13 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-repeat-style@5.1.1(postcss@8.4.21): + /postcss-normalize-repeat-style@5.1.1(postcss@8.4.30): resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-value-parser: 4.2.0 dev: false @@ -21010,13 +21703,13 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-string@5.1.0(postcss@8.4.21): + /postcss-normalize-string@5.1.0(postcss@8.4.30): resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-value-parser: 4.2.0 dev: false @@ -21029,13 +21722,13 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-timing-functions@5.1.0(postcss@8.4.21): + /postcss-normalize-timing-functions@5.1.0(postcss@8.4.30): resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-value-parser: 4.2.0 dev: false @@ -21043,19 +21736,19 @@ packages: resolution: {integrity: sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.21.5 + browserslist: 4.21.10 postcss: 7.0.39 postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-unicode@5.1.1(postcss@8.4.21): + /postcss-normalize-unicode@5.1.1(postcss@8.4.30): resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.5 - postcss: 8.4.21 + browserslist: 4.21.10 + postcss: 8.4.30 postcss-value-parser: 4.2.0 dev: false @@ -21069,14 +21762,14 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-url@5.1.0(postcss@8.4.21): + /postcss-normalize-url@5.1.0(postcss@8.4.30): resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: normalize-url: 6.1.0 - postcss: 8.4.21 + postcss: 8.4.30 postcss-value-parser: 4.2.0 dev: false @@ -21088,17 +21781,17 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-whitespace@5.1.1(postcss@8.4.21): + /postcss-normalize-whitespace@5.1.1(postcss@8.4.30): resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize@10.0.1(browserslist@4.21.5)(postcss@8.4.21): + /postcss-normalize@10.0.1(browserslist@4.21.10)(postcss@8.4.30): resolution: {integrity: sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==} engines: {node: '>= 12'} peerDependencies: @@ -21106,19 +21799,19 @@ packages: postcss: '>= 8' dependencies: '@csstools/normalize.css': 12.0.0 - browserslist: 4.21.5 - postcss: 8.4.21 - postcss-browser-comments: 4.0.0(browserslist@4.21.5)(postcss@8.4.21) + browserslist: 4.21.10 + postcss: 8.4.30 + postcss-browser-comments: 4.0.0(browserslist@4.21.10)(postcss@8.4.30) sanitize.css: 13.0.0 dev: false - /postcss-opacity-percentage@1.1.3(postcss@8.4.21): + /postcss-opacity-percentage@1.1.3(postcss@8.4.30): resolution: {integrity: sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 dev: false /postcss-ordered-values@4.1.2: @@ -21130,110 +21823,110 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-ordered-values@5.1.3(postcss@8.4.21): + /postcss-ordered-values@5.1.3(postcss@8.4.30): resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-utils: 3.1.0(postcss@8.4.21) - postcss: 8.4.21 + cssnano-utils: 3.1.0(postcss@8.4.30) + postcss: 8.4.30 postcss-value-parser: 4.2.0 dev: false - /postcss-overflow-shorthand@3.0.4(postcss@8.4.21): + /postcss-overflow-shorthand@3.0.4(postcss@8.4.30): resolution: {integrity: sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-value-parser: 4.2.0 dev: false - /postcss-page-break@3.0.4(postcss@8.4.21): + /postcss-page-break@3.0.4(postcss@8.4.30): resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==} peerDependencies: postcss: ^8 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 dev: false - /postcss-place@7.0.5(postcss@8.4.21): + /postcss-place@7.0.5(postcss@8.4.30): resolution: {integrity: sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-value-parser: 4.2.0 dev: false - /postcss-preset-env@7.8.3(postcss@8.4.21): + /postcss-preset-env@7.8.3(postcss@8.4.30): resolution: {integrity: sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/postcss-cascade-layers': 1.1.1(postcss@8.4.21) - '@csstools/postcss-color-function': 1.1.1(postcss@8.4.21) - '@csstools/postcss-font-format-keywords': 1.0.1(postcss@8.4.21) - '@csstools/postcss-hwb-function': 1.0.2(postcss@8.4.21) - '@csstools/postcss-ic-unit': 1.0.1(postcss@8.4.21) - '@csstools/postcss-is-pseudo-class': 2.0.7(postcss@8.4.21) - '@csstools/postcss-nested-calc': 1.0.0(postcss@8.4.21) - '@csstools/postcss-normalize-display-values': 1.0.1(postcss@8.4.21) - '@csstools/postcss-oklab-function': 1.1.1(postcss@8.4.21) - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.21) - '@csstools/postcss-stepped-value-functions': 1.0.1(postcss@8.4.21) - '@csstools/postcss-text-decoration-shorthand': 1.0.0(postcss@8.4.21) - '@csstools/postcss-trigonometric-functions': 1.0.2(postcss@8.4.21) - '@csstools/postcss-unset-value': 1.0.2(postcss@8.4.21) - autoprefixer: 10.4.14(postcss@8.4.21) - browserslist: 4.21.5 - css-blank-pseudo: 3.0.3(postcss@8.4.21) - css-has-pseudo: 3.0.4(postcss@8.4.21) - css-prefers-color-scheme: 6.0.3(postcss@8.4.21) + '@csstools/postcss-cascade-layers': 1.1.1(postcss@8.4.30) + '@csstools/postcss-color-function': 1.1.1(postcss@8.4.30) + '@csstools/postcss-font-format-keywords': 1.0.1(postcss@8.4.30) + '@csstools/postcss-hwb-function': 1.0.2(postcss@8.4.30) + '@csstools/postcss-ic-unit': 1.0.1(postcss@8.4.30) + '@csstools/postcss-is-pseudo-class': 2.0.7(postcss@8.4.30) + '@csstools/postcss-nested-calc': 1.0.0(postcss@8.4.30) + '@csstools/postcss-normalize-display-values': 1.0.1(postcss@8.4.30) + '@csstools/postcss-oklab-function': 1.1.1(postcss@8.4.30) + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.30) + '@csstools/postcss-stepped-value-functions': 1.0.1(postcss@8.4.30) + '@csstools/postcss-text-decoration-shorthand': 1.0.0(postcss@8.4.30) + '@csstools/postcss-trigonometric-functions': 1.0.2(postcss@8.4.30) + '@csstools/postcss-unset-value': 1.0.2(postcss@8.4.30) + autoprefixer: 10.4.14(postcss@8.4.30) + browserslist: 4.21.10 + css-blank-pseudo: 3.0.3(postcss@8.4.30) + css-has-pseudo: 3.0.4(postcss@8.4.30) + css-prefers-color-scheme: 6.0.3(postcss@8.4.30) cssdb: 7.5.4 - postcss: 8.4.21 - postcss-attribute-case-insensitive: 5.0.2(postcss@8.4.21) - postcss-clamp: 4.1.0(postcss@8.4.21) - postcss-color-functional-notation: 4.2.4(postcss@8.4.21) - postcss-color-hex-alpha: 8.0.4(postcss@8.4.21) - postcss-color-rebeccapurple: 7.1.1(postcss@8.4.21) - postcss-custom-media: 8.0.2(postcss@8.4.21) - postcss-custom-properties: 12.1.11(postcss@8.4.21) - postcss-custom-selectors: 6.0.3(postcss@8.4.21) - postcss-dir-pseudo-class: 6.0.5(postcss@8.4.21) - postcss-double-position-gradients: 3.1.2(postcss@8.4.21) - postcss-env-function: 4.0.6(postcss@8.4.21) - postcss-focus-visible: 6.0.4(postcss@8.4.21) - postcss-focus-within: 5.0.4(postcss@8.4.21) - postcss-font-variant: 5.0.0(postcss@8.4.21) - postcss-gap-properties: 3.0.5(postcss@8.4.21) - postcss-image-set-function: 4.0.7(postcss@8.4.21) - postcss-initial: 4.0.1(postcss@8.4.21) - postcss-lab-function: 4.2.1(postcss@8.4.21) - postcss-logical: 5.0.4(postcss@8.4.21) - postcss-media-minmax: 5.0.0(postcss@8.4.21) - postcss-nesting: 10.2.0(postcss@8.4.21) - postcss-opacity-percentage: 1.1.3(postcss@8.4.21) - postcss-overflow-shorthand: 3.0.4(postcss@8.4.21) - postcss-page-break: 3.0.4(postcss@8.4.21) - postcss-place: 7.0.5(postcss@8.4.21) - postcss-pseudo-class-any-link: 7.1.6(postcss@8.4.21) - postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.21) - postcss-selector-not: 6.0.1(postcss@8.4.21) + postcss: 8.4.30 + postcss-attribute-case-insensitive: 5.0.2(postcss@8.4.30) + postcss-clamp: 4.1.0(postcss@8.4.30) + postcss-color-functional-notation: 4.2.4(postcss@8.4.30) + postcss-color-hex-alpha: 8.0.4(postcss@8.4.30) + postcss-color-rebeccapurple: 7.1.1(postcss@8.4.30) + postcss-custom-media: 8.0.2(postcss@8.4.30) + postcss-custom-properties: 12.1.11(postcss@8.4.30) + postcss-custom-selectors: 6.0.3(postcss@8.4.30) + postcss-dir-pseudo-class: 6.0.5(postcss@8.4.30) + postcss-double-position-gradients: 3.1.2(postcss@8.4.30) + postcss-env-function: 4.0.6(postcss@8.4.30) + postcss-focus-visible: 6.0.4(postcss@8.4.30) + postcss-focus-within: 5.0.4(postcss@8.4.30) + postcss-font-variant: 5.0.0(postcss@8.4.30) + postcss-gap-properties: 3.0.5(postcss@8.4.30) + postcss-image-set-function: 4.0.7(postcss@8.4.30) + postcss-initial: 4.0.1(postcss@8.4.30) + postcss-lab-function: 4.2.1(postcss@8.4.30) + postcss-logical: 5.0.4(postcss@8.4.30) + postcss-media-minmax: 5.0.0(postcss@8.4.30) + postcss-nesting: 10.2.0(postcss@8.4.30) + postcss-opacity-percentage: 1.1.3(postcss@8.4.30) + postcss-overflow-shorthand: 3.0.4(postcss@8.4.30) + postcss-page-break: 3.0.4(postcss@8.4.30) + postcss-place: 7.0.5(postcss@8.4.30) + postcss-pseudo-class-any-link: 7.1.6(postcss@8.4.30) + postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.30) + postcss-selector-not: 6.0.1(postcss@8.4.30) postcss-value-parser: 4.2.0 dev: false - /postcss-pseudo-class-any-link@7.1.6(postcss@8.4.21): + /postcss-pseudo-class-any-link@7.1.6(postcss@8.4.30): resolution: {integrity: sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-selector-parser: 6.0.11 dev: false @@ -21241,21 +21934,21 @@ packages: resolution: {integrity: sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.21.5 + browserslist: 4.21.10 caniuse-api: 3.0.0 has: 1.0.3 postcss: 7.0.39 dev: true - /postcss-reduce-initial@5.1.2(postcss@8.4.21): + /postcss-reduce-initial@5.1.2(postcss@8.4.30): resolution: {integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.5 + browserslist: 4.21.10 caniuse-api: 3.0.0 - postcss: 8.4.21 + postcss: 8.4.30 dev: false /postcss-reduce-transforms@4.0.2: @@ -21268,31 +21961,31 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-reduce-transforms@5.1.0(postcss@8.4.21): + /postcss-reduce-transforms@5.1.0(postcss@8.4.30): resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-value-parser: 4.2.0 dev: false - /postcss-replace-overflow-wrap@4.0.0(postcss@8.4.21): + /postcss-replace-overflow-wrap@4.0.0(postcss@8.4.30): resolution: {integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==} peerDependencies: postcss: ^8.0.3 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 dev: false - /postcss-selector-not@6.0.1(postcss@8.4.21): + /postcss-selector-not@6.0.1(postcss@8.4.30): resolution: {integrity: sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-selector-parser: 6.0.11 dev: false @@ -21329,13 +22022,13 @@ packages: svgo: 1.3.2 dev: true - /postcss-svgo@5.1.0(postcss@8.4.21): + /postcss-svgo@5.1.0(postcss@8.4.30): resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-value-parser: 4.2.0 svgo: 2.8.0 dev: false @@ -21349,13 +22042,13 @@ packages: uniqs: 2.0.0 dev: true - /postcss-unique-selectors@5.1.1(postcss@8.4.21): + /postcss-unique-selectors@5.1.1(postcss@8.4.30): resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.21 + postcss: 8.4.30 postcss-selector-parser: 6.0.11 dev: false @@ -21391,22 +22084,13 @@ packages: source-map-js: 1.0.2 dev: false - /postcss@8.4.21: - resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.6 - picocolors: 1.0.0 - source-map-js: 1.0.2 - - /postcss@8.4.22: - resolution: {integrity: sha512-XseknLAfRHzVWjCEtdviapiBtfLdgyzExD50Rg2ePaucEesyh8Wv4VPdW0nbyDa1ydbrAxV19jvMT4+LFmcNUA==} + /postcss@8.4.30: + resolution: {integrity: sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.6 picocolors: 1.0.0 source-map-js: 1.0.2 - dev: true /postgres-array@2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} @@ -21470,6 +22154,25 @@ packages: which-pm-runs: 1.1.0 dev: false + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.1 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.47.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false + /preferred-pm@3.0.3: resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==} engines: {node: '>=10'} @@ -21482,17 +22185,12 @@ packages: /prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} + dev: false /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - /prettier@2.7.1: - resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: true - /prettier@2.8.7: resolution: {integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==} engines: {node: '>=10.13.0'} @@ -21542,6 +22240,14 @@ packages: react-is: 18.2.0 dev: true + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + /pretty-format@3.8.0: resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} dev: false @@ -21561,6 +22267,11 @@ packages: dependencies: '@prisma/engines': 4.12.0 + /prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + dev: true + /proc-log@1.0.0: resolution: {integrity: sha512-aCk8AO51s+4JyuYGg3Q/a6gnrlDO09NpVWePtjp7xwphcoQ04x5WAfCyugcsbLooWcMJ87CLkD4+604IckEdhg==} @@ -21617,6 +22328,10 @@ packages: asap: 2.0.6 dev: false + /promisepipe@3.0.0: + resolution: {integrity: sha512-V6TbZDJ/ZswevgkDNpGt/YqNCiZP9ASfgU+p83uJE6NrGtvSGoOcHLiDCqkMs2+yg7F5qHdLV8d0aS8O26G/KA==} + dev: true + /prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -21638,10 +22353,6 @@ packages: mkdirp: 1.0.4 dev: true - /property-information@6.2.0: - resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==} - dev: true - /proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} dev: false @@ -21650,7 +22361,7 @@ packages: resolution: {integrity: sha512-AwAuY4g9nxx0u52DnSMkqqgyLHaW/XaPLtaAo3y/ZCfeaQB/g4YDH4kb8Wc/mWzWvu0YjOznVnfn373MVZZrgw==} engines: {node: '>=12.0.0'} dependencies: - protobufjs: 7.2.4 + protobufjs: 7.2.5 dev: false /protobufjs-cli@1.1.1(protobufjs@7.2.3): @@ -21674,9 +22385,9 @@ packages: dev: false optional: true - /protobufjs@6.11.3: - resolution: {integrity: sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==} - hasBin: true + /protobufjs@7.2.3: + resolution: {integrity: sha512-TtpvOqwB5Gdz/PQmOjgsrGH1nHjAQVCN7JG4A6r1sXRWESL5rNMAiRcBQlCAdKxZcAbstExQePYG8xof/JVRgg==} + engines: {node: '>=12.0.0'} requiresBuild: true dependencies: '@protobufjs/aspromise': 1.1.2 @@ -21689,12 +22400,13 @@ packages: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/long': 4.0.2 '@types/node': 18.15.11 - long: 4.0.0 + long: 5.2.1 + dev: false + optional: true - /protobufjs@7.2.3: - resolution: {integrity: sha512-TtpvOqwB5Gdz/PQmOjgsrGH1nHjAQVCN7JG4A6r1sXRWESL5rNMAiRcBQlCAdKxZcAbstExQePYG8xof/JVRgg==} + /protobufjs@7.2.4: + resolution: {integrity: sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==} engines: {node: '>=12.0.0'} requiresBuild: true dependencies: @@ -21711,10 +22423,9 @@ packages: '@types/node': 18.15.11 long: 5.2.1 dev: false - optional: true - /protobufjs@7.2.4: - resolution: {integrity: sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==} + /protobufjs@7.2.5: + resolution: {integrity: sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==} engines: {node: '>=12.0.0'} requiresBuild: true dependencies: @@ -21738,24 +22449,9 @@ packages: forwarded: 0.2.0 ipaddr.js: 1.9.1 - /proxy-agent@5.0.0: - resolution: {integrity: sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==} - engines: {node: '>= 8'} - dependencies: - agent-base: 6.0.2 - debug: 4.3.4 - http-proxy-agent: 4.0.1 - https-proxy-agent: 5.0.1 - lru-cache: 5.1.1 - pac-proxy-agent: 5.0.0 - proxy-from-env: 1.1.0 - socks-proxy-agent: 5.0.1 - transitivePeerDependencies: - - supports-color - dev: true - /proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false /prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} @@ -21774,27 +22470,12 @@ packages: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} dev: true - /pump@2.0.1: - resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: true - /pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} dependencies: end-of-stream: 1.4.4 once: 1.4.0 - /pumpify@1.5.1: - resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} - dependencies: - duplexify: 3.7.1 - inherits: 2.0.4 - pump: 2.0.1 - dev: true - /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} @@ -21805,7 +22486,6 @@ packages: /pure-rand@6.0.1: resolution: {integrity: sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==} - dev: true /q@1.5.1: resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} @@ -21856,26 +22536,26 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} - /raw-body@2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + /raw-body@2.4.1: + resolution: {integrity: sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==} engines: {node: '>= 0.8'} dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 + bytes: 3.1.0 + http-errors: 1.7.3 iconv-lite: 0.4.24 unpipe: 1.0.0 + dev: true - /raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + /raw-body@2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} engines: {node: '>= 0.8'} dependencies: bytes: 3.1.2 http-errors: 2.0.0 iconv-lite: 0.4.24 unpipe: 1.0.0 - dev: true - /raw-loader@4.0.2(webpack@5.79.0): + /raw-loader@4.0.2(webpack@5.88.2): resolution: {integrity: sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -21883,7 +22563,7 @@ packages: dependencies: loader-utils: 2.0.4 schema-utils: 3.1.1 - webpack: 5.79.0(esbuild@0.16.3) + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) dev: true /rc-align@4.0.15(react-dom@18.2.0)(react@18.2.0): @@ -22417,8 +23097,8 @@ packages: strip-json-comments: 2.0.1 dev: false - /react-app-polyfill@3.1.0-next.14: - resolution: {integrity: sha512-ki6Vg6IbszoxR0L70KiAUc+Fg7snl3X9nDMM3aP9cwmnj3kJE33pEIxjQwACBOjGpx/kVRQ7JzQD4VLSrGqNYw==} + /react-app-polyfill@3.0.0: + resolution: {integrity: sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==} engines: {node: '>=14'} dependencies: core-js: 3.30.0 @@ -22438,20 +23118,26 @@ packages: pure-color: 1.3.0 dev: false - /react-dev-utils@12.1.0-next.14(eslint@8.38.0)(typescript@4.9.5)(webpack@5.78.0): - resolution: {integrity: sha512-KJmfdZhLvsvNc2tWYyGFGwp71+0E+3hYwgEeYqG1JJ9i6z3TV4byweag/p84Htsra0Asfp5akHMVwyRQr1+VAg==} + /react-dev-utils@12.0.1(eslint@8.29.0)(typescript@4.9.5)(webpack@5.88.2): + resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} engines: {node: '>=14'} + peerDependencies: + typescript: '>=2.7' + webpack: '>=4' + peerDependenciesMeta: + typescript: + optional: true dependencies: - '@babel/code-frame': 7.21.4 + '@babel/code-frame': 7.22.13 address: 1.2.2 - browserslist: 4.21.5 + browserslist: 4.21.10 chalk: 4.1.2 cross-spawn: 7.0.3 detect-port-alt: 1.1.6 escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.38.0)(typescript@4.9.5)(webpack@5.78.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.29.0)(typescript@4.9.5)(webpack@5.88.2) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -22461,17 +23147,17 @@ packages: open: 8.4.2 pkg-up: 3.1.0 prompts: 2.4.2 - react-error-overlay: 6.1.0-next.14 + react-error-overlay: 6.0.11 recursive-readdir: 2.2.3 shell-quote: 1.8.1 strip-ansi: 6.0.1 text-table: 0.2.0 + typescript: 4.9.5 + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) transitivePeerDependencies: - eslint - supports-color - - typescript - vue-template-compiler - - webpack dev: false /react-dom@18.2.0(react@18.2.0): @@ -22483,8 +23169,8 @@ packages: react: 18.2.0 scheduler: 0.23.0 - /react-error-overlay@6.1.0-next.14: - resolution: {integrity: sha512-s6V1MF7/hheDh0WbbauMYu62H6z5n9PRPgUO/6RFm/V0srHcCO0gtBlz3AwkhldcQRcMaYAAkLO5o+6rTO/xkA==} + /react-error-overlay@6.0.11: + resolution: {integrity: sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==} dev: false /react-icons@4.10.1(react@18.2.0): @@ -22542,11 +23228,6 @@ packages: engines: {node: '>=0.10.0'} dev: false - /react-refresh@0.14.0: - resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} - engines: {node: '>=0.10.0'} - dev: true - /react-router-dom@6.10.0(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-E5dfxRPuXKJqzwSe/qGcqdwa18QiWC6f3H3cWXM24qj4N0/beCIf/CWTipop2xm7mR0RCS99NnaqPNjHtrAzCg==} engines: {node: '>=14'} @@ -22570,11 +23251,12 @@ packages: react: 18.2.0 dev: false - /react-scripts@5.1.0-next.14(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.21.0)(esbuild@0.16.3)(react@18.2.0)(ts-node@10.8.2)(typescript@4.9.5): - resolution: {integrity: sha512-c4Z8eO8nNm6LWDzovOm5gHcL1+eqo5Ll2FqKnfpydAGfEbPhxMWDau8NAg0d/QZ5jWjj9GgRoet5q9nqn9N/vQ==} + /react-scripts@5.0.1(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.21.0)(eslint@8.29.0)(react@18.2.0)(ts-node@10.8.2)(typescript@4.9.5): + resolution: {integrity: sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==} engines: {node: '>=14.0.0'} hasBin: true peerDependencies: + eslint: '*' react: '>= 16' typescript: ^3.2.1 || ^4 peerDependenciesMeta: @@ -22582,54 +23264,54 @@ packages: optional: true dependencies: '@babel/core': 7.21.4 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(webpack-dev-server@4.13.2)(webpack@5.78.0) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(webpack-dev-server@4.13.2)(webpack@5.88.2) '@svgr/webpack': 5.5.0 babel-jest: 27.5.1(@babel/core@7.21.4) - babel-loader: 8.3.0(@babel/core@7.21.4)(webpack@5.78.0) - babel-plugin-named-asset-import: 0.4.0-next.14(@babel/core@7.21.4) - babel-preset-react-app: 10.1.0-next.14 + babel-loader: 8.3.0(@babel/core@7.21.4)(webpack@5.88.2) + babel-plugin-named-asset-import: 0.3.8(@babel/core@7.21.4) + babel-preset-react-app: 10.0.1 bfj: 7.0.2 - browserslist: 4.21.5 + browserslist: 4.21.10 camelcase: 6.3.0 case-sensitive-paths-webpack-plugin: 2.4.0 - css-loader: 6.7.3(webpack@5.78.0) - css-minimizer-webpack-plugin: 3.4.1(esbuild@0.16.3)(webpack@5.78.0) + css-loader: 6.7.3(webpack@5.88.2) + css-minimizer-webpack-plugin: 3.4.1(webpack@5.88.2) dotenv: 10.0.0 dotenv-expand: 5.1.0 - eslint: 8.38.0 - eslint-config-react-app: 7.1.0-next.14(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.21.0)(eslint@8.38.0)(jest@27.5.1)(typescript@4.9.5) - eslint-webpack-plugin: 3.2.0(eslint@8.38.0)(webpack@5.78.0) - file-loader: 6.2.0(webpack@5.78.0) + eslint: 8.29.0 + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.21.0)(eslint@8.29.0)(jest@27.5.1)(typescript@4.9.5) + eslint-webpack-plugin: 3.2.0(eslint@8.29.0)(webpack@5.88.2) + file-loader: 6.2.0(webpack@5.88.2) fs-extra: 10.1.0 - html-webpack-plugin: 5.5.0(webpack@5.78.0) + html-webpack-plugin: 5.5.0(webpack@5.88.2) identity-obj-proxy: 3.0.0 jest: 27.5.1(ts-node@10.8.2) jest-resolve: 27.5.1 jest-watch-typeahead: 1.1.0(jest@27.5.1) - mini-css-extract-plugin: 2.7.5(webpack@5.78.0) - postcss: 8.4.21 - postcss-flexbugs-fixes: 5.0.2(postcss@8.4.21) - postcss-loader: 6.2.1(postcss@8.4.21)(webpack@5.78.0) - postcss-normalize: 10.0.1(browserslist@4.21.5)(postcss@8.4.21) - postcss-preset-env: 7.8.3(postcss@8.4.21) + mini-css-extract-plugin: 2.7.5(webpack@5.88.2) + postcss: 8.4.30 + postcss-flexbugs-fixes: 5.0.2(postcss@8.4.30) + postcss-loader: 6.2.1(postcss@8.4.30)(webpack@5.88.2) + postcss-normalize: 10.0.1(browserslist@4.21.10)(postcss@8.4.30) + postcss-preset-env: 7.8.3(postcss@8.4.30) prompts: 2.4.2 react: 18.2.0 - react-app-polyfill: 3.1.0-next.14 - react-dev-utils: 12.1.0-next.14(eslint@8.38.0)(typescript@4.9.5)(webpack@5.78.0) + react-app-polyfill: 3.0.0 + react-dev-utils: 12.0.1(eslint@8.29.0)(typescript@4.9.5)(webpack@5.88.2) react-refresh: 0.11.0 resolve: 1.22.2 resolve-url-loader: 4.0.0 - sass-loader: 12.6.0(webpack@5.78.0) - semver: 7.4.0 - source-map-loader: 3.0.2(webpack@5.78.0) - style-loader: 3.3.2(webpack@5.78.0) - tailwindcss: 3.3.1(postcss@8.4.21)(ts-node@10.8.2) - terser-webpack-plugin: 5.3.7(esbuild@0.16.3)(webpack@5.78.0) + sass-loader: 12.6.0(webpack@5.88.2) + semver: 7.5.4 + source-map-loader: 3.0.2(webpack@5.88.2) + style-loader: 3.3.2(webpack@5.88.2) + tailwindcss: 3.3.1(postcss@8.4.30)(ts-node@10.8.2) + terser-webpack-plugin: 5.3.7(@swc/core@1.3.88)(webpack@5.88.2) typescript: 4.9.5 - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) - webpack-dev-server: 4.13.2(webpack@5.78.0) - webpack-manifest-plugin: 4.1.1(webpack@5.78.0) - workbox-webpack-plugin: 6.5.4(webpack@5.78.0) + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack-dev-server: 4.13.2(webpack@5.88.2) + webpack-manifest-plugin: 4.1.1(webpack@5.88.2) + workbox-webpack-plugin: 6.5.4(webpack@5.88.2) optionalDependencies: fsevents: 2.3.2 transitivePeerDependencies: @@ -22680,14 +23362,14 @@ packages: - '@types/react' dev: false - /react-universal-interface@0.6.2(react@18.2.0)(tslib@2.5.0): + /react-universal-interface@0.6.2(react@18.2.0)(tslib@2.6.2): resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==} peerDependencies: react: '*' tslib: '*' dependencies: react: 18.2.0 - tslib: 2.5.0 + tslib: 2.6.2 dev: false /react-use@17.4.0(react-dom@18.2.0)(react@18.2.0): @@ -22705,13 +23387,13 @@ packages: nano-css: 5.3.5(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-universal-interface: 0.6.2(react@18.2.0)(tslib@2.5.0) + react-universal-interface: 0.6.2(react@18.2.0)(tslib@2.6.2) resize-observer-polyfill: 1.5.1 screenfull: 5.2.0 set-harmonic-interval: 1.0.1 throttle-debounce: 3.0.1 ts-easing: 0.2.0 - tslib: 2.5.0 + tslib: 2.6.2 dev: false /react@18.2.0: @@ -22753,15 +23435,6 @@ packages: parse-json: 5.2.0 type-fest: 0.6.0 - /readable-stream@1.1.14: - resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 0.0.1 - string_decoder: 0.10.31 - dev: true - /readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: @@ -22796,21 +23469,18 @@ packages: graceful-fs: 4.2.11 once: 1.4.0 - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + /readdirp@3.3.0: + resolution: {integrity: sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==} engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 + dev: true - /recast@0.21.5: - resolution: {integrity: sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==} - engines: {node: '>= 4'} + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} dependencies: - ast-types: 0.15.2 - esprima: 4.0.1 - source-map: 0.6.1 - tslib: 2.5.0 - dev: true + picomatch: 2.3.1 /rechoir@0.6.2: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} @@ -22869,6 +23539,12 @@ packages: resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} dependencies: '@babel/runtime': 7.21.0 + dev: true + + /regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + dependencies: + '@babel/runtime': 7.21.0 /regex-parser@2.2.11: resolution: {integrity: sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==} @@ -22901,50 +23577,12 @@ packages: resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} hasBin: true dependencies: - jsesc: 0.5.0 - - /relateurl@0.2.7: - resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} - engines: {node: '>= 0.10'} - dev: false - - /remark-frontmatter@4.0.1: - resolution: {integrity: sha512-38fJrB0KnmD3E33a5jZC/5+gGAC2WKNiPw1/fdXJvijBlhA7RCsvJklrYJakS0HedninvaCYW8lQGf9C918GfA==} - dependencies: - '@types/mdast': 3.0.11 - mdast-util-frontmatter: 1.0.1 - micromark-extension-frontmatter: 1.1.0 - unified: 10.1.2 - dev: true - - /remark-mdx-frontmatter@1.1.1: - resolution: {integrity: sha512-7teX9DW4tI2WZkXS4DBxneYSY7NHiXl4AKdWDO9LXVweULlCT8OPWsOjLEnMIXViN1j+QcY8mfbq3k0EK6x3uA==} - engines: {node: '>=12.2.0'} - dependencies: - estree-util-is-identifier-name: 1.1.0 - estree-util-value-to-estree: 1.3.0 - js-yaml: 4.1.0 - toml: 3.0.0 - dev: true - - /remark-parse@10.0.1: - resolution: {integrity: sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==} - dependencies: - '@types/mdast': 3.0.11 - mdast-util-from-markdown: 1.3.0 - unified: 10.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /remark-rehype@9.1.0: - resolution: {integrity: sha512-oLa6YmgAYg19zb0ZrBACh40hpBLteYROaPLhBXzLgjqyHQrN+gVP9N/FJvfzuNNuzCutktkroXEZBrxAxKhh7Q==} - dependencies: - '@types/hast': 2.3.4 - '@types/mdast': 3.0.11 - mdast-util-to-hast: 11.3.0 - unified: 10.1.2 - dev: true + jsesc: 0.5.0 + + /relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + dev: false /remove-trailing-separator@1.1.0: resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} @@ -22971,10 +23609,6 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - /require-like@0.1.2: - resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==} - dev: true - /requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} dev: false @@ -22989,10 +23623,6 @@ packages: /resize-observer-polyfill@1.5.1: resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} - /resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - dev: true - /resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} @@ -23038,7 +23668,6 @@ packages: /resolve.exports@2.0.2: resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} engines: {node: '>=10'} - dev: true /resolve@1.12.0: resolution: {integrity: sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==} @@ -23062,12 +23691,6 @@ packages: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - /responselike@2.0.1: - resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} - dependencies: - lowercase-keys: 2.0.0 - dev: true - /restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} @@ -23156,21 +23779,6 @@ packages: magic-string: 0.22.5 dev: true - /rollup-plugin-inject@3.0.2: - resolution: {integrity: sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==} - deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject. - dependencies: - estree-walker: 0.6.1 - magic-string: 0.25.9 - rollup-pluginutils: 2.8.2 - dev: true - - /rollup-plugin-node-polyfills@0.2.1: - resolution: {integrity: sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==} - dependencies: - rollup-plugin-inject: 3.0.2 - dev: true - /rollup-plugin-postcss@2.9.0: resolution: {integrity: sha512-Y7qDwlqjZMBexbB1kRJf+jKIQL8HR6C+ay53YzN+nNJ64hn1PNZfBE3c61hFUhD//zrMwmm7uBW30RuTi+CD0w==} engines: {node: '>=10'} @@ -23224,11 +23832,11 @@ packages: peerDependencies: rollup: ^2.0.0 dependencies: - '@babel/code-frame': 7.21.4 + '@babel/code-frame': 7.22.13 jest-worker: 26.6.2 rollup: 2.79.1 serialize-javascript: 4.0.0 - terser: 5.16.9 + terser: 5.19.4 dev: false /rollup-plugin-typescript2@0.25.3(rollup@1.32.1)(typescript@3.9.10): @@ -23291,8 +23899,8 @@ packages: fsevents: 2.3.2 dev: true - /rollup@3.20.6: - resolution: {integrity: sha512-2yEB3nQXp/tBQDN0hJScJQheXdvU2wFhh6ld7K/aiZ1vYcak6N/BKjY1QrU6BvO2JWYS8bEs14FRaxXosxy2zw==} + /rollup@3.29.1: + resolution: {integrity: sha512-c+ebvQz0VIH4KhhCpDsI+Bik0eT8ZFEVZEYw0cGMVqIP8zc+gnwl7iXCamTw7vzv2MeuZFZfdx5JJIq+ehzDlg==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: @@ -23305,10 +23913,22 @@ packages: '@babel/runtime': 7.21.0 dev: false + /run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + dependencies: + execa: 5.1.1 + dev: true + /run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} + /run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + dev: true + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: @@ -23317,7 +23937,13 @@ packages: /rxjs@7.8.0: resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==} dependencies: - tslib: 2.5.0 + tslib: 2.6.2 + dev: true + + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + dependencies: + tslib: 2.6.2 /sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} @@ -23350,16 +23976,7 @@ packages: resolution: {integrity: sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==} dev: false - /saslprep@1.0.3: - resolution: {integrity: sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==} - engines: {node: '>=6'} - requiresBuild: true - dependencies: - sparse-bitfield: 3.0.3 - dev: false - optional: true - - /sass-loader@12.6.0(webpack@5.78.0): + /sass-loader@12.6.0(webpack@5.88.2): resolution: {integrity: sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -23380,7 +23997,7 @@ packages: dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) dev: false /sax@1.2.4: @@ -23430,9 +24047,10 @@ packages: '@types/json-schema': 7.0.11 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) + dev: true - /schema-utils@3.1.2: - resolution: {integrity: sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==} + /schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} dependencies: '@types/json-schema': 7.0.11 @@ -23477,13 +24095,8 @@ packages: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true - /semver@6.1.1: - resolution: {integrity: sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==} - hasBin: true - dev: true - - /semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true /semver@7.0.0: @@ -23491,23 +24104,8 @@ packages: hasBin: true dev: true - /semver@7.3.8: - resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /semver@7.4.0: - resolution: {integrity: sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - - /semver@7.5.0: - resolution: {integrity: sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==} + /semver@7.3.5: + resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} engines: {node: '>=10'} hasBin: true dependencies: @@ -23580,10 +24178,6 @@ packages: /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - /set-cookie-parser@2.6.0: - resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} - dev: true - /set-harmonic-interval@1.0.1: resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==} engines: {node: '>=6.9'} @@ -23597,6 +24191,10 @@ packages: resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} dev: false + /setprototypeof@1.1.1: + resolution: {integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==} + dev: true + /setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -23647,6 +24245,11 @@ packages: /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + /signal-exit@4.0.2: + resolution: {integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==} + engines: {node: '>=14'} + dev: true + /simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} dev: false @@ -23659,6 +24262,14 @@ packages: simple-concat: 1.0.1 dev: false + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: false + /simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} dependencies: @@ -23690,6 +24301,10 @@ packages: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + /smob@1.4.0: + resolution: {integrity: sha512-MqR3fVulhjWuRNSMydnTlweu38UhQ0HXM4buStD/S3mc/BzX3CuM9OmhyQpmtYCvoYdl5ris6TI0ZqH355Ymqg==} + dev: true + /snappyjs@0.6.1: resolution: {integrity: sha512-YIK6I2lsH072UE0aOFxxY1dPDCS43I5ktqHpeAsuLNYWkE5pGxRGWfDM4/vSUfNzXjC1Ivzt3qx31PCLmc9yqg==} dev: false @@ -23702,17 +24317,6 @@ packages: websocket-driver: 0.7.4 dev: false - /socks-proxy-agent@5.0.1: - resolution: {integrity: sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==} - engines: {node: '>= 6'} - dependencies: - agent-base: 6.0.2 - debug: 4.3.4 - socks: 2.7.1 - transitivePeerDependencies: - - supports-color - dev: true - /socks-proxy-agent@6.2.1: resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} engines: {node: '>= 10'} @@ -23746,22 +24350,6 @@ packages: dependencies: is-plain-obj: 2.1.0 - /sort-object-keys@1.1.3: - resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} - dev: true - - /sort-package-json@1.57.0: - resolution: {integrity: sha512-FYsjYn2dHTRb41wqnv+uEqCUvBpK3jZcTp9rbz2qDTmel7Pmdtf+i2rLaaPMRZeSVM60V3Se31GyWFpmKs4Q5Q==} - hasBin: true - dependencies: - detect-indent: 6.1.0 - detect-newline: 3.1.0 - git-hooks-list: 1.0.3 - globby: 10.0.0 - is-plain-obj: 2.1.0 - sort-object-keys: 1.1.3 - dev: true - /source-list-map@2.0.1: resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} dev: false @@ -23770,7 +24358,7 @@ packages: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} - /source-map-loader@3.0.2(webpack@5.78.0): + /source-map-loader@3.0.2(webpack@5.88.2): resolution: {integrity: sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -23779,7 +24367,7 @@ packages: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.0.2 - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) dev: false /source-map-support@0.5.13: @@ -23787,7 +24375,6 @@ packages: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - dev: true /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -23812,6 +24399,7 @@ packages: /source-map@0.7.4: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + dev: false /source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} @@ -23824,10 +24412,6 @@ packages: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} deprecated: Please use @jridgewell/sourcemap-codec instead - /space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - dev: true - /spark-md5@3.0.2: resolution: {integrity: sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==} dev: true @@ -23979,6 +24563,10 @@ packages: /standard-as-callback@2.1.0: resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + /stat-mode@0.3.0: + resolution: {integrity: sha512-QjMLR0A3WwFY2aZdV0okfFEJB5TRjkggXZjxP3A1RsWsNHNu3YPv8btmtc6iCFZ0Rul3FE93OYogvhOUClU+ng==} + dev: true + /state-local@1.0.7: resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} dev: false @@ -23986,7 +24574,6 @@ packages: /statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} - dev: false /statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} @@ -24011,11 +24598,25 @@ packages: /stream-shift@1.0.1: resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} + dev: false + + /stream-to-array@2.3.0: + resolution: {integrity: sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==} + dependencies: + any-promise: 1.3.0 + dev: true + + /stream-to-promise@2.2.0: + resolution: {integrity: sha512-HAGUASw8NT0k8JvIVutB2Y/9iBk7gpgEyAudXwNJmZERdMITGdajOa4VJfD/kNiA3TppQpTP4J+CtcHwdzKBAw==} + dependencies: + any-promise: 1.3.0 + end-of-stream: 1.1.0 + stream-to-array: 2.3.0 + dev: true /streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} - dev: false /string-convert@0.2.1: resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==} @@ -24094,10 +24695,6 @@ packages: define-properties: 1.2.0 es-abstract: 1.21.2 - /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==} dependencies: @@ -24108,13 +24705,6 @@ packages: dependencies: safe-buffer: 5.2.1 - /stringify-entities@4.0.3: - resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} - dependencies: - character-entities-html4: 2.1.0 - character-entities-legacy: 3.0.0 - dev: true - /stringify-object@3.3.0: resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} engines: {node: '>=4'} @@ -24179,6 +24769,11 @@ packages: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + /strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -24215,22 +24810,16 @@ packages: resolution: {integrity: sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==} dev: true - /style-loader@3.3.2(webpack@5.78.0): + /style-loader@3.3.2(webpack@5.88.2): resolution: {integrity: sha512-RHs/vcrKdQK8wZliteNK4NKzxvLBzpuHMqYmUVWeKa6MkaIQ97ZTOS0b+zapZhy6GcrgWnvWYCMHRirC3FsUmw==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 dependencies: - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) dev: false - /style-to-object@0.4.1: - resolution: {integrity: sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw==} - dependencies: - inline-style-parser: 0.1.1 - dev: true - - /styled-jsx@5.1.0(@babel/core@7.21.4)(react@18.2.0): + /styled-jsx@5.1.0(react@18.2.0): resolution: {integrity: sha512-/iHaRJt9U7T+5tp6TRelLnqBqiaIT0HsO0+vgyj8hK2KUk7aejFqRrumqPUlAqDwAj8IbS/1hk3IhBAAK/FCUQ==} engines: {node: '>= 12.0.0'} peerDependencies: @@ -24243,7 +24832,6 @@ packages: babel-plugin-macros: optional: true dependencies: - '@babel/core': 7.21.4 client-only: 0.0.1 react: 18.2.0 dev: false @@ -24270,19 +24858,19 @@ packages: resolution: {integrity: sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.21.5 + browserslist: 4.21.10 postcss: 7.0.39 postcss-selector-parser: 3.1.2 dev: true - /stylehacks@5.1.1(postcss@8.4.21): + /stylehacks@5.1.1(postcss@8.4.30): resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.5 - postcss: 8.4.21 + browserslist: 4.21.10 + postcss: 8.4.30 postcss-selector-parser: 6.0.11 dev: false @@ -24396,44 +24984,10 @@ packages: engines: {node: ^14.18.0 || >=16.0.0} dependencies: '@pkgr/utils': 2.3.1 - tslib: 2.5.0 + tslib: 2.6.2 dev: true - /tailwindcss@3.3.1(postcss@8.4.21)(ts-node@10.8.2): - resolution: {integrity: sha512-Vkiouc41d4CEq0ujXl6oiGFQ7bA3WEhUZdTgXAhtKxSy49OmKs8rEfQmupsfF0IGW8fv2iQkp1EVUuapCFrZ9g==} - engines: {node: '>=12.13.0'} - hasBin: true - peerDependencies: - postcss: ^8.0.9 - dependencies: - arg: 5.0.2 - chokidar: 3.5.3 - color-name: 1.1.4 - didyoumean: 1.2.2 - dlv: 1.1.3 - fast-glob: 3.2.12 - glob-parent: 6.0.2 - is-glob: 4.0.3 - jiti: 1.18.2 - lilconfig: 2.1.0 - micromatch: 4.0.5 - normalize-path: 3.0.0 - object-hash: 3.0.0 - picocolors: 1.0.0 - postcss: 8.4.21 - postcss-import: 14.1.0(postcss@8.4.21) - postcss-js: 4.0.1(postcss@8.4.21) - postcss-load-config: 3.1.4(postcss@8.4.21)(ts-node@10.8.2) - postcss-nested: 6.0.0(postcss@8.4.21) - postcss-selector-parser: 6.0.11 - postcss-value-parser: 4.2.0 - quick-lru: 5.1.1 - resolve: 1.22.2 - sucrase: 3.32.0 - transitivePeerDependencies: - - ts-node - - /tailwindcss@3.3.1(postcss@8.4.22)(ts-node@10.8.2): + /tailwindcss@3.3.1(postcss@8.4.30)(ts-node@10.8.2): resolution: {integrity: sha512-Vkiouc41d4CEq0ujXl6oiGFQ7bA3WEhUZdTgXAhtKxSy49OmKs8rEfQmupsfF0IGW8fv2iQkp1EVUuapCFrZ9g==} engines: {node: '>=12.13.0'} hasBin: true @@ -24454,11 +25008,11 @@ packages: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.0.0 - postcss: 8.4.22 - postcss-import: 14.1.0(postcss@8.4.22) - postcss-js: 4.0.1(postcss@8.4.22) - postcss-load-config: 3.1.4(postcss@8.4.22)(ts-node@10.8.2) - postcss-nested: 6.0.0(postcss@8.4.22) + postcss: 8.4.30 + postcss-import: 14.1.0(postcss@8.4.30) + postcss-js: 4.0.1(postcss@8.4.30) + postcss-load-config: 3.1.4(postcss@8.4.30)(ts-node@10.8.2) + postcss-nested: 6.0.0(postcss@8.4.30) postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 quick-lru: 5.1.1 @@ -24466,7 +25020,6 @@ packages: sucrase: 3.32.0 transitivePeerDependencies: - ts-node - dev: true /tapable@1.1.3: resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} @@ -24504,6 +25057,19 @@ packages: inherits: 2.0.4 readable-stream: 3.6.2 + /tar@4.4.18: + resolution: {integrity: sha512-ZuOtqqmkV9RE1+4odd+MhBpibmCxNP6PJhH/h2OqNuotTX7/XHPZQJv2pKvWMplFH9SIZZhitehh6vBH6LO8Pg==} + engines: {node: '>=4.5'} + dependencies: + chownr: 1.1.4 + fs-minipass: 1.2.7 + minipass: 2.9.0 + minizlib: 1.3.3 + mkdirp: 0.5.6 + safe-buffer: 5.2.1 + yallist: 3.1.1 + dev: true + /tar@6.1.13: resolution: {integrity: sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==} engines: {node: '>=10'} @@ -24527,7 +25093,7 @@ packages: dependencies: http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 - node-fetch: 2.6.9 + node-fetch: 2.7.0 stream-events: 1.0.5 uuid: 9.0.0 transitivePeerDependencies: @@ -24558,31 +25124,7 @@ packages: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - /terser-webpack-plugin@5.3.7(esbuild@0.16.3)(webpack@5.78.0): - resolution: {integrity: sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - dependencies: - '@jridgewell/trace-mapping': 0.3.18 - esbuild: 0.16.3 - jest-worker: 27.5.1 - schema-utils: 3.1.1 - serialize-javascript: 6.0.1 - terser: 5.16.9 - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) - - /terser-webpack-plugin@5.3.7(esbuild@0.16.3)(webpack@5.79.0): + /terser-webpack-plugin@5.3.7(@swc/core@1.3.88)(webpack@5.88.2): resolution: {integrity: sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -24599,12 +25141,12 @@ packages: optional: true dependencies: '@jridgewell/trace-mapping': 0.3.18 - esbuild: 0.16.3 + '@swc/core': 1.3.88 jest-worker: 27.5.1 - schema-utils: 3.1.1 + schema-utils: 3.3.0 serialize-javascript: 6.0.1 - terser: 5.16.9 - webpack: 5.79.0(esbuild@0.16.3) + terser: 5.19.4 + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) /terser@4.8.1: resolution: {integrity: sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==} @@ -24626,6 +25168,17 @@ packages: acorn: 8.8.2 commander: 2.20.3 source-map-support: 0.5.21 + dev: true + + /terser@5.19.4: + resolution: {integrity: sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.3 + acorn: 8.8.2 + commander: 2.20.3 + source-map-support: 0.5.21 /test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} @@ -24649,7 +25202,7 @@ packages: docker-compose: 0.23.19 dockerode: 3.3.5 get-port: 5.1.1 - node-fetch: 2.6.9 + node-fetch: 2.7.0 properties-reader: 2.2.0 ssh-remote-port-forward: 1.0.4 tar-fs: 2.1.1 @@ -24693,13 +25246,6 @@ packages: resolution: {integrity: sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==} engines: {node: '>=12.22'} - /through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 - dev: true - /through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} @@ -24733,6 +25279,22 @@ packages: resolution: {integrity: sha512-knIN5zj4fl7kW4EBU5sLP20DWUvi/rVouvJezV0UAym2DkQaqm365Nyc8F3QEiOvunNDMxR8UhcXd1d5g+Wg1g==} dev: true + /titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + dev: true + + /tldts-core@6.0.15: + resolution: {integrity: sha512-8RuyZ9S3kY2NaSx5zfEiURuyM1kipN6xXp/1guWWKwiSqvb/7dNKKjfvF88H3A3wX1pagaNlewK21kpxZt/DPg==} + dev: true + + /tldts@6.0.15: + resolution: {integrity: sha512-GMoI6Ae4c8vv7A3lgmD+ubAziHINxn3/X1BTRqfePmTnff2qAaZsGnDMo2OHbDn9psPLmW9SCBISiNzyce6bKw==} + hasBin: true + dependencies: + tldts-core: 6.0.15 + dev: true + /tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -24763,14 +25325,15 @@ packages: /toggle-selection@1.0.6: resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + /toidentifier@1.0.0: + resolution: {integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==} + engines: {node: '>=0.6'} + dev: true + /toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - /toml@3.0.0: - resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} - dev: true - /touch@3.1.0: resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} hasBin: true @@ -24811,26 +25374,61 @@ packages: punycode: 2.3.0 dev: false + /tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + dev: true + /treeverse@1.0.4: resolution: {integrity: sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==} - /trough@2.1.0: - resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} + /tryer@1.0.1: + resolution: {integrity: sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==} + dev: false + + /ts-easing@0.2.0: + resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==} + dev: false + + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + /ts-jest@29.0.5(@babel/core@7.21.4)(jest@29.5.0)(typescript@4.9.5): + resolution: {integrity: sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@babel/core': 7.21.4 + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.5.0(@types/node@18.15.11)(ts-node@10.8.2) + jest-util: 29.5.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.5.4 + typescript: 4.9.5 + yargs-parser: 21.1.1 dev: true - /tryer@1.0.1: - resolution: {integrity: sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==} - dev: false - - /ts-easing@0.2.0: - resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==} - dev: false - - /ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - - /ts-jest@29.0.5(@babel/core@7.21.4)(esbuild@0.16.3)(jest@29.5.0)(typescript@4.9.5): - resolution: {integrity: sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==} + /ts-jest@29.1.1(@babel/core@7.21.4)(jest@29.7.0)(typescript@5.2.2): + resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -24839,7 +25437,7 @@ packages: babel-jest: ^29.0.0 esbuild: '*' jest: ^29.0.0 - typescript: '>=4.3' + typescript: '>=4.3 <6' peerDependenciesMeta: '@babel/core': optional: true @@ -24852,15 +25450,14 @@ packages: dependencies: '@babel/core': 7.21.4 bs-logger: 0.2.6 - esbuild: 0.16.3 fast-json-stable-stringify: 2.1.0 - jest: 29.5.0(@types/node@18.15.11)(ts-node@10.8.2) + jest: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) jest-util: 29.5.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.5.0 - typescript: 4.9.5 + semver: 7.5.4 + typescript: 5.2.2 yargs-parser: 21.1.1 dev: true @@ -24874,9 +25471,24 @@ packages: chalk: 4.1.2 enhanced-resolve: 5.12.0 micromatch: 4.0.5 - semver: 7.4.0 + semver: 7.5.4 typescript: 4.9.5 - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) + webpack: 5.78.0(webpack-cli@5.0.1) + dev: true + + /ts-loader@9.4.4(typescript@5.2.2)(webpack@5.88.2): + resolution: {integrity: sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==} + engines: {node: '>=12.0.0'} + peerDependencies: + typescript: '*' + webpack: ^5.0.0 + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.13.0 + micromatch: 4.0.5 + semver: 7.5.4 + typescript: 5.2.2 + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) dev: true /ts-morph@12.0.0: @@ -24923,7 +25535,7 @@ packages: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - /ts-node@10.9.1(@types/node@14.18.33)(typescript@4.3.4): + /ts-node@10.9.1(@types/node@14.18.33)(typescript@4.9.5): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -24949,7 +25561,7 @@ packages: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 4.3.4 + typescript: 4.9.5 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true @@ -25001,15 +25613,6 @@ packages: minimist: 1.2.8 strip-bom: 3.0.0 - /tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} - dependencies: - json5: 2.2.3 - minimist: 1.2.8 - strip-bom: 3.0.0 - dev: true - /tslib@1.10.0: resolution: {integrity: sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==} dev: true @@ -25020,6 +25623,9 @@ packages: /tslib@2.5.0: resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + /tsutils@3.21.0(typescript@4.9.4): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} @@ -25177,6 +25783,7 @@ packages: engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.1.2 + dev: false /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} @@ -25245,12 +25852,6 @@ packages: hasBin: true dev: true - /typescript@4.3.4: - resolution: {integrity: sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew==} - engines: {node: '>=4.2.0'} - hasBin: true - dev: true - /typescript@4.9.4: resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==} engines: {node: '>=4.2.0'} @@ -25261,6 +25862,12 @@ packages: engines: {node: '>=4.2.0'} hasBin: true + /typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + /ua-parser-js@0.7.35: resolution: {integrity: sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==} dev: false @@ -25270,16 +25877,16 @@ packages: dev: false optional: true - /ufo@1.1.1: - resolution: {integrity: sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==} - dev: true - /uglify-js@3.17.4: resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} engines: {node: '>=0.8.0'} hasBin: true dev: false + /uid-promise@1.0.0: + resolution: {integrity: sha512-R8375j0qwXyIu/7R0tjdF06/sElHqbmdmWC9M2qQHpEVbvE4I5+38KJI7LUUmQMp7NVq4tKHiBMkT0NFM453Ig==} + dev: true + /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: @@ -25297,6 +25904,13 @@ packages: dev: false optional: true + /undici@5.23.0: + resolution: {integrity: sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==} + engines: {node: '>=14.0'} + dependencies: + busboy: 1.6.0 + dev: true + /unfetch@3.1.2: resolution: {integrity: sha512-L0qrK7ZeAudGiKYw6nzFjnJ2D5WHblUBwmHIqtPS6oKUd+Hcpk7/hKsSmcHsTlpd1TbTNsiRBUKRq3bHLNIqIw==} dev: true @@ -25324,18 +25938,6 @@ packages: resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} engines: {node: '>=4'} - /unified@10.1.2: - resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} - dependencies: - '@types/unist': 2.0.6 - bail: 2.0.2 - extend: 3.0.2 - is-buffer: 2.0.5 - is-plain-obj: 4.1.0 - trough: 2.1.0 - vfile: 5.3.7 - dev: true - /uniq@1.0.1: resolution: {integrity: sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==} dev: true @@ -25373,62 +25975,6 @@ packages: crypto-random-string: 2.0.0 dev: false - /unist-builder@3.0.1: - resolution: {integrity: sha512-gnpOw7DIpCA0vpr6NqdPvTWnlPTApCTRzr+38E6hCWx3rz/cjo83SsKIlS1Z+L5ttScQ2AwutNnb8+tAvpb6qQ==} - dependencies: - '@types/unist': 2.0.6 - dev: true - - /unist-util-generated@2.0.1: - resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} - dev: true - - /unist-util-is@5.2.1: - resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} - dependencies: - '@types/unist': 2.0.6 - dev: true - - /unist-util-position-from-estree@1.1.2: - resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} - dependencies: - '@types/unist': 2.0.6 - dev: true - - /unist-util-position@4.0.4: - resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} - dependencies: - '@types/unist': 2.0.6 - dev: true - - /unist-util-remove-position@4.0.2: - resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} - dependencies: - '@types/unist': 2.0.6 - unist-util-visit: 4.1.2 - dev: true - - /unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} - dependencies: - '@types/unist': 2.0.6 - dev: true - - /unist-util-visit-parents@5.1.3: - resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} - dependencies: - '@types/unist': 2.0.6 - unist-util-is: 5.2.1 - dev: true - - /unist-util-visit@4.1.2: - resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} - dependencies: - '@types/unist': 2.0.6 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 - dev: true - /universal-user-agent@6.0.0: resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==} @@ -25462,6 +26008,16 @@ packages: engines: {node: '>=4'} dev: false + /update-browserslist-db@1.0.11(browserslist@4.21.10): + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.10 + escalade: 3.1.1 + picocolors: 1.0.0 + /update-browserslist-db@1.0.11(browserslist@4.21.5): resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} hasBin: true @@ -25554,6 +26110,12 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} + /uuid@3.3.2: + resolution: {integrity: sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + dev: true + /uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true @@ -25564,17 +26126,6 @@ packages: hasBin: true dev: false - /uvu@0.5.6: - resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} - engines: {node: '>=8'} - hasBin: true - dependencies: - dequal: 2.0.3 - diff: 5.1.0 - kleur: 4.1.5 - sade: 1.8.1 - dev: true - /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} @@ -25594,7 +26145,6 @@ packages: '@jridgewell/trace-mapping': 0.3.18 '@types/istanbul-lib-coverage': 2.0.4 convert-source-map: 1.9.0 - dev: true /valid-data-url@3.0.1: resolution: {integrity: sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA==} @@ -25645,61 +26195,28 @@ packages: resolution: {integrity: sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==} dev: true - /vercel@28.18.5(@types/node@18.15.11)(ts-node@10.8.2): - resolution: {integrity: sha512-WdW5s7w2eGmvKwrIyG32BR/N0hKz9iiZe/INyqopW2Ql+E768ROSP+r+SFpWLMpkGGw14QnmZsFutZ5r7IbpJg==} - engines: {node: '>= 14'} + /vercel@32.3.1: + resolution: {integrity: sha512-XPwkXNbsqyqGy4kNo5T2At9TK71rfT/d9t55bUTkhWCHv62CZrZ+HdKrkZf2knx3mi11zeCWAU+2GvX9G1+3hw==} + engines: {node: '>= 16'} hasBin: true - requiresBuild: true dependencies: - '@vercel/build-utils': 6.7.1 - '@vercel/go': 2.4.4 - '@vercel/hydrogen': 0.0.62 - '@vercel/next': 3.7.4 - '@vercel/node': 2.10.3 - '@vercel/python': 3.1.58 - '@vercel/redwood': 1.1.14 - '@vercel/remix-builder': 1.8.4(@types/node@18.15.11)(ts-node@10.8.2) - '@vercel/ruby': 1.3.75 - '@vercel/static-build': 1.3.23 - transitivePeerDependencies: - - '@remix-run/serve' + '@vercel/build-utils': 7.2.1 + '@vercel/fun': 1.1.0 + '@vercel/go': 3.0.2 + '@vercel/hydrogen': 1.0.1 + '@vercel/next': 4.0.8 + '@vercel/node': 3.0.6 + '@vercel/python': 4.0.2 + '@vercel/redwood': 2.0.3 + '@vercel/remix-builder': 2.0.8 + '@vercel/ruby': 2.0.2 + '@vercel/static-build': 2.0.7 + chokidar: 3.3.1 + transitivePeerDependencies: - '@swc/core' - '@swc/wasm' - - '@types/node' - - bluebird - - bufferutil - encoding - - less - - sass - - stylus - - sugarss - supports-color - - terser - - ts-node - - utf-8-validate - dev: true - - /vfile-location@4.1.0: - resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} - dependencies: - '@types/unist': 2.0.6 - vfile: 5.3.7 - dev: true - - /vfile-message@3.1.4: - resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} - dependencies: - '@types/unist': 2.0.6 - unist-util-stringify-position: 3.0.3 - dev: true - - /vfile@5.3.7: - resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} - dependencies: - '@types/unist': 2.0.6 - is-buffer: 2.0.5 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 dev: true /vinyl-file@3.0.0: @@ -25723,86 +26240,10 @@ packages: remove-trailing-separator: 1.1.0 replace-ext: 1.0.1 - /vite-node@0.28.5(@types/node@18.15.11): - resolution: {integrity: sha512-LmXb9saMGlrMZbXTvOveJKwMTBTNUH66c8rJnQ0ZPNX+myPEol64+szRzXtV5ORb0Hb/91yq+/D3oERoyAt6LA==} - engines: {node: '>=v14.16.0'} - hasBin: true - dependencies: - cac: 6.7.14 - debug: 4.3.4 - mlly: 1.2.0 - pathe: 1.1.0 - picocolors: 1.0.0 - source-map: 0.6.1 - source-map-support: 0.5.21 - vite: 4.2.2(@types/node@18.15.11) - transitivePeerDependencies: - - '@types/node' - - less - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - - /vite@4.2.2(@types/node@18.15.11): - resolution: {integrity: sha512-PcNtT5HeDxb3QaSqFYkEum8f5sCVe0R3WK20qxgIvNBZPXU/Obxs/+ubBMeE7nLWeCo2LDzv+8hRYSlcaSehig==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 18.15.11 - esbuild: 0.17.6 - postcss: 8.4.22 - resolve: 1.22.2 - rollup: 3.20.6 - optionalDependencies: - fsevents: 2.3.2 - dev: true - /vlq@0.2.3: resolution: {integrity: sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==} dev: true - /vm2@3.9.16: - resolution: {integrity: sha512-3T9LscojNTxdOyG+e8gFeyBXkMlOBYDoF6dqZbj+MPVHi9x10UfiTAJIobuchRCp3QvC+inybTbMJIUrLsig0w==} - engines: {node: '>=6.0'} - hasBin: true - dependencies: - acorn: 8.8.2 - acorn-walk: 8.2.0 - dev: false - - /vm2@3.9.17: - resolution: {integrity: sha512-AqwtCnZ/ERcX+AVj9vUsphY56YANXxRuqMb7GsDtAr0m0PcQX3u0Aj3KWiXM0YAHy7i6JEeHrwOnwXbGYgRpAw==} - engines: {node: '>=6.0'} - deprecated: The library contains critical security issues and should not be used for production! The maintenance of the project has been discontinued. Consider migrating your code to isolated-vm. - hasBin: true - dependencies: - acorn: 8.8.2 - acorn-walk: 8.2.0 - dev: true - /w3c-hr-time@1.0.2: resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} deprecated: Use your platform's native performance.now() and performance.timeOrigin. @@ -25851,7 +26292,7 @@ packages: escape-goat: 3.0.0 htmlparser2: 5.0.1 mime: 2.6.0 - node-fetch: 2.6.9 + node-fetch: 2.7.0 valid-data-url: 3.0.1 transitivePeerDependencies: - encoding @@ -25921,10 +26362,44 @@ packages: import-local: 3.1.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) + webpack: 5.78.0(webpack-cli@5.0.1) + webpack-merge: 5.8.0 + dev: true + + /webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.88.2): + resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} + engines: {node: '>=14.15.0'} + hasBin: true + peerDependencies: + '@webpack-cli/generators': '*' + webpack: 5.x.x + webpack-bundle-analyzer: '*' + webpack-dev-server: '*' + peerDependenciesMeta: + '@webpack-cli/generators': + optional: true + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true + dependencies: + '@discoveryjs/json-ext': 0.5.7 + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.88.2) + '@webpack-cli/generators': 3.0.7(mem-fs-editor@9.7.0)(mem-fs@2.3.0)(prettier@2.8.7)(webpack-cli@5.1.4)(webpack@5.88.2) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.88.2) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.88.2) + colorette: 2.0.19 + commander: 10.0.1 + cross-spawn: 7.0.3 + envinfo: 7.8.1 + fastest-levenshtein: 1.0.16 + import-local: 3.1.0 + interpret: 3.1.1 + rechoir: 0.8.0 + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) webpack-merge: 5.8.0 - /webpack-dev-middleware@5.3.3(webpack@5.78.0): + /webpack-dev-middleware@5.3.3(webpack@5.88.2): resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -25935,10 +26410,10 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.0.0 - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) dev: false - /webpack-dev-server@4.13.2(webpack@5.78.0): + /webpack-dev-server@4.13.2(webpack@5.88.2): resolution: {integrity: sha512-5i6TrGBRxG4vnfDpB6qSQGfnB6skGBXNL5/542w2uRGLimX6qeE5BQMLrzIC3JYV/xlGOv+s+hTleI9AZKUQNw==} engines: {node: '>= 12.13.0'} hasBin: true @@ -25979,8 +26454,8 @@ packages: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) - webpack-dev-middleware: 5.3.3(webpack@5.78.0) + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack-dev-middleware: 5.3.3(webpack@5.88.2) ws: 8.13.0 transitivePeerDependencies: - bufferutil @@ -25989,14 +26464,14 @@ packages: - utf-8-validate dev: false - /webpack-manifest-plugin@4.1.1(webpack@5.78.0): + /webpack-manifest-plugin@4.1.1(webpack@5.88.2): resolution: {integrity: sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==} engines: {node: '>=12.22.0'} peerDependencies: webpack: ^4.44.2 || ^5.47.0 dependencies: tapable: 2.2.1 - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) webpack-sources: 2.3.1 dev: false @@ -26026,7 +26501,7 @@ packages: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - /webpack@5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1): + /webpack@5.78.0(webpack-cli@5.0.1): resolution: {integrity: sha512-gT5DP72KInmE/3azEaQrISjTvLYlSM0j1Ezhht/KLVkrqtv10JoP/RXhwmX/frrutOPuSq3o5Vq0ehR/4Vmd1g==} engines: {node: '>=10.13.0'} hasBin: true @@ -26057,7 +26532,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.1.1 tapable: 2.2.1 - terser-webpack-plugin: 5.3.7(esbuild@0.16.3)(webpack@5.78.0) + terser-webpack-plugin: 5.3.7(@swc/core@1.3.88)(webpack@5.88.2) watchpack: 2.4.0 webpack-cli: 5.0.1(@webpack-cli/generators@3.0.1)(webpack@5.78.0) webpack-sources: 3.2.3 @@ -26065,9 +26540,10 @@ packages: - '@swc/core' - esbuild - uglify-js + dev: true - /webpack@5.79.0(esbuild@0.16.3): - resolution: {integrity: sha512-3mN4rR2Xq+INd6NnYuL9RC9GAmc1ROPKJoHhrZ4pAjdMFEkJJWrsPw8o2JjCIyQyTu7rTXYn4VG6OpyB3CobZg==} + /webpack@5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4): + resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -26078,14 +26554,14 @@ packages: dependencies: '@types/eslint-scope': 3.7.4 '@types/estree': 1.0.1 - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/wasm-edit': 1.11.1 - '@webassemblyjs/wasm-parser': 1.11.1 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/wasm-edit': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 acorn: 8.8.2 - acorn-import-assertions: 1.8.0(acorn@8.8.2) - browserslist: 4.21.5 + acorn-import-assertions: 1.9.0(acorn@8.8.2) + browserslist: 4.21.10 chrome-trace-event: 1.0.3 - enhanced-resolve: 5.13.0 + enhanced-resolve: 5.15.0 es-module-lexer: 1.2.1 eslint-scope: 5.1.1 events: 3.3.0 @@ -26095,10 +26571,11 @@ packages: loader-runner: 4.3.0 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 3.1.2 + schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.7(esbuild@0.16.3)(webpack@5.79.0) + terser-webpack-plugin: 5.3.7(@swc/core@1.3.88)(webpack@5.88.2) watchpack: 2.4.0 + webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.88.2) webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' @@ -26247,7 +26724,7 @@ packages: dependencies: '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0) '@babel/core': 7.21.4 - '@babel/preset-env': 7.21.4(@babel/core@7.21.4) + '@babel/preset-env': 7.22.15(@babel/core@7.21.4) '@babel/runtime': 7.21.0 '@rollup/plugin-babel': 5.3.1(@babel/core@7.21.4)(rollup@2.79.1) '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1) @@ -26367,7 +26844,7 @@ packages: resolution: {integrity: sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA==} dev: false - /workbox-webpack-plugin@6.5.4(webpack@5.78.0): + /workbox-webpack-plugin@6.5.4(webpack@5.88.2): resolution: {integrity: sha512-LmWm/zoaahe0EGmMTrSLUi+BjyR3cdGEfU3fS6PN1zKFYbqAKuQ+Oy/27e4VSXsyIwAw8+QDfk1XHNGtZu9nQg==} engines: {node: '>=10.0.0'} peerDependencies: @@ -26376,7 +26853,7 @@ packages: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 - webpack: 5.78.0(esbuild@0.16.3)(webpack-cli@5.0.1) + webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) webpack-sources: 1.4.3 workbox-build: 6.5.4 transitivePeerDependencies: @@ -26391,6 +26868,15 @@ packages: workbox-core: 6.5.4 dev: false + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -26429,6 +26915,7 @@ packages: optional: true utf-8-validate: optional: true + dev: false /ws@8.13.0: resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} @@ -26443,34 +26930,18 @@ packages: optional: true dev: false - /xdm@2.1.0: - resolution: {integrity: sha512-3LxxbxKcRogYY7cQSMy1tUuU1zKNK9YPqMT7/S0r7Cz2QpyF8O9yFySGD7caOZt+LWUOQioOIX+6ZzCoBCpcAA==} + /xdg-app-paths@5.1.0: + resolution: {integrity: sha512-RAQ3WkPf4KTU1A8RtFx3gWywzVKe00tfOPFfl2NDGqbIFENQO4kqAJp7mhQjNj/33W5x5hiWWUdyfPq/5SU3QA==} + engines: {node: '>=6'} dependencies: - '@rollup/pluginutils': 4.2.1 - '@types/estree-jsx': 0.0.1 - astring: 1.8.4 - estree-util-build-jsx: 2.2.2 - estree-util-is-identifier-name: 2.1.0 - estree-walker: 3.0.3 - got: 11.8.6 - hast-util-to-estree: 2.3.2 - loader-utils: 2.0.4 - markdown-extensions: 1.1.1 - mdast-util-mdx: 1.1.0 - micromark-extension-mdxjs: 1.0.0 - periscopic: 3.1.0 - remark-parse: 10.0.1 - remark-rehype: 9.1.0 - source-map: 0.7.4 - unified: 10.1.2 - unist-util-position-from-estree: 1.1.2 - unist-util-stringify-position: 3.0.3 - unist-util-visit: 4.1.2 - vfile: 5.3.7 - optionalDependencies: - deasync: 0.1.28 - transitivePeerDependencies: - - supports-color + xdg-portable: 7.3.0 + dev: true + + /xdg-portable@7.3.0: + resolution: {integrity: sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw==} + engines: {node: '>= 6.0'} + dependencies: + os-paths: 4.4.0 dev: true /xml-name-validator@3.0.0: @@ -26486,10 +26957,6 @@ packages: dev: false optional: true - /xregexp@2.0.0: - resolution: {integrity: sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==} - dev: true - /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} @@ -26512,19 +26979,14 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - /yaml@2.2.1: - resolution: {integrity: sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==} - engines: {node: '>= 14'} - dev: true - /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} + dev: false /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - dev: true /yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} @@ -26537,6 +26999,7 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.9 + dev: false /yargs@17.7.1: resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} @@ -26549,6 +27012,39 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + /yauzl-clone@1.0.4: + resolution: {integrity: sha512-igM2RRCf3k8TvZoxR2oguuw4z1xasOnA31joCqHIyLkeWrvAc2Jgay5ISQ2ZplinkoGaJ6orCz56Ey456c5ESA==} + engines: {node: '>=6'} + dependencies: + events-intercept: 2.0.0 + dev: true + + /yauzl-promise@2.1.3: + resolution: {integrity: sha512-A1pf6fzh6eYkK0L4Qp7g9jzJSDrM6nN0bOn5T0IbY4Yo3w+YkWlHFkJP7mzknMXjqusHFHlKsK2N+4OLsK2MRA==} + engines: {node: '>=6'} + dependencies: + yauzl: 2.10.0 + yauzl-clone: 1.0.4 + dev: true + + /yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 dev: true /yeoman-environment@3.15.1(mem-fs-editor@9.7.0)(mem-fs@2.3.0): @@ -26636,6 +27132,11 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true + /zip-stream@4.1.0: resolution: {integrity: sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==} engines: {node: '>= 10'} @@ -26683,7 +27184,3 @@ packages: node-addon-api: 2.0.2 prebuild-install: 5.3.6 dev: false - - /zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - dev: true diff --git a/services/rotor/dist_package.json b/services/rotor/dist_package.json index 799fda6cf..6aef978ee 100644 --- a/services/rotor/dist_package.json +++ b/services/rotor/dist_package.json @@ -2,6 +2,6 @@ "name": "rotor", "version": "0.0.0", "dependencies": { - "vm2": "^3.9.14" + "isolated-vm": "4.6.0" } } diff --git a/services/rotor/rollup.config.js b/services/rotor/rollup.config.js index bdae6cb18..210c385be 100644 --- a/services/rotor/rollup.config.js +++ b/services/rotor/rollup.config.js @@ -13,10 +13,9 @@ module.exports = [ commonjs(), rollupJson(), babel({ - babelpHelpers: "inline", + babelHelpers: "inline", babelrc: false, - extensions: ['.js', '.ts'] - + extensions: [".js", ".ts"], }), ], input: "./compiled/index.js", diff --git a/services/rotor/src/http/udf.ts b/services/rotor/src/http/udf.ts index 6d760cb1a..7107655f7 100644 --- a/services/rotor/src/http/udf.ts +++ b/services/rotor/src/http/udf.ts @@ -1,126 +1,14 @@ -import { EventContext, EventsStore, Store } from "@jitsu/protocols/functions"; -import { createFullContext, UDFWrapper } from "@jitsu/core-functions"; +import { createFullContext, UDFWrapper, logType, UDFTestRun, UDFTestRequest } from "@jitsu/core-functions"; import { getLog } from "juava"; -import { logType } from "@jitsu-internal/console/pages/api/[workspaceId]/function/run"; const log = getLog("udf_run"); -type bodyType = { - functionId: string; - functionName: string; - code: string; - event: any; - config: any; - store: any; - workspaceId: string; -}; - export const UDFRunHandler = async (req, res) => { - const body = req.body as bodyType; - log.atInfo().log(`Running function: ${body?.functionId} workspace: ${body?.workspaceId}`, body); - const logs: logType[] = []; - try { - const eventContext: EventContext = { - geo: { - country: { - code: "US", - isEU: false, - }, - city: { - name: "New York", - }, - region: { - code: "NY", - }, - location: { - latitude: 40.6808, - longitude: -73.9701, - }, - postalCode: { - code: "11238", - }, - }, - headers: {}, - source: { - id: "functionsDebugger-streamId", - }, - destination: { - id: "functionsDebugger-destinationId", - type: "clickhouse", - updatedAt: new Date(), - hash: "hash", - }, - connection: { - id: "functionsDebugger", - }, - }; - - const store: Store = { - get: async (key: string) => { - return body.store[key]; - }, - set: async (key: string, obj: any) => { - body.store[key] = obj; - }, - del: async (key: string) => { - delete body.store[key]; - }, - }; - const eventsStore: EventsStore = { - log(connectionId: string, error: boolean, msg: Record) { - switch (msg.type) { - case "log-info": - case "log-warn": - case "log-debug": - case "log-error": - logs.push({ - message: - msg.message?.text + - (Array.isArray(msg.message?.args) && msg.message.args.length > 0 - ? `, ${msg.message?.args.join(",")}` - : ""), - level: msg.type.replace("log-", ""), - timestamp: new Date(), - type: "log", - }); - break; - case "http-request": - let statusText; - if (msg.error) { - statusText = `${msg.error}`; - } else { - statusText = `${msg.statusText ?? ""}${msg.status ? `(${msg.status})` : ""}`; - } - logs.push({ - message: `${msg.method} ${msg.url} :: ${statusText}`, - level: msg.error ? "error" : "info", - timestamp: new Date(), - type: "http", - data: { - body: msg.body, - headers: msg.headers, - response: msg.response, - }, - }); - } - }, - }; - const ctx = createFullContext(body.functionId, eventsStore, store, eventContext, {}, body.config); - const wrapper = UDFWrapper(body.functionId, body.functionName, body.code); - const result = await wrapper.userFunction(body.event, ctx); - res.json({ - error: "", - result: result || body.event, - store: body.store, - logs, - }); - } catch (e) { - log.atError().withCause(e).log(`Error running function: ${body?.functionId} workspace: ${body?.workspaceId}`); - res.json({ - error: `${e}`, - result: {}, - store: body?.store ?? {}, - logs, - }); + const body = req.body as UDFTestRequest; + log.atInfo().log(`Running function: ${body?.functionId} workspace: ${body?.workspaceId}`, JSON.stringify(body)); + const result = await UDFTestRun(body); + if (result.error) { + log.atError().log(`Error running function: ${body?.functionId} workspace: ${body?.workspaceId}\n${result.error}`); } + res.json(result); }; diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index 778a1c7e8..da5bc5637 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -34,7 +34,9 @@ setServerJsonFormat(process.env.LOG_FORMAT === "json"); const log = getLog("rotor"); const http = express(); -http.use(express.json()); +http.use(express.json({ limit: "20mb" })); +http.use(express.urlencoded({ limit: "20mb" })); + //cache connections for 20sec const connectionsCache = new NodeCache({ stdTTL: 20, checkperiod: 60, useClones: false }); //cache functions for 20sec @@ -147,7 +149,20 @@ export async function rotorMessageHandler(_message: string | undefined) { return { id: f.functionId as string, config: f.functionOptions as any, - exec: cached.wrapper.userFunction, + exec: async (event, ctx) => { + try { + return await cached.wrapper.userFunction(event, ctx); + } catch (e: any) { + if (e?.message === "Isolate is disposed") { + log.atError().log(`UDF ${functionId} VM was disposed. Reloading`); + cached = { wrapper: UDFWrapper(functionId, userFunctionObj.name, code), hash: codeHash }; + udfCache.set(functionId, cached); + return await cached.wrapper.userFunction(event, ctx); + } else { + throw e; + } + } + }, context: {}, }; } else { diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index 871aae077..bc5bd5635 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -7,7 +7,7 @@ import { Store, SystemContext, } from "@jitsu/protocols/functions"; -import { createFullContext } from "@jitsu/core-functions"; +import { createFullContext, isDropResult } from "@jitsu/core-functions"; import { getErrorMessage, getLog, stopwatch } from "juava"; import { EnrichedConnectionConfig } from "@jitsu-internal/console/lib/server/fast-store"; @@ -80,7 +80,3 @@ export async function runChain( } return execLog; } - -function isDropResult(result: FuncReturn): boolean { - return result === "drop" || (Array.isArray(result) && result.length === 0) || result === null || result === false; -} diff --git a/services/rotor/tsconfig.json b/services/rotor/tsconfig.json index b520ae1a2..98118053d 100644 --- a/services/rotor/tsconfig.json +++ b/services/rotor/tsconfig.json @@ -16,7 +16,8 @@ "esModuleInterop": true, "jsx": "react-jsx", "moduleResolution": "node", - "resolveJsonModule": true + "resolveJsonModule": true, + "skipLibCheck": true, }, "exclude": [ "node_modules" diff --git a/services/rotor/webpack.config.js b/services/rotor/webpack.config.js index 2efd7183e..4a2dccaab 100644 --- a/services/rotor/webpack.config.js +++ b/services/rotor/webpack.config.js @@ -5,7 +5,7 @@ const config = { entry: "./src/index.ts", target: "node", externals: { - vm2: "require('vm2')", + "isolated-vm": "require('isolated-vm')", }, node: { __dirname: false, diff --git a/tsconfig.base.json b/tsconfig.base.json index 261232a14..31eeaa739 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -12,7 +12,8 @@ "moduleResolution": "node", "resolveJsonModule": true, "importHelpers": true, - "removeComments": true + "removeComments": true, + "skipLibCheck": true }, "exclude": ["node_modules", "dist", "test_projects", "test", "templates"] } diff --git a/types/protocols/functions.d.ts b/types/protocols/functions.d.ts index 28a2ca7ce..3ffa1e761 100644 --- a/types/protocols/functions.d.ts +++ b/types/protocols/functions.d.ts @@ -31,12 +31,9 @@ export type EventControlOpts = { export type AnyEvent = Record & EventControlOpts; export type AnyProps = Record; -export type FetchResponse = { - status: number; - statusText: string; - text: () => Promise; - json: () => Promise; -}; +export type FetchResponse = Response; + +export type FetchType = (url: string, opts?: FetchOpts, logToRedis?: boolean) => Promise; export type FetchOpts = { method?: string; @@ -50,7 +47,7 @@ export type FunctionContext = { debug: (message: string, ...args: any[]) => void; error: (message: string, ...args: any[]) => void; }; - fetch: (url: string, opts?: FetchOpts, logToRedis?: boolean) => Promise; + fetch: FetchType; store: Store; }; diff --git a/webapps/console/components/ApiKeyEditor/ApiKeyEditor.tsx b/webapps/console/components/ApiKeyEditor/ApiKeyEditor.tsx index cc33b97d1..3cdb2395a 100644 --- a/webapps/console/components/ApiKeyEditor/ApiKeyEditor.tsx +++ b/webapps/console/components/ApiKeyEditor/ApiKeyEditor.tsx @@ -1,6 +1,6 @@ import { ApiKey } from "../../lib/schema"; import { useState } from "react"; -import { Button, Tooltip } from "antd"; +import { Button, Table, Tooltip } from "antd"; import { branding } from "../../lib/branding"; import { confirmOp, copyTextToClipboard } from "../../lib/ui"; import { FaCopy, FaPlus, FaTrash } from "react-icons/fa"; @@ -31,54 +31,71 @@ function hint(key: string) { export const ApiKeysEditor: React.FC> = props => { const [keys, setKeys] = useState(props.value || []); - return ( -
    - {keys.length === 0 &&
    API keys list us empty
    } - {keys.find(key => !!key.plaintext) && ( -
    - Congrats! You're generated a new key(s). Copy it an keep in the safe place. You will not be able to see it - again once you leave the page -
    - )} - {keys.map(key => ( -
    -
    - {key.plaintext ? ( -
    - - {" "} - Key generated! Copy this key and store it in a safe place. You will not be able - to see it again. - - } - > - - {key.id}:{key.plaintext} - - - -
    - ) : ( - <> - - {branding.productName} doesn't store full version of a ket. If you haven't recorded the key, - generate a new one - - } - > - - {key.id}:{key?.hint?.replace("*", "*".repeat(32 - 6))} - - - - )} + const columns = [ + { + title: "Key", + key: "id", + width: "90%", + render: (key: ApiKey) => { + return key.plaintext ? ( +
    + + {" "} + Key generated! Copy this key and store it in a safe place. You will not be able to + see it again. + + } + > + + {key.id}:{key.plaintext} + + +
    + ) : ( + <> + + {branding.productName} doesn't store full version of a ket. If you haven't recorded the key, generate + a new one + + } + > + + {key.id}:{key?.hint?.replace("*", "*".repeat(32 - 6))} + + + + ); + }, + }, + { + title:
    Created
    , + className: "text-right text-xs text-text whitespace-nowrap", + dataIndex: "createdAt", + render: createdAt => { + return
    {createdAt ? new Date(createdAt).toLocaleString() : ""}
    ; + }, + }, + { + title:
    Last Used
    , + className: "text-right text-xs text-text whitespace-nowrap", + dataIndex: "lastUsed", + render: lastUsed => { + return lastUsed ? new Date(lastUsed).toLocaleString() : "Never"; + }, + }, + { + title: "", + className: "text-right", + key: "actions", + render: (key: ApiKey) => { + return (
    -
    - ))} -
    + ); + }, + }, + ]; + return ( +
    + {keys.length === 0 &&
    API keys list us empty
    } +
    k.id} /> +
    + {keys.find(key => !!key.plaintext) ? ( +
    + Congrats! You're generated a new key(s). Copy it an keep in the safe place. +
    + You will not be able to see it again once you leave the page +
    + ) : ( +
    + )}
    @@ -68,6 +74,7 @@ export const EditableTitle: React.FC<{ children: string; onUpdate: (str: string) onClick={() => { setEditing(false); setValue(rollbackValue); + onUpdate(rollbackValue); }} > @@ -115,6 +122,7 @@ export const FunctionsDebugger: React.FC = props => { const [config, setConfig] = useState("{}"); const [store, setStore] = useState({}); const [result, setResult] = useState({}); + const [resultType, setResultType] = useState<"ok" | "drop" | "error">("ok"); const [logs, setLogs] = useState([]); const [unreadErrorLogs, setUnreadErrorLogs] = useState(0); const [unreadLogs, setUnreadLogs] = useState(0); @@ -164,6 +172,7 @@ export const FunctionsDebugger: React.FC = props => { }); if (res.error) { setResult(res.error); + setResultType("error"); setLogs([ ...res.logs, { @@ -175,7 +184,20 @@ export const FunctionsDebugger: React.FC = props => { ]); } else { setResult(res.result); - setLogs(res.logs); + setResultType(res.dropped ? "drop" : "ok"); + if (res.dropped) { + setLogs([ + ...res.logs, + { + level: "info", + type: "log", + message: `Further processing will be SKIPPED. Function returned: ${JSON.stringify(result)}`, + timestamp: new Date(), + }, + ]); + } else { + setLogs(res.logs); + } } if (!showLogs) { @@ -194,6 +216,7 @@ export const FunctionsDebugger: React.FC = props => { }, ]); setResult(errorText); + setResultType("error"); } finally { setRunning(false); } @@ -203,7 +226,7 @@ export const FunctionsDebugger: React.FC = props => {
    -
    +
    { @@ -215,7 +238,7 @@ export const FunctionsDebugger: React.FC = props => {
    -

    Code:

    +

    {obj.origin === "jitsu-cli" ? "Info:" : "Code:"}

    -
    - setObj({ ...obj, code: value })} - monacoOptions={{ renderLineHighlight: "none" }} - /> -
    + {obj.origin === "jitsu-cli" ? ( + + {obj.slug} + This function was created with Jitsu CLI + + {obj.version} + + {obj.description} + + ) : ( +
    + setObj({ ...obj, code: value })} + monacoOptions={{ renderLineHighlight: "none" }} + /> +
    + )}
    Config
    = props => {
    -
    +
    @@ -297,7 +337,7 @@ export const FunctionsDebugger: React.FC = props => {
    -
    +

    Result:

    @@ -318,20 +358,33 @@ export const FunctionsDebugger: React.FC = props => {
    -
    - {}} - monacoOptions={{ - renderLineHighlight: "none", - lineDecorationsWidth: 8, - lineNumbers: "off", - readOnly: true, - folding: false, - }} - /> +
    + {resultType === "error" && ( +
    + {convert.toHtml(result.replaceAll(" ", " "))} +
    + )} + {resultType === "drop" && ( +
    + Further processing will be SKIPPED. Function returned:{" "} + {JSON.stringify(result)}. +
    + )} + {resultType === "ok" && ( + {}} + monacoOptions={{ + renderLineHighlight: "none", + lineDecorationsWidth: 8, + lineNumbers: "off", + readOnly: true, + folding: false, + }} + /> + )}
    @@ -344,7 +397,7 @@ export const FunctionsDebugger: React.FC = props => {
    {logs.map((log, index) => { const colors = (() => { diff --git a/webapps/console/components/GlobalError/GlobalError.tsx b/webapps/console/components/GlobalError/GlobalError.tsx index beb9cff89..8b6a6f0bc 100644 --- a/webapps/console/components/GlobalError/GlobalError.tsx +++ b/webapps/console/components/GlobalError/GlobalError.tsx @@ -49,26 +49,26 @@ export function ErrorDetails(props: { error: any }) { {message && ( Error
    }> - {message} + {message} )} {props.error.response && ( Response
    }> - + {JSON.stringify(props.error.response, null, 2)} )} {props.error.request && ( Request
    }> - + {JSON.stringify(props.error.request, null, 2)} )} {stack && ( Stack
    }> - {stack} + {stack} )} diff --git a/webapps/console/lib/api.ts b/webapps/console/lib/api.ts index eba577638..d31b368b2 100644 --- a/webapps/console/lib/api.ts +++ b/webapps/console/lib/api.ts @@ -101,6 +101,7 @@ export async function getUser( await db.prisma().userProfile.findUnique({ where: { id: token.userId } }), `Can't find user ${token.userId} for API key ${keyId}` ); + db.prisma().userApiToken.update({ where: { id: keyId }, data: { lastUsed: new Date() } }); return { internalId: user.id, externalUsername: user.externalUsername, diff --git a/webapps/console/lib/schema/index.ts b/webapps/console/lib/schema/index.ts index d83095ace..fb378aa54 100644 --- a/webapps/console/lib/schema/index.ts +++ b/webapps/console/lib/schema/index.ts @@ -101,6 +101,8 @@ export const ApiKey = z.object({ plaintext: z.string().nullish(), hash: z.string().nullish(), hint: z.string().nullish(), + createdAt: z.coerce.date().nullish(), + lastUsed: z.coerce.date().nullish(), id: z.string(), }); export type ApiKey = z.infer; @@ -132,6 +134,10 @@ export const FunctionConfig = ConfigEntityBase.merge( z.object({ name: z.string(), code: z.string(), + description: z.string().optional(), + version: z.string().optional(), + origin: z.string().optional(), + slug: z.string().optional(), }) ); export type FunctionConfig = z.infer; diff --git a/webapps/console/lib/server/http-agent.ts b/webapps/console/lib/server/http-agent.ts index c67ef7c4b..0b79a2158 100644 --- a/webapps/console/lib/server/http-agent.ts +++ b/webapps/console/lib/server/http-agent.ts @@ -1,8 +1,8 @@ import { getSingleton } from "juava"; import Agent, { HttpsAgent } from "agentkeepalive"; -export const httpAgent = getSingleton("http-agent", createHTTPAgent); -export const httpsAgent = getSingleton("https-agent", createHTTPSAgent); +export const httpAgent = getSingleton("http-agent", createHTTPAgent, { silent: true }); +export const httpsAgent = getSingleton("https-agent", createHTTPSAgent, { silent: true }); async function createHTTPAgent(): Promise { const agent = new Agent({ timeout: 300000, freeSocketTimeout: 30000, maxSockets: 1024 }); diff --git a/webapps/console/next.config.js b/webapps/console/next.config.js index 7553cbaab..4a3c147fa 100644 --- a/webapps/console/next.config.js +++ b/webapps/console/next.config.js @@ -73,7 +73,7 @@ module.exports = { config.plugins.push(new opts.webpack.IgnorePlugin({ resourceRegExp: /^mongodb$/ })); config.plugins.push(new opts.webpack.IgnorePlugin({ resourceRegExp: /^posthog-node$/ })); } - config.externals.vm2 = "require('vm2')"; + config.externals["isolated-vm"] = "require('isolated-vm')"; config.module.rules.push({ test: /\.txt$/, use: "raw-loader", diff --git a/webapps/console/package.json b/webapps/console/package.json index 18b71a3de..261012fdd 100644 --- a/webapps/console/package.json +++ b/webapps/console/package.json @@ -40,7 +40,7 @@ "@rjsf/validator-ajv6": "5.10.0", "ajv": "~8.12.0", "@sensejs/kafkajs-zstd-support": "^0.9.2", - "@sentry/nextjs": "^7.57.0", + "@sentry/nextjs": "^7.70.0", "@tanstack/react-query": "^4.2.1", "@types/cookie": "^0.5.1", "@types/pg-promise": "^5.4.3", @@ -49,14 +49,14 @@ "cookie": "^0.5.0", "cuid": "^2.1.8", "dayjs": "^1.11.10", - "firebase": "^9.17.1", - "firebase-admin": "^11.5.0", - "googleapis": "^100.0.0", + "firebase": "^10.4.0", + "firebase-admin": "^11.10.1", + "googleapis": "^126.0.1", "highlight.js": "^11.6.0", "ioredis": "^5.2.3", "js-yaml": "^4.1.0", "json5": "^2.2.3", - "jsonwebtoken": "^8.5.1", + "jsonwebtoken": "^9.0.2", "juava": "workspace:*", "kafkajs": "^2.2.4", "kafkajs-snappy": "^1.1.0", @@ -90,7 +90,7 @@ "devDependencies": { "@ant-design/icons": "^5.0.1", "@tailwindcss/typography": "^0.5.7", - "@testing-library/jest-dom": "^5.16.4", + "@testing-library/jest-dom": "^6.1.3", "@testing-library/react": "^13.1.1", "@types/cli-progress": "^3.11.0", "@types/firebase": "^3.2.1", @@ -113,12 +113,13 @@ "less-loader": "^10.2.0", "minimist": "^1.2.7", "next-transpile-modules": "^10.0.0", - "postcss": "^8.4.12", + "postcss": "^8.4.30", "raw-loader": "^4.0.2", "tailwindcss": "^3.0.24", "ts-node": "~10.8.1", "type-fest": "^3.5.7", "typescript": "^4.8.4", - "zod-prisma": "0.5.4" + "zod-prisma": "0.5.4", + "ansi-to-html": "^0.7.2" } } diff --git a/webapps/console/pages/_app.tsx b/webapps/console/pages/_app.tsx index bb387c72f..5a622f367 100644 --- a/webapps/console/pages/_app.tsx +++ b/webapps/console/pages/_app.tsx @@ -280,7 +280,7 @@ function NextJsSigninForm() { size="large" onClick={() => signInAndRedirect("github")} > - {signup ? "Sign up" : "Sign in"} in with Github + {signup ? "Sign up" : "Sign in"} with Github
    {!signup && !appConfig.disableSignup && ( diff --git a/webapps/console/pages/api/[workspaceId]/config/[type]/[id].ts b/webapps/console/pages/api/[workspaceId]/config/[type]/[id].ts index bc03d0f1e..5d8881e5f 100644 --- a/webapps/console/pages/api/[workspaceId]/config/[type]/[id].ts +++ b/webapps/console/pages/api/[workspaceId]/config/[type]/[id].ts @@ -13,6 +13,14 @@ function defaultMerge(a, b) { const log = getServerLog("config-api"); +export const config = { + api: { + bodyParser: { + sizeLimit: "20mb", // Set desired value here + }, + }, +}; + export const api: Api = { url: inferUrl(__filename), GET: { diff --git a/webapps/console/pages/api/[workspaceId]/config/[type]/index.ts b/webapps/console/pages/api/[workspaceId]/config/[type]/index.ts index 1db413625..fffac816b 100644 --- a/webapps/console/pages/api/[workspaceId]/config/[type]/index.ts +++ b/webapps/console/pages/api/[workspaceId]/config/[type]/index.ts @@ -5,6 +5,14 @@ import { assertDefined } from "juava"; import { fastStore } from "../../../../../lib/server/fast-store"; import { getConfigObjectType, parseObject } from "../../../../../lib/schema/config-objects"; +export const config = { + api: { + bodyParser: { + sizeLimit: "20mb", // Set desired value here + }, + }, +}; + export const api: Api = { url: inferUrl(__filename), GET: { diff --git a/webapps/console/pages/api/[workspaceId]/config/[type]/test.ts b/webapps/console/pages/api/[workspaceId]/config/[type]/test.ts index 3f0d1d02b..c8200762f 100644 --- a/webapps/console/pages/api/[workspaceId]/config/[type]/test.ts +++ b/webapps/console/pages/api/[workspaceId]/config/[type]/test.ts @@ -9,6 +9,14 @@ import nodeFetch from "node-fetch-commonjs"; const log = getServerLog("test-connection"); +export const config = { + api: { + bodyParser: { + sizeLimit: "20mb", // Set desired value here + }, + }, +}; + export const api: Api = { url: inferUrl(__filename), POST: { diff --git a/webapps/console/pages/api/[workspaceId]/function/run.ts b/webapps/console/pages/api/[workspaceId]/function/run.ts index 0371d78d6..0cf0b106a 100644 --- a/webapps/console/pages/api/[workspaceId]/function/run.ts +++ b/webapps/console/pages/api/[workspaceId]/function/run.ts @@ -5,17 +5,18 @@ import { requireDefined, rpc } from "juava"; const log = getServerLog("function-run"); -export type logType = { - message: string; - level: string; - timestamp: Date; - type: string; - data?: any; +export const config = { + api: { + bodyParser: { + sizeLimit: "20mb", // Set desired value here + }, + }, }; const resultType = z.object({ error: z.string().optional(), - result: z.any(), + dropped: z.boolean().optional(), + result: z.any().nullish(), store: z.record(z.any()), logs: z.array(z.any()), }); diff --git a/webapps/console/pages/api/user/cli-key.ts b/webapps/console/pages/api/user/cli-key.ts new file mode 100644 index 000000000..3b8728cd6 --- /dev/null +++ b/webapps/console/pages/api/user/cli-key.ts @@ -0,0 +1,30 @@ +import { Api, inferUrl, nextJsApiHandler } from "../../../lib/api"; +import { ApiKey } from "../../../lib/schema"; +import { db } from "../../../lib/server/db"; +import { hint, randomId } from "juava"; +import { createHash } from "juava"; + +const api: Api = { + url: inferUrl(__filename), + GET: { + auth: true, + types: { + result: ApiKey, + }, + handle: async ({ user, req, res }) => { + const newKey = randomId(32); + const key = { id: `jitsu-cli-${randomId(22)}`, plaintext: newKey }; + const toCreate = { + id: key.id, + userId: user.internalId, + hint: hint(newKey), + hash: createHash(newKey), + }; + await db.prisma().userApiToken.create({ data: toCreate }); + + return key; + }, + }, +}; + +export default nextJsApiHandler(api); diff --git a/webapps/console/pages/api/user/keys.ts b/webapps/console/pages/api/user/keys.ts index 3672f7211..b3997220c 100644 --- a/webapps/console/pages/api/user/keys.ts +++ b/webapps/console/pages/api/user/keys.ts @@ -15,7 +15,7 @@ const api: Api = { handle: async ({ user }) => { return await db.prisma().userApiToken.findMany({ where: { userId: user.internalId }, - select: { id: true, hint: true }, + select: { id: true, hint: true, createdAt: true, lastUsed: true }, }); }, }, diff --git a/webapps/console/pages/cli.tsx b/webapps/console/pages/cli.tsx new file mode 100644 index 000000000..c3af06695 --- /dev/null +++ b/webapps/console/pages/cli.tsx @@ -0,0 +1,40 @@ +import React from "react"; +import { useRouter } from "next/router"; +import { CodeBlock } from "../components/CodeBlock/CodeBlock"; + +const CLI = () => { + const router = useRouter(); + return ( +
    +
    +
    +

    Jitsu CLI authorization

    +
    + {router.query.code ? ( + <> +
    Code:
    + + {router.query.code} + +
    + Paste this code to the terminal and press Enter to authorize Jitsu CLI +
    + + ) : router.query.err ? ( + <> +
    Error:
    +
    {router.query.err}
    + + ) : ( +
    + Success! You can close this window and return to the terminal. +
    + )} +
    +
    +
    +
    + ); +}; + +export default CLI; diff --git a/webapps/console/pages/index.tsx b/webapps/console/pages/index.tsx index 9cafd2a67..01b7c5671 100644 --- a/webapps/console/pages/index.tsx +++ b/webapps/console/pages/index.tsx @@ -4,10 +4,10 @@ import { EmbeddedErrorMessage, GlobalError } from "../components/GlobalError/Glo import React from "react"; import { useApi } from "../lib/useApi"; import { ContextApiResponse } from "../lib/schema"; -import { Button } from "antd"; +import { Button, Modal } from "antd"; import { signOut } from "next-auth/react"; import { firebaseSignOut } from "../lib/firebase-client"; -import { getLog } from "juava"; +import { encrypt, getLog, randomId, rpc } from "juava"; const log = getLog("index"); @@ -65,7 +65,53 @@ function WorkspaceRedirect() { } return ; } else if (data) { - if (data.firstWorkspaceSlug || data.firstWorkspaceId) { + const origin = router.query.origin as string; + const redirect = (router.query.redirect as string) ?? ""; + const redir = (query: string) => { + if (redirect.match(/http:\/\/localhost:\d{4,5}\//)) { + window.location.href = `${router.query.redirect}?${query}`; + } else { + router.push(`/cli?${query}`); + } + }; + if (origin === "jitsu-cli") { + return ( + + {""} + Jitsu CLI authorization +
    + } + width={500} + okText={"Authorize"} + onOk={() => { + //local request from jitsu-cli + rpc("/api/user/cli-key") + .then(key => { + if (key) { + const iv = randomId(16 - origin.length); + const enc = encrypt(router.query.c as string, `${origin}${iv}`, JSON.stringify(key)); + redir(`code=${iv}${enc}`); + } else { + redir(`err=${encodeURIComponent("Failed to get CLI key")}`); + } + }) + .catch(err => { + redir(`err=${encodeURIComponent(err.message)}`); + }); + }} + onCancel={() => { + redir(`err=${encodeURIComponent("Authorization was cancelled.")}`); + }} + > + Do you want to authorize Jitsu CLI to use your account? + + ); + } else if (data.firstWorkspaceSlug || data.firstWorkspaceId) { router.push(`/${data.firstWorkspaceSlug || data.firstWorkspaceId}${data.newUser ? "?welcome=true" : ""}`); } else { //TODO: seems like we don't need this anymore and there is no such page diff --git a/webapps/console/prisma/schema.prisma b/webapps/console/prisma/schema.prisma index 24bf14faa..8c8b48cd0 100644 --- a/webapps/console/prisma/schema.prisma +++ b/webapps/console/prisma/schema.prisma @@ -92,6 +92,7 @@ model UserApiToken { id String @id @default(cuid()) createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) + lastUsed DateTime? /// @zod.custom(z.coerce.date()) hint String hash String userId String diff --git a/webapps/console/vercel.sh b/webapps/console/vercel.sh index 645db3653..41850020f 100644 --- a/webapps/console/vercel.sh +++ b/webapps/console/vercel.sh @@ -3,9 +3,15 @@ # This script defines if vercel should deploy the commit, # see https://vercel.com/support/articles/how-do-i-use-the-ignored-build-step-field-on-vercel -if [[ "$VERCEL_GIT_COMMIT_REF" != *"newjitsu"* ]]; then - echo "❌ Not a newjitsu branch, skipping deploy" - exit 0 +if [[ "$VERCEL_GIT_COMMIT_REF" == "functions-cli" ]]; then + npx turbo-ignore +else + if [[ "$VERCEL_GIT_COMMIT_REF" != *"newjitsu"* ]]; then + echo "❌ Not a newjitsu branch, skipping deploy" + exit 0 + fi + + npx turbo-ignore fi -npx turbo-ignore + diff --git a/webapps/ee-api/package.json b/webapps/ee-api/package.json index 33a0c2a4c..3a0014c87 100644 --- a/webapps/ee-api/package.json +++ b/webapps/ee-api/package.json @@ -10,16 +10,16 @@ "dependencies": { "is-valid-domain": "^0.1.6", "@clickhouse/client": "^0.0.11", - "@aws-sdk/client-s3": "~3.341.0", + "@aws-sdk/client-s3": "^3.418.0", "@types/node": "18.11.12", "@types/react": "18.0.28", "@types/react-dom": "18.0.11", "crypto-js": "^4.1.1", "eslint": "8.29.0", "eslint-config-next": "13.0.0", - "firebase-admin": "^11.5.0", + "firebase-admin": "^11.10.1", "json5": "^2.2.3", - "jsonwebtoken": "^8.5.1", + "jsonwebtoken": "^9.0.2", "juava": "workspace:*", "lodash": "^4.17.21", "next": "13.0.0", @@ -33,7 +33,7 @@ "devDependencies": { "typescript": "4.9.4", "@types/crypto-js": "^4.1.1", - "@types/jsonwebtoken": "^8.5.9", + "@types/jsonwebtoken": "^9.0.3", "@types/lodash": "^4.14.185", "@types/pg": "^8.6.5", "@types/stripe": "^8.0.417", From 9dcf4328594a16cfeabb45ffe89f72a9de6d15ce Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 26 Sep 2023 12:53:24 +0400 Subject: [PATCH 0199/1353] fix for api keys last used update --- webapps/console/lib/api.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/lib/api.ts b/webapps/console/lib/api.ts index d31b368b2..8ee1ab07d 100644 --- a/webapps/console/lib/api.ts +++ b/webapps/console/lib/api.ts @@ -101,7 +101,7 @@ export async function getUser( await db.prisma().userProfile.findUnique({ where: { id: token.userId } }), `Can't find user ${token.userId} for API key ${keyId}` ); - db.prisma().userApiToken.update({ where: { id: keyId }, data: { lastUsed: new Date() } }); + await db.prisma().userApiToken.update({ where: { id: keyId }, data: { lastUsed: new Date() } }); return { internalId: user.id, externalUsername: user.externalUsername, From 64cf9cbea0c2754e59000e0125570d047ae96f36 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 26 Sep 2023 13:54:52 +0400 Subject: [PATCH 0200/1353] oauth: adjust for changed nango response format --- webapps/console/lib/server/oauth/services.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/webapps/console/lib/server/oauth/services.ts b/webapps/console/lib/server/oauth/services.ts index 24e926bb3..d9c3f4ac3 100644 --- a/webapps/console/lib/server/oauth/services.ts +++ b/webapps/console/lib/server/oauth/services.ts @@ -79,8 +79,8 @@ const github: OauthDecorator = { const mCred = { ...opts.credentials }; if (mCred.option_title === "OAuth Credentials") { mCred.access_token = manage(mCred.access_token, connectionObj.access_token); - mCred.client_id = manage(mCred.client_id, integrationObj.clientId); - mCred.client_secret = manage(mCred.client_secret, integrationObj.clientSecret); + mCred.client_id = manage(mCred.client_id, integrationObj.client_id); + mCred.client_secret = manage(mCred.client_secret, integrationObj.client_secret); } return { ...opts, @@ -154,8 +154,8 @@ const _googleBase: Omit = { if (mCred.auth_type === "Client") { mCred.access_token = manage(mCred.access_token, connectionObj.access_token); mCred.refresh_token = manage(mCred.refresh_token, connectionObj.refresh_token); - mCred.client_id = manage(mCred.client_id, integrationObj.clientId); - mCred.client_secret = manage(mCred.client_secret, integrationObj.clientSecret); + mCred.client_id = manage(mCred.client_id, integrationObj.client_id); + mCred.client_secret = manage(mCred.client_secret, integrationObj.client_secret); } return { ...opts, @@ -198,8 +198,8 @@ const googleAds: OauthDecorator = { mCred.developer_token = manage(mCred.developer_token, process.env.GOOGLE_ADS_DEVELOPER_TOKEN ?? ""); mCred.access_token = manage(mCred.access_token, connectionObj.access_token); mCred.refresh_token = manage(mCred.refresh_token, connectionObj.refresh_token); - mCred.client_id = manage(mCred.client_id, integrationObj.clientId); - mCred.client_secret = manage(mCred.client_secret, integrationObj.clientSecret); + mCred.client_id = manage(mCred.client_id, integrationObj.client_id); + mCred.client_secret = manage(mCred.client_secret, integrationObj.client_secret); return { ...opts, credentials: { @@ -234,8 +234,8 @@ const facebookMarketing: OauthDecorator = { merge: (opts, integrationObj, connectionObj) => { const mCred = { ...opts }; mCred.access_token = manage(mCred.access_token, connectionObj.access_token); - mCred.client_id = manage(mCred.client_id, integrationObj.clientId); - mCred.client_secret = manage(mCred.client_secret, integrationObj.clientSecret); + mCred.client_id = manage(mCred.client_id, integrationObj.client_id); + mCred.client_secret = manage(mCred.client_secret, integrationObj.client_secret); return mCred; }, }; From 306228125cdfd80b765184c8514f5baad91f61bc Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 26 Sep 2023 14:31:13 +0400 Subject: [PATCH 0201/1353] update vercel API version --- webapps/ee-api/pages/api/domain.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/ee-api/pages/api/domain.ts b/webapps/ee-api/pages/api/domain.ts index a55f1c1fc..92b1ace20 100644 --- a/webapps/ee-api/pages/api/domain.ts +++ b/webapps/ee-api/pages/api/domain.ts @@ -64,7 +64,7 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse } let domainInfo = await getExistingDomain(domain); if (!domainInfo) { - domainInfo = await rpc(`/v9/projects/${vercelProjectId}/domains?teamId=${vercelTeamId}`, { name: domain }); + domainInfo = await rpc(`/v10/projects/${vercelProjectId}/domains?teamId=${vercelTeamId}`, { name: domain }); } if (!domainInfo) { throw new Error(`Can't get domainInfo for ${domain}`); From e11a29ba93cc6c12b20858ba353e6c2d049c2db5 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 26 Sep 2023 19:28:28 +0400 Subject: [PATCH 0202/1353] fix for disappearing sync status popup --- webapps/console/pages/[workspaceId]/syncs/tasks.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx index 9ffd7d0f0..54a86a190 100644 --- a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx @@ -22,6 +22,7 @@ import { formatDateOnly, formatTime, SyncTitle } from "./index"; import { ButtonGroup, ButtonProps } from "../../../components/ButtonGroup/ButtonGroup"; import { rpc } from "juava"; import { feedbackError } from "../../../lib/ui"; +import hash from "object-hash"; dayjs.extend(utc); dayjs.extend(relativeTime); @@ -66,7 +67,7 @@ type TasksTableProps = { refreshCb?: () => void; }; -export function TaskStatus({ task }: { task: TasksDbModel & TaskStats }) { +function TaskStatus0({ task }: { task: TasksDbModel & TaskStats }) { const router = useRouter(); const workspace = useWorkspace(); @@ -202,6 +203,8 @@ export function TaskStatus({ task }: { task: TasksDbModel & TaskStats }) { } } +export const TaskStatus = React.memo(TaskStatus0, (p, n) => hash(p) === hash(n)); + function TaskStatusResultTable({ stats }: { stats: any[] }) { const columns: ColumnType[] = [ { @@ -732,4 +735,3 @@ const TasksPage = () => { ); }; -export default TasksPage; From 6e5fb46a433f99c42d1949a6c46557bf42a5313d Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 26 Sep 2023 20:41:02 +0400 Subject: [PATCH 0203/1353] fix for disappearing sync status popup --- webapps/console/pages/[workspaceId]/syncs/tasks.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx index 54a86a190..bb89ff808 100644 --- a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx @@ -735,3 +735,5 @@ const TasksPage = () => { ); }; + +export default TasksPage; From 7afdbea1c29084c8434049d3183db9ca034bdfea Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 27 Sep 2023 18:08:55 +0400 Subject: [PATCH 0204/1353] better protect from triggering 2 tasks from 1 sync --- .../pages/[workspaceId]/syncs/index.tsx | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/webapps/console/pages/[workspaceId]/syncs/index.tsx b/webapps/console/pages/[workspaceId]/syncs/index.tsx index 08ec246d3..223981127 100644 --- a/webapps/console/pages/[workspaceId]/syncs/index.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/index.tsx @@ -102,7 +102,8 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt ...jsonSerializationBase64, }); const [tasks, setTasks] = useState<{ loading: boolean; data?: any; error?: any }>({ loading: true }); - const [running, setRunning] = useState(undefined); + + const [runPressed, setRunPressed] = useState(undefined); const [apiDocs, setShowAPIDocs] = useQueryStringState("schedule"); //useEffect update tasksData every 5 seconds @@ -219,16 +220,19 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt const t = tasks?.data?.tasks?.[link.id]; const items: ButtonProps[] = [ { - disabled: t?.status === "RUNNING" || !!running, - title: t?.status === "RUNNING" ? "Sync is already running" : undefined, + disabled: t?.status === "RUNNING" || !!runPressed, + title: t?.status === "RUNNING" ? "Sync is already runPressed" : undefined, icon: - running == link.id ? ( + runPressed == link.id ? ( ) : ( ), onClick: async () => { - setRunning(link.id); + if (!!runPressed) { + return; + } + setRunPressed(link.id); try { const runStatus = await rpc(`/api/${workspace.id}/sources/run?syncId=${link.id}`); if (runStatus?.error) { @@ -246,7 +250,7 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt } catch (e) { feedbackError("Failed to run sync", { error: e, placement: "top" }); } finally { - setRunning(undefined); + setRunPressed(undefined); } }, label: "Run", @@ -262,16 +266,19 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt href: `/syncs/edit?id=${link.id}`, }, { - disabled: t?.status === "RUNNING" || !!running, - title: t?.status === "RUNNING" ? "Sync is already running" : undefined, + disabled: t?.status === "RUNNING" || !!runPressed, + title: t?.status === "RUNNING" ? "Sync is already runPressed" : undefined, icon: - running == link.id ? ( + runPressed == link.id ? ( ) : ( ), onClick: async () => { - setRunning(link.id); + if (!!runPressed) { + return; + } + setRunPressed(link.id); try { const runStatus = await rpc(`/api/${workspace.id}/sources/run?syncId=${link.id}&fullSync=true`); if (runStatus?.error) { @@ -289,7 +296,7 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt } catch (e) { feedbackError("Failed to run sync", { error: e, placement: "top" }); } finally { - setRunning(undefined); + setRunPressed(undefined); } }, label: "Full Sync", From 802a0ea6e34d7552bdbafc8a546c87be578f1e85 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 28 Sep 2023 13:50:33 +0400 Subject: [PATCH 0205/1353] better protect from triggering 2 tasks from 1 sync --- .../pages/[workspaceId]/syncs/index.tsx | 36 ++++++++++++++----- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/webapps/console/pages/[workspaceId]/syncs/index.tsx b/webapps/console/pages/[workspaceId]/syncs/index.tsx index 223981127..0438a93ac 100644 --- a/webapps/console/pages/[workspaceId]/syncs/index.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/index.tsx @@ -106,7 +106,7 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt const [runPressed, setRunPressed] = useState(undefined); const [apiDocs, setShowAPIDocs] = useQueryStringState("schedule"); - //useEffect update tasksData every 5 seconds + //useEffect update tasksData every 10 seconds useEffect(() => { const fetchTasks = async () => { try { @@ -217,6 +217,15 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt { title:
    Actions
    , render: (text, link) => { + const toTasks = async () => + router.push( + `/${workspace.slug || workspace.id}/syncs/tasks?query=${encodeURIComponent( + JSON5.stringify({ + syncId: link.id, + notification: "Sync Started", + }) + )}` + ); const t = tasks?.data?.tasks?.[link.id]; const items: ButtonProps[] = [ { @@ -233,6 +242,14 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt return; } setRunPressed(link.id); + try { + const data = await rpc(`/api/${workspace.id}/sources/tasks`, { body: links.map(l => l.id) }); + setTasks({ loading: false, data }); + if (data.tasks?.[link.id]?.status === "RUNNING") { + toTasks(); + return; + } + } catch (e) {} try { const runStatus = await rpc(`/api/${workspace.id}/sources/run?syncId=${link.id}`); if (runStatus?.error) { @@ -279,19 +296,20 @@ function SyncsTable({ links, services, destinations, reloadCallback }: RemoteEnt return; } setRunPressed(link.id); + try { + const data = await rpc(`/api/${workspace.id}/sources/tasks`, { body: links.map(l => l.id) }); + setTasks({ loading: false, data }); + if (data.tasks?.[link.id]?.status === "RUNNING") { + toTasks(); + return; + } + } catch (e) {} try { const runStatus = await rpc(`/api/${workspace.id}/sources/run?syncId=${link.id}&fullSync=true`); if (runStatus?.error) { displayTaskRunError(workspace, runStatus); } else { - router.push( - `/${workspace.slug || workspace.id}/syncs/tasks?query=${encodeURIComponent( - JSON5.stringify({ - syncId: link.id, - notification: "Sync Started", - }) - )}` - ); + toTasks(); } } catch (e) { feedbackError("Failed to run sync", { error: e, placement: "top" }); From f17bc588e1623480498e6d7e72874cd19bdce829 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 28 Sep 2023 16:23:18 +0400 Subject: [PATCH 0206/1353] console: custom-domains: trigger domain verification when it is necessary --- webapps/ee-api/pages/api/domain.ts | 33 ++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/webapps/ee-api/pages/api/domain.ts b/webapps/ee-api/pages/api/domain.ts index 92b1ace20..131cd9957 100644 --- a/webapps/ee-api/pages/api/domain.ts +++ b/webapps/ee-api/pages/api/domain.ts @@ -16,9 +16,9 @@ const vercelTeamId = requireDefined(process.env.DOMAINS_VERCEL_TEAM_ID, `env DOM const vercelToken = requireDefined(process.env.DOMAINS_VERCEL_TOKEN, `env DOMAINS_VERCEL_TOKEN is not set`); const cname = process.env.CNAME || "cname.jitsu.com"; -async function rpc(url: string, body?: any): Promise { +async function rpc(url: string, method?: "GET" | "POST", body?: any): Promise { const res = await fetch(url.indexOf("https://") === 0 ? url : `https://api.vercel.com${url}`, { - method: body ? "POST" : "GET", + method: method ?? "GET", body: body ? JSON.stringify(body) : undefined, headers: { Authorization: `Bearer ${vercelToken}`, @@ -64,7 +64,9 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse } let domainInfo = await getExistingDomain(domain); if (!domainInfo) { - domainInfo = await rpc(`/v10/projects/${vercelProjectId}/domains?teamId=${vercelTeamId}`, { name: domain }); + domainInfo = await rpc(`/v10/projects/${vercelProjectId}/domains?teamId=${vercelTeamId}`, "POST", { + name: domain, + }); } if (!domainInfo) { throw new Error(`Can't get domainInfo for ${domain}`); @@ -81,15 +83,24 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse } else if (misconfigured) { res.status(200).json({ ok: true, needsConfiguration: true, configurationType: "cname", cnameValue: cname }); } else if (!verified) { - if (!domainInfo.verification) { - throw new Error(`Domain ${domain} is not verified, and there is no verification info`); + //request Vercel to verify domain + domainInfo = await rpc(`/v9/projects/${vercelProjectId}/domains/${domain}/verify?teamId=${vercelTeamId}`, "POST"); + if (!domainInfo) { + throw new Error(`Can't verify ${domain}`); + } + if (!domainInfo.verified) { + if (!domainInfo.verification) { + throw new Error(`Domain ${domain} is not verified, and there is no verification info`); + } + res.status(200).json({ + ok: true, + needsConfiguration: true, + configurationType: "verification", + verification: domainInfo.verification, + }); + } else { + res.status(200).json({ ok: true, needsConfiguration: false }); } - res.status(200).json({ - ok: true, - needsConfiguration: true, - configurationType: "verification", - verification: domainInfo.verification, - }); } else { throw new Error(`Unexpected state: misconfigured=${misconfigured}, verified=${verified} `); } From 22c3425512179d582b08efc6634d995d1f1a925d Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 28 Sep 2023 16:57:39 +0400 Subject: [PATCH 0207/1353] console: custom-domains: trigger domain verification when it is necessary --- .../components/ApiKeyEditor/ApiKeyEditor.tsx | 107 ++++++++++-------- .../console/pages/[workspaceId]/streams.tsx | 6 +- webapps/ee-api/pages/api/domain.ts | 13 ++- 3 files changed, 73 insertions(+), 53 deletions(-) diff --git a/webapps/console/components/ApiKeyEditor/ApiKeyEditor.tsx b/webapps/console/components/ApiKeyEditor/ApiKeyEditor.tsx index 3cdb2395a..2276442d6 100644 --- a/webapps/console/components/ApiKeyEditor/ApiKeyEditor.tsx +++ b/webapps/console/components/ApiKeyEditor/ApiKeyEditor.tsx @@ -29,9 +29,9 @@ function hint(key: string) { return key.substring(0, 3) + "*" + key.substring(key.length - 3); } -export const ApiKeysEditor: React.FC> = props => { +export const ApiKeysEditor: React.FC & { compact?: boolean }> = props => { const [keys, setKeys] = useState(props.value || []); - const columns = [ + const columns: any[] = [ { title: "Key", key: "id", @@ -74,53 +74,66 @@ export const ApiKeysEditor: React.FC> = props => { ); }, }, - { - title:
    Created
    , - className: "text-right text-xs text-text whitespace-nowrap", - dataIndex: "createdAt", - render: createdAt => { - return
    {createdAt ? new Date(createdAt).toLocaleString() : ""}
    ; - }, - }, - { - title:
    Last Used
    , - className: "text-right text-xs text-text whitespace-nowrap", - dataIndex: "lastUsed", - render: lastUsed => { - return lastUsed ? new Date(lastUsed).toLocaleString() : "Never"; - }, - }, - { - title: "", - className: "text-right", - key: "actions", - render: (key: ApiKey) => { - return ( -
    - -
    - ); + ]; + if (!props.compact) { + columns.push( + { + title:
    Created
    , + className: "text-right text-xs text-text whitespace-nowrap", + dataIndex: "createdAt", + render: createdAt => { + return
    {createdAt ? new Date(createdAt).toLocaleString() : ""}
    ; + }, }, + { + title:
    Last Used
    , + className: "text-right text-xs text-text whitespace-nowrap", + dataIndex: "lastUsed", + render: lastUsed => { + return lastUsed ? new Date(lastUsed).toLocaleString() : "Never"; + }, + } + ); + } + columns.push({ + title: "", + className: "text-right", + key: "actions", + render: (key: ApiKey) => { + return ( +
    + +
    + ); }, - ]; + }); return (
    - {keys.length === 0 &&
    API keys list us empty
    } -
    k.id} /> + {keys.length === 0 &&
    Keys list is empty
    } + {(keys.length > 0 || !props.compact) && ( +
    k.id} + /> + )}
    {keys.find(key => !!key.plaintext) ? (
    @@ -146,3 +159,7 @@ export const ApiKeysEditor: React.FC> = props => {
    ); }; + +export const BrowserKeysEditor: React.FC & { compact?: boolean }> = (props: any) => { + return ; +}; diff --git a/webapps/console/pages/[workspaceId]/streams.tsx b/webapps/console/pages/[workspaceId]/streams.tsx index fcb9546cc..d94c6002a 100644 --- a/webapps/console/pages/[workspaceId]/streams.tsx +++ b/webapps/console/pages/[workspaceId]/streams.tsx @@ -9,7 +9,7 @@ import { FaExternalLinkAlt, FaSpinner, FaTrash, FaWrench } from "react-icons/fa" import { branding } from "../../lib/branding"; import { useRouter } from "next/router"; import { TrackingIntegrationDocumentation } from "../../components/TrackingIntegrationDocumentation/TrackingIntegrationDocumentation"; -import { ApiKeysEditor } from "../../components/ApiKeyEditor/ApiKeyEditor"; +import { BrowserKeysEditor } from "../../components/ApiKeyEditor/ApiKeyEditor"; import { useQuery } from "@tanstack/react-query"; import { getEeClient } from "../../lib/ee-client"; import { requireDefined } from "juava"; @@ -407,7 +407,7 @@ const StreamsList: React.FC<{}> = () => { type: { constant: "stream" }, workspaceId: { constant: workspace.id }, privateKeys: { - editor: ApiKeysEditor, + editor: BrowserKeysEditor, displayName: "Server-to-server Write Keys", advanced: false, documentation: ( @@ -415,7 +415,7 @@ const StreamsList: React.FC<{}> = () => { ), }, publicKeys: { - editor: ApiKeysEditor, + editor: BrowserKeysEditor, displayName: "Browser Write Keys", advanced: false, documentation: ( diff --git a/webapps/ee-api/pages/api/domain.ts b/webapps/ee-api/pages/api/domain.ts index 131cd9957..3bdfa8db6 100644 --- a/webapps/ee-api/pages/api/domain.ts +++ b/webapps/ee-api/pages/api/domain.ts @@ -84,19 +84,22 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse res.status(200).json({ ok: true, needsConfiguration: true, configurationType: "cname", cnameValue: cname }); } else if (!verified) { //request Vercel to verify domain - domainInfo = await rpc(`/v9/projects/${vercelProjectId}/domains/${domain}/verify?teamId=${vercelTeamId}`, "POST"); - if (!domainInfo) { + const verifyInfo = await rpc( + `/v9/projects/${vercelProjectId}/domains/${domain}/verify?teamId=${vercelTeamId}`, + "POST" + ); + if (!verifyInfo) { throw new Error(`Can't verify ${domain}`); } - if (!domainInfo.verified) { - if (!domainInfo.verification) { + if (!verifyInfo.verified) { + if (!verifyInfo.verification && !domainInfo.verification) { throw new Error(`Domain ${domain} is not verified, and there is no verification info`); } res.status(200).json({ ok: true, needsConfiguration: true, configurationType: "verification", - verification: domainInfo.verification, + verification: verifyInfo.verification || domainInfo.verification, }); } else { res.status(200).json({ ok: true, needsConfiguration: false }); From 6125b909a0134e91552b95892ad6718224e01cb1 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 28 Sep 2023 18:22:00 +0400 Subject: [PATCH 0208/1353] attempt to tune pg.Pool --- pnpm-lock.yaml | 54 +++++++++++++++++------------------- webapps/console/package.json | 2 +- webapps/ee-api/lib/store.ts | 2 ++ webapps/ee-api/package.json | 2 +- 4 files changed, 29 insertions(+), 31 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6ddef8e3c..4ca44e37e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -761,11 +761,11 @@ importers: specifier: ^3.0.0 version: 3.0.0 pg: - specifier: ~8.11.1 - version: 8.11.1 + specifier: ~8.11.3 + version: 8.11.3 pg-cursor: specifier: ~2.10.1 - version: 2.10.1(pg@8.11.1) + version: 2.10.1(pg@8.11.3) prisma: specifier: ^4.12.0 version: 4.12.0 @@ -838,7 +838,7 @@ importers: version: 8.6.6 '@types/pg-query-stream': specifier: ^3.4.0 - version: 3.4.0(pg@8.11.1) + version: 3.4.0(pg@8.11.3) '@types/react': specifier: 18.0.28 version: 18.0.28 @@ -954,8 +954,8 @@ importers: specifier: ^3.2.4 version: 3.2.4 pg: - specifier: ^8.7.3 - version: 8.10.0 + specifier: ^8.11.3 + version: 8.11.3 react: specifier: 18.2.0 version: 18.2.0 @@ -9367,11 +9367,11 @@ packages: - pg-native dev: false - /@types/pg-query-stream@3.4.0(pg@8.11.1): + /@types/pg-query-stream@3.4.0(pg@8.11.3): resolution: {integrity: sha512-oqGAu+5CMPAVNqemN9xYT3LBDy2qXBke15cstEuVYIvJL6lcKSNKeG61fONlVrxTYIFi9sPuGVtIweanrEZcJw==} deprecated: This is a stub types definition. pg-query-stream provides its own type definitions, so you do not need this installed. dependencies: - pg-query-stream: 4.4.0(pg@8.11.1) + pg-query-stream: 4.4.0(pg@8.11.3) transitivePeerDependencies: - pg dev: true @@ -20814,19 +20814,15 @@ packages: requiresBuild: true optional: true - /pg-connection-string@2.5.0: - resolution: {integrity: sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==} - dev: false - - /pg-connection-string@2.6.1: - resolution: {integrity: sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg==} + /pg-connection-string@2.6.2: + resolution: {integrity: sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==} - /pg-cursor@2.10.1(pg@8.11.1): + /pg-cursor@2.10.1(pg@8.11.3): resolution: {integrity: sha512-t4bjqL/gtohsNoByFcD4EKjHVppOuJipBYVhunVUm25TnaS2xEEr2jy3vumOX2z44SHROaf4K7QWPY9xnKT3HA==} peerDependencies: pg: ^8 dependencies: - pg: 8.11.1 + pg: 8.11.3 /pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} @@ -20837,20 +20833,20 @@ packages: engines: {node: '>=12.0.0'} dev: false - /pg-pool@3.6.0(pg@8.10.0): - resolution: {integrity: sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ==} + /pg-pool@3.6.1(pg@8.10.0): + resolution: {integrity: sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==} peerDependencies: pg: '>=8.0' dependencies: pg: 8.10.0 dev: false - /pg-pool@3.6.1(pg@8.11.1): + /pg-pool@3.6.1(pg@8.11.3): resolution: {integrity: sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==} peerDependencies: pg: '>=8.0' dependencies: - pg: 8.11.1 + pg: 8.11.3 /pg-promise@11.4.3: resolution: {integrity: sha512-b4wuukB+pkrLRZ53Z+3L9IONlIhOUSM/VlLQV2SnQzNJPJmDZj6ticgcMtZMDanAUEj+zX1FJOBrSpSR9TumXg==} @@ -20867,13 +20863,13 @@ packages: /pg-protocol@1.6.0: resolution: {integrity: sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==} - /pg-query-stream@4.4.0(pg@8.11.1): + /pg-query-stream@4.4.0(pg@8.11.3): resolution: {integrity: sha512-shmP973/ruBw3exSmIEBW9iubWvyyZMzp6oWfcHgvlqAe4LtaRyVqPGxgnuorbRqksK03mjOC9PU+Ohz3b0GkQ==} peerDependencies: pg: ^8 dependencies: - pg: 8.11.1 - pg-cursor: 2.10.1(pg@8.11.1) + pg: 8.11.3 + pg-cursor: 2.10.1(pg@8.11.3) dev: true /pg-types@2.2.0: @@ -20897,15 +20893,15 @@ packages: dependencies: buffer-writer: 2.0.0 packet-reader: 1.0.0 - pg-connection-string: 2.5.0 - pg-pool: 3.6.0(pg@8.10.0) + pg-connection-string: 2.6.2 + pg-pool: 3.6.1(pg@8.10.0) pg-protocol: 1.6.0 pg-types: 2.2.0 pgpass: 1.0.5 dev: false - /pg@8.11.1: - resolution: {integrity: sha512-utdq2obft07MxaDg0zBJI+l/M3mBRfIpEN3iSemsz0G5F2/VXx+XzqF4oxrbIZXQxt2AZzIUzyVg/YM6xOP/WQ==} + /pg@8.11.3: + resolution: {integrity: sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==} engines: {node: '>= 8.0.0'} peerDependencies: pg-native: '>=3.0.1' @@ -20915,8 +20911,8 @@ packages: dependencies: buffer-writer: 2.0.0 packet-reader: 1.0.0 - pg-connection-string: 2.6.1 - pg-pool: 3.6.1(pg@8.11.1) + pg-connection-string: 2.6.2 + pg-pool: 3.6.1(pg@8.11.3) pg-protocol: 1.6.0 pg-types: 2.2.0 pgpass: 1.0.5 diff --git a/webapps/console/package.json b/webapps/console/package.json index 261012fdd..3bc995239 100644 --- a/webapps/console/package.json +++ b/webapps/console/package.json @@ -71,7 +71,7 @@ "node-sql-parser": "^4.6.5", "nodemailer": "^6.8.0", "object-hash": "^3.0.0", - "pg": "~8.11.1", + "pg": "~8.11.3", "pg-cursor": "~2.10.1", "prisma": "^4.12.0", "react": "^18.2.0", diff --git a/webapps/ee-api/lib/store.ts b/webapps/ee-api/lib/store.ts index 39a2801a3..26dd8889e 100644 --- a/webapps/ee-api/lib/store.ts +++ b/webapps/ee-api/lib/store.ts @@ -99,6 +99,8 @@ export function createPg(url: string, opts: { defaultSchema?: string; connection const pool = new PG.Pool({ connectionString: url, + idleTimeoutMillis: 0, + allowExitOnIdle: false, ssl: sslMode === "no-verify" ? { rejectUnauthorized: false } : undefined, }); pool.on("connect", async client => { diff --git a/webapps/ee-api/package.json b/webapps/ee-api/package.json index 3a0014c87..7f483efcc 100644 --- a/webapps/ee-api/package.json +++ b/webapps/ee-api/package.json @@ -24,7 +24,7 @@ "lodash": "^4.17.21", "next": "13.0.0", "node-fetch-commonjs": "^3.2.4", - "pg": "^8.7.3", + "pg": "^8.11.3", "react": "18.2.0", "react-dom": "18.2.0", "stripe": "^11.15.0", From 6ffe404eef042055795701faef4fb7db2b2395fa Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 28 Sep 2023 18:33:43 +0400 Subject: [PATCH 0209/1353] attempt to tune pg.Pool --- webapps/ee-api/lib/store.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/webapps/ee-api/lib/store.ts b/webapps/ee-api/lib/store.ts index 26dd8889e..39a2801a3 100644 --- a/webapps/ee-api/lib/store.ts +++ b/webapps/ee-api/lib/store.ts @@ -99,8 +99,6 @@ export function createPg(url: string, opts: { defaultSchema?: string; connection const pool = new PG.Pool({ connectionString: url, - idleTimeoutMillis: 0, - allowExitOnIdle: false, ssl: sslMode === "no-verify" ? { rejectUnauthorized: false } : undefined, }); pool.on("connect", async client => { From a0de6e5daa46a57de4726dd46a1ab4165100971b Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Thu, 28 Sep 2023 11:11:10 -0400 Subject: [PATCH 0210/1353] chore: better error message on singleton failure --- libs/juava/src/singleton.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/juava/src/singleton.ts b/libs/juava/src/singleton.ts index 4d16208b3..823b917ac 100644 --- a/libs/juava/src/singleton.ts +++ b/libs/juava/src/singleton.ts @@ -135,7 +135,7 @@ export function getSingleton( return globalInstance.value; } else { throw newError( - `${globalName} failed during initialization: ${getErrorMessage(globalInstance.error)}`, + `STALLED ERROR - ${globalName} failed during initialization: ${getErrorMessage(globalInstance.error)}`, globalInstance.error ); } From 544c35590d7356df23323b52a2d762f15afdc20f Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Thu, 28 Sep 2023 11:11:41 -0400 Subject: [PATCH 0211/1353] fix: display plan name instead of plan id in billing dialog --- webapps/console/components/Billing/UpgradeDialog.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/webapps/console/components/Billing/UpgradeDialog.tsx b/webapps/console/components/Billing/UpgradeDialog.tsx index 32c721763..52248de95 100644 --- a/webapps/console/components/Billing/UpgradeDialog.tsx +++ b/webapps/console/components/Billing/UpgradeDialog.tsx @@ -36,7 +36,8 @@ export const UpgradeDialog: React.FC<{ featureDescription: string; availableInPl description={
    - You are currently subscribed to a {billing.settings.planId} plan. To use{" "} + You are currently subscribed to a{" "} + {billing.settings?.planName || billing.settings.planId} plan. To use{" "} {featureDescription}, please upgrade to a{" "} {availableInPlans ? arrayJoin( From 310a9de6e64521f9762fd8cf84657c13eb50c422 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Thu, 28 Sep 2023 11:16:11 -0400 Subject: [PATCH 0212/1353] fix: added billing error data to context if billing is disabled due to server error --- webapps/console/components/Billing/BillingProvider.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/components/Billing/BillingProvider.tsx b/webapps/console/components/Billing/BillingProvider.tsx index 8daa3139a..b6a4dedcc 100644 --- a/webapps/console/components/Billing/BillingProvider.tsx +++ b/webapps/console/components/Billing/BillingProvider.tsx @@ -9,7 +9,7 @@ const log = getLog(`BillingProvider`); export type UseBillingResult = | { loading: true; enabled: true; settings?: never } - | { loading: false; enabled: false; settings?: never } + | { loading: false; enabled: false; settings?: never; error?: { message: string } } | { loading: false; enabled: true; settings: BillingSettings }; export function useBilling(): UseBillingResult { From bcda9faf930ed3e31a17204fb3c4be7a3a0a525d Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Thu, 28 Sep 2023 21:03:47 -0400 Subject: [PATCH 0213/1353] fix: get rid of all singletons in EE server --- webapps/ee-api/lib/services.ts | 54 ++++++------------- webapps/ee-api/lib/store.ts | 32 +++++++---- webapps/ee-api/lib/stripe.ts | 4 +- webapps/ee-api/pages/api/billing/manage.ts | 1 - webapps/ee-api/pages/api/billing/plans.ts | 1 - webapps/ee-api/pages/api/billing/settings.ts | 1 - webapps/ee-api/pages/api/billing/upgrade.ts | 1 - webapps/ee-api/pages/api/healthcheck/index.ts | 18 +++++-- webapps/ee-api/pages/api/is-active.ts | 3 +- webapps/ee-api/pages/api/provision-db.ts | 16 +++--- webapps/ee-api/pages/api/quotas/sync.ts | 3 +- webapps/ee-api/pages/api/report/overage.ts | 4 +- .../ee-api/pages/api/report/workspace-stat.ts | 15 ++---- webapps/ee-api/pages/api/s3-init.ts | 8 ++- 14 files changed, 72 insertions(+), 89 deletions(-) diff --git a/webapps/ee-api/lib/services.ts b/webapps/ee-api/lib/services.ts index 3633afd34..f11a6b39f 100644 --- a/webapps/ee-api/lib/services.ts +++ b/webapps/ee-api/lib/services.ts @@ -1,54 +1,30 @@ -import { getErrorMessage, getLog, getSingleton, requireDefined } from "juava"; +import { requireDefined } from "juava"; import { createPg, getPostgresStore } from "./store"; import { createClient } from "@clickhouse/client"; import { S3Client } from "@aws-sdk/client-s3"; -import PG from "pg"; - const dbUrl = requireDefined( process.env.EE_DATABASE_URL || process.env.DATABASE_URL, "nor EE_DATABASE_URL, neither DATABASE_URL is not defined" ); -export const pg = getSingleton("postgres", () => createPg(dbUrl, { connectionName: "kvstore" })); +export const pg = createPg(dbUrl, { connectionName: "kvstore" }); -export const store = getSingleton("pgstore", async () => { - getLog().atInfo().log("Initializing postgres store (pgstore) - initializing postgres pool"); - let pgPool: PG.Pool; - try { - pgPool = await pg.waitInit(); - } catch (e) { - const msg = `Failed to initialize postgres pool: ${getErrorMessage(e)}`; - throw new Error(msg); - } - getLog().atInfo().log("Postgres connection pool initialized - initializing kvstore"); - try { - return getPostgresStore(pgPool, { tableName: "kvstore" }); - } catch (e) { - const msg = `Failed to initialize kv store: ${getErrorMessage(e)}`; - throw new Error(msg); - } -}); +export const store = getPostgresStore(pg, { tableName: "kvstore" }); -export const telemetryDb = getSingleton("telemetry_db", () => - createPg(process.env.TELEMETRY_DATABASE_URL || dbUrl, { connectionName: "telemetry" }) -); +export const telemetryDb = createPg(process.env.TELEMETRY_DATABASE_URL || dbUrl, { connectionName: "telemetry" }); -export const clickhouse = getSingleton("clickhouse", () => { - return createClient({ - host: requireDefined(process.env.CLICKHOUSE_URL, `env CLICKHOUSE_URL is not defined`), - username: process.env.CLICKHOUSE_USERNAME || "default", - password: requireDefined(process.env.CLICKHOUSE_PASSWORD, `env CLICKHOUSE_PASSWORD is not defined`), - }); +export const clickhouse = createClient({ + host: requireDefined(process.env.CLICKHOUSE_URL, `env CLICKHOUSE_URL is not defined`), + username: process.env.CLICKHOUSE_USERNAME || "default", + password: requireDefined(process.env.CLICKHOUSE_PASSWORD, `env CLICKHOUSE_PASSWORD is not defined`), }); -export const s3client = getSingleton("s3client", () => { - return new S3Client({ - region: requireDefined(process.env.S3_REGION, `env S3_REGION is not defined`), - credentials: { - accessKeyId: requireDefined(process.env.S3_ACCESS_KEY_ID, `env S3_ACCESS_KEY_ID is not defined`), - secretAccessKey: requireDefined(process.env.S3_SECRET_ACCESS_KEY, `env S3_SECRET_ACCESS_KEY is not defined`), - }, - endpoint: process.env.S3_ENDPOINT || undefined, - }); +export const s3client = new S3Client({ + region: requireDefined(process.env.S3_REGION, `env S3_REGION is not defined`), + credentials: { + accessKeyId: requireDefined(process.env.S3_ACCESS_KEY_ID, `env S3_ACCESS_KEY_ID is not defined`), + secretAccessKey: requireDefined(process.env.S3_SECRET_ACCESS_KEY, `env S3_SECRET_ACCESS_KEY is not defined`), + }, + endpoint: process.env.S3_ENDPOINT || undefined, }); diff --git a/webapps/ee-api/lib/store.ts b/webapps/ee-api/lib/store.ts index 39a2801a3..7e3c0b00f 100644 --- a/webapps/ee-api/lib/store.ts +++ b/webapps/ee-api/lib/store.ts @@ -120,26 +120,36 @@ export function createPg(url: string, opts: { defaultSchema?: string; connection return pool; } -export async function getPostgresStore( +export function getPostgresStore( postgres: string | PG.Pool, opts: { tableName?: string; schema?: string } = {} -): Promise { +): KeyValueStore { const pgPool = typeof postgres === "string" - ? await createPg(postgres, { defaultSchema: opts.schema, connectionName: "kvstore" }) + ? createPg(postgres, { defaultSchema: opts.schema, connectionName: "kvstore" }) : postgres; const table = opts?.tableName || `kvstore`; - try { - await pgPool.query(schema(table)); - } catch (e: any) { - log.atError().log(`Failed to initialize postgres table storage: ${getErrorMessage(e)} Query: schema(table)`); - throw new Error("Failed to initialize postgres table storage: " + getErrorMessage(e)); - } + + let initialized = false; + + const initIfNeeded = async () => { + if (!initialized) { + try { + await pgPool.query(schema(table)); + } catch (e: any) { + log.atError().log(`Failed to initialize postgres table storage: ${getErrorMessage(e)} Query: schema(table)`); + throw new Error("Failed to initialize postgres table storage: " + getErrorMessage(e)); + } + } + initialized = true; + }; return { getTable(tableName: string): KeyValueTable { return { async list(keyPattern?: string) { + await initIfNeeded(); + maybeDeleteExpiredObjects(pgPool, table); assertDefined(!keyPattern, "keyPattern is not supported yet"); const result = await pgPool.query({ @@ -152,6 +162,7 @@ export async function getPostgresStore( return result.rows.map(({ id, obj }) => ({ id: id as string, obj })); }, async listKeys(keyPattern?: string): Promise { + await initIfNeeded(); maybeDeleteExpiredObjects(pgPool, table); assertDefined(!keyPattern, "keyPattern is not supported yet"); const result = await pgPool.query({ @@ -164,10 +175,12 @@ export async function getPostgresStore( return result.rows.map(({ id }) => id); }, async del(key: string) { + await initIfNeeded(); maybeDeleteExpiredObjects(pgPool, table); await pgPool.query(deleteQuery(table, tableName, key)); }, async get(key: string) { + await initIfNeeded(); maybeDeleteExpiredObjects(pgPool, table); let result = await pgPool.query({ text: `SELECT obj, expire @@ -190,6 +203,7 @@ export async function getPostgresStore( } }, async put(key: string, obj: any, opts: { ttlMs?: number } = {}) { + await initIfNeeded(); maybeDeleteExpiredObjects(pgPool, table); const upsertQuery = ` INSERT INTO ${table} (id, namespace, obj, expire) diff --git a/webapps/ee-api/lib/stripe.ts b/webapps/ee-api/lib/stripe.ts index e35d9e717..d09a9afbf 100644 --- a/webapps/ee-api/lib/stripe.ts +++ b/webapps/ee-api/lib/stripe.ts @@ -24,11 +24,11 @@ export async function getOrCreateCurrentSubscription( userEmail: () => string, opts: { changeEmail?: boolean } = {} ): Promise<{ stripeCustomerId: string; noRestrictions?: boolean; subscriptionStatus: SubscriptionStatus }> { - let stripeOptions = await store().getTable(stripeDataTable).get(workspaceId); + let stripeOptions = await store.getTable(stripeDataTable).get(workspaceId); if (!stripeOptions) { const email = userEmail(); const newCustomer = await stripe.customers.create({ email }); - await store().getTable(stripeDataTable).put(workspaceId, { stripeCustomerId: newCustomer.id }); + await store.getTable(stripeDataTable).put(workspaceId, { stripeCustomerId: newCustomer.id }); stripeOptions = { stripeCustomerId: newCustomer.id }; } if (opts.changeEmail) { diff --git a/webapps/ee-api/pages/api/billing/manage.ts b/webapps/ee-api/pages/api/billing/manage.ts index 84554f792..ae14304e9 100644 --- a/webapps/ee-api/pages/api/billing/manage.ts +++ b/webapps/ee-api/pages/api/billing/manage.ts @@ -18,7 +18,6 @@ export type ErrorResponse = { }; const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { - await store.waitInit(); if (req.method === "OPTIONS") { //allowing requests from everywhere since our tokens are short-lived //and can't be hijacked diff --git a/webapps/ee-api/pages/api/billing/plans.ts b/webapps/ee-api/pages/api/billing/plans.ts index 3853539ef..bd60509f2 100644 --- a/webapps/ee-api/pages/api/billing/plans.ts +++ b/webapps/ee-api/pages/api/billing/plans.ts @@ -27,7 +27,6 @@ type Response = { products: Product[]; }; const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { - await store.waitInit(); if (req.method === "OPTIONS") { //allowing requests from everywhere since our tokens are short-lived //and can't be hijacked diff --git a/webapps/ee-api/pages/api/billing/settings.ts b/webapps/ee-api/pages/api/billing/settings.ts index 690827184..a46eea0ee 100644 --- a/webapps/ee-api/pages/api/billing/settings.ts +++ b/webapps/ee-api/pages/api/billing/settings.ts @@ -20,7 +20,6 @@ export type ErrorResponse = { }; const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { - await store.waitInit(); if (req.method === "OPTIONS") { //allowing requests from everywhere since our tokens are short-lived //and can't be hijacked diff --git a/webapps/ee-api/pages/api/billing/upgrade.ts b/webapps/ee-api/pages/api/billing/upgrade.ts index eb837f3f0..4a6597c5a 100644 --- a/webapps/ee-api/pages/api/billing/upgrade.ts +++ b/webapps/ee-api/pages/api/billing/upgrade.ts @@ -12,7 +12,6 @@ export type ErrorResponse = { error: string; }; const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { - await store.waitInit(); if (req.method === "OPTIONS") { //allowing requests from everywhere since our tokens are short-lived //and can't be hijacked diff --git a/webapps/ee-api/pages/api/healthcheck/index.ts b/webapps/ee-api/pages/api/healthcheck/index.ts index dac95b2c8..e334c1468 100644 --- a/webapps/ee-api/pages/api/healthcheck/index.ts +++ b/webapps/ee-api/pages/api/healthcheck/index.ts @@ -1,15 +1,23 @@ import { NextApiRequest, NextApiResponse } from "next"; import { getLog } from "juava"; -import { pg, store } from "../../../lib/services"; +import { clickhouse, pg, s3client, store, telemetryDb } from "../../../lib/services"; +import { ListBucketsCommand } from "@aws-sdk/client-s3"; const healthChecks: Record Promise> = { postgres: async () => { - const pgPool = await pg.waitInit(); - await pgPool.query(`SELECT 1 as pgpool_healthcheck`); + await pg.query(`SELECT 1 as pgpool_healthcheck`); + }, + clickhouse: async () => { + await clickhouse.query({ query: `SELECT 1 as chpool_healthcheck`, clickhouse_settings: { wait_end_of_query: 1 } }); + }, + telemetryDb: async () => { + await telemetryDb.query(`SELECT 1 as telemetry_healthcheck`); + }, + s3: async () => { + await s3client.send(new ListBucketsCommand({})); }, pgstore: async () => { - const pgStore = await store.waitInit(); - await pgStore.getTable("last_healthcheck").put("last_healthcheck", { + await store.getTable("last_healthcheck").put("last_healthcheck", { timestamp: new Date().toISOString(), env: process.env, }); diff --git a/webapps/ee-api/pages/api/is-active.ts b/webapps/ee-api/pages/api/is-active.ts index 81030082a..6a2695728 100644 --- a/webapps/ee-api/pages/api/is-active.ts +++ b/webapps/ee-api/pages/api/is-active.ts @@ -25,8 +25,7 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse let projectId: string | null = null; let projectName: string | null = null; try { - const pool = await telemetryDb.waitInit(); - const rows = await pool.query("select * from jitsu_configs_users_info where _uid=$1 limit 1", [uid]); + const rows = await telemetryDb.query("select * from jitsu_configs_users_info where _uid=$1 limit 1", [uid]); if (rows.rowCount === 0) { return { ok: true, uid: null, project: null, name: null, active: false }; } else { diff --git a/webapps/ee-api/pages/api/provision-db.ts b/webapps/ee-api/pages/api/provision-db.ts index 8082cec5e..ac3e21903 100644 --- a/webapps/ee-api/pages/api/provision-db.ts +++ b/webapps/ee-api/pages/api/provision-db.ts @@ -18,7 +18,7 @@ async function createDb(name: string, cluster: string): Promise { let nameCounter = 0; while (true) { const currentName = nameCounter === 0 ? name : `${name}${nameCounter}`; - const resultSet = await clickhouse().query({ + const resultSet = await clickhouse.query({ query: `select count(*) as cnt from system.databases where name = '${currentName}'`, @@ -29,7 +29,7 @@ async function createDb(name: string, cluster: string): Promise { const result = await resultSet.json(); const cnt = (result as any).data[0].cnt; if (cnt === "0") { - const res = await clickhouse() + const res = await clickhouse .query({ query: `CREATE DATABASE ${currentName} ON CLUSTER ${cluster}` }) .then(result => result.text()); log.atInfo().log(`Database ${currentName} created`, res); @@ -47,7 +47,7 @@ async function createUser(name: string, password: string, dbName: string, cluste let nameCounter = 0; while (true) { const currentName = nameCounter === 0 ? name : `${name}${nameCounter}`; - const resultSet = await clickhouse().query({ + const resultSet = await clickhouse.query({ query: `select count(*) as cnt from system.users where name = '${currentName}'`, @@ -60,11 +60,11 @@ async function createUser(name: string, password: string, dbName: string, cluste if (cnt === "0") { const query = `CREATE USER ${currentName} ON CLUSTER ${cluster} IDENTIFIED WITH sha256_password BY '${password}' DEFAULT DATABASE ${dbName}`; log.atDebug().log(`Creating user ${name} with query: ${query}`); - await clickhouse().exec({ query }); + await clickhouse.exec({ query }); log.atInfo().log(`User ${currentName} created`); const grantQuery = `GRANT ON CLUSTER ${cluster} ALL ON ${dbName}.* TO ${currentName}`; log.atDebug().log(`Granting db privileges to user ${name} with query: ${query}`); - await clickhouse().exec({ query: grantQuery }); + await clickhouse.exec({ query: grantQuery }); log.atInfo().log(`Privileges granted to user ${currentName} on db ${dbName}`); return currentName; } else { @@ -79,7 +79,6 @@ async function createUser(name: string, password: string, dbName: string, cluste * for creating a database. It might be slightly different if database name was already taken. */ async function createAccount(credentials: Credentials): Promise { - await clickhouse.waitInit(); const database = await createDb(credentials.database, credentials.cluster); return { username: await createUser(credentials.username, credentials.password, database, credentials.cluster), @@ -98,7 +97,6 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse new URL(requireDefined(process.env.CLICKHOUSE_URL, `CLICKHOUSE_URL or CLICKHOUSE_HOSTS must be defined`)).hostname ); } - await store.waitInit(); const claims = await auth(req, res); if (!claims) { return; @@ -110,7 +108,7 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse claims.type === "admin" || (claims.type === "user" && claims.workspaceId === workspaceId), `Token can't access workspace ${workspaceId}` ); - const credentials = await store().getTable("provisioned-db").get(workspaceId); + const credentials = store.getTable("provisioned-db").get(workspaceId); if (credentials) { return res.status(200).json({ ...credentials, @@ -124,7 +122,7 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse password: randomId(24), cluster: clickhouseClusterName, }); - await store().getTable("provisioned-db").put(workspaceId, dbCredentials); + await store.getTable("provisioned-db").put(workspaceId, dbCredentials); return { ...dbCredentials, protocol: "clickhouse-secure", diff --git a/webapps/ee-api/pages/api/quotas/sync.ts b/webapps/ee-api/pages/api/quotas/sync.ts index 6ca0f4b59..66dbfa6bf 100644 --- a/webapps/ee-api/pages/api/quotas/sync.ts +++ b/webapps/ee-api/pages/api/quotas/sync.ts @@ -3,7 +3,7 @@ import { auth } from "../../../lib/auth"; import { assertTrue, getLog, requireDefined } from "juava"; import { withErrorHandler } from "../../../lib/error-handler"; import { getOrCreateCurrentSubscription } from "../../../lib/stripe"; -import { pg as pgService } from "../../../lib/services"; +import { pg } from "../../../lib/services"; import { query } from "../report/workspace-stat"; //A little copy-paste doesn't hurt @@ -13,7 +13,6 @@ export const freePlanLimitations = { }; const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { - const pg = await pgService.waitInit(); const claims = requireDefined(await auth(req, res), `Auth is required`); const workspaceId = requireDefined(req.query.workspaceId as string, "workspaceId GET param is required"); assertTrue(claims.type === "admin" || claims.workspaceId === workspaceId, "Invalid auth claims"); diff --git a/webapps/ee-api/pages/api/report/overage.ts b/webapps/ee-api/pages/api/report/overage.ts index 0931e9479..919cc8503 100644 --- a/webapps/ee-api/pages/api/report/overage.ts +++ b/webapps/ee-api/pages/api/report/overage.ts @@ -78,10 +78,10 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse ? [ { id: workspaceId, - obj: await store().getTable(stripeDataTable).get(workspaceId), + obj: await store.getTable(stripeDataTable).get(workspaceId), }, ] - : await store().getTable(stripeDataTable).list(); + : await store.getTable(stripeDataTable).list(); const availableProducts = await getAvailableProducts(); diff --git a/webapps/ee-api/pages/api/report/workspace-stat.ts b/webapps/ee-api/pages/api/report/workspace-stat.ts index fd2327f49..62ca3b98d 100644 --- a/webapps/ee-api/pages/api/report/workspace-stat.ts +++ b/webapps/ee-api/pages/api/report/workspace-stat.ts @@ -55,11 +55,9 @@ async function getPostgresPart({ granularity, start, end, workspaceId }: ReportP `; const params = removeUndefined({ start, end, granularity, workspaceId }); const { query, values } = namedParameters(sql, params); - return await pg() - .query({ text: query, values }) - .then(res => { - return res.rows; - }); + return await pg.query({ text: query, values }).then(res => { + return res.rows; + }); } async function getClickhousePart({ @@ -82,7 +80,7 @@ async function getClickhousePart({ group by period, workspaceId order by period desc; `; - const resultSet = await clickhouse().query({ + const resultSet = await clickhouse.query({ query, clickhouse_settings: { wait_end_of_query: 1, @@ -141,7 +139,7 @@ export async function buildWorkspaceReport( } async function extend(reportResult: WorkspaceReportRow[]): Promise { - const workspaceInfo = await query(pg(), workspaceStatSql); + const workspaceInfo = await query(pg, workspaceStatSql); const workspaceInfoMap = workspaceInfo.reduce((acc, w) => { acc[w.workspaceId] = w; return acc; @@ -152,9 +150,6 @@ async function extend(reportResult: WorkspaceReportRow[]): Promise Date: Thu, 28 Sep 2023 21:53:46 -0400 Subject: [PATCH 0214/1353] fix: clickhouse credentials doesn't show --- webapps/ee-api/pages/api/provision-db.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/ee-api/pages/api/provision-db.ts b/webapps/ee-api/pages/api/provision-db.ts index ac3e21903..6b289bde8 100644 --- a/webapps/ee-api/pages/api/provision-db.ts +++ b/webapps/ee-api/pages/api/provision-db.ts @@ -108,7 +108,7 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse claims.type === "admin" || (claims.type === "user" && claims.workspaceId === workspaceId), `Token can't access workspace ${workspaceId}` ); - const credentials = store.getTable("provisioned-db").get(workspaceId); + const credentials = await store.getTable("provisioned-db").get(workspaceId); if (credentials) { return res.status(200).json({ ...credentials, From 14d9de95f105eef9d1307234dc5f5dbb55dfe152 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 29 Sep 2023 11:43:13 +0400 Subject: [PATCH 0215/1353] rollback of 'fix: get rid of all singletons in EE server'. use FAIL_ON_DB_CONNECTION_ERRORS instead --- libs/juava/src/singleton.ts | 7 ++- .../pages/[workspaceId]/destinations.tsx | 1 - webapps/ee-api/lib/services.ts | 54 +++++++++++++------ webapps/ee-api/lib/store.ts | 32 ++++------- webapps/ee-api/lib/stripe.ts | 4 +- webapps/ee-api/pages/api/billing/manage.ts | 1 + webapps/ee-api/pages/api/billing/plans.ts | 1 + webapps/ee-api/pages/api/billing/settings.ts | 1 + webapps/ee-api/pages/api/billing/upgrade.ts | 1 + webapps/ee-api/pages/api/healthcheck/index.ts | 16 +++--- webapps/ee-api/pages/api/is-active.ts | 3 +- webapps/ee-api/pages/api/provision-db.ts | 16 +++--- webapps/ee-api/pages/api/quotas/sync.ts | 3 +- webapps/ee-api/pages/api/report/overage.ts | 4 +- .../ee-api/pages/api/report/workspace-stat.ts | 15 ++++-- webapps/ee-api/pages/api/s3-init.ts | 8 +-- 16 files changed, 99 insertions(+), 68 deletions(-) diff --git a/libs/juava/src/singleton.ts b/libs/juava/src/singleton.ts index 823b917ac..6d8403657 100644 --- a/libs/juava/src/singleton.ts +++ b/libs/juava/src/singleton.ts @@ -94,7 +94,10 @@ export function getSingleton( ? debounce(() => clearSingleton(globalName, opts.cleanupFunc), 1000 * opts.errorTtlSec) : () => {}, }; - if (process.env.FAIL_ON_DB_CONNECTION_ERRORS === "true" || process.env.FAIL_ON_DB_CONNECTION_ERRORS === "1") { + if ( + !opts.optional && + (process.env.FAIL_ON_DB_CONNECTION_ERRORS === "true" || process.env.FAIL_ON_DB_CONNECTION_ERRORS === "1") + ) { log.atInfo().log("❌ ❌ ❌ Shutting down the application"); process.exit(1); } @@ -135,7 +138,7 @@ export function getSingleton( return globalInstance.value; } else { throw newError( - `STALLED ERROR - ${globalName} failed during initialization: ${getErrorMessage(globalInstance.error)}`, + `${globalName} failed during initialization: ${getErrorMessage(globalInstance.error)}`, globalInstance.error ); } diff --git a/webapps/console/pages/[workspaceId]/destinations.tsx b/webapps/console/pages/[workspaceId]/destinations.tsx index 29f8a4744..bfadaddc6 100644 --- a/webapps/console/pages/[workspaceId]/destinations.tsx +++ b/webapps/console/pages/[workspaceId]/destinations.tsx @@ -301,7 +301,6 @@ function CredentialsPopover(props: { credentials: ClickhouseConnectionCredential > {[ `clickhouse-client --host ${props.credentials.host} \\`, - `\t--accept-invalid-certificate \\`, `\t--database ${props.credentials.database} \\`, `\t--port ${props.credentials.tcpPort} --secure \\`, `\t--user ${props.credentials.username} \\`, diff --git a/webapps/ee-api/lib/services.ts b/webapps/ee-api/lib/services.ts index f11a6b39f..3633afd34 100644 --- a/webapps/ee-api/lib/services.ts +++ b/webapps/ee-api/lib/services.ts @@ -1,30 +1,54 @@ -import { requireDefined } from "juava"; +import { getErrorMessage, getLog, getSingleton, requireDefined } from "juava"; import { createPg, getPostgresStore } from "./store"; import { createClient } from "@clickhouse/client"; import { S3Client } from "@aws-sdk/client-s3"; +import PG from "pg"; + const dbUrl = requireDefined( process.env.EE_DATABASE_URL || process.env.DATABASE_URL, "nor EE_DATABASE_URL, neither DATABASE_URL is not defined" ); -export const pg = createPg(dbUrl, { connectionName: "kvstore" }); +export const pg = getSingleton("postgres", () => createPg(dbUrl, { connectionName: "kvstore" })); -export const store = getPostgresStore(pg, { tableName: "kvstore" }); +export const store = getSingleton("pgstore", async () => { + getLog().atInfo().log("Initializing postgres store (pgstore) - initializing postgres pool"); + let pgPool: PG.Pool; + try { + pgPool = await pg.waitInit(); + } catch (e) { + const msg = `Failed to initialize postgres pool: ${getErrorMessage(e)}`; + throw new Error(msg); + } + getLog().atInfo().log("Postgres connection pool initialized - initializing kvstore"); + try { + return getPostgresStore(pgPool, { tableName: "kvstore" }); + } catch (e) { + const msg = `Failed to initialize kv store: ${getErrorMessage(e)}`; + throw new Error(msg); + } +}); -export const telemetryDb = createPg(process.env.TELEMETRY_DATABASE_URL || dbUrl, { connectionName: "telemetry" }); +export const telemetryDb = getSingleton("telemetry_db", () => + createPg(process.env.TELEMETRY_DATABASE_URL || dbUrl, { connectionName: "telemetry" }) +); -export const clickhouse = createClient({ - host: requireDefined(process.env.CLICKHOUSE_URL, `env CLICKHOUSE_URL is not defined`), - username: process.env.CLICKHOUSE_USERNAME || "default", - password: requireDefined(process.env.CLICKHOUSE_PASSWORD, `env CLICKHOUSE_PASSWORD is not defined`), +export const clickhouse = getSingleton("clickhouse", () => { + return createClient({ + host: requireDefined(process.env.CLICKHOUSE_URL, `env CLICKHOUSE_URL is not defined`), + username: process.env.CLICKHOUSE_USERNAME || "default", + password: requireDefined(process.env.CLICKHOUSE_PASSWORD, `env CLICKHOUSE_PASSWORD is not defined`), + }); }); -export const s3client = new S3Client({ - region: requireDefined(process.env.S3_REGION, `env S3_REGION is not defined`), - credentials: { - accessKeyId: requireDefined(process.env.S3_ACCESS_KEY_ID, `env S3_ACCESS_KEY_ID is not defined`), - secretAccessKey: requireDefined(process.env.S3_SECRET_ACCESS_KEY, `env S3_SECRET_ACCESS_KEY is not defined`), - }, - endpoint: process.env.S3_ENDPOINT || undefined, +export const s3client = getSingleton("s3client", () => { + return new S3Client({ + region: requireDefined(process.env.S3_REGION, `env S3_REGION is not defined`), + credentials: { + accessKeyId: requireDefined(process.env.S3_ACCESS_KEY_ID, `env S3_ACCESS_KEY_ID is not defined`), + secretAccessKey: requireDefined(process.env.S3_SECRET_ACCESS_KEY, `env S3_SECRET_ACCESS_KEY is not defined`), + }, + endpoint: process.env.S3_ENDPOINT || undefined, + }); }); diff --git a/webapps/ee-api/lib/store.ts b/webapps/ee-api/lib/store.ts index 7e3c0b00f..39a2801a3 100644 --- a/webapps/ee-api/lib/store.ts +++ b/webapps/ee-api/lib/store.ts @@ -120,36 +120,26 @@ export function createPg(url: string, opts: { defaultSchema?: string; connection return pool; } -export function getPostgresStore( +export async function getPostgresStore( postgres: string | PG.Pool, opts: { tableName?: string; schema?: string } = {} -): KeyValueStore { +): Promise { const pgPool = typeof postgres === "string" - ? createPg(postgres, { defaultSchema: opts.schema, connectionName: "kvstore" }) + ? await createPg(postgres, { defaultSchema: opts.schema, connectionName: "kvstore" }) : postgres; const table = opts?.tableName || `kvstore`; - - let initialized = false; - - const initIfNeeded = async () => { - if (!initialized) { - try { - await pgPool.query(schema(table)); - } catch (e: any) { - log.atError().log(`Failed to initialize postgres table storage: ${getErrorMessage(e)} Query: schema(table)`); - throw new Error("Failed to initialize postgres table storage: " + getErrorMessage(e)); - } - } - initialized = true; - }; + try { + await pgPool.query(schema(table)); + } catch (e: any) { + log.atError().log(`Failed to initialize postgres table storage: ${getErrorMessage(e)} Query: schema(table)`); + throw new Error("Failed to initialize postgres table storage: " + getErrorMessage(e)); + } return { getTable(tableName: string): KeyValueTable { return { async list(keyPattern?: string) { - await initIfNeeded(); - maybeDeleteExpiredObjects(pgPool, table); assertDefined(!keyPattern, "keyPattern is not supported yet"); const result = await pgPool.query({ @@ -162,7 +152,6 @@ export function getPostgresStore( return result.rows.map(({ id, obj }) => ({ id: id as string, obj })); }, async listKeys(keyPattern?: string): Promise { - await initIfNeeded(); maybeDeleteExpiredObjects(pgPool, table); assertDefined(!keyPattern, "keyPattern is not supported yet"); const result = await pgPool.query({ @@ -175,12 +164,10 @@ export function getPostgresStore( return result.rows.map(({ id }) => id); }, async del(key: string) { - await initIfNeeded(); maybeDeleteExpiredObjects(pgPool, table); await pgPool.query(deleteQuery(table, tableName, key)); }, async get(key: string) { - await initIfNeeded(); maybeDeleteExpiredObjects(pgPool, table); let result = await pgPool.query({ text: `SELECT obj, expire @@ -203,7 +190,6 @@ export function getPostgresStore( } }, async put(key: string, obj: any, opts: { ttlMs?: number } = {}) { - await initIfNeeded(); maybeDeleteExpiredObjects(pgPool, table); const upsertQuery = ` INSERT INTO ${table} (id, namespace, obj, expire) diff --git a/webapps/ee-api/lib/stripe.ts b/webapps/ee-api/lib/stripe.ts index d09a9afbf..e35d9e717 100644 --- a/webapps/ee-api/lib/stripe.ts +++ b/webapps/ee-api/lib/stripe.ts @@ -24,11 +24,11 @@ export async function getOrCreateCurrentSubscription( userEmail: () => string, opts: { changeEmail?: boolean } = {} ): Promise<{ stripeCustomerId: string; noRestrictions?: boolean; subscriptionStatus: SubscriptionStatus }> { - let stripeOptions = await store.getTable(stripeDataTable).get(workspaceId); + let stripeOptions = await store().getTable(stripeDataTable).get(workspaceId); if (!stripeOptions) { const email = userEmail(); const newCustomer = await stripe.customers.create({ email }); - await store.getTable(stripeDataTable).put(workspaceId, { stripeCustomerId: newCustomer.id }); + await store().getTable(stripeDataTable).put(workspaceId, { stripeCustomerId: newCustomer.id }); stripeOptions = { stripeCustomerId: newCustomer.id }; } if (opts.changeEmail) { diff --git a/webapps/ee-api/pages/api/billing/manage.ts b/webapps/ee-api/pages/api/billing/manage.ts index ae14304e9..84554f792 100644 --- a/webapps/ee-api/pages/api/billing/manage.ts +++ b/webapps/ee-api/pages/api/billing/manage.ts @@ -18,6 +18,7 @@ export type ErrorResponse = { }; const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { + await store.waitInit(); if (req.method === "OPTIONS") { //allowing requests from everywhere since our tokens are short-lived //and can't be hijacked diff --git a/webapps/ee-api/pages/api/billing/plans.ts b/webapps/ee-api/pages/api/billing/plans.ts index bd60509f2..3853539ef 100644 --- a/webapps/ee-api/pages/api/billing/plans.ts +++ b/webapps/ee-api/pages/api/billing/plans.ts @@ -27,6 +27,7 @@ type Response = { products: Product[]; }; const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { + await store.waitInit(); if (req.method === "OPTIONS") { //allowing requests from everywhere since our tokens are short-lived //and can't be hijacked diff --git a/webapps/ee-api/pages/api/billing/settings.ts b/webapps/ee-api/pages/api/billing/settings.ts index a46eea0ee..690827184 100644 --- a/webapps/ee-api/pages/api/billing/settings.ts +++ b/webapps/ee-api/pages/api/billing/settings.ts @@ -20,6 +20,7 @@ export type ErrorResponse = { }; const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { + await store.waitInit(); if (req.method === "OPTIONS") { //allowing requests from everywhere since our tokens are short-lived //and can't be hijacked diff --git a/webapps/ee-api/pages/api/billing/upgrade.ts b/webapps/ee-api/pages/api/billing/upgrade.ts index 4a6597c5a..eb837f3f0 100644 --- a/webapps/ee-api/pages/api/billing/upgrade.ts +++ b/webapps/ee-api/pages/api/billing/upgrade.ts @@ -12,6 +12,7 @@ export type ErrorResponse = { error: string; }; const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { + await store.waitInit(); if (req.method === "OPTIONS") { //allowing requests from everywhere since our tokens are short-lived //and can't be hijacked diff --git a/webapps/ee-api/pages/api/healthcheck/index.ts b/webapps/ee-api/pages/api/healthcheck/index.ts index e334c1468..3f65182a3 100644 --- a/webapps/ee-api/pages/api/healthcheck/index.ts +++ b/webapps/ee-api/pages/api/healthcheck/index.ts @@ -1,23 +1,27 @@ import { NextApiRequest, NextApiResponse } from "next"; import { getLog } from "juava"; -import { clickhouse, pg, s3client, store, telemetryDb } from "../../../lib/services"; +import { pg, store, clickhouse, telemetryDb, s3client } from "../../../lib/services"; import { ListBucketsCommand } from "@aws-sdk/client-s3"; const healthChecks: Record Promise> = { postgres: async () => { - await pg.query(`SELECT 1 as pgpool_healthcheck`); + const pgPool = await pg.waitInit(); + await pgPool.query(`SELECT 1 as pgpool_healthcheck`); }, clickhouse: async () => { - await clickhouse.query({ query: `SELECT 1 as chpool_healthcheck`, clickhouse_settings: { wait_end_of_query: 1 } }); + await clickhouse + .waitInit() + .then(c => c.query({ query: `SELECT 1 as chpool_healthcheck`, clickhouse_settings: { wait_end_of_query: 1 } })); }, telemetryDb: async () => { - await telemetryDb.query(`SELECT 1 as telemetry_healthcheck`); + await telemetryDb.waitInit().then(t => t.query(`SELECT 1 as telemetry_healthcheck`)); }, s3: async () => { - await s3client.send(new ListBucketsCommand({})); + await s3client.waitInit().then(s => s.send(new ListBucketsCommand({}))); }, pgstore: async () => { - await store.getTable("last_healthcheck").put("last_healthcheck", { + const pgStore = await store.waitInit(); + await pgStore.getTable("last_healthcheck").put("last_healthcheck", { timestamp: new Date().toISOString(), env: process.env, }); diff --git a/webapps/ee-api/pages/api/is-active.ts b/webapps/ee-api/pages/api/is-active.ts index 6a2695728..81030082a 100644 --- a/webapps/ee-api/pages/api/is-active.ts +++ b/webapps/ee-api/pages/api/is-active.ts @@ -25,7 +25,8 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse let projectId: string | null = null; let projectName: string | null = null; try { - const rows = await telemetryDb.query("select * from jitsu_configs_users_info where _uid=$1 limit 1", [uid]); + const pool = await telemetryDb.waitInit(); + const rows = await pool.query("select * from jitsu_configs_users_info where _uid=$1 limit 1", [uid]); if (rows.rowCount === 0) { return { ok: true, uid: null, project: null, name: null, active: false }; } else { diff --git a/webapps/ee-api/pages/api/provision-db.ts b/webapps/ee-api/pages/api/provision-db.ts index 6b289bde8..8082cec5e 100644 --- a/webapps/ee-api/pages/api/provision-db.ts +++ b/webapps/ee-api/pages/api/provision-db.ts @@ -18,7 +18,7 @@ async function createDb(name: string, cluster: string): Promise { let nameCounter = 0; while (true) { const currentName = nameCounter === 0 ? name : `${name}${nameCounter}`; - const resultSet = await clickhouse.query({ + const resultSet = await clickhouse().query({ query: `select count(*) as cnt from system.databases where name = '${currentName}'`, @@ -29,7 +29,7 @@ async function createDb(name: string, cluster: string): Promise { const result = await resultSet.json(); const cnt = (result as any).data[0].cnt; if (cnt === "0") { - const res = await clickhouse + const res = await clickhouse() .query({ query: `CREATE DATABASE ${currentName} ON CLUSTER ${cluster}` }) .then(result => result.text()); log.atInfo().log(`Database ${currentName} created`, res); @@ -47,7 +47,7 @@ async function createUser(name: string, password: string, dbName: string, cluste let nameCounter = 0; while (true) { const currentName = nameCounter === 0 ? name : `${name}${nameCounter}`; - const resultSet = await clickhouse.query({ + const resultSet = await clickhouse().query({ query: `select count(*) as cnt from system.users where name = '${currentName}'`, @@ -60,11 +60,11 @@ async function createUser(name: string, password: string, dbName: string, cluste if (cnt === "0") { const query = `CREATE USER ${currentName} ON CLUSTER ${cluster} IDENTIFIED WITH sha256_password BY '${password}' DEFAULT DATABASE ${dbName}`; log.atDebug().log(`Creating user ${name} with query: ${query}`); - await clickhouse.exec({ query }); + await clickhouse().exec({ query }); log.atInfo().log(`User ${currentName} created`); const grantQuery = `GRANT ON CLUSTER ${cluster} ALL ON ${dbName}.* TO ${currentName}`; log.atDebug().log(`Granting db privileges to user ${name} with query: ${query}`); - await clickhouse.exec({ query: grantQuery }); + await clickhouse().exec({ query: grantQuery }); log.atInfo().log(`Privileges granted to user ${currentName} on db ${dbName}`); return currentName; } else { @@ -79,6 +79,7 @@ async function createUser(name: string, password: string, dbName: string, cluste * for creating a database. It might be slightly different if database name was already taken. */ async function createAccount(credentials: Credentials): Promise { + await clickhouse.waitInit(); const database = await createDb(credentials.database, credentials.cluster); return { username: await createUser(credentials.username, credentials.password, database, credentials.cluster), @@ -97,6 +98,7 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse new URL(requireDefined(process.env.CLICKHOUSE_URL, `CLICKHOUSE_URL or CLICKHOUSE_HOSTS must be defined`)).hostname ); } + await store.waitInit(); const claims = await auth(req, res); if (!claims) { return; @@ -108,7 +110,7 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse claims.type === "admin" || (claims.type === "user" && claims.workspaceId === workspaceId), `Token can't access workspace ${workspaceId}` ); - const credentials = await store.getTable("provisioned-db").get(workspaceId); + const credentials = await store().getTable("provisioned-db").get(workspaceId); if (credentials) { return res.status(200).json({ ...credentials, @@ -122,7 +124,7 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse password: randomId(24), cluster: clickhouseClusterName, }); - await store.getTable("provisioned-db").put(workspaceId, dbCredentials); + await store().getTable("provisioned-db").put(workspaceId, dbCredentials); return { ...dbCredentials, protocol: "clickhouse-secure", diff --git a/webapps/ee-api/pages/api/quotas/sync.ts b/webapps/ee-api/pages/api/quotas/sync.ts index 66dbfa6bf..6ca0f4b59 100644 --- a/webapps/ee-api/pages/api/quotas/sync.ts +++ b/webapps/ee-api/pages/api/quotas/sync.ts @@ -3,7 +3,7 @@ import { auth } from "../../../lib/auth"; import { assertTrue, getLog, requireDefined } from "juava"; import { withErrorHandler } from "../../../lib/error-handler"; import { getOrCreateCurrentSubscription } from "../../../lib/stripe"; -import { pg } from "../../../lib/services"; +import { pg as pgService } from "../../../lib/services"; import { query } from "../report/workspace-stat"; //A little copy-paste doesn't hurt @@ -13,6 +13,7 @@ export const freePlanLimitations = { }; const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { + const pg = await pgService.waitInit(); const claims = requireDefined(await auth(req, res), `Auth is required`); const workspaceId = requireDefined(req.query.workspaceId as string, "workspaceId GET param is required"); assertTrue(claims.type === "admin" || claims.workspaceId === workspaceId, "Invalid auth claims"); diff --git a/webapps/ee-api/pages/api/report/overage.ts b/webapps/ee-api/pages/api/report/overage.ts index 919cc8503..0931e9479 100644 --- a/webapps/ee-api/pages/api/report/overage.ts +++ b/webapps/ee-api/pages/api/report/overage.ts @@ -78,10 +78,10 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse ? [ { id: workspaceId, - obj: await store.getTable(stripeDataTable).get(workspaceId), + obj: await store().getTable(stripeDataTable).get(workspaceId), }, ] - : await store.getTable(stripeDataTable).list(); + : await store().getTable(stripeDataTable).list(); const availableProducts = await getAvailableProducts(); diff --git a/webapps/ee-api/pages/api/report/workspace-stat.ts b/webapps/ee-api/pages/api/report/workspace-stat.ts index 62ca3b98d..fd2327f49 100644 --- a/webapps/ee-api/pages/api/report/workspace-stat.ts +++ b/webapps/ee-api/pages/api/report/workspace-stat.ts @@ -55,9 +55,11 @@ async function getPostgresPart({ granularity, start, end, workspaceId }: ReportP `; const params = removeUndefined({ start, end, granularity, workspaceId }); const { query, values } = namedParameters(sql, params); - return await pg.query({ text: query, values }).then(res => { - return res.rows; - }); + return await pg() + .query({ text: query, values }) + .then(res => { + return res.rows; + }); } async function getClickhousePart({ @@ -80,7 +82,7 @@ async function getClickhousePart({ group by period, workspaceId order by period desc; `; - const resultSet = await clickhouse.query({ + const resultSet = await clickhouse().query({ query, clickhouse_settings: { wait_end_of_query: 1, @@ -139,7 +141,7 @@ export async function buildWorkspaceReport( } async function extend(reportResult: WorkspaceReportRow[]): Promise { - const workspaceInfo = await query(pg, workspaceStatSql); + const workspaceInfo = await query(pg(), workspaceStatSql); const workspaceInfoMap = workspaceInfo.reduce((acc, w) => { acc[w.workspaceId] = w; return acc; @@ -150,6 +152,9 @@ async function extend(reportResult: WorkspaceReportRow[]): Promise Date: Fri, 29 Sep 2023 14:34:22 +0400 Subject: [PATCH 0216/1353] use getServerLog instead of getLog to properly init log settings --- libs/juava/src/log.ts | 2 +- webapps/console/lib/domains.ts | 5 +++-- webapps/console/lib/nextauth.config.ts | 7 ++++--- webapps/console/lib/server/firebase-server.ts | 7 ++++--- webapps/console/lib/server/log.ts | 11 ++++++----- webapps/console/middleware.ts | 4 ++-- webapps/console/pages/api/admin/catalog-refresh.ts | 5 +++-- webapps/console/pages/api/admin/users.ts | 5 +++-- webapps/console/pages/api/fb-auth/create-session.ts | 4 ++-- webapps/console/pages/api/fb-auth/revoke-session.ts | 4 ++-- webapps/console/pages/api/healthcheck/index.ts | 4 ++-- webapps/console/pages/api/me.ts | 5 +++-- webapps/console/pages/api/s/batch.ts | 5 +++-- .../pages/api/workspace/[workspaceIdOrSlug]/index.ts | 4 ++-- webapps/console/scripts/password-hash.ts | 5 +++-- webapps/ee-api/lib/auth.ts | 5 +++-- webapps/ee-api/lib/error-handler.ts | 5 +++-- webapps/ee-api/lib/firebase-auth.ts | 5 +++-- webapps/ee-api/lib/log.ts | 11 +++++++++++ webapps/ee-api/lib/services.ts | 7 ++++--- webapps/ee-api/lib/store.ts | 5 +++-- webapps/ee-api/lib/stripe.ts | 3 ++- webapps/ee-api/pages/api/billing/manage.ts | 5 +++-- webapps/ee-api/pages/api/billing/plans.ts | 5 +++-- webapps/ee-api/pages/api/billing/settings.ts | 5 +++-- webapps/ee-api/pages/api/billing/upgrade.ts | 5 +++-- webapps/ee-api/pages/api/domain.ts | 5 +++-- webapps/ee-api/pages/api/healthcheck/index.ts | 4 ++-- webapps/ee-api/pages/api/is-active.ts | 4 ++-- webapps/ee-api/pages/api/provision-db.ts | 5 +++-- webapps/ee-api/pages/api/quotas/sync.ts | 5 +++-- webapps/ee-api/pages/api/report/overage.ts | 5 +++-- webapps/ee-api/pages/api/report/workspace-stat.ts | 5 +++-- webapps/ee-api/pages/api/s3-init.ts | 5 +++-- 34 files changed, 106 insertions(+), 70 deletions(-) create mode 100644 webapps/ee-api/lib/log.ts diff --git a/libs/juava/src/log.ts b/libs/juava/src/log.ts index 5b7ac21fd..5b0881f96 100644 --- a/libs/juava/src/log.ts +++ b/libs/juava/src/log.ts @@ -16,7 +16,7 @@ function getComponent() { } let globalLogLevel: LogLevel = "info" as LogLevel; -let enableServerLogsColoring: boolean = true; +let enableServerLogsColoring: boolean = false; let enableJsonFormat: boolean = false; export function setGlobalLogLevel(level: LogLevel) { diff --git a/webapps/console/lib/domains.ts b/webapps/console/lib/domains.ts index 42b252beb..c299a9d2b 100644 --- a/webapps/console/lib/domains.ts +++ b/webapps/console/lib/domains.ts @@ -1,11 +1,12 @@ import { NextApiRequest } from "next"; -import { getErrorMessage, getLog } from "juava"; +import { getErrorMessage } from "juava"; import { IngestType } from "@jitsu/protocols/async-request"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; +import { getServerLog } from "./server/log"; export type HttpProtocolVariant = "https" | "http"; -export const log = getLog("domains"); +export const log = getServerLog("domains"); export type PublicEndpoint = { //always without port diff --git a/webapps/console/lib/nextauth.config.ts b/webapps/console/lib/nextauth.config.ts index 9a797e4ac..68f99ffb0 100644 --- a/webapps/console/lib/nextauth.config.ts +++ b/webapps/console/lib/nextauth.config.ts @@ -3,12 +3,13 @@ import GoogleProvider from "next-auth/providers/google"; import CredentialsProvider from "next-auth/providers/credentials"; import { NextAuthOptions, User } from "next-auth"; import { db } from "./server/db"; -import { checkHash, getLog, requireDefined } from "juava"; +import { checkHash, requireDefined } from "juava"; import { ApiError } from "./shared/errors"; +import { getServerLog } from "./server/log"; const crypto = require("crypto"); -const log = getLog("auth"); +const log = getServerLog("auth"); const googleProvider = GoogleProvider({ clientId: "942257799287-a7jjl052dugnfav58ij8lihq17o9mc41.apps.googleusercontent.com", @@ -96,7 +97,7 @@ function generateSecret(base: (string | undefined)[]) { const hash = crypto.createHash("sha256"); hash.update(base.map(s => s || "empty").join(":")); const secretKey = hash.digest("hex"); - getLog().atInfo().log("Using autogenerated JWT key", secretKey); + log.atInfo().log("Using autogenerated JWT key", secretKey); return secretKey; } diff --git a/webapps/console/lib/server/firebase-server.ts b/webapps/console/lib/server/firebase-server.ts index 948436183..c488be7f7 100644 --- a/webapps/console/lib/server/firebase-server.ts +++ b/webapps/console/lib/server/firebase-server.ts @@ -3,7 +3,8 @@ import { NextApiRequest } from "next"; import * as admin from "firebase-admin"; import * as JSON5 from "json5"; -import { getErrorMessage, getLog, getSingleton, requireDefined, Singleton } from "juava"; +import { getErrorMessage, getSingleton, requireDefined, Singleton } from "juava"; +import { getServerLog } from "./log"; export type FirebaseOptions = { admin: any; @@ -94,7 +95,7 @@ export async function getFirebaseUser(req: NextApiRequest, checkRevoked?: boolea //make sure service is initialized await firebaseService.waitInit(); - getLog() + getServerLog() .atDebug() .log(`authToken (${(checkRevoked = !!checkRevoked)}): ${JSON.stringify(authToken)}`); @@ -106,7 +107,7 @@ export async function getFirebaseUser(req: NextApiRequest, checkRevoked?: boolea .auth() .verifySessionCookie(authToken.cookieToken as string, checkRevoked); } catch (e) { - getLog() + getServerLog() .atWarn() .withCause(e) .log(`Failed to verify firebase token: ${getErrorMessage(e)}`); diff --git a/webapps/console/lib/server/log.ts b/webapps/console/lib/server/log.ts index 340431c5c..249a0474b 100644 --- a/webapps/console/lib/server/log.ts +++ b/webapps/console/lib/server/log.ts @@ -1,10 +1,11 @@ import { getLog, LoggerOpts, LogLevel, setGlobalLogLevel, setServerJsonFormat, setServerLogColoring } from "juava"; +setGlobalLogLevel((process.env.LOG_LEVEL || "info") as LogLevel); +setServerLogColoring( + process.env.DISABLE_SERVER_LOGS_ANSI_COLORING !== "true" && process.env.DISABLE_SERVER_LOGS_ANSI_COLORING !== "1" +); +setServerJsonFormat(process.env.LOG_FORMAT === "json"); + export function getServerLog(_opts?: LoggerOpts | string) { - setGlobalLogLevel((process.env.LOG_LEVEL || "info") as LogLevel); - setServerLogColoring( - process.env.DISABLE_SERVER_LOGS_ANSI_COLORING !== "true" && process.env.DISABLE_SERVER_LOGS_ANSI_COLORING !== "1" - ); - setServerJsonFormat(process.env.LOG_FORMAT === "json"); return getLog(_opts); } diff --git a/webapps/console/middleware.ts b/webapps/console/middleware.ts index 34fa03808..90fff0477 100644 --- a/webapps/console/middleware.ts +++ b/webapps/console/middleware.ts @@ -1,6 +1,6 @@ import type { NextRequest } from "next/server"; import { NextResponse } from "next/server"; -import { getLog } from "juava"; +import { getServerLog } from "./lib/server/log"; function isTruish(val: any) { return val === "true" || val === "1" || val === "yes" || val === true || val === 1; @@ -17,7 +17,7 @@ function prettifyBody(body: string) { } } -const log = getLog("request-logger"); +const log = getServerLog("request-logger"); export async function middleware(request: NextRequest) { let response; diff --git a/webapps/console/pages/api/admin/catalog-refresh.ts b/webapps/console/pages/api/admin/catalog-refresh.ts index bd8b9aa54..f5b1db764 100644 --- a/webapps/console/pages/api/admin/catalog-refresh.ts +++ b/webapps/console/pages/api/admin/catalog-refresh.ts @@ -1,9 +1,10 @@ import { createRoute } from "../../../lib/api"; import { db } from "../../../lib/server/db"; -import { assertDefined, assertTrue, getLog, rpc } from "juava"; +import { assertDefined, assertTrue, rpc } from "juava"; import { z } from "zod"; +import { getServerLog } from "../../../lib/server/log"; -const log = getLog("catalog-refresh"); +const log = getServerLog("catalog-refresh"); const yaml = require("js-yaml"); const branch = `master`; const repo = `airbytehq/airbyte`; diff --git a/webapps/console/pages/api/admin/users.ts b/webapps/console/pages/api/admin/users.ts index b315989aa..a9149c57d 100644 --- a/webapps/console/pages/api/admin/users.ts +++ b/webapps/console/pages/api/admin/users.ts @@ -1,10 +1,11 @@ import { getUser } from "../../../lib/api"; import { z } from "zod"; -import { assertDefined, assertTrue, getErrorMessage, getLog, requireDefined } from "juava"; +import { assertDefined, assertTrue, getErrorMessage, requireDefined } from "juava"; import { firebase, isFirebaseEnabled } from "../../../lib/server/firebase-server"; import { db } from "../../../lib/server/db"; import { SessionUser } from "../../../lib/schema"; import { NextApiRequest, NextApiResponse } from "next"; +import { getServerLog } from "../../../lib/server/log"; const ResultUser = z.object({ internalId: z.string().optional(), @@ -76,6 +77,6 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) res.status(200).send({ users }); } catch (e) { res.status(500).send(getErrorMessage(e)); - getLog().atError().withCause(e).log("Error obtaining list of platform users"); + getServerLog().atError().withCause(e).log("Error obtaining list of platform users"); } } diff --git a/webapps/console/pages/api/fb-auth/create-session.ts b/webapps/console/pages/api/fb-auth/create-session.ts index 24679cd3b..8e018e211 100644 --- a/webapps/console/pages/api/fb-auth/create-session.ts +++ b/webapps/console/pages/api/fb-auth/create-session.ts @@ -1,13 +1,13 @@ import { Api, inferUrl, nextJsApiHandler } from "../../../lib/api"; -import { getLog } from "juava"; import { z } from "zod"; import { createSessionCookie, firebaseAuthCookieName } from "../../../lib/server/firebase-server"; import { ApiError } from "../../../lib/shared/errors"; import { CookieSerializeOptions, serialize } from "cookie"; import { getAppEndpoint } from "../../../lib/domains"; import { getRequestHost, getTopLevelDomain } from "../../../lib/server/origin"; +import { getServerLog } from "../../../lib/server/log"; -export const log = getLog("firebase"); +export const log = getServerLog("firebase"); export const api: Api = { url: inferUrl(__filename), diff --git a/webapps/console/pages/api/fb-auth/revoke-session.ts b/webapps/console/pages/api/fb-auth/revoke-session.ts index 550245a7f..c98054d46 100644 --- a/webapps/console/pages/api/fb-auth/revoke-session.ts +++ b/webapps/console/pages/api/fb-auth/revoke-session.ts @@ -1,10 +1,10 @@ import { createRoute } from "../../../lib/api"; -import { getLog } from "juava"; import { firebaseAuthCookieName, signOut } from "../../../lib/server/firebase-server"; import { serialize } from "cookie"; import { getAppEndpoint } from "../../../lib/domains"; +import { getServerLog } from "../../../lib/server/log"; -export const log = getLog("firebase"); +export const log = getServerLog("firebase"); export default createRoute() .GET({ auth: true }) diff --git a/webapps/console/pages/api/healthcheck/index.ts b/webapps/console/pages/api/healthcheck/index.ts index f8326978e..d12ff8562 100644 --- a/webapps/console/pages/api/healthcheck/index.ts +++ b/webapps/console/pages/api/healthcheck/index.ts @@ -1,7 +1,7 @@ import { NextApiRequest, NextApiResponse } from "next"; import { db } from "../../../lib/server/db"; -import { getLog } from "juava"; import { redis } from "../../../lib/server/redis"; +import { getServerLog } from "../../../lib/server/log"; const healthChecks: Record Promise> = { prisma: async () => { @@ -18,7 +18,7 @@ const healthChecks: Record Promise> = { }, }; -const log = getLog("healthcheck"); +const log = getServerLog("healthcheck"); export default async function handler(req: NextApiRequest, res: NextApiResponse) { const result: Record = {}; diff --git a/webapps/console/pages/api/me.ts b/webapps/console/pages/api/me.ts index 8c4221f31..4ddaf3926 100644 --- a/webapps/console/pages/api/me.ts +++ b/webapps/console/pages/api/me.ts @@ -1,8 +1,9 @@ import { NextApiRequest, NextApiResponse } from "next"; import { getUser } from "../../lib/api"; -import { getLog, requireDefined } from "juava"; +import { requireDefined } from "juava"; import { getRequestHost, getTopLevelDomain } from "../../lib/server/origin"; import { db } from "../../lib/server/db"; +import { getServerLog } from "../../lib/server/log"; const allowedOrigins = process.env.ALLOWED_API_ORIGINS || "*.[originTopLevelDomain],[originTopLevelDomain]"; @@ -32,7 +33,7 @@ function handleCors(requestDomain: string, origin: string | undefined, res: Next .split(",") .map(mask => mask.replaceAll("[originTopLevelDomain]", topLevelDomain)); if (!compiledMasks.map(getMatcher).find(matcher => matcher(originHost))) { - getLog() + getServerLog() .atError() .log( `CORS error - origin ${origin} is not allowed. Masks: ${allowedOrigins} (compiled: ${compiledMasks}), request domain: ${requestDomain}, top level domain: ${topLevelDomain}` diff --git a/webapps/console/pages/api/s/batch.ts b/webapps/console/pages/api/s/batch.ts index 6d08c1948..b1b48b65a 100644 --- a/webapps/console/pages/api/s/batch.ts +++ b/webapps/console/pages/api/s/batch.ts @@ -2,9 +2,10 @@ import { createRoute } from "../../../lib/api"; import { redis } from "../../../lib/server/redis"; import { ApiError } from "../../../lib/shared/errors"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; -import { getErrorMessage, getLog } from "juava"; +import { getErrorMessage } from "juava"; import { patchEvent, sendEventToBulker, setResponseHeaders } from "./[...type]"; import { z } from "zod"; +import { getServerLog } from "../../../lib/server/log"; export default createRoute() .POST({ @@ -37,7 +38,7 @@ export default createRoute() await sendEventToBulker(req, ingestType, event); okEvents++; } catch (e) { - getLog().atWarn().log(`Failed to process event ${i} / ${size} `, e); + getServerLog().atWarn().log(`Failed to process event ${i} / ${size} `, e); errors.push(getErrorMessage(e)); } } diff --git a/webapps/console/pages/api/workspace/[workspaceIdOrSlug]/index.ts b/webapps/console/pages/api/workspace/[workspaceIdOrSlug]/index.ts index 93193b214..9ced8a710 100644 --- a/webapps/console/pages/api/workspace/[workspaceIdOrSlug]/index.ts +++ b/webapps/console/pages/api/workspace/[workspaceIdOrSlug]/index.ts @@ -3,8 +3,8 @@ import { z } from "zod"; import { db } from "../../../../lib/server/db"; import { ApiError } from "../../../../lib/shared/errors"; import { getUserPreferenceService } from "../../../../lib/server/user-preferences"; -import { getLog } from "juava"; -const log = getLog(); +import { getServerLog } from "../../../../lib/server/log"; +const log = getServerLog(); export const api: Api = { url: inferUrl(__filename), GET: { diff --git a/webapps/console/scripts/password-hash.ts b/webapps/console/scripts/password-hash.ts index e9859eca7..592b13da2 100644 --- a/webapps/console/scripts/password-hash.ts +++ b/webapps/console/scripts/password-hash.ts @@ -1,7 +1,8 @@ import minimist from "minimist"; -import { createHash, getLog, randomId } from "juava"; +import { createHash, randomId } from "juava"; +import { getServerLog } from "../lib/server/log"; -const log = getLog("password-hash"); +const log = getServerLog("password-hash"); async function main(): Promise { const args = minimist(process.argv.slice(2)); diff --git a/webapps/ee-api/lib/auth.ts b/webapps/ee-api/lib/auth.ts index 3cb2b5867..b7d10f99e 100644 --- a/webapps/ee-api/lib/auth.ts +++ b/webapps/ee-api/lib/auth.ts @@ -1,12 +1,13 @@ import { NextApiRequest, NextApiResponse } from "next"; -import { assertDefined, createAuthorized, getLog, newError, requireDefined } from "juava"; +import { assertDefined, createAuthorized, newError, requireDefined } from "juava"; import jwt from "jsonwebtoken"; import * as process from "process"; +import { getServerLog } from "./log"; const bearerPrefix = "Bearer "; -const log = getLog("auth"); +const log = getServerLog("auth"); const adminAuthorizer = createAuthorized(process.env.EE_API_AUTH_TOKENS || ""); diff --git a/webapps/ee-api/lib/error-handler.ts b/webapps/ee-api/lib/error-handler.ts index 075aff41b..0f6710349 100644 --- a/webapps/ee-api/lib/error-handler.ts +++ b/webapps/ee-api/lib/error-handler.ts @@ -1,7 +1,8 @@ -import { getErrorMessage, getLog } from "juava"; +import { getErrorMessage } from "juava"; import { NextApiHandler } from "next"; +import { getServerLog } from "./log"; -const log = getLog("api-error"); +const log = getServerLog("api-error"); export function withErrorHandler(handler: NextApiHandler): NextApiHandler { return async (req, res) => { diff --git a/webapps/ee-api/lib/firebase-auth.ts b/webapps/ee-api/lib/firebase-auth.ts index eeecdd0c3..b84ee18b7 100644 --- a/webapps/ee-api/lib/firebase-auth.ts +++ b/webapps/ee-api/lib/firebase-auth.ts @@ -1,8 +1,9 @@ import { NextApiRequest, NextApiResponse } from "next"; -import { assertDefined, getErrorMessage, getLog, getSingleton, newError, requireDefined, Singleton } from "juava"; +import { getErrorMessage, getSingleton, requireDefined, Singleton } from "juava"; import * as admin from "firebase-admin"; import * as JSON5 from "json5"; +import { getServerLog } from "./log"; const bearerPrefix = "bearer "; @@ -10,7 +11,7 @@ export const firebaseAuthCookieName = "fb-auth2"; export type FirebaseToken = { idToken: string; cookieToken?: never } | { idToken?: never; cookieToken: string }; -const log = getLog("firebase-auth"); +const log = getServerLog("firebase-auth"); export type FirebaseOptions = { admin: any; diff --git a/webapps/ee-api/lib/log.ts b/webapps/ee-api/lib/log.ts new file mode 100644 index 000000000..249a0474b --- /dev/null +++ b/webapps/ee-api/lib/log.ts @@ -0,0 +1,11 @@ +import { getLog, LoggerOpts, LogLevel, setGlobalLogLevel, setServerJsonFormat, setServerLogColoring } from "juava"; + +setGlobalLogLevel((process.env.LOG_LEVEL || "info") as LogLevel); +setServerLogColoring( + process.env.DISABLE_SERVER_LOGS_ANSI_COLORING !== "true" && process.env.DISABLE_SERVER_LOGS_ANSI_COLORING !== "1" +); +setServerJsonFormat(process.env.LOG_FORMAT === "json"); + +export function getServerLog(_opts?: LoggerOpts | string) { + return getLog(_opts); +} diff --git a/webapps/ee-api/lib/services.ts b/webapps/ee-api/lib/services.ts index 3633afd34..197f4f9d0 100644 --- a/webapps/ee-api/lib/services.ts +++ b/webapps/ee-api/lib/services.ts @@ -1,9 +1,10 @@ -import { getErrorMessage, getLog, getSingleton, requireDefined } from "juava"; +import { getErrorMessage, getSingleton, requireDefined } from "juava"; import { createPg, getPostgresStore } from "./store"; import { createClient } from "@clickhouse/client"; import { S3Client } from "@aws-sdk/client-s3"; import PG from "pg"; +import { getServerLog } from "./log"; const dbUrl = requireDefined( process.env.EE_DATABASE_URL || process.env.DATABASE_URL, @@ -13,7 +14,7 @@ const dbUrl = requireDefined( export const pg = getSingleton("postgres", () => createPg(dbUrl, { connectionName: "kvstore" })); export const store = getSingleton("pgstore", async () => { - getLog().atInfo().log("Initializing postgres store (pgstore) - initializing postgres pool"); + getServerLog().atInfo().log("Initializing postgres store (pgstore) - initializing postgres pool"); let pgPool: PG.Pool; try { pgPool = await pg.waitInit(); @@ -21,7 +22,7 @@ export const store = getSingleton("pgstore", async () => { const msg = `Failed to initialize postgres pool: ${getErrorMessage(e)}`; throw new Error(msg); } - getLog().atInfo().log("Postgres connection pool initialized - initializing kvstore"); + getServerLog().atInfo().log("Postgres connection pool initialized - initializing kvstore"); try { return getPostgresStore(pgPool, { tableName: "kvstore" }); } catch (e) { diff --git a/webapps/ee-api/lib/store.ts b/webapps/ee-api/lib/store.ts index 39a2801a3..c83f1a135 100644 --- a/webapps/ee-api/lib/store.ts +++ b/webapps/ee-api/lib/store.ts @@ -1,7 +1,8 @@ -import { assertDefined, getErrorMessage, getLog } from "juava"; +import { assertDefined, getErrorMessage } from "juava"; import * as PG from "pg"; +import { getServerLog } from "./log"; -const log = getLog("store"); +const log = getServerLog("store"); /** * Key value table with hash-map interface diff --git a/webapps/ee-api/lib/stripe.ts b/webapps/ee-api/lib/stripe.ts index e35d9e717..365f8f537 100644 --- a/webapps/ee-api/lib/stripe.ts +++ b/webapps/ee-api/lib/stripe.ts @@ -28,7 +28,8 @@ export async function getOrCreateCurrentSubscription( if (!stripeOptions) { const email = userEmail(); const newCustomer = await stripe.customers.create({ email }); - await store().getTable(stripeDataTable).put(workspaceId, { stripeCustomerId: newCustomer.id }); + const st = await store.waitInit(); + await st.getTable(stripeDataTable).put(workspaceId, { stripeCustomerId: newCustomer.id }); stripeOptions = { stripeCustomerId: newCustomer.id }; } if (opts.changeEmail) { diff --git a/webapps/ee-api/pages/api/billing/manage.ts b/webapps/ee-api/pages/api/billing/manage.ts index 84554f792..ba5d52e7a 100644 --- a/webapps/ee-api/pages/api/billing/manage.ts +++ b/webapps/ee-api/pages/api/billing/manage.ts @@ -1,11 +1,12 @@ import { NextApiRequest, NextApiResponse } from "next"; import { auth } from "../../../lib/auth"; -import { getLog, requireDefined } from "juava"; +import { requireDefined } from "juava"; import { withErrorHandler } from "../../../lib/error-handler"; import { getOrCreatePortalConfiguration, getOrCreateCurrentSubscription, stripe } from "../../../lib/stripe"; import { store } from "../../../lib/services"; +import { getServerLog } from "../../../lib/log"; -const log = getLog("/api/billing/manager"); +const log = getServerLog("/api/billing/manager"); export type SuccessfullResponse = { ok: true; diff --git a/webapps/ee-api/pages/api/billing/plans.ts b/webapps/ee-api/pages/api/billing/plans.ts index 3853539ef..86f2fa7de 100644 --- a/webapps/ee-api/pages/api/billing/plans.ts +++ b/webapps/ee-api/pages/api/billing/plans.ts @@ -2,12 +2,13 @@ import { NextApiRequest, NextApiResponse } from "next"; import { store } from "../../../lib/services"; import { auth } from "../../../lib/auth"; import { getAvailableProducts, getOrCreateCurrentSubscription, stripe } from "../../../lib/stripe"; -import { getLog, requireDefined } from "juava"; +import { requireDefined } from "juava"; import { withErrorHandler } from "../../../lib/error-handler"; import omit from "lodash/omit"; +import { getServerLog } from "../../../lib/log"; -const log = getLog("/api/billing/create"); +const log = getServerLog("/api/billing/create"); export type ErrorResponse = { ok: false; diff --git a/webapps/ee-api/pages/api/billing/settings.ts b/webapps/ee-api/pages/api/billing/settings.ts index 690827184..c44dcbd5b 100644 --- a/webapps/ee-api/pages/api/billing/settings.ts +++ b/webapps/ee-api/pages/api/billing/settings.ts @@ -1,11 +1,12 @@ import { NextApiRequest, NextApiResponse } from "next"; import { auth } from "../../../lib/auth"; -import { getLog, requireDefined } from "juava"; +import { requireDefined } from "juava"; import { withErrorHandler } from "../../../lib/error-handler"; import { SubscriptionStatus, getOrCreateCurrentSubscription } from "../../../lib/stripe"; import { store } from "../../../lib/services"; +import { getServerLog } from "../../../lib/log"; -const log = getLog("/api/billing/settings"); +const log = getServerLog("/api/billing/settings"); export type SuccessfullResponse = { ok: true; diff --git a/webapps/ee-api/pages/api/billing/upgrade.ts b/webapps/ee-api/pages/api/billing/upgrade.ts index eb837f3f0..dabefdaf8 100644 --- a/webapps/ee-api/pages/api/billing/upgrade.ts +++ b/webapps/ee-api/pages/api/billing/upgrade.ts @@ -2,10 +2,11 @@ import { NextApiRequest, NextApiResponse } from "next"; import { store } from "../../../lib/services"; import { auth } from "../../../lib/auth"; import { getAvailableProducts, getOrCreateCurrentSubscription, stripe } from "../../../lib/stripe"; -import { getLog, requireDefined } from "juava"; +import { requireDefined } from "juava"; import { withErrorHandler } from "../../../lib/error-handler"; +import { getServerLog } from "../../../lib/log"; -const log = getLog("/api/billing/create"); +const log = getServerLog("/api/billing/create"); export type ErrorResponse = { ok: false; diff --git a/webapps/ee-api/pages/api/domain.ts b/webapps/ee-api/pages/api/domain.ts index 3bdfa8db6..67439b354 100644 --- a/webapps/ee-api/pages/api/domain.ts +++ b/webapps/ee-api/pages/api/domain.ts @@ -1,12 +1,13 @@ import type { NextApiRequest, NextApiResponse } from "next"; import { auth } from "../../lib/auth"; -import { getErrorMessage, getLog, requireDefined } from "juava"; +import { getErrorMessage, requireDefined } from "juava"; import fetch from "node-fetch-commonjs"; import { withErrorHandler } from "../../lib/error-handler"; import isValidDomain from "is-valid-domain"; +import { getServerLog } from "../../lib/log"; -const log = getLog("/api/domain"); +const log = getServerLog("/api/domain"); const vercelProjectId = requireDefined( process.env.DOMAINS_VERCEL_PROJECT_ID, diff --git a/webapps/ee-api/pages/api/healthcheck/index.ts b/webapps/ee-api/pages/api/healthcheck/index.ts index 3f65182a3..6a8326138 100644 --- a/webapps/ee-api/pages/api/healthcheck/index.ts +++ b/webapps/ee-api/pages/api/healthcheck/index.ts @@ -1,7 +1,7 @@ import { NextApiRequest, NextApiResponse } from "next"; -import { getLog } from "juava"; import { pg, store, clickhouse, telemetryDb, s3client } from "../../../lib/services"; import { ListBucketsCommand } from "@aws-sdk/client-s3"; +import { getServerLog } from "../../../lib/log"; const healthChecks: Record Promise> = { postgres: async () => { @@ -28,7 +28,7 @@ const healthChecks: Record Promise> = { }, }; -const log = getLog("healthcheck"); +const log = getServerLog("healthcheck"); export default async function handler(req: NextApiRequest, res: NextApiResponse) { const result: Record = {}; diff --git a/webapps/ee-api/pages/api/is-active.ts b/webapps/ee-api/pages/api/is-active.ts index 81030082a..ca4977c86 100644 --- a/webapps/ee-api/pages/api/is-active.ts +++ b/webapps/ee-api/pages/api/is-active.ts @@ -1,10 +1,10 @@ import { NextApiRequest, NextApiResponse } from "next"; -import { getLog } from "juava"; import { auth } from "../../lib/firebase-auth"; import { withErrorHandler } from "../../lib/error-handler"; import { telemetryDb } from "../../lib/services"; +import { getServerLog } from "../../lib/log"; -const log = getLog("/api/is-active"); +const log = getServerLog("/api/is-active"); const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { res.setHeader("Access-Control-Allow-Origin", req.headers.origin || "*"); diff --git a/webapps/ee-api/pages/api/provision-db.ts b/webapps/ee-api/pages/api/provision-db.ts index 8082cec5e..820e48b1d 100644 --- a/webapps/ee-api/pages/api/provision-db.ts +++ b/webapps/ee-api/pages/api/provision-db.ts @@ -1,10 +1,11 @@ import { NextApiRequest, NextApiResponse } from "next"; import { auth } from "../../lib/auth"; -import { assertTrue, getLog, randomId, requireDefined } from "juava"; +import { assertTrue, randomId, requireDefined } from "juava"; import { withErrorHandler } from "../../lib/error-handler"; import { clickhouse, store } from "../../lib/services"; +import { getServerLog } from "../../lib/log"; -export const log = getLog("provision-db"); +export const log = getServerLog("provision-db"); export type Credentials = { username: string; diff --git a/webapps/ee-api/pages/api/quotas/sync.ts b/webapps/ee-api/pages/api/quotas/sync.ts index 6ca0f4b59..55fac1d76 100644 --- a/webapps/ee-api/pages/api/quotas/sync.ts +++ b/webapps/ee-api/pages/api/quotas/sync.ts @@ -1,10 +1,11 @@ import { NextApiRequest, NextApiResponse } from "next"; import { auth } from "../../../lib/auth"; -import { assertTrue, getLog, requireDefined } from "juava"; +import { assertTrue, requireDefined } from "juava"; import { withErrorHandler } from "../../../lib/error-handler"; import { getOrCreateCurrentSubscription } from "../../../lib/stripe"; import { pg as pgService } from "../../../lib/services"; import { query } from "../report/workspace-stat"; +import { getServerLog } from "../../../lib/log"; //A little copy-paste doesn't hurt //Values should be the same as in BillingSettings from webapps/console/lib/schema/index.ts @@ -39,7 +40,7 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse group by "workspaceId";`, { workspaceId } ); - getLog() + getServerLog() .atInfo() .log(`Quota check for ${workspaceId}: ${JSON.stringify(res, null, 2)}`); if (res.length == 0) { diff --git a/webapps/ee-api/pages/api/report/overage.ts b/webapps/ee-api/pages/api/report/overage.ts index 0931e9479..db85767a2 100644 --- a/webapps/ee-api/pages/api/report/overage.ts +++ b/webapps/ee-api/pages/api/report/overage.ts @@ -1,5 +1,5 @@ import type { NextApiRequest, NextApiResponse } from "next"; -import { assertTrue, getLog } from "juava"; +import { assertTrue } from "juava"; import { withErrorHandler } from "../../../lib/error-handler"; import { auth } from "../../../lib/auth"; import { store } from "../../../lib/services"; @@ -7,8 +7,9 @@ import { getAvailableProducts, stripe, stripeDataTable } from "../../../lib/stri import Stripe from "stripe"; import pick from "lodash/pick"; import { buildWorkspaceReport } from "./workspace-stat"; +import { getServerLog } from "../../../lib/log"; -const log = getLog("/api/report"); +const log = getServerLog("/api/report"); function toUTC(date: Date | string) { const dateObj = new Date(date); diff --git a/webapps/ee-api/pages/api/report/workspace-stat.ts b/webapps/ee-api/pages/api/report/workspace-stat.ts index fd2327f49..27eb041c5 100644 --- a/webapps/ee-api/pages/api/report/workspace-stat.ts +++ b/webapps/ee-api/pages/api/report/workspace-stat.ts @@ -1,11 +1,12 @@ import type { NextApiRequest, NextApiResponse } from "next"; -import { getLog, namedParameters, SqlQueryParameters, unrollParams } from "juava"; +import { namedParameters, SqlQueryParameters, unrollParams } from "juava"; import { withErrorHandler } from "../../../lib/error-handler"; import { auth } from "../../../lib/auth"; import { clickhouse, pg } from "../../../lib/services"; import * as PG from "pg"; +import { getServerLog } from "../../../lib/log"; -const log = getLog("/api/report"); +const log = getServerLog("/api/report"); const workspaceStatSql = require("../../../lib/sql/workspace-info.sql").default; diff --git a/webapps/ee-api/pages/api/s3-init.ts b/webapps/ee-api/pages/api/s3-init.ts index 99c6f5105..835cfe7dd 100644 --- a/webapps/ee-api/pages/api/s3-init.ts +++ b/webapps/ee-api/pages/api/s3-init.ts @@ -1,11 +1,12 @@ import { NextApiRequest, NextApiResponse } from "next"; import { auth } from "../../lib/auth"; -import { assertTrue, getLog, requireDefined } from "juava"; +import { assertTrue, requireDefined } from "juava"; import { withErrorHandler } from "../../lib/error-handler"; import { s3client, store } from "../../lib/services"; import { CreateBucketCommand, CreateBucketCommandInput } from "@aws-sdk/client-s3"; +import { getServerLog } from "../../lib/log"; -export const log = getLog("s3-bucket-init"); +export const log = getServerLog("s3-bucket-init"); export type Credentials = { accessKeyId: string; From 092d98b7f34a9c6a5fbbf6c94a4af1537e7e367f Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 29 Sep 2023 14:37:42 +0400 Subject: [PATCH 0217/1353] juava: rpc: use console.error for error reporting --- libs/juava/src/rpc.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/juava/src/rpc.ts b/libs/juava/src/rpc.ts index 898455dc5..bbd3fd71d 100644 --- a/libs/juava/src/rpc.ts +++ b/libs/juava/src/rpc.ts @@ -87,7 +87,7 @@ export const rpc: RpcFunc = async (url, { body, ...rest } = {}) => { let errorText = await getErrorText(result); const errorJson = tryJson(errorText); const message = `Error ${result.status} on ${method} ${url}`; - console.log(message, errorJson); + console.error(message, errorJson); throw typeof errorJson === "string" ? new Error(`${message}: ${errorJson}`) : new ApiResponseError(message, errorJson, { From ba0f86c895af95bd50bb46309abc4658928ea792 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 29 Sep 2023 16:17:09 +0400 Subject: [PATCH 0218/1353] Fix for `The pgstore connection isn't ready yet` --- webapps/ee-api/lib/stripe.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webapps/ee-api/lib/stripe.ts b/webapps/ee-api/lib/stripe.ts index 365f8f537..3160c49c1 100644 --- a/webapps/ee-api/lib/stripe.ts +++ b/webapps/ee-api/lib/stripe.ts @@ -24,11 +24,11 @@ export async function getOrCreateCurrentSubscription( userEmail: () => string, opts: { changeEmail?: boolean } = {} ): Promise<{ stripeCustomerId: string; noRestrictions?: boolean; subscriptionStatus: SubscriptionStatus }> { - let stripeOptions = await store().getTable(stripeDataTable).get(workspaceId); + const st = await store.waitInit(); + let stripeOptions = await st.getTable(stripeDataTable).get(workspaceId); if (!stripeOptions) { const email = userEmail(); const newCustomer = await stripe.customers.create({ email }); - const st = await store.waitInit(); await st.getTable(stripeDataTable).put(workspaceId, { stripeCustomerId: newCustomer.id }); stripeOptions = { stripeCustomerId: newCustomer.id }; } From e1e866577a16b6def309c015e8e9fee6ded0d7af Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 29 Sep 2023 18:00:42 +0400 Subject: [PATCH 0219/1353] bring back 'fix: get rid of all singletons in EE server' --- webapps/ee-api/lib/services.ts | 55 +++++-------------- webapps/ee-api/lib/store.ts | 34 ++++++++---- webapps/ee-api/lib/stripe.ts | 5 +- webapps/ee-api/pages/api/billing/manage.ts | 2 - webapps/ee-api/pages/api/billing/plans.ts | 3 - webapps/ee-api/pages/api/billing/settings.ts | 2 - webapps/ee-api/pages/api/billing/upgrade.ts | 2 - webapps/ee-api/pages/api/healthcheck/index.ts | 14 ++--- webapps/ee-api/pages/api/is-active.ts | 3 +- webapps/ee-api/pages/api/provision-db.ts | 16 +++--- webapps/ee-api/pages/api/quotas/sync.ts | 3 +- webapps/ee-api/pages/api/report/overage.ts | 4 +- .../ee-api/pages/api/report/workspace-stat.ts | 15 ++--- webapps/ee-api/pages/api/s3-init.ts | 8 +-- 14 files changed, 65 insertions(+), 101 deletions(-) diff --git a/webapps/ee-api/lib/services.ts b/webapps/ee-api/lib/services.ts index 197f4f9d0..f11a6b39f 100644 --- a/webapps/ee-api/lib/services.ts +++ b/webapps/ee-api/lib/services.ts @@ -1,55 +1,30 @@ -import { getErrorMessage, getSingleton, requireDefined } from "juava"; +import { requireDefined } from "juava"; import { createPg, getPostgresStore } from "./store"; import { createClient } from "@clickhouse/client"; import { S3Client } from "@aws-sdk/client-s3"; -import PG from "pg"; -import { getServerLog } from "./log"; - const dbUrl = requireDefined( process.env.EE_DATABASE_URL || process.env.DATABASE_URL, "nor EE_DATABASE_URL, neither DATABASE_URL is not defined" ); -export const pg = getSingleton("postgres", () => createPg(dbUrl, { connectionName: "kvstore" })); +export const pg = createPg(dbUrl, { connectionName: "kvstore" }); -export const store = getSingleton("pgstore", async () => { - getServerLog().atInfo().log("Initializing postgres store (pgstore) - initializing postgres pool"); - let pgPool: PG.Pool; - try { - pgPool = await pg.waitInit(); - } catch (e) { - const msg = `Failed to initialize postgres pool: ${getErrorMessage(e)}`; - throw new Error(msg); - } - getServerLog().atInfo().log("Postgres connection pool initialized - initializing kvstore"); - try { - return getPostgresStore(pgPool, { tableName: "kvstore" }); - } catch (e) { - const msg = `Failed to initialize kv store: ${getErrorMessage(e)}`; - throw new Error(msg); - } -}); +export const store = getPostgresStore(pg, { tableName: "kvstore" }); -export const telemetryDb = getSingleton("telemetry_db", () => - createPg(process.env.TELEMETRY_DATABASE_URL || dbUrl, { connectionName: "telemetry" }) -); +export const telemetryDb = createPg(process.env.TELEMETRY_DATABASE_URL || dbUrl, { connectionName: "telemetry" }); -export const clickhouse = getSingleton("clickhouse", () => { - return createClient({ - host: requireDefined(process.env.CLICKHOUSE_URL, `env CLICKHOUSE_URL is not defined`), - username: process.env.CLICKHOUSE_USERNAME || "default", - password: requireDefined(process.env.CLICKHOUSE_PASSWORD, `env CLICKHOUSE_PASSWORD is not defined`), - }); +export const clickhouse = createClient({ + host: requireDefined(process.env.CLICKHOUSE_URL, `env CLICKHOUSE_URL is not defined`), + username: process.env.CLICKHOUSE_USERNAME || "default", + password: requireDefined(process.env.CLICKHOUSE_PASSWORD, `env CLICKHOUSE_PASSWORD is not defined`), }); -export const s3client = getSingleton("s3client", () => { - return new S3Client({ - region: requireDefined(process.env.S3_REGION, `env S3_REGION is not defined`), - credentials: { - accessKeyId: requireDefined(process.env.S3_ACCESS_KEY_ID, `env S3_ACCESS_KEY_ID is not defined`), - secretAccessKey: requireDefined(process.env.S3_SECRET_ACCESS_KEY, `env S3_SECRET_ACCESS_KEY is not defined`), - }, - endpoint: process.env.S3_ENDPOINT || undefined, - }); +export const s3client = new S3Client({ + region: requireDefined(process.env.S3_REGION, `env S3_REGION is not defined`), + credentials: { + accessKeyId: requireDefined(process.env.S3_ACCESS_KEY_ID, `env S3_ACCESS_KEY_ID is not defined`), + secretAccessKey: requireDefined(process.env.S3_SECRET_ACCESS_KEY, `env S3_SECRET_ACCESS_KEY is not defined`), + }, + endpoint: process.env.S3_ENDPOINT || undefined, }); diff --git a/webapps/ee-api/lib/store.ts b/webapps/ee-api/lib/store.ts index c83f1a135..014b06803 100644 --- a/webapps/ee-api/lib/store.ts +++ b/webapps/ee-api/lib/store.ts @@ -109,7 +109,7 @@ export function createPg(url: string, opts: { defaultSchema?: string; connection `Connecting new client for ${hideSensitiveInfo(url)}${ opts.connectionName ? ` - ${opts.connectionName}` : "" }. Pool stat: idle=${pool.idleCount}, waiting=${pool.waitingCount}, total=${pool.totalCount}` + - (schema ? `. Default sc,hema: ${schema}` : ",") + (schema ? `. Default schema: ${schema}` : ",") ); if (schema) { await client.query(`SET search_path TO "${schema}"`); @@ -121,26 +121,36 @@ export function createPg(url: string, opts: { defaultSchema?: string; connection return pool; } -export async function getPostgresStore( +export function getPostgresStore( postgres: string | PG.Pool, opts: { tableName?: string; schema?: string } = {} -): Promise { +): KeyValueStore { const pgPool = typeof postgres === "string" - ? await createPg(postgres, { defaultSchema: opts.schema, connectionName: "kvstore" }) + ? createPg(postgres, { defaultSchema: opts.schema, connectionName: "kvstore" }) : postgres; const table = opts?.tableName || `kvstore`; - try { - await pgPool.query(schema(table)); - } catch (e: any) { - log.atError().log(`Failed to initialize postgres table storage: ${getErrorMessage(e)} Query: schema(table)`); - throw new Error("Failed to initialize postgres table storage: " + getErrorMessage(e)); - } + + let initialized = false; + + const initIfNeeded = async () => { + if (!initialized) { + try { + await pgPool.query(schema(table)); + } catch (e: any) { + log.atError().log(`Failed to initialize postgres table storage: ${getErrorMessage(e)} Query: schema(table)`); + throw new Error("Failed to initialize postgres table storage: " + getErrorMessage(e)); + } + } + initialized = true; + }; return { getTable(tableName: string): KeyValueTable { return { async list(keyPattern?: string) { + await initIfNeeded(); + maybeDeleteExpiredObjects(pgPool, table); assertDefined(!keyPattern, "keyPattern is not supported yet"); const result = await pgPool.query({ @@ -153,6 +163,7 @@ export async function getPostgresStore( return result.rows.map(({ id, obj }) => ({ id: id as string, obj })); }, async listKeys(keyPattern?: string): Promise { + await initIfNeeded(); maybeDeleteExpiredObjects(pgPool, table); assertDefined(!keyPattern, "keyPattern is not supported yet"); const result = await pgPool.query({ @@ -165,10 +176,12 @@ export async function getPostgresStore( return result.rows.map(({ id }) => id); }, async del(key: string) { + await initIfNeeded(); maybeDeleteExpiredObjects(pgPool, table); await pgPool.query(deleteQuery(table, tableName, key)); }, async get(key: string) { + await initIfNeeded(); maybeDeleteExpiredObjects(pgPool, table); let result = await pgPool.query({ text: `SELECT obj, expire @@ -191,6 +204,7 @@ export async function getPostgresStore( } }, async put(key: string, obj: any, opts: { ttlMs?: number } = {}) { + await initIfNeeded(); maybeDeleteExpiredObjects(pgPool, table); const upsertQuery = ` INSERT INTO ${table} (id, namespace, obj, expire) diff --git a/webapps/ee-api/lib/stripe.ts b/webapps/ee-api/lib/stripe.ts index 3160c49c1..d09a9afbf 100644 --- a/webapps/ee-api/lib/stripe.ts +++ b/webapps/ee-api/lib/stripe.ts @@ -24,12 +24,11 @@ export async function getOrCreateCurrentSubscription( userEmail: () => string, opts: { changeEmail?: boolean } = {} ): Promise<{ stripeCustomerId: string; noRestrictions?: boolean; subscriptionStatus: SubscriptionStatus }> { - const st = await store.waitInit(); - let stripeOptions = await st.getTable(stripeDataTable).get(workspaceId); + let stripeOptions = await store.getTable(stripeDataTable).get(workspaceId); if (!stripeOptions) { const email = userEmail(); const newCustomer = await stripe.customers.create({ email }); - await st.getTable(stripeDataTable).put(workspaceId, { stripeCustomerId: newCustomer.id }); + await store.getTable(stripeDataTable).put(workspaceId, { stripeCustomerId: newCustomer.id }); stripeOptions = { stripeCustomerId: newCustomer.id }; } if (opts.changeEmail) { diff --git a/webapps/ee-api/pages/api/billing/manage.ts b/webapps/ee-api/pages/api/billing/manage.ts index ba5d52e7a..68711527e 100644 --- a/webapps/ee-api/pages/api/billing/manage.ts +++ b/webapps/ee-api/pages/api/billing/manage.ts @@ -3,7 +3,6 @@ import { auth } from "../../../lib/auth"; import { requireDefined } from "juava"; import { withErrorHandler } from "../../../lib/error-handler"; import { getOrCreatePortalConfiguration, getOrCreateCurrentSubscription, stripe } from "../../../lib/stripe"; -import { store } from "../../../lib/services"; import { getServerLog } from "../../../lib/log"; const log = getServerLog("/api/billing/manager"); @@ -19,7 +18,6 @@ export type ErrorResponse = { }; const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { - await store.waitInit(); if (req.method === "OPTIONS") { //allowing requests from everywhere since our tokens are short-lived //and can't be hijacked diff --git a/webapps/ee-api/pages/api/billing/plans.ts b/webapps/ee-api/pages/api/billing/plans.ts index 86f2fa7de..0b48b81d5 100644 --- a/webapps/ee-api/pages/api/billing/plans.ts +++ b/webapps/ee-api/pages/api/billing/plans.ts @@ -1,11 +1,9 @@ import { NextApiRequest, NextApiResponse } from "next"; -import { store } from "../../../lib/services"; import { auth } from "../../../lib/auth"; import { getAvailableProducts, getOrCreateCurrentSubscription, stripe } from "../../../lib/stripe"; import { requireDefined } from "juava"; import { withErrorHandler } from "../../../lib/error-handler"; -import omit from "lodash/omit"; import { getServerLog } from "../../../lib/log"; const log = getServerLog("/api/billing/create"); @@ -28,7 +26,6 @@ type Response = { products: Product[]; }; const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { - await store.waitInit(); if (req.method === "OPTIONS") { //allowing requests from everywhere since our tokens are short-lived //and can't be hijacked diff --git a/webapps/ee-api/pages/api/billing/settings.ts b/webapps/ee-api/pages/api/billing/settings.ts index c44dcbd5b..2ac0b1b7d 100644 --- a/webapps/ee-api/pages/api/billing/settings.ts +++ b/webapps/ee-api/pages/api/billing/settings.ts @@ -3,7 +3,6 @@ import { auth } from "../../../lib/auth"; import { requireDefined } from "juava"; import { withErrorHandler } from "../../../lib/error-handler"; import { SubscriptionStatus, getOrCreateCurrentSubscription } from "../../../lib/stripe"; -import { store } from "../../../lib/services"; import { getServerLog } from "../../../lib/log"; const log = getServerLog("/api/billing/settings"); @@ -21,7 +20,6 @@ export type ErrorResponse = { }; const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { - await store.waitInit(); if (req.method === "OPTIONS") { //allowing requests from everywhere since our tokens are short-lived //and can't be hijacked diff --git a/webapps/ee-api/pages/api/billing/upgrade.ts b/webapps/ee-api/pages/api/billing/upgrade.ts index dabefdaf8..3bee918af 100644 --- a/webapps/ee-api/pages/api/billing/upgrade.ts +++ b/webapps/ee-api/pages/api/billing/upgrade.ts @@ -1,5 +1,4 @@ import { NextApiRequest, NextApiResponse } from "next"; -import { store } from "../../../lib/services"; import { auth } from "../../../lib/auth"; import { getAvailableProducts, getOrCreateCurrentSubscription, stripe } from "../../../lib/stripe"; import { requireDefined } from "juava"; @@ -13,7 +12,6 @@ export type ErrorResponse = { error: string; }; const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { - await store.waitInit(); if (req.method === "OPTIONS") { //allowing requests from everywhere since our tokens are short-lived //and can't be hijacked diff --git a/webapps/ee-api/pages/api/healthcheck/index.ts b/webapps/ee-api/pages/api/healthcheck/index.ts index 6a8326138..a3c8d87ed 100644 --- a/webapps/ee-api/pages/api/healthcheck/index.ts +++ b/webapps/ee-api/pages/api/healthcheck/index.ts @@ -5,23 +5,19 @@ import { getServerLog } from "../../../lib/log"; const healthChecks: Record Promise> = { postgres: async () => { - const pgPool = await pg.waitInit(); - await pgPool.query(`SELECT 1 as pgpool_healthcheck`); + await pg.query(`SELECT 1 as pgpool_healthcheck`); }, clickhouse: async () => { - await clickhouse - .waitInit() - .then(c => c.query({ query: `SELECT 1 as chpool_healthcheck`, clickhouse_settings: { wait_end_of_query: 1 } })); + await clickhouse.query({ query: `SELECT 1 as chpool_healthcheck`, clickhouse_settings: { wait_end_of_query: 1 } }); }, telemetryDb: async () => { - await telemetryDb.waitInit().then(t => t.query(`SELECT 1 as telemetry_healthcheck`)); + await telemetryDb.query(`SELECT 1 as telemetry_healthcheck`); }, s3: async () => { - await s3client.waitInit().then(s => s.send(new ListBucketsCommand({}))); + await s3client.send(new ListBucketsCommand({})); }, pgstore: async () => { - const pgStore = await store.waitInit(); - await pgStore.getTable("last_healthcheck").put("last_healthcheck", { + await store.getTable("last_healthcheck").put("last_healthcheck", { timestamp: new Date().toISOString(), env: process.env, }); diff --git a/webapps/ee-api/pages/api/is-active.ts b/webapps/ee-api/pages/api/is-active.ts index ca4977c86..cb6b98134 100644 --- a/webapps/ee-api/pages/api/is-active.ts +++ b/webapps/ee-api/pages/api/is-active.ts @@ -25,8 +25,7 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse let projectId: string | null = null; let projectName: string | null = null; try { - const pool = await telemetryDb.waitInit(); - const rows = await pool.query("select * from jitsu_configs_users_info where _uid=$1 limit 1", [uid]); + const rows = await telemetryDb.query("select * from jitsu_configs_users_info where _uid=$1 limit 1", [uid]); if (rows.rowCount === 0) { return { ok: true, uid: null, project: null, name: null, active: false }; } else { diff --git a/webapps/ee-api/pages/api/provision-db.ts b/webapps/ee-api/pages/api/provision-db.ts index 820e48b1d..5bd8abde5 100644 --- a/webapps/ee-api/pages/api/provision-db.ts +++ b/webapps/ee-api/pages/api/provision-db.ts @@ -19,7 +19,7 @@ async function createDb(name: string, cluster: string): Promise { let nameCounter = 0; while (true) { const currentName = nameCounter === 0 ? name : `${name}${nameCounter}`; - const resultSet = await clickhouse().query({ + const resultSet = await clickhouse.query({ query: `select count(*) as cnt from system.databases where name = '${currentName}'`, @@ -30,7 +30,7 @@ async function createDb(name: string, cluster: string): Promise { const result = await resultSet.json(); const cnt = (result as any).data[0].cnt; if (cnt === "0") { - const res = await clickhouse() + const res = await clickhouse .query({ query: `CREATE DATABASE ${currentName} ON CLUSTER ${cluster}` }) .then(result => result.text()); log.atInfo().log(`Database ${currentName} created`, res); @@ -48,7 +48,7 @@ async function createUser(name: string, password: string, dbName: string, cluste let nameCounter = 0; while (true) { const currentName = nameCounter === 0 ? name : `${name}${nameCounter}`; - const resultSet = await clickhouse().query({ + const resultSet = await clickhouse.query({ query: `select count(*) as cnt from system.users where name = '${currentName}'`, @@ -61,11 +61,11 @@ async function createUser(name: string, password: string, dbName: string, cluste if (cnt === "0") { const query = `CREATE USER ${currentName} ON CLUSTER ${cluster} IDENTIFIED WITH sha256_password BY '${password}' DEFAULT DATABASE ${dbName}`; log.atDebug().log(`Creating user ${name} with query: ${query}`); - await clickhouse().exec({ query }); + await clickhouse.exec({ query }); log.atInfo().log(`User ${currentName} created`); const grantQuery = `GRANT ON CLUSTER ${cluster} ALL ON ${dbName}.* TO ${currentName}`; log.atDebug().log(`Granting db privileges to user ${name} with query: ${query}`); - await clickhouse().exec({ query: grantQuery }); + await clickhouse.exec({ query: grantQuery }); log.atInfo().log(`Privileges granted to user ${currentName} on db ${dbName}`); return currentName; } else { @@ -80,7 +80,6 @@ async function createUser(name: string, password: string, dbName: string, cluste * for creating a database. It might be slightly different if database name was already taken. */ async function createAccount(credentials: Credentials): Promise { - await clickhouse.waitInit(); const database = await createDb(credentials.database, credentials.cluster); return { username: await createUser(credentials.username, credentials.password, database, credentials.cluster), @@ -99,7 +98,6 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse new URL(requireDefined(process.env.CLICKHOUSE_URL, `CLICKHOUSE_URL or CLICKHOUSE_HOSTS must be defined`)).hostname ); } - await store.waitInit(); const claims = await auth(req, res); if (!claims) { return; @@ -111,7 +109,7 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse claims.type === "admin" || (claims.type === "user" && claims.workspaceId === workspaceId), `Token can't access workspace ${workspaceId}` ); - const credentials = await store().getTable("provisioned-db").get(workspaceId); + const credentials = await store.getTable("provisioned-db").get(workspaceId); if (credentials) { return res.status(200).json({ ...credentials, @@ -125,7 +123,7 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse password: randomId(24), cluster: clickhouseClusterName, }); - await store().getTable("provisioned-db").put(workspaceId, dbCredentials); + await store.getTable("provisioned-db").put(workspaceId, dbCredentials); return { ...dbCredentials, protocol: "clickhouse-secure", diff --git a/webapps/ee-api/pages/api/quotas/sync.ts b/webapps/ee-api/pages/api/quotas/sync.ts index 55fac1d76..4c2d3e5a4 100644 --- a/webapps/ee-api/pages/api/quotas/sync.ts +++ b/webapps/ee-api/pages/api/quotas/sync.ts @@ -3,7 +3,7 @@ import { auth } from "../../../lib/auth"; import { assertTrue, requireDefined } from "juava"; import { withErrorHandler } from "../../../lib/error-handler"; import { getOrCreateCurrentSubscription } from "../../../lib/stripe"; -import { pg as pgService } from "../../../lib/services"; +import { pg } from "../../../lib/services"; import { query } from "../report/workspace-stat"; import { getServerLog } from "../../../lib/log"; @@ -14,7 +14,6 @@ export const freePlanLimitations = { }; const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { - const pg = await pgService.waitInit(); const claims = requireDefined(await auth(req, res), `Auth is required`); const workspaceId = requireDefined(req.query.workspaceId as string, "workspaceId GET param is required"); assertTrue(claims.type === "admin" || claims.workspaceId === workspaceId, "Invalid auth claims"); diff --git a/webapps/ee-api/pages/api/report/overage.ts b/webapps/ee-api/pages/api/report/overage.ts index db85767a2..3ab39fef5 100644 --- a/webapps/ee-api/pages/api/report/overage.ts +++ b/webapps/ee-api/pages/api/report/overage.ts @@ -79,10 +79,10 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse ? [ { id: workspaceId, - obj: await store().getTable(stripeDataTable).get(workspaceId), + obj: await store.getTable(stripeDataTable).get(workspaceId), }, ] - : await store().getTable(stripeDataTable).list(); + : await store.getTable(stripeDataTable).list(); const availableProducts = await getAvailableProducts(); diff --git a/webapps/ee-api/pages/api/report/workspace-stat.ts b/webapps/ee-api/pages/api/report/workspace-stat.ts index 27eb041c5..a7a23e3ac 100644 --- a/webapps/ee-api/pages/api/report/workspace-stat.ts +++ b/webapps/ee-api/pages/api/report/workspace-stat.ts @@ -56,11 +56,9 @@ async function getPostgresPart({ granularity, start, end, workspaceId }: ReportP `; const params = removeUndefined({ start, end, granularity, workspaceId }); const { query, values } = namedParameters(sql, params); - return await pg() - .query({ text: query, values }) - .then(res => { - return res.rows; - }); + return await pg.query({ text: query, values }).then(res => { + return res.rows; + }); } async function getClickhousePart({ @@ -83,7 +81,7 @@ async function getClickhousePart({ group by period, workspaceId order by period desc; `; - const resultSet = await clickhouse().query({ + const resultSet = await clickhouse.query({ query, clickhouse_settings: { wait_end_of_query: 1, @@ -142,7 +140,7 @@ export async function buildWorkspaceReport( } async function extend(reportResult: WorkspaceReportRow[]): Promise { - const workspaceInfo = await query(pg(), workspaceStatSql); + const workspaceInfo = await query(pg, workspaceStatSql); const workspaceInfoMap = workspaceInfo.reduce((acc, w) => { acc[w.workspaceId] = w; return acc; @@ -153,9 +151,6 @@ async function extend(reportResult: WorkspaceReportRow[]): Promise Date: Fri, 29 Sep 2023 18:42:17 +0400 Subject: [PATCH 0220/1353] serve p.js statically --- webapps/console/middleware.ts | 4 +--- webapps/console/public/p.js | 1 + 2 files changed, 2 insertions(+), 3 deletions(-) create mode 120000 webapps/console/public/p.js diff --git a/webapps/console/middleware.ts b/webapps/console/middleware.ts index 90fff0477..599d1b622 100644 --- a/webapps/console/middleware.ts +++ b/webapps/console/middleware.ts @@ -21,9 +21,7 @@ const log = getServerLog("request-logger"); export async function middleware(request: NextRequest) { let response; - if (request.nextUrl.pathname.startsWith("/p.js")) { - response = NextResponse.rewrite(new URL("/api/s/javascript-library", request.url)); - } else if (request.nextUrl.pathname.startsWith("/v1/batch")) { + if (request.nextUrl.pathname.startsWith("/v1/batch")) { response = NextResponse.rewrite(new URL("/api/s/batch", request.url)); } else if (request.nextUrl.pathname.startsWith("/v1/b")) { response = NextResponse.rewrite(new URL("/api/s/batch", request.url)); diff --git a/webapps/console/public/p.js b/webapps/console/public/p.js new file mode 120000 index 000000000..cc6290230 --- /dev/null +++ b/webapps/console/public/p.js @@ -0,0 +1 @@ +../../../libs/jitsu-js/dist/web/p.js.txt \ No newline at end of file From 35c4ecaff54d61a87853381cb17262b7bfbd4a6e Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 29 Sep 2023 18:46:59 +0400 Subject: [PATCH 0221/1353] Revert "serve p.js statically" This reverts commit 603a90e17371459624de693f0c758d90eb9a78bf. --- webapps/console/middleware.ts | 4 +++- webapps/console/public/p.js | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) delete mode 120000 webapps/console/public/p.js diff --git a/webapps/console/middleware.ts b/webapps/console/middleware.ts index 599d1b622..90fff0477 100644 --- a/webapps/console/middleware.ts +++ b/webapps/console/middleware.ts @@ -21,7 +21,9 @@ const log = getServerLog("request-logger"); export async function middleware(request: NextRequest) { let response; - if (request.nextUrl.pathname.startsWith("/v1/batch")) { + if (request.nextUrl.pathname.startsWith("/p.js")) { + response = NextResponse.rewrite(new URL("/api/s/javascript-library", request.url)); + } else if (request.nextUrl.pathname.startsWith("/v1/batch")) { response = NextResponse.rewrite(new URL("/api/s/batch", request.url)); } else if (request.nextUrl.pathname.startsWith("/v1/b")) { response = NextResponse.rewrite(new URL("/api/s/batch", request.url)); diff --git a/webapps/console/public/p.js b/webapps/console/public/p.js deleted file mode 120000 index cc6290230..000000000 --- a/webapps/console/public/p.js +++ /dev/null @@ -1 +0,0 @@ -../../../libs/jitsu-js/dist/web/p.js.txt \ No newline at end of file From f3397202ca48c81b07be0f7823c5e79abb0ace75 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Mon, 2 Oct 2023 19:03:32 -0400 Subject: [PATCH 0222/1353] fix: sign up / sign in forms looks better on iPhones now --- webapps/console/components/SignInOrUp/SignIn.tsx | 11 ++++------- webapps/console/components/SignInOrUp/SignUp.tsx | 7 ++----- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/webapps/console/components/SignInOrUp/SignIn.tsx b/webapps/console/components/SignInOrUp/SignIn.tsx index 5acc83563..2809389d1 100644 --- a/webapps/console/components/SignInOrUp/SignIn.tsx +++ b/webapps/console/components/SignInOrUp/SignIn.tsx @@ -86,7 +86,7 @@ export const SocialLogin: React.FC<{ onSocialLogin: (type: string) => Promise -
    +
    - +
    + + View All + + {p.hasData && ( + + )}
    ); }; +export function EmptyList({ + children, + title, + createLink, + footer, +}: { + children: ReactNode; + title: ReactNode; + createLink: string; + footer?: ReactNode; +}) { + return ( +
    + +

    {title}

    +

    {children}

    + + {footer} +
    + ); +} + export const ConnectionsDiagram: React.FC = ({ connections, sources, @@ -86,8 +112,12 @@ export const ConnectionsDiagram: React.FC = ({ const [mouseOverSrc, setMouseOverSrc] = React.useState(); const [mouseOverDst, setMouseOverDst] = React.useState(); const workspaces = useWorkspace(); + const appConfig = useAppConfig(); const [forceSelectDestination, setForceSelectDestination] = React.useState([]); const [forceSelectSource, setForceSelectSource] = React.useState([]); + const emptySitesRef = React.useRef(null); + const emptyConnectorsRef = React.useRef(null); + const emptyDestinationsRef = React.useRef(null); useEffect(() => { const resizeListener = () => setWindowSize({ width: window.innerWidth, height: window.innerHeight }); window.addEventListener("resize", resizeListener); @@ -164,6 +194,33 @@ export const ConnectionsDiagram: React.FC = ({ }); } }); + if (emptySitesRef.current) { + const rel = getRelativePosition(canvasRef.current!, emptySitesRef.current!); + const bounds = emptySitesRef.current!.getBoundingClientRect(); + newLines.push({ + from: { top: rel.top + bounds.height / 2, left: rel.left + bounds.width }, + to: { left: logoPosition.left, top: logoPosition.top + logoBounds.height / 2 }, + selected: false, + }); + } + if (emptyConnectorsRef.current) { + const rel = getRelativePosition(canvasRef.current!, emptyConnectorsRef.current!); + const bounds = emptyConnectorsRef.current!.getBoundingClientRect(); + newLines.push({ + from: { top: rel.top + bounds.height / 2, left: rel.left + bounds.width }, + to: { left: logoPosition.left, top: logoPosition.top + logoBounds.height / 2 }, + selected: false, + }); + } + if (emptyDestinationsRef.current) { + const rel = getRelativePosition(canvasRef.current!, emptyDestinationsRef.current!); + const bounds = emptyDestinationsRef.current!.getBoundingClientRect(); + newLines.push({ + to: { top: rel.top + bounds.height / 2, left: rel.left }, + from: { left: logoPosition.left + logoBounds.width, top: logoPosition.top + logoBounds.height / 2 }, + selected: false, + }); + } setLines(newLines); if (mouseOverSrc) { @@ -186,10 +243,10 @@ export const ConnectionsDiagram: React.FC = ({
    +
    0} /> <> - {sources?.length > 0 && ( + {sources?.length > 0 ? ( <> -
    {sources.map((s, idx) => (
    = ({
    ))} + ) : ( +
    + + Site (or stream) is a source of events which are bing pushed to Jitsu via SDK. It could be a website, + web application, mobile application or backend server + +
    )} - {connectorSources?.length > 0 && ( + {appConfig.syncs.enabled && ( <> -
    - {connectorSources.map((s, idx) => ( -
    console.log("Clicked", s.id)} - onMouseOver={() => { - setMouseOverSrc(s.id); - }} - onMouseLeave={() => setMouseOverSrc(undefined)} - > - {s.card(forceSelectSource.includes(s.id))} +
    0} /> + {connectorSources?.length > 0 ? ( + <> + {connectorSources.map((s, idx) => ( +
    console.log("Clicked", s.id)} + onMouseOver={() => { + setMouseOverSrc(s.id); + }} + onMouseLeave={() => setMouseOverSrc(undefined)} + > + {s.card(forceSelectSource.includes(s.id))} +
    + ))} + + ) : ( +
    + + Connectors are used to pull data from external sources like databases, APIs, files, etc. +
    - ))} + )} - )}{" "} + )}
    @@ -245,7 +319,7 @@ export const ConnectionsDiagram: React.FC = ({
    -
    +
    0} /> {destinations.map((dest, idx) => (
    = ({ {dest.card(forceSelectDestination.includes(dest.id))}
    ))} + {destinations.length === 0 && ( +
    + + Destination is a database or service which accepts data coming from sites or connector + +
    + )}
    diff --git a/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx b/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx index d4ae17cbb..ff0029aa2 100644 --- a/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx +++ b/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx @@ -78,7 +78,7 @@ export const ServicesCatalog: React.FC<{ onClick: (packageType, packageId: strin
    { setFilter(e.target.value); }} diff --git a/webapps/console/lib/shared/chores.ts b/webapps/console/lib/shared/chores.ts new file mode 100644 index 000000000..b4b218dfa --- /dev/null +++ b/webapps/console/lib/shared/chores.ts @@ -0,0 +1,3 @@ +export function isTruish(val: any) { + return val === "true" || val === "1" || val === "yes" || val === true || val === 1; +} diff --git a/webapps/console/pages/[workspaceId]/index.tsx b/webapps/console/pages/[workspaceId]/index.tsx index 00d38526f..bd3f68662 100644 --- a/webapps/console/pages/[workspaceId]/index.tsx +++ b/webapps/console/pages/[workspaceId]/index.tsx @@ -2,8 +2,7 @@ import { WorkspacePageLayout } from "../../components/PageLayout/WorkspacePageLa import { useAppConfig, useWorkspace } from "../../lib/context"; import { DestinationConfig, ServiceConfig, StreamConfig } from "../../lib/schema"; import { branding } from "../../lib/branding"; -import { Badge, Steps, Tooltip } from "antd"; -import { WLink } from "../../components/Workspace/WLink"; +import { Badge, Tooltip } from "antd"; import React, { ReactNode, useEffect, useState } from "react"; import { FaGlobe } from "react-icons/fa"; import { LabelEllipsis } from "../../components/LabelEllipsis/LabelEllipsis"; @@ -17,181 +16,11 @@ import { ConnectionsDiagram } from "../../components/ConnectionsDiagram/Connecti import { getLog } from "juava"; import { Chrome } from "lucide-react"; import classNames from "classnames"; -import { useRouter } from "next/router"; -import { TrackingIntegrationDocumentation } from "../../components/TrackingIntegrationDocumentation/TrackingIntegrationDocumentation"; -import omit from "lodash/omit"; -import Link from "next/link"; import { useQuery } from "@tanstack/react-query"; import { get, getConfigApi } from "../../lib/useApi"; import { LoadingAnimation } from "../../components/GlobalLoader/GlobalLoader"; import { GlobalError } from "../../components/GlobalError/GlobalError"; -function Welcome({ - destinations, - streams, - links, -}: { - streams: StreamConfig[]; - destinations: DestinationConfig[]; - links: any[]; -}) { - const router = useRouter(); - const [implementationDocumentationId, setImplementationDocumentationId] = useState( - router.query.implementationFor as string | undefined - ); - - let step = -1; - if (streams.length > 0 && destinations.length > 0 && links.length > 0) { - step = 3; - } else if (streams.length > 0 && destinations.length > 0) { - step = 2; - } else if (streams.length > 0) { - step = 1; - } else { - step = 0; - } - return ( - <> - {implementationDocumentationId && ( - { - setImplementationDocumentationId(undefined); - router.push( - { pathname: router.pathname, query: omit(router.query, "implementationFor", "framework") }, - undefined, - { - shallow: true, - } - ); - }} - /> - )} -
    -

    ✨ Welcome to {branding.productName}!

    -
    Implement {branding.productName} in 4 simple steps
    -
    - - - Add your website or application - {streams.length > 0 ? ( - <> - {" "} - - done! - - ) : ( - "" - )} - - } - description={ - streams.length === 0 ? ( - <> - Click here to add it! - - ) : ( - <> - Congratulations! You have{" "} - - {streams.length} {streams.length > 1 ? "sites" : "site"} - {" "} - configured. - - ) - } - /> - - Add the destination of your data{" "} - {destinations.length > 0 ? ( - <> - {" "} - - done! - - ) : ( - "" - )} - - } - description={ - destinations.length === 0 ? ( - <> - - Click here to add it! - - - ) : ( - <> - Congratulations! You have{" "} - - {destinations.length} {destinations.length > 1 ? "destinations" : "destination"} - {" "} - configured. - - ) - } - /> - - Link your site with destination{" "} - {links.length > 0 ? ( - <> - {" "} - - done! - - ) : ( - "" - )} - - } - description={ - links.length === 0 ? ( - streams.length > 0 && destinations.length > 0 ? ( - <> - Click here to add it! - - ) : ( - <>First, add at least one site and destination - ) - ) : ( - <> - Congratulations! You have{" "} - - {links.length} {links.length > 1 ? "connections" : "connection"} - {" "} - configured. - - ) - } - /> - - First, add at least one site - - ) : ( - <> - Read{" "} - setImplementationDocumentationId(streams[0].id)}> - {branding.productName} implementation documentation - - - ) - } - /> - -
    -
    - - ); -} - function HoverBorder({ children, forceHover }: { children: ReactNode; forceHover?: boolean }) { const [_hover, setHover] = useState(false); const hover = forceHover || _hover; @@ -317,17 +146,13 @@ function WorkspaceOverview(props: { connectors: ServiceConfig[]; links: ConfigurationLinkDbModel[]; }) { - const router = useRouter(); const appConfig = useAppConfig(); const workspace = useWorkspace(); const { destinations, streams, links, connectors } = props; useTitle(`${branding.productName} : ${workspace.name}`); - const configurationFinished = - !router.query.welcome && streams.length > 0 && destinations.length > 0 && links.length > 0; return (
    - {!configurationFinished && } - {configurationFinished && ( + { - )} - {configurationFinished && appConfig.ee?.available && ( + } + {appConfig.ee?.available && (
    diff --git a/webapps/console/pages/[workspaceId]/services.tsx b/webapps/console/pages/[workspaceId]/services.tsx index 4a9f4662e..080dd0fa4 100644 --- a/webapps/console/pages/[workspaceId]/services.tsx +++ b/webapps/console/pages/[workspaceId]/services.tsx @@ -81,7 +81,7 @@ const ServicesList: React.FC<{}> = () => { protocol: { hidden: true }, package: { hidden: true }, }, - noun: "service", + noun: "connector", type: "service", explanation: "Services are used to connect to external systems", icon: s => ( diff --git a/webapps/console/pages/[workspaceId]/syncs/index.tsx b/webapps/console/pages/[workspaceId]/syncs/index.tsx index 0438a93ac..ac702509c 100644 --- a/webapps/console/pages/[workspaceId]/syncs/index.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/index.tsx @@ -373,14 +373,13 @@ function Syncs(props: RemoteEntitiesProps) {
    - In order to connect service to destination please create at least one destination and one service. Currently, - you have{" "} + In order to create a sync please create at least one destination and one connector. Currently, you have{" "} {props.destinations.length} destination{props.destinations.length === 1 ? "" : "s"} {" "} and{" "} - {props.services.length} service{props.services.length === 1 ? "" : "s"} + {props.services.length} connectors{props.services.length === 1 ? "" : "s"} {" "} configured
    diff --git a/webapps/console/pages/_app.tsx b/webapps/console/pages/_app.tsx index a49aa7b95..552263ab5 100644 --- a/webapps/console/pages/_app.tsx +++ b/webapps/console/pages/_app.tsx @@ -1,6 +1,5 @@ import { getErrorMessage, getLog, LogLevel, rpc, setGlobalLogLevel } from "juava"; import { AppProps } from "next/app"; -import "@fontsource/inter/variable.css"; import "../styles/globals.css"; import { useRouter } from "next/router"; import React, { PropsWithChildren, useEffect, useState } from "react"; diff --git a/webapps/console/pages/api/app-config.ts b/webapps/console/pages/api/app-config.ts index b00a123aa..23ab7b138 100644 --- a/webapps/console/pages/api/app-config.ts +++ b/webapps/console/pages/api/app-config.ts @@ -5,6 +5,7 @@ import { getEeConnection } from "../../lib/server/ee"; import { isEEAvailable } from "./ee/jwt"; import { isFirebaseEnabled, requireFirebaseOptions } from "../../lib/server/firebase-server"; import { nangoConfig } from "../../lib/server/oauth/nango-config"; +import { isTruish } from "../../lib/shared/chores"; export default createRoute() .GET({ result: AppConfig, auth: false }) @@ -28,7 +29,7 @@ export default createRoute() : undefined, billingEnabled: isEEAvailable(), syncs: { - enabled: process.env.SYNCS_ENABLED === "true", + enabled: isTruish(process.env.SYNCS_ENABLED), scheduler: { enabled: !!process.env.GOOGLE_SCHEDULER_KEY, provider: process.env.GOOGLE_SCHEDULER_KEY ? "google-cloud-scheduler" : undefined, diff --git a/webapps/console/styles/globals.css b/webapps/console/styles/globals.css index 9f5b9dbdf..04454e953 100644 --- a/webapps/console/styles/globals.css +++ b/webapps/console/styles/globals.css @@ -1,4 +1,4 @@ -@import url("https://fonts.googleapis.com/css2?family=Inter:wght@500"); +@import url("https://fonts.googleapis.com/css2?family=Inter:wght@380;500;700"); @tailwind base; @tailwind components; From ae215032dcbc02078cad4738262add9608ccc3b9 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Wed, 11 Oct 2023 18:01:35 -0400 Subject: [PATCH 0250/1353] feat: saved last workspace usage in a separate table --- .../workspace/[workspaceIdOrSlug]/index.ts | 40 ++++++++++++++----- webapps/console/prisma/schema.prisma | 13 ++++++ 2 files changed, 44 insertions(+), 9 deletions(-) diff --git a/webapps/console/pages/api/workspace/[workspaceIdOrSlug]/index.ts b/webapps/console/pages/api/workspace/[workspaceIdOrSlug]/index.ts index 9ced8a710..d7b2b0f5a 100644 --- a/webapps/console/pages/api/workspace/[workspaceIdOrSlug]/index.ts +++ b/webapps/console/pages/api/workspace/[workspaceIdOrSlug]/index.ts @@ -4,7 +4,32 @@ import { db } from "../../../../lib/server/db"; import { ApiError } from "../../../../lib/shared/errors"; import { getUserPreferenceService } from "../../../../lib/server/user-preferences"; import { getServerLog } from "../../../../lib/server/log"; +import { SessionUser } from "../../../../lib/schema"; + const log = getServerLog(); + +async function savePreferences(user: SessionUser, workspace): Promise { + await Promise.all([ + getUserPreferenceService(db.prisma()).savePreference( + { userId: user.internalId }, + { lastUsedWorkspaceId: workspace.id } + ), + db.prisma().workspaceUserProperties.upsert({ + where: { + workspaceId_userId: { userId: user.internalId, workspaceId: workspace.id }, + }, + create: { + userId: user.internalId, + workspaceId: workspace.id, + lastUsed: new Date(), + }, + update: { + lastUsed: new Date(), + }, + }), + ]); +} + export const api: Api = { url: inferUrl(__filename), GET: { @@ -30,15 +55,12 @@ export const api: Api = { ); } //it doesn't have to by sync since the preferences are optional - getUserPreferenceService(db.prisma()) - .savePreference({ userId: user.internalId }, { lastUsedWorkspaceId: workspace.id }) - .catch(e => { - log - .atWarn() - .withCause(e) - .log(`Failed to save last workspace id (${workspace.id}). For user (${user.internalId})`); - }); - + savePreferences(user, workspace).catch(e => { + log + .atWarn() + .withCause(e) + .log(`Failed to save workspace preferences (${workspace.id}). For user (${user.internalId})`); + }); return workspace; }, }, diff --git a/webapps/console/prisma/schema.prisma b/webapps/console/prisma/schema.prisma index 8c8b48cd0..a4328bbc0 100644 --- a/webapps/console/prisma/schema.prisma +++ b/webapps/console/prisma/schema.prisma @@ -58,6 +58,7 @@ model UserProfile { tokens UserApiToken[] workspaceAccess WorkspaceAccess[] userPreferences UserPreferences[] + workspaceUserProperties WorkspaceUserProperties[] } model Workspace { @@ -72,6 +73,7 @@ model Workspace { configurationObject ConfigurationObject[] configurationObjectLink ConfigurationObjectLink[] preferences UserPreferences[] + workspaceUserProperties WorkspaceUserProperties[] featuresEnabled String[] @default([]) @@unique(slug) @@ -88,6 +90,17 @@ model WorkspaceAccess { @@id([userId, workspaceId]) } +model WorkspaceUserProperties { + workspaceId String + workspace Workspace @relation(fields: [workspaceId], references: [id]) + userId String + user UserProfile @relation(fields: [userId], references: [id]) + lastUsed DateTime @default(now()) /// @zod.custom(z.coerce.date()) + + @@id([workspaceId, userId]) +} + + model UserApiToken { id String @id @default(cuid()) createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) From d6925e2cb817230509a4de725fb61c8ef0c06c16 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Wed, 11 Oct 2023 18:06:29 -0400 Subject: [PATCH 0251/1353] feat: return last used workspace from /api/me --- webapps/console/pages/api/me.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/webapps/console/pages/api/me.ts b/webapps/console/pages/api/me.ts index 3849daad2..b1d465d54 100644 --- a/webapps/console/pages/api/me.ts +++ b/webapps/console/pages/api/me.ts @@ -5,6 +5,8 @@ import { getRequestHost } from "../../lib/server/origin"; import { db } from "../../lib/server/db"; import { getServerLog } from "../../lib/server/log"; import { getTopLevelDomain } from "@jitsu/js"; +import { getUserPreferenceService } from "../../lib/server/user-preferences"; +import { SessionUser } from "../../lib/schema"; const allowedOrigins = process.env.ALLOWED_API_ORIGINS || "*.[originTopLevelDomain],[originTopLevelDomain]"; @@ -63,6 +65,19 @@ async function getWorkspaces(internalUserId: string) { .filter(w => !w.deleted); } +async function getLastWorkspace(user: SessionUser) { + const pref = await getUserPreferenceService(db.prisma()).getPreferences({ userId: user.internalId }); + if (pref?.lastUsedWorkspaceId) { + return { + id: pref.lastUsedWorkspaceId, + slug: + (await db.prisma().workspace.findUnique({ where: { id: pref?.lastUsedWorkspaceId } }))?.slug || + pref.lastUsedWorkspaceId, + }; + } + return undefined; +} + export default async function handler(req: NextApiRequest, res: NextApiResponse) { const [hostname] = getRequestHost(req).split(":"); handleCors(hostname, req.headers.origin, res); @@ -74,6 +89,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) auth: true, user: user, workspaces: req.query.workspaces === "true" ? await getWorkspaces(user.internalId) : undefined, + lastUsedWorkspace: req.query.lastWorkspace === "true" ? await getLastWorkspace(user) : undefined, }); } } From 83efd4f183db031fb6be67bfe38e16a70d7308af Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Tue, 17 Oct 2023 12:30:33 -0400 Subject: [PATCH 0252/1353] feat: connectors catalog sorting --- .../ServicesCatalog/ServicesCatalog.tsx | 31 ++++++++++-------- webapps/console/pages/api/sources/index.ts | 32 ++++++++++++++++++- 2 files changed, 49 insertions(+), 14 deletions(-) diff --git a/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx b/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx index ff0029aa2..f92d7399c 100644 --- a/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx +++ b/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx @@ -104,20 +104,25 @@ export const ServicesCatalog: React.FC<{ onClick: (packageType, packageId: strin {group === "api" ? "API" : capitalize(group)}
    - {filtered.map(source => { - return ( -
    onClick(source.packageType, source.packageId)} - > -
    {getServiceIcon(source, sourcesIcons)}
    -
    -
    {source.meta.name}
    + {filtered + .sort((a, b) => { + const res = (b.sortIndex || 0) - (a.sortIndex || 0); + return res === 0 ? a.meta.name.localeCompare(b.meta.name) : res; + }) + .map(source => { + return ( +
    onClick(source.packageType, source.packageId)} + > +
    {getServiceIcon(source, sourcesIcons)}
    +
    +
    {source.meta.name}
    +
    -
    - ); - })} + ); + })}
    ); diff --git a/webapps/console/pages/api/sources/index.ts b/webapps/console/pages/api/sources/index.ts index d57137840..19b9448cc 100644 --- a/webapps/console/pages/api/sources/index.ts +++ b/webapps/console/pages/api/sources/index.ts @@ -7,6 +7,7 @@ import pick from "lodash/pick"; export const SourceType = ConnectorPackageDbModel.merge( z.object({ versions: z.string(), + sortIndex: z.number().optional(), meta: z.object({ name: z.string(), license: z.string(), @@ -64,6 +65,29 @@ export const jitsuSources: Record = { "jitsucom/source-mongodb": JitsuMongoDBSource, }; +export const popularConnectors: string[] = [ + "jitsucom/source-firebase", + "jitsucom/source-mongodb", + "airbyte/source-stripe", + "airbyte/source-google-ads", + "airbyte/source-facebook-marketing", + "airbyte/source-github", + "airbyte/source-google-analytics-data-api", + "airbyte/source-postgres", + "airbyte/source-mysql", + "airbyte/source-google-sheets", + "airbyte/source-airtable", + "airbyte/source-intercom", +]; + +const sortIndexes = popularConnectors.reduce( + (acc, connector, index) => ({ + ...acc, + [connector]: (popularConnectors.length - index) * 10 + 100, + }), + {} +); + export default createRoute() .GET({ auth: false, query: z.object({ mode: z.enum(["meta", "icons-only", "full"]).optional().default("full") }) }) .handler(async ({ query, req, res }): Promise<{ sources: Partial[] }> => { @@ -74,6 +98,7 @@ export default createRoute() res.setHeader("Access-Control-Allow-Credentials", "true"); const includeMeta = query.mode === "full" || query.mode == "meta"; const includeIcons = query.mode === "full" || query.mode == "icons-only"; + console.log(JSON.stringify(sortIndexes, null, 2)); const sources: Partial[] = (await db.prisma().connectorPackage.findMany()) .filter( c => @@ -115,7 +140,12 @@ export default createRoute() meta: includeMeta ? rest.meta : undefined, })), ...sources, - ], + ] + .map(s => ({ ...s, sortIndex: sortIndexes[s.packageId!] })) + .sort((a, b) => { + const res = (b.sortIndex || 0) - (a.sortIndex || 0); + return res === 0 ? (a?.meta?.name || a?.packageId!).localeCompare(b?.meta?.name || b?.packageId!) : res; + }), }; }) .toNextApiHandler(); From 407d0735a935abb11ac7008ae657876dd53410d8 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 18 Oct 2023 11:13:55 +0400 Subject: [PATCH 0253/1353] fixed typos --- libs/jitsu-js/__tests__/playwright/integration.test.ts | 4 ++-- .../components/ConnectionsDiagram/ConnectionsDiagram.tsx | 4 ++-- webapps/console/components/SQLViewer/SQLViewer.tsx | 2 +- webapps/ee-api/lib/stripe.ts | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/libs/jitsu-js/__tests__/playwright/integration.test.ts b/libs/jitsu-js/__tests__/playwright/integration.test.ts index 8d12dabfa..f2be33f12 100644 --- a/libs/jitsu-js/__tests__/playwright/integration.test.ts +++ b/libs/jitsu-js/__tests__/playwright/integration.test.ts @@ -179,7 +179,7 @@ test("segment-reference", async ({ browser }) => { test("basic", async ({ browser }) => { const browserContext = await browser.newContext(); - const { page: firstPage, uncaughtErrors: fistPageErrors } = await createLoggingPage(browserContext); + const { page: firstPage, uncaughtErrors: firstPageErrors } = await createLoggingPage(browserContext); const [pageResult] = await Promise.all([ firstPage.goto(`${server.baseUrl}/basic.html?utm_source=source&utm_medium=medium&utm_campaign=campaign`), ]); @@ -197,7 +197,7 @@ test("basic", async ({ browser }) => { {} ); console.log("🍪 Jitsu Cookies", cookies); - expect(fistPageErrors.length).toEqual(0); + expect(firstPageErrors.length).toEqual(0); const anonymousId = cookies["__eventn_id"]; expect(anonymousId).toBeDefined(); expect(cookies["__eventn_uid"]).toBe("user1"); diff --git a/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx b/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx index c67ed07a0..2bcc1b0e2 100644 --- a/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx +++ b/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx @@ -292,7 +292,7 @@ export const ConnectionsDiagram: React.FC = ({ ) : (
    - + Connectors are used to pull data from external sources like databases, APIs, files, etc.
    @@ -335,7 +335,7 @@ export const ConnectionsDiagram: React.FC = ({ ))} {destinations.length === 0 && (
    - + Destination is a database or service which accepts data coming from sites or connector
    diff --git a/webapps/console/components/SQLViewer/SQLViewer.tsx b/webapps/console/components/SQLViewer/SQLViewer.tsx index f901a3ab1..4c78c0192 100644 --- a/webapps/console/components/SQLViewer/SQLViewer.tsx +++ b/webapps/console/components/SQLViewer/SQLViewer.tsx @@ -70,7 +70,7 @@ const SchemaTree: React.FC = ({ onColumnSelect, onTableSelect,

    No tables

    - The tables are created in few mins after you send your fist events to Jitsu, after the first batch of events + The tables are created in few mins after you send your first events to Jitsu, after the first batch of events is processed
    diff --git a/webapps/ee-api/lib/stripe.ts b/webapps/ee-api/lib/stripe.ts index d09a9afbf..ccd462f0d 100644 --- a/webapps/ee-api/lib/stripe.ts +++ b/webapps/ee-api/lib/stripe.ts @@ -56,7 +56,7 @@ export async function getActivePlan(customerId: string): Promise { const product = requireDefined(sub2product.get(sub.id), `Can't find product for subscription ${sub.id}`); return sub.status === "active" || product.metadata?.object_tag === getStripeObjectTag(); From d75741dadfc87c2b06eff8fb7c5e32cee25c8337 Mon Sep 17 00:00:00 2001 From: OMKAR MAKHARE Date: Wed, 18 Oct 2023 12:50:25 +0530 Subject: [PATCH 0254/1353] Remove typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 79ffafcef..f4b2afd24 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ # What is Jitsu? -Jitsu is a tool for collecting event data from your websites, apps and stream them to your data warehouse or other servises. +Jitsu is a tool for collecting event data from your websites, apps and stream them to your data warehouse or other services. It is a self-hosted, open-source alternative to Segment.

    From 97ac17d73248786dc707f4d126afd636dbf608b7 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Wed, 18 Oct 2023 14:34:33 -0400 Subject: [PATCH 0255/1353] feat: more info on billing average page --- types/protocols/analytics.d.ts | 8 ++ .../components/JsonAsTable/JsonAsTable.tsx | 16 +++- .../console/pages/admin/overage-billing.tsx | 83 ++++++++++++++++--- webapps/ee-api/pages/api/report/overage.ts | 60 +++++++++++--- 4 files changed, 144 insertions(+), 23 deletions(-) diff --git a/types/protocols/analytics.d.ts b/types/protocols/analytics.d.ts index 55662e19d..a2661921e 100644 --- a/types/protocols/analytics.d.ts +++ b/types/protocols/analytics.d.ts @@ -147,6 +147,14 @@ interface AnalyticsContext { amp?: { id: string; }; + /** + * Other tracking tools client ids + */ + clientIds?: { + //Client ID of GA4 property + ga4?: string; + [key: string]: string; + }; [key: string]: any; } diff --git a/webapps/console/components/JsonAsTable/JsonAsTable.tsx b/webapps/console/components/JsonAsTable/JsonAsTable.tsx index 152181fb2..6f82addd7 100644 --- a/webapps/console/components/JsonAsTable/JsonAsTable.tsx +++ b/webapps/console/components/JsonAsTable/JsonAsTable.tsx @@ -3,6 +3,7 @@ import Link from "next/link"; import { ExternalLink } from "lucide-react"; import { Table } from "antd"; import hash from "stable-hash"; +import { ReactNode } from "react"; function makeNiceName(key: string) { return key @@ -16,7 +17,12 @@ export type TypedColumn = | { type: "number"; } - | { type: "link"; href: (val, row) => string }; + | { + type: "currency"; + currency?: "USD"; + } + | { type: "link"; href: (val, row) => string } + | { type: "custom"; render: (val, row) => ReactNode }; export type ColumnOption = { omit: true; type?: unknown } | ({ omit?: false | undefined } & TypedColumn); export const JsonAsTable: React.FC<{ rows: any[]; columnOptions: Record }> = ({ rows, @@ -33,7 +39,7 @@ export const JsonAsTable: React.FC<{ rows: any[]; columnOptions: Record{makeNiceName(key)}, @@ -42,8 +48,12 @@ export const JsonAsTable: React.FC<{ rows: any[]; columnOptions: Record {(() => { const val = row[key]; - if (isNumber) { + if (columnType?.type === "currency") { + return "$" + new Intl.NumberFormat("en-US", { maximumFractionDigits: 0 }).format(val); + } else if (columnType?.type === "number") { return new Intl.NumberFormat("en-US").format(val); + } else if (columnType?.type === "custom") { + return (columnType as any).render(val, row); } else if (columnType?.type === "link") { return ( { +function Reference(props: { children: React.ReactNode; href: string }) { + return ( + + {props.children} + + + ); +} + +const dateFormat: ColumnOption = { + type: "custom", + render: val => { + const date = new Date(val); + + const dayMonthFormatter = new Intl.DateTimeFormat("en-US", { day: "2-digit", month: "short" }); + const yearFormatter = new Intl.DateTimeFormat("en-US", { year: "2-digit" }); + + const dayMonth = dayMonthFormatter.format(date); + const year = yearFormatter.format(date); + + return ( +

    date.getTime() ? "text-neutral-400" : ""}`}> + {dayMonth}, {year} +
    + ); + }, +}; + +const View = ({ data, workspaces }) => { const router = useRouter(); + const workspacesMap = workspaces.reduce( + (acc, w) => ({ + ...acc, + [w.id]: w, + }), + {} + ); + console.log("workspacesMap", workspacesMap); return (
    @@ -26,11 +65,34 @@ const View = ({ data }) => { columnOptions={{ baseInvoiceId: { omit: true }, quota: { omit: true }, - workspaceId: { type: "link", href: (val, row) => `/${row.workspaceId}` }, + workspaceId: { + type: "custom", + render: workspaceId => { + console.log("val", workspaceId, "against", workspacesMap); + const name = workspacesMap[workspaceId]?.name || workspacesMap[workspaceId]?.slug || workspaceId; + return {name}; + }, + }, + stripeCustomerId: { + type: "custom", + render: (customerId, { subscriptionId }) => { + return ( +
    + {customerId} +
    + {subscriptionId} +
    + ); + }, + }, + subscriptionId: { omit: true }, + start: dateFormat, + end: dateFormat, destinationEvents: { type: "number" }, overageEvents: { type: "number" }, - overageFee: { type: "number" }, - overageFeeFinal: { omit: true }, + overageFee: { omit: true }, + baseFee: { type: "currency" }, + overageFeeFinal: { type: "currency" }, discountPercentage: { omit: true }, coupon: { omit: true }, couponName: { omit: true }, @@ -45,20 +107,21 @@ const View = ({ data }) => { export const OverageBillingPage = () => { const { data, isLoading, error } = useApi(`/api/$all/ee/report/overage`); - if (isLoading) { + const workspacesLoader = useApi[]>(`/api/workspace`); + if (isLoading || workspacesLoader.isLoading) { return (
    ); - } else if (error) { + } else if (error || workspacesLoader.error) { return (
    - +
    ); } - return ; + return ; }; export default OverageBillingPage; diff --git a/webapps/ee-api/pages/api/report/overage.ts b/webapps/ee-api/pages/api/report/overage.ts index 3ab39fef5..9688d88c9 100644 --- a/webapps/ee-api/pages/api/report/overage.ts +++ b/webapps/ee-api/pages/api/report/overage.ts @@ -9,7 +9,7 @@ import pick from "lodash/pick"; import { buildWorkspaceReport } from "./workspace-stat"; import { getServerLog } from "../../../lib/log"; -const log = getServerLog("/api/report"); +const log = getServerLog("/api/overage"); function toUTC(date: Date | string) { const dateObj = new Date(date); @@ -17,6 +17,10 @@ function toUTC(date: Date | string) { return new Date(dateObj.getTime() - timezoneOffset * 60000); } +function stripeLink(entity: string, id: string) { + return `https://dashboard.stripe.com/${entity}/${id}`; +} + function round(date: Date | string, granularity: "day" = "day"): { start: string; end: string } { try { const dateObj = toUTC(date).toISOString(); @@ -30,13 +34,16 @@ function round(date: Date | string, granularity: "day" = "day"): { start: string } async function listAllInvoices() { - log.atInfo().log("Listing invoices..."); let starting_after: string | undefined = undefined; const allInvoices: Stripe.Invoice[] = []; do { const result = await stripe.invoices.list({ limit: 100, starting_after: starting_after, + created: { + //invoices for past 90 days + gte: Math.floor(Date.now() / 1000 - 90 * 24 * 60 * 60), + }, }); starting_after = result?.data[result.data.length - 1]?.id; log.atInfo().log(`Fetched ${result?.data.length} invoices. Has more: ${!!starting_after}`); @@ -85,6 +92,7 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse : await store.getTable(stripeDataTable).list(); const availableProducts = await getAvailableProducts(); + const subscriptionCache: Record = {}; const result: any[] = []; const allInvoices = await listAllInvoices(); @@ -92,6 +100,17 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse const { stripeCustomerId } = obj; const customerInvoices = allInvoices.filter(i => i.customer === stripeCustomerId); + if (customerInvoices.length === 0) { + continue; + } + log + .atInfo() + .log( + `Found ${customerInvoices.length} invoices for workspace ${workspaceId} / customer ${stripeLink( + "customers", + stripeCustomerId + )}` + ); for (const invoice of customerInvoices) { if (!invoice.lines.data.length) { log.atWarn().log(`No lines found for invoice ${invoice.id}`); @@ -103,9 +122,31 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse .filter(l => !!l.plan) .map(l => l.plan!.product) .join(""); + const subscriptionId = invoice.lines.data + .filter(l => !!l.subscription) + .map(l => l.subscription) + .join(""); + if (subscriptionId === "") { + log.atWarn().log(`No subscription found for invoice ${stripeLink("invoices", invoice.id)}, skipping`); + continue; + } + const subscription = + subscriptionCache[subscriptionId] || + (subscriptionCache[subscriptionId] = await stripe.subscriptions.retrieve(subscriptionId)); + if (subscription.status === "canceled") { + log + .atWarn() + .log( + `Subscription ${stripeLink("subscriptions", invoice.id)} is canceled. Skipping invoice ${stripeLink( + "invoices", + invoice.id + )}` + ); + continue; + } const plan = availableProducts.find(p => p.id === product); if (!plan) { - log.atWarn().log(`No plan found for ${product} from invoice ${invoice.id}`); + log.atWarn().log(`No plan found for ${product} from invoice ${stripeLink("invoices", invoice.id)}`); continue; } log @@ -119,16 +160,13 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse const overagePricePerEvent = overagePricePer100k / 100_000; const invoiceStartRounded = round(start, "day").start; const invoiceEndRounded = round(end, "day").end; - log.atInfo().log(`\t[${invoiceStartRounded}, ${invoiceEndRounded}]`); - let rows = report.filter(row => { - log.atInfo().log(JSON.stringify(row)); + const rows = report.filter(row => { const { start, end } = round(row.period, "day"); - let includes = + return ( row.workspaceId === workspaceId && Date.parse(start) >= Date.parse(invoiceStartRounded) && - Date.parse(end) <= Date.parse(invoiceEndRounded); - log.atInfo().log(includes + ":" + JSON.stringify({ start, end, invoiceStartRounded, invoiceEndRounded })); - return includes; + Date.parse(end) <= Date.parse(invoiceEndRounded) + ); }); log .atInfo() @@ -152,6 +190,8 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse month: start.toLocaleString("en-US", { month: "long", year: "numeric" }), baseInvoiceId: invoice.id, workspaceId, + stripeCustomerId, + subscriptionId, start, end, destinationEvents, From a1311c50274c3031bb1981fa727948f04f3cf7e9 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Wed, 18 Oct 2023 16:19:11 -0400 Subject: [PATCH 0256/1353] feat: display connected destinations on connectors page for more smooth onboarding --- .../ConfigObjectEditor/ConfigEditor.tsx | 23 +++++---- .../SyncEditorPage/SyncEditorPage.tsx | 2 +- .../console/pages/[workspaceId]/services.tsx | 50 ++++++++++++++++++- .../pages/[workspaceId]/syncs/index.tsx | 8 +-- 4 files changed, 68 insertions(+), 15 deletions(-) diff --git a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx index 56cc382f5..1d1d38e2c 100644 --- a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx +++ b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx @@ -664,6 +664,7 @@ const ObjectsList: React.FC<{ objects: any[]; onDelete: (id: string) => Promise< name = (o: any) => o.name, }) => { const modal = useAntdModal(); + const nameRender = listColumns.find(c => c.title === "name")?.render; useTitle(`${branding.productName} : ${plural(noun)}`); const deleteObject = id => { modal.confirm({ @@ -677,16 +678,20 @@ const ObjectsList: React.FC<{ objects: any[]; onDelete: (id: string) => Promise< const columns = [ { title: "Name", - render: (text, record) => ( - - - - ), + render: + nameRender || + ((text, record) => ( + + + + )), }, - ...listColumns.map(c => ({ - title: c.title, - render: (text, record) => c.render(record), - })), + ...listColumns + .filter(c => c.title !== "name") + .map(c => ({ + title: c.title, + render: (text, record) => c.render(record), + })), { title: "", className: "text-right", diff --git a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx index b38532db9..73b009250 100644 --- a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx +++ b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx @@ -187,7 +187,7 @@ function SyncEditor({ const [loading, setLoading] = useState(false); const workspace = useWorkspace(); const [dstId, setDstId] = useState(existingLink?.toId || destinations[0].id); - const [srvId, setSrvId] = useState(existingLink?.fromId || services[0].id); + const [srvId, setSrvId] = useState(existingLink?.fromId || (router.query.serviceId as string) || services[0].id); const service = services.find(s => s.id === srvId); diff --git a/webapps/console/pages/[workspaceId]/services.tsx b/webapps/console/pages/[workspaceId]/services.tsx index 080dd0fa4..588e8b9c5 100644 --- a/webapps/console/pages/[workspaceId]/services.tsx +++ b/webapps/console/pages/[workspaceId]/services.tsx @@ -15,6 +15,9 @@ import { ErrorCard } from "../../components/GlobalError/GlobalError"; import { syncError } from "../../lib/shared/errors"; import { ObjectTitle } from "../../components/ObjectTitle/ObjectTitle"; import omit from "lodash/omit"; +import { useApi } from "../../lib/useApi"; +import { AlertTriangle, Check } from "lucide-react"; +import Link from "next/link"; const log = getLog("services"); @@ -47,6 +50,33 @@ export const ServiceTitle: React.FC<{ ); }; +const ConnectionsHint: React.FC<{ connections: any[]; service: ServiceConfig }> = ({ connections, service }) => { + const workspace = useWorkspace(); + if (connections.length === 0) { + return ( +
    + {" "} + + Create sync to any destination to + start seeing data + +
    + ); + } else { + return ( +
    + {" "} + + Connected to{" "} + + {connections.length} destination{connections.length > 1 ? "s" : ""} + + +
    + ); + } +}; + const ServicesList: React.FC<{}> = () => { const workspace = useWorkspace(); @@ -56,7 +86,17 @@ const ServicesList: React.FC<{}> = () => { }); const router = useRouter(); const appconfig = useAppConfig(); - + const connectionsLoader = useApi(`/api/${workspace.id}/config/link`); + const connections = + connectionsLoader.data?.links?.reduce((res, link) => { + const fromId = link.fromId; + if (res[fromId]) { + res[fromId].push(link); + } else { + res[fromId] = [link]; + } + return res; + }, {}) || {}; if (!(appconfig.syncs.enabled || workspace.featuresEnabled.includes("syncs"))) { return ( = () => { title: "Package", render: (s: ServiceConfig) => {`${s?.package}:${s?.version}`}, }, + { + title: "Syncs", + render: (s: ServiceConfig) => ( +
    + +
    + ), + }, ], objectType: ServiceConfig, fields: { diff --git a/webapps/console/pages/[workspaceId]/syncs/index.tsx b/webapps/console/pages/[workspaceId]/syncs/index.tsx index ac702509c..833139421 100644 --- a/webapps/console/pages/[workspaceId]/syncs/index.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/index.tsx @@ -379,17 +379,17 @@ function Syncs(props: RemoteEntitiesProps) { {" "} and{" "} - {props.services.length} connectors{props.services.length === 1 ? "" : "s"} + {props.services.length} connector{props.services.length === 1 ? "" : "s"} {" "} configured
    + }> + Create Connector + }> Create Destination - }> - Create Service -
    ); From 2633a3779f75deee7e6b67cb667d8c3097134935 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Wed, 18 Oct 2023 16:50:06 -0400 Subject: [PATCH 0257/1353] fix: workspace overview layout made symmetrical --- .../components/ConnectionsDiagram/ConnectionsDiagram.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx b/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx index 2bcc1b0e2..439052114 100644 --- a/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx +++ b/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx @@ -242,7 +242,7 @@ export const ConnectionsDiagram: React.FC = ({ return (
    -
    +
    0} /> <> {sources?.length > 0 ? ( @@ -301,7 +301,10 @@ export const ConnectionsDiagram: React.FC = ({ )}
    -
    +
    = ({
    -
    +
    0} /> {destinations.map((dest, idx) => (
    Date: Wed, 18 Oct 2023 16:59:27 -0400 Subject: [PATCH 0258/1353] feat: billing page improvements --- .../components/PageLayout/WorkspacePageLayout.tsx | 11 +++++++++++ webapps/console/pages/admin/overage-billing.tsx | 5 ++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index a5596632d..184499e39 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -15,6 +15,7 @@ import { BarChart3, ChevronDown, ChevronUp, + CircleDollarSign, CreditCard, FilePlus, FolderKanban, @@ -131,6 +132,16 @@ function WorkspacesMenu(props: { jitsuClassicAvailable: boolean }) { }, }, ]; + if (appConfig.ee.available) { + additionalMenuItems.push({ + key: "billing-workspaces", + label: "Billing Administration", + icon: , + onClick: async () => { + await router.push("/admin/overage-billing"); + }, + }); + } } return ( diff --git a/webapps/console/pages/admin/overage-billing.tsx b/webapps/console/pages/admin/overage-billing.tsx index 83400bdc3..fbf28d003 100644 --- a/webapps/console/pages/admin/overage-billing.tsx +++ b/webapps/console/pages/admin/overage-billing.tsx @@ -111,7 +111,10 @@ export const OverageBillingPage = () => { if (isLoading || workspacesLoader.isLoading) { return (
    - +
    + +
    Hang tight, it could take up to a few minutes...
    +
    ); } else if (error || workspacesLoader.error) { From 23669a63d98f6d98c040de0f9709624b7d63ce7b Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Thu, 19 Oct 2023 12:55:51 -0400 Subject: [PATCH 0259/1353] feat: billing page - overage fee projections --- .../components/JsonAsTable/JsonAsTable.tsx | 7 +++++-- webapps/console/pages/admin/overage-billing.tsx | 2 ++ webapps/ee-api/pages/api/report/overage.ts | 16 ++++++++++++++-- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/webapps/console/components/JsonAsTable/JsonAsTable.tsx b/webapps/console/components/JsonAsTable/JsonAsTable.tsx index 6f82addd7..a76f93354 100644 --- a/webapps/console/components/JsonAsTable/JsonAsTable.tsx +++ b/webapps/console/components/JsonAsTable/JsonAsTable.tsx @@ -23,7 +23,9 @@ export type TypedColumn = } | { type: "link"; href: (val, row) => string } | { type: "custom"; render: (val, row) => ReactNode }; -export type ColumnOption = { omit: true; type?: unknown } | ({ omit?: false | undefined } & TypedColumn); +export type ColumnOption = + | { omit: true; type?: unknown } + | ({ omit?: false | undefined; title?: string } & TypedColumn); export const JsonAsTable: React.FC<{ rows: any[]; columnOptions: Record }> = ({ rows, columnOptions, @@ -39,10 +41,11 @@ export const JsonAsTable: React.FC<{ rows: any[]; columnOptions: Record{makeNiceName(key)}, + title: {columnName}, render: (row: any) => { return (
    diff --git a/webapps/console/pages/admin/overage-billing.tsx b/webapps/console/pages/admin/overage-billing.tsx index fbf28d003..2a393ad93 100644 --- a/webapps/console/pages/admin/overage-billing.tsx +++ b/webapps/console/pages/admin/overage-billing.tsx @@ -93,11 +93,13 @@ const View = ({ data, workspaces }) => { overageFee: { omit: true }, baseFee: { type: "currency" }, overageFeeFinal: { type: "currency" }, + projectedOverageFeeFinal: { type: "currency", title: "Projection" }, discountPercentage: { omit: true }, coupon: { omit: true }, couponName: { omit: true }, invoiceHelper: { omit: true }, workspaceSlug: { omit: true }, + projectedEvents: { omit: true }, workspaceName: { type: "link", href: (val, row) => `/${row.workspaceSlug}` }, }} /> diff --git a/webapps/ee-api/pages/api/report/overage.ts b/webapps/ee-api/pages/api/report/overage.ts index 9688d88c9..8e1371de4 100644 --- a/webapps/ee-api/pages/api/report/overage.ts +++ b/webapps/ee-api/pages/api/report/overage.ts @@ -55,6 +55,7 @@ async function listAllInvoices() { return allInvoices; } +const msPerHour = 1000 * 60 * 60; const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { const claims = await auth(req, res); const workspaceId: string | undefined = req.query.workspaceId ? (req.query.workspaceId as string) : undefined; @@ -184,8 +185,17 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse ).toISOString()}] → ${destinationEvents}` ); const overageFee = (Math.max(0, destinationEvents - destinationEvensPerMonth) / 100_000) * overagePricePer100k; - const discountPercentage = invoice.discount ? invoice.discount.coupon.percent_off : undefined; - let overageFeeFinal = discountPercentage ? overageFee * (1 - discountPercentage / 100) : overageFee; + const discountPercentage = invoice?.discount?.coupon?.percent_off || 0; + const overageFeeFinal = overageFee * (1 - discountPercentage / 100); + + const projectedEvents = + (destinationEvents / ((Math.min(Date.now(), end.getTime()) - start.getTime()) / msPerHour)) * + ((end.getTime() - start.getTime()) / msPerHour); + const projectedOverageFeeFinal = + (Math.max(0, projectedEvents - destinationEvensPerMonth) / 100_000) * + overagePricePer100k * + (1 - discountPercentage / 100); + result.push({ month: start.toLocaleString("en-US", { month: "long", year: "numeric" }), baseInvoiceId: invoice.id, @@ -207,6 +217,8 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse coupon: invoice.discount ? pick(invoice.discount.coupon, "id", "name") : undefined, couponName: invoice.discount ? invoice.discount.coupon.name : undefined, overageFeeFinal, + projectedEvents, + projectedOverageFeeFinal, }); } } From 809cd798c7ae4daf1dc721f27bc4776ce0010476 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Thu, 19 Oct 2023 17:19:19 -0400 Subject: [PATCH 0260/1353] feat: optional reorder of components on a main page --- .../ConnectionsDiagram/ConnectionsDiagram.tsx | 120 +++++++++--------- 1 file changed, 63 insertions(+), 57 deletions(-) diff --git a/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx b/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx index 439052114..0064dbac7 100644 --- a/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx +++ b/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx @@ -7,6 +7,8 @@ import { ArrowRight, ExternalLink, Inbox } from "lucide-react"; import { Button } from "antd"; import { PlusOutlined } from "@ant-design/icons"; import classNames from "classnames"; +import { isTruish } from "../../lib/shared/chores"; +import { useRouter } from "next/router"; export type ConnectorNode = { id: string; @@ -113,6 +115,7 @@ export const ConnectionsDiagram: React.FC = ({ const [mouseOverDst, setMouseOverDst] = React.useState(); const workspaces = useWorkspace(); const appConfig = useAppConfig(); + const router = useRouter(); const [forceSelectDestination, setForceSelectDestination] = React.useState([]); const [forceSelectSource, setForceSelectSource] = React.useState([]); const emptySitesRef = React.useRef(null); @@ -239,67 +242,70 @@ export const ConnectionsDiagram: React.FC = ({ dstRefs.current = destinations.map((_, i) => dstRefs.current[i] ?? React.createRef()); connectorsRef.current = destinations.map((_, i) => connectorsRef.current[i] ?? React.createRef()); + const connectorSection = appConfig.syncs.enabled && ( + +
    0} /> + {connectorSources?.length > 0 ? ( + <> + {connectorSources.map((s, idx) => ( +
    console.log("Clicked", s.id)} + onMouseOver={() => { + setMouseOverSrc(s.id); + }} + onMouseLeave={() => setMouseOverSrc(undefined)} + > + {s.card(forceSelectSource.includes(s.id))} +
    + ))} + + ) : ( +
    + + Connectors are used to pull data from external sources like databases, APIs, files, etc. + +
    + )} + + ); + const sitesSection = ( + +
    0} /> + {sources?.length > 0 ? ( + <> + {sources.map((s, idx) => ( +
    console.log("Clicked", s.id)} + onMouseOver={() => { + setMouseOverSrc(s.id); + }} + onMouseLeave={() => setMouseOverSrc(undefined)} + > + {s.card(forceSelectSource.includes(s.id))} +
    + ))} + + ) : ( +
    + + Site (or stream) is a source of events which are bing pushed to Jitsu via SDK. It could be a website, web + application, mobile application or backend server + +
    + )} + + ); return (
    -
    0} /> - <> - {sources?.length > 0 ? ( - <> - {sources.map((s, idx) => ( -
    console.log("Clicked", s.id)} - onMouseOver={() => { - setMouseOverSrc(s.id); - }} - onMouseLeave={() => setMouseOverSrc(undefined)} - > - {s.card(forceSelectSource.includes(s.id))} -
    - ))} - - ) : ( -
    - - Site (or stream) is a source of events which are bing pushed to Jitsu via SDK. It could be a website, - web application, mobile application or backend server - -
    - )} - {appConfig.syncs.enabled && ( - <> -
    0} /> - {connectorSources?.length > 0 ? ( - <> - {connectorSources.map((s, idx) => ( -
    console.log("Clicked", s.id)} - onMouseOver={() => { - setMouseOverSrc(s.id); - }} - onMouseLeave={() => setMouseOverSrc(undefined)} - > - {s.card(forceSelectSource.includes(s.id))} -
    - ))} - - ) : ( -
    - - Connectors are used to pull data from external sources like databases, APIs, files, etc. - -
    - )} - - )} - + {isTruish(router.query.connectorsFirst) ? [connectorSection, sitesSection] : [sitesSection, connectorSection]}
    Date: Fri, 20 Oct 2023 17:41:46 +0400 Subject: [PATCH 0261/1353] trello#60 Redesign functions execution model to support error retrying (#1053) * trello#60 Redesign functions execution model to support error retrying * trello#60 introduce @jitsu/functions-lib package * udf_wrapper.ts get rid of swc --- .gitignore | 1 + cli/jitsu-cli/package.json | 8 +- cli/jitsu-cli/src/commands/build.ts | 4 +- cli/jitsu-cli/src/commands/run.ts | 22 +- cli/jitsu-cli/src/index.ts | 5 +- cli/jitsu-cli/src/templates/functions.ts | 2 + libs/core-functions/package.json | 3 +- .../src/functions/amplitude-destination.ts | 182 +- .../src/functions/bulker-destination.ts | 33 +- .../src/functions/ga4-destination.ts | 5 +- .../src/functions/june-destination.ts | 59 +- .../src/functions/lib/udf-wrapper-code.ts | 81 + .../src/functions/mixpanel-destination.ts | 101 +- .../src/functions/mongodb-destination.ts | 5 +- .../src/functions/posthog-destination.ts | 3 + .../src/functions/segment-destination.ts | 7 +- .../src/functions/udf_wrapper.ts | 155 +- .../src/functions/webhook-destination.ts | 34 +- libs/core-functions/tsconfig.json | 1 + libs/functions/package.json | 30 + libs/functions/rollup.config.js | 12 + libs/functions/src/index.ts | 1 + libs/functions/src/lib/functions.ts | 9 + libs/functions/tsconfig.json | 19 + libs/jitsu-react/package.json | 2 +- package.json | 4 +- pnpm-lock.yaml | 1941 ++++++----------- services/rotor/package.json | 13 +- services/rotor/src/http/udf.ts | 6 +- services/rotor/src/index.ts | 156 +- services/rotor/src/lib/functions-chain.ts | 84 +- services/rotor/src/lib/retries.ts | 64 + services/rotor/src/lib/rotor.ts | 78 +- types/protocols/async-request.d.ts | 2 +- types/protocols/functions.d.ts | 6 +- .../components/CodeEditor/CodeEditor.tsx | 5 + .../components/DataView/EventsBrowser.tsx | 2 +- .../FunctionsDebugger/FunctionsDebugger.tsx | 40 +- .../TrackingIntegrationDocumentation.tsx | 2 +- webapps/console/package.json | 3 +- .../pages/api/[workspaceId]/function/run.ts | 3 +- webapps/ee-api/package.json | 2 +- 42 files changed, 1440 insertions(+), 1755 deletions(-) create mode 100644 libs/core-functions/src/functions/lib/udf-wrapper-code.ts create mode 100644 libs/functions/package.json create mode 100644 libs/functions/rollup.config.js create mode 100644 libs/functions/src/index.ts create mode 100644 libs/functions/src/lib/functions.ts create mode 100644 libs/functions/tsconfig.json create mode 100644 services/rotor/src/lib/retries.ts diff --git a/.gitignore b/.gitignore index 4defa27cb..75a7949b0 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ node_modules /examples/hubspot-function/dist/ /cli/jitsu-cli/compiled/ /cli/jitsu-cli/dist/ +/types/protocols/dist/ diff --git a/cli/jitsu-cli/package.json b/cli/jitsu-cli/package.json index e751bff68..371cee3d4 100644 --- a/cli/jitsu-cli/package.json +++ b/cli/jitsu-cli/package.json @@ -18,13 +18,13 @@ "dependencies": { "isolated-vm": "^4.6.0", "jest-cli": "^29.7.0", - "@swc/core": "^1.3.88", - "@swc/wasm": "^1.3.89", "figlet": "^1.6.0", "tslib": "^2.6.2" }, "devDependencies": { "juava": "workspace:*", + "@jitsu/protocols": "workspace:*", + "@jitsu/functions-lib": "workspace:*", "@jitsu/core-functions": "workspace:*", "typescript": "^5.2.2", "express": "^4.18.2", @@ -48,8 +48,8 @@ "node-fetch": "^3.3.2", "json5": "^2.2.3", "cuid": "^2.1.8", - "@babel/preset-env": "^7.22.15", - "@babel/preset-typescript": "^7.22.15", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.23.2", "@types/node": "^18.15.3", "@types/jest": "^29.5.5", "@types/express": "^4.17.17", diff --git a/cli/jitsu-cli/src/commands/build.ts b/cli/jitsu-cli/src/commands/build.ts index 43a6e7492..e5a5984e2 100644 --- a/cli/jitsu-cli/src/commands/build.ts +++ b/cli/jitsu-cli/src/commands/build.ts @@ -1,6 +1,5 @@ -import chalk from "chalk"; import path from "path"; -import { existsSync, writeFileSync, mkdirSync, readdirSync } from "fs"; +import { writeFileSync, mkdirSync, readdirSync } from "fs"; import typescript from "@rollup/plugin-typescript"; import resolve from "@rollup/plugin-node-resolve"; import commonjs from "@rollup/plugin-commonjs"; @@ -40,6 +39,7 @@ export async function build({ dir }: { dir?: string }) { const bundle = await rollup({ input: [funcFile], plugins: rollupPlugins, + external: ["@jitsu/functions-lib"], logLevel: "silent", }); diff --git a/cli/jitsu-cli/src/commands/run.ts b/cli/jitsu-cli/src/commands/run.ts index 8bce71a69..788de2ec9 100644 --- a/cli/jitsu-cli/src/commands/run.ts +++ b/cli/jitsu-cli/src/commands/run.ts @@ -8,6 +8,7 @@ import JSON5 from "json5"; import { loadPackageJson } from "./shared"; import isEqual from "lodash/isEqual"; import { b, red } from "../lib/chalk-code-highlight"; +import { DropRetryErrorName, RetryErrorName } from "@jitsu/functions-lib"; const currentDir = process.cwd(); @@ -101,9 +102,26 @@ export async function run({ } console.log(b("Function result:")); if (result.error) { - log.atError().log("Error:", result.error); + log.atError().log(`Error: ${result.error.name}: ${result.error.message}`); + if (result.error.name == DropRetryErrorName) { + log + .atError() + .log( + `If such error will happen on an actual event, it will be ${b("SKIPPED")} and retry will be scheduled in ${ + result.error.retryPolicy?.delays?.[0] ? Math.min(result.error.retryPolicy.delays[0], 1440) : 5 + } minutes.` + ); + } else if (result.error.name == RetryErrorName) { + log + .atError() + .log( + `If such error will happen on an actual event, this function will be scheduled for retry in ${ + result.error.retryPolicy?.delays?.[0] ? Math.min(result.error.retryPolicy.delays[0], 1440) : 5 + } minutes, but event will be processed further.` + ); + } } else if (result.dropped) { - log.atInfo().log(`Further processing will be SKIPPED. Function returned: ${JSON.stringify(result)}`); + log.atInfo().log(`Further processing will be ${b("SKIPPED")}. Function returned: ${JSON.stringify(result)}`); } else { console.log(JSON.stringify(result.result, null, 2)); } diff --git a/cli/jitsu-cli/src/index.ts b/cli/jitsu-cli/src/index.ts index 9c424cbf7..c1eeaba2f 100644 --- a/cli/jitsu-cli/src/index.ts +++ b/cli/jitsu-cli/src/index.ts @@ -14,7 +14,6 @@ console.log(figlet.textSync("Jitsu CLI", { horizontalLayout: "full" })); const p = new Command(); p.name(jitsuCliPackageName).description("CLI command to create, test and deploy extensions for Jitsu Next"); - p.command("init") .description("Initialize a new Jitsu extension project") .option( @@ -56,7 +55,7 @@ p.command("run") p.command("login") .description("Login to Jitsu and remember credentials in `~/.jitsu/jitsu-cli.json` file") - .option("--host ", "Jitsu host or base url", "https://use.jitsu.com") + .option("-h, --host ", "Jitsu host or base url", "https://use.jitsu.com") .option("-k, --apikey ", "Jitsu user's Api Key. (Optional). Disables interactive login.") .action(login); @@ -73,5 +72,7 @@ p.command("deploy") //version p.version(jitsuCliPackageName + " " + jitsuCliVersion, "-v, --version"); +//help +p.helpOption("--help", "display help for command"); p.parse(); diff --git a/cli/jitsu-cli/src/templates/functions.ts b/cli/jitsu-cli/src/templates/functions.ts index a43b6613f..14f2c2140 100644 --- a/cli/jitsu-cli/src/templates/functions.ts +++ b/cli/jitsu-cli/src/templates/functions.ts @@ -24,6 +24,7 @@ export const packageJsonTemplate = ({ packageName, license = "MIT", jitsuVersion devDependencies: { "jitsu-cli": `${jitsuCliVersion}`, "@jitsu/protocols": `${jitsuVersion || "^" + jitsuCliVersion}`, + "@jitsu/functions-lib": `${jitsuVersion || "^" + jitsuCliVersion}`, "@types/jest": "^29.5.5", "ts-jest": "^29.1.1", }, @@ -41,6 +42,7 @@ test("${sanitize(packageName)} test", () => { let functionCode = ({ packageName, functionName }: TemplateVars) => { return ` import { JitsuFunction } from "@jitsu/protocols/functions"; +import { RetryError } from "@jitsu/functions-lib"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; export const config = { diff --git a/libs/core-functions/package.json b/libs/core-functions/package.json index 6548c7a0b..f6fd8e531 100644 --- a/libs/core-functions/package.json +++ b/libs/core-functions/package.json @@ -21,6 +21,7 @@ }, "devDependencies": { "@jitsu/protocols": "workspace:*", + "@jitsu/functions-lib": "workspace:*", "@jitsu/sdk-js": "^3.1.3", "@types/jest": "^29.1.1", "@types/lodash": "^4.14.185", @@ -33,8 +34,6 @@ }, "dependencies": { "dayjs": "^1.11.10", - "@swc/core": "^1.3.88", - "@swc/wasm": "^1.3.89", "isolated-vm": "^4.6.0", "juava": "workspace:*", "lodash": "^4.17.21", diff --git a/libs/core-functions/src/functions/amplitude-destination.ts b/libs/core-functions/src/functions/amplitude-destination.ts index 939437de7..add2ad2ab 100644 --- a/libs/core-functions/src/functions/amplitude-destination.ts +++ b/libs/core-functions/src/functions/amplitude-destination.ts @@ -1,4 +1,5 @@ import { JitsuFunction } from "@jitsu/protocols/functions"; +import { RetryError } from "@jitsu/functions-lib"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import { randomUUID } from "crypto"; import { parseUserAgent } from "./lib/browser"; @@ -9,102 +10,109 @@ const AmplitudeDestination: JitsuFunction { - const groupType = props.groupType || "group"; - const deviceId = event.anonymousId; - const endpoint = - props.dataResidency === "EU" ? "https://api.eu.amplitude.com/2/httpapi" : "https://api2.amplitude.com/2/httpapi"; - let payload: any = undefined; - if (event.type === "identify") { - payload = { - api_key: props.key, - events: [ - { - time: dayjs(event.timestamp).valueOf(), - insert_id: event.messageId || randomUUID(), - user_id: event.userId, - event_type: "$identify", - user_properties: { - $set: { - ...event.traits, + try { + const groupType = props.groupType || "group"; + const deviceId = event.anonymousId; + const endpoint = + props.dataResidency === "EU" ? "https://api.eu.amplitude.com/2/httpapi" : "https://api2.amplitude.com/2/httpapi"; + let payload: any = undefined; + if (event.type === "identify") { + payload = { + api_key: props.key, + events: [ + { + time: dayjs(event.timestamp).valueOf(), + insert_id: event.messageId || randomUUID(), + user_id: event.userId, + event_type: "$identify", + user_properties: { + $set: { + ...event.traits, + }, }, }, - }, - ], - }; - } else if (event.type === "group" && props.enableGroupAnalytics) { - payload = { - api_key: props.key, - events: [ - { - time: dayjs(event.timestamp).valueOf(), - insert_id: event.messageId || randomUUID(), - user_id: event.userId, - event_type: "$groupidentify", - group_properties: { - $set: { - ...event.traits, + ], + }; + } else if (event.type === "group" && props.enableGroupAnalytics) { + payload = { + api_key: props.key, + events: [ + { + time: dayjs(event.timestamp).valueOf(), + insert_id: event.messageId || randomUUID(), + user_id: event.userId, + event_type: "$groupidentify", + group_properties: { + $set: { + ...event.traits, + }, + }, + groups: { + [groupType]: event.groupId, }, }, - groups: { - [groupType]: event.groupId, + ], + }; + } else if ( + (event.type === "page" || event.type === "track") && + (event.userId || props.enableAnonymousUserProfiles) + ) { + let geoObj: any = {}; + if (geo) { + geoObj = { + country: geo.country?.code, + region: geo.region?.code, + city: geo.city?.name, + dma: geo.location?.usaData ? geo.location.usaData.metroCode : undefined, + location_lat: geo.location?.latitude, + location_lng: geo.location?.longitude, + }; + } + const browser = event.context?.userAgent + ? parseUserAgent(event.context?.userAgent, event.context?.userAgentVendor) + : undefined; + let groups = {}; + if (event.context?.groupId && props.enableGroupAnalytics) { + groups = { [groupType]: event.context?.groupId }; + } + payload = { + api_key: props.key, + events: [ + { + time: dayjs(event.timestamp).valueOf(), + insert_id: event.messageId || randomUUID(), + event_type: event.type === "page" ? "pageview" : event.event || event.name || "Unknown Event", + event_properties: event.properties, + groups, + user_properties: event.context?.traits, + user_id: event.userId, + device_id: deviceId ?? undefined, + os_name: browser?.os, + language: event.context?.locale, + ip: event.request_ip, + user_agent: event.context?.userAgent, + ...geoObj, }, - }, - ], - }; - } else if ((event.type === "page" || event.type === "track") && (event.userId || props.enableAnonymousUserProfiles)) { - let geoObj: any = {}; - if (geo) { - geoObj = { - country: geo.country?.code, - region: geo.region?.code, - city: geo.city?.name, - dma: geo.location?.usaData ? geo.location.usaData.metroCode : undefined, - location_lat: geo.location?.latitude, - location_lng: geo.location?.longitude, + ], }; } - const browser = event.context?.userAgent - ? parseUserAgent(event.context?.userAgent, event.context?.userAgentVendor) - : undefined; - let groups = {}; - if (event.context?.groupId && props.enableGroupAnalytics) { - groups = { [groupType]: event.context?.groupId }; - } - payload = { - api_key: props.key, - events: [ - { - time: dayjs(event.timestamp).valueOf(), - insert_id: event.messageId || randomUUID(), - event_type: event.type === "page" ? "pageview" : event.event || event.name || "Unknown Event", - event_properties: event.properties, - groups, - user_properties: event.context?.traits, - user_id: event.userId, - device_id: deviceId ?? undefined, - os_name: browser?.os, - language: event.context?.locale, - ip: event.request_ip, - user_agent: event.context?.userAgent, - ...geoObj, + if (payload) { + const res = await fetch(endpoint, { + headers: { + "Content-Type": "application/json", + Accept: "*/*", }, - ], - }; - } - if (payload) { - const res = await fetch(endpoint, { - headers: { - "Content-Type": "application/json", - Accept: "*/*", - }, - method: "POST", - body: JSON.stringify(payload), - }); - if (res.status === 200) { - log.info(`Amplitude ${event.type} OK: ${res.status} message: ${await res.text()}`); - } else { - log.error(`Amplitude ${event.type} Error: ${res.status} message: ${await res.text()}`); + method: "POST", + body: JSON.stringify(payload), + }); + if (res.status === 200) { + log.info(`Amplitude ${event.type} OK: ${res.status} message: ${await res.text()}`); + } else { + throw new Error(`Amplitude ${event.type} Error: ${res.status} message: ${await res.text()}`); + } } + } catch (e: any) { + throw new RetryError(e.message); } }; diff --git a/libs/core-functions/src/functions/bulker-destination.ts b/libs/core-functions/src/functions/bulker-destination.ts index ad96b4653..134680743 100644 --- a/libs/core-functions/src/functions/bulker-destination.ts +++ b/libs/core-functions/src/functions/bulker-destination.ts @@ -1,4 +1,5 @@ import { JitsuFunction } from "@jitsu/protocols/functions"; +import { RetryError } from "@jitsu/functions-lib"; import { AnalyticsServerEvent, DataLayoutType } from "@jitsu/protocols/analytics"; import omit from "lodash/omit"; @@ -252,20 +253,26 @@ export type BulkerDestinationConfig = { const BulkerDestination: JitsuFunction = async (event, ctx) => { const { bulkerEndpoint, destinationId, authToken, dataLayout = "segment-single-table" } = ctx.props; - const events = dataLayouts[dataLayout](event); - - for (const { event, table } of Array.isArray(events) ? events : [events]) { - await ctx.fetch( - `${bulkerEndpoint}/post/${destinationId}?tableName=${table}`, - { - method: "POST", - headers: { Authorization: `Bearer ${authToken}` }, - body: JSON.stringify(event), - }, - false - ); + try { + const events = dataLayouts[dataLayout](event); + for (const { event, table } of Array.isArray(events) ? events : [events]) { + const res = await ctx.fetch( + `${bulkerEndpoint}/post/${destinationId}?tableName=${table}`, + { + method: "POST", + headers: { Authorization: `Bearer ${authToken}` }, + body: JSON.stringify(event), + }, + false + ); + if (!res.ok) { + throw new Error(`HTTP Error: ${res.status} ${res.statusText}`); + } + } + return event; + } catch (e: any) { + throw new RetryError(e.message); } - return event; }; BulkerDestination.displayName = "Bulker Destination"; diff --git a/libs/core-functions/src/functions/ga4-destination.ts b/libs/core-functions/src/functions/ga4-destination.ts index 7427a6942..8ceebd86d 100644 --- a/libs/core-functions/src/functions/ga4-destination.ts +++ b/libs/core-functions/src/functions/ga4-destination.ts @@ -1,4 +1,5 @@ import { JitsuFunction } from "@jitsu/protocols/functions"; +import { RetryError } from "@jitsu/functions-lib"; import type { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import { Ga4Credentials } from "../meta"; @@ -327,12 +328,12 @@ const Ga4Destination: JitsuFunction = asyn // ctx.log.info(`Ga4:${JSON.stringify(gaRequest)} --> ${result.status}: ${await result.text()}`); // } else if (result.status !== 200 && result.status !== 204) { - ctx.log.error(`Ga4:${JSON.stringify(gaRequest)} --> ${result.status} ${await result.text()}`); + throw new Error(`Ga4:${JSON.stringify(gaRequest)} --> ${result.status} ${await result.text()}`); } else { ctx.log.debug(`Ga4:${JSON.stringify(gaRequest)} --> ${result.status}`); } } catch (e: any) { - throw new Error(`Failed to send request to Ga4: ${JSON.stringify(gaRequest)}: ${e?.message}`); + throw new RetryError(`Failed to send request to Ga4: ${JSON.stringify(gaRequest)}: ${e?.message}`); } }; diff --git a/libs/core-functions/src/functions/june-destination.ts b/libs/core-functions/src/functions/june-destination.ts index 7e6da3590..9fa23d259 100644 --- a/libs/core-functions/src/functions/june-destination.ts +++ b/libs/core-functions/src/functions/june-destination.ts @@ -1,4 +1,5 @@ import { JitsuFunction } from "@jitsu/protocols/functions"; +import { RetryError } from "@jitsu/functions-lib"; import type { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import { JuneCredentials } from "../meta"; @@ -66,36 +67,36 @@ function groupEvent(event: AnalyticsServerEvent): any { const JuneDestination: JitsuFunction = async (event, ctx) => { ctx.log.debug(`June destination (props=${JSON.stringify(ctx.props)}) received event ${JSON.stringify(event)}`); - let httpRequest: HttpRequest | undefined = undefined; - const headers = { - "Content-type": "application/json", - Authorization: `Basic ${ctx.props.apiKey}`, - }; - if (event.type === "identify" && event.userId) { - httpRequest = { - url: `https://api.june.so/sdk/identify`, - payload: identifyEvent(event), - headers, - }; - } else if (event.type === "group") { - httpRequest = { - url: `https://api.june.so/sdk/group`, - payload: groupEvent(event), - headers, + try { + let httpRequest: HttpRequest | undefined = undefined; + const headers = { + "Content-type": "application/json", + Authorization: `Basic ${ctx.props.apiKey}`, }; - } else if (event.type === "track" || event.type === "page") { - if (event.userId || ctx.props.enableAnonymousUserProfiles) { + if (event.type === "identify" && event.userId) { httpRequest = { - url: `https://api.june.so/sdk/track`, - payload: trackEvent(event), + url: `https://api.june.so/sdk/identify`, + payload: identifyEvent(event), headers, }; + } else if (event.type === "group") { + httpRequest = { + url: `https://api.june.so/sdk/group`, + payload: groupEvent(event), + headers, + }; + } else if (event.type === "track" || event.type === "page") { + if (event.userId || ctx.props.enableAnonymousUserProfiles) { + httpRequest = { + url: `https://api.june.so/sdk/track`, + payload: trackEvent(event), + headers, + }; + } } - } - if (httpRequest) { - const method = httpRequest.method || "POST"; - try { + if (httpRequest) { + const method = httpRequest.method || "POST"; const result = await ctx.fetch(httpRequest.url, { method, headers: httpRequest.headers, @@ -105,17 +106,13 @@ const JuneDestination: JitsuFunction = as httpRequest.payload ? `${JSON.stringify(httpRequest.payload)} --> ` : "" }${result.status} ${await result.text()}`; if (result.status !== 200) { - ctx.log.error(logMessage); + throw new Error(logMessage); } else { ctx.log.debug(logMessage); } - } catch (e: any) { - throw new Error( - `Failed to send event to MixPanel: ${method} ${httpRequest.url} ${JSON.stringify(httpRequest.payload)}: ${ - e?.message - }` - ); } + } catch (e: any) { + throw new RetryError(e.message); } }; diff --git a/libs/core-functions/src/functions/lib/udf-wrapper-code.ts b/libs/core-functions/src/functions/lib/udf-wrapper-code.ts new file mode 100644 index 000000000..ef1d64be1 --- /dev/null +++ b/libs/core-functions/src/functions/lib/udf-wrapper-code.ts @@ -0,0 +1,81 @@ +import { DropRetryErrorName, RetryErrorName } from "@jitsu/functions-lib"; + +export const functionsLibCode = `const DropRetryErrorName = "Drop & RetryError"; +const RetryErrorName = "RetryError"; +class RetryError extends Error { + constructor(message, options) { + super(message); + this.name = options?.drop ? "${DropRetryErrorName}" : "${RetryErrorName}"; + } +} + +export { DropRetryErrorName, RetryError, RetryErrorName };`; + +export const wrapperCode = `//JS +import * as udf from "udf"; +import { RetryError } from "@jitsu/functions-lib"; + +const userFunction = udf.default; +const meta = udf.config || {}; + +global.RetryError = RetryError; + +const wrappedUserFunction = async function (eventcopy, ctxcopy) { + const c = ctxcopy.copy(); + const ctx = { + ...c, + store: { + ...c.store, + get: async key => { + const res = await c.store.get.apply(undefined, [key], { arguments: { copy: true }, result: { promise: true } }); + return res ? JSON.parse(res) : undefined; + }, + }, + fetch: async (url, opts) => { + const res = await c.fetch.apply(undefined, [url, opts], { arguments: { copy: true }, result: { promise: true } }); + const r = JSON.parse(res); + + return { + ...r, + json: async () => { + return JSON.parse(r.body); + }, + text: async () => { + return r.body; + }, + arrayBuffer: async () => { + throw new Error("Method 'arrayBuffer' is not implemented"); + }, + blob: async () => { + throw new Error("Method 'blob' is not implemented"); + }, + formData: async () => { + throw new Error("Method 'formData' is not implemented"); + }, + clone: async () => { + throw new Error("Method 'clone' is not implemented"); + }, + }; + }, + }; + const event = eventcopy.copy(); + if (!userFunction || typeof userFunction !== "function") { + throw new Error("Function not found. Please export default function."); + } + console = { + ...console, + log: ctx.log.info, + error: ctx.log.error, + warn: ctx.log.warn, + debug: ctx.log.debug, + info: ctx.log.info, + assert: (asrt, ...args) => { + if (!asrt) { + ctx.log.error("Assertion failed", ...args); + } + }, + }; + return userFunction(event, ctx); +}; +export { meta, wrappedUserFunction }; +`; diff --git a/libs/core-functions/src/functions/mixpanel-destination.ts b/libs/core-functions/src/functions/mixpanel-destination.ts index 49276fd7f..799b912ef 100644 --- a/libs/core-functions/src/functions/mixpanel-destination.ts +++ b/libs/core-functions/src/functions/mixpanel-destination.ts @@ -1,4 +1,5 @@ import { JitsuFunction } from "@jitsu/protocols/functions"; +import { RetryError } from "@jitsu/functions-lib"; import type { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import { randomId } from "juava"; import { MixpanelCredentials } from "../meta"; @@ -192,57 +193,57 @@ function merge(primaryId: string, secondaryId: string, props: MixpanelCredential const MixpanelDestination: JitsuFunction = async (event, ctx) => { ctx.log.debug(`Mixpanel destination (props=${JSON.stringify(ctx.props)}) received event ${JSON.stringify(event)}`); - const messages: HttpRequest[] = []; - if (event.type === "identify") { - if (!event.userId) { - const distinctId = `${(event.anonymousId || event.traits?.email) ?? ""}`; - if (!distinctId) { - ctx.log.info(`No distinct id found for event ${JSON.stringify(event)}`); - } else if (ctx.props.enableAnonymousUserProfiles) { - messages.push(...setProfileMessage(distinctId, event, ctx.props)); - } - if (event.anonymousId && event.traits?.email) { - messages.push(merge(`${event.anonymousId}`, `${event.traits.email}`, ctx.props)); - } - } else { - if (event.anonymousId) { - messages.push(merge(`${event.userId}`, `${event.anonymousId}`, ctx.props)); - } - if (event.traits?.email) { - messages.push(merge(`${event.userId}`, `${event.traits?.email}`, ctx.props)); + try { + const messages: HttpRequest[] = []; + if (event.type === "identify") { + if (!event.userId) { + const distinctId = `${(event.anonymousId || event.traits?.email) ?? ""}`; + if (!distinctId) { + ctx.log.info(`No distinct id found for event ${JSON.stringify(event)}`); + } else if (ctx.props.enableAnonymousUserProfiles) { + messages.push(...setProfileMessage(distinctId, event, ctx.props)); + } + if (event.anonymousId && event.traits?.email) { + messages.push(merge(`${event.anonymousId}`, `${event.traits.email}`, ctx.props)); + } + } else { + if (event.anonymousId) { + messages.push(merge(`${event.userId}`, `${event.anonymousId}`, ctx.props)); + } + if (event.traits?.email) { + messages.push(merge(`${event.userId}`, `${event.traits?.email}`, ctx.props)); + } + messages.push(...setProfileMessage(`${event.userId}`, event, ctx.props)); } - messages.push(...setProfileMessage(`${event.userId}`, event, ctx.props)); - } - if (ctx.props.sendIdentifyEvents) { - const distinctId = `${(event.userId || event.traits?.email || event.anonymousId) ?? ""}`; - if (distinctId) { - messages.push(trackEvent(distinctId, "Identify", event, ctx.props)); + if (ctx.props.sendIdentifyEvents) { + const distinctId = `${(event.userId || event.traits?.email || event.anonymousId) ?? ""}`; + if (distinctId) { + messages.push(trackEvent(distinctId, "Identify", event, ctx.props)); + } } - } - } else if (event.type === "group" && ctx.props.enableGroupAnalytics) { - messages.push(setGroupMessage(event, ctx.props)); - } else if (event.type === "track") { - const distinctId = `${(event.userId || event.anonymousId || event.traits?.email) ?? ""}`; - if (!distinctId) { - ctx.log.info(`No distinct id found for event ${JSON.stringify(event)}`); - } else { - if (event.userId || ctx.props.enableAnonymousUserProfiles) { - messages.push(trackEvent(distinctId, event.event as string, event, ctx.props)); + } else if (event.type === "group" && ctx.props.enableGroupAnalytics) { + messages.push(setGroupMessage(event, ctx.props)); + } else if (event.type === "track") { + const distinctId = `${(event.userId || event.anonymousId || event.traits?.email) ?? ""}`; + if (!distinctId) { + ctx.log.info(`No distinct id found for event ${JSON.stringify(event)}`); + } else { + if (event.userId || ctx.props.enableAnonymousUserProfiles) { + messages.push(trackEvent(distinctId, event.event as string, event, ctx.props)); + } } - } - } else if (event.type === "page") { - const distinctId = `${(event.userId || event.anonymousId || event.traits?.email) ?? ""}`; - if (!distinctId) { - ctx.log.info(`No distinct id found for Page View event ${JSON.stringify(event)}`); - } else { - if (event.userId || ctx.props.enableAnonymousUserProfiles) { - messages.push(trackEvent(distinctId, "Page View", event, ctx.props)); + } else if (event.type === "page") { + const distinctId = `${(event.userId || event.anonymousId || event.traits?.email) ?? ""}`; + if (!distinctId) { + ctx.log.info(`No distinct id found for Page View event ${JSON.stringify(event)}`); + } else { + if (event.userId || ctx.props.enableAnonymousUserProfiles) { + messages.push(trackEvent(distinctId, "Page View", event, ctx.props)); + } } } - } - for (const message of messages) { - const method = message.method || "POST"; - try { + for (const message of messages) { + const method = message.method || "POST"; const result = await ctx.fetch(message.url, { method, headers: message.headers, @@ -252,15 +253,13 @@ const MixpanelDestination: JitsuFunction ` : "" }${result.status} ${await result.text()}`; if (result.status !== 200) { - ctx.log.error(logMessage); + throw new Error(logMessage); } else { ctx.log.debug(logMessage); } - } catch (e: any) { - throw new Error( - `Failed to send event to MixPanel: ${method} ${message.url} ${JSON.stringify(message.payload)}: ${e?.message}` - ); } + } catch (e: any) { + throw new RetryError(e.message); } }; diff --git a/libs/core-functions/src/functions/mongodb-destination.ts b/libs/core-functions/src/functions/mongodb-destination.ts index 1f9eef49a..ed47ee2c7 100644 --- a/libs/core-functions/src/functions/mongodb-destination.ts +++ b/libs/core-functions/src/functions/mongodb-destination.ts @@ -1,4 +1,5 @@ import { FullContext, JitsuFunction } from "@jitsu/protocols/functions"; +import { RetryError } from "@jitsu/functions-lib"; import type { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import { getSingleton } from "juava"; import { MongoClient } from "mongodb"; @@ -53,8 +54,8 @@ const MongodbDestination: JitsuFunction ` : "" }${result.status} ${await result.text()}`; if (result.status !== 200) { - ctx.log.error(logMessage); + throw new RetryError(logMessage); } else { ctx.log.debug(logMessage); } } catch (e: any) { - throw new Error( - `Failed to send event to MixPanel: ${httpRequest.method} ${httpRequest.url} ${JSON.stringify( + throw new RetryError( + `Failed to send event to Segment: ${httpRequest.method} ${httpRequest.url} ${JSON.stringify( httpRequest.payload )}: ${e?.message}` ); diff --git a/libs/core-functions/src/functions/udf_wrapper.ts b/libs/core-functions/src/functions/udf_wrapper.ts index 559b9b2db..df074f704 100644 --- a/libs/core-functions/src/functions/udf_wrapper.ts +++ b/libs/core-functions/src/functions/udf_wrapper.ts @@ -1,18 +1,10 @@ import { getLog } from "juava"; import { Isolate, ExternalCopy, Callback, Reference } from "isolated-vm"; -import * as swc from "@swc/core"; -import { - EventContext, - EventsStore, - FetchOpts, - FetchResponse, - FuncReturn, - JitsuFunction, - Store, -} from "@jitsu/protocols/functions"; +import { EventContext, EventsStore, FetchOpts, FuncReturn, JitsuFunction, Store } from "@jitsu/protocols/functions"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import { createFullContext } from "../context"; import { isDropResult } from "../index"; +import { functionsLibCode, wrapperCode } from "./lib/udf-wrapper-code"; const log = getLog("udf-wrapper"); @@ -30,89 +22,11 @@ export type UDFWrapperResult = { close: () => void; }; -const wrapperJs = ` -const exported = exports; -let $userFunction; -let $config; -if (typeof exported === "function") { - $userFunction = exported; -} else { - $userFunction = exported.default; - $config = exported.config; - if (!$userFunction && Object.keys(exported).length > 0) { - $userFunction = Object.values(exported).find(v => typeof v === "function"); - } -} -const $wrappedUserFunction = async function (eventcopy, ctxcopy) { - const c = ctxcopy.copy(); - const ctx = { - ...c, - store: { - ...c.store, - get: async key => { - const res = await c.store.get.apply(undefined, [key], { arguments: { copy: true }, result: { promise: true } }); - return res ? JSON.parse(res) : undefined; - }, - }, - fetch: async (url, opts) => { - const res = await c.fetch.apply(undefined, [url, opts], { arguments: { copy: true }, result: { promise: true } }); - const r = JSON.parse(res); - - return { - ...r, - json: async () => { - return JSON.parse(r.body); - }, - text: async () => { - return r.body; - }, - arrayBuffer: async () => { - throw new Error("Method 'arrayBuffer' is not implemented"); - }, - blob: async () => { - throw new Error("Method 'blob' is not implemented"); - }, - formData: async () => { - throw new Error("Method 'formData' is not implemented"); - }, - clone: async () => { - throw new Error("Method 'clone' is not implemented"); - } - }; - }, - }; - const event = eventcopy.copy(); - if (!$userFunction || typeof $userFunction !== "function") { - throw new Error("Function not found. Please export default function."); - } - console = { - ...console, - log: ctx.log.info, - error: ctx.log.error, - warn: ctx.log.warn, - debug: ctx.log.debug, - info: ctx.log.info, - assert: (asrt, ...args) => { - if (!asrt) { - ctx.log.error("Assertion failed", ...args); - } - }, - }; - return $userFunction(event, ctx); -}; -export const meta = $config; -export default $wrappedUserFunction; -`; - export const UDFWrapper = (functionId, name, functionCode: string): UDFWrapperResult => { log.atInfo().log(`[${functionId}] Compiling UDF function '${name}'`); - functionCode = swc.transformSync(functionCode, { - filename: `index.js`, - module: { type: "commonjs" }, - }).code; const startMs = new Date().getTime(); try { - const wrappedCode = `let exports = {}\n${functionCode}\n${wrapperJs}`; + //const wrappedCode = `let exports = {}\n${functionCode}\n${wrapperJs}`; const isolate = new Isolate({ memoryLimit: 10 }); const context = isolate.createContextSync(); const jail = context.global; @@ -120,14 +34,38 @@ export const UDFWrapper = (functionId, name, functionCode: string): UDFWrapperRe // This make the global object available in the context as 'global'. We use 'derefInto()' here // because otherwise 'global' would actually be a Reference{} object in the new isolate. jail.setSync("global", jail.derefInto()); - const module = isolate.compileModuleSync(wrappedCode, { filename: "udf.js" }); - module.instantiateSync(context, (specifier: string) => { + + const functions = isolate.compileModuleSync(functionsLibCode, { + filename: "functions-lib.js", + }); + functions.instantiateSync(context, (specifier: string) => { + throw new Error(`import is not allowed: ${specifier}`); + }); + + const udf = isolate.compileModuleSync(functionCode, { filename: name + ".js" }); + udf.instantiateSync(context, (specifier: string) => { + if (specifier === "@jitsu/functions-lib") { + return functions; + } + throw new Error(`import is not allowed: ${specifier}`); + }); + + const wrapper = isolate.compileModuleSync(wrapperCode, { + filename: "jitsu-wrapper.js", + }); + wrapper.instantiateSync(context, (specifier: string) => { + if (specifier === "udf") { + return udf; + } + if (specifier === "@jitsu/functions-lib") { + return functions; + } throw new Error(`import is not allowed: ${specifier}`); }); - module.evaluateSync(); - const exported = module.namespace; + wrapper.evaluateSync(); + const exported = wrapper.namespace; - const ref = exported.getSync("default", { + const ref = exported.getSync("wrappedUserFunction", { reference: true, }); if (!ref || ref.typeof !== "function") { @@ -197,10 +135,14 @@ export const UDFWrapper = (functionId, name, functionCode: string): UDFWrapperRe default: return (res as Reference).copy(); } - } catch (e) { + } catch (e: any) { if (isolate.isDisposed) { throw new Error("Isolate is disposed"); } + if (meta) { + e.retryPolicy = meta.retryPolicy; + } + //log.atInfo().log(`ERROR name: ${e.name} message: ${e.message} json: ${e.stack}`); throw e; } }; @@ -232,11 +174,17 @@ export type UDFTestRequest = { }; export type UDFTestResponse = { - error?: any; + error?: { + message: string; + stack?: string; + name: string; + retryPolicy?: any; + }; dropped?: boolean; result: FuncReturn; store: any; logs: logType[]; + meta: any; }; export async function UDFTestRun({ @@ -248,6 +196,7 @@ export async function UDFTestRun({ config, }: UDFTestRequest): Promise { const logs: logType[] = []; + let wrapper: UDFWrapperResult | undefined = undefined; try { const eventContext: EventContext = { geo: { @@ -335,25 +284,31 @@ export async function UDFTestRun({ }, }; const ctx = createFullContext(id, eventsStore, storeImpl, eventContext, {}, config); - let wrapper: UDFWrapperResult; if (typeof code === "string") { wrapper = UDFWrapper(id, name, code); } else { wrapper = code; } - const result = await wrapper.userFunction(event, ctx); + const result = await wrapper?.userFunction(event, ctx); return { dropped: isDropResult(result), result: typeof result === "undefined" ? event : result, store: store, logs, + meta: wrapper?.meta, }; - } catch (e) { + } catch (e: any) { return { - error: `${e}`, + error: { + message: e.message, + stack: e.stack, + name: e.name, + retryPolicy: e.retryPolicy, + }, result: {}, store: store ?? {}, logs, + meta: wrapper?.meta, }; } } diff --git a/libs/core-functions/src/functions/webhook-destination.ts b/libs/core-functions/src/functions/webhook-destination.ts index ef21af2e7..d569a5c09 100644 --- a/libs/core-functions/src/functions/webhook-destination.ts +++ b/libs/core-functions/src/functions/webhook-destination.ts @@ -1,21 +1,29 @@ import { JitsuFunction } from "@jitsu/protocols/functions"; +import { RetryError } from "@jitsu/functions-lib"; import type { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import { WebhookDestinationConfig } from "../meta"; const WebhookDestination: JitsuFunction = async (event, ctx) => { - const headers = ctx.props.headers || []; - await ctx.fetch(ctx.props.url, { - method: ctx.props.method || "POST", - body: JSON.stringify(event), - headers: { - "Content-Type": "application/json", - ...headers.reduce((res, header) => { - const [key, value] = header.split(":"); - return { ...res, [key]: value }; - }, {}), - }, - }); - return event; + try { + const headers = ctx.props.headers || []; + const res = await ctx.fetch(ctx.props.url, { + method: ctx.props.method || "POST", + body: JSON.stringify(event), + headers: { + "Content-Type": "application/json", + ...headers.reduce((res, header) => { + const [key, value] = header.split(":"); + return { ...res, [key]: value }; + }, {}), + }, + }); + if (!res.ok) { + throw new Error(`HTTP Error: ${res.status} ${res.statusText}`); + } + return event; + } catch (e: any) { + throw new RetryError(e.message); + } }; WebhookDestination.displayName = "webhook-destination"; diff --git a/libs/core-functions/tsconfig.json b/libs/core-functions/tsconfig.json index 03f740fd6..0d8314b10 100644 --- a/libs/core-functions/tsconfig.json +++ b/libs/core-functions/tsconfig.json @@ -4,6 +4,7 @@ "outDir": "./dist", "declaration": true, "esModuleInterop": true, + "moduleResolution": "node", "target": "ES2019", "module": "commonjs", "lib": ["ES2019", "dom"], diff --git a/libs/functions/package.json b/libs/functions/package.json new file mode 100644 index 000000000..ff356ddd5 --- /dev/null +++ b/libs/functions/package.json @@ -0,0 +1,30 @@ +{ + "name": "@jitsu/functions-lib", + "version": "0.0.0", + "main": "dist/index.cjs.js", + "module": "dist/index.es.js", + "types": "dist/index.d.ts", + "description": "", + "author": "Jitsu Dev Team ", + "publishConfig": { + "access": "public" + }, + "license": "MIT", + "private": false, + "scripts": { + "compile": "tsc -p .", + "build": "rollup -c" + }, + "devDependencies": { + "rollup": "^4.1.4", + "@rollup/plugin-typescript": "^11.1.5", + "@types/jest": "^29.1.1", + "@types/node": "^18.11.10", + "jest": "^29.1.2", + "ts-jest": "29.0.5" + }, + "dependencies": { + "lodash": "^4.17.21", + "tslib": "^2.4.0" + } +} diff --git a/libs/functions/rollup.config.js b/libs/functions/rollup.config.js new file mode 100644 index 000000000..2adcf849c --- /dev/null +++ b/libs/functions/rollup.config.js @@ -0,0 +1,12 @@ +const typescript = require("@rollup/plugin-typescript"); + +module.exports = [ + { + plugins: [typescript()], + input: ["./src/index.ts"], + output: [ + { file: "dist/index.es.js", format: "es" }, + { file: "dist/index.cjs.js", format: "cjs" }, + ], + }, +]; diff --git a/libs/functions/src/index.ts b/libs/functions/src/index.ts new file mode 100644 index 000000000..59054f817 --- /dev/null +++ b/libs/functions/src/index.ts @@ -0,0 +1 @@ +export * from "./lib/functions"; diff --git a/libs/functions/src/lib/functions.ts b/libs/functions/src/lib/functions.ts new file mode 100644 index 000000000..8c7c4928e --- /dev/null +++ b/libs/functions/src/lib/functions.ts @@ -0,0 +1,9 @@ +export const DropRetryErrorName = "Drop & RetryError"; +export const RetryErrorName = "RetryError"; + +export class RetryError extends Error { + constructor(message?: any, options?: { drop: boolean }) { + super(message); + this.name = options?.drop ? `${DropRetryErrorName}` : `${RetryErrorName}`; + } +} diff --git a/libs/functions/tsconfig.json b/libs/functions/tsconfig.json new file mode 100644 index 000000000..576364cc8 --- /dev/null +++ b/libs/functions/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "lib": ["es2015", "dom", "es2017"], + "rootDir": "./src", + "outDir": "./dist", + "declaration": true, + "esModuleInterop": true, + "noEmit": true, + "target": "esnext" + }, + "exclude": [ + "__tests__", + "node_modules", + "dist", + "test_projects", + "test", + "templates" + ] +} \ No newline at end of file diff --git a/libs/jitsu-react/package.json b/libs/jitsu-react/package.json index 3d09f6ec7..25a2f2760 100644 --- a/libs/jitsu-react/package.json +++ b/libs/jitsu-react/package.json @@ -37,7 +37,7 @@ "@types/node": "^18.11.9", "microbundle-crl": "^0.13.11", "typescript": "^4.9.5", - "@babel/plugin-transform-regenerator": "^7.20.5" + "@babel/plugin-transform-regenerator": "^7.22.10" }, "files": [ "dist" diff --git a/package.json b/package.json index 898c2e605..2eba1117c 100644 --- a/package.json +++ b/package.json @@ -22,8 +22,8 @@ "factory-reset": "pnpm clean ; pnpm clean:turbo ; rm -rf `find . -type d -name node_modules`", "clean": "turbo run clean || exit 0", "lint": "turbo run lint --", - "release": "monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/jitsu-js --filter ./libs/jitsu-react --npm-tag latest", - "release:canary": "monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/jitsu-js --filter ./libs/jitsu-react --version '1.3.0-canary.{rev}.{time}' --npm-tag canary --git-tag 'canary-v{version}' --push-tag --publish" + "release": "monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/functions --filter ./libs/jitsu-js --filter ./libs/jitsu-react --npm-tag latest", + "release:canary": "monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/functions --filter ./libs/jitsu-js --filter ./libs/jitsu-react --version '1.3.1-canary.{rev}.{time}' --npm-tag canary --git-tag 'canary-v{version}' --push-tag --publish" }, "devDependencies": { "dotenv-cli": "^6.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ed11d6042..9335707b8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -31,12 +31,6 @@ importers: cli/jitsu-cli: dependencies: - '@swc/core': - specifier: ^1.3.88 - version: 1.3.88 - '@swc/wasm': - specifier: ^1.3.89 - version: 1.3.89 figlet: specifier: ^1.6.0 version: 1.6.0 @@ -51,14 +45,20 @@ importers: version: 2.6.2 devDependencies: '@babel/preset-env': - specifier: ^7.22.15 - version: 7.22.15(@babel/core@7.21.4) + specifier: ^7.23.2 + version: 7.23.2(@babel/core@7.21.4) '@babel/preset-typescript': - specifier: ^7.22.15 - version: 7.22.15(@babel/core@7.21.4) + specifier: ^7.23.2 + version: 7.23.2(@babel/core@7.21.4) '@jitsu/core-functions': specifier: workspace:* version: link:../../libs/core-functions + '@jitsu/functions-lib': + specifier: workspace:* + version: link:../../libs/functions + '@jitsu/protocols': + specifier: workspace:* + version: link:../../types/protocols '@rollup/plugin-commonjs': specifier: ^25.0.4 version: 25.0.4(rollup@3.29.1) @@ -97,7 +97,7 @@ importers: version: 18.15.11 '@types/webpack': specifier: ^5.28.2 - version: 5.28.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + version: 5.28.2(webpack-cli@5.1.4) '@webpack-cli/generators': specifier: ^3.0.7 version: 3.0.7(mem-fs-editor@9.7.0)(mem-fs@2.3.0)(prettier@2.8.7)(webpack-cli@5.1.4)(webpack@5.88.2) @@ -166,7 +166,7 @@ importers: version: 5.2.2 webpack: specifier: ^5.88.2 - version: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + version: 5.88.2(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 version: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.88.2) @@ -232,7 +232,7 @@ importers: version: 6.10.0(react-dom@18.2.0)(react@18.2.0) react-scripts: specifier: ^5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.21.0)(eslint@8.29.0)(react@18.2.0)(ts-node@10.8.2)(typescript@4.9.5) + version: 5.0.1(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.29.0)(react@18.2.0)(ts-node@10.8.2)(typescript@4.9.5) web-vitals: specifier: ^2.1.4 version: 2.1.4 @@ -255,12 +255,6 @@ importers: libs/core-functions: dependencies: - '@swc/core': - specifier: ^1.3.88 - version: 1.3.88 - '@swc/wasm': - specifier: ^1.3.89 - version: 1.3.89 agentkeepalive: specifier: 4.3.0 version: 4.3.0 @@ -289,6 +283,9 @@ importers: specifier: 3.21.4 version: 3.21.4 devDependencies: + '@jitsu/functions-lib': + specifier: workspace:* + version: link:../functions '@jitsu/protocols': specifier: workspace:* version: link:../../types/protocols @@ -320,6 +317,34 @@ importers: specifier: 29.0.5 version: 29.0.5(@babel/core@7.21.4)(jest@29.5.0)(typescript@4.9.5) + libs/functions: + dependencies: + lodash: + specifier: ^4.17.21 + version: 4.17.21 + tslib: + specifier: ^2.4.0 + version: 2.6.2 + devDependencies: + '@rollup/plugin-typescript': + specifier: ^11.1.5 + version: 11.1.5(rollup@4.1.4)(tslib@2.6.2)(typescript@4.9.5) + '@types/jest': + specifier: ^29.1.1 + version: 29.5.5 + '@types/node': + specifier: ^18.11.10 + version: 18.15.11 + jest: + specifier: ^29.1.2 + version: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) + rollup: + specifier: ^4.1.4 + version: 4.1.4 + ts-jest: + specifier: 29.0.5 + version: 29.0.5(@babel/core@7.21.4)(jest@29.7.0)(typescript@4.9.5) + libs/jitsu-js: dependencies: analytics: @@ -412,8 +437,8 @@ importers: version: 6.10.0(react-dom@18.2.0)(react@18.2.0) devDependencies: '@babel/plugin-transform-regenerator': - specifier: ^7.20.5 - version: 7.20.5(@babel/core@7.21.4) + specifier: ^7.22.10 + version: 7.22.10(@babel/core@7.21.4) '@testing-library/jest-dom': specifier: ^6.1.3 version: 6.1.3(@types/jest@29.5.0) @@ -469,6 +494,9 @@ importers: '@jitsu/core-functions': specifier: workspace:* version: link:../../libs/core-functions + '@jitsu/functions-lib': + specifier: workspace:* + version: link:../../libs/functions dayjs: specifier: ^1.11.10 version: 1.11.10 @@ -513,20 +541,20 @@ importers: version: 2.5.0 devDependencies: '@babel/preset-env': - specifier: ^7.20.2 - version: 7.21.4(@babel/core@7.21.4) + specifier: ^7.23.2 + version: 7.23.2(@babel/core@7.21.4) '@babel/preset-react': - specifier: ^7.18.6 - version: 7.18.6(@babel/core@7.21.4) + specifier: ^7.22.15 + version: 7.22.15(@babel/core@7.21.4) '@babel/preset-typescript': - specifier: ^7.21.0 - version: 7.21.4(@babel/core@7.21.4) + specifier: ^7.23.2 + version: 7.23.2(@babel/core@7.21.4) '@jitsu/protocols': specifier: workspace:* version: link:../../types/protocols '@rollup/plugin-babel': - specifier: ^6.0.2 - version: 6.0.3(@babel/core@7.21.4)(rollup@3.20.2) + specifier: ^6.0.4 + version: 6.0.4(@babel/core@7.21.4)(rollup@3.20.2) '@rollup/plugin-commonjs': specifier: ^23.0.2 version: 23.0.7(rollup@3.20.2) @@ -548,6 +576,9 @@ importers: '@types/glob': specifier: ^8.0.0 version: 8.1.0 + '@types/lodash': + specifier: ^4.14.200 + version: 4.14.200 '@types/minimist': specifier: ^1.2.2 version: 1.2.2 @@ -564,8 +595,8 @@ importers: specifier: ^3.0.0 version: 3.0.1(mem-fs-editor@9.7.0)(mem-fs@2.3.0)(prettier@2.8.7)(webpack-cli@5.0.1)(webpack@5.78.0) babel-loader: - specifier: ^9.1.2 - version: 9.1.2(@babel/core@7.21.4)(webpack@5.78.0) + specifier: ^9.1.3 + version: 9.1.3(@babel/core@7.21.4)(webpack@5.78.0) clean-webpack-plugin: specifier: ^4.0.0 version: 4.0.0(webpack@5.78.0) @@ -578,6 +609,9 @@ importers: dotenv-cli: specifier: ^6.0.0 version: 6.0.0 + lodash: + specifier: ^4.17.21 + version: 4.17.21 node-loader: specifier: ^2.0.0 version: 2.0.0(webpack@5.78.0) @@ -625,6 +659,9 @@ importers: '@jitsu/core-functions': specifier: workspace:* version: link:../../libs/core-functions + '@jitsu/functions-lib': + specifier: workspace:* + version: link:../../libs/functions '@jitsu/jitsu-react': specifier: workspace:* version: link:../../libs/jitsu-react @@ -695,7 +732,7 @@ importers: specifier: ^10.4.0 version: 10.4.0 firebase-admin: - specifier: ^11.10.1 + specifier: ^11.11.0 version: 11.11.0 googleapis: specifier: ^126.0.1 @@ -927,7 +964,7 @@ importers: specifier: 13.0.0 version: 13.0.0(eslint@8.29.0)(typescript@4.9.4) firebase-admin: - specifier: ^11.10.1 + specifier: ^11.11.0 version: 11.11.0 is-valid-domain: specifier: ^0.1.6 @@ -1691,12 +1728,8 @@ packages: '@babel/highlight': 7.22.13 chalk: 2.4.2 - /@babel/compat-data@7.21.4: - resolution: {integrity: sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==} - engines: {node: '>=6.9.0'} - - /@babel/compat-data@7.22.9: - resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} + /@babel/compat-data@7.23.2: + resolution: {integrity: sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==} engines: {node: '>=6.9.0'} /@babel/core@7.21.4: @@ -1707,12 +1740,12 @@ packages: '@babel/code-frame': 7.22.13 '@babel/generator': 7.21.4 '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-module-transforms': 7.22.17(@babel/core@7.21.4) + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.21.4) '@babel/helpers': 7.21.0 '@babel/parser': 7.22.16 '@babel/template': 7.22.15 '@babel/traverse': 7.21.4 - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 convert-source-map: 1.9.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -1739,77 +1772,33 @@ packages: resolution: {integrity: sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.18 jsesc: 2.5.2 - /@babel/helper-annotate-as-pure@7.18.6: - resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.17 - /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 - - /@babel/helper-builder-binary-assignment-operator-visitor@7.18.9: - resolution: {integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-explode-assignable-expression': 7.18.6 - '@babel/types': 7.22.17 - dev: true + '@babel/types': 7.23.0 /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 - - /@babel/helper-compilation-targets@7.21.4(@babel/core@7.21.4): - resolution: {integrity: sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.21.4 - '@babel/core': 7.21.4 - '@babel/helper-validator-option': 7.21.0 - browserslist: 4.21.10 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true + '@babel/types': 7.23.0 /@babel/helper-compilation-targets@7.22.15: resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.22.9 + '@babel/compat-data': 7.23.2 '@babel/helper-validator-option': 7.22.15 browserslist: 4.21.10 lru-cache: 5.1.1 semver: 6.3.1 - /@babel/helper-create-class-features-plugin@7.21.4(@babel/core@7.21.4): - resolution: {integrity: sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-member-expression-to-functions': 7.22.15 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.9(@babel/core@7.21.4) - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.21.4): resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} engines: {node: '>=6.9.0'} @@ -1818,7 +1807,7 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.22.5 '@babel/helper-member-expression-to-functions': 7.22.15 '@babel/helper-optimise-call-expression': 7.22.5 @@ -1827,16 +1816,6 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 - /@babel/helper-create-regexp-features-plugin@7.21.4(@babel/core@7.21.4): - resolution: {integrity: sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.22.5 - regexpu-core: 5.3.2 - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.21.4): resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} engines: {node: '>=6.9.0'} @@ -1862,9 +1841,10 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color + dev: false - /@babel/helper-define-polyfill-provider@0.4.2(@babel/core@7.21.4): - resolution: {integrity: sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==} + /@babel/helper-define-polyfill-provider@0.4.3(@babel/core@7.21.4): + resolution: {integrity: sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: @@ -1877,152 +1857,107 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-environment-visitor@7.18.9: - resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-environment-visitor@7.22.5: resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} engines: {node: '>=6.9.0'} - /@babel/helper-explode-assignable-expression@7.18.6: - resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.17 - dev: true - - /@babel/helper-function-name@7.21.0: - resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.22.17 - dev: true - /@babel/helper-function-name@7.22.5: resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.22.15 - '@babel/types': 7.22.17 - - /@babel/helper-hoist-variables@7.18.6: - resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.17 - dev: true + '@babel/types': 7.23.0 /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 /@babel/helper-member-expression-to-functions@7.22.15: resolution: {integrity: sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 - - /@babel/helper-module-imports@7.21.4: - resolution: {integrity: sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.21.4 + '@babel/types': 7.23.0 /@babel/helper-module-imports@7.22.15: resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 - /@babel/helper-module-transforms@7.21.2: - resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==} + /@babel/helper-module-transforms@7.22.17(@babel/core@7.21.4): + resolution: {integrity: sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: - '@babel/helper-environment-visitor': 7.22.5 + '@babel/core': 7.21.4 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-module-imports': 7.22.15 '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.15 - '@babel/template': 7.22.15 - '@babel/traverse': 7.21.4 - '@babel/types': 7.22.17 - transitivePeerDependencies: - - supports-color - dev: true + '@babel/helper-validator-identifier': 7.22.20 - /@babel/helper-module-transforms@7.22.17(@babel/core@7.21.4): - resolution: {integrity: sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==} + /@babel/helper-module-transforms@7.23.0(@babel/core@7.21.4): + resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-module-imports': 7.22.15 '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.15 - - /@babel/helper-optimise-call-expression@7.18.6: - resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.17 - dev: true + '@babel/helper-validator-identifier': 7.22.20 /@babel/helper-optimise-call-expression@7.22.5: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 - - /@babel/helper-plugin-utils@7.20.2: - resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} - engines: {node: '>=6.9.0'} + '@babel/types': 7.23.0 /@babel/helper-plugin-utils@7.22.5: resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} engines: {node: '>=6.9.0'} - /@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.21.4): - resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} + /@babel/helper-remap-async-to-generator@7.22.17(@babel/core@7.21.4): + resolution: {integrity: sha512-bxH77R5gjH3Nkde6/LuncQoLaP16THYPscurp1S8z7S9ZgezCyV3G8Hc+TZiCmY8pz4fp8CvKSgtJMW0FkLAxA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.21.4 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.22.17 - '@babel/types': 7.22.17 - dev: true - /@babel/helper-remap-async-to-generator@7.22.17(@babel/core@7.21.4): - resolution: {integrity: sha512-bxH77R5gjH3Nkde6/LuncQoLaP16THYPscurp1S8z7S9ZgezCyV3G8Hc+TZiCmY8pz4fp8CvKSgtJMW0FkLAxA==} + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.21.4): + resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.21.4 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-wrap-function': 7.22.17 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-wrap-function': 7.22.20 /@babel/helper-replace-supers@7.20.7: resolution: {integrity: sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-member-expression-to-functions': 7.22.15 '@babel/helper-optimise-call-expression': 7.22.5 '@babel/template': 7.22.15 '@babel/traverse': 7.21.4 - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 transitivePeerDependencies: - supports-color @@ -2033,66 +1968,40 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-member-expression-to-functions': 7.22.15 '@babel/helper-optimise-call-expression': 7.22.5 - /@babel/helper-simple-access@7.20.2: - resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.17 - dev: true - /@babel/helper-simple-access@7.22.5: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 - - /@babel/helper-skip-transparent-expression-wrappers@7.20.0: - resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.17 - dev: true + '@babel/types': 7.23.0 /@babel/helper-skip-transparent-expression-wrappers@7.22.5: resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 /@babel/helper-split-export-declaration@7.18.6: resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.17 - - /@babel/helper-string-parser@7.19.4: - resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} - engines: {node: '>=6.9.0'} + '@babel/types': 7.23.0 /@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-identifier@7.19.1: - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} - engines: {node: '>=6.9.0'} - - /@babel/helper-validator-identifier@7.22.15: - resolution: {integrity: sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==} - engines: {node: '>=6.9.0'} - - /@babel/helper-validator-option@7.21.0: - resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} /@babel/helper-validator-option@7.22.15: @@ -2105,7 +2014,15 @@ packages: dependencies: '@babel/helper-function-name': 7.22.5 '@babel/template': 7.22.15 - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 + + /@babel/helper-wrap-function@7.22.20: + resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': 7.22.5 + '@babel/template': 7.22.15 + '@babel/types': 7.23.0 /@babel/helpers@7.21.0: resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} @@ -2113,7 +2030,7 @@ packages: dependencies: '@babel/template': 7.22.15 '@babel/traverse': 7.21.4 - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 transitivePeerDependencies: - supports-color @@ -2121,7 +2038,7 @@ packages: resolution: {integrity: sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.22.15 + '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 @@ -2130,7 +2047,7 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 dev: true /@babel/parser@7.22.16: @@ -2138,17 +2055,7 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.22.17 - - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true + '@babel/types': 7.23.0 /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.15(@babel/core@7.21.4): resolution: {integrity: sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==} @@ -2159,18 +2066,6 @@ packages: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.20.7(@babel/core@7.21.4): - resolution: {integrity: sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.21.4) - dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.15(@babel/core@7.21.4): resolution: {integrity: sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==} engines: {node: '>=6.9.0'} @@ -2180,20 +2075,7 @@ packages: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.22.15(@babel/core@7.21.4) - - /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.21.4): - resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) - dev: true + '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.21.4) /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} @@ -2202,8 +2084,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.21.4) + '@babel/helper-plugin-utils': 7.22.5 + dev: false /@babel/plugin-proposal-class-properties@7.7.4(@babel/core@7.21.4): resolution: {integrity: sha512-EcuXeV4Hv1X3+Q1TsuOmyyxeTRiSqurGJ26+I/FW1WbymmRRapVORm6x1Zl3iDIHyRxEs+VXWp6qnlcfcJSbbw==} @@ -2211,22 +2094,10 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-proposal-class-static-block@7.21.0(@babel/core@7.21.4): - resolution: {integrity: sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.4) - dev: true - /@babel/plugin-proposal-decorators@7.21.0(@babel/core@7.21.4): resolution: {integrity: sha512-MfgX49uRrFUTL/HvWtmx3zmpyzMMr4MTj3d527MLlr/4RTT9G/ytFFP7qet2uM2Ve03b+BkpWUpK+lRXnQ+v9w==} engines: {node: '>=6.9.0'} @@ -2234,7 +2105,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-replace-supers': 7.20.7 '@babel/helper-split-export-declaration': 7.18.6 @@ -2242,50 +2113,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.4) - dev: true - - /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.21.4): - resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.4) - dev: true - - /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) - dev: true - - /@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.21.4): - resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) - dev: true - /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} @@ -2293,8 +2120,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) + dev: false /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} @@ -2303,33 +2131,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) - - /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.21.4): - resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.21.4 - '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-transform-parameters': 7.21.3(@babel/core@7.21.4) - dev: true - - /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) - dev: true + dev: false /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.21.4): resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} @@ -2349,20 +2153,23 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.21.4) + '@babel/helper-plugin-utils': 7.22.5 + dev: false /@babel/plugin-proposal-private-property-in-object@7.21.0(@babel/core@7.21.4): resolution: {integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.21.4) + '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.4) + dev: false /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.21.4): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} @@ -2372,17 +2179,6 @@ packages: dependencies: '@babel/core': 7.21.4 - /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} - engines: {node: '>=4'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.21.4): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: @@ -2450,16 +2246,6 @@ packages: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.21.4): - resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.21.4): resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} engines: {node: '>=6.9.0'} @@ -2579,16 +2365,6 @@ packages: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-typescript@7.21.4(@babel/core@7.21.4): - resolution: {integrity: sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.21.4): resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} engines: {node: '>=6.9.0'} @@ -2605,19 +2381,9 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-arrow-functions@7.20.7(@babel/core@7.21.4): - resolution: {integrity: sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.21.4): resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} engines: {node: '>=6.9.0'} @@ -2627,30 +2393,18 @@ packages: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-async-generator-functions@7.22.15(@babel/core@7.21.4): - resolution: {integrity: sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==} + /@babel/plugin-transform-async-generator-functions@7.23.2(@babel/core@7.21.4): + resolution: {integrity: sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.17(@babel/core@7.21.4) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.21.4) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) - /@babel/plugin-transform-async-to-generator@7.20.7(@babel/core@7.21.4): - resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-module-imports': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.21.4) - dev: true - /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.21.4): resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} engines: {node: '>=6.9.0'} @@ -2662,16 +2416,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-remap-async-to-generator': 7.22.17(@babel/core@7.21.4) - /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.21.4): resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} engines: {node: '>=6.9.0'} @@ -2681,18 +2425,8 @@ packages: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-block-scoping@7.21.0(@babel/core@7.21.4): - resolution: {integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-block-scoping@7.22.15(@babel/core@7.21.4): - resolution: {integrity: sha512-G1czpdJBZCtngoK1sJgloLiOHUnkb/bLZwqVZD8kXmq0ZnVfTTWUcs9OWtp0mBtYJ+4LQY1fllqBkOIPhXmFmw==} + /@babel/plugin-transform-block-scoping@7.23.0(@babel/core@7.21.4): + resolution: {integrity: sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2721,26 +2455,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.4) - /@babel/plugin-transform-classes@7.21.0(@babel/core@7.21.4): - resolution: {integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.21.0 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-replace-supers': 7.20.7 - '@babel/helper-split-export-declaration': 7.18.6 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-classes@7.22.15(@babel/core@7.21.4): resolution: {integrity: sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==} engines: {node: '>=6.9.0'} @@ -2758,17 +2472,6 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 - /@babel/plugin-transform-computed-properties@7.20.7(@babel/core@7.21.4): - resolution: {integrity: sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/template': 7.20.7 - dev: true - /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.21.4): resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} engines: {node: '>=6.9.0'} @@ -2779,18 +2482,8 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/template': 7.22.15 - /@babel/plugin-transform-destructuring@7.21.3(@babel/core@7.21.4): - resolution: {integrity: sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-destructuring@7.22.15(@babel/core@7.21.4): - resolution: {integrity: sha512-HzG8sFl1ZVGTme74Nw+X01XsUTqERVQ6/RLHo3XjGRzm7XD6QTtfS3NJotVgCGy8BzkDqRjRBD8dAyJn5TuvSQ==} + /@babel/plugin-transform-destructuring@7.23.0(@babel/core@7.21.4): + resolution: {integrity: sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2798,17 +2491,6 @@ packages: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.21.4): resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} engines: {node: '>=6.9.0'} @@ -2819,16 +2501,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.21.4): - resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.21.4): resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} engines: {node: '>=6.9.0'} @@ -2848,17 +2520,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.4) - /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.21.4): resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} engines: {node: '>=6.9.0'} @@ -2889,16 +2550,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-flow': 7.21.4(@babel/core@7.21.4) - /@babel/plugin-transform-for-of@7.21.0(@babel/core@7.21.4): - resolution: {integrity: sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.21.4): resolution: {integrity: sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==} engines: {node: '>=6.9.0'} @@ -2908,18 +2559,6 @@ packages: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.21.4): - resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) - '@babel/helper-function-name': 7.21.0 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.21.4): resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} engines: {node: '>=6.9.0'} @@ -2941,16 +2580,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) - /@babel/plugin-transform-literals@7.18.9(@babel/core@7.21.4): - resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-literals@7.22.5(@babel/core@7.21.4): resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} engines: {node: '>=6.9.0'} @@ -2970,16 +2599,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) - /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.21.4): resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} engines: {node: '>=6.9.0'} @@ -2989,93 +2608,38 @@ packages: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-modules-amd@7.20.11(@babel/core@7.21.4): - resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-module-transforms': 7.21.2 - '@babel/helper-plugin-utils': 7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-amd@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==} + /@babel/plugin-transform-modules-amd@7.23.0(@babel/core@7.21.4): + resolution: {integrity: sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-module-transforms': 7.22.17(@babel/core@7.21.4) + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-modules-commonjs@7.21.2(@babel/core@7.21.4): - resolution: {integrity: sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==} + /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.21.4): + resolution: {integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-module-transforms': 7.21.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-simple-access': 7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-commonjs@7.22.15(@babel/core@7.21.4): - resolution: {integrity: sha512-jWL4eh90w0HQOTKP2MoXXUpVxilxsB2Vl4ji69rSjS3EcZ/v4sBmn+A3NpepuJzBhOaEBbR7udonlHHn5DWidg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-module-transforms': 7.22.17(@babel/core@7.21.4) + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 - /@babel/plugin-transform-modules-systemjs@7.20.11(@babel/core@7.21.4): - resolution: {integrity: sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-module-transforms': 7.21.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-validator-identifier': 7.19.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-systemjs@7.22.11(@babel/core@7.21.4): - resolution: {integrity: sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==} + /@babel/plugin-transform-modules-systemjs@7.23.0(@babel/core@7.21.4): + resolution: {integrity: sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.22.17(@babel/core@7.21.4) + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.22.15 - - /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-module-transforms': 7.21.2 - '@babel/helper-plugin-utils': 7.20.2 - transitivePeerDependencies: - - supports-color - dev: true + '@babel/helper-validator-identifier': 7.22.20 /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.21.4): resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} @@ -3087,17 +2651,6 @@ packages: '@babel/helper-module-transforms': 7.22.17(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-named-capturing-groups-regex@7.20.5(@babel/core@7.21.4): - resolution: {integrity: sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.21.4): resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} engines: {node: '>=6.9.0'} @@ -3108,16 +2661,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-new-target@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.21.4): resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} engines: {node: '>=6.9.0'} @@ -3153,26 +2696,13 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.22.9 + '@babel/compat-data': 7.23.2 '@babel/core': 7.21.4 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.21.4) - /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-replace-supers': 7.20.7 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.21.4): resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} engines: {node: '>=6.9.0'} @@ -3193,8 +2723,8 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) - /@babel/plugin-transform-optional-chaining@7.22.15(@babel/core@7.21.4): - resolution: {integrity: sha512-ngQ2tBhq5vvSJw2Q2Z9i7ealNkpDMU0rGWnHPKqRZO0tzZ5tlaoz4hDvhXioOoaE0X2vfNss1djwg0DXlfu30A==} + /@babel/plugin-transform-optional-chaining@7.23.0(@babel/core@7.21.4): + resolution: {integrity: sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -3204,16 +2734,6 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) - /@babel/plugin-transform-parameters@7.21.3(@babel/core@7.21.4): - resolution: {integrity: sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.21.4): resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==} engines: {node: '>=6.9.0'} @@ -3245,16 +2765,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.4) - /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.21.4): resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} engines: {node: '>=6.9.0'} @@ -3280,16 +2790,26 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false - /@babel/plugin-transform-react-jsx-development@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==} + /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/plugin-transform-react-jsx': 7.21.0(@babel/core@7.21.4) + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.21.4) /@babel/plugin-transform-react-jsx@7.21.0(@babel/core@7.21.4): resolution: {integrity: sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg==} @@ -3298,32 +2818,35 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-module-imports': 7.21.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.21.4) - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 + dev: true - /@babel/plugin-transform-react-pure-annotations@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==} + /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.21.4): + resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.21.4) + '@babel/types': 7.23.0 - /@babel/plugin-transform-regenerator@7.20.5(@babel/core@7.21.4): - resolution: {integrity: sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==} + /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - regenerator-transform: 0.15.1 - dev: true + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.21.4): resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} @@ -3335,16 +2858,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 regenerator-transform: 0.15.2 - /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.21.4): resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} engines: {node: '>=6.9.0'} @@ -3371,16 +2884,6 @@ packages: - supports-color dev: false - /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.21.4): resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} engines: {node: '>=6.9.0'} @@ -3390,17 +2893,6 @@ packages: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-spread@7.20.7(@babel/core@7.21.4): - resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - dev: true - /@babel/plugin-transform-spread@7.22.5(@babel/core@7.21.4): resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} engines: {node: '>=6.9.0'} @@ -3411,16 +2903,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.21.4): resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} engines: {node: '>=6.9.0'} @@ -3430,16 +2912,6 @@ packages: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.21.4): - resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.21.4): resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} engines: {node: '>=6.9.0'} @@ -3449,16 +2921,6 @@ packages: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.21.4): - resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.21.4): resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} engines: {node: '>=6.9.0'} @@ -3468,19 +2930,6 @@ packages: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-typescript@7.21.3(@babel/core@7.21.4): - resolution: {integrity: sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.21.4) - dev: true - /@babel/plugin-transform-typescript@7.22.15(@babel/core@7.21.4): resolution: {integrity: sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==} engines: {node: '>=6.9.0'} @@ -3493,16 +2942,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.21.4) - /@babel/plugin-transform-unicode-escapes@7.18.10(@babel/core@7.21.4): - resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.21.4): resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} engines: {node: '>=6.9.0'} @@ -3522,130 +2961,33 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.21.4): resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 - - /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 - - /@babel/preset-env@7.21.4(@babel/core@7.21.4): - resolution: {integrity: sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.21.4 - '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-validator-option': 7.21.0 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-class-static-block': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-proposal-dynamic-import': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-proposal-json-strings': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-logical-assignment-operators': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-private-property-in-object': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.21.4) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.4) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-import-assertions': 7.20.0(@babel/core@7.21.4) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.4) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.21.4) - '@babel/plugin-transform-arrow-functions': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-transform-async-to-generator': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-transform-block-scoped-functions': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-block-scoping': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-transform-classes': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-transform-computed-properties': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-transform-destructuring': 7.21.3(@babel/core@7.21.4) - '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-duplicate-keys': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-transform-exponentiation-operator': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-for-of': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-transform-function-name': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-transform-literals': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-transform-member-expression-literals': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-modules-amd': 7.20.11(@babel/core@7.21.4) - '@babel/plugin-transform-modules-commonjs': 7.21.2(@babel/core@7.21.4) - '@babel/plugin-transform-modules-systemjs': 7.20.11(@babel/core@7.21.4) - '@babel/plugin-transform-modules-umd': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5(@babel/core@7.21.4) - '@babel/plugin-transform-new-target': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-object-super': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-parameters': 7.21.3(@babel/core@7.21.4) - '@babel/plugin-transform-property-literals': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-regenerator': 7.20.5(@babel/core@7.21.4) - '@babel/plugin-transform-reserved-words': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-shorthand-properties': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-spread': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-transform-sticky-regex': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-template-literals': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-transform-typeof-symbol': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-transform-unicode-escapes': 7.18.10(@babel/core@7.21.4) - '@babel/plugin-transform-unicode-regex': 7.18.6(@babel/core@7.21.4) - '@babel/preset-modules': 0.1.5(@babel/core@7.21.4) - '@babel/types': 7.21.4 - babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.21.4) - babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.21.4) - babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.21.4) - core-js-compat: 3.30.1 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.21.4) + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.21.4) + '@babel/helper-plugin-utils': 7.22.5 - /@babel/preset-env@7.22.15(@babel/core@7.21.4): - resolution: {integrity: sha512-tZFHr54GBkHk6hQuVA8w4Fmq+MSPsfvMG0vPnOYyTnJpyfMqybL8/MbNCPRT9zc2KBO2pe4tq15g6Uno4Jpoag==} + /@babel/preset-env@7.23.2(@babel/core@7.21.4): + resolution: {integrity: sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.22.9 + '@babel/compat-data': 7.23.2 '@babel/core': 7.21.4 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 @@ -3672,15 +3014,15 @@ packages: '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.21.4) '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.21.4) '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-async-generator-functions': 7.22.15(@babel/core@7.21.4) + '@babel/plugin-transform-async-generator-functions': 7.23.2(@babel/core@7.21.4) '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.21.4) '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-block-scoping': 7.22.15(@babel/core@7.21.4) + '@babel/plugin-transform-block-scoping': 7.23.0(@babel/core@7.21.4) '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.21.4) '@babel/plugin-transform-class-static-block': 7.22.11(@babel/core@7.21.4) '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.21.4) '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-destructuring': 7.22.15(@babel/core@7.21.4) + '@babel/plugin-transform-destructuring': 7.23.0(@babel/core@7.21.4) '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.21.4) '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.21.4) '@babel/plugin-transform-dynamic-import': 7.22.11(@babel/core@7.21.4) @@ -3692,9 +3034,9 @@ packages: '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.21.4) '@babel/plugin-transform-logical-assignment-operators': 7.22.11(@babel/core@7.21.4) '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-modules-amd': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-modules-commonjs': 7.22.15(@babel/core@7.21.4) - '@babel/plugin-transform-modules-systemjs': 7.22.11(@babel/core@7.21.4) + '@babel/plugin-transform-modules-amd': 7.23.0(@babel/core@7.21.4) + '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.21.4) + '@babel/plugin-transform-modules-systemjs': 7.23.0(@babel/core@7.21.4) '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.21.4) '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.21.4) '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.21.4) @@ -3703,7 +3045,7 @@ packages: '@babel/plugin-transform-object-rest-spread': 7.22.15(@babel/core@7.21.4) '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.21.4) '@babel/plugin-transform-optional-catch-binding': 7.22.11(@babel/core@7.21.4) - '@babel/plugin-transform-optional-chaining': 7.22.15(@babel/core@7.21.4) + '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.21.4) '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.21.4) '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.21.4) '@babel/plugin-transform-private-property-in-object': 7.22.11(@babel/core@7.21.4) @@ -3720,10 +3062,10 @@ packages: '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.21.4) '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.21.4) '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.21.4) - '@babel/types': 7.22.17 - babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.21.4) - babel-plugin-polyfill-corejs3: 0.8.3(@babel/core@7.21.4) - babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.21.4) + '@babel/types': 7.23.0 + babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.21.4) + babel-plugin-polyfill-corejs3: 0.8.5(@babel/core@7.21.4) + babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.21.4) core-js-compat: 3.32.2 semver: 6.3.1 transitivePeerDependencies: @@ -3741,19 +3083,6 @@ packages: '@babel/plugin-transform-flow-strip-types': 7.21.0(@babel/core@7.21.4) dev: true - /@babel/preset-modules@0.1.5(@babel/core@7.21.4): - resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.21.4) - '@babel/types': 7.21.4 - esutils: 2.0.3 - dev: true - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.21.4): resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: @@ -3761,41 +3090,25 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.22.5 - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 esutils: 2.0.3 - /@babel/preset-react@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-validator-option': 7.21.0 - '@babel/plugin-transform-react-display-name': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-react-jsx': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-transform-react-jsx-development': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-react-pure-annotations': 7.18.6(@babel/core@7.21.4) - - /@babel/preset-typescript@7.21.4(@babel/core@7.21.4): - resolution: {integrity: sha512-sMLNWY37TCdRH/bJ6ZeeOH1nPuanED7Ai9Y/vH31IPqalioJ6ZNFUWONsakhv4r4n+I6gm5lmoE0olkgib/j/A==} + /@babel/preset-react@7.22.15(@babel/core@7.21.4): + resolution: {integrity: sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-validator-option': 7.21.0 - '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.21.4) - '@babel/plugin-transform-modules-commonjs': 7.21.2(@babel/core@7.21.4) - '@babel/plugin-transform-typescript': 7.21.3(@babel/core@7.21.4) - transitivePeerDependencies: - - supports-color - dev: true + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.15 + '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.21.4) + '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.21.4) + '@babel/plugin-transform-react-pure-annotations': 7.22.5(@babel/core@7.21.4) - /@babel/preset-typescript@7.22.15(@babel/core@7.21.4): - resolution: {integrity: sha512-HblhNmh6yM+cU4VwbBRpxFhxsTdfS1zsvH9W+gEjD0ARV9+8B4sNfpI6GuhePti84nuvhiwKS539jKPFHskA9A==} + /@babel/preset-typescript@7.23.2(@babel/core@7.21.4): + resolution: {integrity: sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -3804,7 +3117,7 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.22.15 '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-modules-commonjs': 7.22.15(@babel/core@7.21.4) + '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.21.4) '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.21.4) /@babel/regjsgen@0.8.0: @@ -3816,22 +3129,13 @@ packages: dependencies: regenerator-runtime: 0.13.11 - /@babel/template@7.20.7: - resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/parser': 7.22.16 - '@babel/types': 7.22.17 - dev: true - /@babel/template@7.22.15: resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.22.13 '@babel/parser': 7.22.16 - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 /@babel/traverse@7.21.4: resolution: {integrity: sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==} @@ -3839,31 +3143,23 @@ packages: dependencies: '@babel/code-frame': 7.22.13 '@babel/generator': 7.21.4 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.22.5 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 '@babel/parser': 7.22.16 - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color - /@babel/types@7.21.4: - resolution: {integrity: sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.19.4 - '@babel/helper-validator-identifier': 7.19.1 - to-fast-properties: 2.0.0 - - /@babel/types@7.22.17: - resolution: {integrity: sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==} + /@babel/types@7.23.0: + resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.15 + '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 /@balena/dockerignore@1.0.2: @@ -4907,7 +4203,7 @@ packages: jest-validate: 29.5.0 jest-watcher: 29.5.0 micromatch: 4.0.5 - pretty-format: 29.5.0 + pretty-format: 29.7.0 slash: 3.0.0 strip-ansi: 6.0.1 transitivePeerDependencies: @@ -4983,7 +4279,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/fake-timers': 29.5.0 - '@jest/types': 29.5.0 + '@jest/types': 29.6.3 '@types/node': 18.15.11 jest-mock: 29.5.0 dev: true @@ -5031,7 +4327,7 @@ packages: resolution: {integrity: sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - expect: 29.5.0 + expect: 29.7.0 jest-snapshot: 29.5.0 transitivePeerDependencies: - supports-color @@ -5078,7 +4374,7 @@ packages: '@sinonjs/fake-timers': 10.0.2 '@types/node': 18.15.11 jest-message-util: 29.7.0 - jest-mock: 29.5.0 + jest-mock: 29.7.0 jest-util: 29.7.0 dev: true @@ -5322,15 +4618,6 @@ packages: graceful-fs: 4.2.11 dev: true - /@jest/source-map@29.4.3: - resolution: {integrity: sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jridgewell/trace-mapping': 0.3.18 - callsites: 3.1.0 - graceful-fs: 4.2.11 - dev: true - /@jest/source-map@29.6.3: resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -6104,7 +5391,7 @@ packages: react-refresh: 0.11.0 schema-utils: 3.3.0 source-map: 0.7.4 - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.0.1) webpack-dev-server: 4.13.2(webpack@5.88.2) dev: false @@ -6354,13 +5641,13 @@ packages: rollup: 2.79.1 dev: false - /@rollup/plugin-babel@6.0.3(@babel/core@7.21.4)(rollup@3.20.2): - resolution: {integrity: sha512-fKImZKppa1A/gX73eg4JGo+8kQr/q1HBQaCGKECZ0v4YBBv3lFqi14+7xyApECzvkLTHCifx+7ntcrvtBIRcpg==} + /@rollup/plugin-babel@6.0.4(@babel/core@7.21.4)(rollup@3.20.2): + resolution: {integrity: sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==} engines: {node: '>=14.0.0'} peerDependencies: '@babel/core': ^7.0.0 '@types/babel__core': ^7.1.9 - rollup: ^1.20.0||^2.0.0||^3.0.0 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: '@types/babel__core': optional: true @@ -6368,7 +5655,7 @@ packages: optional: true dependencies: '@babel/core': 7.21.4 - '@babel/helper-module-imports': 7.21.4 + '@babel/helper-module-imports': 7.22.15 '@rollup/pluginutils': 5.0.2(rollup@3.20.2) rollup: 3.20.2 dev: true @@ -6629,6 +5916,26 @@ packages: typescript: 5.2.2 dev: true + /@rollup/plugin-typescript@11.1.5(rollup@4.1.4)(tslib@2.6.2)(typescript@4.9.5): + resolution: {integrity: sha512-rnMHrGBB0IUEv69Q8/JGRD/n4/n6b3nfpufUu26axhUcboUzv/twfZU8fIBbTOphRAe0v8EyxzeDpKXqGHfyDA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.14.0||^3.0.0||^4.0.0 + tslib: '*' + typescript: '>=3.7.0' + peerDependenciesMeta: + rollup: + optional: true + tslib: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.2(rollup@4.1.4) + resolve: 1.22.2 + rollup: 4.1.4 + tslib: 2.6.2 + typescript: 4.9.5 + dev: true + /@rollup/plugin-typescript@9.0.2(rollup@3.20.2)(tslib@2.5.0)(typescript@4.9.5): resolution: {integrity: sha512-/sS93vmHUMjzDUsl5scNQr1mUlNE1QjBBvOhmRwJCH8k2RRhDIm3c977B3wdu3t3Ap17W6dDeXP3hj1P1Un1bA==} engines: {node: '>=14.0.0'} @@ -6738,6 +6045,117 @@ packages: rollup: 3.29.1 dev: true + /@rollup/pluginutils@5.0.2(rollup@4.1.4): + resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.1 + estree-walker: 2.0.2 + picomatch: 2.3.1 + rollup: 4.1.4 + dev: true + + /@rollup/rollup-android-arm-eabi@4.1.4: + resolution: {integrity: sha512-WlzkuFvpKl6CLFdc3V6ESPt7gq5Vrimd2Yv9IzKXdOpgbH4cdDSS1JLiACX8toygihtH5OlxyQzhXOph7Ovlpw==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.1.4: + resolution: {integrity: sha512-D1e+ABe56T9Pq2fD+R3ybe1ylCDzu3tY4Qm2Mj24R9wXNCq35+JbFbOpc2yrroO2/tGhTobmEl2Bm5xfE/n8RA==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.1.4: + resolution: {integrity: sha512-7vTYrgEiOrjxnjsgdPB+4i7EMxbVp7XXtS+50GJYj695xYTTEMn3HZVEvgtwjOUkAP/Q4HDejm4fIAjLeAfhtg==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.1.4: + resolution: {integrity: sha512-eGJVZScKSLZkYjhTAESCtbyTBq9SXeW9+TX36ki5gVhDqJtnQ5k0f9F44jNK5RhAMgIj0Ht9+n6HAgH0gUUyWQ==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.1.4: + resolution: {integrity: sha512-HnigYSEg2hOdX1meROecbk++z1nVJDpEofw9V2oWKqOWzTJlJf1UXVbDE6Hg30CapJxZu5ga4fdAQc/gODDkKg==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.1.4: + resolution: {integrity: sha512-TzJ+N2EoTLWkaClV2CUhBlj6ljXofaYzF/R9HXqQ3JCMnCHQZmQnbnZllw7yTDp0OG5whP4gIPozR4QiX+00MQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.1.4: + resolution: {integrity: sha512-aVPmNMdp6Dlo2tWkAduAD/5TL/NT5uor290YvjvFvCv0Q3L7tVdlD8MOGDL+oRSw5XKXKAsDzHhUOPUNPRHVTQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.1.4: + resolution: {integrity: sha512-77Fb79ayiDad0grvVsz4/OB55wJRyw9Ao+GdOBA9XywtHpuq5iRbVyHToGxWquYWlEf6WHFQQnFEttsAzboyKg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.1.4: + resolution: {integrity: sha512-/t6C6niEQTqmQTVTD9TDwUzxG91Mlk69/v0qodIPUnjjB3wR4UA3klg+orR2SU3Ux2Cgf2pWPL9utK80/1ek8g==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.1.4: + resolution: {integrity: sha512-ZY5BHHrOPkMbCuGWFNpJH0t18D2LU6GMYKGaqaWTQ3CQOL57Fem4zE941/Ek5pIsVt70HyDXssVEFQXlITI5Gg==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.1.4: + resolution: {integrity: sha512-XG2mcRfFrJvYyYaQmvCIvgfkaGinfXrpkBuIbJrTl9SaIQ8HumheWTIwkNz2mktCKwZfXHQNpO7RgXLIGQ7HXA==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.1.4: + resolution: {integrity: sha512-ANFqWYPwkhIqPmXw8vm0GpBEHiPpqcm99jiiAp71DbCSqLDhrtr019C5vhD0Bw4My+LmMvciZq6IsWHqQpl2ZQ==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@rushstack/eslint-patch@1.2.0: resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==} @@ -6899,7 +6317,7 @@ packages: rollup: 2.78.0 stacktrace-parser: 0.1.10 tslib: 2.6.2 - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.0.1) transitivePeerDependencies: - encoding - supports-color @@ -8533,173 +7951,66 @@ packages: dependencies: '@svgr/plugin-jsx': 5.5.0 camelcase: 6.3.0 - cosmiconfig: 7.1.0 - transitivePeerDependencies: - - supports-color - - /@svgr/hast-util-to-babel-ast@5.5.0: - resolution: {integrity: sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==} - engines: {node: '>=10'} - dependencies: - '@babel/types': 7.22.17 - - /@svgr/plugin-jsx@5.5.0: - resolution: {integrity: sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==} - engines: {node: '>=10'} - dependencies: - '@babel/core': 7.21.4 - '@svgr/babel-preset': 5.5.0 - '@svgr/hast-util-to-babel-ast': 5.5.0 - svg-parser: 2.0.4 - transitivePeerDependencies: - - supports-color - - /@svgr/plugin-svgo@5.5.0: - resolution: {integrity: sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==} - engines: {node: '>=10'} - dependencies: - cosmiconfig: 7.1.0 - deepmerge: 4.3.1 - svgo: 1.3.2 - - /@svgr/rollup@5.5.0: - resolution: {integrity: sha512-EiZmH2VTr+Xzyb6Ga8XtGa9MEbiU3WQnB5vHmqhwAUqibU3uwuwr7MN+QwIh/gtBk1ucMim8BCfcRTlLVREM8A==} - engines: {node: '>=10'} - dependencies: - '@babel/core': 7.21.4 - '@babel/plugin-transform-react-constant-elements': 7.21.3(@babel/core@7.21.4) - '@babel/preset-env': 7.22.15(@babel/core@7.21.4) - '@babel/preset-react': 7.18.6(@babel/core@7.21.4) - '@svgr/core': 5.5.0 - '@svgr/plugin-jsx': 5.5.0 - '@svgr/plugin-svgo': 5.5.0 - rollup-pluginutils: 2.8.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@svgr/webpack@5.5.0: - resolution: {integrity: sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==} - engines: {node: '>=10'} - dependencies: - '@babel/core': 7.21.4 - '@babel/plugin-transform-react-constant-elements': 7.21.3(@babel/core@7.21.4) - '@babel/preset-env': 7.22.15(@babel/core@7.21.4) - '@babel/preset-react': 7.18.6(@babel/core@7.21.4) - '@svgr/core': 5.5.0 - '@svgr/plugin-jsx': 5.5.0 - '@svgr/plugin-svgo': 5.5.0 - loader-utils: 2.0.4 - transitivePeerDependencies: - - supports-color - dev: false - - /@swc/core-darwin-arm64@1.3.88: - resolution: {integrity: sha512-Nb7kKydSQK3FE90pw/GPRFmAkquDQcTixLijNcki2xFBXh/DcGdFUPE/GShQjk8gtQelj2vqZrsGs/GZPGA1mA==} - engines: {node: '>=10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - optional: true - - /@swc/core-darwin-x64@1.3.88: - resolution: {integrity: sha512-RcCrnjkmLXL1izSHPYLaJKVaxwd64LYiYLqjX2jXG4U50D6LOlmuLeqTJ8aAnENZP19gNpsY9ggY9jD5UQqHAw==} - engines: {node: '>=10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - optional: true - - /@swc/core-linux-arm-gnueabihf@1.3.88: - resolution: {integrity: sha512-/H7QhpgbWX4xe6jbkgPrhjY543oCCmbPRvBMvZ3iuLb81bEtOFiEp9LYe/95ZW/BTz2z9a6fQtQMqkhAjcrV5w==} - engines: {node: '>=10'} - cpu: [arm] - os: [linux] - requiresBuild: true - optional: true - - /@swc/core-linux-arm64-gnu@1.3.88: - resolution: {integrity: sha512-ar/oQJxisjn/Su9rsg+XcBqA54Ylh1SyrZiLslv37OnGr785Xw+C//rw+JGoFmCZSjhGAU5hriOiHJd2S8mtqA==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - optional: true - - /@swc/core-linux-arm64-musl@1.3.88: - resolution: {integrity: sha512-ZyUtCk1Y4GpOajbHcnm2JwkFm/m8M/wP3I8iaAm/0yAPIYwQInVdD0Hn++eig2Y+nLJ7gT0QI82fFUDPEIP6Jw==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - optional: true - - /@swc/core-linux-x64-gnu@1.3.88: - resolution: {integrity: sha512-VrwGCzKLwimL0Js1yWRQNpcJCLGYkETku9mEI9sM4yF6kzT/jwfOe94udBe9O4GGUv24QkzHXRk+EnGR2LFSOQ==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - requiresBuild: true - optional: true + cosmiconfig: 7.1.0 + transitivePeerDependencies: + - supports-color - /@swc/core-linux-x64-musl@1.3.88: - resolution: {integrity: sha512-cur5h0JmNfF4ZHb+FBPLePX86lu3FUjxltObWUhqO4QiXzHxWfde6g+pgdqfUAer0cd9VEEjEKGA5OQncXqyCQ==} + /@svgr/hast-util-to-babel-ast@5.5.0: + resolution: {integrity: sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==} engines: {node: '>=10'} - cpu: [x64] - os: [linux] - requiresBuild: true - optional: true + dependencies: + '@babel/types': 7.23.0 - /@swc/core-win32-arm64-msvc@1.3.88: - resolution: {integrity: sha512-f9OVuWrey7X0gjCZlVD4d5/9/d0yyxu8KFUOEjyjJ2Kd+pvzRys1U3E0FE1PiiDOng3qrfdOt4HQxyAy2jts9Q==} + /@svgr/plugin-jsx@5.5.0: + resolution: {integrity: sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==} engines: {node: '>=10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - optional: true + dependencies: + '@babel/core': 7.21.4 + '@svgr/babel-preset': 5.5.0 + '@svgr/hast-util-to-babel-ast': 5.5.0 + svg-parser: 2.0.4 + transitivePeerDependencies: + - supports-color - /@swc/core-win32-ia32-msvc@1.3.88: - resolution: {integrity: sha512-7KCeTVe8wWRbuiuAwXoHKBkr9nugCAHQe/JGxoevHXxn2h+WwBuWHog1AbS6PvRWSKK8dVhKAAPDNWwdEltA5A==} + /@svgr/plugin-svgo@5.5.0: + resolution: {integrity: sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==} engines: {node: '>=10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - optional: true + dependencies: + cosmiconfig: 7.1.0 + deepmerge: 4.3.1 + svgo: 1.3.2 - /@swc/core-win32-x64-msvc@1.3.88: - resolution: {integrity: sha512-x0wr9kCS2Hmpx7H6gvJHA17G0DnvwToqWDSO1VmePt5hQZZfLzxiHHDHKFv4YYsVPbAU283q4Wa39QSPZeJbTA==} + /@svgr/rollup@5.5.0: + resolution: {integrity: sha512-EiZmH2VTr+Xzyb6Ga8XtGa9MEbiU3WQnB5vHmqhwAUqibU3uwuwr7MN+QwIh/gtBk1ucMim8BCfcRTlLVREM8A==} engines: {node: '>=10'} - cpu: [x64] - os: [win32] - requiresBuild: true - optional: true + dependencies: + '@babel/core': 7.21.4 + '@babel/plugin-transform-react-constant-elements': 7.21.3(@babel/core@7.21.4) + '@babel/preset-env': 7.23.2(@babel/core@7.21.4) + '@babel/preset-react': 7.22.15(@babel/core@7.21.4) + '@svgr/core': 5.5.0 + '@svgr/plugin-jsx': 5.5.0 + '@svgr/plugin-svgo': 5.5.0 + rollup-pluginutils: 2.8.2 + transitivePeerDependencies: + - supports-color + dev: true - /@swc/core@1.3.88: - resolution: {integrity: sha512-kaJ5t6Fg/DmJPNeI+jdtCEt7NVKxhUYToq7PF2fMRPFPLKSJzJCZajcp6/gZNcEUCVWaK6pWi/XL79Tzz1FqzQ==} + /@svgr/webpack@5.5.0: + resolution: {integrity: sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==} engines: {node: '>=10'} - requiresBuild: true - peerDependencies: - '@swc/helpers': ^0.5.0 - peerDependenciesMeta: - '@swc/helpers': - optional: true dependencies: - '@swc/counter': 0.1.1 - '@swc/types': 0.1.5 - optionalDependencies: - '@swc/core-darwin-arm64': 1.3.88 - '@swc/core-darwin-x64': 1.3.88 - '@swc/core-linux-arm-gnueabihf': 1.3.88 - '@swc/core-linux-arm64-gnu': 1.3.88 - '@swc/core-linux-arm64-musl': 1.3.88 - '@swc/core-linux-x64-gnu': 1.3.88 - '@swc/core-linux-x64-musl': 1.3.88 - '@swc/core-win32-arm64-msvc': 1.3.88 - '@swc/core-win32-ia32-msvc': 1.3.88 - '@swc/core-win32-x64-msvc': 1.3.88 - - /@swc/counter@0.1.1: - resolution: {integrity: sha512-xVRaR4u9hcYjFvcSg71Lz5Bo4//CyjAAfMxa7UsaDSYxAshflUkVJWiyVWrfxC59z2kP1IzI4/1BEpnhI9o3Mw==} + '@babel/core': 7.21.4 + '@babel/plugin-transform-react-constant-elements': 7.21.3(@babel/core@7.21.4) + '@babel/preset-env': 7.23.2(@babel/core@7.21.4) + '@babel/preset-react': 7.22.15(@babel/core@7.21.4) + '@svgr/core': 5.5.0 + '@svgr/plugin-jsx': 5.5.0 + '@svgr/plugin-svgo': 5.5.0 + loader-utils: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: false /@swc/helpers@0.5.2: resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} @@ -8707,13 +8018,6 @@ packages: tslib: 2.6.2 dev: false - /@swc/types@0.1.5: - resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} - - /@swc/wasm@1.3.89: - resolution: {integrity: sha512-S60dSgTxz6cXACbmxx1Hcj/5t2E3j/FV8scwJewPJ4HmrjxosREAjedB0UlZQ5RzE0Ox53tW+Uio++Kn6W7UKw==} - dev: false - /@tailwindcss/typography@0.5.9(tailwindcss@3.3.1): resolution: {integrity: sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg==} peerDependencies: @@ -8914,7 +8218,7 @@ packages: resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} dependencies: '@babel/parser': 7.22.16 - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.18.3 @@ -8922,18 +8226,18 @@ packages: /@types/babel__generator@7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 /@types/babel__template@7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: '@babel/parser': 7.22.16 - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 /@types/babel__traverse@7.18.3: resolution: {integrity: sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==} dependencies: - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 /@types/body-parser@1.19.2: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} @@ -9034,7 +8338,6 @@ packages: /@types/estree@0.0.51: resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} - dev: true /@types/estree@1.0.1: resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} @@ -9161,6 +8464,10 @@ packages: resolution: {integrity: sha512-trNJ/vtMZYMLhfN45uLq4ShQSw0/S7xCTLLVM+WM1rmFpba/VS42jVUgaO3w/NOLiWR/09lnYk0yMaA/atdIsg==} dev: true + /@types/lodash@4.14.200: + resolution: {integrity: sha512-YI/M/4HRImtNf3pJgbF+W6FrXovqj+T+/HpENLTooK9PnkacBsDpeP3IpHab40CClUfhNmdM2WTNP2sa2dni5Q==} + dev: true + /@types/long@4.0.2: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} dev: false @@ -9398,7 +8705,7 @@ packages: dependencies: '@types/node': 18.15.11 tapable: 2.2.1 - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.0.1) transitivePeerDependencies: - '@swc/core' - esbuild @@ -9406,12 +8713,12 @@ packages: - webpack-cli dev: true - /@types/webpack@5.28.2(@swc/core@1.3.88)(webpack-cli@5.1.4): + /@types/webpack@5.28.2(webpack-cli@5.1.4): resolution: {integrity: sha512-7tcxyrIOd7WGimZIcWU6pDsNh2edGGnwYExOvd3l/nMvuxqwVPrFXnnTbYCnplqV9BJoU7Mo2mfFtiH8CNFvYw==} dependencies: '@types/node': 18.15.11 tapable: 2.2.1 - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -9828,7 +9135,6 @@ packages: dependencies: '@webassemblyjs/helper-numbers': 1.11.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - dev: true /@webassemblyjs/ast@1.11.6: resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} @@ -9838,21 +9144,18 @@ packages: /@webassemblyjs/floating-point-hex-parser@1.11.1: resolution: {integrity: sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==} - dev: true /@webassemblyjs/floating-point-hex-parser@1.11.6: resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} /@webassemblyjs/helper-api-error@1.11.1: resolution: {integrity: sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==} - dev: true /@webassemblyjs/helper-api-error@1.11.6: resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} /@webassemblyjs/helper-buffer@1.11.1: resolution: {integrity: sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==} - dev: true /@webassemblyjs/helper-buffer@1.11.6: resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} @@ -9863,7 +9166,6 @@ packages: '@webassemblyjs/floating-point-hex-parser': 1.11.1 '@webassemblyjs/helper-api-error': 1.11.1 '@xtuc/long': 4.2.2 - dev: true /@webassemblyjs/helper-numbers@1.11.6: resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} @@ -9874,7 +9176,6 @@ packages: /@webassemblyjs/helper-wasm-bytecode@1.11.1: resolution: {integrity: sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==} - dev: true /@webassemblyjs/helper-wasm-bytecode@1.11.6: resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} @@ -9886,7 +9187,6 @@ packages: '@webassemblyjs/helper-buffer': 1.11.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.1 '@webassemblyjs/wasm-gen': 1.11.1 - dev: true /@webassemblyjs/helper-wasm-section@1.11.6: resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} @@ -9900,7 +9200,6 @@ packages: resolution: {integrity: sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==} dependencies: '@xtuc/ieee754': 1.2.0 - dev: true /@webassemblyjs/ieee754@1.11.6: resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} @@ -9911,7 +9210,6 @@ packages: resolution: {integrity: sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==} dependencies: '@xtuc/long': 4.2.2 - dev: true /@webassemblyjs/leb128@1.11.6: resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} @@ -9920,7 +9218,6 @@ packages: /@webassemblyjs/utf8@1.11.1: resolution: {integrity: sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==} - dev: true /@webassemblyjs/utf8@1.11.6: resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} @@ -9936,7 +9233,6 @@ packages: '@webassemblyjs/wasm-opt': 1.11.1 '@webassemblyjs/wasm-parser': 1.11.1 '@webassemblyjs/wast-printer': 1.11.1 - dev: true /@webassemblyjs/wasm-edit@1.11.6: resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} @@ -9958,7 +9254,6 @@ packages: '@webassemblyjs/ieee754': 1.11.1 '@webassemblyjs/leb128': 1.11.1 '@webassemblyjs/utf8': 1.11.1 - dev: true /@webassemblyjs/wasm-gen@1.11.6: resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} @@ -9976,7 +9271,6 @@ packages: '@webassemblyjs/helper-buffer': 1.11.1 '@webassemblyjs/wasm-gen': 1.11.1 '@webassemblyjs/wasm-parser': 1.11.1 - dev: true /@webassemblyjs/wasm-opt@1.11.6: resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} @@ -9995,7 +9289,6 @@ packages: '@webassemblyjs/ieee754': 1.11.1 '@webassemblyjs/leb128': 1.11.1 '@webassemblyjs/utf8': 1.11.1 - dev: true /@webassemblyjs/wasm-parser@1.11.6: resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} @@ -10012,7 +9305,6 @@ packages: dependencies: '@webassemblyjs/ast': 1.11.1 '@xtuc/long': 4.2.2 - dev: true /@webassemblyjs/wast-printer@1.11.6: resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} @@ -10029,7 +9321,6 @@ packages: dependencies: webpack: 5.78.0(webpack-cli@5.0.1) webpack-cli: 5.0.1(@webpack-cli/generators@3.0.1)(webpack@5.78.0) - dev: true /@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.88.2): resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} @@ -10038,7 +9329,7 @@ packages: webpack: 5.x.x webpack-cli: 5.x.x dependencies: - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.1.4) webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.88.2) /@webpack-cli/generators@3.0.1(mem-fs-editor@9.7.0)(mem-fs@2.3.0)(prettier@2.8.7)(webpack-cli@5.0.1)(webpack@5.78.0): @@ -10063,7 +9354,6 @@ packages: - mem-fs - mem-fs-editor - supports-color - dev: true /@webpack-cli/generators@3.0.7(mem-fs-editor@9.7.0)(mem-fs@2.3.0)(prettier@2.8.7)(webpack-cli@5.1.4)(webpack@5.88.2): resolution: {integrity: sha512-H4dlEX8CzO5EHBYYZQop9x4w6lG9FenSF/1spLRlvRAULDgTs0VfmwOuwp03tTLml9jpMsouuVw6vEN8KpwE/w==} @@ -10077,7 +9367,7 @@ packages: optional: true dependencies: prettier: 2.8.7 - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.1.4) webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.88.2) yeoman-environment: 3.15.1(mem-fs-editor@9.7.0)(mem-fs@2.3.0) yeoman-generator: 5.8.0(mem-fs@2.3.0)(yeoman-environment@3.15.1) @@ -10097,7 +9387,6 @@ packages: dependencies: webpack: 5.78.0(webpack-cli@5.0.1) webpack-cli: 5.0.1(@webpack-cli/generators@3.0.1)(webpack@5.78.0) - dev: true /@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.88.2): resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} @@ -10106,7 +9395,7 @@ packages: webpack: 5.x.x webpack-cli: 5.x.x dependencies: - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.1.4) webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.88.2) /@webpack-cli/serve@2.0.1(webpack-cli@5.0.1)(webpack@5.78.0): @@ -10122,7 +9411,6 @@ packages: dependencies: webpack: 5.78.0(webpack-cli@5.0.1) webpack-cli: 5.0.1(@webpack-cli/generators@3.0.1)(webpack@5.78.0) - dev: true /@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.88.2): resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} @@ -10135,7 +9423,7 @@ packages: webpack-dev-server: optional: true dependencies: - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.1.4) webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.88.2) /@xobotyi/scrollbar-width@1.9.5: @@ -10182,7 +9470,6 @@ packages: acorn: ^8 dependencies: acorn: 8.8.2 - dev: true /acorn-import-assertions@1.9.0(acorn@8.8.2): resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} @@ -10816,18 +10103,18 @@ packages: loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.0.1) dev: false - /babel-loader@9.1.2(@babel/core@7.21.4)(webpack@5.78.0): - resolution: {integrity: sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==} + /babel-loader@9.1.3(@babel/core@7.21.4)(webpack@5.78.0): + resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} engines: {node: '>= 14.15.0'} peerDependencies: '@babel/core': ^7.12.0 webpack: '>=5' dependencies: '@babel/core': 7.21.4 - find-cache-dir: 3.3.2 + find-cache-dir: 4.0.0 schema-utils: 4.0.0 webpack: 5.78.0(webpack-cli@5.0.1) dev: true @@ -10842,7 +10129,7 @@ packages: '@babel/core': 7.21.4 find-cache-dir: 4.0.0 schema-utils: 4.0.0 - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.1.4) dev: true /babel-plugin-istanbul@6.1.1: @@ -10862,7 +10149,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@babel/template': 7.22.15 - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 '@types/babel__core': 7.20.0 '@types/babel__traverse': 7.18.3 dev: false @@ -10872,7 +10159,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@babel/template': 7.22.15 - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 '@types/babel__core': 7.20.0 '@types/babel__traverse': 7.18.3 dev: true @@ -10882,7 +10169,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/template': 7.22.15 - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 '@types/babel__core': 7.20.0 '@types/babel__traverse': 7.18.3 @@ -10916,21 +10203,22 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.21.4 + '@babel/compat-data': 7.23.2 '@babel/core': 7.21.4 '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) semver: 6.3.1 transitivePeerDependencies: - supports-color + dev: false - /babel-plugin-polyfill-corejs2@0.4.5(@babel/core@7.21.4): - resolution: {integrity: sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==} + /babel-plugin-polyfill-corejs2@0.4.6(@babel/core@7.21.4): + resolution: {integrity: sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/compat-data': 7.22.9 + '@babel/compat-data': 7.23.2 '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.21.4) + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.21.4) semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -10942,17 +10230,18 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) - core-js-compat: 3.30.1 + core-js-compat: 3.32.2 transitivePeerDependencies: - supports-color + dev: false - /babel-plugin-polyfill-corejs3@0.8.3(@babel/core@7.21.4): - resolution: {integrity: sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==} + /babel-plugin-polyfill-corejs3@0.8.5(@babel/core@7.21.4): + resolution: {integrity: sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.21.4) + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.21.4) core-js-compat: 3.32.2 transitivePeerDependencies: - supports-color @@ -10966,14 +10255,15 @@ packages: '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) transitivePeerDependencies: - supports-color + dev: false - /babel-plugin-polyfill-regenerator@0.5.2(@babel/core@7.21.4): - resolution: {integrity: sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==} + /babel-plugin-polyfill-regenerator@0.5.3(@babel/core@7.21.4): + resolution: {integrity: sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.21.4) + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.21.4) transitivePeerDependencies: - supports-color @@ -11059,9 +10349,9 @@ packages: '@babel/plugin-transform-flow-strip-types': 7.21.0(@babel/core@7.21.4) '@babel/plugin-transform-react-display-name': 7.18.6(@babel/core@7.21.4) '@babel/plugin-transform-runtime': 7.21.4(@babel/core@7.21.4) - '@babel/preset-env': 7.22.15(@babel/core@7.21.4) - '@babel/preset-react': 7.18.6(@babel/core@7.21.4) - '@babel/preset-typescript': 7.22.15(@babel/core@7.21.4) + '@babel/preset-env': 7.23.2(@babel/core@7.21.4) + '@babel/preset-react': 7.22.15(@babel/core@7.21.4) + '@babel/preset-typescript': 7.23.2(@babel/core@7.21.4) '@babel/runtime': 7.21.0 babel-plugin-macros: 3.1.0 babel-plugin-transform-react-remove-prop-types: 0.4.24 @@ -11827,7 +11117,6 @@ packages: /commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} - dev: true /common-ancestor-path@1.0.1: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} @@ -11995,11 +11284,6 @@ packages: webpack: 5.78.0(webpack-cli@5.0.1) dev: true - /core-js-compat@3.30.1: - resolution: {integrity: sha512-d690npR7MC6P0gq4npTl5n2VQeNAmUrJ90n+MHiKS7W2+xno4o3F5GDEuylSdi6EJ3VssibSGXOa1r3YXD3Mhw==} - dependencies: - browserslist: 4.21.10 - /core-js-compat@3.32.2: resolution: {integrity: sha512-+GjlguTDINOijtVRUxrQOv3kfu9rl+qPNdX2LTbJ/ZyVTuxK+ksVSAGX1nHstu4hrv1En/uPTtWgq2gI5wt4AQ==} dependencies: @@ -12214,7 +11498,7 @@ packages: postcss-modules-values: 4.0.0(postcss@8.4.31) postcss-value-parser: 4.2.0 semver: 7.5.4 - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.0.1) dev: false /css-minimizer-webpack-plugin@3.4.1(webpack@5.88.2): @@ -12242,7 +11526,7 @@ packages: schema-utils: 4.0.0 serialize-javascript: 6.0.1 source-map: 0.6.1 - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.0.1) dev: false /css-modules-loader-core@1.1.0: @@ -12777,11 +12061,6 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dev: true - /diff-sequences@29.4.3: - resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - /diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -13110,7 +12389,6 @@ packages: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 - dev: true /enhanced-resolve@5.13.0: resolution: {integrity: sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==} @@ -13237,7 +12515,6 @@ packages: /es-module-lexer@0.9.3: resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} - dev: true /es-module-lexer@1.2.1: resolution: {integrity: sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==} @@ -13581,7 +12858,7 @@ packages: - supports-color dev: true - /eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.21.0)(eslint@8.29.0)(jest@27.5.1)(typescript@4.9.5): + /eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.29.0)(jest@27.5.1)(typescript@4.9.5): resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -13599,7 +12876,7 @@ packages: babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 eslint: 8.29.0 - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.21.0)(eslint@8.29.0) + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.29.0) eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.29.0) eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.58.0)(eslint@8.29.0)(jest@27.5.1)(typescript@4.9.5) eslint-plugin-jsx-a11y: 6.7.1(eslint@8.29.0) @@ -13725,7 +13002,7 @@ packages: - supports-color dev: true - /eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.21.0)(eslint@8.29.0): + /eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.29.0): resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -13734,7 +13011,7 @@ packages: eslint: ^8.1.0 dependencies: '@babel/plugin-syntax-flow': 7.21.4(@babel/core@7.21.4) - '@babel/plugin-transform-react-jsx': 7.21.0(@babel/core@7.21.4) + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.21.4) eslint: 8.29.0 lodash: 4.17.21 string-natural-compare: 3.0.1 @@ -13996,7 +13273,7 @@ packages: micromatch: 4.0.5 normalize-path: 3.0.0 schema-utils: 4.0.0 - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.0.1) dev: false /eslint@8.24.0: @@ -14460,7 +13737,7 @@ packages: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.0.1) dev: false /file-uri-to-path@1.0.0: @@ -14682,7 +13959,7 @@ packages: semver: 7.5.4 tapable: 1.1.3 typescript: 4.9.5 - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.0.1) dev: false /form-data@3.0.1: @@ -15446,7 +14723,7 @@ packages: lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.0.1) dev: false /htmlparser2@5.0.1: @@ -16750,16 +16027,6 @@ packages: pretty-format: 28.1.3 dev: true - /jest-diff@29.5.0: - resolution: {integrity: sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - diff-sequences: 29.4.3 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - dev: true - /jest-diff@29.7.0: resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -16783,13 +16050,6 @@ packages: detect-newline: 3.1.0 dev: true - /jest-docblock@29.4.3: - resolution: {integrity: sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - detect-newline: 3.1.0 - dev: true - /jest-docblock@29.7.0: resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -17017,14 +16277,6 @@ packages: pretty-format: 28.1.3 dev: true - /jest-leak-detector@29.5.0: - resolution: {integrity: sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - dev: true - /jest-leak-detector@29.7.0: resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -17057,7 +16309,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 - jest-diff: 29.5.0 + jest-diff: 29.7.0 jest-get-type: 29.6.3 pretty-format: 29.7.0 dev: true @@ -17149,9 +16401,9 @@ packages: resolution: {integrity: sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.5.0 + '@jest/types': 29.6.3 '@types/node': 18.15.11 - jest-util: 29.5.0 + jest-util: 29.7.0 dev: true /jest-mock@29.7.0: @@ -17393,7 +16645,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/console': 29.7.0 - '@jest/environment': 29.5.0 + '@jest/environment': 29.7.0 '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 @@ -17401,10 +16653,10 @@ packages: chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 - jest-docblock: 29.4.3 + jest-docblock: 29.7.0 jest-environment-node: 29.7.0 jest-haste-map: 29.7.0 - jest-leak-detector: 29.5.0 + jest-leak-detector: 29.7.0 jest-message-util: 29.7.0 jest-resolve: 29.7.0 jest-runtime: 29.7.0 @@ -17509,10 +16761,10 @@ packages: resolution: {integrity: sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.5.0 - '@jest/fake-timers': 29.5.0 - '@jest/globals': 29.5.0 - '@jest/source-map': 29.4.3 + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/globals': 29.7.0 + '@jest/source-map': 29.6.3 '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 @@ -17524,7 +16776,7 @@ packages: graceful-fs: 4.2.11 jest-haste-map: 29.7.0 jest-message-util: 29.7.0 - jest-mock: 29.5.0 + jest-mock: 29.7.0 jest-regex-util: 29.6.3 jest-resolve: 29.7.0 jest-snapshot: 29.7.0 @@ -17580,7 +16832,7 @@ packages: '@babel/generator': 7.21.4 '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.21.4) '@babel/traverse': 7.21.4 - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 '@types/babel__traverse': 7.18.3 @@ -17610,7 +16862,7 @@ packages: '@babel/generator': 7.21.4 '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.21.4) '@babel/traverse': 7.21.4 - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 '@jest/expect-utils': 28.1.3 '@jest/transform': 28.1.3 '@jest/types': 28.1.3 @@ -17642,19 +16894,19 @@ packages: '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.21.4) '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.21.4) '@babel/traverse': 7.21.4 - '@babel/types': 7.22.17 - '@jest/expect-utils': 29.5.0 + '@babel/types': 7.23.0 + '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@types/babel__traverse': 7.18.3 '@types/prettier': 2.7.2 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.4) chalk: 4.1.2 - expect: 29.5.0 + expect: 29.7.0 graceful-fs: 4.2.11 - jest-diff: 29.5.0 + jest-diff: 29.7.0 jest-get-type: 29.6.3 - jest-matcher-utils: 29.5.0 + jest-matcher-utils: 29.7.0 jest-message-util: 29.7.0 jest-util: 29.7.0 natural-compare: 1.4.0 @@ -17672,7 +16924,7 @@ packages: '@babel/generator': 7.21.4 '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.21.4) '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.21.4) - '@babel/types': 7.22.17 + '@babel/types': 7.23.0 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 @@ -18370,7 +17622,7 @@ packages: dependencies: klona: 2.0.6 less: 4.1.3 - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.0.1) dev: true /less@4.1.3: @@ -18916,7 +18168,7 @@ packages: '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.21.4) '@babel/plugin-transform-flow-strip-types': 7.21.0(@babel/core@7.21.4) '@babel/plugin-transform-react-jsx': 7.21.0(@babel/core@7.21.4) - '@babel/preset-env': 7.22.15(@babel/core@7.21.4) + '@babel/preset-env': 7.23.2(@babel/core@7.21.4) '@babel/preset-flow': 7.21.4(@babel/core@7.21.4) '@rollup/plugin-alias': 3.1.9(rollup@1.32.1) '@rollup/plugin-commonjs': 11.1.0(rollup@1.32.1) @@ -19019,7 +18271,7 @@ packages: webpack: ^5.0.0 dependencies: schema-utils: 4.0.0 - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.0.1) dev: false /minimalistic-assert@1.0.1: @@ -19921,7 +19173,7 @@ packages: webpack: ^5.0.0 dependencies: loader-utils: 2.0.4 - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.1.4) dev: true /node-postgres@0.6.2: @@ -21222,7 +20474,7 @@ packages: klona: 2.0.6 postcss: 8.4.30 semver: 7.5.4 - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.0.1) dev: false /postcss-logical@5.0.4(postcss@8.4.30): @@ -22424,7 +21676,7 @@ packages: dependencies: loader-utils: 2.0.4 schema-utils: 3.1.1 - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.0.1) dev: true /rc-align@4.0.15(react-dom@18.2.0)(react@18.2.0): @@ -23014,7 +22266,7 @@ packages: strip-ansi: 6.0.1 text-table: 0.2.0 typescript: 4.9.5 - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.0.1) transitivePeerDependencies: - eslint - supports-color @@ -23112,7 +22364,7 @@ packages: react: 18.2.0 dev: false - /react-scripts@5.0.1(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.21.0)(eslint@8.29.0)(react@18.2.0)(ts-node@10.8.2)(typescript@4.9.5): + /react-scripts@5.0.1(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.29.0)(react@18.2.0)(ts-node@10.8.2)(typescript@4.9.5): resolution: {integrity: sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==} engines: {node: '>=14.0.0'} hasBin: true @@ -23140,7 +22392,7 @@ packages: dotenv: 10.0.0 dotenv-expand: 5.1.0 eslint: 8.29.0 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.21.0)(eslint@8.29.0)(jest@27.5.1)(typescript@4.9.5) + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.29.0)(jest@27.5.1)(typescript@4.9.5) eslint-webpack-plugin: 3.2.0(eslint@8.29.0)(webpack@5.88.2) file-loader: 6.2.0(webpack@5.88.2) fs-extra: 10.1.0 @@ -23167,9 +22419,9 @@ packages: source-map-loader: 3.0.2(webpack@5.88.2) style-loader: 3.3.2(webpack@5.88.2) tailwindcss: 3.3.1(postcss@8.4.30)(ts-node@10.8.2) - terser-webpack-plugin: 5.3.7(@swc/core@1.3.88)(webpack@5.88.2) + terser-webpack-plugin: 5.3.7(webpack@5.88.2) typescript: 4.9.5 - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.0.1) webpack-dev-server: 4.13.2(webpack@5.88.2) webpack-manifest-plugin: 4.1.1(webpack@5.88.2) workbox-webpack-plugin: 6.5.4(webpack@5.88.2) @@ -23396,12 +22648,6 @@ packages: /regenerator-runtime@0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - /regenerator-transform@0.15.1: - resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} - dependencies: - '@babel/runtime': 7.21.0 - dev: true - /regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} dependencies: @@ -23622,7 +22868,7 @@ packages: rollup: '>=0.60.0 <3' dependencies: '@babel/core': 7.21.4 - '@babel/helper-module-imports': 7.21.4 + '@babel/helper-module-imports': 7.22.15 rollup: 1.32.1 rollup-pluginutils: 2.8.2 dev: true @@ -23768,6 +23014,26 @@ packages: fsevents: 2.3.2 dev: true + /rollup@4.1.4: + resolution: {integrity: sha512-U8Yk1lQRKqCkDBip/pMYT+IKaN7b7UesK3fLSTuHBoBJacCE+oBqo/dfG/gkUdQNNB2OBmRP98cn2C2bkYZkyw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.1.4 + '@rollup/rollup-android-arm64': 4.1.4 + '@rollup/rollup-darwin-arm64': 4.1.4 + '@rollup/rollup-darwin-x64': 4.1.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.1.4 + '@rollup/rollup-linux-arm64-gnu': 4.1.4 + '@rollup/rollup-linux-arm64-musl': 4.1.4 + '@rollup/rollup-linux-x64-gnu': 4.1.4 + '@rollup/rollup-linux-x64-musl': 4.1.4 + '@rollup/rollup-win32-arm64-msvc': 4.1.4 + '@rollup/rollup-win32-ia32-msvc': 4.1.4 + '@rollup/rollup-win32-x64-msvc': 4.1.4 + fsevents: 2.3.2 + dev: true + /rtl-css-js@1.16.1: resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} dependencies: @@ -23858,7 +23124,7 @@ packages: dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.0.1) dev: false /sax@1.2.4: @@ -23908,7 +23174,6 @@ packages: '@types/json-schema': 7.0.11 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - dev: true /schema-utils@3.3.0: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} @@ -24228,7 +23493,7 @@ packages: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.0.2 - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.0.1) dev: false /source-map-support@0.5.13: @@ -24677,7 +23942,7 @@ packages: peerDependencies: webpack: ^5.0.0 dependencies: - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.0.1) dev: false /styled-jsx@5.1.1(@babel/core@7.21.4)(react@18.2.0): @@ -25003,7 +24268,30 @@ packages: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - /terser-webpack-plugin@5.3.7(@swc/core@1.3.88)(webpack@5.88.2): + /terser-webpack-plugin@5.3.7(webpack@5.78.0): + resolution: {integrity: sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.18 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.1 + terser: 5.19.4 + webpack: 5.78.0(webpack-cli@5.0.1) + + /terser-webpack-plugin@5.3.7(webpack@5.88.2): resolution: {integrity: sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -25020,12 +24308,11 @@ packages: optional: true dependencies: '@jridgewell/trace-mapping': 0.3.18 - '@swc/core': 1.3.88 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.1 terser: 5.19.4 - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.1.4) /terser@4.8.1: resolution: {integrity: sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==} @@ -25295,6 +24582,40 @@ packages: yargs-parser: 21.1.1 dev: true + /ts-jest@29.0.5(@babel/core@7.21.4)(jest@29.7.0)(typescript@4.9.5): + resolution: {integrity: sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@babel/core': 7.21.4 + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) + jest-util: 29.5.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.5.4 + typescript: 4.9.5 + yargs-parser: 21.1.1 + dev: true + /ts-jest@29.1.1(@babel/core@7.21.4)(jest@29.7.0)(typescript@5.2.2): resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -25356,7 +24677,7 @@ packages: micromatch: 4.0.5 semver: 7.5.4 typescript: 5.2.2 - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.1.4) dev: true /ts-morph@12.0.0: @@ -26232,7 +25553,6 @@ packages: rechoir: 0.8.0 webpack: 5.78.0(webpack-cli@5.0.1) webpack-merge: 5.8.0 - dev: true /webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.88.2): resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} @@ -26264,7 +25584,7 @@ packages: import-local: 3.1.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.1.4) webpack-merge: 5.8.0 /webpack-dev-middleware@5.3.3(webpack@5.88.2): @@ -26278,7 +25598,7 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.0.0 - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.0.1) dev: false /webpack-dev-server@4.13.2(webpack@5.88.2): @@ -26322,7 +25642,7 @@ packages: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.0.1) webpack-dev-middleware: 5.3.3(webpack@5.88.2) ws: 8.13.0 transitivePeerDependencies: @@ -26339,7 +25659,7 @@ packages: webpack: ^4.44.2 || ^5.47.0 dependencies: tapable: 2.2.1 - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.0.1) webpack-sources: 2.3.1 dev: false @@ -26400,7 +25720,47 @@ packages: neo-async: 2.6.2 schema-utils: 3.1.1 tapable: 2.2.1 - terser-webpack-plugin: 5.3.7(@swc/core@1.3.88)(webpack@5.88.2) + terser-webpack-plugin: 5.3.7(webpack@5.78.0) + watchpack: 2.4.0 + webpack-cli: 5.0.1(@webpack-cli/generators@3.0.1)(webpack@5.78.0) + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + /webpack@5.88.2(webpack-cli@5.0.1): + resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.4 + '@types/estree': 1.0.1 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/wasm-edit': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + acorn: 8.8.2 + acorn-import-assertions: 1.9.0(acorn@8.8.2) + browserslist: 4.21.10 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.15.0 + es-module-lexer: 1.2.1 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.7(webpack@5.88.2) watchpack: 2.4.0 webpack-cli: 5.0.1(@webpack-cli/generators@3.0.1)(webpack@5.78.0) webpack-sources: 3.2.3 @@ -26408,9 +25768,8 @@ packages: - '@swc/core' - esbuild - uglify-js - dev: true - /webpack@5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4): + /webpack@5.88.2(webpack-cli@5.1.4): resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} engines: {node: '>=10.13.0'} hasBin: true @@ -26441,7 +25800,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.7(@swc/core@1.3.88)(webpack@5.88.2) + terser-webpack-plugin: 5.3.7(webpack@5.88.2) watchpack: 2.4.0 webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.88.2) webpack-sources: 3.2.3 @@ -26592,7 +25951,7 @@ packages: dependencies: '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0) '@babel/core': 7.21.4 - '@babel/preset-env': 7.22.15(@babel/core@7.21.4) + '@babel/preset-env': 7.23.2(@babel/core@7.21.4) '@babel/runtime': 7.21.0 '@rollup/plugin-babel': 5.3.1(@babel/core@7.21.4)(rollup@2.79.1) '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1) @@ -26721,7 +26080,7 @@ packages: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 - webpack: 5.88.2(@swc/core@1.3.88)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.0.1) webpack-sources: 1.4.3 workbox-build: 6.5.4 transitivePeerDependencies: diff --git a/services/rotor/package.json b/services/rotor/package.json index 664449d62..c5d04fc50 100644 --- a/services/rotor/package.json +++ b/services/rotor/package.json @@ -22,6 +22,7 @@ "node-cache": "^5.1.2", "@jitsu-internal/console": "workspace:*", "@jitsu/core-functions": "workspace:*", + "@jitsu/functions-lib": "workspace:*", "juava": "workspace:*", "express": "^4.18.2", "glob": "^8.0.3", @@ -34,12 +35,14 @@ "tslib": "^2.4.0" }, "devDependencies": { + "@types/lodash": "^4.14.200", + "lodash": "^4.17.21", "node-loader": "^2.0.0", - "@babel/preset-env": "^7.20.2", - "@babel/preset-typescript": "^7.21.0", - "@babel/preset-react": "^7.18.6", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.23.2", + "@babel/preset-react": "^7.22.15", "@jitsu/protocols": "workspace:*", - "@rollup/plugin-babel": "^6.0.2", + "@rollup/plugin-babel": "^6.0.4", "@rollup/plugin-commonjs": "^23.0.2", "@rollup/plugin-json": "^5.0.1", "@rollup/plugin-multi-entry": "^6.0.0", @@ -52,7 +55,7 @@ "@types/web": "0.0.69", "@types/webpack": "^5.28.0", "@webpack-cli/generators": "^3.0.0", - "babel-loader": "^9.1.2", + "babel-loader": "^9.1.3", "clean-webpack-plugin": "^4.0.0", "copy-webpack-plugin": "^11.0.0", "declaration-bundler-webpack-plugin": "^1.0.3", diff --git a/services/rotor/src/http/udf.ts b/services/rotor/src/http/udf.ts index 7107655f7..08a375cfb 100644 --- a/services/rotor/src/http/udf.ts +++ b/services/rotor/src/http/udf.ts @@ -8,7 +8,11 @@ export const UDFRunHandler = async (req, res) => { log.atInfo().log(`Running function: ${body?.functionId} workspace: ${body?.workspaceId}`, JSON.stringify(body)); const result = await UDFTestRun(body); if (result.error) { - log.atError().log(`Error running function: ${body?.functionId} workspace: ${body?.workspaceId}\n${result.error}`); + log + .atError() + .log( + `Error running function: ${body?.functionId} workspace: ${body?.workspaceId}\n${result.error.name}: ${result.error.message}` + ); } res.json(result); }; diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index da5bc5637..0d644a1d3 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -15,9 +15,9 @@ import minimist from "minimist"; import { glob } from "glob"; import fs from "fs"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; -import { FuncChain, runChain } from "./lib/functions-chain"; +import { checkError, FuncChain, runChain } from "./lib/functions-chain"; import { getBuiltinFunction, mongoAnonymousEventsStore, UDFWrapper } from "@jitsu/core-functions"; -import { EventContext, Geo, JitsuFunction, Store, SystemContext } from "@jitsu/protocols/functions"; +import { AnyEvent, EventContext, FullContext, JitsuFunction, Store, SystemContext } from "@jitsu/protocols/functions"; import { redis } from "@jitsu-internal/console/lib/server/redis"; import express from "express"; import NodeCache from "node-cache"; @@ -26,6 +26,7 @@ import { UDFRunHandler } from "./http/udf"; import Prometheus from "prom-client"; import { metrics } from "./lib/metrics"; import { redisLogger } from "./lib/redis-logger"; +import pick from "lodash/pick"; disableService("prisma"); disableService("pg"); @@ -63,7 +64,11 @@ const getCachedOrLoad = async (cache: NodeCache, key: string, loader: (key: stri return loaded; }; -export async function rotorMessageHandler(_message: string | undefined) { +export async function rotorMessageHandler( + _message: string | undefined, + functionsFilter?: (id: string) => boolean, + retries: number = 0 +) { if (!_message) { return; } @@ -79,6 +84,42 @@ export async function rotorMessageHandler(_message: string | undefined) { `Processing ${message.type} Message ID: ${message.messageId} for: ${connection.id} (${connection.streamId} → ${connection.destinationId}(${connection.type}))` ); + const event = message.httpPayload as AnalyticsServerEvent; + const ctx: EventContext = { + headers: message.httpHeaders, + geo: message.geo, + retries, + source: { + id: connection.streamId, + domain: message.origin?.domain, + }, + destination: { + id: connection.destinationId, + type: connection.type, + updatedAt: connection.updatedAt, + hash: connection.credentialsHash, + }, + connection: { + id: connection.id, + mode: connection.mode, + options: connection.options, + }, + }; + const redisClient = redis(); + const store: Store = { + get: async (key: string) => { + const res = await redisClient.hget(`store:${connection.id}`, key); + return res ? JSON.parse(res) : undefined; + }, + set: async (key: string, obj: any) => { + await redisClient.hset(`store:${connection.id}`, key, JSON.stringify(obj)); + }, + del: async (key: string) => { + await redisClient.hdel(`store:${connection.id}`, key); + }, + }; + const rl = await redisLogger.waitInit(); + const connectionData = connection.options as any; let mainFunction; @@ -105,24 +146,19 @@ export async function rotorMessageHandler(_message: string | undefined) { ); } } - const functions = [...(connectionData.functions || []), mainFunction]; + const functions = [...(connectionData.functions || []), mainFunction].filter(f => + functionsFilter ? functionsFilter(f.functionId) : true + ); //system context for builtin functions only const systemContext: SystemContext = { $system: { anonymousEventsStore: mongoAnonymousEventsStore(), }, }; - - const funcChain: FuncChain = await Promise.all( - functions.map(async f => { - if (f.functionId.startsWith("builtin.")) { - return { - id: f.functionId as string, - config: f.functionOptions as any, - exec: requireDefined(getBuiltinFunction(f.functionId), `Unknown function ${f.functionId}`) as JitsuFunction, - context: systemContext, - }; - } else if (f.functionId.startsWith("udf.")) { + const udfFuncChain: FuncChain = await Promise.all( + functions + .filter(f => f.functionId.startsWith("udf.")) + .map(async f => { const functionId = f.functionId.substring(4); const userFunctionObj = requireDefined( await getCachedOrLoad(functionsCache, functionId, key => { @@ -165,53 +201,54 @@ export async function rotorMessageHandler(_message: string | undefined) { }, context: {}, }; - } else { - throw newError(`Function of unknown type: ${f.functionId}`); - } - }) + }) ); - const event = message.httpPayload as AnalyticsServerEvent; - const ctx: EventContext = { - headers: message.httpHeaders, - geo: message.geo, - source: { - id: connection.streamId, - domain: message.origin?.domain, - }, - destination: { - id: connection.destinationId, - type: connection.type, - updatedAt: connection.updatedAt, - hash: connection.credentialsHash, - }, - connection: { - id: connection.id, - mode: connection.mode, - options: connection.options, - }, - }; - const redisClient = redis(); - const store: Store = { - get: async (key: string) => { - const res = await redisClient.hget(`store:${connection.id}`, key); - return res ? JSON.parse(res) : undefined; - }, - set: async (key: string, obj: any) => { - await redisClient.hset(`store:${connection.id}`, key, JSON.stringify(obj)); - }, - del: async (key: string) => { - await redisClient.hdel(`store:${connection.id}`, key); - }, + const aggregatedFunctions: any[] = [ + ...functions.filter(f => f.functionId.startsWith("builtin.transformation.")), + ...(udfFuncChain.length > 0 ? [{ functionId: "udf.PIPELINE" }] : []), + ...functions.filter(f => f.functionId.startsWith("builtin.destination.")), + ]; + + const udfPipelineFunc = async (event: AnyEvent, ctx: FullContext) => { + const chainRes = await runChain( + udfFuncChain, + event, + connection, + rl, + store, + pick(ctx, ["geo", "headers", "source", "destination", "connection", "retries"]) + ); + checkError(chainRes); + return chainRes.events; }; - const rl = await redisLogger.waitInit(); - await runChain(funcChain, event, connection, rl, store, ctx).then(async execLog => { - await metrics().logMetrics(connection.workspaceId, message.messageId, execLog); - }); -} -const retrySettings = { - maxMinutesInQueue: process.env.KAFKA_MAX_MINUTES_IN_QUEUE ? parseInt(process.env.KAFKA_MAX_MINUTES_IN_QUEUE) : 120, -}; + const funcChain: FuncChain = await Promise.all( + aggregatedFunctions + .filter(f => (functionsFilter ? functionsFilter(f.functionId) : true)) + .map(async f => { + if (f.functionId.startsWith("builtin.")) { + return { + id: f.functionId as string, + config: f.functionOptions as any, + exec: requireDefined(getBuiltinFunction(f.functionId), `Unknown function ${f.functionId}`) as JitsuFunction, + context: systemContext, + }; + } else if (f.functionId === "udf.PIPELINE") { + return { + id: f.functionId as string, + config: {}, + exec: udfPipelineFunc, + context: systemContext, + }; + } else { + throw newError(`Function of unknown type: ${f.functionId}`); + } + }) + ); + const chainRes = await runChain(funcChain, event, connection, rl, store, ctx); + await metrics().logMetrics(connection.workspaceId, message.messageId, chainRes.execLog); + checkError(chainRes); +} async function main() { process.on("uncaughtException", function (err) { @@ -286,7 +323,6 @@ async function main() { credentials: getCredentialsFromEnv(), kafkaTopics: kafkaTopics, consumerGroupId, - maxSecondsInQueueAfterFailure: retrySettings.maxMinutesInQueue * 60, handle: rotorMessageHandler, }); log.atInfo().log("Starting kafka processing"); diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index bc5bd5635..2160789df 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -8,9 +8,11 @@ import { SystemContext, } from "@jitsu/protocols/functions"; import { createFullContext, isDropResult } from "@jitsu/core-functions"; +import { RetryErrorName, DropRetryErrorName } from "@jitsu/functions-lib"; -import { getErrorMessage, getLog, stopwatch } from "juava"; +import { getLog, stopwatch } from "juava"; import { EnrichedConnectionConfig } from "@jitsu-internal/console/lib/server/fast-store"; +import { retryLogMessageIfNeeded } from "./retries"; export type Func = { id: string; @@ -23,13 +25,33 @@ export type FuncChain = Func[]; const log = getLog("functions-chain"); -export type FunctionExecLog = { +export type FuncChainResult = { + events: AnyEvent[]; + execLog: FunctionExecLog; +}; + +export type FunctionExecRes = { eventIndex: number; + event?: any; functionId: string; - error?: string; + error?: any; dropped?: boolean; ms: number; -}[]; +}; + +export type FunctionExecLog = FunctionExecRes[]; + +export function checkError(chainRes: FuncChainResult) { + for (const el of chainRes.execLog) { + if (el.error && (el.error.name === DropRetryErrorName || el.error.name === RetryErrorName)) { + // throw retry errors above to schedule retry + const err = el.error; + err.event = el.event; + err.functionId = err.functionId || el.functionId; + throw err; + } + } +} export async function runChain( chain: FuncChain, @@ -38,45 +60,57 @@ export async function runChain( eventsStore: EventsStore, store: Store, eventContext: EventContext -): Promise { +): Promise { const execLog: FunctionExecLog = []; let events = [event]; for (const f of chain) { const newEvents: AnyEvent[] = []; for (let i = 0; i < events.length; i++) { const event = events[i]; - let result: FuncReturn; + let result: FuncReturn = undefined; const sw = stopwatch(); const funcCtx = createFullContext(f.id, eventsStore, store, eventContext, f.context, f.config, event); try { result = await f.exec(event, funcCtx); - } catch (err) { - funcCtx.log.error(`Function execution failed`, err); - newEvents.push(event); execLog.push({ eventIndex: i, functionId: f.id, - error: getErrorMessage(err), ms: sw.elapsedMs(), + dropped: isDropResult(result), + }); + } catch (err: any) { + if (err.name === DropRetryErrorName) { + result = "drop"; + } + execLog.push({ + eventIndex: i, + functionId: f.id, + event, + error: err, + ms: sw.elapsedMs(), + dropped: isDropResult(result), }); - continue; + if (f.id === "udf.PIPELINE") { + if (err.name !== DropRetryErrorName && err.event) { + // if udf pipeline has multiple functions and failed in the middle w/o drop error + // pass partial result of pipeline to the destination function + newEvents.push(err.event); + continue; + } + } else { + funcCtx.log.error(`Function execution failed`, err, retryLogMessageIfNeeded(err, eventContext.retries ?? 0)); + } } - execLog.push({ - eventIndex: i, - functionId: f.id, - ms: sw.elapsedMs(), - dropped: isDropResult(result), - }); - if (isDropResult(result)) { - return execLog; - } else if (result) { - // @ts-ignore - newEvents.push(...(Array.isArray(result) ? result : [result])); - } else { - newEvents.push(event); + if (!isDropResult(result)) { + if (result) { + // @ts-ignore + newEvents.push(...(Array.isArray(result) ? result : [result])); + } else { + newEvents.push(event); + } } } events = newEvents; } - return execLog; + return { events, execLog }; } diff --git a/services/rotor/src/lib/retries.ts b/services/rotor/src/lib/retries.ts new file mode 100644 index 000000000..56dd26157 --- /dev/null +++ b/services/rotor/src/lib/retries.ts @@ -0,0 +1,64 @@ +import dayjs from "dayjs"; +import { RetryErrorName, DropRetryErrorName } from "@jitsu/functions-lib"; + +const MESSAGES_RETRY_COUNT = process.env.MESSAGES_RETRY_COUNT ? parseInt(process.env.MESSAGES_RETRY_COUNT) : 3; +// MESSAGES_RETRY_BACKOFF_BASE defines base for exponential backoff in minutes. +// For example, if MESSAGES_RETRY_COUNT is 3 and base is 5, then retry delays will be 5, 25, 125 minutes. +const MESSAGES_RETRY_BACKOFF_BASE = process.env.MESSAGES_RETRY_BACKOFF_BASE + ? parseInt(process.env.MESSAGES_RETRY_BACKOFF_BASE) + : 5; +// MESSAGES_RETRY_BACKOFF_MAX_DELAY defines maximum possible retry delay in minutes. Default: 1440 minutes = 24 hours +const MESSAGES_RETRY_BACKOFF_MAX_DELAY = process.env.MESSAGES_RETRY_BACKOFF_MAX_DELAY + ? parseInt(process.env.MESSAGES_RETRY_BACKOFF_MAX_DELAY) + : 1440; + +export type retryPolicy = { + retries: number; + delays: number[]; +}; + +const retryDefaultDelays = (() => { + const delays: number[] = []; + for (let i = 0; i < MESSAGES_RETRY_COUNT; i++) { + delays.push(Math.min(Math.pow(MESSAGES_RETRY_BACKOFF_BASE, i + 1), MESSAGES_RETRY_BACKOFF_MAX_DELAY)); + } + return delays; +})(); + +export const retryDefaultPolicy: retryPolicy = { + retries: MESSAGES_RETRY_COUNT, + delays: retryDefaultDelays, +}; + +export function getRetryPolicy(e: Error & { retryPolicy?: retryPolicy }): retryPolicy { + let retryPolicy = retryDefaultPolicy; + if (e.retryPolicy) { + retryPolicy = { ...retryPolicy, ...e.retryPolicy }; + retryPolicy.retries = Math.min(MESSAGES_RETRY_COUNT, retryPolicy.retries); + retryPolicy.delays = retryPolicy.delays.map(d => Math.min(MESSAGES_RETRY_BACKOFF_MAX_DELAY, d)); + } + return retryPolicy; +} + +export function retryBackOffTime(retryPolicy: retryPolicy, attempt: number) { + if (attempt > retryPolicy.retries) { + return ""; + } + const delays = retryPolicy?.delays?.length > 0 ? retryPolicy.delays : retryDefaultDelays; + const backOffDelayMin = delays[attempt - 1] || delays[delays.length - 1]; + return dayjs().add(backOffDelayMin, "minute").utc().toISOString(); +} + +export function retryLogMessage(retryPolicy: retryPolicy, retries: number): string { + const retryTime = retryBackOffTime(retryPolicy, retries + 1); + return `${retries > 0 ? `Retry attempt: ${retries} of ${retryPolicy.retries}. ` : ""}${ + retryTime ? `Scheduled retry time: ${retryTime}` : "Putting to dead-letter queue." + }`; +} + +export function retryLogMessageIfNeeded(e: Error & { retryPolicy?: retryPolicy }, retries: number) { + if (e.name === DropRetryErrorName || e.name === RetryErrorName) { + const retryPolicy = getRetryPolicy(e); + return retryLogMessage(retryPolicy, retries); + } +} diff --git a/services/rotor/src/lib/rotor.ts b/services/rotor/src/lib/rotor.ts index 983d83285..369319848 100644 --- a/services/rotor/src/lib/rotor.ts +++ b/services/rotor/src/lib/rotor.ts @@ -10,6 +10,7 @@ import PQueue from "p-queue"; const concurrency = process.env.CONCURRENCY ? parseInt(process.env.CONCURRENCY) : 50; import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; +import { getRetryPolicy, retryBackOffTime, retryLogMessage } from "./retries"; dayjs.extend(utc); const log = getLog("kafka-rotor"); @@ -17,55 +18,27 @@ const log = getLog("kafka-rotor"); const RETRY_TIME_HEADER = "retry_time"; const RETRY_COUNT_HEADER = "retries"; const ORIGINAL_TOPIC_HEADER = "original_topic"; - -const MESSAGES_RETRY_COUNT = process.env.MESSAGES_RETRY_COUNT ? parseInt(process.env.MESSAGES_RETRY_COUNT) : 3; -// MESSAGES_RETRY_BACKOFF_BASE defines base for exponential backoff in minutes. -// For example, if MESSAGES_RETRY_COUNT is 3 and base is 5, then retry delays will be 5, 25, 125 minutes. -const MESSAGES_RETRY_BACKOFF_BASE = process.env.MESSAGES_RETRY_BACKOFF_BASE - ? parseInt(process.env.MESSAGES_RETRY_BACKOFF_BASE) - : 2; -// MESSAGES_RETRY_BACKOFF_MAX_DELAY defines maximum possible retry delay in minutes. Default: 1440 minutes = 24 hours -const MESSAGES_RETRY_BACKOFF_MAX_DELAY = process.env.MESSAGES_RETRY_BACKOFF_MAX_DELAY - ? parseInt(process.env.MESSAGES_RETRY_BACKOFF_MAX_DELAY) - : 1440; - -function RetryBackOffTime(attempt: number) { - const backOffDelayMin = Math.min(Math.pow(MESSAGES_RETRY_BACKOFF_BASE, attempt), MESSAGES_RETRY_BACKOFF_MAX_DELAY); - return dayjs().add(backOffDelayMin, "minute").utc().toISOString(); -} - -export class NotRetryableError extends Error { - public doNotRetry: boolean = true; - - constructor(message: string) { - super(message); - } -} +const FUNCTION_ID_HEADER = "function_id"; export type KafkaRotorConfig = { credentials: KafkaCredentials; consumerGroupId: string; kafkaTopics: string[]; kafkaClientId?: string; - maxSecondsInQueueAfterFailure?: number; - handle: (message: string) => Promise; + handle: (message: string, functionsFilter?: (id: string) => boolean, retries?: number) => Promise; }; export type KafkaRotor = { start: () => Promise; }; -function shouldRetry(retries: number, error: any) { - return !error.doNotRetry && retries < MESSAGES_RETRY_COUNT; -} - export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { - const { kafkaTopics, kafkaClientId = "kafka-rotor", maxSecondsInQueueAfterFailure = 3600 } = cfg; + const { kafkaTopics, consumerGroupId, handle, kafkaClientId = "kafka-rotor" } = cfg; return { start: async () => { const kafka = connectToKafka({ defaultAppId: kafkaClientId, ...cfg.credentials }); const consumer = kafka.consumer({ - groupId: cfg.consumerGroupId, + groupId: consumerGroupId, allowAutoTopicCreation: false, sessionTimeout: 120000, }); @@ -116,7 +89,7 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { topicOffsets.set({ topic: topic, partition: o.partition, offset: "low" }, parseInt(o.low)); } } - const offsets = await admin.fetchOffsets({ groupId: cfg.consumerGroupId, topics: kafkaTopics }); + const offsets = await admin.fetchOffsets({ groupId: consumerGroupId, topics: kafkaTopics }); for (const o of offsets) { for (const p of o.partitions) { topicOffsets.set({ topic: o.topic, partition: p.partition, offset: "offset" }, parseInt(p.offset)); @@ -131,39 +104,56 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { messagesConsumed.inc({ topic, partition }); const headers = message.headers || {}; const retries = headers[RETRY_COUNT_HEADER] ? parseInt(headers[RETRY_COUNT_HEADER].toString()) : 0; - + const retriedFunctionId = headers[FUNCTION_ID_HEADER] ? headers[FUNCTION_ID_HEADER].toString() : ""; try { if (message.value) { - await cfg.handle(message.value?.toString()); + await handle( + message.value?.toString(), + retriedFunctionId + ? id => { + if (retriedFunctionId.startsWith("udf.")) { + return id.startsWith("udf.") || id.startsWith("builtin.destination."); + } else if (retriedFunctionId.startsWith("builtin.destination.")) { + return id.startsWith("builtin.destination."); + } else { + return true; + } + } + : undefined, + retries + ); messagesProcessed.inc({ topic, partition }); } - } catch (e) { - const retry = shouldRetry(retries, e); + } catch (e: any) { + const retryPolicy = getRetryPolicy(e); + const retryTime = retryBackOffTime(retryPolicy, retries + 1); + const newMessage = e.event + ? JSON.stringify({ ...JSON.parse(message.value), httpPayload: e.event }) + : message.value; log .atError() .withCause(e) .log( - `Failed to process message for ${message.key || "(no key set)"} after ${retries} local retries. ${ - retry ? "Message will be returned to reprocessing" : "Message will be sent to dead-letter queue" - }: ${message.value}` + `Failed to process message for ${message.key || "(no key set)"}. ${retryLogMessage(retryPolicy, retries)}` ); - if (!retry) { + if (!retryTime) { messagesDeadLettered.inc({ topic }); } else { messagesRequeued.inc({ topic }); } - const requeueTopic = retry ? retryTopic() : deatLetterTopic(); + const requeueTopic = retryTime ? retryTopic() : deatLetterTopic(); try { await producer.send({ topic: requeueTopic, messages: [ { - value: message.value, + value: newMessage, key: message.key, headers: { [RETRY_COUNT_HEADER]: `${retries}`, [ORIGINAL_TOPIC_HEADER]: topic, - [RETRY_TIME_HEADER]: RetryBackOffTime(retries + 1), + [RETRY_TIME_HEADER]: retryTime, + ...(e.functionId ? { [FUNCTION_ID_HEADER]: e.functionId } : {}), }, }, ], diff --git a/types/protocols/async-request.d.ts b/types/protocols/async-request.d.ts index 55933617f..ac301d08e 100644 --- a/types/protocols/async-request.d.ts +++ b/types/protocols/async-request.d.ts @@ -1,5 +1,5 @@ import { ISO8601Date } from "./iso8601"; -import { Geo } from "./functions"; +import type { Geo } from "./functions"; export type IngestType = "s2s" | "browser"; diff --git a/types/protocols/functions.d.ts b/types/protocols/functions.d.ts index 3ffa1e761..74002b11a 100644 --- a/types/protocols/functions.d.ts +++ b/types/protocols/functions.d.ts @@ -5,7 +5,7 @@ export type SetOpts = { ttlMs?: number } | { ttlSec?: number }; /** * A key value store that exposed to a function */ -interface Store { +export interface Store { get(key: string): Promise; del(key: string): Promise; set(key: string, value: any, opts?: SetOpts): Promise; @@ -14,7 +14,7 @@ interface Store { /** * Store for incoming events, destination results and function log messages */ -interface EventsStore { +export interface EventsStore { log(connectionId: string, error: boolean, msg: Record): void; } /** @@ -182,6 +182,8 @@ export type EventContext = { mode?: string; options?: any; }; + // number of retries attempted + retries?: number; }; export type FunctionConfigContext

    = { diff --git a/webapps/console/components/CodeEditor/CodeEditor.tsx b/webapps/console/components/CodeEditor/CodeEditor.tsx index dbe2608c3..6e4182382 100644 --- a/webapps/console/components/CodeEditor/CodeEditor.tsx +++ b/webapps/console/components/CodeEditor/CodeEditor.tsx @@ -15,6 +15,7 @@ type CodeEditorProps = { ctrlEnterCallback?: (value: string) => void; ctrlSCallback?: (value: string) => void; foldLevel?: number; + extraSuggestions?: string; monacoOptions?: Partial; }; @@ -28,6 +29,7 @@ export const CodeEditor: React.FC = ({ ctrlSCallback, changePosition, monacoOptions, + extraSuggestions, foldLevel, }) => { const editorRef = useRef(null); @@ -44,6 +46,9 @@ export const CodeEditor: React.FC = ({ if (typeof value !== "undefined") { editor.setValue(value); } + if (extraSuggestions) { + monaco.languages.typescript.javascriptDefaults.setExtraLibs([{ content: extraSuggestions }]); + } editor.onDidChangeCursorPosition(e => { handleChangePosition(editor.getModel().getOffsetAt(e.position)); }); diff --git a/webapps/console/components/DataView/EventsBrowser.tsx b/webapps/console/components/DataView/EventsBrowser.tsx index 28b9cfb8d..f5b063476 100644 --- a/webapps/console/components/DataView/EventsBrowser.tsx +++ b/webapps/console/components/DataView/EventsBrowser.tsx @@ -524,7 +524,7 @@ const FunctionsLogTable = ({ loadEvents, loading, streamType, entityType, actorI case "log-warn": return ( d.message?.text + - (Array.isArray(d.message?.args) && d.message.args.length > 0 ? `, ${d.message?.args.join(",")}` : "") + (Array.isArray(d.message?.args) && d.message.args.length > 0 ? `, ${d.message?.args.join(", ")}` : "") ); case "http-request": return `${d.method} ${d.url}`; diff --git a/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx b/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx index 39d80038c..5286236a1 100644 --- a/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx +++ b/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx @@ -15,6 +15,8 @@ import { UTCDate, UTCHeader } from "../DataView/EventsBrowser"; import { examplePageEvent, exampleTrackEvents, exportIdentifyEvent } from "./example_events"; import { rpc } from "juava"; import { logType } from "@jitsu/core-functions"; +import { RetryErrorName, DropRetryErrorName } from "@jitsu/functions-lib"; + import Convert from "ansi-to-html"; import dayjs from "dayjs"; import { defaultFunctionTemplate } from "./code_templates"; @@ -171,14 +173,14 @@ export const FunctionsDebugger: React.FC = props => { body, }); if (res.error) { - setResult(res.error); + setResult({ ...res.meta, ...res.error }); setResultType("error"); setLogs([ ...res.logs, { level: "error", type: "log", - message: res.error, + message: `${res.error.name}: ${res.error.message}`, timestamp: new Date(), }, ]); @@ -215,7 +217,10 @@ export const FunctionsDebugger: React.FC = props => { timestamp: new Date(), }, ]); - setResult(errorText); + setResult({ + name: "Error", + message: errorText, + }); setResultType("error"); } finally { setRunning(false); @@ -290,6 +295,14 @@ export const FunctionsDebugger: React.FC = props => { value={obj.code ?? ""} ctrlEnterCallback={runFunction} ctrlSCallback={save} + extraSuggestions={` +declare class RetryError extends Error { + constructor(message, options?: { drop: boolean }) { + super(message); + this.name = options?.drop ? "${DropRetryErrorName}" : "${RetryErrorName}"; + } +} + `} onChange={value => setObj({ ...obj, code: value })} monacoOptions={{ renderLineHighlight: "none" }} /> @@ -361,7 +374,26 @@ export const FunctionsDebugger: React.FC = props => {

    {resultType === "error" && (
    - {convert.toHtml(result.replaceAll(" ", " "))} + + {`${result.name}: ` + + convert.toHtml(result.message.replaceAll(" ", " "))} + + {result.name === DropRetryErrorName && ( +
    + If such error will happen on an actual event, it will be SKIPPED and retry will be + scheduled in{" "} + {result.retryPolicy?.delays?.[0] ? Math.min(result.retryPolicy.delays[0], 1440) : 5} minutes. +
    + )} + {result.name === RetryErrorName && ( +
    + If such error will happen on an actual event, this function will be scheduled +
    + for retry in{" "} + {result.retryPolicy?.delays?.[0] ? Math.min(result.retryPolicy.delays[0], 1440) : 5} minutes, + but event will be processed further. +
    + )}
    )} {resultType === "drop" && ( diff --git a/webapps/console/components/TrackingIntegrationDocumentation/TrackingIntegrationDocumentation.tsx b/webapps/console/components/TrackingIntegrationDocumentation/TrackingIntegrationDocumentation.tsx index 289822a01..94a747a3c 100644 --- a/webapps/console/components/TrackingIntegrationDocumentation/TrackingIntegrationDocumentation.tsx +++ b/webapps/console/components/TrackingIntegrationDocumentation/TrackingIntegrationDocumentation.tsx @@ -108,7 +108,7 @@ export const TrackingIntegrationDocumentation: React.FC<{ streamId: string; onCa appConfig.publicEndpoints.dataHost || appConfig.ee.available ? undefined : stream?.publicKeys?.[0] - ? stream.publicKeys[0].hint + ? `${stream.publicKeys[0].id}:${stream.publicKeys[0].hint}` : streamId || "{write-key}"; const displayDomain = `${appConfig.publicEndpoints.protocol}://${selectedDomain ?? domains?.[0]}`; const wrap = (r: ReactNode) => { diff --git a/webapps/console/package.json b/webapps/console/package.json index 5da5e5a69..3954ef1ce 100644 --- a/webapps/console/package.json +++ b/webapps/console/package.json @@ -30,6 +30,7 @@ "@jitsu/jitsu-react": "workspace:*", "@jitsu/js": "workspace:*", "@jitsu/protocols": "workspace:*", + "@jitsu/functions-lib": "workspace:*", "@loadable/component": "^5.15.3", "@monaco-editor/react": "4.5.0", "@nangohq/frontend": "^0.21.11", @@ -50,7 +51,7 @@ "cuid": "^2.1.8", "dayjs": "^1.11.10", "firebase": "^10.4.0", - "firebase-admin": "^11.10.1", + "firebase-admin": "^11.11.0", "googleapis": "^126.0.1", "highlight.js": "^11.6.0", "ioredis": "^5.2.3", diff --git a/webapps/console/pages/api/[workspaceId]/function/run.ts b/webapps/console/pages/api/[workspaceId]/function/run.ts index 0cf0b106a..169db53da 100644 --- a/webapps/console/pages/api/[workspaceId]/function/run.ts +++ b/webapps/console/pages/api/[workspaceId]/function/run.ts @@ -14,11 +14,12 @@ export const config = { }; const resultType = z.object({ - error: z.string().optional(), + error: z.object({ name: z.string(), message: z.string(), stack: z.string().optional() }).optional(), dropped: z.boolean().optional(), result: z.any().nullish(), store: z.record(z.any()), logs: z.array(z.any()), + meta: z.any().nullish(), }); export type FunctionRunType = z.infer; diff --git a/webapps/ee-api/package.json b/webapps/ee-api/package.json index dac22546f..0e2832449 100644 --- a/webapps/ee-api/package.json +++ b/webapps/ee-api/package.json @@ -17,7 +17,7 @@ "crypto-js": "^4.1.1", "eslint": "8.29.0", "eslint-config-next": "13.0.0", - "firebase-admin": "^11.10.1", + "firebase-admin": "^11.11.0", "json5": "^2.2.3", "jsonwebtoken": "^9.0.2", "juava": "workspace:*", From 2938d8518cc3b694b0f63ac38c6fedf9c330afbe Mon Sep 17 00:00:00 2001 From: Jacob Spizziri Date: Sat, 21 Oct 2023 13:24:49 -0400 Subject: [PATCH 0262/1353] fix typo in web app "ket" should be "key" --- webapps/console/components/ApiKeyEditor/ApiKeyEditor.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/components/ApiKeyEditor/ApiKeyEditor.tsx b/webapps/console/components/ApiKeyEditor/ApiKeyEditor.tsx index 2276442d6..e929ec97c 100644 --- a/webapps/console/components/ApiKeyEditor/ApiKeyEditor.tsx +++ b/webapps/console/components/ApiKeyEditor/ApiKeyEditor.tsx @@ -61,7 +61,7 @@ export const ApiKeysEditor: React.FC & { compact?: b className="cursor-pointer" title={ <> - {branding.productName} doesn't store full version of a ket. If you haven't recorded the key, generate + {branding.productName} doesn't store full version of a key. If you haven't recorded the key, generate a new one } From 82a7676c0e3cc8c5a83c79a9379192bd7ef9755b Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 23 Oct 2023 13:22:05 +0400 Subject: [PATCH 0263/1353] Jitsu CLI improvements --- cli/jitsu-cli/data/page.json | 53 ++++++++++++++++++++++++++++ cli/jitsu-cli/package.json | 8 ++++- cli/jitsu-cli/src/commands/build.ts | 3 +- cli/jitsu-cli/src/commands/deploy.ts | 5 ++- cli/jitsu-cli/src/commands/run.ts | 40 ++++++++++++--------- cli/jitsu-cli/src/commands/shared.ts | 33 +++++++++++++---- cli/jitsu-cli/src/commands/test.ts | 4 +-- 7 files changed, 115 insertions(+), 31 deletions(-) create mode 100644 cli/jitsu-cli/data/page.json diff --git a/cli/jitsu-cli/data/page.json b/cli/jitsu-cli/data/page.json new file mode 100644 index 000000000..9c5389bb2 --- /dev/null +++ b/cli/jitsu-cli/data/page.json @@ -0,0 +1,53 @@ +{ + "type": "page", + "properties": { + "title": "Example page event", + "url": "https://example.com/", + "path": "/", + "hash": "", + "search": "", + "currency": "USD", + "width": 1458, + "height": 1186 + }, + "userId": "user@example.com", + "anonymousId": "f6ps414GyUoRLws4r4NXD1kF", + "timestamp": "2023-10-23T08:56:09.043Z", + "sentAt": "2023-10-23T08:56:09.043Z", + "messageId": "y4eAqqw9PFErquqfT9IDZDRh", + "writeKey": "Bysczu8o75nkuoQtlpyJWE11", + "context": { + "library": { + "name": "jitsu-js", + "version": "1.0.0" + }, + "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/111.0", + "locale": "en-US", + "screen": { + "width": 2304, + "height": 1296, + "innerWidth": 1458, + "innerHeight": 1186, + "density": 2 + }, + "traits": { + "email": "user@example.com" + }, + "page": { + "path": "/", + "referrer": "", + "referring_domain": "", + "host": "example.com", + "search": "", + "title": "Example page event", + "url": "https://example.com/", + "enconding": "UTF-8" + }, + "campaign": { + "name": "example", + "source": "g" + } + }, + "request_ip": "69.162.81.155", + "receivedAt": "2023-10-23T08:56:09.043Z" +} diff --git a/cli/jitsu-cli/package.json b/cli/jitsu-cli/package.json index 371cee3d4..16a9fca70 100644 --- a/cli/jitsu-cli/package.json +++ b/cli/jitsu-cli/package.json @@ -13,7 +13,13 @@ "clean": "rm -rf ./dist", "compile": "tsc -p . ", "build": "pnpm compile && webpack", - "run": "node dist/main.js" + "run": "node dist/main.js", + "login": "pnpm build && node dist/main.js login", + "init child": "pnpm build && node dist/main.js init", + "build child": "pnpm build && node dist/main.js build", + "run child": "pnpm build && node dist/main.js run -e ./data/page.json", + "test child": "pnpm build && node dist/main.js test", + "deploy child": "pnpm build && node dist/main.js deploy" }, "dependencies": { "isolated-vm": "^4.6.0", diff --git a/cli/jitsu-cli/src/commands/build.ts b/cli/jitsu-cli/src/commands/build.ts index e5a5984e2..5f31b192d 100644 --- a/cli/jitsu-cli/src/commands/build.ts +++ b/cli/jitsu-cli/src/commands/build.ts @@ -10,8 +10,7 @@ import { loadPackageJson } from "./shared"; import { b } from "../lib/chalk-code-highlight"; export async function build({ dir }: { dir?: string }) { - const projectDir = dir || process.cwd(); - const packageJson = loadPackageJson(projectDir); + const { packageJson, projectDir } = await loadPackageJson(dir || process.cwd()); console.log(`Building ${b(packageJson.name)} project`); diff --git a/cli/jitsu-cli/src/commands/deploy.ts b/cli/jitsu-cli/src/commands/deploy.ts index 1107c2369..273b57267 100644 --- a/cli/jitsu-cli/src/commands/deploy.ts +++ b/cli/jitsu-cli/src/commands/deploy.ts @@ -9,10 +9,9 @@ import cuid from "cuid"; import { b, red } from "../lib/chalk-code-highlight"; export async function deploy({ dir, workspace, name: names }: { dir?: string; workspace?: string; name?: string[] }) { - const projectDir = dir || process.cwd(); - const selected = names ? names.flatMap(n => n.split(",")).map(n => n.trim()) : undefined; + const { packageJson, projectDir } = await loadPackageJson(dir || process.cwd()); - const packageJson = loadPackageJson(projectDir); + const selected = names ? names.flatMap(n => n.split(",")).map(n => n.trim()) : undefined; const configFile = `${homedir()}/.jitsu/jitsu-cli.json`; if (!existsSync(configFile)) { diff --git a/cli/jitsu-cli/src/commands/run.ts b/cli/jitsu-cli/src/commands/run.ts index 788de2ec9..82251ce8c 100644 --- a/cli/jitsu-cli/src/commands/run.ts +++ b/cli/jitsu-cli/src/commands/run.ts @@ -9,6 +9,7 @@ import { loadPackageJson } from "./shared"; import isEqual from "lodash/isEqual"; import { b, red } from "../lib/chalk-code-highlight"; import { DropRetryErrorName, RetryErrorName } from "@jitsu/functions-lib"; +import inquirer from "inquirer"; const currentDir = process.cwd(); @@ -25,8 +26,7 @@ export async function run({ store?: any; props?: any; }) { - const projectDir = dir || currentDir; - const packageJson = loadPackageJson(projectDir); + const { packageJson, projectDir } = await loadPackageJson(dir || currentDir); const eventJson = parseJson5("event", event); const propsJson = parseJson5("props", props); @@ -41,28 +41,36 @@ export async function run({ console.error(red(`Can't find dist directory: ${b(functionsDir)} . Please build project first.`)); process.exit(1); } - const fname = name ? (name.endsWith(".js") ? name : `${name.replace(".ts", "")}.js`) : undefined; + const fname = n => (n ? (n.endsWith(".js") ? n : `${n.replace(".ts", "")}.js`) : undefined); const functionsFiles = readdirSync(functionsDir); let functionFile: string | undefined = undefined; - if (!name && functionsFiles.length === 1) { - functionFile = functionsFiles[0]; - } + if (name) { - functionFile = functionsFiles.find(f => f === fname); + functionFile = functionsFiles.find(f => f === fname(name)); } else { - console.error( - red( - `Directory ${b("dist/functions")} contain multiple functions. Please choose the one to run with ${b( - "-n" - )} parameter.` - ) - ); - process.exit(1); + if (functionsFiles.length === 1) { + functionFile = functionsFiles[0]; + } else { + name = ( + await inquirer.prompt([ + { + type: "list", + name: "name", + message: `Select workspace:`, + choices: functionsFiles.map(w => ({ + name: w, + value: w, + })), + }, + ]) + ).name; + functionFile = functionsFiles.find(f => f === name); + } } if (!functionFile) { console.error( red( - `Can't find function file: ${b(fname)} in ${b( + `Can't find function: ${b(fname(name))} in ${b( "dist/functions" )} directory. Please make sure that you have built the project.` ) diff --git a/cli/jitsu-cli/src/commands/shared.ts b/cli/jitsu-cli/src/commands/shared.ts index 496a91e80..47d44b38b 100644 --- a/cli/jitsu-cli/src/commands/shared.ts +++ b/cli/jitsu-cli/src/commands/shared.ts @@ -1,17 +1,38 @@ import path from "path"; +import inquirer from "inquirer"; import { existsSync, readFileSync } from "fs"; import { b, red } from "../lib/chalk-code-highlight"; -export function loadPackageJson(projectDir: string): any { +export async function loadPackageJson(projectDir: string): Promise<{ projectDir: string; packageJson: any }> { + let packageJson = loadPackageJson0(projectDir); + if (!packageJson) { + projectDir = ( + await inquirer.prompt([ + { + type: "input", + name: "dir", + message: `Enter path of project directory:`, + }, + ]) + ).dir; + packageJson = loadPackageJson0(projectDir); + if (!packageJson) { + process.exit(1); + } + } + return { projectDir, packageJson }; +} + +export function loadPackageJson0(projectDir: string): any { const packageJsonPath = path.resolve(projectDir, "package.json"); if (!existsSync(packageJsonPath)) { console.error(red(`Can't find node.js project in: ${b(projectDir)}`)); - process.exit(1); + return undefined; } const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8")); - // if (!packageJson.devDependencies?.["jitsu-cli"]) { - // console.error(`${red("jitsu-cli can work only with projects that was created by jitsu-cli")}`); - // process.exit(1); - // } + if (!packageJson.devDependencies?.["jitsu-cli"]) { + console.error(red(`directory ${b(projectDir)} doesn't contain jitsu-cli managed project`)); + return undefined; + } return packageJson; } diff --git a/cli/jitsu-cli/src/commands/test.ts b/cli/jitsu-cli/src/commands/test.ts index d10707b47..a4fbe1321 100644 --- a/cli/jitsu-cli/src/commands/test.ts +++ b/cli/jitsu-cli/src/commands/test.ts @@ -4,9 +4,7 @@ import chalk from "chalk"; import { b } from "../lib/chalk-code-highlight"; export async function test({ dir }: { dir?: string }) { - const projectDir = dir || process.cwd(); - - const packageJson = loadPackageJson(projectDir); + const { packageJson, projectDir } = await loadPackageJson(dir || process.cwd()); console.log(`Running tests for ${b(packageJson.name)}`); From 423a8559c2f2fb2e45bd0eb4def9b8cb0f5df5e5 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 23 Oct 2023 21:35:13 +0400 Subject: [PATCH 0264/1353] console: report correct error when no destination mapped for stream console: fix dayjs plugin imports --- docker/docker-compose.yml | 2 ++ .../src/functions/amplitude-destination.ts | 2 ++ services/rotor/src/lib/functions-chain.ts | 3 ++ services/rotor/src/lib/retries.ts | 2 ++ services/rotor/src/lib/rotor.ts | 2 +- .../console/components/Billing/use-usage.ts | 2 ++ .../components/ConfigObjectEditor/Editors.tsx | 2 ++ .../FunctionsDebugger/FunctionsDebugger.tsx | 2 ++ .../components/GlobalLoader/GlobalLoader.tsx | 2 ++ webapps/console/lib/server/fast-store.ts | 4 +-- .../pages/[workspaceId]/syncs/index.tsx | 5 ++-- .../api/[workspaceId]/log/[type]/[actorId].ts | 2 ++ .../pages/api/[workspaceId]/sources/logs.ts | 2 +- .../pages/api/[workspaceId]/sources/tasks.ts | 3 +- webapps/console/pages/api/s/[...type].ts | 8 ++++- webapps/console/prisma/metrics.sql | 30 +++++++++++++++++++ 16 files changed, 63 insertions(+), 10 deletions(-) create mode 100644 webapps/console/prisma/metrics.sql diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index c3e7d5b1f..ade175b88 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -33,6 +33,7 @@ services: # - ./data/postgres:/var/lib/postgresql/data zookeeper: tty: true + platform: linux/amd64 image: wurstmeister/zookeeper:latest expose: - 2181 @@ -59,6 +60,7 @@ services: bulker: tty: true + platform: linux/amd64 image: jitsucom/bulker:latest restart: "unless-stopped" ports: diff --git a/libs/core-functions/src/functions/amplitude-destination.ts b/libs/core-functions/src/functions/amplitude-destination.ts index add2ad2ab..44307e709 100644 --- a/libs/core-functions/src/functions/amplitude-destination.ts +++ b/libs/core-functions/src/functions/amplitude-destination.ts @@ -5,6 +5,8 @@ import { randomUUID } from "crypto"; import { parseUserAgent } from "./lib/browser"; import { AmplitudeDestinationConfig } from "../meta"; import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; +dayjs.extend(utc); const AmplitudeDestination: JitsuFunction = async ( event, diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index 2160789df..aa6b5b4d1 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -33,6 +33,9 @@ export type FuncChainResult = { export type FunctionExecRes = { eventIndex: number; event?: any; + // streamId: string; + // destinationId: string; + // connectionId: string; functionId: string; error?: any; dropped?: boolean; diff --git a/services/rotor/src/lib/retries.ts b/services/rotor/src/lib/retries.ts index 56dd26157..3d27a4d7c 100644 --- a/services/rotor/src/lib/retries.ts +++ b/services/rotor/src/lib/retries.ts @@ -1,4 +1,6 @@ import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; +dayjs.extend(utc); import { RetryErrorName, DropRetryErrorName } from "@jitsu/functions-lib"; const MESSAGES_RETRY_COUNT = process.env.MESSAGES_RETRY_COUNT ? parseInt(process.env.MESSAGES_RETRY_COUNT) : 3; diff --git a/services/rotor/src/lib/rotor.ts b/services/rotor/src/lib/rotor.ts index 369319848..f0f5718a7 100644 --- a/services/rotor/src/lib/rotor.ts +++ b/services/rotor/src/lib/rotor.ts @@ -10,8 +10,8 @@ import PQueue from "p-queue"; const concurrency = process.env.CONCURRENCY ? parseInt(process.env.CONCURRENCY) : 50; import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; -import { getRetryPolicy, retryBackOffTime, retryLogMessage } from "./retries"; dayjs.extend(utc); +import { getRetryPolicy, retryBackOffTime, retryLogMessage } from "./retries"; const log = getLog("kafka-rotor"); diff --git a/webapps/console/components/Billing/use-usage.ts b/webapps/console/components/Billing/use-usage.ts index 2a466996d..fb1416001 100644 --- a/webapps/console/components/Billing/use-usage.ts +++ b/webapps/console/components/Billing/use-usage.ts @@ -3,6 +3,8 @@ import { assertFalse, assertTrue, rpc } from "juava"; import { useWorkspace } from "../../lib/context"; import { useBilling } from "./BillingProvider"; import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; +dayjs.extend(utc); export type Usage = { events: number; diff --git a/webapps/console/components/ConfigObjectEditor/Editors.tsx b/webapps/console/components/ConfigObjectEditor/Editors.tsx index f98d1fc53..92589e334 100644 --- a/webapps/console/components/ConfigObjectEditor/Editors.tsx +++ b/webapps/console/components/ConfigObjectEditor/Editors.tsx @@ -1,6 +1,8 @@ import React from "react"; import { DatePicker, Input, Select } from "antd"; import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; +dayjs.extend(utc); export type CustomWidgetProps = { value: T | undefined; diff --git a/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx b/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx index 5286236a1..1b7ddaa52 100644 --- a/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx +++ b/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx @@ -19,6 +19,8 @@ import { RetryErrorName, DropRetryErrorName } from "@jitsu/functions-lib"; import Convert from "ansi-to-html"; import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; +dayjs.extend(utc); import { defaultFunctionTemplate } from "./code_templates"; import { FunctionConfig } from "../../lib/schema"; import { useRouter } from "next/router"; diff --git a/webapps/console/components/GlobalLoader/GlobalLoader.tsx b/webapps/console/components/GlobalLoader/GlobalLoader.tsx index 6c873b4b9..4ab26f03c 100644 --- a/webapps/console/components/GlobalLoader/GlobalLoader.tsx +++ b/webapps/console/components/GlobalLoader/GlobalLoader.tsx @@ -1,6 +1,8 @@ import React, { ReactNode, useEffect, useState } from "react"; import classNames from "classnames"; import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; +dayjs.extend(utc); export function Spinner(props: { className?: string }) { return ( diff --git a/webapps/console/lib/server/fast-store.ts b/webapps/console/lib/server/fast-store.ts index 7622d0561..c22657a9c 100644 --- a/webapps/console/lib/server/fast-store.ts +++ b/webapps/console/lib/server/fast-store.ts @@ -353,7 +353,7 @@ async function saveConnectionsToRedis(db: DatabaseConnection) { } // when we reach new stream, we need to save destinationsBuffer for the previous stream - if (lastStreamConfig && streamConfig.id !== lastStreamConfig.id && destinationsBuffer.length > 0) { + if (lastStreamConfig && streamConfig.id !== lastStreamConfig.id) { addStreamByDomain(lastStreamConfig, destinationsBuffer, row.backupEnabled); destinationsBuffer = []; } @@ -363,7 +363,7 @@ async function saveConnectionsToRedis(db: DatabaseConnection) { }); // save the last stream - if (lastStreamConfig && destinationsBuffer.length > 0) { + if (lastStreamConfig) { addStreamByDomain(lastStreamConfig, destinationsBuffer, lastBackupEnabled); } for (const [domain, streamDsts] of Object.entries(streamsByDomain)) { diff --git a/webapps/console/pages/[workspaceId]/syncs/index.tsx b/webapps/console/pages/[workspaceId]/syncs/index.tsx index 833139421..72f1be155 100644 --- a/webapps/console/pages/[workspaceId]/syncs/index.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/index.tsx @@ -24,6 +24,8 @@ import { Spinner } from "../../../components/GlobalLoader/GlobalLoader"; import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; import relativeTime from "dayjs/plugin/relativeTime"; +dayjs.extend(relativeTime); +dayjs.extend(utc); import { ServiceTitle } from "../services"; import { DestinationTitle } from "../destinations"; import JSON5 from "json5"; @@ -32,9 +34,6 @@ import { Overlay } from "../../../components/Overlay/Overlay"; import { CodeBlock } from "../../../components/CodeBlock/CodeBlock"; import { processTaskStatus, TaskStatus } from "./tasks"; -dayjs.extend(utc); -dayjs.extend(relativeTime); - export const formatDate = (date: string | Date) => dayjs(date, "YYYY-MM-DDTHH:mm:ss.SSSZ").utc().format("YYYY-MM-DD HH:mm:ss"); export const formatDateOnly = (date: string | Date) => diff --git a/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts b/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts index 74dd3b815..fe36655ae 100644 --- a/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts +++ b/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts @@ -7,6 +7,8 @@ import { httpAgent, httpsAgent } from "../../../../../lib/server/http-agent"; import { getErrorMessage, requireDefined } from "juava"; import nodeFetch from "node-fetch-commonjs"; import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; +dayjs.extend(utc); const log = getServerLog("test-connection"); diff --git a/webapps/console/pages/api/[workspaceId]/sources/logs.ts b/webapps/console/pages/api/[workspaceId]/sources/logs.ts index 7a73d2eeb..a7a4c65e5 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/logs.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/logs.ts @@ -4,8 +4,8 @@ import { createRoute, verifyAccess } from "../../../../lib/api"; import { randomId } from "juava"; import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; -import { getServerLog } from "../../../../lib/server/log"; dayjs.extend(utc); +import { getServerLog } from "../../../../lib/server/log"; const log = getServerLog("sync-logs"); diff --git a/webapps/console/pages/api/[workspaceId]/sources/tasks.ts b/webapps/console/pages/api/[workspaceId]/sources/tasks.ts index b025af1b2..a0ab1a00f 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/tasks.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/tasks.ts @@ -4,12 +4,11 @@ import { createRoute, verifyAccess } from "../../../../lib/api"; import { source_taskDbModel } from "../../../../prisma/schema"; import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; +dayjs.extend(utc); import { syncError } from "../../../../lib/shared/errors"; import { getServerLog } from "../../../../lib/server/log"; import { getAppEndpoint } from "../../../../lib/domains"; -dayjs.extend(utc); - const log = getServerLog("sync-tasks"); const aggregatedResultType = z.object({ diff --git a/webapps/console/pages/api/s/[...type].ts b/webapps/console/pages/api/s/[...type].ts index 25b2de206..ba4cc70c1 100644 --- a/webapps/console/pages/api/s/[...type].ts +++ b/webapps/console/pages/api/s/[...type].ts @@ -187,7 +187,13 @@ export async function sendEventToBulker(req: NextApiRequest, ingestType: IngestT try { stream = await getStream(loc); if (stream) { - response = buildResponse(message.origin.baseUrl, stream); + if (stream.asynchronousDestinations?.length > 0 || stream.synchronousDestinations?.length > 0) { + response = buildResponse(message.origin.baseUrl, stream); + } else { + const msg = `No destinations linked for stream: ${stream.stream.id}`; + log.atWarn().log(msg); + response = { ok: false, error: msg }; + } } else { const msg = `Source not found for ${JSON.stringify(loc)}`; log.atWarn().log(msg); diff --git a/webapps/console/prisma/metrics.sql b/webapps/console/prisma/metrics.sql new file mode 100644 index 000000000..2a373980f --- /dev/null +++ b/webapps/console/prisma/metrics.sql @@ -0,0 +1,30 @@ +-- not managed by prisma +create table newjitsu_metrics.active_incoming on cluster jitsu_cluster +( + timestamp DateTime, + workspaceId LowCardinality(String), + messageId String +) + engine = Null; + + +CREATE MATERIALIZED VIEW newjitsu_metrics.mv_active_incoming on cluster jitsu_cluster + ( + `timestamp` DateTime, + `workspaceId` LowCardinality(String), + `count` AggregateFunction(uniq, String) + ) + ENGINE = ReplicatedAggregatingMergeTree('/clickhouse/tables/{shard}/newjitsu_metrics/mv_active_incoming5', + '{replica}') + ORDER BY (timestamp, workspaceId) + SETTINGS index_granularity = 8192 +AS +SELECT + timestamp, + workspaceId, + uniqState(messageId) AS count +FROM newjitsu_metrics.active_incoming +GROUP BY + timestamp, + workspaceId; + From 09f47dfde22de7206e401ed3be4eb9e815e57265 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 24 Oct 2023 12:41:26 +0400 Subject: [PATCH 0265/1353] console: ingest: if multiple streams have the same domain - choose the first. console: fast-store: doesn't sync bare config objects since they are not used (except functions) --- webapps/console/lib/server/fast-store.ts | 12 +----------- webapps/console/pages/api/s/[...type].ts | 13 ++++++++++++- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/webapps/console/lib/server/fast-store.ts b/webapps/console/lib/server/fast-store.ts index c22657a9c..43d3b8dd7 100644 --- a/webapps/console/lib/server/fast-store.ts +++ b/webapps/console/lib/server/fast-store.ts @@ -41,7 +41,6 @@ function redisKey(name: string): RedisKey { */ const redisKeyRoutes = { - configurationObjectsLink: () => redisKey(`config:links`), configurationObject: (type: string) => redisKey(`config:${type}`), streamIds: () => redisKey(`streamIds`), apiKeys: () => redisKey(`apiKeys`), @@ -103,7 +102,6 @@ export type FastStore = { getStreamById: (slug: string) => Promise; getStreamByKeyId: (keyId: string) => Promise; getConfig: (type: string, id: string) => Promise; - getConnection: (id: string) => Promise; getEnrichedConnection: (id: string) => Promise; fullRefresh(); @@ -237,7 +235,6 @@ async function saveConnectionsToRedis(db: DatabaseConnection) { const domainsRedisKey = redisKeyRoutes.streamDomain(); const idsRedisKey = redisKeyRoutes.streamIds(); const apiKeys = redisKeyRoutes.apiKeys(); - const linksKey = redisKeyRoutes.configurationObjectsLink(); const query = ` select greatest(link."updatedAt", src."updatedAt", dst."updatedAt") as "updatedAt", @@ -304,8 +301,6 @@ async function saveConnectionsToRedis(db: DatabaseConnection) { data: row.connectionData, }; - redis().hset(linksKey.tmp(), linkId, JSON.stringify(allConnectionParameters)); - await redis().hset( bulkerRedisKey.tmp(), linkId, @@ -398,7 +393,6 @@ async function saveConnectionsToRedis(db: DatabaseConnection) { await apiKeys.rename(redis()); await idsRedisKey.rename(redis()); - await linksKey.rename(redis()); await domainsRedisKey.rename(redis()); await bulkerRedisKey.rename(redis()); } @@ -428,17 +422,13 @@ export function createFastStore({ db }: { db: DatabaseConnection }): FastStore { const config = await redis().hget(redisKeyRoutes.configurationObject(type).name(), id); return config ? JSON.parse(config) : undefined; }, - async getConnection(id: string): Promise { - const config = await redis().hget(redisKeyRoutes.configurationObjectsLink().name(), id); - return config ? JSON.parse(config) : undefined; - }, async getEnrichedConnection(id: string): Promise { const config = await redis().hget(redisKeyRoutes.enrichedConnections().name(), id); return config ? JSON.parse(config) : undefined; }, async fullRefresh() { const sw = stopwatch(); - await saveConfigObjectsToRedis(["stream", "destination", "function"], db); + await saveConfigObjectsToRedis(["function"], db); await saveConnectionsToRedis(db); getServerLog().atInfo().log("Export to redis took", sw.elapsedPretty()); }, diff --git a/webapps/console/pages/api/s/[...type].ts b/webapps/console/pages/api/s/[...type].ts index ba4cc70c1..d5da5dcf9 100644 --- a/webapps/console/pages/api/s/[...type].ts +++ b/webapps/console/pages/api/s/[...type].ts @@ -62,6 +62,17 @@ const DomainStreamLocator: StreamLocator = async loc => { const streams = (await fastStore.getStreamsByDomain(loc.domain)) || []; if (streams.length == 1) { return streams[0]; + } else if (streams.length > 1 && !loc.writeKey) { + return streams[0]; + } + } +}; + +const AmbiguousDomainStreamLocator: StreamLocator = async loc => { + if (loc.domain) { + const streams = (await fastStore.getStreamsByDomain(loc.domain)) || []; + if (streams.length > 0) { + return streams[0]; } } }; @@ -69,7 +80,7 @@ const DomainStreamLocator: StreamLocator = async loc => { async function getStream(loc: StreamCredentials): Promise { const locators = loc.ingestType === "s2s" - ? [WriteKeyStreamLocator, SlugStreamLocator, DomainStreamLocator] + ? [WriteKeyStreamLocator, SlugStreamLocator, AmbiguousDomainStreamLocator] : [SlugStreamLocator, DomainStreamLocator, WriteKeyStreamLocator]; for (const locator of locators) { const stream = await locator(loc); From 65d047d21e1b5ac96132729172d2e61854f77ec7 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 24 Oct 2023 12:58:59 +0400 Subject: [PATCH 0266/1353] console: measure syncing with GoogleCloudScheduler time --- webapps/console/lib/server/sync-scheduler.ts | 4 +++- webapps/console/pages/api/[workspaceId]/config/link.ts | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/webapps/console/lib/server/sync-scheduler.ts b/webapps/console/lib/server/sync-scheduler.ts index 5b05f43d6..2bd949216 100644 --- a/webapps/console/lib/server/sync-scheduler.ts +++ b/webapps/console/lib/server/sync-scheduler.ts @@ -1,6 +1,6 @@ import { CloudSchedulerClient } from "@google-cloud/scheduler"; import { db } from "./db"; -import { requireDefined } from "juava"; +import { requireDefined, stopwatch } from "juava"; import { google } from "@google-cloud/scheduler/build/protos/protos"; import IJob = google.cloud.scheduler.v1.IJob; import { difference } from "lodash"; @@ -9,6 +9,7 @@ import { getServerLog } from "./log"; const log = getServerLog("sync-scheduler"); export async function syncWithScheduler(baseUrl: string) { + const sw = stopwatch(); const googleSchedulerKeyJson = process.env.GOOGLE_SCHEDULER_KEY; if (!googleSchedulerKeyJson) { log.atInfo().log(`GoogleCloudScheduler sync: GOOGLE_SCHEDULER_KEY is not defined, skipping`); @@ -97,4 +98,5 @@ export async function syncWithScheduler(baseUrl: string) { }); } } + getServerLog().atInfo().log("Sync with GoogleCloudScheduler took", sw.elapsedPretty()); } diff --git a/webapps/console/pages/api/[workspaceId]/config/link.ts b/webapps/console/pages/api/[workspaceId]/config/link.ts index ec46e8e52..d7fee85ac 100644 --- a/webapps/console/pages/api/[workspaceId]/config/link.ts +++ b/webapps/console/pages/api/[workspaceId]/config/link.ts @@ -74,7 +74,8 @@ export const api: Api = { where: { id: existingLink.id }, data: { data, deleted: false }, }); - await syncWithScheduler(getAppEndpoint(req).baseUrl); + //try to do asynchronously for edit + syncWithScheduler(getAppEndpoint(req).baseUrl); await fastStore.fullRefresh(); return { id: existingLink.id, created: false }; } From ccb11ad7b8e0cada2e90ef42fe2c5094105e3275 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 24 Oct 2023 13:37:57 +0400 Subject: [PATCH 0267/1353] console: tune pg pool --- webapps/console/lib/server/db.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/webapps/console/lib/server/db.ts b/webapps/console/lib/server/db.ts index 0856cff11..7836d4148 100644 --- a/webapps/console/lib/server/db.ts +++ b/webapps/console/lib/server/db.ts @@ -89,6 +89,9 @@ export function createPg(): Pool { } const pool = new Pool({ + max: 20, + min: 3, + idleTimeoutMillis: 600000, connectionString: requireDefined(process.env.DATABASE_URL, "env.DATABASE_URL is not defined"), ssl: sslMode === "no-verify" ? { rejectUnauthorized: false } : undefined, }); From 6b077370b3fe513cc667dc48f97d1a69ed35fcb1 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Tue, 24 Oct 2023 19:38:34 -0400 Subject: [PATCH 0268/1353] trivial: sorting on env page, few additional params --- webapps/console/pages/api/admin/env.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/webapps/console/pages/api/admin/env.ts b/webapps/console/pages/api/admin/env.ts index 6bbd7f225..ecd662ddd 100644 --- a/webapps/console/pages/api/admin/env.ts +++ b/webapps/console/pages/api/admin/env.ts @@ -2,6 +2,9 @@ import { Api, nextJsApiHandler } from "../../../lib/api"; import { db } from "../../../lib/server/db"; import { assertDefined, assertTrue } from "juava"; +function sortByKeys(dict: Record): Record { + return Object.fromEntries(Object.entries(dict).sort(([a], [b]) => a.localeCompare(b))); +} export const api: Api = { GET: { auth: true, @@ -10,8 +13,10 @@ export const api: Api = { assertDefined(userProfile, "User profile not found"); assertTrue(userProfile.admin, "Not enough permissions"); return { - env: process.env, - headers: req.headers, + env: sortByKeys(process.env), + headers: sortByKeys(req.headers), + nodeVersion: process.versions.node, + remoteAddress: req.socket.remoteAddress, }; }, }, From 45938a357823978c4e454f1b3a7966b3ec9af92c Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 26 Oct 2023 15:47:20 +0400 Subject: [PATCH 0269/1353] trello#118 rotor: rich metrics support relied on clickhouse. trello#118 console: /api/{workspaceId}/sql/report endpoint to load workspace metrics console & ee: upgraded clickhouse driver cleanups --- docker/.env.example | 2 +- docker/docker-compose.yml | 4 +- libs/core-functions/src/context.ts | 3 +- .../src/functions/bulker-destination.ts | 9 +- .../core-functions/src/functions/lib/index.ts | 21 +++++ .../src/functions/user-recognition.ts | 3 +- libs/core-functions/src/index.ts | 1 + pnpm-lock.yaml | 24 ++--- services/rotor/src/index.ts | 24 +++-- services/rotor/src/lib/functions-chain.ts | 29 +++--- services/rotor/src/lib/metrics.ts | 90 +++++++++++++++---- services/rotor/src/lib/rotor.ts | 2 + types/protocols/functions.d.ts | 20 +---- webapps/console/lib/server/clickhouse.ts | 8 ++ webapps/console/package.json | 2 +- .../pages/[workspaceId]/syncs/index.tsx | 6 +- .../pages/api/[workspaceId]/sql/report.ts | 82 +++++++++++++++++ webapps/console/prisma/metrics.sql | 41 +++++++++ webapps/ee-api/package.json | 2 +- 19 files changed, 294 insertions(+), 79 deletions(-) create mode 100644 webapps/console/lib/server/clickhouse.ts create mode 100644 webapps/console/pages/api/[workspaceId]/sql/report.ts diff --git a/docker/.env.example b/docker/.env.example index 3bb1a581f..c532c126b 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -13,7 +13,7 @@ REDIS_PASSWORD REDIS_PORT=6380 PG_PORT=5438 BULKER_PORT=3042 -JITSU_PORT=3000 +JITSU_PORT=8081 #Connectors specific SYNCS_ENABLED=false diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index ade175b88..163e21614 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -87,8 +87,6 @@ services: tty: true image: jitsucom/syncctl:latest restart: "unless-stopped" - profiles: - - syncs ports: - "${SYNCCTL_PORT:-3046}:3043" environment: @@ -158,4 +156,4 @@ services: postgres: condition: service_healthy ports: - - "${JITSU_PORT:-3216}:3000" + - "${JITSU_PORT:-8081}:3000" diff --git a/libs/core-functions/src/context.ts b/libs/core-functions/src/context.ts index 1896ef88f..d6cd2ddb5 100644 --- a/libs/core-functions/src/context.ts +++ b/libs/core-functions/src/context.ts @@ -1,7 +1,8 @@ -import { EventContext, EventsStore, FetchOpts, FullContext, Store, SystemContext } from "@jitsu/protocols/functions"; +import { EventContext, EventsStore, FetchOpts, FullContext, Store } from "@jitsu/protocols/functions"; import nodeFetch, { RequestInit } from "node-fetch-commonjs"; import { getErrorMessage, getLog, stopwatch } from "juava"; import { httpAgent, httpsAgent } from "./functions/lib/http-agent"; +import { SystemContext } from "./functions/lib"; const log = getLog("functions-context"); diff --git a/libs/core-functions/src/functions/bulker-destination.ts b/libs/core-functions/src/functions/bulker-destination.ts index 134680743..cd685d007 100644 --- a/libs/core-functions/src/functions/bulker-destination.ts +++ b/libs/core-functions/src/functions/bulker-destination.ts @@ -3,6 +3,8 @@ import { RetryError } from "@jitsu/functions-lib"; import { AnalyticsServerEvent, DataLayoutType } from "@jitsu/protocols/analytics"; import omit from "lodash/omit"; +import { requireDefined } from "juava"; +import { MetricsMeta, SystemContext } from "./lib"; const TableNameParameter = "JITSU_TABLE_NAME"; export type MappedEvent = { @@ -254,10 +256,15 @@ export type BulkerDestinationConfig = { const BulkerDestination: JitsuFunction = async (event, ctx) => { const { bulkerEndpoint, destinationId, authToken, dataLayout = "segment-single-table" } = ctx.props; try { + const systemContext = requireDefined((ctx as any as SystemContext).$system, `$system context is not available`); + const metricsMeta: MetricsMeta = { + ...omit(systemContext.metricsMeta, "retries"), + functionId: "builtin.destination.bulker", + }; const events = dataLayouts[dataLayout](event); for (const { event, table } of Array.isArray(events) ? events : [events]) { const res = await ctx.fetch( - `${bulkerEndpoint}/post/${destinationId}?tableName=${table}`, + `${bulkerEndpoint}/post/${destinationId}?tableName=${table}&metricsMeta=${JSON.stringify(metricsMeta)}`, { method: "POST", headers: { Authorization: `Bearer ${authToken}` }, diff --git a/libs/core-functions/src/functions/lib/index.ts b/libs/core-functions/src/functions/lib/index.ts index 2eefa4f18..a1bc53ddd 100644 --- a/libs/core-functions/src/functions/lib/index.ts +++ b/libs/core-functions/src/functions/lib/index.ts @@ -5,6 +5,27 @@ import { ProcessingContext, ServerContextReservedProps, } from "@jitsu/protocols/analytics"; +import { AnonymousEventsStore } from "@jitsu/protocols/functions"; + +export type MetricsMeta = { + workspaceId: string; + messageId: string; + streamId: string; + destinationId: string; + connectionId: string; + functionId?: string; + retries?: number; +}; + +/** + * Function execution context available for built-in functions only + */ +export type SystemContext = { + $system: { + anonymousEventsStore: AnonymousEventsStore; + metricsMeta: MetricsMeta; + }; +}; type KnownEventKeys = keyof Required; //to make sure we diff --git a/libs/core-functions/src/functions/user-recognition.ts b/libs/core-functions/src/functions/user-recognition.ts index 207e9eca7..069c4badd 100644 --- a/libs/core-functions/src/functions/user-recognition.ts +++ b/libs/core-functions/src/functions/user-recognition.ts @@ -1,10 +1,11 @@ import { z } from "zod"; -import { JitsuFunction, SystemContext } from "@jitsu/protocols/functions"; +import { JitsuFunction } from "@jitsu/protocols/functions"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import { requireDefined } from "juava"; import get from "lodash/get"; import set from "lodash/set"; import merge from "lodash/merge"; +import { SystemContext } from "./lib"; export const UserRecognitionConfig = z.object({ /** diff --git a/libs/core-functions/src/index.ts b/libs/core-functions/src/index.ts index 2a917a965..9d5c38d93 100644 --- a/libs/core-functions/src/index.ts +++ b/libs/core-functions/src/index.ts @@ -58,3 +58,4 @@ export * as webhookDestination from "./functions/webhook-destination"; export * as posthogDestination from "./functions/posthog-destination"; export * as mongodbDestination from "./functions/mongodb-destination"; export { mongodb, mongoAnonymousEventsStore } from "./functions/lib/mongodb"; +export type { SystemContext, MetricsMeta } from "./functions/lib/index"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9335707b8..ace35c85e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -645,8 +645,8 @@ importers: specifier: ^1.5.6 version: 1.8.1(react-dom@18.2.0)(react@18.2.0) '@clickhouse/client': - specifier: ^0.0.11 - version: 0.0.11 + specifier: ^0.2.4 + version: 0.2.4 '@fontsource/inter': specifier: ^4.5.13 version: 4.5.15 @@ -943,8 +943,8 @@ importers: specifier: ^3.418.0 version: 3.418.0 '@clickhouse/client': - specifier: ^0.0.11 - version: 0.0.11 + specifier: ^0.2.4 + version: 0.2.4 '@types/node': specifier: 18.11.12 version: 18.11.12 @@ -3169,11 +3169,15 @@ packages: /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - /@clickhouse/client@0.0.11: - resolution: {integrity: sha512-ZxabGakXyRmtKqjyFKHtKrWcNsTdVmeHCZF4JuXHS72m+YmAjTUdAasaHN6xkqRzhkw/Dj94SBxWWTi5gg+ClA==} - engines: {node: '>=14'} + /@clickhouse/client-common@0.2.4: + resolution: {integrity: sha512-XVmxvU0kACANTmQSfdYCIA/reDkH5353AOvfwKRXMNwag8pX2IIoO8zoJjZvtfbGPy5LoI+UKj3aoiKSl8Z8qA==} + dev: false + + /@clickhouse/client@0.2.4: + resolution: {integrity: sha512-qeKYMHoNxRG8xQ4CPEnPcAbreivhWm3QTw9v5BkovS9j/mnt9NcUzWpmdZTsL/vTl63fSTXVkiA9/QY++r3/qQ==} + engines: {node: '>=16'} dependencies: - node-abort-controller: 3.1.1 + '@clickhouse/client-common': 0.2.4 dev: false /@cspotcode/source-map-support@0.8.1: @@ -19048,10 +19052,6 @@ packages: semver: 7.5.4 dev: false - /node-abort-controller@3.1.1: - resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} - dev: false - /node-addon-api@2.0.2: resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} dev: false diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index 0d644a1d3..1b2cb32eb 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -16,8 +16,14 @@ import { glob } from "glob"; import fs from "fs"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import { checkError, FuncChain, runChain } from "./lib/functions-chain"; -import { getBuiltinFunction, mongoAnonymousEventsStore, UDFWrapper } from "@jitsu/core-functions"; -import { AnyEvent, EventContext, FullContext, JitsuFunction, Store, SystemContext } from "@jitsu/protocols/functions"; +import { + getBuiltinFunction, + MetricsMeta, + mongoAnonymousEventsStore, + SystemContext, + UDFWrapper, +} from "@jitsu/core-functions"; +import { AnyEvent, EventContext, FullContext, JitsuFunction, Store } from "@jitsu/protocols/functions"; import { redis } from "@jitsu-internal/console/lib/server/redis"; import express from "express"; import NodeCache from "node-cache"; @@ -149,10 +155,19 @@ export async function rotorMessageHandler( const functions = [...(connectionData.functions || []), mainFunction].filter(f => functionsFilter ? functionsFilter(f.functionId) : true ); + const metricsMeta: MetricsMeta = { + workspaceId: connection.workspaceId, + messageId: message.messageId, + streamId: connection.streamId, + destinationId: connection.destinationId, + connectionId: connection.id, + retries, + }; //system context for builtin functions only const systemContext: SystemContext = { $system: { anonymousEventsStore: mongoAnonymousEventsStore(), + metricsMeta, }, }; const udfFuncChain: FuncChain = await Promise.all( @@ -213,7 +228,6 @@ export async function rotorMessageHandler( const chainRes = await runChain( udfFuncChain, event, - connection, rl, store, pick(ctx, ["geo", "headers", "source", "destination", "connection", "retries"]) @@ -245,8 +259,8 @@ export async function rotorMessageHandler( } }) ); - const chainRes = await runChain(funcChain, event, connection, rl, store, ctx); - await metrics().logMetrics(connection.workspaceId, message.messageId, chainRes.execLog); + const chainRes = await runChain(funcChain, event, rl, store, ctx); + await metrics().logMetrics(chainRes.execLog); checkError(chainRes); } diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index aa6b5b4d1..395f09e47 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -1,17 +1,8 @@ -import { - AnyEvent, - EventContext, - EventsStore, - FuncReturn, - JitsuFunction, - Store, - SystemContext, -} from "@jitsu/protocols/functions"; -import { createFullContext, isDropResult } from "@jitsu/core-functions"; +import { AnyEvent, EventContext, EventsStore, FuncReturn, JitsuFunction, Store } from "@jitsu/protocols/functions"; +import { createFullContext, isDropResult, MetricsMeta, SystemContext } from "@jitsu/core-functions"; import { RetryErrorName, DropRetryErrorName } from "@jitsu/functions-lib"; import { getLog, stopwatch } from "juava"; -import { EnrichedConnectionConfig } from "@jitsu-internal/console/lib/server/fast-store"; import { retryLogMessageIfNeeded } from "./retries"; export type Func = { @@ -33,9 +24,7 @@ export type FuncChainResult = { export type FunctionExecRes = { eventIndex: number; event?: any; - // streamId: string; - // destinationId: string; - // connectionId: string; + metricsMeta?: MetricsMeta; functionId: string; error?: any; dropped?: boolean; @@ -59,7 +48,6 @@ export function checkError(chainRes: FuncChainResult) { export async function runChain( chain: FuncChain, event: AnyEvent, - connection: EnrichedConnectionConfig, eventsStore: EventsStore, store: Store, eventContext: EventContext @@ -73,11 +61,15 @@ export async function runChain( let result: FuncReturn = undefined; const sw = stopwatch(); const funcCtx = createFullContext(f.id, eventsStore, store, eventContext, f.context, f.config, event); + const execLogMeta = { + eventIndex: i, + functionId: f.id, + metricsMeta: Object.hasOwn(f.context, "$system") ? (f.context as SystemContext).$system.metricsMeta : undefined, + }; try { result = await f.exec(event, funcCtx); execLog.push({ - eventIndex: i, - functionId: f.id, + ...execLogMeta, ms: sw.elapsedMs(), dropped: isDropResult(result), }); @@ -86,8 +78,7 @@ export async function runChain( result = "drop"; } execLog.push({ - eventIndex: i, - functionId: f.id, + ...execLogMeta, event, error: err, ms: sw.elapsedMs(), diff --git a/services/rotor/src/lib/metrics.ts b/services/rotor/src/lib/metrics.ts index 773f6c91a..6a304d370 100644 --- a/services/rotor/src/lib/metrics.ts +++ b/services/rotor/src/lib/metrics.ts @@ -1,30 +1,35 @@ import { getSingleton } from "juava"; import { requireDefined } from "juava"; import { getServerLog } from "@jitsu-internal/console/lib/server/log"; -import { FunctionExecLog } from "./functions-chain"; +import { FunctionExecLog, FunctionExecRes } from "./functions-chain"; import fetch from "node-fetch-commonjs"; import { Readable } from "stream"; import { httpAgent, httpsAgent } from "@jitsu-internal/console/lib/server/http-agent"; +import { MetricsMeta } from "@jitsu/core-functions"; +import omit from "lodash/omit"; export const log = getServerLog("metrics"); const bulkerBase = requireDefined(process.env.BULKER_URL, "env BULKER_URL is not defined"); const bulkerAuthKey = requireDefined(process.env.BULKER_AUTH_KEY, "env BULKER_AUTH_KEY is not defined"); const metricsDestinationId = process.env.METRICS_DESTINATION_ID; -const metricsTable = "active_incoming"; +const oldMetricsTable = "active_incoming"; +const metricsTable = "metrics"; + const max_batch_size = 10000; const flush_interval_ms = 60000; export const metrics = getSingleton("metrics", createMetrics); -type MetricsEvent = { +type MetricsEvent = MetricsMeta & { + functionId: string; timestamp: string; - workspaceId: string; - messageId: string; + status: string; + events: number; }; interface Metrics { - logMetrics: (workspaceId: string, messageId: string, execLog: FunctionExecLog) => Promise; + logMetrics: (execLog: FunctionExecLog) => Promise; } function createMetrics(): Metrics { @@ -32,6 +37,13 @@ function createMetrics(): Metrics { const flush = async (buf: MetricsEvent[]) => { //create readable stream + const streamOld = new Readable(); + const resOld = fetch(`${bulkerBase}/bulk/${metricsDestinationId}?tableName=${oldMetricsTable}&mode=batch`, { + method: "POST", + headers: { Authorization: `Bearer ${bulkerAuthKey}` }, + body: streamOld, + agent: (bulkerBase.startsWith("https://") ? httpsAgent : httpAgent)(), + }); const stream = new Readable(); const res = fetch(`${bulkerBase}/bulk/${metricsDestinationId}?tableName=${metricsTable}&mode=batch`, { method: "POST", @@ -40,11 +52,31 @@ function createMetrics(): Metrics { agent: (bulkerBase.startsWith("https://") ? httpsAgent : httpAgent)(), }); buf.forEach(e => { - stream.push(JSON.stringify(e)); + if (e.functionId.startsWith("builtin.destination.") && e.status !== "dropped") { + streamOld.push( + JSON.stringify({ + timestamp: e.timestamp, + workspaceId: e.workspaceId, + messageId: e.messageId, + }) + ); + streamOld.push("\n"); + } + stream.push(JSON.stringify(omit(e, "retries"))); stream.push("\n"); }); //close stream + streamOld.push(null); stream.push(null); + resOld + .then(r => { + if (!r.ok) { + log.atError().log(`Failed to flush metrics events(old): ${r.status} ${r.statusText}`); + } + }) + .catch(e => { + log.atError().withCause(e).log(`Failed to flush metrics events(old)`); + }); res .then(r => { if (!r.ok) { @@ -65,22 +97,46 @@ function createMetrics(): Metrics { }, flush_interval_ms); return { - logMetrics: async (workspaceId: string, messageId: string, execLog: FunctionExecLog) => { + logMetrics: async (execLog: FunctionExecLog) => { if (!metricsDestinationId) { return; } - const processedIdx = execLog.findIndex(l => !l.dropped && l.functionId.startsWith("builtin.destination.")); - if (processedIdx < 0) { - return; - } + const d = new Date(); d.setMilliseconds(0); d.setSeconds(0); - buffer.push({ - timestamp: d.toISOString(), - workspaceId, - messageId, - }); + + for (const el of execLog) { + if (!el.metricsMeta) { + continue; + } + // console.log( + // `${el.metricsMeta.connectionId} ${el.metricsMeta.messageId} ${el.functionId} ${el.error} ${el.dropped} ${el.metricsMeta.retries}` + // ); + const status = ((el: FunctionExecRes) => { + let prefix = el.functionId.startsWith("builtin.destination.") ? "" : "function_"; + let status = "success"; + if (el.error) { + if (el.metricsMeta?.retries) { + prefix = prefix + "retry_"; + } + status = "error"; + } else if (el.dropped) { + prefix = ""; + status = "dropped"; + } else if (el.functionId === "builtin.destination.bulker") { + status = "processed"; + } + return prefix + status; + })(el); + buffer.push({ + timestamp: d.toISOString(), + ...el.metricsMeta, + functionId: el.functionId, + status, + events: 1, + }); + } if (buffer.length >= max_batch_size) { log.atInfo().log(`Flushing ${buffer.length} metrics events`); setImmediate(() => flush([...buffer])); diff --git a/services/rotor/src/lib/rotor.ts b/services/rotor/src/lib/rotor.ts index f0f5718a7..10759af65 100644 --- a/services/rotor/src/lib/rotor.ts +++ b/services/rotor/src/lib/rotor.ts @@ -17,6 +17,7 @@ const log = getLog("kafka-rotor"); const RETRY_TIME_HEADER = "retry_time"; const RETRY_COUNT_HEADER = "retries"; +const ERROR_HEADER = "error"; const ORIGINAL_TOPIC_HEADER = "original_topic"; const FUNCTION_ID_HEADER = "function_id"; @@ -150,6 +151,7 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { value: newMessage, key: message.key, headers: { + [ERROR_HEADER]: e.message, [RETRY_COUNT_HEADER]: `${retries}`, [ORIGINAL_TOPIC_HEADER]: topic, [RETRY_TIME_HEADER]: retryTime, diff --git a/types/protocols/functions.d.ts b/types/protocols/functions.d.ts index 74002b11a..469665407 100644 --- a/types/protocols/functions.d.ts +++ b/types/protocols/functions.d.ts @@ -77,15 +77,6 @@ export type AnonymousEventsStore = { evictEvents(collectionName: string, anonymousId: string): Promise; }; -/** - * Function execution context available for builin functions only - */ -export type SystemContext = { - $system: { - anonymousEventsStore: AnonymousEventsStore; - }; -}; - export type WithConfidence = T & { //A value from 0-100 indicating how confident we are in the result confidence?: number; @@ -166,18 +157,18 @@ export type EventContext = { /** * Source of the incoming event */ - source?: { + source: { id: string; name?: string; domain?: string; }; - destination?: { + destination: { id: string; type: string; updatedAt: Date; hash: string; }; - connection?: { + connection: { id: string; mode?: string; options?: any; @@ -193,10 +184,7 @@ export type FunctionConfigContext

    = { /** * Parameters for a function */ -export type FullContext

    = EventContext & - FunctionContext & - FunctionConfigContext

    & - (SystemContext | {}); +export type FullContext

    = EventContext & FunctionContext & FunctionConfigContext

    ; //equivalent to returning [] from a function export type FunctionCommand = "drop"; diff --git a/webapps/console/lib/server/clickhouse.ts b/webapps/console/lib/server/clickhouse.ts new file mode 100644 index 000000000..a45463594 --- /dev/null +++ b/webapps/console/lib/server/clickhouse.ts @@ -0,0 +1,8 @@ +import { createClient } from "@clickhouse/client"; +import { requireDefined } from "juava"; + +export const clickhouse = createClient({ + host: requireDefined(process.env.CLICKHOUSE_URL, `env CLICKHOUSE_URL is not defined`), + username: process.env.CLICKHOUSE_USERNAME || "default", + password: requireDefined(process.env.CLICKHOUSE_PASSWORD, `env CLICKHOUSE_PASSWORD is not defined`), +}); diff --git a/webapps/console/package.json b/webapps/console/package.json index 3954ef1ce..9a68f24f1 100644 --- a/webapps/console/package.json +++ b/webapps/console/package.json @@ -23,7 +23,7 @@ }, "dependencies": { "@ant-design/cssinjs": "^1.5.6", - "@clickhouse/client": "^0.0.11", + "@clickhouse/client": "^0.2.4", "@fontsource/inter": "^4.5.13", "@fontsource/roboto-mono": "^4.5.8", "@jitsu/core-functions": "workspace:*", diff --git a/webapps/console/pages/[workspaceId]/syncs/index.tsx b/webapps/console/pages/[workspaceId]/syncs/index.tsx index 72f1be155..478dc630c 100644 --- a/webapps/console/pages/[workspaceId]/syncs/index.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/index.tsx @@ -483,7 +483,11 @@ const ScheduleDocumentation: React.FC<{ const appConfig = useAppConfig(); const workspace = useWorkspace(); - const displayDomain = appConfig.websiteUrl; + const displayDomain = + appConfig.publicEndpoints.protocol + + "://" + + appConfig.publicEndpoints.host + + ([80, 443].includes(appConfig.publicEndpoints.port ?? 80) ? "" : ":" + appConfig.publicEndpoints.port); return (

    diff --git a/webapps/console/pages/api/[workspaceId]/sql/report.ts b/webapps/console/pages/api/[workspaceId]/sql/report.ts new file mode 100644 index 000000000..64b1833c4 --- /dev/null +++ b/webapps/console/pages/api/[workspaceId]/sql/report.ts @@ -0,0 +1,82 @@ +import { z } from "zod"; +import { createRoute, verifyAccess } from "../../../../lib/api"; +import { clickhouse } from "../../../../lib/server/clickhouse"; +import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; +import { getServerLog } from "../../../../lib/server/log"; +import { requireDefined } from "juava"; +import { db } from "../../../../lib/server/db"; + +dayjs.extend(utc); + +const log = getServerLog("report-query"); + +export default createRoute() + .GET({ + auth: true, + query: z.object({ + workspaceId: z.string(), + destinationId: z.string().optional(), + streamId: z.string().optional(), + connectionId: z.string().optional(), + statuses: z.string().optional().default("success,dropped,error"), + start: z.string().optional(), + end: z.string().optional(), + groupBy: z.string().optional().default("workspaceId,status"), + granularity: z.enum(["month", "day", "hour", "minute"]).optional().default("day"), + }), + result: z.any(), + }) + .handler(async ({ user, query }) => { + const { workspaceId } = query; + await verifyAccess(user, workspaceId); + const workspace = requireDefined( + await db.prisma().workspace.findFirst({ + where: { + OR: [ + { + id: workspaceId, + }, + { + slug: workspaceId, + }, + ], + deleted: false, + }, + }), + `Workspace ${workspaceId} not found` + ); + const startTs = query.start ? dayjs(query.start, "YYYY-MM-DD").utc(true).unix() : undefined; + const endTs = query.end ? dayjs(query.end, "YYYY-MM-DD").add(1, "day").utc(true).unix() : undefined; + const groupBy = query.groupBy ? query.groupBy.split(",") : []; + const sql = `select date_trunc('${query.granularity || "day"}', timestamp) dt, ${ + groupBy.length > 0 ? groupBy.join(",") + "," : "" + } sumMerge(events) events, uniqMerge(uniqEvents) uniq_events from newjitsu_metrics_test.mv_metrics +where workspaceId = '${workspace.id}' +${startTs ? ` and timestamp >= fromUnixTimestamp(${startTs})` : ""} +${endTs ? ` and timestamp < fromUnixTimestamp(${endTs})` : ""} +${query.destinationId ? ` and destinationId = '${query.destinationId}'` : ""} +${query.connectionId ? ` and connectionId = '${query.connectionId}'` : ""} +${query.streamId ? ` and streamId = '${query.streamId}'` : ""} +${ + query.statuses + ? ` and status in (${query.statuses + .split(",") + .map(s => `'${s}'`) + .join(",")})` + : "" +} +group by all with totals +order by 1 desc`; + + log.atInfo().log(sql); + + const resultSet = await clickhouse.query({ + query: sql, + clickhouse_settings: { + wait_end_of_query: 1, + }, + }); + return await resultSet.json(); + }) + .toNextApiHandler(); diff --git a/webapps/console/prisma/metrics.sql b/webapps/console/prisma/metrics.sql index 2a373980f..a642e5939 100644 --- a/webapps/console/prisma/metrics.sql +++ b/webapps/console/prisma/metrics.sql @@ -28,3 +28,44 @@ GROUP BY timestamp, workspaceId; + +CREATE TABLE newjitsu_metrics.metrics on cluster jitsu_cluster +( + timestamp DateTime, + messageId String, + workspaceId LowCardinality(String), + streamId LowCardinality(String), + connectionId LowCardinality(String), + functionId LowCardinality(String), + destinationId LowCardinality(String), + status LowCardinality(String), + events Int64 + ) + ENGINE = Null; + +CREATE MATERIALIZED VIEW newjitsu_metrics.mv_metrics on cluster jitsu_cluster + ( + timestamp DateTime, + workspaceId LowCardinality(String), + streamId LowCardinality(String), + connectionId LowCardinality(String), + functionId LowCardinality(String), + destinationId LowCardinality(String), + status LowCardinality(String), + events AggregateFunction(sum, Int64), + uniqEvents AggregateFunction(uniq, String) + + ) + ENGINE = ReplicatedAggregatingMergeTree('/clickhouse/tables/{shard}/newjitsu_metrics/mv_metrics', '{replica}') ORDER BY (timestamp, workspaceId, streamId, connectionId, functionId, destinationId, status) +AS SELECT + timestamp, + workspaceId, + streamId, + connectionId, + functionId, + destinationId, + status, + sumState(events) AS events, + uniqState(messageId) AS uniqEvents + FROM newjitsu_metrics.metrics + GROUP BY timestamp, workspaceId, streamId, connectionId, functionId, destinationId, status; \ No newline at end of file diff --git a/webapps/ee-api/package.json b/webapps/ee-api/package.json index 0e2832449..80b46c57f 100644 --- a/webapps/ee-api/package.json +++ b/webapps/ee-api/package.json @@ -9,7 +9,7 @@ }, "dependencies": { "is-valid-domain": "^0.1.6", - "@clickhouse/client": "^0.0.11", + "@clickhouse/client": "^0.2.4", "@aws-sdk/client-s3": "^3.418.0", "@types/node": "18.11.12", "@types/react": "18.0.28", From 0f1758e3f92f147781d4d243d21bf5d6906a0be6 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 26 Oct 2023 16:04:58 +0400 Subject: [PATCH 0270/1353] fix db schema --- webapps/console/pages/api/[workspaceId]/sql/report.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/pages/api/[workspaceId]/sql/report.ts b/webapps/console/pages/api/[workspaceId]/sql/report.ts index 64b1833c4..e65396028 100644 --- a/webapps/console/pages/api/[workspaceId]/sql/report.ts +++ b/webapps/console/pages/api/[workspaceId]/sql/report.ts @@ -51,7 +51,7 @@ export default createRoute() const groupBy = query.groupBy ? query.groupBy.split(",") : []; const sql = `select date_trunc('${query.granularity || "day"}', timestamp) dt, ${ groupBy.length > 0 ? groupBy.join(",") + "," : "" - } sumMerge(events) events, uniqMerge(uniqEvents) uniq_events from newjitsu_metrics_test.mv_metrics + } sumMerge(events) events, uniqMerge(uniqEvents) uniq_events from newjitsu_metrics.mv_metrics where workspaceId = '${workspace.id}' ${startTs ? ` and timestamp >= fromUnixTimestamp(${startTs})` : ""} ${endTs ? ` and timestamp < fromUnixTimestamp(${endTs})` : ""} From 1ac2caa77e335c2b999b2d1e994cfb9a496c3743 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 26 Oct 2023 18:02:56 +0400 Subject: [PATCH 0271/1353] console: metric reports: more precise date interval control --- .../pages/api/[workspaceId]/sql/report.ts | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/webapps/console/pages/api/[workspaceId]/sql/report.ts b/webapps/console/pages/api/[workspaceId]/sql/report.ts index e65396028..12a4838f3 100644 --- a/webapps/console/pages/api/[workspaceId]/sql/report.ts +++ b/webapps/console/pages/api/[workspaceId]/sql/report.ts @@ -20,8 +20,8 @@ export default createRoute() streamId: z.string().optional(), connectionId: z.string().optional(), statuses: z.string().optional().default("success,dropped,error"), - start: z.string().optional(), - end: z.string().optional(), + start: z.any().optional(), + end: z.any().optional(), groupBy: z.string().optional().default("workspaceId,status"), granularity: z.enum(["month", "day", "hour", "minute"]).optional().default("day"), }), @@ -46,15 +46,15 @@ export default createRoute() }), `Workspace ${workspaceId} not found` ); - const startTs = query.start ? dayjs(query.start, "YYYY-MM-DD").utc(true).unix() : undefined; - const endTs = query.end ? dayjs(query.end, "YYYY-MM-DD").add(1, "day").utc(true).unix() : undefined; + const startTs = query.start ? new Date(query.start).toISOString() : undefined; + const endTs = query.end ? new Date(query.end).toISOString() : undefined; const groupBy = query.groupBy ? query.groupBy.split(",") : []; const sql = `select date_trunc('${query.granularity || "day"}', timestamp) dt, ${ groupBy.length > 0 ? groupBy.join(",") + "," : "" - } sumMerge(events) events, uniqMerge(uniqEvents) uniq_events from newjitsu_metrics.mv_metrics + } sumMerge(events) events, uniqMerge(uniqEvents) uniq_events from newjitsu_metrics_test.mv_metrics where workspaceId = '${workspace.id}' -${startTs ? ` and timestamp >= fromUnixTimestamp(${startTs})` : ""} -${endTs ? ` and timestamp < fromUnixTimestamp(${endTs})` : ""} +${startTs ? ` and timestamp >= toDateTime('${isoDateTOClickhouse(startTs)}')` : ""} +${endTs ? ` and timestamp < toDateTime('${isoDateTOClickhouse(endTs)}')` : ""} ${query.destinationId ? ` and destinationId = '${query.destinationId}'` : ""} ${query.connectionId ? ` and connectionId = '${query.connectionId}'` : ""} ${query.streamId ? ` and streamId = '${query.streamId}'` : ""} @@ -80,3 +80,7 @@ order by 1 desc`; return await resultSet.json(); }) .toNextApiHandler(); + +function isoDateTOClickhouse(date: string): string { + return date.replace("T", " ").replace("Z", "").split(".")[0]; +} From c206c09549ecb246500d6551d39cbfe2902159ba Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 26 Oct 2023 18:14:38 +0400 Subject: [PATCH 0272/1353] fix db schema name --- webapps/console/pages/api/[workspaceId]/sql/report.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/pages/api/[workspaceId]/sql/report.ts b/webapps/console/pages/api/[workspaceId]/sql/report.ts index 12a4838f3..469b26a14 100644 --- a/webapps/console/pages/api/[workspaceId]/sql/report.ts +++ b/webapps/console/pages/api/[workspaceId]/sql/report.ts @@ -51,7 +51,7 @@ export default createRoute() const groupBy = query.groupBy ? query.groupBy.split(",") : []; const sql = `select date_trunc('${query.granularity || "day"}', timestamp) dt, ${ groupBy.length > 0 ? groupBy.join(",") + "," : "" - } sumMerge(events) events, uniqMerge(uniqEvents) uniq_events from newjitsu_metrics_test.mv_metrics + } sumMerge(events) events, uniqMerge(uniqEvents) uniq_events from newjitsu_metrics.mv_metrics where workspaceId = '${workspace.id}' ${startTs ? ` and timestamp >= toDateTime('${isoDateTOClickhouse(startTs)}')` : ""} ${endTs ? ` and timestamp < toDateTime('${isoDateTOClickhouse(endTs)}')` : ""} From 76cea4cefaaf9559af995b063c1cd2e4573e6eef Mon Sep 17 00:00:00 2001 From: Scott Adams Date: Fri, 27 Oct 2023 10:19:27 +0200 Subject: [PATCH 0273/1353] feat: Use NEXT_PUBLIC_SENTRY_DSN and disable sentry without NEXT_PUBLIC_SENTRY_DSN (#1056) --- webapps/console/next.config.js | 4 ++-- webapps/console/sentry.client.config.ts | 3 ++- webapps/console/sentry.edge.config.ts | 3 ++- webapps/console/sentry.server.config.ts | 3 ++- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/webapps/console/next.config.js b/webapps/console/next.config.js index 4a3c147fa..1053f8775 100644 --- a/webapps/console/next.config.js +++ b/webapps/console/next.config.js @@ -99,8 +99,8 @@ module.exports = withSentryConfig( // Suppresses source map uploading logs during build silent: true, authToken: process.env.SENTRY_AUTH_TOKEN, - org: "jitsucom", - project: "new-jitsu", + org: process.env.SENTRY_ORG || "jitsucom", + project: process.env.SENTRY_PROJECT || "new-jitsu", }, { // For all available options, see: diff --git a/webapps/console/sentry.client.config.ts b/webapps/console/sentry.client.config.ts index ff60aaa4e..57c6e89c8 100644 --- a/webapps/console/sentry.client.config.ts +++ b/webapps/console/sentry.client.config.ts @@ -5,7 +5,8 @@ import * as Sentry from "@sentry/nextjs"; Sentry.init({ - dsn: "https://9a477534c34b4befbd5dc6397cf6815a@o330694.ingest.sentry.io/4505516539445248", + enabled: !!process.env.NEXT_PUBLIC_SENTRY_DSN, + dsn: process.env.NEXT_PUBLIC_SENTRY_DSN, // Adjust this value in production, or use tracesSampler for greater control tracesSampleRate: 1, diff --git a/webapps/console/sentry.edge.config.ts b/webapps/console/sentry.edge.config.ts index 50954e999..182f404d5 100644 --- a/webapps/console/sentry.edge.config.ts +++ b/webapps/console/sentry.edge.config.ts @@ -6,7 +6,8 @@ import * as Sentry from "@sentry/nextjs"; Sentry.init({ - dsn: "https://9a477534c34b4befbd5dc6397cf6815a@o330694.ingest.sentry.io/4505516539445248", + enabled: !!process.env.NEXT_PUBLIC_SENTRY_DSN, + dsn: process.env.NEXT_PUBLIC_SENTRY_DSN, // Adjust this value in production, or use tracesSampler for greater control tracesSampleRate: 1, diff --git a/webapps/console/sentry.server.config.ts b/webapps/console/sentry.server.config.ts index 67af1eb26..373fba164 100644 --- a/webapps/console/sentry.server.config.ts +++ b/webapps/console/sentry.server.config.ts @@ -5,7 +5,8 @@ import * as Sentry from "@sentry/nextjs"; Sentry.init({ - dsn: "https://9a477534c34b4befbd5dc6397cf6815a@o330694.ingest.sentry.io/4505516539445248", + enabled: !!process.env.NEXT_PUBLIC_SENTRY_DSN, + dsn: process.env.NEXT_PUBLIC_SENTRY_DSN, // Adjust this value in production, or use tracesSampler for greater control tracesSampleRate: 1, From e04911b8b69e2674c21d84d77a4ff2b78be24d54 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 27 Oct 2023 12:22:14 +0400 Subject: [PATCH 0274/1353] added CLICKHOUSE_METRICS_SCHEMA to customize metrics schema --- webapps/console/pages/api/[workspaceId]/sql/report.ts | 3 ++- webapps/ee-api/pages/api/report/workspace-stat.ts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/webapps/console/pages/api/[workspaceId]/sql/report.ts b/webapps/console/pages/api/[workspaceId]/sql/report.ts index 469b26a14..93febfc52 100644 --- a/webapps/console/pages/api/[workspaceId]/sql/report.ts +++ b/webapps/console/pages/api/[workspaceId]/sql/report.ts @@ -46,12 +46,13 @@ export default createRoute() }), `Workspace ${workspaceId} not found` ); + const metricsSchema = process.env.CLICKHOUSE_METRICS_SCHEMA || "newjitsu_metrics"; const startTs = query.start ? new Date(query.start).toISOString() : undefined; const endTs = query.end ? new Date(query.end).toISOString() : undefined; const groupBy = query.groupBy ? query.groupBy.split(",") : []; const sql = `select date_trunc('${query.granularity || "day"}', timestamp) dt, ${ groupBy.length > 0 ? groupBy.join(",") + "," : "" - } sumMerge(events) events, uniqMerge(uniqEvents) uniq_events from newjitsu_metrics.mv_metrics + } sumMerge(events) events, uniqMerge(uniqEvents) uniq_events from ${metricsSchema}.mv_metrics where workspaceId = '${workspace.id}' ${startTs ? ` and timestamp >= toDateTime('${isoDateTOClickhouse(startTs)}')` : ""} ${endTs ? ` and timestamp < toDateTime('${isoDateTOClickhouse(endTs)}')` : ""} diff --git a/webapps/ee-api/pages/api/report/workspace-stat.ts b/webapps/ee-api/pages/api/report/workspace-stat.ts index a7a23e3ac..8c5e71bd4 100644 --- a/webapps/ee-api/pages/api/report/workspace-stat.ts +++ b/webapps/ee-api/pages/api/report/workspace-stat.ts @@ -67,11 +67,12 @@ async function getClickhousePart({ end, workspaceId, }: ReportParams): Promise { + const metricsSchema = process.env.CLICKHOUSE_METRICS_SCHEMA || "newjitsu_metrics"; const query = `select date_trunc('${granularity}', timestamp) as period, workspaceId as "workspaceId", uniqMerge(count) as events - from newjitsu_metrics.mv_active_incoming + from ${metricsSchema}.mv_active_incoming where timestamp >= toDateTime('2023-07-28 00:00:00', 'UTC') and timestamp >= toDateTime({start :String}, 'UTC') and From 9dd864eb22fe660a0836d462d0ee4d299181cf4d Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 27 Oct 2023 14:08:09 +0400 Subject: [PATCH 0275/1353] rotor await flushing metrics --- services/rotor/src/lib/metrics.ts | 38 ++++++++++++++++--------------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/services/rotor/src/lib/metrics.ts b/services/rotor/src/lib/metrics.ts index 6a304d370..e556004fb 100644 --- a/services/rotor/src/lib/metrics.ts +++ b/services/rotor/src/lib/metrics.ts @@ -68,24 +68,26 @@ function createMetrics(): Metrics { //close stream streamOld.push(null); stream.push(null); - resOld - .then(r => { - if (!r.ok) { - log.atError().log(`Failed to flush metrics events(old): ${r.status} ${r.statusText}`); - } - }) - .catch(e => { - log.atError().withCause(e).log(`Failed to flush metrics events(old)`); - }); - res - .then(r => { - if (!r.ok) { - log.atError().log(`Failed to flush metrics events: ${r.status} ${r.statusText}`); - } - }) - .catch(e => { - log.atError().withCause(e).log(`Failed to flush metrics events`); - }); + await Promise.all([ + resOld + .then(r => { + if (!r.ok) { + log.atError().log(`Failed to flush metrics events(old): ${r.status} ${r.statusText}`); + } + }) + .catch(e => { + log.atError().withCause(e).log(`Failed to flush metrics events(old)`); + }), + res + .then(r => { + if (!r.ok) { + log.atError().log(`Failed to flush metrics events: ${r.status} ${r.statusText}`); + } + }) + .catch(e => { + log.atError().withCause(e).log(`Failed to flush metrics events`); + }), + ]); }; setInterval(async () => { From 23a2e96dd98468d1642346e2a6e1b64947cb980e Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 27 Oct 2023 14:46:05 +0400 Subject: [PATCH 0276/1353] rotor report metrics flushing --- services/rotor/src/lib/metrics.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/services/rotor/src/lib/metrics.ts b/services/rotor/src/lib/metrics.ts index e556004fb..36aa01b60 100644 --- a/services/rotor/src/lib/metrics.ts +++ b/services/rotor/src/lib/metrics.ts @@ -70,8 +70,10 @@ function createMetrics(): Metrics { stream.push(null); await Promise.all([ resOld - .then(r => { - if (!r.ok) { + .then(async r => { + if (r.ok) { + log.atInfo().log(`Flushed metrics events(old): ${((await r.json()) as any).state.successfulRows}`); + } else { log.atError().log(`Failed to flush metrics events(old): ${r.status} ${r.statusText}`); } }) @@ -79,8 +81,10 @@ function createMetrics(): Metrics { log.atError().withCause(e).log(`Failed to flush metrics events(old)`); }), res - .then(r => { - if (!r.ok) { + .then(async r => { + if (r.ok) { + log.atInfo().log(`Flushed metrics events: ${((await r.json()) as any).state.successfulRows}`); + } else { log.atError().log(`Failed to flush metrics events: ${r.status} ${r.statusText}`); } }) From 60d62ef891490c5ffd1b7de8ca90ea69e9a23e02 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Fri, 27 Oct 2023 11:58:17 -0400 Subject: [PATCH 0277/1353] trivial: added cookie list to admin endpoint --- webapps/console/pages/api/admin/env.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/webapps/console/pages/api/admin/env.ts b/webapps/console/pages/api/admin/env.ts index ecd662ddd..7eb685ee5 100644 --- a/webapps/console/pages/api/admin/env.ts +++ b/webapps/console/pages/api/admin/env.ts @@ -2,7 +2,7 @@ import { Api, nextJsApiHandler } from "../../../lib/api"; import { db } from "../../../lib/server/db"; import { assertDefined, assertTrue } from "juava"; -function sortByKeys(dict: Record): Record { +function sortByKey(dict: Record): Record { return Object.fromEntries(Object.entries(dict).sort(([a], [b]) => a.localeCompare(b))); } export const api: Api = { @@ -13,8 +13,9 @@ export const api: Api = { assertDefined(userProfile, "User profile not found"); assertTrue(userProfile.admin, "Not enough permissions"); return { - env: sortByKeys(process.env), - headers: sortByKeys(req.headers), + env: sortByKey(process.env), + headers: sortByKey(req.headers), + cookies: sortByKey(req.cookies), nodeVersion: process.versions.node, remoteAddress: req.socket.remoteAddress, }; From 074079d6bb2d379663b2aff33d75de3c95c09b17 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Sat, 28 Oct 2023 14:26:48 +0400 Subject: [PATCH 0278/1353] rotor refactor sending metrics --- pnpm-lock.yaml | 6 ++ services/rotor/package.json | 4 +- services/rotor/src/index.ts | 5 +- services/rotor/src/lib/metrics.ts | 105 ++++++++++-------------------- services/rotor/src/lib/rotor.ts | 11 +++- 5 files changed, 54 insertions(+), 77 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ace35c85e..2d739b3bc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -518,6 +518,12 @@ importers: juava: specifier: workspace:* version: link:../../libs/juava + kafkajs: + specifier: ^2.2.4 + version: 2.2.4 + kafkajs-snappy: + specifier: ^1.1.0 + version: 1.1.0 minimist: specifier: ^1.2.7 version: 1.2.8 diff --git a/services/rotor/package.json b/services/rotor/package.json index c5d04fc50..9529fe8be 100644 --- a/services/rotor/package.json +++ b/services/rotor/package.json @@ -32,7 +32,9 @@ "json5": "^2.1.0", "minimist": "^1.2.7", "node-fetch-commonjs": "^3.3.1", - "tslib": "^2.4.0" + "tslib": "^2.4.0", + "kafkajs": "^2.2.4", + "kafkajs-snappy": "^1.1.0" }, "devDependencies": { "@types/lodash": "^4.14.200", diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index 1b2cb32eb..3d636b38a 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -30,7 +30,7 @@ import NodeCache from "node-cache"; import hash from "object-hash"; import { UDFRunHandler } from "./http/udf"; import Prometheus from "prom-client"; -import { metrics } from "./lib/metrics"; +import { Metrics } from "./lib/metrics"; import { redisLogger } from "./lib/redis-logger"; import pick from "lodash/pick"; @@ -72,6 +72,7 @@ const getCachedOrLoad = async (cache: NodeCache, key: string, loader: (key: stri export async function rotorMessageHandler( _message: string | undefined, + metrics?: Metrics, functionsFilter?: (id: string) => boolean, retries: number = 0 ) { @@ -260,7 +261,7 @@ export async function rotorMessageHandler( }) ); const chainRes = await runChain(funcChain, event, rl, store, ctx); - await metrics().logMetrics(chainRes.execLog); + await metrics?.logMetrics(chainRes.execLog); checkError(chainRes); } diff --git a/services/rotor/src/lib/metrics.ts b/services/rotor/src/lib/metrics.ts index 36aa01b60..7b8088bba 100644 --- a/services/rotor/src/lib/metrics.ts +++ b/services/rotor/src/lib/metrics.ts @@ -1,26 +1,17 @@ -import { getSingleton } from "juava"; -import { requireDefined } from "juava"; +import { stopwatch } from "juava"; import { getServerLog } from "@jitsu-internal/console/lib/server/log"; import { FunctionExecLog, FunctionExecRes } from "./functions-chain"; -import fetch from "node-fetch-commonjs"; -import { Readable } from "stream"; -import { httpAgent, httpsAgent } from "@jitsu-internal/console/lib/server/http-agent"; import { MetricsMeta } from "@jitsu/core-functions"; import omit from "lodash/omit"; +import type { Producer } from "kafkajs"; export const log = getServerLog("metrics"); -const bulkerBase = requireDefined(process.env.BULKER_URL, "env BULKER_URL is not defined"); -const bulkerAuthKey = requireDefined(process.env.BULKER_AUTH_KEY, "env BULKER_AUTH_KEY is not defined"); const metricsDestinationId = process.env.METRICS_DESTINATION_ID; -const oldMetricsTable = "active_incoming"; -const metricsTable = "metrics"; const max_batch_size = 10000; const flush_interval_ms = 60000; -export const metrics = getSingleton("metrics", createMetrics); - type MetricsEvent = MetricsMeta & { functionId: string; timestamp: string; @@ -28,77 +19,47 @@ type MetricsEvent = MetricsMeta & { events: number; }; -interface Metrics { +export interface Metrics { logMetrics: (execLog: FunctionExecLog) => Promise; } -function createMetrics(): Metrics { +export function createMetrics(producer: Producer): Metrics { const buffer: MetricsEvent[] = []; const flush = async (buf: MetricsEvent[]) => { - //create readable stream - const streamOld = new Readable(); - const resOld = fetch(`${bulkerBase}/bulk/${metricsDestinationId}?tableName=${oldMetricsTable}&mode=batch`, { - method: "POST", - headers: { Authorization: `Bearer ${bulkerAuthKey}` }, - body: streamOld, - agent: (bulkerBase.startsWith("https://") ? httpsAgent : httpAgent)(), - }); - const stream = new Readable(); - const res = fetch(`${bulkerBase}/bulk/${metricsDestinationId}?tableName=${metricsTable}&mode=batch`, { - method: "POST", - headers: { Authorization: `Bearer ${bulkerAuthKey}` }, - body: stream, - agent: (bulkerBase.startsWith("https://") ? httpsAgent : httpAgent)(), - }); - buf.forEach(e => { - if (e.functionId.startsWith("builtin.destination.") && e.status !== "dropped") { - streamOld.push( - JSON.stringify({ - timestamp: e.timestamp, - workspaceId: e.workspaceId, - messageId: e.messageId, - }) - ); - streamOld.push("\n"); - } - stream.push(JSON.stringify(omit(e, "retries"))); - stream.push("\n"); - }); - //close stream - streamOld.push(null); - stream.push(null); await Promise.all([ - resOld - .then(async r => { - if (r.ok) { - log.atInfo().log(`Flushed metrics events(old): ${((await r.json()) as any).state.successfulRows}`); - } else { - log.atError().log(`Failed to flush metrics events(old): ${r.status} ${r.statusText}`); - } - }) - .catch(e => { - log.atError().withCause(e).log(`Failed to flush metrics events(old)`); - }), - res - .then(async r => { - if (r.ok) { - log.atInfo().log(`Flushed metrics events: ${((await r.json()) as any).state.successfulRows}`); - } else { - log.atError().log(`Failed to flush metrics events: ${r.status} ${r.statusText}`); - } - }) - .catch(e => { - log.atError().withCause(e).log(`Failed to flush metrics events`); - }), + producer.send({ + topic: `in.id.metrics.m.batch.t.metrics`, + messages: buf.map(m => ({ + value: JSON.stringify(m), + })), + }), + producer.send({ + topic: `in.id.metrics.m.batch.t.active_incoming`, + messages: buf + .filter(m => m.functionId.startsWith("builtin.destination.") && m.status !== "dropped") + .map(m => ({ + value: JSON.stringify({ + timestamp: m.timestamp, + workspaceId: m.workspaceId, + messageId: m.messageId, + }), + })), + }), ]); }; setInterval(async () => { - if (buffer.length > 0) { - log.atInfo().log(`Periodic flushing ${buffer.length} metrics events`); - await flush([...buffer]); - buffer.length = 0; + const length = buffer.length; + if (length > 0) { + const sw = stopwatch(); + try { + await flush([...buffer]); + buffer.length = 0; + log.atInfo().log(`Periodic flushing ${length} metrics events took ${sw.elapsedPretty()}`); + } catch (e) { + log.atError().withCause(e).log(`Failed to flush metrics`); + } } }, flush_interval_ms); @@ -137,7 +98,7 @@ function createMetrics(): Metrics { })(el); buffer.push({ timestamp: d.toISOString(), - ...el.metricsMeta, + ...omit(el.metricsMeta, "retries"), functionId: el.functionId, status, events: 1, diff --git a/services/rotor/src/lib/rotor.ts b/services/rotor/src/lib/rotor.ts index 10759af65..2205efe2f 100644 --- a/services/rotor/src/lib/rotor.ts +++ b/services/rotor/src/lib/rotor.ts @@ -12,6 +12,7 @@ import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; dayjs.extend(utc); import { getRetryPolicy, retryBackOffTime, retryLogMessage } from "./retries"; +import { createMetrics, Metrics } from "./metrics"; const log = getLog("kafka-rotor"); @@ -26,7 +27,12 @@ export type KafkaRotorConfig = { consumerGroupId: string; kafkaTopics: string[]; kafkaClientId?: string; - handle: (message: string, functionsFilter?: (id: string) => boolean, retries?: number) => Promise; + handle: ( + message: string, + metrics: Metrics, + functionsFilter?: (id: string) => boolean, + retries?: number + ) => Promise; }; export type KafkaRotor = { @@ -48,7 +54,7 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { const producer = kafka.producer({ allowAutoTopicCreation: false }); await producer.connect(); - + const metrics = createMetrics(producer); const admin = kafka.admin(); const topicOffsets = new Prometheus.Gauge({ @@ -110,6 +116,7 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { if (message.value) { await handle( message.value?.toString(), + metrics, retriedFunctionId ? id => { if (retriedFunctionId.startsWith("udf.")) { From 87bea558b0757801e440a55dc66be9ad0c3dc192 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Sat, 28 Oct 2023 14:47:11 +0400 Subject: [PATCH 0279/1353] rotor refactor sending metrics --- services/rotor/src/lib/metrics.ts | 49 ++++++++++++++++++------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/services/rotor/src/lib/metrics.ts b/services/rotor/src/lib/metrics.ts index 7b8088bba..684a7e57d 100644 --- a/services/rotor/src/lib/metrics.ts +++ b/services/rotor/src/lib/metrics.ts @@ -27,26 +27,35 @@ export function createMetrics(producer: Producer): Metrics { const buffer: MetricsEvent[] = []; const flush = async (buf: MetricsEvent[]) => { - await Promise.all([ - producer.send({ - topic: `in.id.metrics.m.batch.t.metrics`, - messages: buf.map(m => ({ - value: JSON.stringify(m), - })), - }), - producer.send({ - topic: `in.id.metrics.m.batch.t.active_incoming`, - messages: buf - .filter(m => m.functionId.startsWith("builtin.destination.") && m.status !== "dropped") - .map(m => ({ - value: JSON.stringify({ - timestamp: m.timestamp, - workspaceId: m.workspaceId, - messageId: m.messageId, - }), - })), - }), - ]); + //split buf by 1000 events + const chunks: MetricsEvent[][] = []; + while (buf.length > 0) { + chunks.push(buf.splice(0, 1000)); + } + await Promise.all( + chunks.flatMap(chunk => { + return [ + producer.send({ + topic: `in.id.metrics.m.batch.t.metrics`, + messages: chunk.map(m => ({ + value: JSON.stringify(m), + })), + }), + producer.send({ + topic: `in.id.metrics.m.batch.t.active_incoming`, + messages: chunk + .filter(m => m.functionId.startsWith("builtin.destination.") && m.status !== "dropped") + .map(m => ({ + value: JSON.stringify({ + timestamp: m.timestamp, + workspaceId: m.workspaceId, + messageId: m.messageId, + }), + })), + }), + ]; + }) + ); }; setInterval(async () => { From 8342289737b4c9628b04280d3a8ba85a152f4fcc Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Sat, 28 Oct 2023 15:10:26 +0400 Subject: [PATCH 0280/1353] Revert "rotor refactor sending metrics" This reverts commit 87bea558b0757801e440a55dc66be9ad0c3dc192. --- services/rotor/src/lib/metrics.ts | 49 +++++++++++++------------------ 1 file changed, 20 insertions(+), 29 deletions(-) diff --git a/services/rotor/src/lib/metrics.ts b/services/rotor/src/lib/metrics.ts index 684a7e57d..7b8088bba 100644 --- a/services/rotor/src/lib/metrics.ts +++ b/services/rotor/src/lib/metrics.ts @@ -27,35 +27,26 @@ export function createMetrics(producer: Producer): Metrics { const buffer: MetricsEvent[] = []; const flush = async (buf: MetricsEvent[]) => { - //split buf by 1000 events - const chunks: MetricsEvent[][] = []; - while (buf.length > 0) { - chunks.push(buf.splice(0, 1000)); - } - await Promise.all( - chunks.flatMap(chunk => { - return [ - producer.send({ - topic: `in.id.metrics.m.batch.t.metrics`, - messages: chunk.map(m => ({ - value: JSON.stringify(m), - })), - }), - producer.send({ - topic: `in.id.metrics.m.batch.t.active_incoming`, - messages: chunk - .filter(m => m.functionId.startsWith("builtin.destination.") && m.status !== "dropped") - .map(m => ({ - value: JSON.stringify({ - timestamp: m.timestamp, - workspaceId: m.workspaceId, - messageId: m.messageId, - }), - })), - }), - ]; - }) - ); + await Promise.all([ + producer.send({ + topic: `in.id.metrics.m.batch.t.metrics`, + messages: buf.map(m => ({ + value: JSON.stringify(m), + })), + }), + producer.send({ + topic: `in.id.metrics.m.batch.t.active_incoming`, + messages: buf + .filter(m => m.functionId.startsWith("builtin.destination.") && m.status !== "dropped") + .map(m => ({ + value: JSON.stringify({ + timestamp: m.timestamp, + workspaceId: m.workspaceId, + messageId: m.messageId, + }), + })), + }), + ]); }; setInterval(async () => { From 79183ca71318b651fe517e486217a20033d26c14 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Sat, 28 Oct 2023 15:12:57 +0400 Subject: [PATCH 0281/1353] rotor refactor sending metrics --- services/rotor/src/lib/metrics.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/services/rotor/src/lib/metrics.ts b/services/rotor/src/lib/metrics.ts index 7b8088bba..25dda5f87 100644 --- a/services/rotor/src/lib/metrics.ts +++ b/services/rotor/src/lib/metrics.ts @@ -9,7 +9,7 @@ export const log = getServerLog("metrics"); const metricsDestinationId = process.env.METRICS_DESTINATION_ID; -const max_batch_size = 10000; +const max_batch_size = 1000; const flush_interval_ms = 60000; type MetricsEvent = MetricsMeta & { @@ -106,7 +106,8 @@ export function createMetrics(producer: Producer): Metrics { } if (buffer.length >= max_batch_size) { log.atInfo().log(`Flushing ${buffer.length} metrics events`); - setImmediate(() => flush([...buffer])); + const copy = [...buffer]; + setImmediate(() => flush(copy)); buffer.length = 0; } }, From a3a260afe8a67440930d43c13f13f06c44974abe Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 31 Oct 2023 15:04:02 +0400 Subject: [PATCH 0282/1353] amplitude-destination: track sessions rotor: provide user agent object in Event context rotor: store: migrate to storage that support ttl and uses workspace namespace --- e2e/package.json | 2 +- .../core-functions/__tests__/lib/mem-store.ts | 3 + libs/core-functions/package.json | 2 + .../src/functions/amplitude-destination.ts | 35 ++++++++--- .../core-functions/src/functions/lib/index.ts | 3 +- .../core-functions/src/functions/lib/store.ts | 61 +++++++++++++++++++ .../src/functions/lib/udf-wrapper-code.ts | 3 + .../src/functions/udf_wrapper.ts | 52 ++++++++++++++-- libs/core-functions/src/index.ts | 1 + libs/core-functions/src/meta.ts | 1 + pnpm-lock.yaml | 29 ++++++--- services/rotor/package.json | 3 +- services/rotor/src/index.ts | 28 ++++----- types/protocols/functions.d.ts | 31 +++++++++- .../FunctionsDebugger/FunctionsDebugger.tsx | 1 + webapps/console/lib/server/fast-store.ts | 2 +- webapps/console/lib/server/redis.ts | 2 +- webapps/console/package.json | 2 +- .../pages/api/[workspaceId]/function/run.ts | 1 + 19 files changed, 220 insertions(+), 42 deletions(-) create mode 100644 libs/core-functions/src/functions/lib/store.ts diff --git a/e2e/package.json b/e2e/package.json index 58c6d66cf..ce6ca277a 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -16,7 +16,7 @@ "@jitsu-internal/console": "workspace:*", "@types/jest": "^29.1.1", "find-free-port": "^2.0.0", - "ioredis": "^5.2.3", + "ioredis": "^5.3.2", "jest": "^29.3.1", "json5": "^2.1.0", "juava": "workspace:*", diff --git a/libs/core-functions/__tests__/lib/mem-store.ts b/libs/core-functions/__tests__/lib/mem-store.ts index 7cf3d2bf0..788065fa9 100644 --- a/libs/core-functions/__tests__/lib/mem-store.ts +++ b/libs/core-functions/__tests__/lib/mem-store.ts @@ -12,6 +12,9 @@ export function createStore(): Store { set(key: string, value: any, opts?: SetOpts): Promise { throw new Error("Method not implemented."); }, + ttl(key: string): Promise { + throw new Error("Method not implemented."); + }, }; } diff --git a/libs/core-functions/package.json b/libs/core-functions/package.json index f6fd8e531..e14c00531 100644 --- a/libs/core-functions/package.json +++ b/libs/core-functions/package.json @@ -33,11 +33,13 @@ "express": "^4.18.2" }, "dependencies": { + "@amplitude/ua-parser-js": "^0.7.33", "dayjs": "^1.11.10", "isolated-vm": "^4.6.0", "juava": "workspace:*", "lodash": "^4.17.21", "mongodb": "^5.9.0", + "ioredis": "^5.3.2", "posthog-node": "^2.4.0", "tslib": "^2.4.0", "zod": "3.21.4", diff --git a/libs/core-functions/src/functions/amplitude-destination.ts b/libs/core-functions/src/functions/amplitude-destination.ts index 44307e709..b130dce0f 100644 --- a/libs/core-functions/src/functions/amplitude-destination.ts +++ b/libs/core-functions/src/functions/amplitude-destination.ts @@ -2,19 +2,37 @@ import { JitsuFunction } from "@jitsu/protocols/functions"; import { RetryError } from "@jitsu/functions-lib"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import { randomUUID } from "crypto"; -import { parseUserAgent } from "./lib/browser"; import { AmplitudeDestinationConfig } from "../meta"; import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; +import { requireDefined } from "juava"; +import { SystemContext } from "./lib"; dayjs.extend(utc); const AmplitudeDestination: JitsuFunction = async ( event, - { props, fetch, log, geo, destination } + { props, fetch, log, geo, ua, ...ctx } ) => { try { - const groupType = props.groupType || "group"; const deviceId = event.anonymousId; + let sessionId: string | undefined = undefined; + if (deviceId) { + const systemContext = requireDefined((ctx as any as SystemContext).$system, `$system context is not available`); + const ttlStore = systemContext.store; + const sessionKey = `${ctx.source.id}_${deviceId}_sess`; + const newSession = new Date().getTime(); + const savedSession = await ttlStore.get(sessionKey); + if (savedSession) { + log.debug( + `Amplitude session found: ${savedSession} for deviceId: ${deviceId} ttl: ${await ttlStore.ttl(sessionKey)}` + ); + } else { + log.debug(`Amplitude session not found for deviceId: ${deviceId} new session: ${newSession}`); + } + sessionId = savedSession || newSession; + await ttlStore.set(sessionKey, sessionId, { ttl: 60 * props.sessionWindow }); + } + const groupType = props.groupType || "group"; const endpoint = props.dataResidency === "EU" ? "https://api.eu.amplitude.com/2/httpapi" : "https://api2.amplitude.com/2/httpapi"; let payload: any = undefined; @@ -70,9 +88,6 @@ const AmplitudeDestination: JitsuFunction ({ + get: async (key: string) => { + const res = await redisClient.hget(`store:${namespace}`, key); + return res ? JSON.parse(res) : undefined; + }, + set: async (key: string, obj: any) => { + await redisClient.hset(`store:${namespace}`, key, JSON.stringify(obj)); + }, + del: async (key: string) => { + await redisClient.hdel(`store:${namespace}`, key); + }, + ttl: async (key: string) => { + return await redisClient.ttl(`store:${namespace}`); + }, +}); + +export const createTtlStore = (namespace: string, redisClient: Redis, defaultTtlSec: number): Store => ({ + get: async (key: string) => { + const res = await redisClient.get(`store:${namespace}:${key}`); + return res ? JSON.parse(res) : undefined; + }, + set: async (key: string, obj: any, opts?: SetOpts) => { + const ttl = Math.min(opts?.ttl ?? defaultTtlSec, maxAllowedTTL); + await redisClient.set(`store:${namespace}:${key}`, JSON.stringify(obj), "EX", ttl); + }, + del: async (key: string) => { + await redisClient.del(`store:${namespace}:${key}`); + }, + ttl: async (key: string) => { + return await redisClient.ttl(`store:${namespace}:${key}`); + }, +}); + +export const createMultiStore = (ttlStore: Store, oldStore: Store): Store => { + return { + get: async (key: string) => { + const res = await ttlStore.get(key); + if (res) { + return res; + } + return await oldStore.get(key); + }, + set: async (key: string, obj: any, opts?: SetOpts) => { + await ttlStore.set(key, obj, opts); + }, + del: async (key: string) => { + await ttlStore.del(key); + await oldStore.del(key); + }, + ttl: async (key: string) => { + return await ttlStore.ttl(key); + }, + }; +}; diff --git a/libs/core-functions/src/functions/lib/udf-wrapper-code.ts b/libs/core-functions/src/functions/lib/udf-wrapper-code.ts index ef1d64be1..dba71500a 100644 --- a/libs/core-functions/src/functions/lib/udf-wrapper-code.ts +++ b/libs/core-functions/src/functions/lib/udf-wrapper-code.ts @@ -30,6 +30,9 @@ const wrappedUserFunction = async function (eventcopy, ctxcopy) { const res = await c.store.get.apply(undefined, [key], { arguments: { copy: true }, result: { promise: true } }); return res ? JSON.parse(res) : undefined; }, + ttl: async key => { + return await c.store.ttl.apply(undefined, [key], { arguments: { copy: true }, result: { promise: true } }); + }, }, fetch: async (url, opts) => { const res = await c.fetch.apply(undefined, [url, opts], { arguments: { copy: true }, result: { promise: true } }); diff --git a/libs/core-functions/src/functions/udf_wrapper.ts b/libs/core-functions/src/functions/udf_wrapper.ts index df074f704..c54753a13 100644 --- a/libs/core-functions/src/functions/udf_wrapper.ts +++ b/libs/core-functions/src/functions/udf_wrapper.ts @@ -1,10 +1,20 @@ import { getLog } from "juava"; import { Isolate, ExternalCopy, Callback, Reference } from "isolated-vm"; -import { EventContext, EventsStore, FetchOpts, FuncReturn, JitsuFunction, Store } from "@jitsu/protocols/functions"; +import { + EventContext, + EventsStore, + FetchOpts, + FuncReturn, + JitsuFunction, + Store, + UserAgent, +} from "@jitsu/protocols/functions"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import { createFullContext } from "../context"; -import { isDropResult } from "../index"; +import { defaultTTL, isDropResult, maxAllowedTTL } from "../index"; import { functionsLibCode, wrapperCode } from "./lib/udf-wrapper-code"; +import uaParser from "@amplitude/ua-parser-js"; +import omit from "lodash/omit"; const log = getLog("udf-wrapper"); @@ -118,6 +128,9 @@ export const UDFWrapper = (functionId, name, functionCode: string): UDFWrapperRe }), set: new Callback(ctx.store.set, { ignored: true }), del: new Callback(ctx.store.del, { ignored: true }), + ttl: new Reference(async (key: string) => { + return await ctx.store.ttl(key); + }), }, }), ], @@ -171,6 +184,7 @@ export type UDFTestRequest = { config: any; store: any; workspaceId: string; + userAgent?: string; }; export type UDFTestResponse = { @@ -194,6 +208,7 @@ export async function UDFTestRun({ store, event, config, + userAgent, }: UDFTestRequest): Promise { const logs: logType[] = []; let wrapper: UDFWrapperResult | undefined = undefined; @@ -218,6 +233,13 @@ export async function UDFTestRun({ code: "11238", }, }, + ua: omit( + uaParser( + userAgent || + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" + ), + "ua" + ) as UserAgent, headers: {}, source: { id: "functionsDebugger-streamId", @@ -235,14 +257,34 @@ export async function UDFTestRun({ const storeImpl: Store = { get: async (key: string) => { - return store[key]; + const val = store[key]; + if (val && val.expireAt < new Date().getTime()) { + delete store[key]; + return undefined; + } + return val?.obj; }, - set: async (key: string, obj: any) => { - store[key] = obj; + set: async (key: string, obj: any, opts) => { + store[key] = { + obj, + expireAt: new Date().getTime() + Math.min(opts?.ttl ?? defaultTTL, maxAllowedTTL) * 1000, + }; }, del: async (key: string) => { delete store[key]; }, + ttl: async (key: string) => { + const val = store[key]; + if (!val) { + return -2; + } + const diff = (val.expireAt - new Date().getTime()) / 1000; + if (diff < 0) { + delete store[key]; + return -2; + } + return diff; + }, }; const eventsStore: EventsStore = { log(connectionId: string, error: boolean, msg: Record) { diff --git a/libs/core-functions/src/index.ts b/libs/core-functions/src/index.ts index 9d5c38d93..ff82a55aa 100644 --- a/libs/core-functions/src/index.ts +++ b/libs/core-functions/src/index.ts @@ -59,3 +59,4 @@ export * as posthogDestination from "./functions/posthog-destination"; export * as mongodbDestination from "./functions/mongodb-destination"; export { mongodb, mongoAnonymousEventsStore } from "./functions/lib/mongodb"; export type { SystemContext, MetricsMeta } from "./functions/lib/index"; +export * from "./functions/lib/store"; diff --git a/libs/core-functions/src/meta.ts b/libs/core-functions/src/meta.ts index 1182653b4..3abdbc459 100644 --- a/libs/core-functions/src/meta.ts +++ b/libs/core-functions/src/meta.ts @@ -142,6 +142,7 @@ export const AmplitudeDestinationConfig = z.object({ .default(false) .describe("If enabled, anonymous users will be tracked in Amplitude"), dataResidency: z.enum(["US", "EU"]).optional().default("US"), + sessionWindow: z.number().optional().default(30).describe("Session window in minutes"), }); export type AmplitudeDestinationConfig = z.infer; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2d739b3bc..3f4dce5eb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -186,8 +186,8 @@ importers: specifier: ^2.0.0 version: 2.0.0 ioredis: - specifier: ^5.2.3 - version: 5.3.1 + specifier: ^5.3.2 + version: 5.3.2 jest: specifier: ^29.3.1 version: 29.5.0(@types/node@18.15.11)(ts-node@10.8.2) @@ -255,12 +255,18 @@ importers: libs/core-functions: dependencies: + '@amplitude/ua-parser-js': + specifier: ^0.7.33 + version: 0.7.33 agentkeepalive: specifier: 4.3.0 version: 4.3.0 dayjs: specifier: ^1.11.10 version: 1.11.10 + ioredis: + specifier: ^5.3.2 + version: 5.3.2 isolated-vm: specifier: ^4.6.0 version: 4.6.0 @@ -488,6 +494,9 @@ importers: services/rotor: dependencies: + '@amplitude/ua-parser-js': + specifier: ^0.7.33 + version: 0.7.33 '@jitsu-internal/console': specifier: workspace:* version: link:../../webapps/console @@ -507,8 +516,8 @@ importers: specifier: ^8.0.3 version: 8.1.0 ioredis: - specifier: ^5.2.3 - version: 5.3.1 + specifier: ^5.3.2 + version: 5.3.2 json-grab: specifier: 0.1.0-alpha.2 version: 0.1.0-alpha.2 @@ -747,8 +756,8 @@ importers: specifier: ^11.6.0 version: 11.7.0 ioredis: - specifier: ^5.2.3 - version: 5.3.1 + specifier: ^5.3.2 + version: 5.3.2 js-yaml: specifier: ^4.1.0 version: 4.1.0 @@ -1037,6 +1046,10 @@ packages: resolution: {integrity: sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==} dev: true + /@amplitude/ua-parser-js@0.7.33: + resolution: {integrity: sha512-wKEtVR4vXuPT9cVEIJkYWnlF++Gx3BdLatPBM+SZ1ztVIvnhdGBZR/mn9x/PzyrMcRlZmyi6L56I2J3doVBnjA==} + dev: false + /@ampproject/remapping@2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} @@ -15132,8 +15145,8 @@ packages: resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} engines: {node: '>=10.13.0'} - /ioredis@5.3.1: - resolution: {integrity: sha512-C+IBcMysM6v52pTLItYMeV4Hz7uriGtoJdz7SSBDX6u+zwSYGirLdQh3L7t/OItWITcw3gTFMjJReYUwS4zihg==} + /ioredis@5.3.2: + resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} engines: {node: '>=12.22.0'} dependencies: '@ioredis/commands': 1.2.0 diff --git a/services/rotor/package.json b/services/rotor/package.json index 9529fe8be..9a734f06a 100644 --- a/services/rotor/package.json +++ b/services/rotor/package.json @@ -20,6 +20,7 @@ "object-hash": "^3.0.0", "prom-client": "^14.2.0", "node-cache": "^5.1.2", + "@amplitude/ua-parser-js": "^0.7.33", "@jitsu-internal/console": "workspace:*", "@jitsu/core-functions": "workspace:*", "@jitsu/functions-lib": "workspace:*", @@ -27,7 +28,7 @@ "express": "^4.18.2", "glob": "^8.0.3", "dayjs": "^1.11.10", - "ioredis": "^5.2.3", + "ioredis": "^5.3.2", "json-grab": "0.1.0-alpha.2", "json5": "^2.1.0", "minimist": "^1.2.7", diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index 3d636b38a..b826ba98d 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -22,8 +22,12 @@ import { mongoAnonymousEventsStore, SystemContext, UDFWrapper, + createMultiStore, + createTtlStore, + createOldStore, + defaultTTL, } from "@jitsu/core-functions"; -import { AnyEvent, EventContext, FullContext, JitsuFunction, Store } from "@jitsu/protocols/functions"; +import { AnyEvent, EventContext, FullContext, JitsuFunction, UserAgent } from "@jitsu/protocols/functions"; import { redis } from "@jitsu-internal/console/lib/server/redis"; import express from "express"; import NodeCache from "node-cache"; @@ -33,7 +37,8 @@ import Prometheus from "prom-client"; import { Metrics } from "./lib/metrics"; import { redisLogger } from "./lib/redis-logger"; import pick from "lodash/pick"; - +import omit from "lodash/omit"; +import uaParser from "@amplitude/ua-parser-js"; disableService("prisma"); disableService("pg"); @@ -95,6 +100,7 @@ export async function rotorMessageHandler( const ctx: EventContext = { headers: message.httpHeaders, geo: message.geo, + ua: omit(uaParser(event.context?.userAgent), "ua") as UserAgent, retries, source: { id: connection.streamId, @@ -112,19 +118,10 @@ export async function rotorMessageHandler( options: connection.options, }, }; - const redisClient = redis(); - const store: Store = { - get: async (key: string) => { - const res = await redisClient.hget(`store:${connection.id}`, key); - return res ? JSON.parse(res) : undefined; - }, - set: async (key: string, obj: any) => { - await redisClient.hset(`store:${connection.id}`, key, JSON.stringify(obj)); - }, - del: async (key: string) => { - await redisClient.hdel(`store:${connection.id}`, key); - }, - }; + const oldStore = createOldStore(connection.id, redis()); + const ttlStore = createTtlStore(connection.workspaceId, redis(), defaultTTL); + const store = createMultiStore(ttlStore, oldStore); + const rl = await redisLogger.waitInit(); const connectionData = connection.options as any; @@ -169,6 +166,7 @@ export async function rotorMessageHandler( $system: { anonymousEventsStore: mongoAnonymousEventsStore(), metricsMeta, + store: ttlStore, }, }; const udfFuncChain: FuncChain = await Promise.all( diff --git a/types/protocols/functions.d.ts b/types/protocols/functions.d.ts index 469665407..ddeb2a6ff 100644 --- a/types/protocols/functions.d.ts +++ b/types/protocols/functions.d.ts @@ -1,6 +1,6 @@ import { AnalyticsServerEvent } from "./analytics"; -export type SetOpts = { ttlMs?: number } | { ttlSec?: number }; +export type SetOpts = { ttl: number }; /** * A key value store that exposed to a function @@ -9,6 +9,7 @@ export interface Store { get(key: string): Promise; del(key: string): Promise; set(key: string, value: any, opts?: SetOpts): Promise; + ttl(key: string): Promise; } /** @@ -145,11 +146,39 @@ export type Geo = { }; }; +export type UserAgent = { + browser: { + name: string; + version: string; + major: string; //@deprecated + }; + engine: { + name: string; + version: string; + }; + os: { + name: string; + version: string; + }; + device: { + model: string; + type: "console" | "mobile" | "tablet" | "smarttv" | "wearable" | "embedded"; + vendor: string; + }; + cpu: { + architecture: string; + }; +}; + export type EventContext = { /** * Geo data of incoming request */ geo?: Geo; + /** + * Parsed User Agent of incoming request + */ + ua?: UserAgent; /** * Headers of incoming request */ diff --git a/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx b/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx index 1b7ddaa52..4bcad6b9b 100644 --- a/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx +++ b/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx @@ -163,6 +163,7 @@ export const FunctionsDebugger: React.FC = props => { config: JSON.parse(config), store, workspaceId: workspace.id, + userAgent: navigator.userAgent, }; } catch (e) { feedbackError("Invalid JSON", { error: e }); diff --git a/webapps/console/lib/server/fast-store.ts b/webapps/console/lib/server/fast-store.ts index 43d3b8dd7..c807a08a6 100644 --- a/webapps/console/lib/server/fast-store.ts +++ b/webapps/console/lib/server/fast-store.ts @@ -1,4 +1,4 @@ -import Redis from "ioredis"; +import { Redis } from "ioredis"; import { StreamConfig } from "../schema"; import { DatabaseConnection, db, Handler } from "./db"; import omit from "lodash/omit"; diff --git a/webapps/console/lib/server/redis.ts b/webapps/console/lib/server/redis.ts index 85fd19c66..7d601a1cb 100644 --- a/webapps/console/lib/server/redis.ts +++ b/webapps/console/lib/server/redis.ts @@ -1,5 +1,5 @@ import { getSingleton } from "juava"; -import Redis from "ioredis"; +import { Redis } from "ioredis"; import { requireDefined } from "juava"; import { getServerLog } from "./log"; diff --git a/webapps/console/package.json b/webapps/console/package.json index 9a68f24f1..44671219f 100644 --- a/webapps/console/package.json +++ b/webapps/console/package.json @@ -54,7 +54,7 @@ "firebase-admin": "^11.11.0", "googleapis": "^126.0.1", "highlight.js": "^11.6.0", - "ioredis": "^5.2.3", + "ioredis": "^5.3.2", "js-yaml": "^4.1.0", "json5": "^2.2.3", "jsonwebtoken": "^9.0.2", diff --git a/webapps/console/pages/api/[workspaceId]/function/run.ts b/webapps/console/pages/api/[workspaceId]/function/run.ts index 169db53da..67696b0c3 100644 --- a/webapps/console/pages/api/[workspaceId]/function/run.ts +++ b/webapps/console/pages/api/[workspaceId]/function/run.ts @@ -40,6 +40,7 @@ export const api: Api = { config: z.any(), store: z.any(), workspaceId: z.string(), + userAgent: z.string().optional(), }), result: resultType, }, From d3e3687fbb562160453fe68e07c79d71058328cd Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 31 Oct 2023 15:38:16 +0400 Subject: [PATCH 0283/1353] fix --- libs/core-functions/src/functions/amplitude-destination.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/core-functions/src/functions/amplitude-destination.ts b/libs/core-functions/src/functions/amplitude-destination.ts index b130dce0f..c3bb0a04a 100644 --- a/libs/core-functions/src/functions/amplitude-destination.ts +++ b/libs/core-functions/src/functions/amplitude-destination.ts @@ -30,7 +30,7 @@ const AmplitudeDestination: JitsuFunction Date: Tue, 31 Oct 2023 17:56:36 +0400 Subject: [PATCH 0284/1353] rotor: store: support setting ttl in human-readable format --- libs/core-functions/package.json | 1 + .../core-functions/src/functions/lib/store.ts | 49 ++++++++++++++++++- .../src/functions/udf_wrapper.ts | 34 +------------ pnpm-lock.yaml | 7 +++ types/protocols/functions.d.ts | 5 +- 5 files changed, 62 insertions(+), 34 deletions(-) diff --git a/libs/core-functions/package.json b/libs/core-functions/package.json index e14c00531..bebad7dc8 100644 --- a/libs/core-functions/package.json +++ b/libs/core-functions/package.json @@ -33,6 +33,7 @@ "express": "^4.18.2" }, "dependencies": { + "parse-duration": "^1.1.0", "@amplitude/ua-parser-js": "^0.7.33", "dayjs": "^1.11.10", "isolated-vm": "^4.6.0", diff --git a/libs/core-functions/src/functions/lib/store.ts b/libs/core-functions/src/functions/lib/store.ts index 35265391b..a1c3342cf 100644 --- a/libs/core-functions/src/functions/lib/store.ts +++ b/libs/core-functions/src/functions/lib/store.ts @@ -1,9 +1,24 @@ import { SetOpts, Store } from "@jitsu/protocols/functions"; import type { Redis } from "ioredis"; +import parse from "parse-duration"; export const defaultTTL = 60 * 60 * 24 * 31; // 31 days export const maxAllowedTTL = 60 * 60 * 24 * 93; // 93 days +function getTtlSec(opts?: SetOpts): number { + let seconds = defaultTTL; + if (typeof opts === "number") { + seconds = Math.ceil(opts); + } else if (typeof opts === "string") { + try { + seconds = Math.ceil(parse(opts, "s") || defaultTTL); + } catch (e) {} + } else if (typeof opts === "object" && typeof opts.ttl === "number") { + seconds = Math.ceil(opts.ttl); + } + return Math.min(seconds, maxAllowedTTL); +} + // TODO: deprecate. we cannot control ttl for hash keys. So this store will consume memory indefinitely export const createOldStore = (namespace: string, redisClient: Redis): Store => ({ get: async (key: string) => { @@ -27,7 +42,7 @@ export const createTtlStore = (namespace: string, redisClient: Redis, defaultTtl return res ? JSON.parse(res) : undefined; }, set: async (key: string, obj: any, opts?: SetOpts) => { - const ttl = Math.min(opts?.ttl ?? defaultTtlSec, maxAllowedTTL); + const ttl = getTtlSec(opts); await redisClient.set(`store:${namespace}:${key}`, JSON.stringify(obj), "EX", ttl); }, del: async (key: string) => { @@ -59,3 +74,35 @@ export const createMultiStore = (ttlStore: Store, oldStore: Store): Store => { }, }; }; + +export const createMemoryStore = (store: any): Store => ({ + get: async (key: string) => { + const val = store[key]; + if (val && val.expireAt < new Date().getTime()) { + delete store[key]; + return undefined; + } + return val?.obj; + }, + set: async (key: string, obj: any, opts) => { + store[key] = { + obj, + expireAt: new Date().getTime() + getTtlSec(opts) * 1000, + }; + }, + del: async (key: string) => { + delete store[key]; + }, + ttl: async (key: string) => { + const val = store[key]; + if (!val) { + return -2; + } + const diff = (val.expireAt - new Date().getTime()) / 1000; + if (diff < 0) { + delete store[key]; + return -2; + } + return Math.floor(diff); + }, +}); diff --git a/libs/core-functions/src/functions/udf_wrapper.ts b/libs/core-functions/src/functions/udf_wrapper.ts index c54753a13..eb2c99bd2 100644 --- a/libs/core-functions/src/functions/udf_wrapper.ts +++ b/libs/core-functions/src/functions/udf_wrapper.ts @@ -11,7 +11,7 @@ import { } from "@jitsu/protocols/functions"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import { createFullContext } from "../context"; -import { defaultTTL, isDropResult, maxAllowedTTL } from "../index"; +import { createMemoryStore, isDropResult } from "../index"; import { functionsLibCode, wrapperCode } from "./lib/udf-wrapper-code"; import uaParser from "@amplitude/ua-parser-js"; import omit from "lodash/omit"; @@ -255,37 +255,7 @@ export async function UDFTestRun({ }, }; - const storeImpl: Store = { - get: async (key: string) => { - const val = store[key]; - if (val && val.expireAt < new Date().getTime()) { - delete store[key]; - return undefined; - } - return val?.obj; - }, - set: async (key: string, obj: any, opts) => { - store[key] = { - obj, - expireAt: new Date().getTime() + Math.min(opts?.ttl ?? defaultTTL, maxAllowedTTL) * 1000, - }; - }, - del: async (key: string) => { - delete store[key]; - }, - ttl: async (key: string) => { - const val = store[key]; - if (!val) { - return -2; - } - const diff = (val.expireAt - new Date().getTime()) / 1000; - if (diff < 0) { - delete store[key]; - return -2; - } - return diff; - }, - }; + const storeImpl: Store = createMemoryStore(store); const eventsStore: EventsStore = { log(connectionId: string, error: boolean, msg: Record) { switch (msg.type) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3f4dce5eb..663aedc77 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -279,6 +279,9 @@ importers: mongodb: specifier: ^5.9.0 version: 5.9.0 + parse-duration: + specifier: ^1.1.0 + version: 1.1.0 posthog-node: specifier: ^2.4.0 version: 2.6.0 @@ -19767,6 +19770,10 @@ packages: just-diff: 5.2.0 just-diff-apply: 5.5.0 + /parse-duration@1.1.0: + resolution: {integrity: sha512-z6t9dvSJYaPoQq7quMzdEagSFtpGu+utzHqqxmpVWNNZRIXnvqyCvn9XsTdh7c/w0Bqmdz3RB3YnRaKtpRtEXQ==} + dev: false + /parse-json@4.0.0: resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} engines: {node: '>=4'} diff --git a/types/protocols/functions.d.ts b/types/protocols/functions.d.ts index ddeb2a6ff..9e28c42c9 100644 --- a/types/protocols/functions.d.ts +++ b/types/protocols/functions.d.ts @@ -1,6 +1,9 @@ import { AnalyticsServerEvent } from "./analytics"; -export type SetOpts = { ttl: number }; +/** + * Store set options: ttl in seconds or string representation of duration (e.g. "1d") + */ +export type SetOpts = number | string | { ttl: number }; /** * A key value store that exposed to a function From d34504a93f113ac1cf131539987332d5fba0239a Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Wed, 1 Nov 2023 16:52:50 +0200 Subject: [PATCH 0285/1353] feat: support of custom pricing plans --- libs/juava/src/rpc.ts | 29 ++- .../components/Billing/BillingManager.tsx | 42 +++- .../components/GlobalError/GlobalError.tsx | 1 + webapps/console/lib/schema/index.ts | 2 + .../api/[workspaceId]/ee/[...proxyPath].ts | 41 +++- webapps/console/pages/custom-plan.tsx | 209 ++++++++++++++++++ webapps/ee-api/lib/stripe.ts | 33 ++- .../ee-api/pages/api/billing/custom-plan.ts | 38 ++++ webapps/ee-api/pages/api/billing/upgrade.ts | 17 +- 9 files changed, 375 insertions(+), 37 deletions(-) create mode 100644 webapps/console/pages/custom-plan.tsx create mode 100644 webapps/ee-api/pages/api/billing/custom-plan.ts diff --git a/libs/juava/src/rpc.ts b/libs/juava/src/rpc.ts index bbd3fd71d..380d0a173 100644 --- a/libs/juava/src/rpc.ts +++ b/libs/juava/src/rpc.ts @@ -38,7 +38,7 @@ export class ApiResponseError extends Error { public request: object; constructor(message: string, response: object, request: object) { - super(message + ": " + JSON.stringify(response)); + super(message); this.response = response; this.request = request; } @@ -58,6 +58,10 @@ export interface RpcFunc, Payload = an useFetch(fetchImpl: FetchType); } +function extractString(obj: any): string | undefined { + return typeof obj === "string" ? obj : undefined; +} + export const rpc: RpcFunc = async (url, { body, ...rest } = {}) => { const urlWithQuery = notEmpty(rest?.query) ? urlWithQueryString(url, rest?.query || {}) : url; @@ -86,15 +90,20 @@ export const rpc: RpcFunc = async (url, { body, ...rest } = {}) => { if (!result.ok) { let errorText = await getErrorText(result); const errorJson = tryJson(errorText); - const message = `Error ${result.status} on ${method} ${url}`; - console.error(message, errorJson); - throw typeof errorJson === "string" - ? new Error(`${message}: ${errorJson}`) - : new ApiResponseError(message, errorJson, { - url: urlWithQuery, - ...requestParams, - body: body || undefined, - }); + const defaultErrorMessage = `Error ${result.status} on ${method} ${url}`; + console.error(defaultErrorMessage, errorJson); + //Try to extract meaningful error message from response. We don't need to include a full message since it will be visible + //in the logs. On the other hand, error message could be displayed in UI + const errorMessage = + extractString(errorJson.message) || + extractString(errorJson.error) || + extractString(errorJson.error?.error) || + "Server error"; + throw new ApiResponseError(errorMessage, typeof errorJson === "string" ? undefined : errorJson, { + url: urlWithQuery, + ...requestParams, + body: body || undefined, + }); } if ((result.headers.get("Content-Type") ?? "").startsWith("application/json")) { return await parseJsonResponse(result, method, url); diff --git a/webapps/console/components/Billing/BillingManager.tsx b/webapps/console/components/Billing/BillingManager.tsx index cdbed8da0..556b66fcc 100644 --- a/webapps/console/components/Billing/BillingManager.tsx +++ b/webapps/console/components/Billing/BillingManager.tsx @@ -258,7 +258,9 @@ const AvailablePlans: React.FC<{}> = () => { plans: { free: { ...BillingSettings.parse({}), monthlyPrice: 0, annualPrice: 0 }, ...plans.products - .filter(p => !p.data.disabled) + //the end-point shouldn't return custom plans anyway, + //but let's double-check that the plan is not custom + .filter(p => !p.data.disabled && !p.data.custom) .reduce( (acc, p) => ({ ...acc, @@ -382,17 +384,39 @@ const AvailablePlans: React.FC<{}> = () => { const BillingManager0: React.FC<{}> = () => { const appConfig = useAppConfig(); + const billing = useBilling(); + const workspace = useWorkspace(); + return (
    -

    Available Plans

    - -

    - Need more information? Learn more about each plan by checking out our{" "} - - pricing page - -

    + {billing.settings?.custom ? ( +
    + You're using a custom plan. To downgrade to standard plan or cancel your supbscription, please reach out to + our{" "} + + Support Team + + . You can also cancel your subscription{" "} + + here + +
    + ) : ( + <> +

    Available Plans

    + +

    + Need more information? Learn more about each plan by checking out our{" "} + + pricing page + +

    + + )}
    ); }; diff --git a/webapps/console/components/GlobalError/GlobalError.tsx b/webapps/console/components/GlobalError/GlobalError.tsx index 8b6a6f0bc..9befa4f4f 100644 --- a/webapps/console/components/GlobalError/GlobalError.tsx +++ b/webapps/console/components/GlobalError/GlobalError.tsx @@ -139,6 +139,7 @@ export function ErrorCard(props: { error?: any; title?: string; hideActions?: bo
    (exp ? "Hide Details" : "Show Details")}> {(props.error?.stack || props.error?.message) && } + {typeof props.error === "string" && }
    )} diff --git a/webapps/console/lib/schema/index.ts b/webapps/console/lib/schema/index.ts index fb378aa54..15ef0f81e 100644 --- a/webapps/console/lib/schema/index.ts +++ b/webapps/console/lib/schema/index.ts @@ -23,6 +23,8 @@ export type ContextApiResponse = z.infer; //Default values are for "free" (default) plan export const BillingSettings = z.object({ planId: z.string().default("free"), + //if plan has a custom pricing prepared for a particular workspace + custom: z.boolean().default(false).optional(), pastDue: z.boolean().default(false).optional(), dailyActiveSyncs: z.number().default(1).optional(), dailyActiveSyncsOverage: z.number().default(10).optional(), diff --git a/webapps/console/pages/api/[workspaceId]/ee/[...proxyPath].ts b/webapps/console/pages/api/[workspaceId]/ee/[...proxyPath].ts index 8924462cd..6e294c3e3 100644 --- a/webapps/console/pages/api/[workspaceId]/ee/[...proxyPath].ts +++ b/webapps/console/pages/api/[workspaceId]/ee/[...proxyPath].ts @@ -2,11 +2,29 @@ import { NextApiRequest, NextApiResponse } from "next"; import { getUser, verifyAccess, verifyAdmin } from "../../../../lib/api"; import { createJwt, getEeConnection } from "../../../../lib/server/ee"; import { isEEAvailable } from "../../ee/jwt"; +import { getLog } from "juava"; function removeDoubleSlashes(path: string) { return path.replace(/\/\//g, "/"); } +//If string is a JSON, parse it, so it looks better in JSON response. Needed for +//errors display only +function toJSON(str: string): any { + try { + return JSON.parse(str); + } catch (e) { + return str; + } +} + +function removeTrailingSlashes(url: string) { + while (url.endsWith("/")) { + url = url.slice(0, -1); + } + return url; +} + const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { const user = await getUser(res, req); if (!isEEAvailable()) { @@ -19,27 +37,32 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse } const workspaceId = req.query.workspaceId as string; const proxyPath = req.query.proxyPath as string[]; - if (workspaceId === "$all") { + if (workspaceId === "$none") { + //do nothing, $none means that the downstream end-point is public + } else if (workspaceId === "$all") { //only admins can access to all workspaces await verifyAdmin(user); } else { await verifyAccess(user, workspaceId); } - const { jwt } = createJwt(user.internalId, user.email, workspaceId, 60); + const { jwt } = + workspaceId !== "$none" ? createJwt(user.internalId, user.email, workspaceId, 60) : { jwt: undefined }; const query = { ...(req.query || {}), - workspaceId: workspaceId === "$all" ? undefined : workspaceId, + workspaceId: workspaceId === "$all" || workspaceId === "$none" ? undefined : workspaceId, }; const queryString = Object.entries(query) .filter(([, val]) => val !== undefined) .map(([key, val]) => `${key}=${encodeURIComponent(val + "")}`) .join("&"); - const url = removeDoubleSlashes(`${getEeConnection().host}/api/${proxyPath.join("/")}?${queryString}`); + //if slash symbols are messed up, Next.js will respond with redirect, which we do not support here + const url = + removeTrailingSlashes(getEeConnection().host) + removeDoubleSlashes(`/api/${proxyPath.join("/")}?${queryString}`); const response = await fetch(url, { method: req.method, headers: { "Content-Type": "application/json", - Authorization: `Bearer ${jwt}`, + ...(jwt ? { Authorization: `Bearer ${jwt}` } : {}), Accept: "application/json", }, redirect: "manual", @@ -47,6 +70,7 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse }); if (response.status >= 301 && response.status <= 308) { const location = response.headers.get("location") || response.headers.get("Location"); + getLog().atInfo().withCause(`${url} redirects to ${location}`); if (!location) { res.status(500).send({ url, @@ -56,7 +80,10 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse }); return; } - res.redirect(response.status, location); + res.status(400).json({ + url, + error: `Response is redirect to ${location}, but the proxy doesn't support redirects yet`, + }); return; } if (!response.ok) { @@ -64,7 +91,7 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse url, status: response.status, statusText: response.statusText, - error: await response.text(), + error: toJSON(await response.text()), }); return; } else { diff --git a/webapps/console/pages/custom-plan.tsx b/webapps/console/pages/custom-plan.tsx new file mode 100644 index 000000000..9abae0d2e --- /dev/null +++ b/webapps/console/pages/custom-plan.tsx @@ -0,0 +1,209 @@ +import { useAppConfig, useUser } from "../lib/context"; +import { ErrorCard } from "../components/GlobalError/GlobalError"; +import { Button, Select } from "antd"; +import Link from "next/link"; +import { useRouter } from "next/router"; +import { useQuery } from "@tanstack/react-query"; +import { rpc } from "juava"; +import { LoadingAnimation } from "../components/GlobalLoader/GlobalLoader"; +import { useEffect, useState } from "react"; + +function timeUntil(date: Date): { days: number; hours: number; minutes: number; seconds: number } { + const now = new Date(); + const difference = date.getTime() - now.getTime(); + + if (difference <= 0) { + return { days: 0, hours: 0, minutes: 0, seconds: 0 }; + } + + const seconds = Math.floor((difference / 1000) % 60); + const minutes = Math.floor((difference / 1000 / 60) % 60); + const hours = Math.floor((difference / 1000 / 60 / 60) % 24); + const days = Math.floor(difference / 1000 / 60 / 60 / 24); + + return { days, hours, minutes, seconds }; +} + +const Countdown: React.FC<{ deadline: Date }> = p => { + const [until, setUntil] = useState(timeUntil(p.deadline)); + useEffect(() => { + const interval = setInterval(() => setUntil(timeUntil(p.deadline)), 500); + return () => clearInterval(interval); + }, [p.deadline]); + const { days, hours, minutes, seconds } = until; + return ( +
    +
    Valid for
    +
    +
    +
    + {days} +
    +
    Days
    +
    +
    +
    + : +
    +
    XXX
    +
    +
    +
    + {hours} +
    +
    Hours
    +
    +
    +
    + : +
    +
    XXX
    +
    +
    +
    + {minutes} +
    +
    Minutes
    +
    +
    +
    + : +
    +
    XXX
    +
    +
    +
    + {seconds} +
    +
    Seconds
    +
    +
    +
    + ); +}; + +const CustomPlanView: React.FC<{ token: string }> = ({ token }) => { + const { isLoading, error, data } = useQuery( + ["customPlan", token], + async () => { + const plan = await rpc(`/api/$none/ee/billing/custom-plan?token=${token}`); + const workspaces = await rpc(`/api/workspace`); + + return { plan, workspaces }; + }, + { retry: false, cacheTime: 0 } + ); + const router = useRouter(); + const [selectedWorkspace, setSelectedWorkspace] = useState( + router.query.workspaceId as string | undefined + ); + const user = useUser(); + + if (error) { + return ( +
    + +
    + ); + } else if (isLoading) { + return ( +
    + +
    + ); + } else if (!data) { + //never can happen - throw instead of error display + throw new Error(`Data is empty`); + } + + return ( +
    +
    +
    +
    +

    + Custom Pricing Plan +

    + {data.plan.data.validUntil && ( +
    + +
    + )} +

    Select a workspace to apply a custom plan:

    +
    +
    +
    + + + + {unit} + {unit === "hours" && form.getFieldValue(name) + ? `, equal to ${parseFloat((parseInt(form.getFieldValue(name)) / 24).toFixed(2))} days` + : ``} + +
    + ); +}; + +export const FormValuesType = DataRetentionSettings.omit({ disableS3Archive: true }).and( + z.object({ + mongoEnabled: z.coerce.boolean(), + enableS3Archive: z.coerce.boolean(), + }) +); + +type FormValuesType = z.infer; + +function fromFormValues({ mongoEnabled, enableS3Archive, ...values }: FormValuesType): DataRetentionSettings { + return DataRetentionSettings.parse({ + ...values, + disableS3Archive: !enableS3Archive, + customMongoDb: mongoEnabled ? values.customMongoDb : undefined, + }); +} + +function toFormValues(obj: DataRetentionSettings): FormValuesType { + return { + ...obj, + mongoEnabled: !!obj.customMongoDb, + enableS3Archive: !obj.disableS3Archive, + }; +} + +export const DataRetentionEditor: React.FC<{ + obj: DataRetentionSettings; + readonly?: boolean; + pendingUpdate: boolean; +}> = ({ obj, readonly, pendingUpdate }) => { + const [form] = Form.useForm(); + const initialFormValues = toFormValues(obj); + const workspace = useWorkspace(); + const [pendingUpdateState, setPendingUpdateState] = useState(pendingUpdate); + const [saving, setSaving] = useState(false); + const [currentObj, setCurrentObj] = useState(initialFormValues); + return ( + <> + {readonly && ( +
    + + Your subscription doesn't allow to change data retention settigns. However, you view Jitsu default + setting to understand how your data is being stored. Contact support@jitsu.com if you have any questions + regarding data retention policy.{" "} + + } + type="info" + showIcon + /> +
    + )} + {pendingUpdateState && ( +
    + + You have requested to change retention policy earlier. Allow use a few days to apply the changes. Please + contact support if you have any questions + + } + type="info" + showIcon + /> +
    + )} + { + const merged = FormValuesType.parse(merge(currentObj, newValues)); + setCurrentObj(merged); + getLog().atDebug().log("Settings", merged); + }} + > +
    + + How many hours to keep data in queues. If destnation is down, Jitsu will try to deliver data during + timeframe configured below. After the time is passed, Jitsu will drop events + + } + > + + + + How many days to keep user events to implement{" "} + identity stitching. After the + time is passed, Jitsu will drop data. 0 will disable identity stitching. + + } + > + + + + Live Events and function logs retention policy. OR logic is applied. The events will be dropped if they + stored in the logs more than X days, or the logs size is more than N records + + } + > +
    + +
    + + +
    + + Jitsu users Mongo DB as underneath mechanism for{" "} + + functions persistent storage + {" "} + and identity stitching. You can + use your own Mongo instance to store this data. + + } + > +
    + + + {" "} + +
    +
    + + + +
    +
    + + Jitsu archives all incoming event into a dedicated S3 bucket{" "} + {workspace.id}.data.use.jitsu.com so they could be replayed later. You can disable this + behavior if you don't need it. + + } + > +
    + + + + +
    +
    +
    +
    + +
    + + + ); +}; diff --git a/webapps/console/components/GlobalError/GlobalError.tsx b/webapps/console/components/GlobalError/GlobalError.tsx index 9befa4f4f..24ded50f6 100644 --- a/webapps/console/components/GlobalError/GlobalError.tsx +++ b/webapps/console/components/GlobalError/GlobalError.tsx @@ -11,7 +11,7 @@ import { AlertCircle } from "lucide-react"; import classNames from "classnames"; export type GlobalErrorProps = { - error: any; + error?: any; title?: string; hideActions?: boolean; }; diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index 265724ae1..ac5930b1c 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -37,6 +37,7 @@ import { User, X, Zap, + PackageOpen, } from "lucide-react"; import { NextRouter, useRouter } from "next/router"; @@ -264,7 +265,7 @@ type TabsMenuItem = { type TabsMenuGroup = { title: ReactNode; icon: ReactNode; - items: TabsMenuItem[]; + items: (TabsMenuItem | undefined)[]; }; export type TopTabsMenuProps = { items: (TabsMenuItem | TabsMenuGroup)[]; @@ -301,18 +302,21 @@ export const TopTabsMenu: React.FC = props => { if (item.items) { return { label: {item.title}, - key: item.items.map(subItem => subItem.path).join("-"), + key: item.items + .filter(Boolean) + .map(subItem => subItem!.path) + .join("-"), selected: true, - children: item.items.map(subItem => ({ - key: subItem.path, + children: item.items.filter(Boolean).map(subItem => ({ + key: subItem!.path, label: ( - - - {subItem.title} + + + {subItem!.title} ), - link: subItem.path, + link: subItem!.path, })), }; } else { @@ -327,7 +331,7 @@ export const TopTabsMenu: React.FC = props => { }; } }); - const allKeys = props.items.map(x => (x.items ? x.items.map(i => i.path) : x.path)).flat(); + const allKeys = props.items.map(x => (x.items ? x.items.filter(Boolean).map(i => i!.path) : x.path)).flat(); return ( = () => { function PageHeader() { const appConfig = useAppConfig(); const workspace = useWorkspace(); + const billing = useBilling(); const items: (TabsMenuItem | TabsMenuGroup | undefined | false)[] = [ { title: "Overview", path: "/", aliases: "/overview", icon: }, { @@ -575,6 +580,13 @@ function PageHeader() { { title: "Workspace Settings", path: "/settings", icon: }, { title: "User Settings", path: "/user", icon: , globalPath: true }, { title: "Billing Settings", path: "/settings/billing", icon: }, + billing.enabled && billing.settings?.dataRetentionEditorEnabled + ? { + title: "Data Retention", + path: "/settings/data-retention", + icon: , + } + : undefined, ], }, appConfig.ee?.available && { diff --git a/webapps/console/lib/schema/index.ts b/webapps/console/lib/schema/index.ts index e241b2895..e385243d2 100644 --- a/webapps/console/lib/schema/index.ts +++ b/webapps/console/lib/schema/index.ts @@ -24,7 +24,7 @@ export type ContextApiResponse = z.infer; export const BillingSettings = z.object({ planId: z.string().default("free"), //if plan has a custom pricing prepared for a particular workspace - custom: z.boolean().default(false).optional(), + customBilling: z.boolean().default(false).optional(), pastDue: z.boolean().default(false).optional(), dailyActiveSyncs: z.number().default(1).optional(), dailyActiveSyncsOverage: z.number().default(10).optional(), @@ -32,6 +32,7 @@ export const BillingSettings = z.object({ planName: z.string().optional(), //if not set - will be taken from planId overagePricePer100k: z.number().optional(), canShowProvisionDbCredentials: z.boolean().default(false), + dataRetentionEditorEnabled: z.boolean().default(false).optional(), destinationEvensPerMonth: z.number().default(200_000), expiresAt: z.string().optional(), renewAfterExpiration: z.boolean().default(false).optional(), diff --git a/webapps/console/lib/shared/data-retention.ts b/webapps/console/lib/shared/data-retention.ts new file mode 100644 index 000000000..60bbdd1ad --- /dev/null +++ b/webapps/console/lib/shared/data-retention.ts @@ -0,0 +1,26 @@ +import { z } from "zod"; +import { Simplify } from "type-fest"; + +export const DataRetentionSettings = z.object({ + kafkaRetentionHours: z.coerce.number(), + identityStitchingRetentionDays: z.coerce.number(), + logsRetentionDays: z.object({ + maxRecords: z.coerce.number(), + maxHours: z.coerce.number(), + }), + customMongoDb: z.string().optional(), + disableS3Archive: z.coerce.boolean().default(false).optional(), + pendingUpdate: z.coerce.boolean().default(false).optional(), +}); + +// Example of type derived from Zod schema +export type DataRetentionSettings = Simplify>; + +export const defaultDataRetentionSettings: DataRetentionSettings = { + kafkaRetentionHours: 7 * 24, + identityStitchingRetentionDays: 30, + logsRetentionDays: { + maxRecords: 1000, + maxHours: 7 * 24, + }, +}; diff --git a/webapps/console/pages/404.tsx b/webapps/console/pages/404.tsx index 303b9551e..630f5f9e7 100644 --- a/webapps/console/pages/404.tsx +++ b/webapps/console/pages/404.tsx @@ -1,5 +1,22 @@ -import { GlobalError } from "../components/GlobalError/GlobalError"; +import { useRouter } from "next/router"; +import { Button } from "antd"; export default function Custom404() { - return ; + const router = useRouter(); + return ( +
    +
    +

    Error 404

    +

    The page does not exist

    +

    + URL: {window.location.pathname} +

    +
    + +
    +
    +
    + ); } diff --git a/webapps/console/pages/[workspaceId]/settings/data-retention.tsx b/webapps/console/pages/[workspaceId]/settings/data-retention.tsx new file mode 100644 index 000000000..cd4deda4f --- /dev/null +++ b/webapps/console/pages/[workspaceId]/settings/data-retention.tsx @@ -0,0 +1,15 @@ +import { DataRetentionEditorLoader } from "../../../components/DataRentionEditor/DataRentionEditor"; +import { WorkspacePageLayout } from "../../../components/PageLayout/WorkspacePageLayout"; + +const DataRetentionEditorPage = () => { + return ( + +
    +

    Data Retention

    + +
    +
    + ); +}; + +export default DataRetentionEditorPage; diff --git a/webapps/console/pages/_app.tsx b/webapps/console/pages/_app.tsx index e40e5a329..2df1ef566 100644 --- a/webapps/console/pages/_app.tsx +++ b/webapps/console/pages/_app.tsx @@ -496,7 +496,7 @@ const WorkspaceLoader: React.FC> = ({ /* eslint-enable */ if (error) { - log.atError().log(`Can't load workspace ${JSON.stringify(error)}`, error); + log.atError().log(`Can't load workspace ${JSON.stringify(error, null, 2)}`, error); return (
    diff --git a/webapps/console/pages/api/[...not-found-404].ts b/webapps/console/pages/api/[...not-found-404].ts index 51fa602fb..c539c0746 100644 --- a/webapps/console/pages/api/[...not-found-404].ts +++ b/webapps/console/pages/api/[...not-found-404].ts @@ -4,5 +4,5 @@ export default function handler(req: NextApiRequest, res: NextApiResponse) { res .status(404) .setHeader("Content-type", "application/json") - .send({ error: "Path not found: " + req.url }); + .send({ error: "API route not foud" + req.url }); } diff --git a/webapps/console/pages/api/workspace/[workspaceIdOrSlug]/[section]/index.tsx b/webapps/console/pages/api/workspace/[workspaceIdOrSlug]/[section]/index.tsx new file mode 100644 index 000000000..8d4ddfe3c --- /dev/null +++ b/webapps/console/pages/api/workspace/[workspaceIdOrSlug]/[section]/index.tsx @@ -0,0 +1,70 @@ +import { createRoute, verifyAccess } from "../../../../../lib/api"; +import { z } from "zod"; +import { db } from "../../../../../lib/server/db"; +import { requireDefined } from "juava"; +import { defaultDataRetentionSettings } from "../../../../../lib/shared/data-retention"; +import merge from "lodash/merge"; +import { sendEmail } from "../../../../../lib/server/mail"; +import { SessionUser } from "../../../../../lib/schema"; + +async function updateEmailNotification(data: any, workspace, user: SessionUser) { + if (process.env.ADMIN_EMAIL) { + await sendEmail({ + to: process.env.ADMIN_EMAIL, + subject: `Retention policy update on ${workspace.slug} has been requested`, + html: [ + `

    ${user.name} has requested retention policy update on workspace ${workspace.slug} (${workspace.id})

    `, + `

    Here's a new policy

    `, + `

    ${JSON.stringify(data, null, 2)}

    `, + ].join(``), + }); + } +} + +export default createRoute() + .GET({ auth: true, query: z.object({ section: z.string(), workspaceIdOrSlug: z.string() }) }) + .handler(async ({ query: { section, workspaceIdOrSlug }, user }) => { + const workspace = requireDefined( + await db + .prisma() + .workspace.findFirst({ where: { OR: [{ id: workspaceIdOrSlug }, { slug: workspaceIdOrSlug }] } }), + `Workspace ${workspaceIdOrSlug} not found` + ); + await verifyAccess(user, workspace.id); + return ( + (await db.prisma().workspaceOptions.findFirst({ where: { workspaceId: workspace.id, namespace: section } })) + ?.value || defaultDataRetentionSettings + ); + }) + .POST({ auth: true, query: z.object({ section: z.string(), workspaceIdOrSlug: z.string() }) }) + .handler(async ({ query: { section, workspaceIdOrSlug }, user, body }) => { + const workspace = requireDefined( + await db + .prisma() + .workspace.findFirst({ where: { OR: [{ id: workspaceIdOrSlug }, { slug: workspaceIdOrSlug }] } }), + `Workspace ${workspaceIdOrSlug} not found` + ); + await verifyAccess(user, workspace.id); + if (section == "data-retention") { + (body as any).pendingUpdate = true; + } + const existing = await db.prisma().workspaceOptions.findFirst({ + where: { workspaceId: workspace.id, namespace: section }, + }); + const newValues = merge(existing?.value || defaultDataRetentionSettings, body); + if (existing) { + await db.prisma().workspaceOptions.update({ + where: { id: existing.id }, + data: { value: newValues }, + }); + } else { + await db.prisma().workspaceOptions.create({ + data: { workspaceId: workspace.id, namespace: section, value: newValues }, + }); + } + if (section === "data-retention") { + await updateEmailNotification(newValues, workspace, user); + } + }) + + .toNextApiHandler(); diff --git a/webapps/console/prisma/schema.prisma b/webapps/console/prisma/schema.prisma index 0a858aaa3..7ed83b97e 100644 --- a/webapps/console/prisma/schema.prisma +++ b/webapps/console/prisma/schema.prisma @@ -32,7 +32,7 @@ model EmailLog { model UserPreferences { id String @id @default(cuid()) - createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) + createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) userId String user UserProfile @relation(fields: [userId], references: [id]) @@ -46,18 +46,18 @@ model UserPreferences { } model UserProfile { - id String @id @default(cuid()) - name String - email String - admin Boolean? @default(false) - createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) - updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) - loginProvider String - externalUsername String? - externalId String - tokens UserApiToken[] - workspaceAccess WorkspaceAccess[] - userPreferences UserPreferences[] + id String @id @default(cuid()) + name String + email String + admin Boolean? @default(false) + createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) + updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) + loginProvider String + externalUsername String? + externalId String + tokens UserApiToken[] + workspaceAccess WorkspaceAccess[] + userPreferences UserPreferences[] workspaceUserProperties WorkspaceUserProperties[] } @@ -70,16 +70,30 @@ model Workspace { slug String? workspaceAccess WorkspaceAccess[] + workspaceOptions WorkspaceOptions[] configurationObject ConfigurationObject[] configurationObjectLink ConfigurationObjectLink[] preferences UserPreferences[] workspaceUserProperties WorkspaceUserProperties[] - featuresEnabled String[] @default([]) + featuresEnabled String[] @default([]) @@unique(slug) @@index(updatedAt(sort: Desc)) } +//additional properties for workspace +model WorkspaceOptions { + id String @id @default(cuid()) + createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) + updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) + workspaceId String + workspace Workspace @relation(fields: [workspaceId], references: [id]) + namespace String + value Json + + @@index([workspaceId, namespace]) +} + model WorkspaceAccess { workspaceId String createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) @@ -101,7 +115,6 @@ model WorkspaceUserProperties { @@id([workspaceId, userId]) } - model UserApiToken { id String @id @default(cuid()) createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) @@ -161,13 +174,13 @@ model ConfigurationObjectLink { } model ConnectorPackage { - id String @id @default(cuid()) - packageId String - packageType String @default("airbyte") - meta Json? - logoSvg Bytes? - createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) - updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) + id String @id @default(cuid()) + packageId String + packageType String @default("airbyte") + meta Json? + logoSvg Bytes? + createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) + updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) } model AuditLog { @@ -178,86 +191,86 @@ model AuditLog { workspaceId String? objectId String? changes Json? + @@index(timestamp) @@index(type) } model GlobalProps { - id String @id @default(cuid()) - createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) - updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) - name String - value Json? - + id String @id @default(cuid()) + createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) + updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) + name String + value Json? } model source_spec { - package String - version String - specs Json? - timestamp DateTime @default(now()) @db.Timestamptz(3) /// @zod.custom(z.coerce.date()) - error String? + package String + version String + specs Json? + timestamp DateTime @default(now()) @db.Timestamptz(3) /// @zod.custom(z.coerce.date()) + error String? - @@id([package, version]) + @@id([package, version]) } model source_check { - package String - version String - key String @id - status String - description String? - timestamp DateTime @default(now()) @db.Timestamptz(3) /// @zod.custom(z.coerce.date()) + package String + version String + key String @id + status String + description String? + timestamp DateTime @default(now()) @db.Timestamptz(3) /// @zod.custom(z.coerce.date()) } model source_catalog { - package String - version String - key String - catalog Json? - timestamp DateTime @default(now()) @db.Timestamptz(3) /// @zod.custom(z.coerce.date()) - status String - description String? - - @@id([package, version, key]) + package String + version String + key String + catalog Json? + timestamp DateTime @default(now()) @db.Timestamptz(3) /// @zod.custom(z.coerce.date()) + status String + description String? + + @@id([package, version, key]) } model source_state { - sync_id String - stream String - state Json - timestamp DateTime @default(now()) @db.Timestamptz(3) /// @zod.custom(z.coerce.date()) + sync_id String + stream String + state Json + timestamp DateTime @default(now()) @db.Timestamptz(3) /// @zod.custom(z.coerce.date()) - @@id([sync_id, stream]) + @@id([sync_id, stream]) } model source_task { - sync_id String - task_id String @id - package String - version String - started_at DateTime @default(now()) @db.Timestamptz(3) /// @zod.custom(z.coerce.date()) - updated_at DateTime @default(now()) @db.Timestamptz(3) /// @zod.custom(z.coerce.date()) - started_by Json? - status String - description String? - - @@index(sync_id) - @@index(started_at) + sync_id String + task_id String @id + package String + version String + started_at DateTime @default(now()) @db.Timestamptz(3) /// @zod.custom(z.coerce.date()) + updated_at DateTime @default(now()) @db.Timestamptz(3) /// @zod.custom(z.coerce.date()) + started_by Json? + status String + description String? + + @@index(sync_id) + @@index(started_at) } model task_log { - id String @id @default(uuid()) @db.Uuid - level String - logger String - message String - sync_id String - task_id String - timestamp DateTime @default(now()) @db.Timestamptz(3) /// @zod.custom(z.coerce.date()) - - @@index(sync_id) - @@index(task_id) - @@index(timestamp) + id String @id @default(uuid()) @db.Uuid + level String + logger String + message String + sync_id String + task_id String + timestamp DateTime @default(now()) @db.Timestamptz(3) /// @zod.custom(z.coerce.date()) + + @@index(sync_id) + @@index(task_id) + @@index(timestamp) } // diff --git a/webapps/ee-api/lib/stripe.ts b/webapps/ee-api/lib/stripe.ts index 93eab41b9..844dc6fb2 100644 --- a/webapps/ee-api/lib/stripe.ts +++ b/webapps/ee-api/lib/stripe.ts @@ -1,6 +1,6 @@ import Stripe from "stripe"; import { store } from "./services"; -import { assertDefined, assertTrue, requireDefined } from "juava"; +import { assertDefined, assertTrue, getLog, requireDefined } from "juava"; import { omit } from "lodash"; export const stripe = new Stripe(process.env.STRIPE_SECRET_KEY as string, { @@ -20,21 +20,80 @@ export type SubscriptionStatus = { renewAfterExpiration?: boolean; } & Record; +export type Day = `${number}${number}${number}${number}-${number}${number}-${number}${number}`; + +//entry of `stripe-settings` / `stripe-settings-test-mode` table +export type StripeDataTableEntry = { + //always present even if billing is not managed through stripe + stripeCustomerId: string; + //if true - no restrictions on workspace, essentially "give everything for free + noRestrictions?: boolean; + //custom settings of the plan. Overwrites ones coming from Stripe plan + customSettings?: Record; + //if set, billing settings will be taken from this object, not from Stripe. Plan settings should be + //present in `customSettings` field + customBilling?: { + start: Day; + end?: Day; + }; +}; + export async function getOrCreateCurrentSubscription( workspaceId: string, userEmail: () => string, opts: { changeEmail?: boolean } = {} -): Promise<{ stripeCustomerId: string; noRestrictions?: boolean; subscriptionStatus: SubscriptionStatus }> { - let stripeOptions = await store.getTable(stripeDataTable).get(workspaceId); +): Promise<{ + stripeCustomerId: string; + customBilling?: boolean; + noRestrictions?: boolean; + subscriptionStatus: SubscriptionStatus; +}> { + let stripeOptions: StripeDataTableEntry = await store.getTable(stripeDataTable).get(workspaceId); if (!stripeOptions) { const email = userEmail(); - const newCustomer = await stripe.customers.create({ email }); + const existingCustomers = await stripe.customers.list({ email }); + getLog() + .atInfo() + .log( + `${workspaceId} doesn't have a linked stripe customer. Found ${existingCustomers.data.length} customers with email ${email}` + ); + const newCustomer = + existingCustomers.data.length > 0 ? existingCustomers.data[0] : await stripe.customers.create({ email }); await store.getTable(stripeDataTable).put(workspaceId, { stripeCustomerId: newCustomer.id }); stripeOptions = { stripeCustomerId: newCustomer.id }; } if (opts.changeEmail) { await stripe.customers.update(stripeOptions.stripeCustomerId, { email: userEmail() }); } + + if (stripeOptions.customBilling) { + //in UTC, at 00:00:00 + getLog() + .atDebug() + .log( + `Custom billing is set for workspace ${workspaceId}: ${JSON.stringify(stripeOptions.customBilling, null, 2)}` + ); + const startDate = new Date(stripeOptions.customBilling.start + "T00:00:00Z"); + const startDay = startDate.getUTCDate(); + const currentDay = new Date().getUTCDate(); + const expiresAt = new Date(); + expiresAt.setUTCDate(startDay); + if (currentDay > startDay) { + expiresAt.setUTCMonth(expiresAt.getUTCMonth() + 1); + } + + return { + stripeCustomerId: stripeOptions.stripeCustomerId, + subscriptionStatus: { + customBilling: true, + planId: "$custom", + expiresAt: expiresAt.toISOString(), + renewAfterExpiration: true, + ...stripeOptions.customSettings, + }, + }; + } + const plan = (await getActivePlan(stripeOptions.stripeCustomerId)) || { planId: "free" }; return { stripeCustomerId: stripeOptions.stripeCustomerId, From 40598bd3da9061cb949ec46b0049a939859d3110 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Sat, 16 Dec 2023 08:14:38 +0400 Subject: [PATCH 0421/1353] rotor: mongodb tweaks --- libs/core-functions/package.json | 1 + .../src/functions/lib/mongodb.ts | 2 +- pnpm-lock.yaml | 93 +++++++++++++++++-- services/rotor/dist_package.json | 3 +- services/rotor/src/http/udf.ts | 16 +++- services/rotor/src/index.ts | 5 +- services/rotor/src/lib/message-handler.ts | 8 +- services/rotor/webpack.config.js | 2 + 8 files changed, 112 insertions(+), 18 deletions(-) diff --git a/libs/core-functions/package.json b/libs/core-functions/package.json index b25a8c55e..49fed9e4d 100644 --- a/libs/core-functions/package.json +++ b/libs/core-functions/package.json @@ -40,6 +40,7 @@ "juava": "workspace:*", "lodash": "^4.17.21", "mongodb": "^5.9.2", + "@mongodb-js/zstd": "^1.2.0", "ioredis": "^5.3.2", "posthog-node": "^2.4.0", "tslib": "^2.4.0", diff --git a/libs/core-functions/src/functions/lib/mongodb.ts b/libs/core-functions/src/functions/lib/mongodb.ts index 22180944e..1330a3875 100644 --- a/libs/core-functions/src/functions/lib/mongodb.ts +++ b/libs/core-functions/src/functions/lib/mongodb.ts @@ -17,7 +17,7 @@ async function createClient() { log.atInfo().log(`Connecting to MongoDB server...`); // Create a new MongoClient - const client = new MongoClient(mongodbURL); + const client = new MongoClient(mongodbURL, { compressors: ["zstd"] }); // Connect the client to the server (optional starting in v4.7) await client.connect(); // Establish and verify connection diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 142f97d28..770011c18 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -261,6 +261,9 @@ importers: '@amplitude/ua-parser-js': specifier: ^0.7.33 version: 0.7.33 + '@mongodb-js/zstd': + specifier: ^1.2.0 + version: 1.2.0 agentkeepalive: specifier: 4.3.0 version: 4.3.0 @@ -281,7 +284,7 @@ importers: version: 4.17.21 mongodb: specifier: ^5.9.2 - version: 5.9.2 + version: 5.9.2(@mongodb-js/zstd@1.2.0) parse-duration: specifier: ^1.1.0 version: 1.1.0 @@ -5077,6 +5080,82 @@ packages: dev: false optional: true + /@mongodb-js/zstd-darwin-arm64@1.2.0: + resolution: {integrity: sha512-QWgW6IkWp3ErBXOvlOj9lw3lwMfey7eXh/p/Srb/7sEiu1e0yEO+LQ8IctmDWh8bfznKXmwUC0h7LKDbYR30yw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@mongodb-js/zstd-darwin-x64@1.2.0: + resolution: {integrity: sha512-VnxYO8P2SWubdnydGId5+6veO6Ki6nxCr/pTaDZd8s4Urn6bDdXSX6YsZ0r42dO3Fa0FVYzrlcVAuNB67e2b6w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@mongodb-js/zstd-linux-arm64-gnu@1.2.0: + resolution: {integrity: sha512-TYF0XgNJW6UrvtY2u4Uuo5HiVWNgWNZ/ae2BhVp8hNsDhwFqb/YNoyiZqBei6whUwr8hecMy0UaHAXm3h+O2+Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@mongodb-js/zstd-linux-arm64-musl@1.2.0: + resolution: {integrity: sha512-e2ClmJI1BvJq23VSLH14hgjjjcMOad3R/Ap7Q7dTa1uiVSJG4xKd2CmrWQgX1Az4/EfUMWEI7pb4yuanbdd2AQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@mongodb-js/zstd-linux-x64-gnu@1.2.0: + resolution: {integrity: sha512-JuoK8lxUlkFPDBfsBUJKnLxpXA5ar+v7G43lIUlBKgjOp5aEWO/qQp5sNgCRnYA7x6PItYqIkEJjsays4N6JOA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@mongodb-js/zstd-linux-x64-musl@1.2.0: + resolution: {integrity: sha512-pSb1iUF3Gc/qrJuP/Mi5ry4YFAUdUVFKNRZh1KTDDhSWyRCLd9gKcNdRnXqJjIdeGGEKf4bhtZAbYw4i/g0foA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@mongodb-js/zstd-win32-x64-msvc@1.2.0: + resolution: {integrity: sha512-iz4Yl+WK3yr/4Yg6F4tKz3X9+yMZDK6pyBMA0CdXydSDZs6o2XQ2I0ZSu3oSk/ACfaZX3SNfRi3XTGgAM1eKZA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@mongodb-js/zstd@1.2.0: + resolution: {integrity: sha512-sKHsJU2MXsp822IFXOHw/4mpFulScNHpZzVy1Zi5k5wBsdiAPx1QramyOXZkpacla+2QPEC/s7TxPlEhG/HuNQ==} + engines: {node: '>= 10'} + optionalDependencies: + '@mongodb-js/zstd-darwin-arm64': 1.2.0 + '@mongodb-js/zstd-darwin-x64': 1.2.0 + '@mongodb-js/zstd-linux-arm64-gnu': 1.2.0 + '@mongodb-js/zstd-linux-arm64-musl': 1.2.0 + '@mongodb-js/zstd-linux-x64-gnu': 1.2.0 + '@mongodb-js/zstd-linux-x64-musl': 1.2.0 + '@mongodb-js/zstd-win32-x64-msvc': 1.2.0 + dev: false + /@nangohq/frontend@0.21.11: resolution: {integrity: sha512-oNOqM8gZhRaaHt63zyaWxsWi3pip4a78S9IzstEBVvUUzEFOU3+ys0r3TmyQCbA1veaAZjzeMyq+LtZem/Nt9g==} dev: false @@ -9437,7 +9516,6 @@ packages: dependencies: webpack: 5.88.2(webpack-cli@5.1.4) webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.88.2) - dev: true /@webpack-cli/generators@3.0.1(mem-fs-editor@9.7.0)(mem-fs@2.3.0)(prettier@2.8.7)(webpack-cli@5.0.1)(webpack@5.78.0): resolution: {integrity: sha512-kgtqwN13udxC2wV2LfEmJQ/yGz6+j8cgy17jE9ybyHrmT0PJcwjSpsvj1fDWYUb7brSOB4B03s1mEPjZTRfwCQ==} @@ -9484,7 +9562,6 @@ packages: - mem-fs - mem-fs-editor - supports-color - dev: true /@webpack-cli/info@2.0.1(webpack-cli@5.0.1)(webpack@5.78.0): resolution: {integrity: sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==} @@ -9505,7 +9582,6 @@ packages: dependencies: webpack: 5.88.2(webpack-cli@5.1.4) webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.88.2) - dev: true /@webpack-cli/serve@2.0.1(webpack-cli@5.0.1)(webpack@5.78.0): resolution: {integrity: sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw==} @@ -9534,7 +9610,6 @@ packages: dependencies: webpack: 5.88.2(webpack-cli@5.1.4) webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.88.2) - dev: true /@xobotyi/scrollbar-width@1.9.5: resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} @@ -11205,7 +11280,6 @@ packages: /commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} - dev: true /commander@11.0.0: resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} @@ -18990,7 +19064,7 @@ packages: whatwg-url: 11.0.0 dev: false - /mongodb@5.9.2: + /mongodb@5.9.2(@mongodb-js/zstd@1.2.0): resolution: {integrity: sha512-H60HecKO4Bc+7dhOv4sJlgvenK4fQNqqUIlXxZYQNbfEWSALGAwGoyJd/0Qwk4TttFXUOHJ2ZJQe/52ScaUwtQ==} engines: {node: '>=14.20.1'} peerDependencies: @@ -19011,6 +19085,7 @@ packages: snappy: optional: true dependencies: + '@mongodb-js/zstd': 1.2.0 bson: 5.5.0 mongodb-connection-string-url: 2.6.0 socks: 2.7.1 @@ -24514,7 +24589,7 @@ packages: schema-utils: 3.3.0 serialize-javascript: 6.0.1 terser: 5.19.4 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.88.2(webpack-cli@5.1.4) /terser@4.8.1: resolution: {integrity: sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==} @@ -25802,7 +25877,6 @@ packages: rechoir: 0.8.0 webpack: 5.88.2(webpack-cli@5.1.4) webpack-merge: 5.8.0 - dev: true /webpack-dev-middleware@5.3.3(webpack@5.88.2): resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} @@ -26025,7 +26099,6 @@ packages: - '@swc/core' - esbuild - uglify-js - dev: true /websocket-driver@0.7.4: resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} diff --git a/services/rotor/dist_package.json b/services/rotor/dist_package.json index 182e271e0..e6ac9fc2c 100644 --- a/services/rotor/dist_package.json +++ b/services/rotor/dist_package.json @@ -3,6 +3,7 @@ "version": "0.0.0", "dependencies": { "isolated-vm": "4.6.0", - "@sensejs/kafkajs-zstd-support": "^0.11.0" + "@sensejs/kafkajs-zstd-support": "^0.11.0", + "@mongodb-js/zstd": "^1.2.0" } } diff --git a/services/rotor/src/http/udf.ts b/services/rotor/src/http/udf.ts index ce19b73bf..3dd0124bc 100644 --- a/services/rotor/src/http/udf.ts +++ b/services/rotor/src/http/udf.ts @@ -1,12 +1,22 @@ -import { UDFTestRun, UDFTestRequest, mongodb, defaultTTL, createMongoStore } from "@jitsu/core-functions"; +import { + UDFTestRun, + UDFTestRequest, + mongodb, + defaultTTL, + createMongoStore, + createTtlStore, +} from "@jitsu/core-functions"; import { getLog } from "juava"; +import { redis } from "@jitsu-internal/console/lib/server/redis"; const log = getLog("udf_run"); export const UDFRunHandler = async (req, res) => { const body = req.body as UDFTestRequest; - log.atInfo().log(`Running function: ${body?.functionId} workspace: ${body?.workspaceId}`, JSON.stringify(body)); - body.store = createMongoStore(body?.workspaceId, await mongodb.waitInit(), defaultTTL); + //log.atInfo().log(`Running function: ${body?.functionId} workspace: ${body?.workspaceId}`, JSON.stringify(body)); + body.store = process.env.MONGODB_URL + ? createMongoStore(body?.workspaceId, mongodb(), defaultTTL) + : createTtlStore(body?.workspaceId, redis(), defaultTTL); const result = await UDFTestRun(body); if (result.error) { log diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index 4858666a9..51b251104 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -6,7 +6,7 @@ import { rotorConsumerGroupId, } from "./lib/kafka-config"; import { kafkaRotor } from "./lib/rotor"; - +import { mongodb } from "@jitsu/core-functions"; import minimist from "minimist"; import { glob } from "glob"; import fs from "fs"; @@ -16,6 +16,7 @@ import Prometheus from "prom-client"; import { FunctionsHandler, FunctionsHandlerMulti } from "./http/functions"; import { initMaxMindClient } from "./lib/maxmind"; import { rotorMessageHandler } from "./lib/message-handler"; +import { redis } from "@jitsu-internal/console/lib/server/redis"; export const log = getLog("rotor"); @@ -54,6 +55,8 @@ async function main() { }); log.atInfo().log("Starting kafka processing"); Prometheus.collectDefaultMetrics(); + await mongodb.waitInit(); + await redis.waitInit(); rotor .start() .then(chMetrics => { diff --git a/services/rotor/src/lib/message-handler.ts b/services/rotor/src/lib/message-handler.ts index f587a41d5..396a1da1a 100644 --- a/services/rotor/src/lib/message-handler.ts +++ b/services/rotor/src/lib/message-handler.ts @@ -108,8 +108,12 @@ export async function rotorMessageHandler( }, }; const oldStore = createTtlStore(connection.workspaceId, redis(), defaultTTL); - const newStore = createMongoStore(connection.workspaceId, await mongodb.waitInit(), defaultTTL); - const store = newStoreWorskpaceId.includes(connection.workspaceId) ? newStore : createMultiStore(newStore, oldStore); + const newStore = process.env.MONGODB_URL ? createMongoStore(connection.workspaceId, mongodb(), defaultTTL) : oldStore; + const store = newStoreWorskpaceId.includes(connection.workspaceId) + ? newStore + : newStore != oldStore + ? createMultiStore(newStore, oldStore) + : oldStore; const rl = await redisLogger.waitInit(); diff --git a/services/rotor/webpack.config.js b/services/rotor/webpack.config.js index 4a2dccaab..034eba502 100644 --- a/services/rotor/webpack.config.js +++ b/services/rotor/webpack.config.js @@ -6,6 +6,8 @@ const config = { target: "node", externals: { "isolated-vm": "require('isolated-vm')", + "@sensejs/kafkajs-zstd-support": "require('@sensejs/kafkajs-zstd-support')", + "@mongodb-js/zstd": "require('@mongodb-js/zstd')", }, node: { __dirname: false, From b6d9e59a4a628c6c2490749da40337ccabe944e2 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Sat, 16 Dec 2023 08:30:08 +0400 Subject: [PATCH 0422/1353] rotor: mongodb tweaks --- services/rotor/webpack.config.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/services/rotor/webpack.config.js b/services/rotor/webpack.config.js index 034eba502..4a2dccaab 100644 --- a/services/rotor/webpack.config.js +++ b/services/rotor/webpack.config.js @@ -6,8 +6,6 @@ const config = { target: "node", externals: { "isolated-vm": "require('isolated-vm')", - "@sensejs/kafkajs-zstd-support": "require('@sensejs/kafkajs-zstd-support')", - "@mongodb-js/zstd": "require('@mongodb-js/zstd')", }, node: { __dirname: false, From 4eaf4a4b0c070a548b6fc1804570698bd27046f0 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Sat, 16 Dec 2023 13:14:50 +0400 Subject: [PATCH 0423/1353] rotor: tweaks --- rotor.Dockerfile | 2 ++ services/rotor/src/http/functions.ts | 41 ++++++++++++++++++++-------- services/rotor/src/http/udf.ts | 2 +- 3 files changed, 33 insertions(+), 12 deletions(-) diff --git a/rotor.Dockerfile b/rotor.Dockerfile index ebf2346d3..003edefa5 100644 --- a/rotor.Dockerfile +++ b/rotor.Dockerfile @@ -33,4 +33,6 @@ EXPOSE 3401 COPY --from=builder /app/services/rotor/dist . +ENV NODE_ENV=production + ENTRYPOINT ["sh", "-c", "node --max-old-space-size=4096 main.js"] diff --git a/services/rotor/src/http/functions.ts b/services/rotor/src/http/functions.ts index 412209520..1f4a00018 100644 --- a/services/rotor/src/http/functions.ts +++ b/services/rotor/src/http/functions.ts @@ -7,11 +7,19 @@ import { CONNECTION_IDS_HEADER } from "../lib/rotor"; import { AnyEvent } from "@jitsu/protocols/functions"; import isEqual from "lodash/isEqual"; +import Prometheus from "prom-client"; + const log = getLog("functions_handler"); +const handlerMetric = new Prometheus.Counter({ + name: "rotor_function_handler", + help: "function handler status", + labelNames: ["connectionId", "status"] as const, +}); + export const FunctionsHandler = (metrics: Metrics, geoResolver?: GeoResolver) => async (req, res) => { const message = req.body as IngestMessage; - log.atInfo().log(`Functions handler. Message ID: ${message.messageId} connectionId: ${message.connectionId}`); + //log.atInfo().log(`Functions handler. Message ID: ${message.messageId} connectionId: ${message.connectionId}`); const result = await rotorMessageHandler(message, {}, metrics, geoResolver); if (result?.events && result.events.length > 0) { res.json(result.events); @@ -22,17 +30,28 @@ export const FunctionsHandler = (metrics: Metrics, geoResolver?: GeoResolver) => export const FunctionsHandlerMulti = (metrics: Metrics, geoResolver?: GeoResolver) => async (req, res) => { const connectionIds = (req.query.ids ?? "").split(",") as string[]; - const message = req.body as IngestMessage; - const prom = connectionIds - .filter(id => !!id) - .map(id => { - log.atInfo().log(`Functions handler2. Message ID: ${message.messageId} connectionId: ${id}`); - return rotorMessageHandler(message, { [CONNECTION_IDS_HEADER]: id }, metrics, geoResolver); + try { + const message = req.body as IngestMessage; + const prom = connectionIds + .filter(id => !!id) + .map(id => { + //log.atInfo().log(`Functions handler2. Message ID: ${message.messageId} connectionId: ${id}`); + return rotorMessageHandler(message, { [CONNECTION_IDS_HEADER]: id }, metrics, geoResolver); + }); + const results = await Promise.all(prom); + connectionIds.forEach((id, i) => { + handlerMetric.inc({ connectionId: id, status: "success" }, 1); }); - const results = await Promise.all(prom); - - const events = Object.fromEntries(results.map(result => [result?.connectionId, mapTheSame(message, result?.events)])); - res.json(events); + const events = Object.fromEntries( + results.map(result => [result?.connectionId, mapTheSame(message, result?.events)]) + ); + res.json(events); + } catch (e) { + connectionIds.forEach((id, i) => { + handlerMetric.inc({ connectionId: id, status: "error" }, 1); + }); + throw e; + } }; function mapTheSame(message: IngestMessage, newEvents?: AnyEvent[]) { diff --git a/services/rotor/src/http/udf.ts b/services/rotor/src/http/udf.ts index 3dd0124bc..39dfbfc75 100644 --- a/services/rotor/src/http/udf.ts +++ b/services/rotor/src/http/udf.ts @@ -13,7 +13,7 @@ const log = getLog("udf_run"); export const UDFRunHandler = async (req, res) => { const body = req.body as UDFTestRequest; - //log.atInfo().log(`Running function: ${body?.functionId} workspace: ${body?.workspaceId}`, JSON.stringify(body)); + log.atInfo().log(`Running function: ${body?.functionId} workspace: ${body?.workspaceId}`, JSON.stringify(body)); body.store = process.env.MONGODB_URL ? createMongoStore(body?.workspaceId, mongodb(), defaultTTL) : createTtlStore(body?.workspaceId, redis(), defaultTTL); From 4e379cc1d1e4ae0881cfa476c5dc6c9f3aefc594 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Sun, 17 Dec 2023 19:49:55 -0500 Subject: [PATCH 0424/1353] feat: support of future subscriptions --- .../console/components/Billing/BillingManager.tsx | 10 ++++++++++ webapps/console/lib/schema/index.ts | 2 ++ webapps/ee-api/lib/stripe.ts | 15 +++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/webapps/console/components/Billing/BillingManager.tsx b/webapps/console/components/Billing/BillingManager.tsx index 0d51a1841..f13be1574 100644 --- a/webapps/console/components/Billing/BillingManager.tsx +++ b/webapps/console/components/Billing/BillingManager.tsx @@ -214,6 +214,16 @@ const CurrentSubscription: React.FC<{}> = () => { )} + {billing.settings?.futureSubscriptionDate && ( +
    + Your paid subscription starts on{" "} + {new Intl.DateTimeFormat("en-US", { + month: "long", + year: "numeric", + day: "numeric", + }).format(new Date(billing.settings?.futureSubscriptionDate))} +
    + )}
    diff --git a/webapps/console/lib/schema/index.ts b/webapps/console/lib/schema/index.ts index e385243d2..56e08c578 100644 --- a/webapps/console/lib/schema/index.ts +++ b/webapps/console/lib/schema/index.ts @@ -36,6 +36,8 @@ export const BillingSettings = z.object({ destinationEvensPerMonth: z.number().default(200_000), expiresAt: z.string().optional(), renewAfterExpiration: z.boolean().default(false).optional(), + //if subscription starts some time in the future, for enterprise plans only + futureSubscriptionDate: z.string().optional(), }); export type BillingSettings = z.infer; diff --git a/webapps/ee-api/lib/stripe.ts b/webapps/ee-api/lib/stripe.ts index 844dc6fb2..bc03614e2 100644 --- a/webapps/ee-api/lib/stripe.ts +++ b/webapps/ee-api/lib/stripe.ts @@ -73,7 +73,22 @@ export async function getOrCreateCurrentSubscription( .log( `Custom billing is set for workspace ${workspaceId}: ${JSON.stringify(stripeOptions.customBilling, null, 2)}` ); + const startDate = new Date(stripeOptions.customBilling.start + "T00:00:00Z"); + getLog().atInfo().log(`Subscription start date for workspace ${workspaceId}: ${startDate.toISOString()}`); + if (startDate.getTime() > new Date().getTime()) { + getLog() + .atInfo() + .log(`Subscription start date for workspace ${workspaceId}: ${startDate.toISOString()} - future`); + return { + stripeCustomerId: stripeOptions.stripeCustomerId, + subscriptionStatus: { + //customBilling: true, + planId: "free", + futureSubscriptionDate: startDate, + }, + }; + } const startDay = startDate.getUTCDate(); const currentDay = new Date().getUTCDate(); const expiresAt = new Date(); From 3de6949317a7b1cc21ba952e3eddca199053e316 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 18 Dec 2023 14:51:27 +0400 Subject: [PATCH 0425/1353] mixpanel-destination: pass utm campaign to proper mixpanel propery --- .../src/functions/mixpanel-destination.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/libs/core-functions/src/functions/mixpanel-destination.ts b/libs/core-functions/src/functions/mixpanel-destination.ts index 8b4e5d5dd..dcb14aebd 100644 --- a/libs/core-functions/src/functions/mixpanel-destination.ts +++ b/libs/core-functions/src/functions/mixpanel-destination.ts @@ -25,8 +25,14 @@ export type HttpRequest = { headers?: Record; }; -function prefix

    (param: Record, prefix: P): Record { - return Object.entries(param).reduce((acc, [key, value]) => ({ ...acc, [`${prefix}${key}`]: value }), {}); +function utm(param: Record): Record { + return Object.entries(param).reduce( + (acc, [key, value]) => ({ + ...acc, + [`utm_${key === "name" ? "campaign" : key}`]: value, + }), + {} + ); } function evict(obj: Record, key: string) { @@ -49,7 +55,7 @@ function trackEvent(ctx: FullContext, distinctId: string, eventType: string, eve delete traits.groupId; const customProperties = { - ...prefix(event.context?.campaign || {}, "utm_"), + ...utm(event.context?.campaign || {}), ...(event.context?.page || {}), ...traits, ...(event.properties || {}), From 230fe22d2af79a3198cbe50202d7d7eb64467b20 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 18 Dec 2023 18:14:40 +0400 Subject: [PATCH 0426/1353] rotor: better error reporting --- services/rotor/src/lib/functions-chain.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index f1dc9ed7f..f22adf147 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -104,7 +104,7 @@ export async function runChain( continue; } } else { - const args = [err]; + const args = [err?.name, err?.message]; const r = retryObject(err, eventContext.retries ?? 0); if (r) { args.push(r); From 899d89ea13a33ef86010c453f96f1074e4618329 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 19 Dec 2023 11:50:25 +0400 Subject: [PATCH 0427/1353] console: allow caddy issue certs for slug subdomains --- webapps/console/pages/api/admin/domains.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/webapps/console/pages/api/admin/domains.ts b/webapps/console/pages/api/admin/domains.ts index 88899b2bc..6cd692876 100644 --- a/webapps/console/pages/api/admin/domains.ts +++ b/webapps/console/pages/api/admin/domains.ts @@ -2,6 +2,8 @@ import { Api, nextJsApiHandler } from "../../../lib/api"; import { db } from "../../../lib/server/db"; import { ApiError } from "../../../lib/shared/errors"; +//For Caddy to allow issuing certificates for a domain, it must be present in the domains array of a stream object. +//or it must be a subdomain of the data domain export const api: Api = { GET: { auth: false, @@ -14,6 +16,11 @@ export const api: Api = { if (!domain) { throw new ApiError("missing required parameter", {}, { status: 400 }); } + const dataDomain = process.env.DATA_DOMAIN; + if (domain === dataDomain || domain.endsWith("." + dataDomain)) { + //data domain and subdomains are always allowed + return; + } const stream = await db.prisma().configurationObject.findFirst({ where: { type: "stream", From 23888b14a9c75519527cf457052175ce67b85b17 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 19 Dec 2023 12:21:27 +0400 Subject: [PATCH 0428/1353] rotor tweaks --- libs/core-functions/package.json | 1 + libs/core-functions/src/functions/lib/mongodb.ts | 4 ++-- libs/core-functions/src/functions/lib/ua.ts | 14 ++++++++++++++ pnpm-lock.yaml | 3 +++ services/rotor/src/index.ts | 2 ++ services/rotor/src/lib/message-handler.ts | 2 +- 6 files changed, 23 insertions(+), 3 deletions(-) diff --git a/libs/core-functions/package.json b/libs/core-functions/package.json index 49fed9e4d..1963254fe 100644 --- a/libs/core-functions/package.json +++ b/libs/core-functions/package.json @@ -40,6 +40,7 @@ "juava": "workspace:*", "lodash": "^4.17.21", "mongodb": "^5.9.2", + "node-cache": "^5.1.2", "@mongodb-js/zstd": "^1.2.0", "ioredis": "^5.3.2", "posthog-node": "^2.4.0", diff --git a/libs/core-functions/src/functions/lib/mongodb.ts b/libs/core-functions/src/functions/lib/mongodb.ts index 1330a3875..8085abcfe 100644 --- a/libs/core-functions/src/functions/lib/mongodb.ts +++ b/libs/core-functions/src/functions/lib/mongodb.ts @@ -30,7 +30,7 @@ const MongoCreatedCollections = new Set(); export function mongoAnonymousEventsStore(): AnonymousEventsStore { return { async addEvent(collectionName: string, anonymousId: string, event: AnalyticsServerEvent, ttlDays: number) { - const mongo = await mongodb.waitInit(); + const mongo = mongodb(); await ensureMongoCollection(mongo, collectionName, ttlDays); const res = await mongo .db() @@ -44,7 +44,7 @@ export function mongoAnonymousEventsStore(): AnonymousEventsStore { }, async evictEvents(collectionName: string, anonymousId: string) { - const mongo = await mongodb.waitInit(); + const mongo = mongodb(); // to ensure query consistency between find and delete query - limit them to the same time window const maxObjectId = new ObjectId(Math.floor(new Date().getTime() / 1000).toString(16) + "0000000000000000"); // load anonymous events from user_recognition collection diff --git a/libs/core-functions/src/functions/lib/ua.ts b/libs/core-functions/src/functions/lib/ua.ts index cc4fbba1f..f1c35b91b 100644 --- a/libs/core-functions/src/functions/lib/ua.ts +++ b/libs/core-functions/src/functions/lib/ua.ts @@ -1,10 +1,21 @@ import { UserAgent } from "@jitsu/protocols/functions"; import omit from "lodash/omit"; import uaParser from "@amplitude/ua-parser-js"; +import NodeCache from "node-cache"; const BotUAKeywords = ["bot", "spider", "headless", "crawler", "uptimia"]; +const uaCacheTTL = 60 * 10; // 10 min; +const uaCache = new NodeCache({ stdTTL: uaCacheTTL, checkperiod: 60, maxKeys: 10000 }); export function parseUserAgent(userAgent?: string): UserAgent { + if (!userAgent) { + return {} as UserAgent; + } + const cached = uaCache.get(userAgent); + if (cached) { + uaCache.ttl(userAgent, uaCacheTTL); + return cached as UserAgent; + } const uas = userAgent || ""; const ua = omit(uaParser(uas), "ua") as UserAgent; const lower = uas.toLowerCase(); @@ -12,5 +23,8 @@ export function parseUserAgent(userAgent?: string): UserAgent { if (ua.device) { ua.device.type = ua.device.type || "desktop"; } + try { + uaCache.set(userAgent, ua); + } catch (e) {} return ua; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 770011c18..70f19158b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -285,6 +285,9 @@ importers: mongodb: specifier: ^5.9.2 version: 5.9.2(@mongodb-js/zstd@1.2.0) + node-cache: + specifier: ^5.1.2 + version: 5.1.2 parse-duration: specifier: ^1.1.0 version: 1.1.0 diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index 51b251104..37ee13926 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -17,6 +17,7 @@ import { FunctionsHandler, FunctionsHandlerMulti } from "./http/functions"; import { initMaxMindClient } from "./lib/maxmind"; import { rotorMessageHandler } from "./lib/message-handler"; import { redis } from "@jitsu-internal/console/lib/server/redis"; +import { redisLogger } from "./lib/redis-logger"; export const log = getLog("rotor"); @@ -57,6 +58,7 @@ async function main() { Prometheus.collectDefaultMetrics(); await mongodb.waitInit(); await redis.waitInit(); + await redisLogger.waitInit(); rotor .start() .then(chMetrics => { diff --git a/services/rotor/src/lib/message-handler.ts b/services/rotor/src/lib/message-handler.ts index 396a1da1a..9ac3a3050 100644 --- a/services/rotor/src/lib/message-handler.ts +++ b/services/rotor/src/lib/message-handler.ts @@ -115,7 +115,7 @@ export async function rotorMessageHandler( ? createMultiStore(newStore, oldStore) : oldStore; - const rl = await redisLogger.waitInit(); + const rl = redisLogger(); const connectionData = connection.options as any; From 13adf977bdbb91d2169a7715d27abf5884622eab Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Tue, 19 Dec 2023 09:28:27 -0500 Subject: [PATCH 0429/1353] feat: support (partial) of multiple data domains --- webapps/console/lib/domains.ts | 10 +-- webapps/console/lib/server/data-domains.ts | 7 ++ webapps/console/pages/api/admin/domains.ts | 83 +++++++++++++++------- webapps/console/pages/api/app-config.ts | 5 +- webapps/console/pages/api/schema/index.ts | 11 +++ 5 files changed, 82 insertions(+), 34 deletions(-) create mode 100644 webapps/console/lib/server/data-domains.ts diff --git a/webapps/console/lib/domains.ts b/webapps/console/lib/domains.ts index 260b783c6..8b40cf103 100644 --- a/webapps/console/lib/domains.ts +++ b/webapps/console/lib/domains.ts @@ -3,6 +3,7 @@ import { getErrorMessage } from "juava"; import { IngestType } from "@jitsu/protocols/async-request"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import { getServerLog } from "./server/log"; +import { mainDataDomain } from "./server/data-domains"; export type HttpProtocolVariant = "https" | "http"; @@ -18,13 +19,6 @@ export type PublicEndpoint = { baseUrl: string; }; -export function getDataDomain({ hostname }: PublicEndpoint): string | undefined { - if (process.env.DATA_DOMAIN) { - return process.env.DATA_DOMAIN; - } - return undefined; -} - export type StreamCredentials = { domain?: string; slug?: string; writeKey?: string; ingestType: IngestType }; /** @@ -40,7 +34,7 @@ export function getDataLocator( event: AnalyticsServerEvent ): StreamCredentials { const requestEndpoint = getReqEndpoint(req); - const [dataHost] = getDataDomain(requestEndpoint)?.split(":") || [undefined]; //ignore port, port can be used only in dev env + const [dataHost] = mainDataDomain?.split(":") || [undefined]; //ignore port, port can be used only in dev env const loc: Partial = { ingestType }; if (req.headers["authorization"]) { const auth = Buffer.from(req.headers["authorization"].replace("Basic ", ""), "base64").toString("utf-8"); diff --git a/webapps/console/lib/server/data-domains.ts b/webapps/console/lib/server/data-domains.ts new file mode 100644 index 000000000..71774be96 --- /dev/null +++ b/webapps/console/lib/server/data-domains.ts @@ -0,0 +1,7 @@ +export const dataDomains: Set | undefined = process.env.DATA_DOMAIN + ? new Set(process.env.DATA_DOMAIN.split(",")) + : undefined; + +export const mainDataDomain: string | undefined = process.env.DATA_DOMAIN + ? process.env.DATA_DOMAIN.split(",")[0] + : undefined; diff --git a/webapps/console/pages/api/admin/domains.ts b/webapps/console/pages/api/admin/domains.ts index 6cd692876..ed38b68fc 100644 --- a/webapps/console/pages/api/admin/domains.ts +++ b/webapps/console/pages/api/admin/domains.ts @@ -1,27 +1,58 @@ -import { Api, nextJsApiHandler } from "../../../lib/api"; +import { createRoute } from "../../../lib/api"; import { db } from "../../../lib/server/db"; import { ApiError } from "../../../lib/shared/errors"; +import { dataDomains } from "../../../lib/server/data-domains"; +import { z } from "zod"; +import { getLog } from "juava"; +export const log = getLog("caddy-domains"); //For Caddy to allow issuing certificates for a domain, it must be present in the domains array of a stream object. //or it must be a subdomain of the data domain -export const api: Api = { - GET: { +export default createRoute() + .GET({ auth: false, - handle: async ({ req, query, res }) => { - const token = query.token; - if (!token || process.env.CADDY_TOKEN !== token) { - throw new ApiError("Unauthorized", {}, { status: 401 }); - } - const domain = query.domain; - if (!domain) { - throw new ApiError("missing required parameter", {}, { status: 400 }); - } - const dataDomain = process.env.DATA_DOMAIN; - if (domain === dataDomain || domain.endsWith("." + dataDomain)) { - //data domain and subdomains are always allowed - return; - } + query: z.object({ + domain: z.string(), + token: z.string(), + }), + }) + .handler(async ({ query: { token, domain } }) => { + if (!dataDomains) { + throw new ApiError(`Domain ${domain} not found. Data domains configuration is absent`, {}, { status: 404 }); + } + if (!token || process.env.CADDY_TOKEN !== token) { + throw new ApiError("Unauthorized", {}, { status: 401 }); + } + log.atInfo().log(`Validating domain ${domain}`); + + const streamId = [...dataDomains] + .map(dataDomain => { + if (domain?.toLowerCase().endsWith("." + dataDomain)) { + return domain.substring(0, domain.length - dataDomain.length - 1); + } else { + return undefined; + } + }) + .find(Boolean); + + if (streamId) { + log.atInfo().log(`Stream ${streamId} extracted from ${domain}`); const stream = await db.prisma().configurationObject.findFirst({ + where: { + type: "stream", + deleted: false, + id: streamId, + }, + }); + if (stream) { + return { ok: true, details: `Stream ${streamId} found` }; + } else { + log.atWarn().log(`Stream ${streamId} extracted from ${domain} not found`); + throw new ApiError(`Slug ${streamId} for ${domain} not found`, {}, { status: 404 }); + } + } else { + log.atInfo().log(`Stream not found for ${domain}. Searching by custom domain`); + const streams = await db.prisma().configurationObject.findMany({ where: { type: "stream", deleted: false, @@ -31,11 +62,15 @@ export const api: Api = { }, }, }); - if (!stream) { - throw new ApiError("not found", {}, { status: 404 }); + if (!streams || streams.length === 0) { + log.atWarn().log(`Custom domain ${domain} not found`); + throw new ApiError(`Domain ${domain} not found`, {}, { status: 404 }); + } else { + log + .atWarn() + .log(`Found ${streams.length} streams for custom domain ${domain}: ${streams.map(s => s.id).join(", ")}`); + return { ok: true, details: `${streams.length} streams found` }; } - }, - }, -}; - -export default nextJsApiHandler(api); + } + }) + .toNextApiHandler(); diff --git a/webapps/console/pages/api/app-config.ts b/webapps/console/pages/api/app-config.ts index 80e13e0d0..36b4b18a3 100644 --- a/webapps/console/pages/api/app-config.ts +++ b/webapps/console/pages/api/app-config.ts @@ -1,6 +1,6 @@ import { createRoute } from "../../lib/api"; import { AppConfig } from "../../lib/schema"; -import { getAppEndpoint, getDataDomain } from "../../lib/domains"; +import { getAppEndpoint } from "../../lib/domains"; import { getEeConnection } from "../../lib/server/ee"; import { isEEAvailable } from "./ee/jwt"; import { isFirebaseEnabled, requireFirebaseOptions } from "../../lib/server/firebase-server"; @@ -8,12 +8,13 @@ import { nangoConfig } from "../../lib/server/oauth/nango-config"; import { isTruish } from "../../lib/shared/chores"; import { readOnlyUntil } from "../../lib/server/read-only-mode"; import { productTelemetryEnabled, productTelemetryHost } from "../../lib/server/telemetry"; +import { mainDataDomain } from "../../lib/server/data-domains"; export default createRoute() .GET({ result: AppConfig, auth: false }) .handler(async ({ req }) => { const publicEndpoints = getAppEndpoint(req); - const dataHost = getDataDomain(publicEndpoints); + const dataHost = mainDataDomain; return { docsUrl: process.env.JITSU_DOCUMENTATION_URL || "https://docs-jitsu-com.staging.jitsu.com/", diff --git a/webapps/console/pages/api/schema/index.ts b/webapps/console/pages/api/schema/index.ts index d06b47108..7cb98c40e 100644 --- a/webapps/console/pages/api/schema/index.ts +++ b/webapps/console/pages/api/schema/index.ts @@ -30,6 +30,17 @@ export default createRoute() }), {} ); + } else if (typeName === "destination") { + schema.subTypes = coreDestinations.reduce( + (acc, dest) => ({ + ...acc, + [dest.id]: { + type: `${dest.id}`, + schemaURL: `${publicEndpoints.baseUrl}/api/schema/${typeName}/${dest.id}`, + }, + }), + {} + ); } result.push(schema); } From ba57c33f395792ced69ef378d0771fa4b4831a0f Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Tue, 19 Dec 2023 15:14:19 -0500 Subject: [PATCH 0430/1353] feat: inmem store for rotor (just lib, not user so far) --- libs/juava/src/log.ts | 2 +- pnpm-lock.yaml | 367 +++++++++++++++---- services/rotor/.gitignore | 1 + services/rotor/__tests__/inmem-store.test.ts | 58 +++ services/rotor/jest.config.js | 9 + services/rotor/jest.setup.js | 8 + services/rotor/package.json | 38 +- services/rotor/src/lib/inmem-store.ts | 146 ++++++++ 8 files changed, 545 insertions(+), 84 deletions(-) create mode 100644 services/rotor/__tests__/inmem-store.test.ts create mode 100644 services/rotor/jest.config.js create mode 100644 services/rotor/jest.setup.js create mode 100644 services/rotor/src/lib/inmem-store.ts diff --git a/libs/juava/src/log.ts b/libs/juava/src/log.ts index aaae7556c..1f1f876fb 100644 --- a/libs/juava/src/log.ts +++ b/libs/juava/src/log.ts @@ -17,7 +17,7 @@ function getComponent() { return undefined; } -let globalLogLevel: LogLevel = "info" as LogLevel; +let globalLogLevel: LogLevel = (process.env.JUAVA_LOG_LEVEL || "info") as LogLevel; let enableServerLogsColoring: boolean = !(process.env.CI === "1" || process.env.CI === "true"); let enableJsonFormat: boolean = false; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 70f19158b..1eb4c5afb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -612,6 +612,9 @@ importers: '@types/glob': specifier: ^8.0.0 version: 8.1.0 + '@types/jest': + specifier: ^29.5.11 + version: 29.5.11 '@types/lodash': specifier: ^4.14.200 version: 4.14.200 @@ -645,6 +648,9 @@ importers: dotenv-cli: specifier: ^6.0.0 version: 6.0.0 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@16.11.6)(ts-node@10.9.1) lodash: specifier: ^4.17.21 version: 4.17.21 @@ -657,6 +663,9 @@ importers: rollup: specifier: ^3.2.5 version: 3.20.2 + ts-jest: + specifier: ^29.1.1 + version: 29.1.1(@babel/core@7.21.4)(jest@29.7.0)(typescript@4.9.5) ts-loader: specifier: ^9.4.2 version: 9.4.2(typescript@4.9.5)(webpack@5.78.0) @@ -4300,7 +4309,7 @@ packages: jest-changed-files: 29.5.0 jest-config: 29.5.0(@types/node@18.15.11)(ts-node@10.8.2) jest-haste-map: 29.5.0 - jest-message-util: 29.5.0 + jest-message-util: 29.7.0 jest-regex-util: 29.4.3 jest-resolve: 29.5.0 jest-resolve-dependencies: 29.5.0 @@ -4362,6 +4371,49 @@ packages: - supports-color - ts-node + /@jest/core@29.7.0(ts-node@10.9.1): + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.15.11 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.8.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@18.15.11)(ts-node@10.9.1) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + dev: true + /@jest/environment@27.5.1: resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -4408,13 +4460,6 @@ packages: jest-get-type: 28.0.2 dev: true - /@jest/expect-utils@29.5.0: - resolution: {integrity: sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-get-type: 29.6.3 - dev: true - /@jest/expect-utils@29.7.0: resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4920,7 +4965,7 @@ packages: resolution: {integrity: sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/schemas': 29.4.3 + '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 '@types/node': 18.15.11 @@ -5579,7 +5624,7 @@ packages: react-refresh: 0.11.0 schema-utils: 3.3.0 source-map: 0.7.4 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.88.2(webpack-cli@5.1.4) webpack-dev-server: 4.13.2(webpack@5.88.2) dev: false @@ -6505,7 +6550,7 @@ packages: rollup: 2.78.0 stacktrace-parser: 0.1.10 tslib: 2.6.2 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.88.2(webpack-cli@5.1.4) transitivePeerDependencies: - encoding - supports-color @@ -8526,6 +8571,7 @@ packages: /@types/estree@0.0.51: resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} + dev: true /@types/estree@1.0.1: resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} @@ -8613,6 +8659,13 @@ packages: pretty-format: 29.5.0 dev: true + /@types/jest@29.5.11: + resolution: {integrity: sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==} + dependencies: + expect: 29.7.0 + pretty-format: 29.7.0 + dev: true + /@types/jest@29.5.5: resolution: {integrity: sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg==} dependencies: @@ -9323,6 +9376,7 @@ packages: dependencies: '@webassemblyjs/helper-numbers': 1.11.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.1 + dev: true /@webassemblyjs/ast@1.11.6: resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} @@ -9332,18 +9386,21 @@ packages: /@webassemblyjs/floating-point-hex-parser@1.11.1: resolution: {integrity: sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==} + dev: true /@webassemblyjs/floating-point-hex-parser@1.11.6: resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} /@webassemblyjs/helper-api-error@1.11.1: resolution: {integrity: sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==} + dev: true /@webassemblyjs/helper-api-error@1.11.6: resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} /@webassemblyjs/helper-buffer@1.11.1: resolution: {integrity: sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==} + dev: true /@webassemblyjs/helper-buffer@1.11.6: resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} @@ -9354,6 +9411,7 @@ packages: '@webassemblyjs/floating-point-hex-parser': 1.11.1 '@webassemblyjs/helper-api-error': 1.11.1 '@xtuc/long': 4.2.2 + dev: true /@webassemblyjs/helper-numbers@1.11.6: resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} @@ -9364,6 +9422,7 @@ packages: /@webassemblyjs/helper-wasm-bytecode@1.11.1: resolution: {integrity: sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==} + dev: true /@webassemblyjs/helper-wasm-bytecode@1.11.6: resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} @@ -9375,6 +9434,7 @@ packages: '@webassemblyjs/helper-buffer': 1.11.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.1 '@webassemblyjs/wasm-gen': 1.11.1 + dev: true /@webassemblyjs/helper-wasm-section@1.11.6: resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} @@ -9388,6 +9448,7 @@ packages: resolution: {integrity: sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==} dependencies: '@xtuc/ieee754': 1.2.0 + dev: true /@webassemblyjs/ieee754@1.11.6: resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} @@ -9398,6 +9459,7 @@ packages: resolution: {integrity: sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==} dependencies: '@xtuc/long': 4.2.2 + dev: true /@webassemblyjs/leb128@1.11.6: resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} @@ -9406,6 +9468,7 @@ packages: /@webassemblyjs/utf8@1.11.1: resolution: {integrity: sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==} + dev: true /@webassemblyjs/utf8@1.11.6: resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} @@ -9421,6 +9484,7 @@ packages: '@webassemblyjs/wasm-opt': 1.11.1 '@webassemblyjs/wasm-parser': 1.11.1 '@webassemblyjs/wast-printer': 1.11.1 + dev: true /@webassemblyjs/wasm-edit@1.11.6: resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} @@ -9442,6 +9506,7 @@ packages: '@webassemblyjs/ieee754': 1.11.1 '@webassemblyjs/leb128': 1.11.1 '@webassemblyjs/utf8': 1.11.1 + dev: true /@webassemblyjs/wasm-gen@1.11.6: resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} @@ -9459,6 +9524,7 @@ packages: '@webassemblyjs/helper-buffer': 1.11.1 '@webassemblyjs/wasm-gen': 1.11.1 '@webassemblyjs/wasm-parser': 1.11.1 + dev: true /@webassemblyjs/wasm-opt@1.11.6: resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} @@ -9477,6 +9543,7 @@ packages: '@webassemblyjs/ieee754': 1.11.1 '@webassemblyjs/leb128': 1.11.1 '@webassemblyjs/utf8': 1.11.1 + dev: true /@webassemblyjs/wasm-parser@1.11.6: resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} @@ -9493,6 +9560,7 @@ packages: dependencies: '@webassemblyjs/ast': 1.11.1 '@xtuc/long': 4.2.2 + dev: true /@webassemblyjs/wast-printer@1.11.6: resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} @@ -9509,6 +9577,7 @@ packages: dependencies: webpack: 5.78.0(webpack-cli@5.0.1) webpack-cli: 5.0.1(@webpack-cli/generators@3.0.1)(webpack@5.78.0) + dev: true /@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.88.2): resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} @@ -9542,6 +9611,7 @@ packages: - mem-fs - mem-fs-editor - supports-color + dev: true /@webpack-cli/generators@3.0.7(mem-fs-editor@9.7.0)(mem-fs@2.3.0)(prettier@2.8.7)(webpack-cli@5.1.4)(webpack@5.88.2): resolution: {integrity: sha512-H4dlEX8CzO5EHBYYZQop9x4w6lG9FenSF/1spLRlvRAULDgTs0VfmwOuwp03tTLml9jpMsouuVw6vEN8KpwE/w==} @@ -9575,6 +9645,7 @@ packages: dependencies: webpack: 5.78.0(webpack-cli@5.0.1) webpack-cli: 5.0.1(@webpack-cli/generators@3.0.1)(webpack@5.78.0) + dev: true /@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.88.2): resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} @@ -9599,6 +9670,7 @@ packages: dependencies: webpack: 5.78.0(webpack-cli@5.0.1) webpack-cli: 5.0.1(@webpack-cli/generators@3.0.1)(webpack@5.78.0) + dev: true /@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.88.2): resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} @@ -9658,6 +9730,7 @@ packages: acorn: ^8 dependencies: acorn: 8.8.2 + dev: true /acorn-import-assertions@1.9.0(acorn@8.8.2): resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} @@ -10304,7 +10377,7 @@ packages: loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.88.2(webpack-cli@5.1.4) dev: false /babel-loader@9.1.3(@babel/core@7.21.4)(webpack@5.78.0): @@ -11318,6 +11391,7 @@ packages: /commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} + dev: true /common-ancestor-path@1.0.1: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} @@ -11567,6 +11641,25 @@ packages: readable-stream: 3.6.2 dev: true + /create-jest@29.7.0(@types/node@16.11.6)(ts-node@10.9.1): + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@16.11.6)(ts-node@10.9.1) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + /create-jest@29.7.0(@types/node@16.18.23)(ts-node@10.8.2): resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -11703,7 +11796,7 @@ packages: postcss-modules-values: 4.0.0(postcss@8.4.31) postcss-value-parser: 4.2.0 semver: 7.5.4 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.88.2(webpack-cli@5.1.4) dev: false /css-minimizer-webpack-plugin@3.4.1(webpack@5.88.2): @@ -11731,7 +11824,7 @@ packages: schema-utils: 4.0.0 serialize-javascript: 6.0.1 source-map: 0.6.1 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.88.2(webpack-cli@5.1.4) dev: false /css-modules-loader-core@1.1.0: @@ -12598,6 +12691,7 @@ packages: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 + dev: true /enhanced-resolve@5.13.0: resolution: {integrity: sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==} @@ -12724,6 +12818,7 @@ packages: /es-module-lexer@0.9.3: resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} + dev: true /es-module-lexer@1.2.1: resolution: {integrity: sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==} @@ -13482,7 +13577,7 @@ packages: micromatch: 4.0.5 normalize-path: 3.0.0 schema-utils: 4.0.0 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.88.2(webpack-cli@5.1.4) dev: false /eslint@8.24.0: @@ -13731,11 +13826,11 @@ packages: resolution: {integrity: sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/expect-utils': 29.5.0 - jest-get-type: 29.4.3 - jest-matcher-utils: 29.5.0 - jest-message-util: 29.5.0 - jest-util: 29.5.0 + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 dev: true /expect@29.7.0: @@ -13951,7 +14046,7 @@ packages: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.88.2(webpack-cli@5.1.4) dev: false /file-uri-to-path@1.0.0: @@ -14173,7 +14268,7 @@ packages: semver: 7.5.4 tapable: 1.1.3 typescript: 4.9.5 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.88.2(webpack-cli@5.1.4) dev: false /form-data@3.0.1: @@ -14937,7 +15032,7 @@ packages: lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.88.2(webpack-cli@5.1.4) dev: false /htmlencode@0.0.4: @@ -15985,6 +16080,34 @@ packages: - ts-node dev: true + /jest-cli@29.7.0(@types/node@16.11.6)(ts-node@10.9.1): + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.1) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@16.11.6)(ts-node@10.9.1) + exit: 0.1.2 + import-local: 3.1.0 + jest-config: 29.7.0(@types/node@16.11.6)(ts-node@10.9.1) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.1 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + /jest-cli@29.7.0(@types/node@16.18.23)(ts-node@10.8.2): resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -16162,6 +16285,47 @@ packages: - supports-color dev: true + /jest-config@29.7.0(@types/node@16.11.6)(ts-node@10.9.1): + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.21.4 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 16.11.6 + babel-jest: 29.7.0(@babel/core@7.21.4) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.9.1(@types/node@16.11.6)(typescript@4.9.5) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + /jest-config@29.7.0(@types/node@16.18.23)(ts-node@10.8.2): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -16243,6 +16407,47 @@ packages: - babel-plugin-macros - supports-color + /jest-config@29.7.0(@types/node@18.15.11)(ts-node@10.9.1): + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.21.4 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.15.11 + babel-jest: 29.7.0(@babel/core@7.21.4) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.9.1(@types/node@16.11.6)(typescript@4.9.5) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + /jest-diff@27.5.1: resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -16387,11 +16592,6 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dev: true - /jest-get-type@29.4.3: - resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - /jest-get-type@29.6.3: resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -16540,16 +16740,6 @@ packages: pretty-format: 28.1.3 dev: true - /jest-matcher-utils@29.5.0: - resolution: {integrity: sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - dev: true - /jest-matcher-utils@29.7.0: resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -16588,21 +16778,6 @@ packages: slash: 3.0.0 stack-utils: 2.0.6 - /jest-message-util@29.5.0: - resolution: {integrity: sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/code-frame': 7.22.13 - '@jest/types': 29.6.3 - '@types/stack-utils': 2.0.1 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.5 - pretty-format: 29.7.0 - slash: 3.0.0 - stack-utils: 2.0.6 - dev: true - /jest-message-util@29.7.0: resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -17466,6 +17641,27 @@ packages: - ts-node dev: true + /jest@29.7.0(@types/node@16.11.6)(ts-node@10.9.1): + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.1) + '@jest/types': 29.6.3 + import-local: 3.1.0 + jest-cli: 29.7.0(@types/node@16.11.6)(ts-node@10.9.1) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + /jest@29.7.0(@types/node@18.15.11)(ts-node@10.8.2): resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -17878,7 +18074,7 @@ packages: dependencies: klona: 2.0.6 less: 4.1.3 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.88.2(webpack-cli@5.1.4) dev: true /less@4.1.3: @@ -18535,7 +18731,7 @@ packages: webpack: ^5.0.0 dependencies: schema-utils: 4.0.0 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.88.2(webpack-cli@5.1.4) dev: false /minimalistic-assert@1.0.1: @@ -20754,7 +20950,7 @@ packages: klona: 2.0.6 postcss: 8.4.30 semver: 7.5.4 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.88.2(webpack-cli@5.1.4) dev: false /postcss-logical@5.0.4(postcss@8.4.30): @@ -21956,7 +22152,7 @@ packages: dependencies: loader-utils: 2.0.4 schema-utils: 3.1.1 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.88.2(webpack-cli@5.1.4) dev: true /rc-align@4.0.15(react-dom@18.2.0)(react@18.2.0): @@ -22546,7 +22742,7 @@ packages: strip-ansi: 6.0.1 text-table: 0.2.0 typescript: 4.9.5 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.88.2(webpack-cli@5.1.4) transitivePeerDependencies: - eslint - supports-color @@ -22701,7 +22897,7 @@ packages: tailwindcss: 3.3.1(postcss@8.4.30)(ts-node@10.8.2) terser-webpack-plugin: 5.3.7(webpack@5.88.2) typescript: 4.9.5 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.88.2(webpack-cli@5.1.4) webpack-dev-server: 4.13.2(webpack@5.88.2) webpack-manifest-plugin: 4.1.1(webpack@5.88.2) workbox-webpack-plugin: 6.5.4(webpack@5.88.2) @@ -23404,7 +23600,7 @@ packages: dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.88.2(webpack-cli@5.1.4) dev: false /sax@1.2.4: @@ -23454,6 +23650,7 @@ packages: '@types/json-schema': 7.0.11 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) + dev: true /schema-utils@3.3.0: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} @@ -23773,7 +23970,7 @@ packages: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.0.2 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.88.2(webpack-cli@5.1.4) dev: false /source-map-support@0.5.13: @@ -24222,7 +24419,7 @@ packages: peerDependencies: webpack: ^5.0.0 dependencies: - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.88.2(webpack-cli@5.1.4) dev: false /styled-jsx@5.1.1(@babel/core@7.21.4)(react@18.2.0): @@ -24570,6 +24767,7 @@ packages: serialize-javascript: 6.0.1 terser: 5.19.4 webpack: 5.78.0(webpack-cli@5.0.1) + dev: true /terser-webpack-plugin@5.3.7(webpack@5.88.2): resolution: {integrity: sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==} @@ -24901,6 +25099,40 @@ packages: yargs-parser: 21.1.1 dev: true + /ts-jest@29.1.1(@babel/core@7.21.4)(jest@29.7.0)(typescript@4.9.5): + resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@babel/core': 7.21.4 + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@16.11.6)(ts-node@10.9.1) + jest-util: 29.5.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.5.4 + typescript: 4.9.5 + yargs-parser: 21.1.1 + dev: true + /ts-jest@29.1.1(@babel/core@7.21.4)(jest@29.7.0)(typescript@5.2.2): resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -25847,6 +26079,7 @@ packages: rechoir: 0.8.0 webpack: 5.78.0(webpack-cli@5.0.1) webpack-merge: 5.8.0 + dev: true /webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.88.2): resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} @@ -25892,7 +26125,7 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.0.0 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.88.2(webpack-cli@5.1.4) dev: false /webpack-dev-server@4.13.2(webpack@5.88.2): @@ -25936,7 +26169,7 @@ packages: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.88.2(webpack-cli@5.1.4) webpack-dev-middleware: 5.3.3(webpack@5.88.2) ws: 8.13.0 transitivePeerDependencies: @@ -25953,7 +26186,7 @@ packages: webpack: ^4.44.2 || ^5.47.0 dependencies: tapable: 2.2.1 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.88.2(webpack-cli@5.1.4) webpack-sources: 2.3.1 dev: false @@ -26022,6 +26255,7 @@ packages: - '@swc/core' - esbuild - uglify-js + dev: true /webpack@5.88.2(webpack-cli@5.0.1): resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} @@ -26062,6 +26296,7 @@ packages: - '@swc/core' - esbuild - uglify-js + dev: true /webpack@5.88.2(webpack-cli@5.1.4): resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} @@ -26374,7 +26609,7 @@ packages: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.88.2(webpack-cli@5.1.4) webpack-sources: 1.4.3 workbox-build: 6.5.4 transitivePeerDependencies: diff --git a/services/rotor/.gitignore b/services/rotor/.gitignore index fb5e6cf40..cdd602b1c 100644 --- a/services/rotor/.gitignore +++ b/services/rotor/.gitignore @@ -1,2 +1,3 @@ /compiled/ /dist/ +/__tests__/artifacts/ diff --git a/services/rotor/__tests__/inmem-store.test.ts b/services/rotor/__tests__/inmem-store.test.ts new file mode 100644 index 000000000..ace1dc0e9 --- /dev/null +++ b/services/rotor/__tests__/inmem-store.test.ts @@ -0,0 +1,58 @@ +import { createInMemoryStore } from "../src/lib/inmem-store"; +import { expect } from "@playwright/test"; +import { getLog } from "juava"; +import { reject } from "lodash"; +import * as path from "path"; + +const log = getLog("inmem-store-test"); +test("Test in-mem store", async () => { + const artifactsDir = path.join(__dirname, "artifacts"); + const cacheDir = path.join(artifactsDir, "in-mem-store"); + const loader = () => { + return new Promise(resolve => setTimeout(() => resolve(new Date()), 300)); + }; + const badLoader = () => { + return new Promise((resolve, reject) => setTimeout(() => reject(new Error("")), 300)); + }; + + const store = createInMemoryStore({ + name: "test", + refresh: loader, + refreshIntervalMillis: 200, + localDir: cacheDir, + }); + + try { + expect(store.getCurrent()).toBeUndefined(); + expect(store.status()).toBe("initializing"); + expect(await store.get()).toBeDefined(); + expect(store.status()).toBe("ok"); + expect(store.getCurrent()).toBeDefined(); + + const date1 = await store.get(); + log.atInfo().log(`Date1: ${date1.toISOString()}`); + await new Promise(resolve => setTimeout(resolve, 1000)); + const date2 = await store.get(); + log.atInfo().log(`Date2: ${date2.toISOString()}`); + expect(date1.getTime() < date2.getTime()).toBeTruthy(); + } finally { + store.stop(); + } + log.atInfo().log("Testing bad store"); + const badStore = createInMemoryStore({ + name: "test", + refresh: badLoader, + refreshIntervalMillis: 200, + localDir: cacheDir, + }); + + try { + expect(badStore.getCurrent()).toBeUndefined(); + expect(badStore.status()).toBe("initializing"); + expect(await badStore.get()).toBeDefined(); + expect(badStore.status()).toBe("outdated"); + expect(badStore.getCurrent()).toBeDefined(); + } finally { + badStore.stop(); + } +}, 10000); diff --git a/services/rotor/jest.config.js b/services/rotor/jest.config.js new file mode 100644 index 000000000..de6e6d30e --- /dev/null +++ b/services/rotor/jest.config.js @@ -0,0 +1,9 @@ +/** @type {import("ts-jest").JestConfigWithTsJest} */ +module.exports = { + //preset: "ts-jest", + preset: "ts-jest", + testMatch: ["**/__tests__/**/*.test.ts"], + testEnvironment: "node", + runner: "jest-runner", + "setupFiles": ["./jest.setup.js"] +}; diff --git a/services/rotor/jest.setup.js b/services/rotor/jest.setup.js new file mode 100644 index 000000000..fa6ee7ee1 --- /dev/null +++ b/services/rotor/jest.setup.js @@ -0,0 +1,8 @@ +process.env.JUAVA_LOG_LEVEL = 'debug'; +global.console = { + log: message => process.stdout.write(message + '\n'), + error: console.error, + warn: console.warn, + info: console.info, + debug: console.debug, +}; diff --git a/services/rotor/package.json b/services/rotor/package.json index b3c5b657a..371fb4bf4 100644 --- a/services/rotor/package.json +++ b/services/rotor/package.json @@ -13,40 +13,38 @@ "bundle_extenals": "cp dist_package.json ./dist/package.json && cd ./dist/ && npm install", "build": "pnpm compile && webpack && cp ../../webapps/console/prisma/schema.prisma ./dist/schema.prisma && pnpm bundle_extenals", "start": "dotenv -e ../../.env.local -- node dist/main.js", - "rotor:dev": "dotenv -e ../../.env.local -- nodemon --watch \"src/**\" --ext \"ts,json,tsx\" --exec \"ts-node src/index.ts\"" + "rotor:dev": "dotenv -e ../../.env.local -- nodemon --watch \"src/**\" --ext \"ts,json,tsx\" --exec \"ts-node src/index.ts\"", + "test": "tsc -p . && jest --verbose" }, "dependencies": { - "@maxmind/geoip2-node": "4.2.0", - "tar": "^6.2.0", - "p-queue": "^6.6.2", - "object-hash": "^3.0.0", - "prom-client": "^14.2.0", - "node-cache": "^5.1.2", "@amplitude/ua-parser-js": "^0.7.33", "@jitsu-internal/console": "workspace:*", "@jitsu/core-functions": "workspace:*", "@jitsu/functions-lib": "workspace:*", - "juava": "workspace:*", + "@maxmind/geoip2-node": "4.2.0", + "@sensejs/kafkajs-zstd-support": "^0.11.0", + "dayjs": "^1.11.10", "express": "^4.18.2", "glob": "^8.0.3", - "dayjs": "^1.11.10", "ioredis": "^5.3.2", "json-grab": "0.1.0-alpha.2", "json5": "^2.1.0", - "minimist": "^1.2.7", - "node-fetch-commonjs": "^3.3.1", - "tslib": "^2.4.0", + "juava": "workspace:*", "kafkajs": "^2.2.4", "kafkajs-snappy": "^1.1.0", - "@sensejs/kafkajs-zstd-support": "^0.11.0" + "minimist": "^1.2.7", + "node-cache": "^5.1.2", + "node-fetch-commonjs": "^3.3.1", + "object-hash": "^3.0.0", + "p-queue": "^6.6.2", + "prom-client": "^14.2.0", + "tar": "^6.2.0", + "tslib": "^2.4.0" }, "devDependencies": { - "@types/lodash": "^4.14.200", - "lodash": "^4.17.21", - "node-loader": "^2.0.0", "@babel/preset-env": "^7.23.2", - "@babel/preset-typescript": "^7.23.2", "@babel/preset-react": "^7.22.15", + "@babel/preset-typescript": "^7.23.2", "@jitsu/protocols": "workspace:*", "@rollup/plugin-babel": "^6.0.4", "@rollup/plugin-commonjs": "^23.0.2", @@ -56,6 +54,8 @@ "@rollup/plugin-terser": "^0.1.0", "@rollup/plugin-typescript": "^9.0.2", "@types/glob": "^8.0.0", + "@types/jest": "^29.5.11", + "@types/lodash": "^4.14.200", "@types/minimist": "^1.2.2", "@types/node": "16.11.6", "@types/web": "0.0.69", @@ -66,8 +66,12 @@ "copy-webpack-plugin": "^11.0.0", "declaration-bundler-webpack-plugin": "^1.0.3", "dotenv-cli": "^6.0.0", + "jest": "^29.7.0", + "lodash": "^4.17.21", + "node-loader": "^2.0.0", "nodemon": "^2.0.20", "rollup": "^3.2.5", + "ts-jest": "^29.1.1", "ts-loader": "^9.4.2", "ts-node": "~10.9.1", "typescript": "^4.9.3", diff --git a/services/rotor/src/lib/inmem-store.ts b/services/rotor/src/lib/inmem-store.ts new file mode 100644 index 000000000..b77831399 --- /dev/null +++ b/services/rotor/src/lib/inmem-store.ts @@ -0,0 +1,146 @@ +import { getErrorMessage, getLog } from "juava"; +import fs from "fs"; +import path from "path"; + +export type StoreDefinition = { + refreshIntervalMillis: number; + name: string; + refresh: () => Promise; + serializer?: (arg: T) => string; + deserializer?: (arg: string) => T; + localDir?: string; +}; + +const log = getLog("inmem-store"); + +type Status = "ok" | "initializing" | "outdated" | "failed" | "stopped"; +export type InMemoryStore = { + status(): Status; + get(): Promise; + getCurrent(): T | undefined; + lastRefresh(): Date | undefined; + stop(): void; +}; + +function saveLocalCache(definition: StoreDefinition, instance: any) { + if (definition.localDir) { + fs.mkdirSync(definition.localDir, { recursive: true }); + const serialized = definition.serializer ? definition.serializer(instance) : JSON.stringify(instance); + const cacheFile = path.join(definition.localDir, `${definition.name}-latest.json`); + fs.writeFile(cacheFile, serialized, err => { + if (err) { + log.atWarn().withCause(err).log(`Failed to save local cache for ${definition.name}`); + } + }); + } +} + +function loadFromCache(definition: StoreDefinition): { updateDate: Date; instance: any } | undefined { + if (definition.localDir) { + const cacheFile = path.join(definition.localDir, `${definition.name}-latest.json`); + try { + const cached = JSON.parse(fs.readFileSync(cacheFile).toString()); + return { + updateDate: new Date(fs.statSync(cacheFile).mtime), + instance: definition.deserializer ? definition.deserializer(cached) : cached, + }; + } catch (e) { + log.atWarn().withCause(e).log(`Failed to load local cache for ${definition.name}`); + } + } else { + log.atWarn().log(`Local cache is not configured for ${definition.name}`); + } +} + +export const createInMemoryStore = (definition: StoreDefinition): InMemoryStore => { + let status: Status = "initializing"; + let instance: T | undefined = undefined; + let lastRefresh: Date | undefined = undefined; + let stopping: boolean = false; + let intervalToClear: NodeJS.Timeout | undefined = undefined; + + function scheduleStoreRefresh() { + intervalToClear = setInterval(async () => { + if (stopping) { + return; + } + try { + instance = await definition.refresh(); + saveLocalCache(definition, instance); + status = "ok"; + lastRefresh = new Date(); + } catch (e) { + log.atWarn().withCause(e).log(`Failed to refresh store ${definition.name}. Using an old value`); + status = "outdated"; + } + }, definition.refreshIntervalMillis); + } + + let instancePromise = new Promise((resolve, reject) => { + definition + .refresh() + .then(res => { + instance = res; + saveLocalCache(definition, res); + status = "ok"; + lastRefresh = new Date(); + log.atInfo().log(`Initial version of store ${definition.name} has been loaded`); + scheduleStoreRefresh(); + + resolve(res); + }) + .catch(e => { + log + .atWarn() + .withCause(e) + .log(`Failed to initialize store ${definition.name}. Attempting to load from local cache`); + const cachedInstance = loadFromCache(definition); + if (!cachedInstance) { + status = "failed"; + reject( + new Error( + `Failed to initialize store ${definition.name}. Initial load failed with ${getErrorMessage( + e + )} and no local cache found` + ) + ); + } else { + log + .atWarn() + .log( + `Initial store update failed, see errors above. Serving local cache of store ${ + definition.name + } updated at ${cachedInstance.updateDate.toISOString()}` + ); + instance = cachedInstance.instance; + lastRefresh = cachedInstance.updateDate; + status = "outdated"; + scheduleStoreRefresh(); + resolve(cachedInstance.instance); + } + }); + }); + return { + get() { + if (instance) { + return Promise.resolve(instance); + } + return instancePromise; + }, + getCurrent() { + return instance; + }, + status: () => status, + lastRefresh: () => lastRefresh, + stop: () => { + log.atInfo().log(`Stopping store ${definition.name}`); + stopping = true; + if (intervalToClear) { + clearInterval(intervalToClear); + } else { + log.atError().log(`There's no interval for ${definition.name}`); + } + status = "stopped"; + }, + }; +}; From b4a2dc90308add6b2d273ce05d818c2bc8568a05 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 20 Dec 2023 09:20:08 +0400 Subject: [PATCH 0431/1353] console: fast-store don't store streams related collection to redis --- services/rotor/src/lib/maxmind.ts | 2 +- webapps/console/lib/server/fast-store.ts | 142 +++++++++++------------ 2 files changed, 72 insertions(+), 72 deletions(-) diff --git a/services/rotor/src/lib/maxmind.ts b/services/rotor/src/lib/maxmind.ts index 33ae7a307..880251edb 100644 --- a/services/rotor/src/lib/maxmind.ts +++ b/services/rotor/src/lib/maxmind.ts @@ -181,7 +181,7 @@ export async function initMaxMindClient(licenseKey: string): Promise> = {}; - const noDomainKey = "no-domain"; - const addStreamByDomain = ( - streamConfig: StreamConfig, - destinationsBuffer: ShortDestinationConfig[], - backupEnabled: boolean - ) => { - for (const domain of streamConfig.domains?.length ? streamConfig.domains : [noDomainKey]) { - let streams = streamsByDomain[domain.toLowerCase()]; - const stream = createStreamWithDestinations(streamConfig, destinationsBuffer, backupEnabled); - streams = streams ? { ...streams, [stream.stream.id]: stream } : { [stream.stream.id]: stream }; - streamsByDomain[domain.toLowerCase()] = streams; - } - }; - //to make sure we have all the streams in redis (even with no destinations) fill the buffer with all the streams first - await selectConfigObjectRows("stream", db, async row => { - const obj = ConfigurationObjectDbModel.parse(prefixedWith(row, "obj_")); - const streamConfig = flatten(obj); - addStreamByDomain(streamConfig, [], row.backupEnabled); - }); + //let destinationsBuffer: ShortDestinationConfig[] = []; + //let lastStreamConfig: StreamConfig | undefined = undefined; + //let lastBackupEnabled: boolean = false; + //let streamsByDomain: Record> = {}; + //const noDomainKey = "no-domain"; + // const addStreamByDomain = ( + // streamConfig: StreamConfig, + // destinationsBuffer: ShortDestinationConfig[], + // backupEnabled: boolean + // ) => { + // for (const domain of streamConfig.domains?.length ? streamConfig.domains : [noDomainKey]) { + // let streams = streamsByDomain[domain.toLowerCase()]; + // const stream = createStreamWithDestinations(streamConfig, destinationsBuffer, backupEnabled); + // streams = streams ? { ...streams, [stream.stream.id]: stream } : { [stream.stream.id]: stream }; + // streamsByDomain[domain.toLowerCase()] = streams; + // } + // }; + // // to make sure we have all the streams in redis (even with no destinations) fill the buffer with all the streams first + // await selectConfigObjectRows("stream", db, async row => { + // const obj = ConfigurationObjectDbModel.parse(prefixedWith(row, "obj_")); + // const streamConfig = flatten(obj); + // addStreamByDomain(streamConfig, [], row.backupEnabled); + // }); await db.pgHelper().streamQuery(query, async row => { const workspaceId = row.workspaceId; const linkId = row.id; @@ -347,53 +347,53 @@ async function saveConnectionsToRedis(db: DatabaseConnection) { backupDestCreated[row.workspaceId] = true; } - // when we reach new stream, we need to save destinationsBuffer for the previous stream - if (lastStreamConfig && streamConfig.id !== lastStreamConfig.id) { - addStreamByDomain(lastStreamConfig, destinationsBuffer, row.backupEnabled); - destinationsBuffer = []; - } - destinationsBuffer.push(destinationConfig); - lastStreamConfig = streamConfig; - lastBackupEnabled = row.backupEnabled; + // // when we reach new stream, we need to save destinationsBuffer for the previous stream + // if (lastStreamConfig && streamConfig.id !== lastStreamConfig.id) { + // addStreamByDomain(lastStreamConfig, destinationsBuffer, row.backupEnabled); + // destinationsBuffer = []; + // } + // destinationsBuffer.push(destinationConfig); + // lastStreamConfig = streamConfig; + // lastBackupEnabled = row.backupEnabled; }); - // save the last stream - if (lastStreamConfig) { - addStreamByDomain(lastStreamConfig, destinationsBuffer, lastBackupEnabled); - } - for (const [domain, streamDsts] of Object.entries(streamsByDomain)) { - //store array of StreamWithDestinations by domain - await redis().hset(domainsRedisKey.tmp(), domain.toLowerCase(), JSON.stringify(Object.values(streamDsts))); - - for (const id in streamDsts) { - const strm = streamDsts[id]; - //store each StreamWithDestinations by stream id separately - await redis().hset(idsRedisKey.tmp(), id, JSON.stringify(strm)); - - await Promise.all( - (strm.stream.publicKeys ?? []) - .filter(k => !!k.hash) - .map(k => - redis().hset( - apiKeys.tmp(), - k.id, - JSON.stringify({ hash: k.hash as string, streamId: id, keyType: "browser" }) - ) - ) - ); - await Promise.all( - (strm.stream.privateKeys ?? []) - .filter(k => !!k.hash) - .map(k => - redis().hset(apiKeys.tmp(), k.id, JSON.stringify({ hash: k.hash as string, streamId: id, keyType: "s2s" })) - ) - ); - } - } - - await apiKeys.rename(redis()); - await idsRedisKey.rename(redis()); - await domainsRedisKey.rename(redis()); + // // save the last stream + // if (lastStreamConfig) { + // addStreamByDomain(lastStreamConfig, destinationsBuffer, lastBackupEnabled); + // } + // for (const [domain, streamDsts] of Object.entries(streamsByDomain)) { + // //store array of StreamWithDestinations by domain + // await redis().hset(domainsRedisKey.tmp(), domain.toLowerCase(), JSON.stringify(Object.values(streamDsts))); + // + // for (const id in streamDsts) { + // const strm = streamDsts[id]; + // //store each StreamWithDestinations by stream id separately + // await redis().hset(idsRedisKey.tmp(), id, JSON.stringify(strm)); + // + // await Promise.all( + // (strm.stream.publicKeys ?? []) + // .filter(k => !!k.hash) + // .map(k => + // redis().hset( + // apiKeys.tmp(), + // k.id, + // JSON.stringify({ hash: k.hash as string, streamId: id, keyType: "browser" }) + // ) + // ) + // ); + // await Promise.all( + // (strm.stream.privateKeys ?? []) + // .filter(k => !!k.hash) + // .map(k => + // redis().hset(apiKeys.tmp(), k.id, JSON.stringify({ hash: k.hash as string, streamId: id, keyType: "s2s" })) + // ) + // ); + // } + // } + + // await apiKeys.rename(redis()); + // await idsRedisKey.rename(redis()); + // await domainsRedisKey.rename(redis()); await bulkerRedisKey.rename(redis()); } From f870754138bc96fefd66457cc048723494907cd5 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 20 Dec 2023 10:09:01 +0400 Subject: [PATCH 0432/1353] console: dummy commit --- webapps/console/lib/server/fast-store.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/webapps/console/lib/server/fast-store.ts b/webapps/console/lib/server/fast-store.ts index 4ea3b0ac2..ec5befe5c 100644 --- a/webapps/console/lib/server/fast-store.ts +++ b/webapps/console/lib/server/fast-store.ts @@ -282,6 +282,7 @@ async function saveConnectionsToRedis(db: DatabaseConnection) { // const streamConfig = flatten(obj); // addStreamByDomain(streamConfig, [], row.backupEnabled); // }); + await db.pgHelper().streamQuery(query, async row => { const workspaceId = row.workspaceId; const linkId = row.id; From f13d2213779de28ae69879e42778aa022453862a Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 20 Dec 2023 13:05:49 +0400 Subject: [PATCH 0433/1353] mixpanel-destination: fix for deviceId format mixpanel-destination: assume deviceId from ip, traits... when there is no anonymousId in event --- .../src/functions/mixpanel-destination.ts | 62 +++++++++++++++---- 1 file changed, 49 insertions(+), 13 deletions(-) diff --git a/libs/core-functions/src/functions/mixpanel-destination.ts b/libs/core-functions/src/functions/mixpanel-destination.ts index dcb14aebd..33ef3102b 100644 --- a/libs/core-functions/src/functions/mixpanel-destination.ts +++ b/libs/core-functions/src/functions/mixpanel-destination.ts @@ -1,7 +1,7 @@ import { FullContext, JitsuFunction } from "@jitsu/protocols/functions"; import { RetryError } from "@jitsu/functions-lib"; import type { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; -import { randomId } from "juava"; +import { randomId, hash } from "juava"; import { MixpanelCredentials } from "../meta"; import { eventTimeSafeMs } from "./lib"; @@ -41,7 +41,13 @@ function evict(obj: Record, key: string) { return val; } -function trackEvent(ctx: FullContext, distinctId: string, eventType: string, event: AnalyticsServerEvent): HttpRequest { +function trackEvent( + ctx: FullContext, + deviceId: string, + distinctId: string, + eventType: string, + event: AnalyticsServerEvent +): HttpRequest { const opts = ctx.props as MixpanelCredentials; const traits = { ...(event.traits || event.context?.traits || {}) }; specialProperties.forEach(prop => { @@ -76,7 +82,7 @@ function trackEvent(ctx: FullContext, distinctId: string, eventType: string, eve properties: { ip: event.context?.ip || event.requestIp, time: eventTimeSafeMs(event), - $device_id: `${event.anonymousId}`, + $device_id: deviceId, distinct_id: distinctId, $insert_id: event.messageId + "-" + randomId(), $user_id: event.userId ? `${event.userId}` : undefined, @@ -254,23 +260,53 @@ function alias(ctx: FullContext, messageId: string, identifiedId: string, anonym ]; } -function getDistinctId(ctx: FullContext, event: AnalyticsServerEvent) { +function getDistinctId(ctx: FullContext, event: AnalyticsServerEvent, deviceId: string) { if (ctx.props.simplifiedIdMerge) { - return event.userId ? `${event.userId}` : `$device:${event.anonymousId}`; + return event.userId ? `${event.userId}` : `$device:${deviceId}`; } else { - return `${(event.userId || event.traits?.email || event.context?.traits?.email || event.anonymousId) ?? ""}`; + return `${(event.userId || event.traits?.email || event.context?.traits?.email || deviceId) ?? ""}`; } } +function getDeviceId(ctx: FullContext, event: AnalyticsServerEvent) { + let deviceId = event.anonymousId; + if ( + !deviceId || + deviceId === "undefined" || + deviceId === "unknown" || + deviceId === "00000000-0000-0000-0000-000000000000" + ) { + const traits = event.traits || event.context?.traits; + const id = `${event.userId ?? ""}${event.context.ip ? `${event.context.ip}${event.context.userAgent ?? ""}` : ""}${ + traits ? JSON.stringify(traits) : "" + }`; + if (id) { + deviceId = hash("sha256", id); + } + } else { + if (typeof deviceId === "number") { + return `${deviceId}`; + } + if (typeof deviceId !== "string") { + deviceId = `${JSON.stringify(deviceId)}`; + } + if (deviceId.length > 250) { + deviceId = hash("sha256", deviceId); + } + } + return deviceId; +} + const MixpanelDestination: JitsuFunction = async (event, ctx) => { ctx.log.debug(`Mixpanel destination (props=${JSON.stringify(ctx.props)}) received event ${JSON.stringify(event)}`); - const distinctId = getDistinctId(ctx, event); - if (!distinctId) { + const deviceId = getDeviceId(ctx, event); + if (!deviceId) { ctx.log.warn( - `No distinctId can be assumed in event with messageId: ${event.messageId}. 'anonymousId' is missing. Skipping...` + `No anonymousId and there is no way to assume anonymous id from event: at least context.ip or any user trait is required. Skipping.` ); return; } + const distinctId = getDistinctId(ctx, event, deviceId); // no userId or email const isAnonymous = event.anonymousId && distinctId.endsWith(event.anonymousId); if (isAnonymous && !ctx.props.enableAnonymousUserProfiles) { @@ -279,7 +315,7 @@ const MixpanelDestination: JitsuFunction Date: Wed, 20 Dec 2023 13:11:49 +0400 Subject: [PATCH 0434/1353] rotor: don't put fetch logs to errors collection --- libs/core-functions/src/context.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/core-functions/src/context.ts b/libs/core-functions/src/context.ts index eb8049232..7df0459b0 100644 --- a/libs/core-functions/src/context.ts +++ b/libs/core-functions/src/context.ts @@ -54,14 +54,14 @@ export function createFullContext( err.message = `Fetch request exceeded timeout ${timeout}ms and was aborted`; } if (logToRedis) { - eventsStore.log(connectionId, true, { ...baseInfo, error: getErrorMessage(err), elapsedMs: sw.elapsedMs() }); + eventsStore.log(connectionId, false, { ...baseInfo, error: getErrorMessage(err), elapsedMs: sw.elapsedMs() }); } throw err; } //clone response to be able to read it twice const cloned = fetchResult.clone(); if (logToRedis) { - eventsStore.log(connectionId, !fetchResult.ok, { + eventsStore.log(connectionId, false, { ...baseInfo, status: fetchResult.status, statusText: fetchResult.statusText, From 20874c9663d5ca5a43caa405ada0aa35e54d0114 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 20 Dec 2023 14:25:19 +0400 Subject: [PATCH 0435/1353] console: show fetch failed requests logs as warnings - since they will be retried --- webapps/console/components/DataView/EventsBrowser.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/components/DataView/EventsBrowser.tsx b/webapps/console/components/DataView/EventsBrowser.tsx index 6e9182312..80cb4536e 100644 --- a/webapps/console/components/DataView/EventsBrowser.tsx +++ b/webapps/console/components/DataView/EventsBrowser.tsx @@ -508,7 +508,7 @@ const FunctionsLogTable = ({ loadEvents, loading, streamType, entityType, actorI case "log-warn": return WARN; case "http-request": - return = 200 && d.status < 300 ? "cyan" : "red"}>{d.status ?? "ERROR"}; + return = 200 && d.status < 300 ? "cyan" : "orange"}>{d.status ?? "WARN"}; default: return {d.status}; } From 1cbb1550dd0586236e4db519302c4216e20407d6 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 20 Dec 2023 14:43:40 +0400 Subject: [PATCH 0436/1353] analytics-plugin: make sure that user traits or groups traits always returns object --- libs/jitsu-js/src/analytics-plugin.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/libs/jitsu-js/src/analytics-plugin.ts b/libs/jitsu-js/src/analytics-plugin.ts index 7b627b397..44b19312a 100644 --- a/libs/jitsu-js/src/analytics-plugin.ts +++ b/libs/jitsu-js/src/analytics-plugin.ts @@ -67,10 +67,16 @@ function restoreTraits(storage: PersistentStorage) { if (typeof val === "string") { val = safeCall(() => JSON.parse(val), {}); } + if (typeof val !== "object" || val === null) { + val = {}; + } let groupVal = storage.getItem("__group_traits"); if (typeof groupVal === "string") { groupVal = safeCall(() => JSON.parse(groupVal), {}); } + if (typeof groupVal !== "object" || groupVal === null) { + groupVal = {}; + } return { ...(groupVal || {}), ...(val || {}), //user traits override group traits @@ -619,7 +625,9 @@ const jitsuAnalyticsPlugin = (pluginConfig: JitsuPluginConfig = {}): AnalyticsPl // Store traits in cache to be able to use them in page and track events that run asynchronously with current identify. const storage = pluginConfig.storageWrapper ? pluginConfig.storageWrapper(instance.storage) : instance.storage; storage.setItem("__user_id", payload.userId); - storage.setItem("__user_traits", payload.traits); + if (payload.traits && typeof payload.traits === "object") { + storage.setItem("__user_traits", payload.traits); + } return send("identify", payload, config, instance, storage); }, reset: args => { From cd9841e6c56d866798080c25c1c94fecea0f6b94 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Wed, 20 Dec 2023 12:59:57 -0500 Subject: [PATCH 0437/1353] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f4b2afd24..7c1c2913b 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@

    👉Looking for Jitsu Classic? Switch to -classic branch, and read about Jitsu Classic and Jitsu Next differences +classic branch, and read about Jitsu Classic and Jitsu Next differences

    From 8ff62d73303cdee309bfb440ffc3223015b6402d Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Wed, 20 Dec 2023 13:27:29 -0500 Subject: [PATCH 0438/1353] github: automatically closed stale issues --- .github/workflows/close-stale-issues.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .github/workflows/close-stale-issues.yml diff --git a/.github/workflows/close-stale-issues.yml b/.github/workflows/close-stale-issues.yml new file mode 100644 index 000000000..2a6882029 --- /dev/null +++ b/.github/workflows/close-stale-issues.yml @@ -0,0 +1,23 @@ +name: Close inactive issues +on: + schedule: + - cron: "30 1 * * *" #once a day at 1:30am + +jobs: + close-issues: + runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write + steps: + - uses: actions/stale@v5 + with: + days-before-issue-stale: 30 + days-before-issue-close: 14 + stale-issue-label: "🕰️Stale" + exempt-issue-labels: "⏳Postpone" + stale-issue-message: "This issue is stale because it has been open for 30 days with no activity." + close-issue-message: "This issue was closed because it has been inactive for 14 days since being marked as stale." + days-before-pr-stale: -1 + days-before-pr-close: -1 + repo-token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file From 985563fa8113dcb020dafa492f72e30ba10d84c2 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Wed, 20 Dec 2023 14:05:58 -0500 Subject: [PATCH 0439/1353] fix: prettier --- .github/workflows/close-stale-issues.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/close-stale-issues.yml b/.github/workflows/close-stale-issues.yml index 2a6882029..83b7031e3 100644 --- a/.github/workflows/close-stale-issues.yml +++ b/.github/workflows/close-stale-issues.yml @@ -20,4 +20,4 @@ jobs: close-issue-message: "This issue was closed because it has been inactive for 14 days since being marked as stale." days-before-pr-stale: -1 days-before-pr-close: -1 - repo-token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file + repo-token: ${{ secrets.GITHUB_TOKEN }} From 79ef3f944a64cab59ff6c3e14c10ebb18d0d34a1 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Wed, 20 Dec 2023 14:08:00 -0500 Subject: [PATCH 0440/1353] ci: manual run trigger for close-stale-issues workflow --- .github/workflows/close-stale-issues.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/close-stale-issues.yml b/.github/workflows/close-stale-issues.yml index 83b7031e3..134fa7ba0 100644 --- a/.github/workflows/close-stale-issues.yml +++ b/.github/workflows/close-stale-issues.yml @@ -1,7 +1,9 @@ name: Close inactive issues -on: - schedule: - - cron: "30 1 * * *" #once a day at 1:30am +#on: +# schedule: +# - cron: "30 1 * * *" #once a day at 1:30am + +on: workflow_dispatch jobs: close-issues: From 4e85d757ba74ad97f7a636a5a66b6765e09652b3 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Wed, 20 Dec 2023 15:45:27 -0500 Subject: [PATCH 0441/1353] github: schedule autoclosing of issues --- .github/workflows/close-stale-issues.yml | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/.github/workflows/close-stale-issues.yml b/.github/workflows/close-stale-issues.yml index 134fa7ba0..b3b8a06ef 100644 --- a/.github/workflows/close-stale-issues.yml +++ b/.github/workflows/close-stale-issues.yml @@ -1,9 +1,7 @@ name: Close inactive issues -#on: -# schedule: -# - cron: "30 1 * * *" #once a day at 1:30am - -on: workflow_dispatch +on: + schedule: + - cron: "30 1 * * *" #once a day at 1:30am jobs: close-issues: @@ -14,8 +12,8 @@ jobs: steps: - uses: actions/stale@v5 with: - days-before-issue-stale: 30 - days-before-issue-close: 14 + days-before-issue-stale: 15 + days-before-issue-close: 15 stale-issue-label: "🕰️Stale" exempt-issue-labels: "⏳Postpone" stale-issue-message: "This issue is stale because it has been open for 30 days with no activity." From 6d2beaf0145c932150378a7a328d540f7803c6a2 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Wed, 20 Dec 2023 17:14:56 -0500 Subject: [PATCH 0442/1353] feat: get rid of vercel domains API, just check cname instead --- webapps/console/lib/ee-client.ts | 11 -- webapps/console/lib/server/custom-domains.ts | 39 +++++ webapps/console/lib/server/ee.ts | 10 -- .../lib/shared/domain-check-response.ts | 21 +++ .../console/pages/[workspaceId]/streams.tsx | 63 ++++---- .../pages/api/[workspaceId]/domain-check.ts | 63 ++++---- .../console/pages/api/admin/domains-report.ts | 59 ++++++++ webapps/ee-api/lib/vercel.ts | 41 ------ webapps/ee-api/pages/api/domain.ts | 136 ------------------ webapps/ee-api/pages/api/report/domains.ts | 95 ------------ 10 files changed, 185 insertions(+), 353 deletions(-) create mode 100644 webapps/console/lib/shared/domain-check-response.ts create mode 100644 webapps/console/pages/api/admin/domains-report.ts delete mode 100644 webapps/ee-api/lib/vercel.ts delete mode 100644 webapps/ee-api/pages/api/domain.ts delete mode 100644 webapps/ee-api/pages/api/report/domains.ts diff --git a/webapps/console/lib/ee-client.ts b/webapps/console/lib/ee-client.ts index e76fe0911..06240545d 100644 --- a/webapps/console/lib/ee-client.ts +++ b/webapps/console/lib/ee-client.ts @@ -1,5 +1,4 @@ import { get } from "./useApi"; -import { DomainStatus } from "./server/ee"; import * as auth from "firebase/auth"; export type ClassicProjectStatus = { @@ -11,7 +10,6 @@ export type ClassicProjectStatus = { }; export interface EeClient { - attachDomain(domain: string): Promise; checkClassicProject(): Promise; createCustomToken(): Promise; } @@ -39,15 +37,6 @@ export function getEeClient(host: string, workspaceId: string): EeClient { return cachedToken; }; return { - attachDomain: async domain => { - cachedToken = await refreshTokenIfNeeded(); - return await get(removeDoubleSlashes(`${host}/api/domain`), { - query: { domain }, - headers: { - Authorization: `Bearer ${cachedToken.token}`, - }, - }); - }, checkClassicProject: async () => { const fbToken = await auth.getAuth().currentUser?.getIdToken(); return await get(removeDoubleSlashes(`${host}/api/is-active`), { diff --git a/webapps/console/lib/server/custom-domains.ts b/webapps/console/lib/server/custom-domains.ts index fae3870ba..40cfcebe9 100644 --- a/webapps/console/lib/server/custom-domains.ts +++ b/webapps/console/lib/server/custom-domains.ts @@ -1,8 +1,12 @@ import { db } from "./db"; import { StreamConfig } from "../schema"; +import dns from "dns"; +import { getLog } from "juava"; type DomainAvailability = { available: true; usedInWorkspaces?: never } | { available: false; usedInWorkspace: string }; +export const customDomainCnames = process.env.CUSTOM_DOMAIN_CNAMES?.split(","); + /** * Tells if the given domain is used in other workspaces. */ @@ -26,3 +30,38 @@ export async function isDomainAvailable(domain: string, workspaceId: string): Pr return { available: true }; } } + +function resolveCname(domain: string): Promise { + return new Promise((resolve, reject) => { + dns.resolveCname(domain, (err, addresses) => { + if (err) { + reject(err); + } else { + if (addresses.length === 1) { + resolve(addresses[0]); + } else if (!addresses || addresses.length === 0) { + resolve(undefined); + } else { + getLog() + .atWarn() + .log(`Domain ${domain} has multiple CNAME records: ${addresses.join(", ")}. Using first one`); + resolve(addresses[0]); + } + } + }); + }); +} + +export async function isCnameValid(domain: string): Promise { + if (!customDomainCnames || customDomainCnames.length == 0) { + throw new Error(`CUSTOM_DOMAIN_CNAMES is not set. isCnameValid() should not be called`); + } + let cnameRecord: string | undefined; + try { + cnameRecord = await resolveCname(domain); + } catch (e) { + getLog().atError().withCause(e).log(`Domain ${domain} has no CNAME records`); + return false; + } + return !!(cnameRecord && customDomainCnames.includes(cnameRecord.toLowerCase())); +} diff --git a/webapps/console/lib/server/ee.ts b/webapps/console/lib/server/ee.ts index c9a16e3ca..b0d8761b8 100644 --- a/webapps/console/lib/server/ee.ts +++ b/webapps/console/lib/server/ee.ts @@ -45,13 +45,3 @@ export function createJwt( const token = jwt.sign({ userId, email, workspaceId, exp: expiresSecondsTimestamp }, jwtSecret); return { jwt: token, expiresAt: new Date(expiresSecondsTimestamp * 1000).toISOString() }; } - -export type DomainStatus = { error?: string } & ( - | { needsConfiguration: false } - | { needsConfiguration: true; configurationType: "cname"; cnameValue: string } - | { - needsConfiguration: true; - configurationType: "verification"; - verification: { type: string; domain: string; value: string }[]; - } -); diff --git a/webapps/console/lib/shared/domain-check-response.ts b/webapps/console/lib/shared/domain-check-response.ts new file mode 100644 index 000000000..c12cf86ee --- /dev/null +++ b/webapps/console/lib/shared/domain-check-response.ts @@ -0,0 +1,21 @@ +import { z } from "zod"; +import { Simplify } from "type-fest"; + +export const DomainCheckResponse = z.union([ + z.object({ + ok: z.literal(true), + reason: z.never().optional(), + }), + z.object({ + ok: z.literal(false), + reason: z.union([z.literal("used_by_other_workspace"), z.literal("invalid_domain_name")]), + cnameValue: z.never().optional(), + }), + z.object({ + ok: z.literal(false), + reason: z.literal("requires_cname_configuration"), + cnameValue: z.string().optional(), + }), +]); + +export type DomainCheckResponse = Simplify>; diff --git a/webapps/console/pages/[workspaceId]/streams.tsx b/webapps/console/pages/[workspaceId]/streams.tsx index 8829a12cb..08540cdba 100644 --- a/webapps/console/pages/[workspaceId]/streams.tsx +++ b/webapps/console/pages/[workspaceId]/streams.tsx @@ -15,7 +15,6 @@ import { getEeClient } from "../../lib/ee-client"; import { assertDefined, requireDefined } from "juava"; import { ReloadOutlined } from "@ant-design/icons"; import { confirmOp, feedbackError } from "../../lib/ui"; -import type { DomainStatus } from "../../lib/server/ee"; import { getAntdModal, useAntdModal } from "../../lib/modal"; import { get } from "../../lib/useApi"; import { Activity, AlertTriangle, Check, Globe, Wrench, Zap } from "lucide-react"; @@ -27,6 +26,7 @@ import { useLinksQuery } from "../../lib/queries"; import { toURL } from "../../lib/shared/url"; import JSON5 from "json5"; import { EditorToolbar } from "../../components/EditorToolbar/EditorToolbar"; +import { DomainCheckResponse } from "../../lib/shared/domain-check-response"; const Streams: React.FC = () => { return ( @@ -77,10 +77,10 @@ const CustomDomain: React.FC<{ domain: string; deleteDomain: () => Promise ); const [reloadTrigger, setReloadTrigger] = useState(0); const [deleting, setDeleting] = useState(false); - const { data, isLoading, error, refetch } = useQuery( + const { data, isLoading, error, refetch } = useQuery( ["domain-status", domain.toLowerCase(), reloadTrigger], async () => { - return await eeClient.attachDomain(domain); + return await get(`/api/${workspace.id}/domain-check?domain=${domain.toLowerCase()}`); }, { cacheTime: 0 } ); @@ -94,9 +94,7 @@ const CustomDomain: React.FC<{ domain: string; deleteDomain: () => Promise {/*

    */}
    {domain}
    @@ -113,14 +111,14 @@ const CustomDomain: React.FC<{ domain: string; deleteDomain: () => Promise - {data?.needsConfiguration && ( + {!data?.ok && (
    - {(error || data?.error) && ( + {error && (
    Description:
    -
    {`${data?.error || "Internal error"}`}
    +
    {`${"Internal error"}`}
    )} - {data?.needsConfiguration && ( + {!data?.ok && (
    Description:
    See{" "} DomainConfigurationInstructions.show({ domain, status: data })} + onClick={() => DomainConfigurationInstructions.show({ domain, status: data! })} > configuration instructions @@ -234,25 +232,16 @@ export const DNSRecordTable: React.FC = ({ records }) => { ); }; -export type DomainInstructionsProps = { domain: string; status: DomainStatus }; +export type DomainInstructionsProps = { domain: string; status: DomainCheckResponse }; const DomainConfigurationInstructions: React.FC & { show: (p: DomainInstructionsProps) => void; } = ({ domain, status }) => { - if (status.needsConfiguration && status.configurationType === "cname") { + if (status.reason === "requires_cname_configuration") { return (

    Set the following record on your DNS provider to continue

    - -

    -
    - ); - } else if (status.needsConfiguration && status.configurationType == "verification") { - return ( -
    -

    Set the following record on your DNS provider to continue

    -

    - +

    ); @@ -282,10 +271,24 @@ const DomainsEditor: React.FC> = props => { const add = async () => { setAddPending(true); try { - const { available } = await get(`/api/${workspace.id}/domain-check?domain=${addValue}`); - if (!available) { - feedbackError(`Domain ${addValue} is not available. It is used by other workspace`); - return; + const available: DomainCheckResponse = await get(`/api/${workspace.id}/domain-check?domain=${addValue}`); + if (!available.ok) { + if (available.reason === "used_by_other_workspace") { + feedbackError( + <> + Domain {addValue} is not available. It is used by other workspace. Contact{" "} + support@jitsu.com if you think this is a mistake + + ); + return; + } else if (available.reason === "invalid_domain_name") { + feedbackError( + <> + Invalid domain name {addValue} + + ); + return; + } } const newVal = [...domains, addValue as string]; setDomains(newVal); diff --git a/webapps/console/pages/api/[workspaceId]/domain-check.ts b/webapps/console/pages/api/[workspaceId]/domain-check.ts index a8c6ca9c1..22558c2d9 100644 --- a/webapps/console/pages/api/[workspaceId]/domain-check.ts +++ b/webapps/console/pages/api/[workspaceId]/domain-check.ts @@ -1,38 +1,41 @@ -import { Api, inferUrl, nextJsApiHandler, verifyAccess } from "../../../lib/api"; import { getServerLog } from "../../../lib/server/log"; import { z } from "zod"; -import { isDomainAvailable } from "../../../lib/server/custom-domains"; +import { customDomainCnames, isCnameValid, isDomainAvailable } from "../../../lib/server/custom-domains"; +import { DomainCheckResponse } from "../../../lib/shared/domain-check-response"; +import { createRoute, verifyAccess } from "../../../lib/api"; const log = getServerLog("custom-domains"); -export const api: Api = { - url: inferUrl(__filename), - GET: { +export default createRoute() + .GET({ auth: true, - types: { - query: z.object({ - workspaceId: z.string(), - domain: z.string(), - }), - result: z.object({ - available: z.boolean(), - }), - }, - handle: async ({ user, query }) => { - await verifyAccess(user, query.workspaceId); - const domainAvailability = await isDomainAvailable(query.domain, query.workspaceId); - if (!domainAvailability.available) { - log - .atWarn() - .log( - `Domain '${query.domain}' can't be added to workspace ${query.workspaceId}. It is used by ${domainAvailability.usedInWorkspace}` - ); - return { available: false }; - } - return { available: true }; - }, - }, -}; + query: z.object({ + workspaceId: z.string(), + domain: z.string(), + }), + result: DomainCheckResponse, + }) + .handler(async ({ user, query: { workspaceId, domain } }) => { + if (!customDomainCnames || customDomainCnames.length == 0) { + throw new Error(`CUSTOM_DOMAIN_CNAMES is not set`); + } + await verifyAccess(user, workspaceId); + const domainAvailability = await isDomainAvailable(domain, workspaceId); + if (!domainAvailability.available) { + log + .atWarn() + .log( + `Domain '${domain}' can't be added to workspace ${workspaceId}. It is used by ${domainAvailability.usedInWorkspace}` + ); + return { ok: false, reason: "used_by_other_workspace" }; + } -export default nextJsApiHandler(api); + const cnameValid = await isCnameValid(domain); + if (!cnameValid) { + log.atWarn().log(`Domain ${domain} is not valid`); + return { ok: false, reason: "requires_cname_configuration", cnameValue: customDomainCnames[0] }; + } + return { ok: true }; + }) + .toNextApiHandler(); diff --git a/webapps/console/pages/api/admin/domains-report.ts b/webapps/console/pages/api/admin/domains-report.ts new file mode 100644 index 000000000..99d9c19e8 --- /dev/null +++ b/webapps/console/pages/api/admin/domains-report.ts @@ -0,0 +1,59 @@ +import { createRoute } from "../../../lib/api"; +import { db } from "../../../lib/server/db"; +import { assertDefined, assertTrue } from "juava"; +import { isCnameValid } from "../../../lib/server/custom-domains"; + +export default createRoute() + .GET({ + auth: true, + }) + .handler(async ({ user }) => { + const userProfile = await db.prisma().userProfile.findFirst({ where: { id: user.internalId } }); + assertDefined(userProfile, "User profile not found"); + assertTrue(userProfile.admin, "Not enough permissions"); + + const domains = await db.pgPool().query(` + select + s.id, + s.config ->> 'name' as "streamName", + s."updatedAt" as "updatedAt", + s.config, + w.id as "workspaceId" + from "ConfigurationObject" s + join "Workspace" w on w.id = s."workspaceId" + where s.type = 'stream' + and s.config ->> 'domains' <> '[]' + `); + + const result: any[] = []; + const cache: { [key: string]: boolean } = {}; + + for (const row of domains.rows) { + for (const domain of row.config.domains) { + const validCname = cache[domain] ?? (cache[domain] = await isCnameValid(domain)); + result.push({ + configured: validCname, + domain, + lastValidated: row.updatedAt, + misconfigurationReason: validCname ? null : "invalid_cname", + sourceId: row.id, + workspaceId: row.workspaceId, + }); + } + } + result.sort((a, b) => { + if (a.configured && !b.configured) { + return -1; + } + if (!a.configured && b.configured) { + return 1; + } + if (a.configured && b.configured) { + return a.domain.localeCompare(b.domain); + } + return 0; + }); + + return result; + }) + .toNextApiHandler(); diff --git a/webapps/ee-api/lib/vercel.ts b/webapps/ee-api/lib/vercel.ts deleted file mode 100644 index 9296e48b8..000000000 --- a/webapps/ee-api/lib/vercel.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { getLog, requireDefined } from "juava"; -import fetch from "node-fetch-commonjs"; - -export type DomainInfo = Record; - -export const vercelProjectId = requireDefined( - process.env.DOMAINS_VERCEL_PROJECT_ID, - `env DOMAINS_VERCEL_PROJECT_ID is not set` -); -export const vercelTeamId = requireDefined(process.env.DOMAINS_VERCEL_TEAM_ID, `env DOMAINS_VERCEL_TEAM_ID is not set`); -export const vercelToken = requireDefined(process.env.DOMAINS_VERCEL_TOKEN, `env DOMAINS_VERCEL_TOKEN is not set`); -export const vercelCname = process.env.CNAME || "cname.jitsu.com"; - -const log = getLog("vercel"); - -export async function vercelRpc(url: string, method?: "GET" | "POST", body?: any): Promise { - const res = await fetch(url.indexOf("https://") === 0 ? url : `https://api.vercel.com${url}`, { - method: method ?? "GET", - body: body ? JSON.stringify(body) : undefined, - headers: { - Authorization: `Bearer ${vercelToken}`, - "Content-Type": "application/json", - }, - }); - const txt = await res.text(); - if (!res.ok) { - log.atError().log(`Rpc failed: ${res.status} ${res.statusText}. Response: ${txt}`); - } - return JSON.parse(txt); -} - -export async function getExistingDomain(domain: string): Promise { - const result = await vercelRpc( - `https://api.vercel.com/v9/projects/${vercelProjectId}/domains/${domain}?teamId=${vercelTeamId}` - ); - if (result.name) { - return result; - } else { - return undefined; - } -} diff --git a/webapps/ee-api/pages/api/domain.ts b/webapps/ee-api/pages/api/domain.ts deleted file mode 100644 index d64eb1e46..000000000 --- a/webapps/ee-api/pages/api/domain.ts +++ /dev/null @@ -1,136 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from "next"; -import { auth } from "../../lib/auth"; -import { getErrorMessage, requireDefined } from "juava"; -import dns from "dns"; -import { withErrorHandler } from "../../lib/error-handler"; -import isValidDomain from "is-valid-domain"; -import { getServerLog } from "../../lib/log"; -import { getExistingDomain, vercelCname, vercelProjectId, vercelRpc, vercelTeamId } from "../../lib/vercel"; - -const log = getServerLog("/api/domain"); - -function resolveCname(domain: string): Promise { - return new Promise((resolve, reject) => { - dns.resolveCname(domain, (err, addresses) => { - if (err) { - reject(err); - } else { - resolve(addresses); - } - }); - }); -} - -const alternativeCname = process.env.CUSTOM_DOMAIN_CNAMES?.split(","); - -const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { - log.atDebug().log(`${req.method} ${req.url} ${JSON.stringify(req.headers)}`); - res.setHeader("Access-Control-Allow-Origin", req.headers.origin || "*"); - res.setHeader("Access-Control-Allow-Methods", "*"); - res.setHeader("Access-Control-Allow-Headers", "authorization, content-type, baggage, sentry-trace"); - if (req.method === "OPTIONS") { - //allowing requests from everywhere since our tokens are short-lived - //and can't be hijacked - res.status(200).end(); - return; - } - if (!(await auth(req, res))) { - return; - } - try { - const domain = requireDefined(req.query.domain as string, `query param domain is not set`); - if (!isValidDomain(domain, { subdomain: true, wildcard: false })) { - throw new Error(`Not a valid domain name`); - } - - if (alternativeCname && alternativeCname.length > 0) { - try { - const cnames = await resolveCname(domain); - if (cnames.length > 0) { - const configuredCname = cnames.find(cname => alternativeCname.includes(cname)); - if (configuredCname) { - res.status(200).json({ ok: true, needsConfiguration: false, configuredCname }); - return; - } else { - res.status(200).json({ - ok: false, - needsConfiguration: true, - configurationType: "cname", - cnameValue: alternativeCname[0], - }); - return; - } - } else { - if (vercelProjectId) { - //continue with vercel - } else { - res.status(200).json({ - ok: false, - needsConfiguration: true, - configurationType: "cname", - cnameValue: alternativeCname[0], - }); - } - } - } catch (e) { - if (vercelProjectId) { - //continue with vercel - } else { - res - .status(200) - .json({ ok: false, needsConfiguration: true, configurationType: "cname", cnameValue: alternativeCname[0] }); - } - } - } - - let domainInfo = await getExistingDomain(domain); - if (!domainInfo) { - domainInfo = await vercelRpc(`/v10/projects/${vercelProjectId}/domains?teamId=${vercelTeamId}`, "POST", { - name: domain, - }); - } - if (!domainInfo) { - throw new Error(`Can't get domainInfo for ${domain}`); - } - if (domainInfo.error) { - return res.status(200).json({ ok: false, error: domainInfo.error.message || domainInfo.error }); - } - const status = await vercelRpc(`/v6/domains/${domain}/config?teamId=${vercelTeamId}`); - log.atDebug().log(`Checking status of domain ${domain}: ${JSON.stringify({ status, domainInfo }, null, 2)}`); - const misconfigured = status.misconfigured; - const verified = domainInfo.verified; - if (!misconfigured && verified) { - res.status(200).json({ ok: true, needsConfiguration: false }); - } else if (misconfigured) { - res.status(200).json({ ok: true, needsConfiguration: true, configurationType: "cname", cnameValue: vercelCname }); - } else if (!verified) { - //request Vercel to verify domain - const verifyInfo = await vercelRpc( - `/v9/projects/${vercelProjectId}/domains/${domain}/verify?teamId=${vercelTeamId}`, - "POST" - ); - if (!verifyInfo) { - throw new Error(`Can't verify ${domain}`); - } - if (!verifyInfo.verified) { - if (!verifyInfo.verification && !domainInfo.verification) { - throw new Error(`Domain ${domain} is not verified, and there is no verification info`); - } - res.status(200).json({ - ok: true, - needsConfiguration: true, - configurationType: "verification", - verification: verifyInfo.verification || domainInfo.verification, - }); - } else { - res.status(200).json({ ok: true, needsConfiguration: false }); - } - } else { - throw new Error(`Unexpected state: misconfigured=${misconfigured}, verified=${verified} `); - } - } catch (e) { - log.atError().withCause(e).log(`${req.url} failed`); - return res.status(200).json({ ok: false, error: getErrorMessage(e) }); - } -}; -export default withErrorHandler(handler); diff --git a/webapps/ee-api/pages/api/report/domains.ts b/webapps/ee-api/pages/api/report/domains.ts deleted file mode 100644 index 250f90ad6..000000000 --- a/webapps/ee-api/pages/api/report/domains.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { NextApiRequest, NextApiResponse } from "next"; -import { auth } from "../../../lib/auth"; -import { assertTrue, getLog } from "juava"; -import { applicationDb } from "../../../lib/services"; -import { withErrorHandler } from "../../../lib/error-handler"; -import { getExistingDomain, vercelRpc, vercelTeamId } from "../../../lib/vercel"; - -const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { - const claims = await auth(req, res); - assertTrue(claims?.type === "admin", "Should be admin"); - const queryResult = await applicationDb.query(` - select - s.id, - s.config ->> 'name' as "streamName", - s."updatedAt" as "updatedAt", - s.config, - w.slug as "workspaceSlug", - w.name as "workspaceName" - from newjitsu."ConfigurationObject" s - join newjitsu."Workspace" w on w.id = s."workspaceId" - where s.type = 'stream' - and s.config ->> 'domains' <> '[]' - `); - const result: any[] = []; - res.setHeader("Content-Type", "application/json"); - res.status(200); - try { - //we need to do it in streaming mode, otherwise Vercel wll timeout - res.write("[\n"); - let firstRow = true; - //some domains can be configured for multiple stream, so a little optimization here - const localCache: Record = {}; - for (const row of queryResult.rows) { - const domains = row.config.domains; - for (const domain of domains) { - let domainStatus: any; - let domainInfo: any; - if (localCache[domain]) { - getLog().atDebug().log(`Domain ${domain} has been already checked`); - domainStatus = localCache[domain].domainStatus; - domainInfo = localCache[domain].domainInfo; - } else { - getLog().atDebug().log(`Checking domain ${domain}`); - domainStatus = await vercelRpc(`/v6/domains/${domain}/config?teamId=${vercelTeamId}`); - domainInfo = (await getExistingDomain(domain)) || {}; - localCache[domain] = { domainStatus, domainInfo }; - getLog() - .atDebug() - .log(`Domain ${domain} info:\n${JSON.stringify({ domainStatus, domainInfo }, null, 2)}`); - } - let configured: boolean; - let misconfigurationReason: any = null; - if (!domainStatus?.misconfigured && domainInfo?.verified) { - configured = true; - } else if (domainStatus?.misconfigured) { - configured = false; - misconfigurationReason = "cname"; - } else { - configured = false; - misconfigurationReason = "verification_required"; - } - const workspaceLink = `https://use.jitsu.com/${row.workspaceSlug || row.workspaceId}`; - const resultRow = { - domain, - configured, - misconfigurationReason, - lastUpdated: domainStatus.updatedAt ? new Date(domainStatus.updatedAt) : row.updatedAt, - workspaceId: row.workspaceId, - sourceId: row.id, - sourceLink: `${workspaceLink}/streams?id=${row.id}`, - workspaceLink, - }; - res.write(`${firstRow ? "" : ",\n"}${JSON.stringify(resultRow)}`); - getLog() - .atDebug() - .log( - `Domain ${domain} is ${configured ? "configured" : "not configured"}. Full info: ${JSON.stringify( - resultRow - )}` - ); - firstRow = false; - } - } - res.write("\n]"); - } finally { - //no catch block here, since in streaming it's not hard to display error to the user - res.end(); - } -}; - -export const config = { - maxDuration: 300, -}; - -export default withErrorHandler(handler); From 1cc88152a8384437cf00b1fdd732ae93287eca9f Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Wed, 20 Dec 2023 17:20:00 -0500 Subject: [PATCH 0443/1353] feat: enable custom domains for self-hosted installations if CNAME is defined --- webapps/console/lib/schema/index.ts | 1 + webapps/console/pages/[workspaceId]/streams.tsx | 2 +- webapps/console/pages/api/app-config.ts | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/webapps/console/lib/schema/index.ts b/webapps/console/lib/schema/index.ts index 56e08c578..d87f0f2b6 100644 --- a/webapps/console/lib/schema/index.ts +++ b/webapps/console/lib/schema/index.ts @@ -56,6 +56,7 @@ export const AppConfig = z.object({ //iso date readOnlyUntil: z.string().optional(), disableSignup: z.boolean().optional(), + customDomainsEnabled: z.boolean().optional(), ee: z.object({ available: z.boolean(), host: z.string().optional(), diff --git a/webapps/console/pages/[workspaceId]/streams.tsx b/webapps/console/pages/[workspaceId]/streams.tsx index 08540cdba..61a88ae6f 100644 --- a/webapps/console/pages/[workspaceId]/streams.tsx +++ b/webapps/console/pages/[workspaceId]/streams.tsx @@ -547,7 +547,7 @@ const StreamsList: React.FC<{}> = () => { }, domains: { editor: DomainsEditor, - hidden: !appConfig.ee.available, + hidden: !appConfig.customDomainsEnabled, displayName: "Custom Tracking Domains", documentation: ( <> diff --git a/webapps/console/pages/api/app-config.ts b/webapps/console/pages/api/app-config.ts index 36b4b18a3..2d7921229 100644 --- a/webapps/console/pages/api/app-config.ts +++ b/webapps/console/pages/api/app-config.ts @@ -9,6 +9,7 @@ import { isTruish } from "../../lib/shared/chores"; import { readOnlyUntil } from "../../lib/server/read-only-mode"; import { productTelemetryEnabled, productTelemetryHost } from "../../lib/server/telemetry"; import { mainDataDomain } from "../../lib/server/data-domains"; +import { customDomainCnames } from "../../lib/server/custom-domains"; export default createRoute() .GET({ result: AppConfig, auth: false }) @@ -31,6 +32,7 @@ export default createRoute() } : undefined, billingEnabled: isEEAvailable(), + customDomainsEnabled: customDomainCnames && customDomainCnames.length > 0, syncs: { enabled: isTruish(process.env.SYNCS_ENABLED), scheduler: { From 8ee7f4f66982ef65a556a8f642f8bcdbae225ca1 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Wed, 20 Dec 2023 17:28:55 -0500 Subject: [PATCH 0444/1353] feat: unlock restricted sources version per workspace settings --- .../console/components/ServicesCatalog/ServicesCatalog.tsx | 5 +++-- webapps/console/pages/[workspaceId]/services.tsx | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx b/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx index a4e077511..63b8b8806 100644 --- a/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx +++ b/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx @@ -8,7 +8,7 @@ import { LoadingAnimation } from "../GlobalLoader/GlobalLoader"; import React from "react"; import { ErrorCard } from "../GlobalError/GlobalError"; import { Input } from "antd"; -import { useAppConfig } from "../../lib/context"; +import { useAppConfig, useWorkspace } from "../../lib/context"; function groupByType(sources: SourceType[]): Record { const groups: Record = {}; @@ -57,6 +57,7 @@ export function getServiceIcon(source: SourceType, icons: Record export const ServicesCatalog: React.FC<{ onClick: (packageType, packageId: string) => void }> = ({ onClick }) => { const { data, isLoading, error } = useApi<{ sources: SourceType[] }>(`/api/sources?mode=meta`); const sourcesIconsLoader = useApi<{ sources: SourceType[] }>(`/api/sources?mode=icons-only`); + const workspace = useWorkspace(); const [filter, setFilter] = React.useState(""); const appconfig = useAppConfig(); const sourcesIcons: Record = sourcesIconsLoader.data @@ -94,7 +95,7 @@ export const ServicesCatalog: React.FC<{ onClick: (packageType, packageId: strin .filter(source => source.meta.name && source.meta.name.toLowerCase().includes(filter.toLowerCase())) .filter( source => - !appconfig.mitCompliant || + !appconfig.mitCompliant || workspace.featuresEnabled.includes("ignore_sources_licenses") || source.meta.license?.toLowerCase() === "mit" || (source.meta.mitVersions && source.meta.mitVersions.length > 0) ); diff --git a/webapps/console/pages/[workspaceId]/services.tsx b/webapps/console/pages/[workspaceId]/services.tsx index ac7d1fbaa..233905c84 100644 --- a/webapps/console/pages/[workspaceId]/services.tsx +++ b/webapps/console/pages/[workspaceId]/services.tsx @@ -155,7 +155,7 @@ const ServicesList: React.FC<{}> = () => { `/api/sources/versions?type=${packageType}&package=${encodeURIComponent(packageId)}` ); const versions = rawVersions.versions - .filter((v: any) => v.isRelease && (v.isMit || !appconfig.mitCompliant)) + .filter((v: any) => v.isRelease && (v.isMit || !appconfig.mitCompliant || workspace.featuresEnabled.includes("ignore_sources_licenses"))) .map((v: any) => v.name); const sourceType = await rpc(`/api/sources/${packageType}/${encodeURIComponent(packageId)}`); From b663ce6eb80ab08b5762d9cf3c32376cf76cc32c Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Wed, 20 Dec 2023 17:32:58 -0500 Subject: [PATCH 0445/1353] fix: prettier --- .../console/components/ServicesCatalog/ServicesCatalog.tsx | 3 ++- webapps/console/pages/[workspaceId]/services.tsx | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx b/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx index 63b8b8806..b5725eb99 100644 --- a/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx +++ b/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx @@ -95,7 +95,8 @@ export const ServicesCatalog: React.FC<{ onClick: (packageType, packageId: strin .filter(source => source.meta.name && source.meta.name.toLowerCase().includes(filter.toLowerCase())) .filter( source => - !appconfig.mitCompliant || workspace.featuresEnabled.includes("ignore_sources_licenses") || + !appconfig.mitCompliant || + workspace.featuresEnabled.includes("ignore_sources_licenses") || source.meta.license?.toLowerCase() === "mit" || (source.meta.mitVersions && source.meta.mitVersions.length > 0) ); diff --git a/webapps/console/pages/[workspaceId]/services.tsx b/webapps/console/pages/[workspaceId]/services.tsx index 233905c84..4bea39efa 100644 --- a/webapps/console/pages/[workspaceId]/services.tsx +++ b/webapps/console/pages/[workspaceId]/services.tsx @@ -155,7 +155,11 @@ const ServicesList: React.FC<{}> = () => { `/api/sources/versions?type=${packageType}&package=${encodeURIComponent(packageId)}` ); const versions = rawVersions.versions - .filter((v: any) => v.isRelease && (v.isMit || !appconfig.mitCompliant || workspace.featuresEnabled.includes("ignore_sources_licenses"))) + .filter( + (v: any) => + v.isRelease && + (v.isMit || !appconfig.mitCompliant || workspace.featuresEnabled.includes("ignore_sources_licenses")) + ) .map((v: any) => v.name); const sourceType = await rpc(`/api/sources/${packageType}/${encodeURIComponent(packageId)}`); From 5239d979d5be5737e47aa76278ccc81de57d1a05 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Wed, 20 Dec 2023 17:38:52 -0500 Subject: [PATCH 0446/1353] feat: allow unsafe auth via get params --- webapps/console/lib/api.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/webapps/console/lib/api.ts b/webapps/console/lib/api.ts index 8ee1ab07d..1886b03be 100644 --- a/webapps/console/lib/api.ts +++ b/webapps/console/lib/api.ts @@ -76,6 +76,9 @@ function parseIfNeeded(o: any): any { export function getAuthBearerToken(req: NextApiRequest): string | undefined { if (req.headers.authorization && req.headers.authorization.toLowerCase().indexOf("bearer ") === 0) { return req.headers.authorization.substring("bearer ".length); + } else if (req.query?.__unsafe_token) { + //very unsafe, but some tools we use can't set headers, so we need to allow this + return req.query.__unsafe_token as string; } return undefined; } From 461fe97c79a9d7e14fc674f39e0e48fc87e54c85 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Wed, 20 Dec 2023 17:40:02 -0500 Subject: [PATCH 0447/1353] fix: timeout for Vercel func --- webapps/console/pages/api/admin/domains-report.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/webapps/console/pages/api/admin/domains-report.ts b/webapps/console/pages/api/admin/domains-report.ts index 99d9c19e8..4d64cad5c 100644 --- a/webapps/console/pages/api/admin/domains-report.ts +++ b/webapps/console/pages/api/admin/domains-report.ts @@ -57,3 +57,6 @@ export default createRoute() return result; }) .toNextApiHandler(); +export const config = { + maxDuration: 120, //2 mins, mostly becasue of workspace-stat call +}; From 0b3f3800cda04303443b5b8a94bf9f5991f7bdfc Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Wed, 20 Dec 2023 17:58:24 -0500 Subject: [PATCH 0448/1353] fix: make /api/admin/domain-report stream response so it could work within vercel timeout --- .../console/pages/api/admin/domains-report.ts | 31 ++++++++----------- 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/webapps/console/pages/api/admin/domains-report.ts b/webapps/console/pages/api/admin/domains-report.ts index 4d64cad5c..14ac86681 100644 --- a/webapps/console/pages/api/admin/domains-report.ts +++ b/webapps/console/pages/api/admin/domains-report.ts @@ -6,8 +6,9 @@ import { isCnameValid } from "../../../lib/server/custom-domains"; export default createRoute() .GET({ auth: true, + streaming: true, }) - .handler(async ({ user }) => { + .handler(async ({ res, user }) => { const userProfile = await db.prisma().userProfile.findFirst({ where: { id: user.internalId } }); assertDefined(userProfile, "User profile not found"); assertTrue(userProfile.admin, "Not enough permissions"); @@ -27,34 +28,28 @@ export default createRoute() const result: any[] = []; const cache: { [key: string]: boolean } = {}; - + res.writeHead(200, { + "Content-Type": "application/json", + }); + res.write("["); + let hasPrev: boolean = false; for (const row of domains.rows) { for (const domain of row.config.domains) { const validCname = cache[domain] ?? (cache[domain] = await isCnameValid(domain)); - result.push({ + const resRow = { configured: validCname, domain, lastValidated: row.updatedAt, misconfigurationReason: validCname ? null : "invalid_cname", sourceId: row.id, workspaceId: row.workspaceId, - }); + }; + res.write(`${hasPrev ? "," : ""}${JSON.stringify(resRow)}\n`); + hasPrev = true; } } - result.sort((a, b) => { - if (a.configured && !b.configured) { - return -1; - } - if (!a.configured && b.configured) { - return 1; - } - if (a.configured && b.configured) { - return a.domain.localeCompare(b.domain); - } - return 0; - }); - - return result; + res.write("]"); + res.end(); }) .toNextApiHandler(); export const config = { From 8e6075a610ad002ef627a2dc4b5d31b2b9b51f4a Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 21 Dec 2023 14:20:03 +0400 Subject: [PATCH 0449/1353] console: fast-store mark 'backup' destination as special kind --- webapps/console/lib/server/fast-store.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/webapps/console/lib/server/fast-store.ts b/webapps/console/lib/server/fast-store.ts index ec5befe5c..5324eb8c8 100644 --- a/webapps/console/lib/server/fast-store.ts +++ b/webapps/console/lib/server/fast-store.ts @@ -78,6 +78,7 @@ export type StreamWithDestinations = { export type EnrichedConnectionConfig = { id: string; workspaceId: string; + special?: string; updatedAt?: Date; destinationId: string; streamId: string; @@ -318,6 +319,7 @@ async function saveConnectionsToRedis(db: DatabaseConnection) { if (backupSupported && row.backupEnabled && !backupDestCreated[row.workspaceId]) { const backupConn: EnrichedConnectionConfig = { id: `${row.workspaceId}_backup`, + special: "backup", workspaceId: row.workspaceId, destinationId: `${row.workspaceId}_backup`, streamId: "backup", From 628977aff412908d6d573b233710ed8eef557081 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 21 Dec 2023 17:49:11 +0400 Subject: [PATCH 0450/1353] mixpanel-destination: send page title and click ids, filter bot traffic setting, send page events toggle. Fixes --- .../src/functions/mixpanel-destination.ts | 108 ++++++++++++++---- libs/core-functions/src/meta.ts | 6 + .../console/components/DataView/DataView.tsx | 2 +- .../components/DataView/EventsBrowser.tsx | 2 +- 4 files changed, 95 insertions(+), 23 deletions(-) diff --git a/libs/core-functions/src/functions/mixpanel-destination.ts b/libs/core-functions/src/functions/mixpanel-destination.ts index 33ef3102b..bd6b246bf 100644 --- a/libs/core-functions/src/functions/mixpanel-destination.ts +++ b/libs/core-functions/src/functions/mixpanel-destination.ts @@ -17,6 +17,8 @@ export const specialProperties = [ "unsubscribed", ]; +const CLICK_IDS = ["dclid", "fbclid", "gclid", "ko_click_id", "li_fat_id", "msclkid", "ttclid", "twclid", "wbraid"]; + export type HttpRequest = { id: string; method?: string; @@ -41,6 +43,37 @@ function evict(obj: Record, key: string) { return val; } +function getQueryParam(url: string, param: string) { + param = param.replace(/[[]/, "\\[").replace(/[\]]/, "\\]"); + const regexS = "[\\?&]" + param + "=([^&#]*)", + regex = new RegExp(regexS), + results = regex.exec(url); + if (results === null || (results && typeof results[1] !== "string" && results[1]["length"])) { + return ""; + } else { + let result = results[1]; + try { + result = decodeURIComponent(result); + } catch (err) {} + return result.replace(/\+/g, " "); + } +} + +function clickParams(url: string) { + if (!url) { + return {}; + } + const params: any = {}; + CLICK_IDS.forEach(idkey => { + const id = getQueryParam(url, idkey); + if (id.length) { + params[idkey] = id; + } + }); + + return params; +} + function trackEvent( ctx: FullContext, deviceId: string, @@ -68,6 +101,7 @@ function trackEvent( ...(groupId ? { [groupKey]: groupId } : {}), userAgent: event.context?.userAgent, }; + const pageUrl = evict(customProperties, "url"); return { id: randomId(), url: `https://api.mixpanel.com/import?strict=1&project_id=${opts.projectId}`, @@ -89,7 +123,9 @@ function trackEvent( $browser: ctx.ua?.browser?.name, $browser_version: ctx.ua?.browser?.version, $os: ctx.ua?.os?.name, - $current_url: evict(customProperties, "url"), + $current_url: pageUrl, + ...clickParams(pageUrl), + current_page_title: evict(customProperties, "title"), $referrer: evict(customProperties, "referrer"), $referring_domain: evict(customProperties, "referring_domain"), $session_id: event.context?.sessionId, @@ -118,23 +154,7 @@ function setProfileMessage(ctx: FullContext, distinctId: string, event: Analytic const groupId = event.context?.groupId || traits.groupId; delete traits.groupId; - const setPayload: any = { - $token: opts.projectToken, - $distinct_id: distinctId, - $ip: event.context?.ip || event.requestIp, - $latitude: event.context?.geo?.location?.latitude, - $longitude: event.context?.geo?.location?.longitude, - $set: { - ...traits, - $initial_referrer: event.context?.page?.referrer, - $initial_referring_domain: event.context?.page?.referring_domain, - $browser: ctx.ua?.browser?.name, - $browser_version: ctx.ua?.browser?.version, - $os: ctx.ua?.os?.name, - }, - }; - - const reqs = [ + const reqs: HttpRequest[] = [ { id: randomId(), url: "https://api.mixpanel.com/engage?verbose=1#profile-set", @@ -142,9 +162,46 @@ function setProfileMessage(ctx: FullContext, distinctId: string, event: Analytic "Content-type": "application/json", Accept: "text-plain", }, - payload: [setPayload], + payload: [ + { + $token: opts.projectToken, + $distinct_id: distinctId, + $ip: event.context?.ip || event.requestIp, + $latitude: event.context?.geo?.location?.latitude, + $longitude: event.context?.geo?.location?.longitude, + $set: { + ...traits, + $browser: ctx.ua?.browser?.name, + $browser_version: ctx.ua?.browser?.version, + $os: ctx.ua?.os?.name, + }, + }, + ], }, ]; + if (event.context?.page?.referrer || event.context?.page?.referring_domain) { + reqs.push({ + id: randomId(), + url: "https://api.mixpanel.com/engage?verbose=1#profile-set-once", + headers: { + "Content-type": "application/json", + Accept: "text-plain", + }, + payload: [ + { + $token: opts.projectToken, + $distinct_id: distinctId, + $ip: event.context?.ip || event.requestIp, + $latitude: event.context?.geo?.location?.latitude, + $longitude: event.context?.geo?.location?.longitude, + $set_once: { + $initial_referrer: event.context?.page?.referrer, + $initial_referring_domain: event.context?.page?.referring_domain, + }, + }, + ], + }); + } if (groupId) { const groupKey = opts.groupKey || "$group_id"; const unionPayload: any = { @@ -299,6 +356,13 @@ function getDeviceId(ctx: FullContext, event: AnalyticsServerEvent) { const MixpanelDestination: JitsuFunction = async (event, ctx) => { ctx.log.debug(`Mixpanel destination (props=${JSON.stringify(ctx.props)}) received event ${JSON.stringify(event)}`); + if (typeof ctx.props.filterBotTraffic === "undefined" || ctx.props.filterBotTraffic) { + if (ctx.ua?.bot) { + ctx.log.debug(`Skipping bot traffic`); + return; + } + } + const trackPageView = typeof ctx.props.sendPageEvents === "undefined" || ctx.props.sendPageEvents; const deviceId = getDeviceId(ctx, event); if (!deviceId) { ctx.log.warn( @@ -334,8 +398,10 @@ const MixpanelDestination: JitsuFunctionGrowth and Enterprise plans." ), + filterBotTraffic: z.boolean().optional().default(true).describe("Don't send traffic from known bots to Mixpanel"), groupKey: z .string() .optional() diff --git a/webapps/console/components/DataView/DataView.tsx b/webapps/console/components/DataView/DataView.tsx index 8b16b1e4b..150a2bffc 100644 --- a/webapps/console/components/DataView/DataView.tsx +++ b/webapps/console/components/DataView/DataView.tsx @@ -33,7 +33,7 @@ export function DataView() { setState({ ...state, activeView: activeView as DataViewState["activeView"] }); const patchQueryStringState = (key: string, value: any) => { - if (state.viewState[state.activeView][key] === value) return; + if (state.viewState[state.activeView]?.[key] === value) return; if (value === null) { const newState = { ...state }; delete newState[key]; diff --git a/webapps/console/components/DataView/EventsBrowser.tsx b/webapps/console/components/DataView/EventsBrowser.tsx index 80cb4536e..c36fee75d 100644 --- a/webapps/console/components/DataView/EventsBrowser.tsx +++ b/webapps/console/components/DataView/EventsBrowser.tsx @@ -314,7 +314,7 @@ export const EventsBrowser = ({
    - {entityType == "stream" ? "Sites: " : "Connection: "} + {entityType == "stream" ? "Site: " : "Connection: "} { + setConnectionId(val); + props.onChange(val); + }} + > + {Object.entries(allConnections).map(([id, connection]) => ( + +
    + s.id === connection.fromId)} /> + + d.id === connection.toId)} /> +
    +
    + ))} + + + ); +}; + +export const ChartView: React.FC<{ + report: ConnectionAggregate; + dateFormat: "day" | "hour"; + status: KnownEventStatus[]; +}> = ({ report, dateFormat, status }) => { + const wrapperRef = React.useRef(null); + const data = [...report.breakdown].sort((a, b) => a.period.getTime() - b.period.getTime()); + useEffect(() => { + if (wrapperRef.current) { + const chart = new Chart(wrapperRef.current as any, { + type: "bar", + options: { + //for dev env double animation due to double rendering is just annoying + animation: process.env.NODE_ENV === "development" ? false : undefined, + maintainAspectRatio: false, + plugins: { + legend: { + display: false, + }, + }, + }, + data: { + labels: data.map(row => + dateFormat === "day" + ? row.period.toLocaleDateString("en-US", { month: "short", day: "2-digit" }) + : row.period.toLocaleTimeString("en-US", { + hour: "2-digit", + minute: "2-digit", + hour12: false, + }) + ), + datasets: [ + status.includes("error") + ? { + stack: "main", + label: "error", + backgroundColor: "rgb(224, 49, 48)", + data: data.map(row => row.error), + } + : undefined, + status.includes("dropped") + ? { + stack: "main", + label: "dropped", + backgroundColor: "#737373", + data: data.map(row => row.dropped), + } + : undefined, + status.includes("success") + ? { + stack: "main", + backgroundColor: "#009140", + data: data.map(row => row.success), + } + : undefined, + ].filter(Boolean) as any, + }, + }); + return () => { + chart.destroy(); + }; + } + }, [data]); + + return ; +}; + +export const EventStatPage: React.FC = () => { + const workspace = useWorkspace(); + const [period, setPeriod] = useQueryStringState("period", { + defaultValue: "24h", + }); + const [eventTypes, setEventTypes] = useQueryStringState("ev", { + defaultValue: "success,error,dropped", + }); + const [connectionId, setConnectionId] = useQueryStringState("connectionId", { + defaultValue: undefined, + }); + const [start, end, granularity] = (() => { + switch (period) { + case "24h": + return [new Date(Date.now() - 24 * 60 * 60 * 1000), new Date(), "hour"]; + case "7d": + return [new Date(Date.now() - 7 * 24 * 60 * 60 * 1000), new Date(), "day"]; + case "1m": + const monthAgo = new Date(); + monthAgo.setMonth(monthAgo.getMonth() - 1); + return [monthAgo, new Date(), "day"]; + default: + throw new Error(`Unknown period '${period}'`); + } + })(); + const remoteResult = useQuery( + ["event-stat", workspace.slugOrId, period, granularity], + async () => { + return Report.parse( + await rpc( + `/api/${ + workspace.slugOrId + }/reports/event-stat?start=${start.toISOString()}&end=${end.toISOString()}&granularity=${granularity}` + ) + ); + }, + { retry: false, staleTime: 0, cacheTime: 0 } + ); + return ( +
    +

    Workspace Statistics

    +
    +
    +
    + + +
    +
    +
    + {!connectionId && ( +
    +
    Please select connection to display stat
    +
    + )} + + {connectionId && remoteResult.isLoading && ( +
    + +
    Hang tight, statistics is loading...
    +
    + )} + {connectionId && remoteResult.error ? ( +
    + +
    + Failed to load data from the server, see error console for details +
    +
    + ) : undefined} + {remoteResult.data && connectionId ? ( + + ) : undefined} +
    +
    + setEventTypes(val.join(","))} /> +
    +
    +
    + ); +}; diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index ac5930b1c..f356e69ce 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -12,7 +12,6 @@ import { AlertCircle, ArrowLeftRight, ArrowRight, - BarChart3, ChevronDown, ChevronUp, CircleDollarSign, @@ -38,6 +37,8 @@ import { X, Zap, PackageOpen, + LineChart, + Terminal, } from "lucide-react"; import { NextRouter, useRouter } from "next/router"; @@ -570,7 +571,13 @@ function PageHeader() { icon: , items: [ { title: "Live Events", path: "/data", icon: }, - { title: "Query Data", path: "/sql", icon: , hidden: !appConfig?.ee }, + { title: "Query Data", path: "/sql", icon: , hidden: !appConfig?.ee }, + { + title: "Event Statistics", + path: "/event-stat", + icon: , + hidden: !appConfig?.ee, + }, ], }, { diff --git a/webapps/console/lib/shared/reporting.ts b/webapps/console/lib/shared/reporting.ts new file mode 100644 index 000000000..024e9f0ca --- /dev/null +++ b/webapps/console/lib/shared/reporting.ts @@ -0,0 +1,134 @@ +import { z } from "zod"; +import { Simplify } from "type-fest"; + +export const KnownEventStatus = z.enum([ + "success", + "dropped", + "error", + "processed", + "function_success", + "builtin_function_success", + "builtin_function_error", +]); +export type KnownEventStatus = z.infer; + +const EventStatus = KnownEventStatus + //don't fail if we have a new status + .and(z.string()); +export type EventStatus = z.infer; + +export const ReportRow = z.object({ + // day as being the day in UTC + period: z.coerce.date(), + workspaceId: z.string(), + connectionId: z.string(), + streamId: z.string(), + destinationId: z.string(), + status: z.string(), + events: z.coerce.number(), + /** + * Size (rows) of an underlying chunk, do not use in UI + */ + srcSize: z.coerce.number(), +}); + +export type ReportRow = z.infer; + +export const Report = z.object({ + rows: z.array(ReportRow), +}); + +export type Report = z.infer; + +export const AggregatedReportRow = ReportRow.omit({ events: true, srcSize: true }).and( + z.object({ + events: z.record(EventStatus, z.number()), + }) +); + +export type AggregatedReportRow = z.infer; + +export const AggregatedReport = z.object({ + rows: z.array(AggregatedReportRow), +}); + +export type AggregatedReport = z.infer; + +export function aggregateReport(report: Report): AggregatedReport { + //We will need it for CSV export + throw new Error("Not implemented"); +} + +export const ActiveEventsReportRow = z.object({ + period: z.coerce.date(), + activeEvents: z.coerce.number(), +}); +export type ActiveEventsReportRow = z.infer; +export const ActiveEventsReport = z.object({ + workspaceId: z.string(), + //totals might be calculated differently than a sun of breakdown, because we take into account unique events + totalActiveEvents: z.number(), + breakdown: z.array(ActiveEventsReportRow), +}); + +export type ActiveEventsReport = z.infer; + +const ConnectionStat = z + .record(KnownEventStatus, z.number()) + .transform(x => x as typeof x extends Partial ? T : never); +export type ConnectionStat = z.infer; + +export const ConnectionAggregate = z.object({ + workspaceId: z.string(), + connectionId: z.string(), + breakdown: z.array( + z + .object({ + period: z.coerce.date(), + }) + //see https://github.com/colinhacks/zod/issues/2623#issuecomment-1880845969. Otherwise it makes a partial record + .and(ConnectionStat) + ), +}); + +export type ConnectionAggregate = Simplify>; + +function getWorkspaceId(report: Report): string { + if (report.rows.length === 0) { + throw new Error("Report is empty"); + } + const workspaceId = report.rows[0].workspaceId; + + const otherWorkspace = report.rows.find(row => row.workspaceId !== workspaceId); + if (otherWorkspace) { + throw new Error(`Report contains rows from multiple workspaces: ${workspaceId} and ${otherWorkspace.workspaceId}`); + } + return workspaceId; +} + +function agg(rec1: Record, rec2: Record): Record { + const res = { ...rec1 }; + for (const [key, value] of Object.entries(rec2)) { + res[key] = (res[key] || 0) + value; + } + return res; +} + +export function buildConnectionAggregate(report: Report, connectionId: string): ConnectionAggregate { + const rowsOfInterest = report.rows.filter(row => row.connectionId === connectionId); + const preAgg = rowsOfInterest.reduce((byDay, row) => { + byDay[row.period.toISOString()] = agg( + byDay[row.period.toISOString()] || Object.fromEntries(KnownEventStatus.options.map(st => [st, 0])), + { [row.status]: row.events } + ); + return byDay; + }, {} as Record); + return { + workspaceId: getWorkspaceId(report), + connectionId, + breakdown: Object.entries(preAgg).map(([day, values]) => ({ + period: new Date(day), + ...values, + })), + }; +} diff --git a/webapps/console/lib/store/index.tsx b/webapps/console/lib/store/index.tsx index f7e16fb41..788a77d66 100644 --- a/webapps/console/lib/store/index.tsx +++ b/webapps/console/lib/store/index.tsx @@ -216,10 +216,10 @@ export function useConfigObjectsUpdater(workspaceIdOrSlug: string): UseConfigObj return loading || loadedWorkspace != workspaceIdOrSlug ? { loading: true } : { loading: false, error: error! }; } -type UseConfigObjectLinksParams = { withData?: boolean; type?: "push" | "sync" }; +export type UseConfigObjectLinksParams = { withData?: boolean; type?: "push" | "sync" }; -type ConfigurationObjectLinkType = z.infer; -type UseConfigObjetLinkResult = Omit & { data?: any }; +export type ConfigurationObjectLinkType = z.infer; +export type UseConfigObjetLinkResult = Omit & { data?: any }; export function useConfigObjectLinksLoader(opts?: UseConfigObjectLinksParams): Result { const workspace = useWorkspace(); diff --git a/webapps/console/package.json b/webapps/console/package.json index 2feaa6540..5aa63113a 100644 --- a/webapps/console/package.json +++ b/webapps/console/package.json @@ -53,6 +53,7 @@ "@types/pg-promise": "^5.4.3", "agentkeepalive": "^4.2.1", "ajv": "~8.12.0", + "chart.js": "^4.4.1", "classnames": "^2.3.1", "cookie": "^0.5.0", "cuid": "^2.1.8", @@ -86,6 +87,7 @@ "react-icons": "^4.10.1", "react-json-view": "^1.19.1", "react-use": "^17.4.0", + "recharts": "^2.10.4", "stable-hash": "0.0.3", "stopwatch-node": "^1.1.0", "timezones-list": "^3.0.2", diff --git a/webapps/console/pages/[workspaceId]/event-stat.tsx b/webapps/console/pages/[workspaceId]/event-stat.tsx new file mode 100644 index 000000000..9061f6f00 --- /dev/null +++ b/webapps/console/pages/[workspaceId]/event-stat.tsx @@ -0,0 +1,10 @@ +import { EventStatPage } from "../../components/EventStat/EventStatPage"; +import { WorkspacePageLayout } from "../../components/PageLayout/WorkspacePageLayout"; + +export default function EventStatPage0() { + return ( + + + + ); +} diff --git a/webapps/console/pages/[workspaceId]/settings/billing/details.tsx b/webapps/console/pages/[workspaceId]/settings/billing/details.tsx new file mode 100644 index 000000000..f11a48dd5 --- /dev/null +++ b/webapps/console/pages/[workspaceId]/settings/billing/details.tsx @@ -0,0 +1,12 @@ +import { WorkspacePageLayout } from "../../../../components/PageLayout/WorkspacePageLayout"; +import { BillingDetails } from "../../../../components/BillingDetails/BillingDetails"; + +const BillingDetailsPage: React.FC = () => { + return ( + + + + ); +}; + +export default BillingDetailsPage; diff --git a/webapps/console/pages/[workspaceId]/settings/billing.tsx b/webapps/console/pages/[workspaceId]/settings/billing/index.tsx similarity index 82% rename from webapps/console/pages/[workspaceId]/settings/billing.tsx rename to webapps/console/pages/[workspaceId]/settings/billing/index.tsx index a5aee534c..1d914d70e 100644 --- a/webapps/console/pages/[workspaceId]/settings/billing.tsx +++ b/webapps/console/pages/[workspaceId]/settings/billing/index.tsx @@ -1,10 +1,10 @@ -import { WorkspacePageLayout } from "../../../components/PageLayout/WorkspacePageLayout"; -import { useBilling } from "../../../components/Billing/BillingProvider"; +import { WorkspacePageLayout } from "../../../../components/PageLayout/WorkspacePageLayout"; +import { useBilling } from "../../../../components/Billing/BillingProvider"; import { Alert, Skeleton } from "antd"; import { ChevronLeft } from "lucide-react"; import React from "react"; -import { BillingManager } from "../../../components/Billing/BillingManager"; -import { WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; +import { BillingManager } from "../../../../components/Billing/BillingManager"; +import { WJitsuButton } from "../../../../components/JitsuButton/JitsuButton"; const BillingPage: React.FC<{}> = () => { return ( diff --git a/webapps/console/pages/admin/overage-billing.tsx b/webapps/console/pages/admin/overage-billing.tsx index e510cf84c..adcddab5a 100644 --- a/webapps/console/pages/admin/overage-billing.tsx +++ b/webapps/console/pages/admin/overage-billing.tsx @@ -91,6 +91,7 @@ const View = ({ data, workspaces }) => { }, subscriptionId: { omit: true }, start: dateFormat, + roundedPeriod: { omit: true }, end: dateFormat, destinationEvents: { type: "number" }, overageEvents: { type: "number" }, diff --git a/webapps/console/pages/api/[workspaceId]/reports/active-events.ts b/webapps/console/pages/api/[workspaceId]/reports/active-events.ts new file mode 100644 index 000000000..87703216d --- /dev/null +++ b/webapps/console/pages/api/[workspaceId]/reports/active-events.ts @@ -0,0 +1,103 @@ +import { z } from "zod"; +import { createRoute, verifyAccess } from "../../../../lib/api"; +import { clickhouse } from "../../../../lib/server/clickhouse"; +import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; +import { getServerLog } from "../../../../lib/server/log"; +import { requireDefined } from "juava"; +import { db } from "../../../../lib/server/db"; +import { ActiveEventsReport, ActiveEventsReportRow } from "../../../../lib/shared/reporting"; + +dayjs.extend(utc); + +const log = getServerLog("report-query"); + +async function getWorkspace(workspaceId: string | undefined) { + return requireDefined( + await db.prisma().workspace.findFirst({ + where: { + OR: [ + { + id: workspaceId, + }, + { + slug: workspaceId, + }, + ], + deleted: false, + }, + }), + `Workspace ${workspaceId} not found` + ); +} + +function toISOString(period: string) { + const [date, time] = period.split(" "); + return `${date}T${time}Z`; +} + +export default createRoute() + .GET({ + auth: true, + query: z.object({ + workspaceId: z.string(), + start: z.coerce.date().optional(), + end: z.coerce.date().optional(), + granularity: z.enum(["day", "hour"]).optional().default("day"), + }), + //result: z.any() + result: ActiveEventsReport.and(z.object({ queryMeta: z.any() })), + }) + .handler(async ({ user, query }) => { + const { workspaceId } = query; + await verifyAccess(user, workspaceId); + const workspace = await getWorkspace(workspaceId); + const metricsSchema = process.env.CLICKHOUSE_METRICS_SCHEMA || "newjitsu_metrics"; + const end = query.end ? query.end.toISOString() : new Date().toISOString(); + const start = query.start ? query.start.toISOString() : dayjs(end).subtract(1, "month").toDate().toISOString(); + + const sql = ` + select + date_trunc({granularity:String}, timestamp) as period, + uniqMerge(count) as "activeEvents", + count(*) as "srcSize" + from ${metricsSchema}.mv_active_incoming + where + timestamp >= toDateTime({start:String}, 'UTC') and + timestamp <= toDateTime({end:String}, 'UTC') and + workspaceId = {workspace:String} + group by period + order by period; + `; + + const chResult = (await ( + await clickhouse.query({ + query: sql, + query_params: { + start: isoDateTOClickhouse(start), + end: isoDateTOClickhouse(end), + workspace: workspace.id, + granularity: query.granularity, + }, + clickhouse_settings: { + wait_end_of_query: 1, + }, + }) + ).json()) as any; + + console.log(chResult); + const rows = chResult.data.map(({ period, ...rest }) => + ActiveEventsReportRow.parse({ period: toISOString(period), ...rest }) + ); + + return { + workspaceId: workspace.id, + totalActiveEvents: rows.map(r => r.activeEvents).reduce((a, b) => a + b, 0), + breakdown: rows, + }; + }) + .toNextApiHandler(); + +function isoDateTOClickhouse(date: string): string { + return date.replace("T", " ").replace("Z", "").split(".")[0]; +} diff --git a/webapps/console/pages/api/[workspaceId]/reports/event-stat.ts b/webapps/console/pages/api/[workspaceId]/reports/event-stat.ts new file mode 100644 index 000000000..41d4ac53f --- /dev/null +++ b/webapps/console/pages/api/[workspaceId]/reports/event-stat.ts @@ -0,0 +1,104 @@ +import { z } from "zod"; +import { createRoute, verifyAccess } from "../../../../lib/api"; +import { clickhouse } from "../../../../lib/server/clickhouse"; +import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; +import { getServerLog } from "../../../../lib/server/log"; +import { requireDefined } from "juava"; +import { db } from "../../../../lib/server/db"; +import { Report } from "../../../../lib/shared/reporting"; + +dayjs.extend(utc); + +const log = getServerLog("report-query"); + +async function getWorkspace(workspaceId: string | undefined) { + return requireDefined( + await db.prisma().workspace.findFirst({ + where: { + OR: [ + { + id: workspaceId, + }, + { + slug: workspaceId, + }, + ], + deleted: false, + }, + }), + `Workspace ${workspaceId} not found` + ); +} + +function toISOString(period: string) { + const [date, time] = period.split(" "); + return `${date}T${time}Z`; +} + +export default createRoute() + .GET({ + auth: true, + query: z.object({ + workspaceId: z.string(), + start: z.any().optional(), + end: z.any().optional(), + granularity: z.enum(["day", "hour"]).optional().default("day"), + }), + //result: z.any() + result: Report.and(z.object({ queryMeta: z.any() })), + }) + .handler(async ({ user, query }) => { + const { workspaceId } = query; + await verifyAccess(user, workspaceId); + const workspace = await getWorkspace(workspaceId); + const metricsSchema = process.env.CLICKHOUSE_METRICS_SCHEMA || "newjitsu_metrics"; + const start = query.start + ? new Date(query.start).toISOString() + : dayjs().subtract(1, "month").toDate().toISOString(); + const end = query.end ? new Date(query.end).toISOString() : new Date().toISOString(); + const sql = ` + select + date_trunc({granularity:String}, timestamp) as period, + connectionId, + streamId, + destinationId, + status, + sumMerge(events) as events, + count(*) as "srcSize" + from ${metricsSchema}.mv_metrics + where + timestamp >= toDateTime({start:String}, 'UTC') and + timestamp < toDateTime({end:String}, 'UTC') and + workspaceId = {workspace:String} + group by period, connectionId, status, streamId, destinationId + order by period desc, events desc; + `; + + const chResult = (await ( + await clickhouse.query({ + query: sql, + query_params: { + start: isoDateTOClickhouse(start), + end: isoDateTOClickhouse(end), + workspace: workspace.id, + granularity: query.granularity, + }, + clickhouse_settings: { + wait_end_of_query: 1, + }, + }) + ).json()) as any; + return { + rows: chResult.data.map(({ period, ...rest }) => ({ + ...rest, + period: toISOString(period), + workspaceId: workspace.id, + })), + }; + }) + .toNextApiHandler(); + +function isoDateTOClickhouse(date: string): string { + return date.replace("T", " ").replace("Z", "").split(".")[0]; +} diff --git a/webapps/console/pages/api/[workspaceId]/sql/report.ts b/webapps/console/pages/api/[workspaceId]/sql/report.ts deleted file mode 100644 index 93febfc52..000000000 --- a/webapps/console/pages/api/[workspaceId]/sql/report.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { z } from "zod"; -import { createRoute, verifyAccess } from "../../../../lib/api"; -import { clickhouse } from "../../../../lib/server/clickhouse"; -import dayjs from "dayjs"; -import utc from "dayjs/plugin/utc"; -import { getServerLog } from "../../../../lib/server/log"; -import { requireDefined } from "juava"; -import { db } from "../../../../lib/server/db"; - -dayjs.extend(utc); - -const log = getServerLog("report-query"); - -export default createRoute() - .GET({ - auth: true, - query: z.object({ - workspaceId: z.string(), - destinationId: z.string().optional(), - streamId: z.string().optional(), - connectionId: z.string().optional(), - statuses: z.string().optional().default("success,dropped,error"), - start: z.any().optional(), - end: z.any().optional(), - groupBy: z.string().optional().default("workspaceId,status"), - granularity: z.enum(["month", "day", "hour", "minute"]).optional().default("day"), - }), - result: z.any(), - }) - .handler(async ({ user, query }) => { - const { workspaceId } = query; - await verifyAccess(user, workspaceId); - const workspace = requireDefined( - await db.prisma().workspace.findFirst({ - where: { - OR: [ - { - id: workspaceId, - }, - { - slug: workspaceId, - }, - ], - deleted: false, - }, - }), - `Workspace ${workspaceId} not found` - ); - const metricsSchema = process.env.CLICKHOUSE_METRICS_SCHEMA || "newjitsu_metrics"; - const startTs = query.start ? new Date(query.start).toISOString() : undefined; - const endTs = query.end ? new Date(query.end).toISOString() : undefined; - const groupBy = query.groupBy ? query.groupBy.split(",") : []; - const sql = `select date_trunc('${query.granularity || "day"}', timestamp) dt, ${ - groupBy.length > 0 ? groupBy.join(",") + "," : "" - } sumMerge(events) events, uniqMerge(uniqEvents) uniq_events from ${metricsSchema}.mv_metrics -where workspaceId = '${workspace.id}' -${startTs ? ` and timestamp >= toDateTime('${isoDateTOClickhouse(startTs)}')` : ""} -${endTs ? ` and timestamp < toDateTime('${isoDateTOClickhouse(endTs)}')` : ""} -${query.destinationId ? ` and destinationId = '${query.destinationId}'` : ""} -${query.connectionId ? ` and connectionId = '${query.connectionId}'` : ""} -${query.streamId ? ` and streamId = '${query.streamId}'` : ""} -${ - query.statuses - ? ` and status in (${query.statuses - .split(",") - .map(s => `'${s}'`) - .join(",")})` - : "" -} -group by all with totals -order by 1 desc`; - - log.atInfo().log(sql); - - const resultSet = await clickhouse.query({ - query: sql, - clickhouse_settings: { - wait_end_of_query: 1, - }, - }); - return await resultSet.json(); - }) - .toNextApiHandler(); - -function isoDateTOClickhouse(date: string): string { - return date.replace("T", " ").replace("Z", "").split(".")[0]; -} diff --git a/webapps/ee-api/lib/stripe.ts b/webapps/ee-api/lib/stripe.ts index 919ef34a9..ee32e3e68 100644 --- a/webapps/ee-api/lib/stripe.ts +++ b/webapps/ee-api/lib/stripe.ts @@ -276,6 +276,7 @@ export async function listAllInvoices() { do { const result = await stripe.invoices.list({ limit: 100, + status: "paid", starting_after: starting_after, created: { //invoices for past 90 days diff --git a/webapps/ee-api/package.json b/webapps/ee-api/package.json index d01bbe896..77ee5cccd 100644 --- a/webapps/ee-api/package.json +++ b/webapps/ee-api/package.json @@ -15,6 +15,7 @@ "@types/react": "18.0.28", "@types/react-dom": "18.0.11", "crypto-js": "^4.1.1", + "dayjs": "^1.11.10", "eslint": "8.29.0", "eslint-config-next": "13.0.0", "firebase-admin": "^11.11.0", diff --git a/webapps/ee-api/pages/api/report/overage.ts b/webapps/ee-api/pages/api/report/overage.ts index 009df461d..3dadc4dc0 100644 --- a/webapps/ee-api/pages/api/report/overage.ts +++ b/webapps/ee-api/pages/api/report/overage.ts @@ -16,6 +16,7 @@ import Stripe from "stripe"; import pick from "lodash/pick"; import { buildWorkspaceReport } from "./workspace-stat"; import { getServerLog } from "../../../lib/log"; +import dayjs from "dayjs"; const log = getServerLog("/api/overage"); @@ -25,18 +26,6 @@ function toUTC(date: Date | string) { return new Date(dateObj.getTime() - timezoneOffset * 60000); } -function round(date: Date | string, granularity: "day" = "day"): { start: string; end: string } { - try { - const dateObj = toUTC(date).toISOString(); - const day = dateObj.split("T")[0]; - const start = `${day}T00:00:00.000Z`; - const end = `${day}T23:59:59.999Z`; - return { start, end }; - } catch (e) { - throw new Error(`Can't parse date ${date}`); - } -} - const msPerHour = 1000 * 60 * 60; const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { const claims = await auth(req, res); @@ -150,31 +139,13 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse // ); const { overagePricePer100k, destinationEvensPerMonth } = JSON.parse(plan.metadata.plan_data); const overagePricePerEvent = overagePricePer100k / 100_000; - const invoiceStartRounded = round(start, "day").start; - const invoiceEndRounded = round(end, "day").end; + const startTimestamp = dayjs(start).utc().startOf("day").toDate().getTime(); + const endTimestamp = dayjs(end).utc().startOf("day").add(-1, "millisecond").toDate().getTime(); const rows = report.filter(row => { - const { start, end } = round(row.period, "day"); - return ( - row.workspaceId === workspaceId && - Date.parse(start) >= Date.parse(invoiceStartRounded) && - Date.parse(end) <= Date.parse(invoiceEndRounded) - ); + const rowTimestamp = dayjs(row.period).utc().toDate().getTime(); + return row.workspaceId === workspaceId && rowTimestamp >= startTimestamp && rowTimestamp <= endTimestamp; }); - // log - // .atInfo() - // .log( - // `Found ${rows.length} rows for ${workspaceId} for [${new Date(invoiceStartRounded).toISOString()}, ${new Date( - // invoiceEndRounded - // ).toISOString()}]` - // ); const destinationEvents = rows.reduce((acc, row) => acc + row.events, 0); - // log - // .atInfo() - // .log( - // `Destination events for ${workspaceId} for [${new Date(invoiceStartRounded).toISOString()}, ${new Date( - // invoiceEndRounded - // ).toISOString()}] → ${destinationEvents}` - // ); const overageFee = (Math.max(0, destinationEvents - destinationEvensPerMonth) / 100_000) * overagePricePer100k; const discountPercentage = invoice?.discount?.coupon?.percent_off || 0; const overageFeeFinal = overageFee * (1 - discountPercentage / 100); @@ -195,6 +166,10 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse subscriptionId, start, end, + roundedPeriod: { + start: dayjs(startTimestamp).utc().toISOString(), + end: dayjs(endTimestamp).utc().toISOString(), + }, destinationEvents, quota: { destinationEvensPerMonth, diff --git a/webapps/ee-api/pages/api/report/workspace-stat.ts b/webapps/ee-api/pages/api/report/workspace-stat.ts index 810ae4dcb..c559ef105 100644 --- a/webapps/ee-api/pages/api/report/workspace-stat.ts +++ b/webapps/ee-api/pages/api/report/workspace-stat.ts @@ -7,6 +7,9 @@ import * as PG from "pg"; import { getServerLog } from "../../../lib/log"; import { listAllSubscriptions, stripe, stripeDataTable } from "../../../lib/stripe"; import Stripe from "stripe"; +import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; +dayjs.extend(utc); const log = getServerLog("/api/report"); @@ -57,15 +60,15 @@ async function getClickhousePart({ where timestamp >= toDateTime('2023-07-28 00:00:00', 'UTC') and timestamp >= toDateTime({start :String}, 'UTC') and - timestamp <= toDateTime({end :String}, 'UTC') ${ + timestamp < toDateTime({end :String}, 'UTC') ${ workspaceId ? "and workspaceId = {workspaceId:String}" : "" } group by period, workspaceId order by period desc, workspaceId desc; `; const queryParams = removeUndefined({ - start: isoDateTOClickhouse(start), - end: isoDateTOClickhouse(end), + start: isoDateTOClickhouse(dayjs(start).utc().startOf("day").toISOString()), + end: isoDateTOClickhouse(dayjs(end).utc().endOf("day").add(-1, "millisecond").toISOString()), granularity, workspaceId, }); From 1868d58c3fcd892e6abbb9161bdef6bcbc45a43d Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Sun, 28 Jan 2024 10:20:25 -0500 Subject: [PATCH 0537/1353] trivial: do not block billing details page when usage exceeded --- .../console/pages/[workspaceId]/settings/billing/details.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/pages/[workspaceId]/settings/billing/details.tsx b/webapps/console/pages/[workspaceId]/settings/billing/details.tsx index f11a48dd5..9c2ec0150 100644 --- a/webapps/console/pages/[workspaceId]/settings/billing/details.tsx +++ b/webapps/console/pages/[workspaceId]/settings/billing/details.tsx @@ -3,7 +3,7 @@ import { BillingDetails } from "../../../../components/BillingDetails/BillingDet const BillingDetailsPage: React.FC = () => { return ( - + ); From 75ea16139b5715b418b75921a4ed0f8b369df591 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Sun, 28 Jan 2024 11:49:12 -0500 Subject: [PATCH 0538/1353] feat: store listener optimization --- webapps/console/lib/store/index.tsx | 26 ++++++++++++++++--- .../console/pages/api/[workspaceId]/listen.ts | 7 +++-- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/webapps/console/lib/store/index.tsx b/webapps/console/lib/store/index.tsx index 788a77d66..94d9706d6 100644 --- a/webapps/console/lib/store/index.tsx +++ b/webapps/console/lib/store/index.tsx @@ -150,6 +150,11 @@ export function useLoadedWorkspace(workspaceIdOrSlug: string): z.infer; } +const listenConfig = { + listenTimeMs: 0, + sleepTimeMs: 10_000, +} as const; + /** * This method loads all config object and stores them in a cache. Subsequent calls useConfigObjectList() will be * non-blocking and return the cached data. @@ -168,6 +173,7 @@ export function useConfigObjectsUpdater(workspaceIdOrSlug: string): UseConfigObj let isMounted = true; let modifiedSince = new Date(); let timeout; + let sleepTimeout; const abortController = new AbortController(); //reload data after every 5 seconds; initialDataLoad(workspaceIdOrSlug, queryClient) @@ -176,9 +182,8 @@ export function useConfigObjectsUpdater(workspaceIdOrSlug: string): UseConfigObj //setup background task to reload data timeout = setTimeout(async () => { while (isMounted) { - const listenMaxWaitMs = 10_000; try { - const ifModified = await fetch(`/api/${res.workspaceId}/listen?maxWaitMs=${listenMaxWaitMs}`, { + const ifModified = await fetch(`/api/${res.workspaceId}/listen?maxWaitMs=${listenConfig.listenTimeMs}`, { signal: abortController.signal, headers: { "If-Modified-Since": modifiedSince.toUTCString(), @@ -193,6 +198,14 @@ export function useConfigObjectsUpdater(workspaceIdOrSlug: string): UseConfigObj } else { getLog().atWarn().log(`Unexpected response from listen: ${ifModified.status} ${ifModified.statusText}`); } + if (listenConfig.sleepTimeMs > 0) { + await new Promise(resolve => { + sleepTimeout = setTimeout(() => { + sleepTimeout = undefined; + resolve(undefined); + }, listenConfig.sleepTimeMs); + }); + } } catch (e) { getLog().atWarn().log("Failed to check workspace config freshness"); } @@ -208,7 +221,14 @@ export function useConfigObjectsUpdater(workspaceIdOrSlug: string): UseConfigObj abortController.abort(); if (timeout) { - clearTimeout(timeout); + try { + clearTimeout(timeout); + } catch (e) {} + } + if (sleepTimeout) { + try { + clearTimeout(sleepTimeout); + } catch (e) {} } }; }, [queryClient, workspaceIdOrSlug, loading, loadedWorkspace]); diff --git a/webapps/console/pages/api/[workspaceId]/listen.ts b/webapps/console/pages/api/[workspaceId]/listen.ts index 5ddc01c8c..b53862f76 100644 --- a/webapps/console/pages/api/[workspaceId]/listen.ts +++ b/webapps/console/pages/api/[workspaceId]/listen.ts @@ -68,12 +68,15 @@ export default createRoute() return createResponse(res, modifiedAt, ifModifiedSince); } //emulate long polling - await new Promise(resolve => setTimeout(resolve, query.maxWaitMs)); - modifiedAt = await getLastModification(query.workspaceId); + if (query.maxWaitMs && query.maxWaitMs > 0) { + await new Promise(resolve => setTimeout(resolve, query.maxWaitMs)); + modifiedAt = await getLastModification(query.workspaceId); + } return createResponse(res, modifiedAt, ifModifiedSince); }) .toNextApiHandler(); export const config = { maxDuration: 120, + memory: 400, }; From 7905e7be82fad6c9a69adf7060ce0356648cc152 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 29 Jan 2024 16:15:34 +0400 Subject: [PATCH 0539/1353] docker: small adjustments --- docker/.env.example | 7 ++++--- docker/docker-compose.yml | 30 +++++++++++++++--------------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/docker/.env.example b/docker/.env.example index 46ea12a2e..10cc448f5 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -3,13 +3,14 @@ GITHUB_CLIENT_ID= GITHUB_CLIENT_SECRET= # Domain name of your Jitsu server where events will be sent. E.g. jitsu.mycompany.com INGEST_DOMAIN=localhost -# Public URL of your Jitsu UI is available. E.g. https://jitsu.mycompany.com:3000 or http://localhost:3000 +# Public URL of your Jitsu UI. E.g. https://jitsu.mycompany.com:3000 or http://localhost:3000 JITSU_PUBLIC_URL=http://localhost:3000 #### Secrets ### CONSOLE_PASSWORD=change_me POSTGRES_PASSWORD=change_me -REDIS_PASSWORD=change_me +BULKER_PASSWORD=change_me +SYNCCTL_PASSWORD=change_me ### Optional ### JITSU_UI_PORT=3000 @@ -37,7 +38,7 @@ EXTERNAL_SYNCS_PORT=3043 EXTERNAL_DATABASE_HOST=host.minikube.internal EXTERNAL_POSTGRES_PORT=5432 -SYNCCTL_KUBERNETES_CLIENT_CONFIG=local +SYNCCTL_KUBERNETES_CLIENT_CONFIG= # to use non-default k8s context SYNCCTL_KUBERNETES_CONTEXT= # For syncs scheduling diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index f677d720a..d86183368 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -55,12 +55,12 @@ services: restart: "unless-stopped" platform: linux/amd64 environment: - INGEST_HOST: ${INGEST_DOMAIN} + INGEST_HOST: ${INGEST_DOMAIN:-localhost} INGEST_PORT: ${JITSU_INGEST_PORT:-8080} ROTOR_URL: "http://rotor:3401" BULKER_URL: "http://bulker:3042" - CONSOLE_AUTH_TOKENS: ${CONSOLE_PASSWORD} - BULKER_AUTH_KEY: ${BULKER_PASSWORD} + CONSOLE_AUTH_TOKENS: ${CONSOLE_PASSWORD:-default} + BULKER_AUTH_KEY: ${BULKER_PASSWORD:-default} MIT_COMPLIANT: ${MIT_COMPLIANT:-true} DATABASE_URL: "postgresql://postgres:${POSTGRES_PASSWORD:-default}@postgres:5432/postgres?schema=newjitsu" REDIS_URL: "redis://default:${REDIS_PASSWORD:-default}@redis:6379" @@ -70,7 +70,7 @@ services: GITHUB_CLIENT_SECRET: ${GITHUB_CLIENT_SECRET} SYNCS_ENABLED: ${SYNCS_ENABLED:-false} SYNCCTL_URL: "http://syncctl:${EXTERNAL_SYNCS_PORT:-3043}" - SYNCCTL_AUTH_KEY: ${SYNCCTL_PASSWORD} + SYNCCTL_AUTH_KEY: ${SYNCCTL_PASSWORD:-default} GOOGLE_SCHEDULER_KEY: ${GOOGLE_SCHEDULER_KEY} GOOGLE_SCHEDULER_LOCATION: ${GOOGLE_SCHEDULER_LOCATION:-us-central1} JITSU_PUBLIC_URL: "${JITSU_PUBLIC_URL:-${NEXTAUTH_URL:-http://localhost:${JITSU_UI_PORT:-3000}/}}" @@ -96,8 +96,8 @@ services: image: curlimages/curl restart: "on-failure" environment: - CONSOLE_PASSWORD: ${CONSOLE_PASSWORD} - command: "curl -H 'Authorization: Bearer service-admin-account:${CONSOLE_PASSWORD}' http://console:3000/api/admin/catalog-refresh" + CONSOLE_PASSWORD: ${CONSOLE_PASSWORD:-default} + command: "curl -H 'Authorization: Bearer service-admin-account:${CONSOLE_PASSWORD:-default}' http://console:3000/api/admin/catalog-refresh" depends_on: console: condition: service_healthy @@ -110,9 +110,9 @@ services: environment: TERM: "xterm-256color" BULKER_KAFKA_BOOTSTRAP_SERVERS: "kafka:9092" - BULKER_AUTH_TOKENS: ${BULKER_PASSWORD} + BULKER_AUTH_TOKENS: ${BULKER_PASSWORD:-default} BULKER_CONFIG_SOURCE: "http://console:3000/api/admin/export/bulker-connections" - BULKER_CONFIG_SOURCE_HTTP_AUTH_TOKEN: "service-admin-account:${CONSOLE_PASSWORD}" + BULKER_CONFIG_SOURCE_HTTP_AUTH_TOKEN: "service-admin-account:${CONSOLE_PASSWORD:-default}" BULKER_CACHE_DIR: "/tmp/cache" REDIS_URL: "redis://default:${REDIS_PASSWORD:-default}@redis:6379" BULKER_INTERNAL_TASK_LOG: '{"id":"task_log","metricsKeyPrefix":"syncs","usesBulker":true,"type":"postgres","options":{"mode":"stream"},"credentials":{"host":"postgres","port":5432,"sslMode":"disable","database":"postgres","password":"${POSTGRES_PASSWORD:-default}","username":"postgres","defaultSchema":"newjitsu"}}' @@ -138,11 +138,11 @@ services: DISABLE_SERVICE_prisma: "true" DISABLE_SERVICE_pg: "true" BULKER_URL: "http://bulker:3042" - BULKER_AUTH_KEY: ${BULKER_PASSWORD} + BULKER_AUTH_KEY: ${BULKER_PASSWORD:-default} KAFKA_BOOTSTRAP_SERVERS: "kafka:9092" REDIS_URL: "redis://default:${REDIS_PASSWORD:-default}@redis:6379" REPOSITORY_BASE_URL: "http://console:3000/api/admin/export/" - REPOSITORY_AUTH_TOKEN: "service-admin-account:${CONSOLE_PASSWORD}" + REPOSITORY_AUTH_TOKEN: "service-admin-account:${CONSOLE_PASSWORD:-default}" REPOSITORY_CACHE_DIR: "/tmp/cache" healthcheck: test: ["CMD", "curl", "-f", "http://rotor:3401/health"] @@ -162,11 +162,11 @@ services: restart: "unless-stopped" environment: TERM: "xterm-256color" - INGEST_DATA_DOMAIN: ${INGEST_DOMAIN} + INGEST_DATA_DOMAIN: ${INGEST_DOMAIN:-localhost} INGEST_KAFKA_BOOTSTRAP_SERVERS: "kafka:9092" - INGEST_AUTH_TOKENS: ${BULKER_PASSWORD} + INGEST_AUTH_TOKENS: ${BULKER_PASSWORD:-default} INGEST_REPOSITORY_URL: "http://console:3000/api/admin/export/streams-with-destinations" - INGEST_REPOSITORY_AUTH_TOKEN: "service-admin-account:${CONSOLE_PASSWORD}" + INGEST_REPOSITORY_AUTH_TOKEN: "service-admin-account:${CONSOLE_PASSWORD:-default}" INGEST_CACHE_DIR: "/tmp/cache" INGEST_REDIS_URL: "redis://default:${REDIS_PASSWORD:-default}@redis:6379" INGEST_ROTOR_URL: "http://rotor:3401" @@ -192,11 +192,11 @@ services: TERM: "xterm-256color" HTTP_PORT: ${EXTERNAL_SYNCS_PORT:-3043} SYNCCTL_SYNCS_ENABLED: ${SYNCS_ENABLED:-false} - SYNCCTL_AUTH_TOKENS: ${SYNCCTL_PASSWORD} + SYNCCTL_AUTH_TOKENS: ${SYNCCTL_PASSWORD:-default} SYNCCTL_DATABASE_URL: "postgresql://postgres:${POSTGRES_PASSWORD:-default}@127.0.0.1:${EXTERNAL_POSTGRES_PORT:-5432}/postgres?search_path=newjitsu" SYNCCTL_SIDECAR_DATABASE_URL: "postgresql://postgres:${POSTGRES_PASSWORD:-default}@${EXTERNAL_DATABASE_HOST}:${EXTERNAL_POSTGRES_PORT:-5432}/postgres?search_path=newjitsu" SYNCCTL_BULKER_URL: "http://${EXTERNAL_BULKER_HOST}:${EXTERNAL_BULKER_PORT:-3045}" - SYNCCTL_BULKER_AUTH_TOKEN: ${BULKER_PASSWORD} + SYNCCTL_BULKER_AUTH_TOKEN: ${BULKER_PASSWORD:-default} SYNCCTL_BULKER_LOGS_CONNECTION_ID: task_log SYNCCTL_KUBERNETES_CLIENT_CONFIG: "${SYNCCTL_KUBERNETES_CLIENT_CONFIG:-local}" SYNCCTL_KUBERNETES_CONTEXT: "${SYNCCTL_KUBERNETES_CONTEXT}" From 4200cd8dbb542c463c7c9cef8371b153b32a3ec2 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 29 Jan 2024 17:38:43 +0400 Subject: [PATCH 0540/1353] docker: better var naming console: Event Statistics require EE --- docker/.env.example | 2 +- docker/README.md | 77 +++++++++++++++++++ docker/SYNCS_README.md | 34 ++++---- docker/docker-compose.yml | 4 +- .../PageLayout/WorkspacePageLayout.tsx | 14 ++-- 5 files changed, 105 insertions(+), 26 deletions(-) create mode 100644 docker/README.md diff --git a/docker/.env.example b/docker/.env.example index 10cc448f5..ecb3e109f 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -35,7 +35,7 @@ EXTERNAL_BULKER_PORT=3042 EXTERNAL_SYNCS_PORT=3043 #postgres host how it is reachable from k8s cluster -EXTERNAL_DATABASE_HOST=host.minikube.internal +EXTERNAL_POSTGRES_HOST=host.minikube.internal EXTERNAL_POSTGRES_PORT=5432 SYNCCTL_KUBERNETES_CLIENT_CONFIG= diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 000000000..ee332e444 --- /dev/null +++ b/docker/README.md @@ -0,0 +1,77 @@ +# Quick Start + +This guide uses docker compose to run Jitsu locally. It's suitable for testing purposes only. + +## Requirements + +* [Docker Engine](https://docs.docker.com/engine/install/) >= 19.03.0 +* Kubernetes cluster (Optional. Required for connectors syncs) + +## Configuration + +1. You'll need to create a `.env` file in `docker` directory. You can copy `.env.example` to `.env`: + +```shell +# Copy .env.example to .env +cp .env.example .env +``` + +2. Set up all required variables in `.env` file. + +#### `JITSU_PUBLIC_URL` + +This is a URL where Jitsu UI will be available. + +When using jitsu locally, no need to set this variable. + +**Default value:** `http://localhost:${JITSU_UI_PORT}/` + +When UI is deployed on remote server, set it with your remote server URL, e.g.: `https://jitsu.mycompany.com:3000`. + +#### `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET` + +Jitsu self-hosted authorization is based on GitHub OAuth. + +You'll need to create a GitHub OAuth application to get those values: + +* Go to [Github Developer settings](https://github.com/settings/developers) » **OAuth Apps** » **New OAuth App**. +* Put any value to `Application name` +* Set `Homepage URL` and `Authorization callback URL` with `JITSU_PUBLIC_URL` value +* Press `Register application` button +* Press `Generate a new client secret` button +* Copy `Client ID` and `Client Secret` values to `.env` file to `GITHUB_CLIENT_ID` and `GITHUB_CLIENT_SECRET` variables respectively. + +#### `INGEST_DOMAIN` + +Domain of the Jitsu Ingest API how it is available for external users. Ingest API is used for sending events to Jitsu. + +When using jitsu locally, no need to set this variable. + +**Default value:** `localhost` + +When deployed on remote server, set it with your remote server domain, e.g.: `data.mycompany.com`. + + +## Run Jitsu + +In `jitsu/docker` directory run: +```shell +docker-compose up +``` + +Open Jitsu UI url (e.g.: `http://localhost:3000/`) in your browser, login with any GitHub account and follow the instructions. + +## Sending events + +Create a new site in Jitsu UI and click `Setup instructions` button in the site context menu. + +See [HTTP API](https://docs.jitsu.com/sending-data/) guide for details. + + +## Further steps + +Those steps are optional, but they might make sense for you: + +* Set up **Connectors Syncs**. See SYNCS_README.md for details +* Set `DISABLE_SIGNUP` in `.env` to `true` if you don't want to allow users to sign up +* See reference for other variables in [Production Deployment](https://docs.jitsu.com/self-hosting/configuration) guide. \ No newline at end of file diff --git a/docker/SYNCS_README.md b/docker/SYNCS_README.md index c163d3de5..68bff9420 100644 --- a/docker/SYNCS_README.md +++ b/docker/SYNCS_README.md @@ -7,22 +7,21 @@ In the presence of kubernetes cluster, it is not recommended to run Jitsu in Doc # How to set up -Jitsu runs sync jobs in kubernetes cluster. So we need to connect `syncctl` service to kubernetes cluster using following env variables: +Jitsu runs sync jobs in kubernetes cluster. So we need to connect `syncctl` service to kubernetes cluster using following env variables in `.env` file: * `SYNCS_ENABLED` - set to `true` to enable syncs on UI side * `SYNCCTL_KUBERNETES_CLIENT_CONFIG` - path to kubernetes config file or kubernetes config in yaml format * `EXTERNAL_BULKER_HOST` - host of `bulker` service as it is reachable from kubernetes cluster -* `EXTERNAL_DATABASE_HOST`- host of `postgres` service as it is reachable from kubernetes cluster +* `EXTERNAL_POSTGRES_HOST`- host of `postgres` service as it is reachable from kubernetes cluster # How to run - ## Minikube example -Pre-requisites: +**Pre-requisites** -* `kubectl` installed -* `minikube` installed +* `minikube` [installed](https://minikube.sigs.k8s.io/docs/start/) +* `kubectl` [installed](https://kubernetes.io/docs/tasks/tools/) **Start minikube** @@ -30,22 +29,23 @@ Pre-requisites: minikube start ``` -**Get kubernetes config** +**Set kubernetes config** ```shell -kubectl config view +kubectl config view --raw=true --minify=true --flatten=true ``` +Put the modified config payload to `SYNCCTL_KUBERNETES_CLIENT_CONFIG` env variable in `.env` file (keep indentation intact: use line break after opening quotation marks symbol) + +**Adjust `.env` config** + +* Set `EXTERNAL_BULKER_HOST` and `EXTERNAL_POSTGRES_HOST` to: `host.minikube.internal` as it is how these services will be reachable from minikube +* Set `SYNCS_ENABLED` to `true` -**Copy minikube keys and certs to docker-compose volume** +**Start Jitsu** -* Check config for certificates, keys and CA file paths. -* Copy them to `data/syncctl` folder -* That folder is mounted to `syncctl` service to `/etc/syncctl` path -* Change paths in config to the new location of files in `/etc/syncctl` folder -* Change server host in config to `kubernetes` (that hostname is mapped to docker host in `syncctl` service and minikube certificates are signed for that host) -* Put the modified config payload to `SYNCCTL_KUBERNETES_CLIENT_CONFIG` env variable in `.env` file (keep indentation intact: use line break after opening quotation mark symbol) -* Set `EXTERNAL_BULKER_HOST` and `EXTERNAL_DATABASE_HOST` to: `host.minikube.internal` as it is how these services will be reachable from minikube -* Run docker compose `docker-compose --profile syncs up` +```shell +docker compose up +``` Keep in mind that minikube choose random port each time it starts. So you need to update server port in config each time you restart minikube. diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index d86183368..8279e0345 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -194,8 +194,8 @@ services: SYNCCTL_SYNCS_ENABLED: ${SYNCS_ENABLED:-false} SYNCCTL_AUTH_TOKENS: ${SYNCCTL_PASSWORD:-default} SYNCCTL_DATABASE_URL: "postgresql://postgres:${POSTGRES_PASSWORD:-default}@127.0.0.1:${EXTERNAL_POSTGRES_PORT:-5432}/postgres?search_path=newjitsu" - SYNCCTL_SIDECAR_DATABASE_URL: "postgresql://postgres:${POSTGRES_PASSWORD:-default}@${EXTERNAL_DATABASE_HOST}:${EXTERNAL_POSTGRES_PORT:-5432}/postgres?search_path=newjitsu" - SYNCCTL_BULKER_URL: "http://${EXTERNAL_BULKER_HOST}:${EXTERNAL_BULKER_PORT:-3045}" + SYNCCTL_SIDECAR_DATABASE_URL: "postgresql://postgres:${POSTGRES_PASSWORD:-default}@${EXTERNAL_POSTGRES_HOST}:${EXTERNAL_POSTGRES_PORT:-5432}/postgres?search_path=newjitsu" + SYNCCTL_BULKER_URL: "http://${EXTERNAL_BULKER_HOST}:${EXTERNAL_BULKER_PORT:-3042}" SYNCCTL_BULKER_AUTH_TOKEN: ${BULKER_PASSWORD:-default} SYNCCTL_BULKER_LOGS_CONNECTION_ID: task_log SYNCCTL_KUBERNETES_CLIENT_CONFIG: "${SYNCCTL_KUBERNETES_CLIENT_CONFIG:-local}" diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index f356e69ce..203102c73 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -572,12 +572,14 @@ function PageHeader() { items: [ { title: "Live Events", path: "/data", icon: }, { title: "Query Data", path: "/sql", icon: , hidden: !appConfig?.ee }, - { - title: "Event Statistics", - path: "/event-stat", - icon: , - hidden: !appConfig?.ee, - }, + appConfig.ee?.available + ? { + title: "Event Statistics", + path: "/event-stat", + icon: , + hidden: !appConfig?.ee, + } + : undefined, ], }, { From c53532b1f4fb3104654bc3a9ffffd251f32c1819 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 29 Jan 2024 18:40:52 +0400 Subject: [PATCH 0541/1353] console: catalog-refresh support initial mode console: Site setup instructions: added HTTP API --- docker/docker-compose.yml | 2 +- .../HTTPApi.tsx | 103 ++++++++++++++++++ .../{JavaScript.tsx => NPMPackage.tsx} | 2 +- .../TrackingIntegrationDocumentation.tsx | 22 +++- webapps/console/pages/[workspaceId]/index.tsx | 7 +- .../pages/api/admin/catalog-refresh.ts | 48 +++++--- 6 files changed, 162 insertions(+), 22 deletions(-) create mode 100644 webapps/console/components/TrackingIntegrationDocumentation/HTTPApi.tsx rename webapps/console/components/TrackingIntegrationDocumentation/{JavaScript.tsx => NPMPackage.tsx} (94%) diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 8279e0345..14c21a6ab 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -97,7 +97,7 @@ services: restart: "on-failure" environment: CONSOLE_PASSWORD: ${CONSOLE_PASSWORD:-default} - command: "curl -H 'Authorization: Bearer service-admin-account:${CONSOLE_PASSWORD:-default}' http://console:3000/api/admin/catalog-refresh" + command: "curl --silent --output nul --show-error -H 'Authorization: Bearer service-admin-account:${CONSOLE_PASSWORD:-default}' http://console:3000/api/admin/catalog-refresh?initial=true" depends_on: console: condition: service_healthy diff --git a/webapps/console/components/TrackingIntegrationDocumentation/HTTPApi.tsx b/webapps/console/components/TrackingIntegrationDocumentation/HTTPApi.tsx new file mode 100644 index 000000000..a31b4f53d --- /dev/null +++ b/webapps/console/components/TrackingIntegrationDocumentation/HTTPApi.tsx @@ -0,0 +1,103 @@ +import { CodeBlock } from "../CodeBlock/CodeBlock"; + +export const HTTPManual: React.FC<{ domain: string; writeKey?: string }> = ({ domain, writeKey }) => { + return ( +
    +
    +

    HTTP API

    +

    + You can use server to server API to send data to Jitsu. This is useful if you want to send data from your + backend. +

    +

    In case of using HTTP API you may need to manually ad user's IP address and User Agent to the event.

    +

    Ingest endpoint

    +

    This endpoint can be used to send events to Jitsu:

    + {`${domain}/api/s/s2s/{event-type}`} +

    Event type could be:

    +
      +
    • + page, track, identify or group +
    • +
    • + Use event as event_type if you want server to take actual event type from{" "} + type field of the event payload +
    • +
    +

    + The endpoint accepts POST requests with events payload in JSON format. Pay attention to s2s part + of the URL. +
    + The presence of this part indicates that the event is sent from server-to-server. Unlike browser events, s2s + events are processed differently: +

    +
      +
    • + Presence of X-Write-Key is mandatory, and the header should contain server write key of the + site +
    • +
    • + request_ip and userAgent are not extracted from the request headers, but should be + passed explicitly in the event payload +
    • +
    • + If request_ip is not present, the ip field will be empty to avoid confusion; same applies for{" "} + userAgent +
    • +
    +

    Examples

    +

    + Send track event: +

    + {`curl --location '${domain}/api/s/s2s/track' \\ +--header 'Content-Type: application/json' \\ +--header 'X-Write-Key: ${writeKey}' \\ +--data-raw '{ + "type": "track", + "event": "testEvent", + "properties": { + "testProp": "test event properties" + }, + "userId": "user@example.com", + "anonymousId": "bKTtbVZw3yiqCJvCSJgjVeXp", + "timestamp": "2023-04-12T13:29:04.690Z", + "sentAt": "2023-04-12T13:29:04.690Z", + "messageId": "voV6fulcZR4CTVnN89AnxFnC", + "context": { + "library": { + "name": "jitsu-js", + "version": "1.0.0" + }, + "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/111.0", + "locale": "en-US", + "screen": { + "width": 2304, + "height": 1296, + "innerWidth": 1458, + "innerHeight": 1186, + "density": 2 + }, + "traits": { + "email": "user@example.com" + }, + "page": { + "path": "/", + "referrer": "", + "referring_domain": "", + "host": "example.com", + "search": "", + "title": "Example page event", + "url": "https://example.com/", + "enconding": "UTF-8" + }, + "campaign": { + "name": "example", + "source": "g" + } + }, + "request_ip": "127.0.0.1", + "receivedAt": "2023-04-12T13:29:04.690Z" +}'`} +
    +
    + ); +}; diff --git a/webapps/console/components/TrackingIntegrationDocumentation/JavaScript.tsx b/webapps/console/components/TrackingIntegrationDocumentation/NPMPackage.tsx similarity index 94% rename from webapps/console/components/TrackingIntegrationDocumentation/JavaScript.tsx rename to webapps/console/components/TrackingIntegrationDocumentation/NPMPackage.tsx index 0952c95d4..185539286 100644 --- a/webapps/console/components/TrackingIntegrationDocumentation/JavaScript.tsx +++ b/webapps/console/components/TrackingIntegrationDocumentation/NPMPackage.tsx @@ -10,7 +10,7 @@ function getExampleJsonConfig() { ); } -export const JavaScriptManual: React.FC<{ domain: string; writeKey?: string }> = ({ domain, writeKey }) => { +export const NPMManual: React.FC<{ domain: string; writeKey?: string }> = ({ domain, writeKey }) => { return (
    diff --git a/webapps/console/components/TrackingIntegrationDocumentation/TrackingIntegrationDocumentation.tsx b/webapps/console/components/TrackingIntegrationDocumentation/TrackingIntegrationDocumentation.tsx index 7ed2da1c7..325d796e0 100644 --- a/webapps/console/components/TrackingIntegrationDocumentation/TrackingIntegrationDocumentation.tsx +++ b/webapps/console/components/TrackingIntegrationDocumentation/TrackingIntegrationDocumentation.tsx @@ -11,13 +11,13 @@ import { ReactManual } from "./React"; import { useURLPersistedState } from "../../lib/ui"; import { ButtonLabel } from "../ButtonLabel/ButtonLabel"; import { FiMonitor } from "react-icons/fi"; -import { FaReact } from "react-icons/fa"; -import { IoLogoJavascript } from "react-icons/io5"; -import { JavaScriptManual } from "./JavaScript"; +import { FaGlobe, FaNodeJs, FaReact } from "react-icons/fa"; +import { NPMManual } from "./NPMPackage"; import { Segment } from "./Segment"; import { useAppConfig } from "../../lib/context"; import { ReactNode, useState } from "react"; import { HiSelector } from "react-icons/hi"; +import { HTTPManual } from "./HTTPApi"; function SegmentLogo() { return ( @@ -116,6 +116,9 @@ export const TrackingIntegrationDocumentation: React.FC<{ streamId: string; onCa : stream?.publicKeys?.[0] ? `${stream.publicKeys[0].id}:${stream.publicKeys[0].hint}` : streamId || "{write-key}"; + const serverWriteKey = stream?.privateKeys?.[0] + ? `${stream.privateKeys[0].id}:${stream.privateKeys[0].hint}` + : "{server-write-key}"; const displayDomain = `${appConfig.publicEndpoints.protocol}://${selectedDomain ?? domains?.[0]}`; const wrap = (r: ReactNode) => { return ( @@ -170,9 +173,9 @@ export const TrackingIntegrationDocumentation: React.FC<{ streamId: string; onCa children: wrap(), }, { - label: }>JavaScript, + label: }>NPM Package, key: "js", - children: wrap(), + children: wrap(), }, { label: ( @@ -189,6 +192,15 @@ export const TrackingIntegrationDocumentation: React.FC<{ streamId: string; onCa key: "segment", children: wrap(), }, + { + label: ( + }> + HTTP API + + ), + key: "http", + children: wrap(), + }, ]} /> )} diff --git a/webapps/console/pages/[workspaceId]/index.tsx b/webapps/console/pages/[workspaceId]/index.tsx index 27bd8292f..e229aae3a 100644 --- a/webapps/console/pages/[workspaceId]/index.tsx +++ b/webapps/console/pages/[workspaceId]/index.tsx @@ -14,7 +14,7 @@ import { QuestionCircleOutlined } from "@ant-design/icons"; import { ProvisionDatabaseButton } from "../../components/ProvisionDatabaseButton/ProvisionDatabaseButton"; import { ConnectionsDiagram } from "../../components/ConnectionsDiagram/ConnectionsDiagram"; import { getLog } from "juava"; -import { Activity, Chrome, Edit3, MoreVertical, Share2, Zap } from "lucide-react"; +import { Activity, Chrome, Edit3, MoreVertical, Share2, Wrench, Zap } from "lucide-react"; import classNames from "classnames"; import { toURL } from "../../lib/shared/url"; import JSON5 from "json5"; @@ -308,6 +308,11 @@ function WorkspaceOverview(props: { btoa(JSON.stringify({ columns: [{ field: "Source", order: "ascend" }] })) )}&source=${encodeURIComponent(id)}`, }, + { + label: "Setup Instructions", + icon: , + href: `/streams?id=${id}&implementationFor=${id}`, + }, ]} /> ), diff --git a/webapps/console/pages/api/admin/catalog-refresh.ts b/webapps/console/pages/api/admin/catalog-refresh.ts index 0e078a2b0..2e5d2332a 100644 --- a/webapps/console/pages/api/admin/catalog-refresh.ts +++ b/webapps/console/pages/api/admin/catalog-refresh.ts @@ -3,6 +3,7 @@ import { db } from "../../../lib/server/db"; import { rpc } from "juava"; import { z } from "zod"; import { getServerLog } from "../../../lib/server/log"; +import { isTruish } from "../../../lib/shared/chores"; const log = getServerLog("catalog-refresh"); const yaml = require("js-yaml"); @@ -26,13 +27,18 @@ function shuffle(arr: T[]) { } export default createRoute() - .GET({ auth: true, query: z.object({ limit: z.string().optional(), source: z.string().optional() }) }) + .GET({ + auth: true, + query: z.object({ limit: z.string().optional(), source: z.string().optional(), initial: z.string().optional() }), + }) .handler(async ({ user, req, query }) => { if (!process.env.SYNCS_ENABLED) { return; } await verifyAdmin(user); + const initialMode = isTruish(query.initial); + const sources: string[] = (await rpc(`https://api.github.com/repos/${repo}/contents/${basePath}?ref=${branch}`)) .filter(({ name }) => name.startsWith("source-")) .filter(({ name }) => !query.source || name === query.source || `airbyte/${name}` === query.source) @@ -47,7 +53,7 @@ export default createRoute() const promises: Promise[] = []; for (let i = 0; i < max; i++) { const src = sources[i]; - promises.push(processSrc(src)); + promises.push(processSrc(src, initialMode)); if (i % 10 === 0) { const results = await Promise.all(promises); for (const result of results) { @@ -70,7 +76,19 @@ export default createRoute() }) .toNextApiHandler(); -async function processSrc(src: string) { +async function processSrc(src: string, initial?: boolean) { + const presentId = ( + await db.prisma().connectorPackage.findFirst({ where: { packageId: `airbyte/${src}`, packageType: "airbyte" } }) + )?.id; + if (presentId && initial) { + log.atDebug().log(`Skipping ${src} because it's already in the database`); + return { [`airbyte/${src}`]: "already initialized" }; + } + let logger = log.atInfo(); + if (initial) { + // initial is used in docker-compose init. no need for logs spam + logger = log.atDebug(); + } const mitVersions = new Set(); const otherVersions: Record> = {}; const metadataUrl = `https://raw.githubusercontent.com/${repo}/master/${basePath}/${src}/metadata.yaml`; @@ -78,7 +96,7 @@ async function processSrc(src: string) { let packageId: string | undefined = undefined; let metadata: any = {}; let icon: Buffer | undefined = undefined; - log.atDebug().log(`Processing ${src}: ${metadataUrl}`); + logger.log(`Processing ${src}: ${metadataUrl}`); if (res.ok) { metadata = yaml.load(await res.text(), { json: true }); @@ -87,10 +105,10 @@ async function processSrc(src: string) { if (!license || license.toLowerCase() !== "mit") { const pageSize = 100; // max supported by github API const commitHistory = `https://api.github.com/repos/${repo}/commits?path=/${basePath}/${src}/metadata.yaml&per_page=${pageSize}`; - log.atDebug().log(`Source ${src} has ${license} license. Looking for MIT versions at ${commitHistory}`); + logger.log(`Source ${src} has ${license} license. Looking for MIT versions at ${commitHistory}`); for (let page = 1; page <= 10; page++) { const commits = await rpc(commitHistory + "&page=" + page); - log.atDebug().log(`Source ${src} found ${commits.length} commits (page ${page})`); + logger.log(`Source ${src} found ${commits.length} commits (page ${page})`); for (const { sha } of commits) { const commitFile = `https://raw.githubusercontent.com/${repo}/${sha}/${basePath}/${src}/metadata.yaml`; const oldYml = await fetch(commitFile); @@ -100,9 +118,9 @@ async function processSrc(src: string) { if (license === "mit") { const dockerVersion = oldMeta.data?.dockerImageTag; if (!dockerVersion) { - log.atDebug().log(`MIT version of ${src} doesn't have dockerImageTag: ${commitFile}`); + logger.log(`MIT version of ${src} doesn't have dockerImageTag: ${commitFile}`); } else { - log.atDebug().log(`Found MIT version of ${src} --> ${dockerVersion}`); + logger.log(`Found MIT version of ${src} --> ${dockerVersion}`); mitVersions.add(dockerVersion); } } else { @@ -132,13 +150,10 @@ async function processSrc(src: string) { if (iconRes.ok) { icon = Buffer.from(await iconRes.arrayBuffer()); } else { - log.atDebug().log(`Source ${src} icon file ${metadata.data?.icon} doesn't exist at ${iconUrl}`); + logger.log(`Source ${src} icon file ${metadata.data?.icon} doesn't exist at ${iconUrl}`); } } - const currentId = ( - await db.prisma().connectorPackage.findFirst({ where: { packageId: packageId, packageType: "airbyte" } }) - )?.id; const data = { packageId: packageId as string, packageType: "airbyte", @@ -149,12 +164,17 @@ async function processSrc(src: string) { }, logoSvg: icon, }; + + const currentId = + presentId || + (await db.prisma().connectorPackage.findFirst({ where: { packageId: packageId, packageType: "airbyte" } }))?.id; + if (currentId) { - log.atDebug().log(`Updating ${packageId} info. Has icon: ${!!icon}, has metadata: ${!!metadata}`); + logger.log(`Updating ${packageId} info. Has icon: ${!!icon}, has metadata: ${!!metadata}`); await db.prisma().connectorPackage.update({ where: { id: currentId }, data }); return { [`${packageId}`]: "updated" }; } else { - log.atDebug().log(`Creating ${packageId} info. Has icon: ${!!icon}, has metadata: ${!!metadata}`); + logger.log(`Creating ${packageId} info. Has icon: ${!!icon}, has metadata: ${!!metadata}`); await db.prisma().connectorPackage.create({ data: data }); return { [`${packageId}`]: "created" }; } From 473121ad3caadf37610f7b7554572f2a8b93b54d Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Mon, 29 Jan 2024 13:25:53 -0500 Subject: [PATCH 0542/1353] added x-frame-options header to ee server --- webapps/ee-api/next.config.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/webapps/ee-api/next.config.js b/webapps/ee-api/next.config.js index 69b35e09f..ec0187971 100644 --- a/webapps/ee-api/next.config.js +++ b/webapps/ee-api/next.config.js @@ -11,7 +11,20 @@ const nextConfig = { use: "raw-loader", }); return config; - } + }, + async headers() { + return [ + { + source: "/:path*{/}?", + headers: [ + { + key: "X-Frame-Options", + value: "DENY", + }, + ], + }, + ]; + }, } const withTM = require('next-transpile-modules')(['juava']); // pass the modules you would like to see transpiled From 66a7609378d4ddd26b135fc8dc88b06e976a5a75 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 30 Jan 2024 17:15:19 +0400 Subject: [PATCH 0543/1353] mixpanel-destination: fill device info even for web traffic --- libs/core-functions/src/functions/mixpanel-destination.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libs/core-functions/src/functions/mixpanel-destination.ts b/libs/core-functions/src/functions/mixpanel-destination.ts index fb2c2845c..82c23946c 100644 --- a/libs/core-functions/src/functions/mixpanel-destination.ts +++ b/libs/core-functions/src/functions/mixpanel-destination.ts @@ -155,10 +155,10 @@ function trackEvent( // $brand: "google", // $had_persisted_distinct_id: false, // $has_nfc: false, - $device_type: analyticsContext.device?.type, - $device_name: analyticsContext.device?.name, - $manufacturer: analyticsContext.device?.manufacturer, - $model: analyticsContext.device?.model, + $device_type: analyticsContext.device?.type || ctx.ua?.device?.type, + $device_name: analyticsContext.device?.name || ctx.ua?.device?.model, + $manufacturer: analyticsContext.device?.manufacturer || ctx.ua?.device?.vendor, + $model: analyticsContext.device?.model || ctx.ua?.device?.model, advertising_id: analyticsContext.device?.advertisingId, ad_tracking_enabled: analyticsContext.device?.adTrackingEnabled, From a00670306315dc33f2b8818105403366eaf2cdbe Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 30 Jan 2024 18:12:37 +0400 Subject: [PATCH 0544/1353] console: make github auth optional various self-hosted related fixes --- docker/.env.example | 19 ++++---- docker/README.md | 21 +++----- docker/docker-compose.yml | 44 ++++++++--------- libs/juava/src/security.ts | 9 ++-- .../PageLayout/WorkspacePageLayout.tsx | 2 +- webapps/console/lib/nextauth.config.ts | 34 ++++++------- webapps/console/lib/schema/index.ts | 1 + webapps/console/lib/server/firebase-server.ts | 4 ++ webapps/console/lib/server/sync.ts | 5 +- webapps/console/pages/_app.tsx | 10 +++- webapps/console/pages/api/app-config.ts | 8 +++- webapps/console/public/logo-with-text.svg | 48 +++++++++++++++++++ 12 files changed, 131 insertions(+), 74 deletions(-) create mode 100644 webapps/console/public/logo-with-text.svg diff --git a/docker/.env.example b/docker/.env.example index ecb3e109f..15f7c9220 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -1,23 +1,26 @@ ### Required ### -GITHUB_CLIENT_ID= -GITHUB_CLIENT_SECRET= +# comma-separated list of admin user credentials in format email:password, e.g.: email1@example.com:password1,email2@example.com:password2 +ADMIN_CREDENTIALS= # Domain name of your Jitsu server where events will be sent. E.g. jitsu.mycompany.com INGEST_DOMAIN=localhost # Public URL of your Jitsu UI. E.g. https://jitsu.mycompany.com:3000 or http://localhost:3000 JITSU_PUBLIC_URL=http://localhost:3000 #### Secrets ### -CONSOLE_PASSWORD=change_me +# It is highly recommended to generate random values for those variables. +# You can use `openssl rand -hex 32` to generate random values. +CONSOLE_TOKEN=change_me POSTGRES_PASSWORD=change_me -BULKER_PASSWORD=change_me -SYNCCTL_PASSWORD=change_me +BULKER_TOKEN=change_me +SYNCCTL_TOKEN=change_me ### Optional ### JITSU_UI_PORT=3000 JITSU_INGEST_PORT=8080 -# comma-separated list of test user credentials in format email:password, e.g.: email1@example.com:password1,email2@example.com:password2 -TEST_CREDENTIALS= +### Github OAuth ### +GITHUB_CLIENT_ID= +GITHUB_CLIENT_SECRET= ### Connectors specific ### SYNCS_ENABLED=false @@ -44,7 +47,5 @@ SYNCCTL_KUBERNETES_CONTEXT= # For syncs scheduling # google service account key GOOGLE_SCHEDULER_KEY= -# Sheduler location region, e.g. us-central1 -GOOGLE_SCHEDULER_LOCATION= # for Google Ads connector GOOGLE_ADS_DEVELOPER_TOKEN= \ No newline at end of file diff --git a/docker/README.md b/docker/README.md index ee332e444..03699272d 100644 --- a/docker/README.md +++ b/docker/README.md @@ -18,9 +18,15 @@ cp .env.example .env 2. Set up all required variables in `.env` file. +#### `ADMIN_CREDENTIALS` + +**Required** + +Comma-separated list of admin user credentials in format email:password, e.g.: email1@example.com:password1,email2@example.com:password2 + #### `JITSU_PUBLIC_URL` -This is a URL where Jitsu UI will be available. +This is an URL where Jitsu UI will be available. When using jitsu locally, no need to set this variable. @@ -28,19 +34,6 @@ When using jitsu locally, no need to set this variable. When UI is deployed on remote server, set it with your remote server URL, e.g.: `https://jitsu.mycompany.com:3000`. -#### `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET` - -Jitsu self-hosted authorization is based on GitHub OAuth. - -You'll need to create a GitHub OAuth application to get those values: - -* Go to [Github Developer settings](https://github.com/settings/developers) » **OAuth Apps** » **New OAuth App**. -* Put any value to `Application name` -* Set `Homepage URL` and `Authorization callback URL` with `JITSU_PUBLIC_URL` value -* Press `Register application` button -* Press `Generate a new client secret` button -* Copy `Client ID` and `Client Secret` values to `.env` file to `GITHUB_CLIENT_ID` and `GITHUB_CLIENT_SECRET` variables respectively. - #### `INGEST_DOMAIN` Domain of the Jitsu Ingest API how it is available for external users. Ingest API is used for sending events to Jitsu. diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 14c21a6ab..9f2a42a48 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -16,16 +16,16 @@ services: interval: 5s timeout: 10s retries: 30 - volumes: - - ./data/kafka:/bitnami/kafka + # volumes: + # - ./data/kafka:/bitnami/kafka redis: tty: true image: redis:6.2-alpine restart: "unless-stopped" command: "redis-server --save 20 1 --loglevel warning --requirepass ${REDIS_PASSWORD:-default}" - volumes: - - ./data/redis:/var/lib/redis + # volumes: + # - ./data/redis:/var/lib/redis postgres: tty: true @@ -46,6 +46,7 @@ services: retries: 10 ports: - "${EXTERNAL_POSTGRES_PORT:-5432}:5432" + ## permissions problem is not that trivial to solve https://forums.docker.com/t/data-directory-var-lib-postgresql-data-pgdata-has-wrong-ownership/17963/42 # volumes: # - ./data/postgres:/var/lib/postgresql/data @@ -59,20 +60,18 @@ services: INGEST_PORT: ${JITSU_INGEST_PORT:-8080} ROTOR_URL: "http://rotor:3401" BULKER_URL: "http://bulker:3042" - CONSOLE_AUTH_TOKENS: ${CONSOLE_PASSWORD:-default} - BULKER_AUTH_KEY: ${BULKER_PASSWORD:-default} - MIT_COMPLIANT: ${MIT_COMPLIANT:-true} + CONSOLE_AUTH_TOKENS: ${CONSOLE_TOKEN:-default} + BULKER_AUTH_KEY: ${BULKER_TOKEN:-default} + MIT_COMPLIANT: ${MIT_COMPLIANT:-false} DATABASE_URL: "postgresql://postgres:${POSTGRES_PASSWORD:-default}@postgres:5432/postgres?schema=newjitsu" REDIS_URL: "redis://default:${REDIS_PASSWORD:-default}@redis:6379" - TEST_CREDENTIALS: ${TEST_CREDENTIALS} - TEST_CREDENTIALS_SHOW_LOGIN: "true" + ADMIN_CREDENTIALS: ${ADMIN_CREDENTIALS} GITHUB_CLIENT_ID: ${GITHUB_CLIENT_ID} GITHUB_CLIENT_SECRET: ${GITHUB_CLIENT_SECRET} SYNCS_ENABLED: ${SYNCS_ENABLED:-false} SYNCCTL_URL: "http://syncctl:${EXTERNAL_SYNCS_PORT:-3043}" - SYNCCTL_AUTH_KEY: ${SYNCCTL_PASSWORD:-default} + SYNCCTL_AUTH_KEY: ${SYNCCTL_TOKEN:-default} GOOGLE_SCHEDULER_KEY: ${GOOGLE_SCHEDULER_KEY} - GOOGLE_SCHEDULER_LOCATION: ${GOOGLE_SCHEDULER_LOCATION:-us-central1} JITSU_PUBLIC_URL: "${JITSU_PUBLIC_URL:-${NEXTAUTH_URL:-http://localhost:${JITSU_UI_PORT:-3000}/}}" NEXTAUTH_URL: "${JITSU_PUBLIC_URL:-${NEXTAUTH_URL:-http://localhost:${JITSU_UI_PORT:-3000}/}}" UPDATE_DB: "true" @@ -96,8 +95,8 @@ services: image: curlimages/curl restart: "on-failure" environment: - CONSOLE_PASSWORD: ${CONSOLE_PASSWORD:-default} - command: "curl --silent --output nul --show-error -H 'Authorization: Bearer service-admin-account:${CONSOLE_PASSWORD:-default}' http://console:3000/api/admin/catalog-refresh?initial=true" + CONSOLE_TOKEN: ${CONSOLE_TOKEN:-default} + command: "curl --silent --output nul --show-error -H 'Authorization: Bearer service-admin-account:${CONSOLE_TOKEN:-default}' http://console:3000/api/admin/catalog-refresh?initial=true" depends_on: console: condition: service_healthy @@ -110,9 +109,9 @@ services: environment: TERM: "xterm-256color" BULKER_KAFKA_BOOTSTRAP_SERVERS: "kafka:9092" - BULKER_AUTH_TOKENS: ${BULKER_PASSWORD:-default} + BULKER_AUTH_TOKENS: ${BULKER_TOKEN:-default} BULKER_CONFIG_SOURCE: "http://console:3000/api/admin/export/bulker-connections" - BULKER_CONFIG_SOURCE_HTTP_AUTH_TOKEN: "service-admin-account:${CONSOLE_PASSWORD:-default}" + BULKER_CONFIG_SOURCE_HTTP_AUTH_TOKEN: "service-admin-account:${CONSOLE_TOKEN:-default}" BULKER_CACHE_DIR: "/tmp/cache" REDIS_URL: "redis://default:${REDIS_PASSWORD:-default}@redis:6379" BULKER_INTERNAL_TASK_LOG: '{"id":"task_log","metricsKeyPrefix":"syncs","usesBulker":true,"type":"postgres","options":{"mode":"stream"},"credentials":{"host":"postgres","port":5432,"sslMode":"disable","database":"postgres","password":"${POSTGRES_PASSWORD:-default}","username":"postgres","defaultSchema":"newjitsu"}}' @@ -138,11 +137,11 @@ services: DISABLE_SERVICE_prisma: "true" DISABLE_SERVICE_pg: "true" BULKER_URL: "http://bulker:3042" - BULKER_AUTH_KEY: ${BULKER_PASSWORD:-default} + BULKER_AUTH_KEY: ${BULKER_TOKEN:-default} KAFKA_BOOTSTRAP_SERVERS: "kafka:9092" REDIS_URL: "redis://default:${REDIS_PASSWORD:-default}@redis:6379" REPOSITORY_BASE_URL: "http://console:3000/api/admin/export/" - REPOSITORY_AUTH_TOKEN: "service-admin-account:${CONSOLE_PASSWORD:-default}" + REPOSITORY_AUTH_TOKEN: "service-admin-account:${CONSOLE_TOKEN:-default}" REPOSITORY_CACHE_DIR: "/tmp/cache" healthcheck: test: ["CMD", "curl", "-f", "http://rotor:3401/health"] @@ -164,9 +163,9 @@ services: TERM: "xterm-256color" INGEST_DATA_DOMAIN: ${INGEST_DOMAIN:-localhost} INGEST_KAFKA_BOOTSTRAP_SERVERS: "kafka:9092" - INGEST_AUTH_TOKENS: ${BULKER_PASSWORD:-default} + INGEST_AUTH_TOKENS: ${BULKER_TOKEN:-default} INGEST_REPOSITORY_URL: "http://console:3000/api/admin/export/streams-with-destinations" - INGEST_REPOSITORY_AUTH_TOKEN: "service-admin-account:${CONSOLE_PASSWORD:-default}" + INGEST_REPOSITORY_AUTH_TOKEN: "service-admin-account:${CONSOLE_TOKEN:-default}" INGEST_CACHE_DIR: "/tmp/cache" INGEST_REDIS_URL: "redis://default:${REDIS_PASSWORD:-default}@redis:6379" INGEST_ROTOR_URL: "http://rotor:3401" @@ -192,16 +191,13 @@ services: TERM: "xterm-256color" HTTP_PORT: ${EXTERNAL_SYNCS_PORT:-3043} SYNCCTL_SYNCS_ENABLED: ${SYNCS_ENABLED:-false} - SYNCCTL_AUTH_TOKENS: ${SYNCCTL_PASSWORD:-default} + SYNCCTL_AUTH_TOKENS: ${SYNCCTL_TOKEN:-default} SYNCCTL_DATABASE_URL: "postgresql://postgres:${POSTGRES_PASSWORD:-default}@127.0.0.1:${EXTERNAL_POSTGRES_PORT:-5432}/postgres?search_path=newjitsu" SYNCCTL_SIDECAR_DATABASE_URL: "postgresql://postgres:${POSTGRES_PASSWORD:-default}@${EXTERNAL_POSTGRES_HOST}:${EXTERNAL_POSTGRES_PORT:-5432}/postgres?search_path=newjitsu" SYNCCTL_BULKER_URL: "http://${EXTERNAL_BULKER_HOST}:${EXTERNAL_BULKER_PORT:-3042}" - SYNCCTL_BULKER_AUTH_TOKEN: ${BULKER_PASSWORD:-default} - SYNCCTL_BULKER_LOGS_CONNECTION_ID: task_log + SYNCCTL_BULKER_AUTH_TOKEN: ${BULKER_TOKEN:-default} SYNCCTL_KUBERNETES_CLIENT_CONFIG: "${SYNCCTL_KUBERNETES_CLIENT_CONFIG:-local}" SYNCCTL_KUBERNETES_CONTEXT: "${SYNCCTL_KUBERNETES_CONTEXT}" - volumes: - - ./data/syncctl:/etc/syncctl network_mode: "host" depends_on: bulker: diff --git a/libs/juava/src/security.ts b/libs/juava/src/security.ts index f604ad532..28addfd5d 100644 --- a/libs/juava/src/security.ts +++ b/libs/juava/src/security.ts @@ -24,10 +24,13 @@ export function createHash(secret: string): string { } export function checkToken(hashOrPlain: string, secret: string): boolean { - if (hashOrPlain.indexOf(".") === -1) { - return secret === hashOrPlain; + if (secret === hashOrPlain) { + return true; } - return checkHash(hashOrPlain, secret); + if (hashOrPlain.indexOf(".") >= 0) { + return checkHash(hashOrPlain, secret); + } + return false; } export function checkHash(hash: string, secret: string): boolean { diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index 203102c73..c782bc33d 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -114,7 +114,7 @@ function WorkspacesMenu(props: { jitsuClassicAvailable: boolean }) { let additionalMenuItems: MenuItemType[] = []; if (error) { log.atWarn().log("Failed to load user properties", error); - } else if (data?.admin && appConfig.auth) { + } else if (data?.admin && appConfig.auth?.firebasePublic) { additionalMenuItems = [ { key: "admin-users", diff --git a/webapps/console/lib/nextauth.config.ts b/webapps/console/lib/nextauth.config.ts index 132ee1d19..e319efd75 100644 --- a/webapps/console/lib/nextauth.config.ts +++ b/webapps/console/lib/nextauth.config.ts @@ -1,5 +1,4 @@ import GithubProvider from "next-auth/providers/github"; -import GoogleProvider from "next-auth/providers/google"; import CredentialsProvider from "next-auth/providers/credentials"; import { NextAuthOptions, User } from "next-auth"; import { db } from "./server/db"; @@ -13,10 +12,10 @@ const crypto = require("crypto"); const log = getServerLog("auth"); -const googleProvider = GoogleProvider({ - clientId: "942257799287-a7jjl052dugnfav58ij8lihq17o9mc41.apps.googleusercontent.com", - clientSecret: "1eEfuTzfp5f9ZkDHg4YqnqhE", -}); +// const googleProvider = GoogleProvider({ +// clientId: "942257799287-a7jjl052dugnfav58ij8lihq17o9mc41.apps.googleusercontent.com", +// clientSecret: "1eEfuTzfp5f9ZkDHg4YqnqhE", +// }); const githubProvider = GithubProvider({ clientId: process.env.GITHUB_CLIENT_ID as string, clientSecret: process.env.GITHUB_CLIENT_SECRET as string, @@ -34,14 +33,14 @@ const firebase = { }; const credentialsProvider = - process.env.TEST_CREDENTIALS && + (process.env.ADMIN_CREDENTIALS || !process.env.GITHUB_CLIENT_ID) && CredentialsProvider({ authorize(credentials) { - if (!process.env.TEST_CREDENTIALS || !credentials) { + if (!process.env.ADMIN_CREDENTIALS || !credentials) { return null; } log.atInfo().log(JSON.stringify(credentials)); - const userRecord = process.env.TEST_CREDENTIALS.split(",") + const userRecord = process.env.ADMIN_CREDENTIALS.split(",") .map(s => s.trim().split(":")) .find(([user]) => user.toLowerCase() === credentials.username.toLowerCase()); if (!userRecord) { @@ -109,21 +108,24 @@ function generateSecret(base: (string | undefined)[]) { return secretKey; } +const providers: any[] = []; +if (process.env.GITHUB_CLIENT_ID && process.env.GITHUB_CLIENT_SECRET) { + providers.push(githubProvider); +} +providers.push(credentialsProvider); + export const nextAuthConfig: NextAuthOptions = { // Configure one or more authentication providers - providers: [githubProvider, googleProvider, credentialsProvider].filter(provider => !!provider) as any, + providers: providers.filter(provider => !!provider) as any, pages: { error: "/error/auth", // Error code passed in query string as ?error= }, - + theme: { + logo: "/logo-with-text.svg", + }, secret: process.env.JWT_SECRET || - generateSecret([ - process.env.GITHUB_CLIENT_ID, - process.env.GOOGLE_CLIENT_ID, - process.env.DATABASE_URL, - process.env.REDIS_URL, - ]), + generateSecret([process.env.GITHUB_CLIENT_ID, process.env.DATABASE_URL, process.env.REDIS_URL]), callbacks: { jwt: async props => { const loginProvider = (props.account?.provider || props.token.loginProvider || "credentials") as string; diff --git a/webapps/console/lib/schema/index.ts b/webapps/console/lib/schema/index.ts index ab630d486..e1f1d94a1 100644 --- a/webapps/console/lib/schema/index.ts +++ b/webapps/console/lib/schema/index.ts @@ -76,6 +76,7 @@ export const AppConfig = z.object({ auth: z .object({ firebasePublic: z.any(), + githubEnabled: z.boolean().optional(), }) .optional(), frontendTelemetry: z.object({ diff --git a/webapps/console/lib/server/firebase-server.ts b/webapps/console/lib/server/firebase-server.ts index 92aa55286..caadc877d 100644 --- a/webapps/console/lib/server/firebase-server.ts +++ b/webapps/console/lib/server/firebase-server.ts @@ -41,6 +41,10 @@ export function isFirebaseEnabled(): boolean { return !!(process.env.FIREBASE_AUTH || (process.env.FIREBASE_ADMIN && process.env.FIREBASE_CLIENT_CONFIG)); } +export function isGithubEnabled(): boolean { + return !!(process.env.GITHUB_CLIENT_ID && process.env.GITHUB_CLIENT_SECRET); +} + const bearerPrefix = "bearer "; const firebaseService: Singleton = getSingleton("firebase-service", () => { diff --git a/webapps/console/lib/server/sync.ts b/webapps/console/lib/server/sync.ts index befe2e44f..031125a53 100644 --- a/webapps/console/lib/server/sync.ts +++ b/webapps/console/lib/server/sync.ts @@ -323,10 +323,7 @@ export async function syncWithScheduler(baseUrl: string) { } const googleSchedulerKey = JSON.parse(googleSchedulerKeyJson); const googleSchedulerProjectId = googleSchedulerKey.project_id; - const googleSchedulerLocation = requireDefined( - process.env.GOOGLE_SCHEDULER_LOCATION, - "env GOOGLE_SCHEDULER_LOCATION is not defined" - ); + const googleSchedulerLocation = process.env.GOOGLE_SCHEDULER_LOCATION || "us-central1"; const googleSchedulerParent = `projects/${googleSchedulerProjectId}/locations/${googleSchedulerLocation}`; const allSyncs = await db.prisma().configurationObjectLink.findMany({ diff --git a/webapps/console/pages/_app.tsx b/webapps/console/pages/_app.tsx index 0b58f63d6..c3ada9a1e 100644 --- a/webapps/console/pages/_app.tsx +++ b/webapps/console/pages/_app.tsx @@ -274,11 +274,19 @@ function NextJsSigninForm() { const signInAndRedirect = async (provider: string) => { await signIn(provider); }; + useEffect(() => { + if (!appConfig.auth?.githubEnabled) { + router.push("/api/auth/signin"); + } + }, [appConfig.auth, router]); return ( <>
    -

    {signup ? "Sign Up" : "Sign In"}

    +
    +
    {branding.logo}
    +
    {branding.wordmark}
    +
    } type="primary" diff --git a/webapps/console/pages/api/app-config.ts b/webapps/console/pages/api/app-config.ts index 6a339f396..eb0da9d19 100644 --- a/webapps/console/pages/api/app-config.ts +++ b/webapps/console/pages/api/app-config.ts @@ -3,7 +3,7 @@ import { AppConfig } from "../../lib/schema"; import { getAppEndpoint } from "../../lib/domains"; import { getEeConnection } from "../../lib/server/ee"; import { isEEAvailable } from "./ee/jwt"; -import { isFirebaseEnabled, requireFirebaseOptions } from "../../lib/server/firebase-server"; +import { isFirebaseEnabled, isGithubEnabled, requireFirebaseOptions } from "../../lib/server/firebase-server"; import { nangoConfig } from "../../lib/server/oauth/nango-config"; import { isTruish } from "../../lib/shared/chores"; import { readOnlyUntil } from "../../lib/server/read-only-mode"; @@ -22,7 +22,7 @@ export default createRoute() return { docsUrl: process.env.JITSU_DOCUMENTATION_URL || "https://docs-jitsu-com.staging.jitsu.com/", readOnlyUntil: readOnlyUntil?.toISOString(), - credentialsLoginEnabled: !!process.env.TEST_CREDENTIALS && !!process.env.TEST_CREDENTIALS_SHOW_LOGIN, + credentialsLoginEnabled: !!process.env.ADMIN_CREDENTIALS, ee: { available: isEEAvailable(), host: isEEAvailable() ? getEeConnection().host : undefined, @@ -32,6 +32,10 @@ export default createRoute() ? { firebasePublic: requireFirebaseOptions().client, } + : isGithubEnabled() + ? { + githubEnabled: true, + } : undefined, billingEnabled: isEEAvailable(), customDomainsEnabled: customDomainCnames && customDomainCnames.length > 0, diff --git a/webapps/console/public/logo-with-text.svg b/webapps/console/public/logo-with-text.svg new file mode 100644 index 000000000..511c10f6d --- /dev/null +++ b/webapps/console/public/logo-with-text.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + From 60a22485cff8b723cd326f0ef78fe8b7468d83f7 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 30 Jan 2024 19:07:09 +0400 Subject: [PATCH 0545/1353] docker-compose.yml switch version to latest --- docker/docker-compose.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 9f2a42a48..f44787d1c 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -52,7 +52,7 @@ services: console: tty: true - image: jitsucom/console:beta + image: jitsucom/console:latest restart: "unless-stopped" platform: linux/amd64 environment: @@ -103,7 +103,7 @@ services: bulker: tty: true - image: jitsucom/bulker:beta + image: jitsucom/bulker:latest platform: linux/amd64 restart: "unless-stopped" environment: @@ -130,7 +130,7 @@ services: rotor: tty: true - image: jitsucom/rotor:beta + image: jitsucom/rotor:latest platform: linux/amd64 restart: "unless-stopped" environment: @@ -156,7 +156,7 @@ services: ingest: tty: true - image: jitsucom/ingest:beta + image: jitsucom/ingest:latest platform: linux/amd64 restart: "unless-stopped" environment: @@ -184,7 +184,7 @@ services: syncctl: tty: true - image: jitsucom/syncctl:beta + image: jitsucom/syncctl:latest platform: linux/amd64 restart: "on-failure" environment: From 7ba056817e37e876bd571a040eef7e28c60226c4 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 30 Jan 2024 19:16:38 +0400 Subject: [PATCH 0546/1353] build-script: fix version detection --- cli/build-scripts/src/docker.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cli/build-scripts/src/docker.ts b/cli/build-scripts/src/docker.ts index 0f4e0eb8a..c75800697 100644 --- a/cli/build-scripts/src/docker.ts +++ b/cli/build-scripts/src/docker.ts @@ -44,7 +44,8 @@ async function getAutomaticVersion(str: ReleaseStream, tagPrefix: string): Promi const latest = allSemvers.sort((a, b) => semverCompare(a, b)).pop(); if (latest) { const nextVersion = `${latest.major}.${latest.minor}.${latest.patch + 1}`; - console.log(`Found latest stable release: ' + ${latest.version}. Going touse ${nextVersion} as next version`); + console.log(`Found latest stable release: ' + ${latest.version}. Going to use ${nextVersion} as next version`); + return nextVersion; } const [major, minor] = versions.latest.split("."); return `${major}.${minor}.0`; From 5adc9db94deb75bd6cc2d0374a67145ba1d9c064 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 31 Jan 2024 12:19:32 +0400 Subject: [PATCH 0547/1353] mixpanel-destination: pass params from 'context.geo' when presents mixpanel-destination, june-destination, amplitude-destination: never use requestIp, use context.ip instead --- .../src/functions/amplitude-destination.ts | 2 +- .../src/functions/june-destination.ts | 2 +- .../src/functions/mixpanel-destination.ts | 41 ++++++++++++++----- .../HTTPApi.tsx | 10 ++--- 4 files changed, 37 insertions(+), 18 deletions(-) diff --git a/libs/core-functions/src/functions/amplitude-destination.ts b/libs/core-functions/src/functions/amplitude-destination.ts index ee1b0b889..9ed399f50 100644 --- a/libs/core-functions/src/functions/amplitude-destination.ts +++ b/libs/core-functions/src/functions/amplitude-destination.ts @@ -113,7 +113,7 @@ const AmplitudeDestination: JitsuFunction = ({ do site
  • - request_ip and userAgent are not extracted from the request headers, but should be - passed explicitly in the event payload + context.ip and context.userAgent are not extracted from the request headers, but + should be passed explicitly in the event payload
  • - If request_ip is not present, the ip field will be empty to avoid confusion; same applies for{" "} - userAgent + If context.ip is not present, the ip field will be empty to avoid confusion; same applies for{" "} + context.userAgent
  • Examples

    @@ -67,6 +67,7 @@ export const HTTPManual: React.FC<{ domain: string; writeKey?: string }> = ({ do "name": "jitsu-js", "version": "1.0.0" }, + "ip": "127.0.0.1", "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/111.0", "locale": "en-US", "screen": { @@ -94,7 +95,6 @@ export const HTTPManual: React.FC<{ domain: string; writeKey?: string }> = ({ do "source": "g" } }, - "request_ip": "127.0.0.1", "receivedAt": "2023-04-12T13:29:04.690Z" }'`}
    From 58c4c4afed1307f9bcf17f532c2d4b0bf20169f3 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 31 Jan 2024 15:54:56 +0400 Subject: [PATCH 0548/1353] console: separate CONSOLE_AUTH_TOKENS and CONSOLE_RAW_AUTH_TOKENS --- docker/docker-compose.yml | 19 ++++++++++--------- libs/juava/__tests__/security.test.ts | 16 ++++++++++------ libs/juava/src/security.ts | 21 +++++++++++---------- webapps/console/lib/api.ts | 16 ++++++++++++---- webapps/console/lib/nextauth.config.ts | 4 ++-- webapps/ee-api/lib/auth.ts | 4 ++-- 6 files changed, 47 insertions(+), 33 deletions(-) diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index f44787d1c..bb3c4b0d2 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -52,7 +52,7 @@ services: console: tty: true - image: jitsucom/console:latest + image: jitsucom/console:beta restart: "unless-stopped" platform: linux/amd64 environment: @@ -60,7 +60,7 @@ services: INGEST_PORT: ${JITSU_INGEST_PORT:-8080} ROTOR_URL: "http://rotor:3401" BULKER_URL: "http://bulker:3042" - CONSOLE_AUTH_TOKENS: ${CONSOLE_TOKEN:-default} + CONSOLE_RAW_AUTH_TOKENS: ${CONSOLE_TOKEN:-default} BULKER_AUTH_KEY: ${BULKER_TOKEN:-default} MIT_COMPLIANT: ${MIT_COMPLIANT:-false} DATABASE_URL: "postgresql://postgres:${POSTGRES_PASSWORD:-default}@postgres:5432/postgres?schema=newjitsu" @@ -103,13 +103,13 @@ services: bulker: tty: true - image: jitsucom/bulker:latest + image: jitsucom/bulker:beta platform: linux/amd64 restart: "unless-stopped" environment: TERM: "xterm-256color" BULKER_KAFKA_BOOTSTRAP_SERVERS: "kafka:9092" - BULKER_AUTH_TOKENS: ${BULKER_TOKEN:-default} + BULKER_RAW_AUTH_TOKENS: ${BULKER_TOKEN:-default} BULKER_CONFIG_SOURCE: "http://console:3000/api/admin/export/bulker-connections" BULKER_CONFIG_SOURCE_HTTP_AUTH_TOKEN: "service-admin-account:${CONSOLE_TOKEN:-default}" BULKER_CACHE_DIR: "/tmp/cache" @@ -130,7 +130,7 @@ services: rotor: tty: true - image: jitsucom/rotor:latest + image: jitsucom/rotor:beta platform: linux/amd64 restart: "unless-stopped" environment: @@ -156,15 +156,16 @@ services: ingest: tty: true - image: jitsucom/ingest:latest + image: jitsucom/ingest:beta platform: linux/amd64 restart: "unless-stopped" environment: TERM: "xterm-256color" INGEST_DATA_DOMAIN: ${INGEST_DOMAIN:-localhost} INGEST_KAFKA_BOOTSTRAP_SERVERS: "kafka:9092" - INGEST_AUTH_TOKENS: ${BULKER_TOKEN:-default} + INGEST_RAW_AUTH_TOKENS: ${BULKER_TOKEN:-default} INGEST_REPOSITORY_URL: "http://console:3000/api/admin/export/streams-with-destinations" + INGEST_SCRIPT_ORIGIN: "http://console:3000/api/s/javascript-library" INGEST_REPOSITORY_AUTH_TOKEN: "service-admin-account:${CONSOLE_TOKEN:-default}" INGEST_CACHE_DIR: "/tmp/cache" INGEST_REDIS_URL: "redis://default:${REDIS_PASSWORD:-default}@redis:6379" @@ -184,14 +185,14 @@ services: syncctl: tty: true - image: jitsucom/syncctl:latest + image: jitsucom/syncctl:beta platform: linux/amd64 restart: "on-failure" environment: TERM: "xterm-256color" HTTP_PORT: ${EXTERNAL_SYNCS_PORT:-3043} SYNCCTL_SYNCS_ENABLED: ${SYNCS_ENABLED:-false} - SYNCCTL_AUTH_TOKENS: ${SYNCCTL_TOKEN:-default} + SYNCCTL_RAW_AUTH_TOKENS: ${SYNCCTL_TOKEN:-default} SYNCCTL_DATABASE_URL: "postgresql://postgres:${POSTGRES_PASSWORD:-default}@127.0.0.1:${EXTERNAL_POSTGRES_PORT:-5432}/postgres?search_path=newjitsu" SYNCCTL_SIDECAR_DATABASE_URL: "postgresql://postgres:${POSTGRES_PASSWORD:-default}@${EXTERNAL_POSTGRES_HOST}:${EXTERNAL_POSTGRES_PORT:-5432}/postgres?search_path=newjitsu" SYNCCTL_BULKER_URL: "http://${EXTERNAL_BULKER_HOST}:${EXTERNAL_BULKER_PORT:-3042}" diff --git a/libs/juava/__tests__/security.test.ts b/libs/juava/__tests__/security.test.ts index 81a859678..426ef48a0 100644 --- a/libs/juava/__tests__/security.test.ts +++ b/libs/juava/__tests__/security.test.ts @@ -1,19 +1,23 @@ -import { createHash, checkToken, createAuthorized } from "../src/security"; +import { createHash, createAuthorized, checkHash, checkRawToken } from "../src/security"; test("security", () => { const password = "secretPassword"; const hashResult = createHash(password); console.log("Hash result = " + hashResult); - expect(checkToken(hashResult, password)).toBe(true); - expect(checkToken(hashResult.substring(2), password)).toBe(false); + expect(checkHash(hashResult, password)).toBe(true); + expect(checkHash(hashResult.substring(2), password)).toBe(false); }); test("authorizer", () => { const hashedSecret = "215ef940-8f78-42bf-ab36-185090b9b62e"; const plaintextSecret = "af0e7958-5a10-4264-af4e-2516a630b602"; - const secrets = `${plaintextSecret},${createHash(hashedSecret)}`; - const auth = createAuthorized(secrets); - expect(auth(plaintextSecret)).toBe(true); + let auth = createAuthorized(createHash(hashedSecret), checkHash); + expect(auth(plaintextSecret)).toBe(false); expect(auth(hashedSecret)).toBe(true); expect(auth("wrong")).toBe(false); + + auth = createAuthorized(plaintextSecret, checkRawToken); + expect(auth(plaintextSecret)).toBe(true); + expect(auth(hashedSecret)).toBe(false); + expect(auth("wrong")).toBe(false); }); diff --git a/libs/juava/src/security.ts b/libs/juava/src/security.ts index 28addfd5d..d317ec60f 100644 --- a/libs/juava/src/security.ts +++ b/libs/juava/src/security.ts @@ -23,17 +23,15 @@ export function createHash(secret: string): string { return hashInternal(secret, randomSeed, globalSeed[0]); } -export function checkToken(hashOrPlain: string, secret: string): boolean { - if (secret === hashOrPlain) { - return true; - } - if (hashOrPlain.indexOf(".") >= 0) { - return checkHash(hashOrPlain, secret); - } - return false; +export function checkRawToken(hashOrPlain: string, secret: string): boolean { + return secret === hashOrPlain; } export function checkHash(hash: string, secret: string): boolean { + if (hash.indexOf(".") < 0) { + console.error(`Invalid auth token: ${hash} Should be in format \$\{salt\}.\$\{hash\}`); + return false; + } const [randomSeed] = hash.split("."); return globalSeed.find(seed => hash === hashInternal(secret, randomSeed, seed)) !== undefined; } @@ -49,11 +47,14 @@ export type Authorizer = (secret: string) => boolean; * tokens. Each token can be a plain string or a hash of a string. The hash is * something that contains '.'. */ -export function createAuthorized(tokens: string): Authorizer { +export function createAuthorized( + tokens: string, + checkFunc: (hashOrPlain: string, secret: string) => boolean +): Authorizer { const authorizers = tokens .split(",") .map(tok => tok.trim()) - .map(hashOrPlain => (secret: string) => checkToken(hashOrPlain, secret)); + .map(hashOrPlain => (secret: string) => checkFunc(hashOrPlain, secret)); return (secret: string) => authorizers.find(auth => auth(secret)) !== undefined; } diff --git a/webapps/console/lib/api.ts b/webapps/console/lib/api.ts index acf218320..117e74f9a 100644 --- a/webapps/console/lib/api.ts +++ b/webapps/console/lib/api.ts @@ -1,6 +1,6 @@ import { ZodType } from "zod"; import { NextApiHandler, NextApiRequest, NextApiResponse } from "next"; -import { assertDefined, checkToken, getErrorMessage, requireDefined, tryJson } from "juava"; +import { assertDefined, checkHash, checkRawToken, getErrorMessage, requireDefined, tryJson } from "juava"; import { getServerSession, Session } from "next-auth"; import { nextAuthConfig } from "./nextauth.config"; import { SessionUser } from "./schema"; @@ -85,10 +85,18 @@ export function getAuthBearerToken(req: NextApiRequest): string | undefined { } function findServiceAccount({ keyId, secret }): SessionUser | undefined { + let tokens: string[] = []; + let checkFunction: (token: string, secret: string) => boolean = () => false; if (process.env.CONSOLE_AUTH_TOKENS) { - const tokens = process.env.CONSOLE_AUTH_TOKENS.split(","); + tokens = process.env.CONSOLE_AUTH_TOKENS.split(","); + checkFunction = checkHash; + } else if (process.env.CONSOLE_RAW_AUTH_TOKENS) { + tokens = process.env.CONSOLE_RAW_AUTH_TOKENS.split(","); + checkFunction = checkRawToken; + } + if (tokens.length > 0) { for (const tokenHashOrPlain of tokens) { - if (checkToken(tokenHashOrPlain, secret)) { + if (checkFunction(tokenHashOrPlain, secret)) { return { internalId: adminServiceAccountEmail, externalUsername: adminServiceAccountEmail, @@ -120,7 +128,7 @@ export async function getUser( if (!token) { throw new ApiError(`Invalid API key id ${keyId}`, { keyId }, { status: 401 }); } - if (!checkToken(token.hash, secret)) { + if (!checkHash(token.hash, secret)) { throw new ApiError(`Invalid API key secret for ${keyId}`, { keyId }, { status: 401 }); } const user = requireDefined( diff --git a/webapps/console/lib/nextauth.config.ts b/webapps/console/lib/nextauth.config.ts index e319efd75..34e736701 100644 --- a/webapps/console/lib/nextauth.config.ts +++ b/webapps/console/lib/nextauth.config.ts @@ -2,7 +2,7 @@ import GithubProvider from "next-auth/providers/github"; import CredentialsProvider from "next-auth/providers/credentials"; import { NextAuthOptions, User } from "next-auth"; import { db } from "./server/db"; -import { checkToken, requireDefined } from "juava"; +import { checkRawToken, requireDefined } from "juava"; import { ApiError } from "./shared/errors"; import { getServerLog } from "./server/log"; import { withProductAnalytics } from "./server/telemetry"; @@ -47,7 +47,7 @@ const credentialsProvider = log.atWarn().log(`Failed attempt to login with ${credentials.username}: no such user`); return null; } - if (!checkToken(userRecord[1], credentials.password)) { + if (!checkRawToken(userRecord[1], credentials.password)) { log.atWarn().log(`Failed attempt to login with ${credentials.username}: invalid password`); return null; } diff --git a/webapps/ee-api/lib/auth.ts b/webapps/ee-api/lib/auth.ts index b7d10f99e..4c614f7d9 100644 --- a/webapps/ee-api/lib/auth.ts +++ b/webapps/ee-api/lib/auth.ts @@ -1,5 +1,5 @@ import { NextApiRequest, NextApiResponse } from "next"; -import { assertDefined, createAuthorized, newError, requireDefined } from "juava"; +import { assertDefined, checkRawToken, createAuthorized, newError, requireDefined } from "juava"; import jwt from "jsonwebtoken"; import * as process from "process"; @@ -9,7 +9,7 @@ const bearerPrefix = "Bearer "; const log = getServerLog("auth"); -const adminAuthorizer = createAuthorized(process.env.EE_API_AUTH_TOKENS || ""); +const adminAuthorizer = createAuthorized(process.env.EE_API_AUTH_TOKENS || "", checkRawToken); type UserAuthClaim = { type: "user"; From 21ab4fe56416a9c416c25d885072aa276dbf882c Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Wed, 31 Jan 2024 15:35:55 -0500 Subject: [PATCH 0549/1353] feat: added credentials auth to support self-hosted users --- docker/.env.example | 39 ++--- docker/docker-compose.yml | 3 +- .../components/ButtonLabel/ButtonLabel.tsx | 47 ++++-- webapps/console/lib/nextauth.config.ts | 125 +++++++++------ webapps/console/lib/schema/index.ts | 2 - webapps/console/lib/store/index.tsx | 39 +++-- webapps/console/pages/_app.tsx | 88 +---------- .../console/pages/api/[...not-found-404].ts | 2 +- webapps/console/pages/api/app-config.ts | 7 +- webapps/console/pages/api/init-user.ts | 9 +- .../console/pages/api/user/change-password.ts | 30 ++++ webapps/console/pages/index.tsx | 2 +- webapps/console/pages/signin.tsx | 142 ++++++++++++++++++ webapps/console/pages/user.tsx | 63 +++++++- webapps/console/pages/workspaces.tsx | 4 + webapps/console/prisma/schema.prisma | 11 ++ 16 files changed, 424 insertions(+), 189 deletions(-) create mode 100644 webapps/console/pages/api/user/change-password.ts create mode 100644 webapps/console/pages/signin.tsx diff --git a/docker/.env.example b/docker/.env.example index 15f7c9220..761c9e0b0 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -1,39 +1,44 @@ -### Required ### -# comma-separated list of admin user credentials in format email:password, e.g.: email1@example.com:password1,email2@example.com:password2 -ADMIN_CREDENTIALS= +#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# REQUIRED PARAMETERS, PLEASE READ INSTRUCTIONS THOROUGHLY +# See https://docs.jitsu.com/self-hosting/quick-start/ for more details +#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +# Password and login of an *initial* admin user of Jitsu UI. After initial login, you must change your password! +# You can keep those variable empty if you are configuring Jitsu UI via Github auth (see below). In this case first +# authorized user will be granted a full access to Jitsu UI. +SEED_USER_EMAIL=admin@jitsu.com +SEED_USER_EMAIL=change-me! + # Domain name of your Jitsu server where events will be sent. E.g. jitsu.mycompany.com INGEST_DOMAIN=localhost + # Public URL of your Jitsu UI. E.g. https://jitsu.mycompany.com:3000 or http://localhost:3000 JITSU_PUBLIC_URL=http://localhost:3000 + #### Secrets ### # It is highly recommended to generate random values for those variables. -# You can use `openssl rand -hex 32` to generate random values. -CONSOLE_TOKEN=change_me -POSTGRES_PASSWORD=change_me -BULKER_TOKEN=change_me -SYNCCTL_TOKEN=change_me +# You can use `openssl rand -hex 32` to generate random values. Please keep `raw:` prefix + +CONSOLE_TOKEN=raw: +BULKER_TOKEN=raw: +SYNCCTL_TOKEN=raw: ### Optional ### JITSU_UI_PORT=3000 JITSU_INGEST_PORT=8080 -### Github OAuth ### +# If you want to have more than one user for Jitsu UI, this could be done via delegating auth to github. +# You need to create a new Github OAuth app and set those variables accordingly. GITHUB_CLIENT_ID= GITHUB_CLIENT_SECRET= ### Connectors specific ### + SYNCS_ENABLED=false -# Source Connectors License -# Jitsu is licensed under MIT license, but some source connectors may use other licenses. -# If you base your product on Jitsu and want to stay under MIT licese, set this variable to true -# All not MIT-compatible connector sources will be disabled -# You can enable all source connectors by setting this variable to false -# All source connectors will be enabled, but particular connectors license may conflict with license of your product -MIT_COMPLIANT=true -# bulker host how it is reachable from k8s cluster EXTERNAL_BULKER_HOST=host.minikube.internal EXTERNAL_BULKER_PORT=3042 + # sync controller is running using host network to access 'minikube' w/o problems. EXTERNAL_SYNCS_PORT=3043 diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index bb3c4b0d2..a04187548 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -65,7 +65,8 @@ services: MIT_COMPLIANT: ${MIT_COMPLIANT:-false} DATABASE_URL: "postgresql://postgres:${POSTGRES_PASSWORD:-default}@postgres:5432/postgres?schema=newjitsu" REDIS_URL: "redis://default:${REDIS_PASSWORD:-default}@redis:6379" - ADMIN_CREDENTIALS: ${ADMIN_CREDENTIALS} + SEED_USER_EMAIL: ${SEED_USER_EMAIL:-} + SEED_USER_PASSWORD: ${SEED_USER_EMAIL:-} GITHUB_CLIENT_ID: ${GITHUB_CLIENT_ID} GITHUB_CLIENT_SECRET: ${GITHUB_CLIENT_SECRET} SYNCS_ENABLED: ${SYNCS_ENABLED:-false} diff --git a/webapps/console/components/ButtonLabel/ButtonLabel.tsx b/webapps/console/components/ButtonLabel/ButtonLabel.tsx index 912225d33..427e00d4e 100644 --- a/webapps/console/components/ButtonLabel/ButtonLabel.tsx +++ b/webapps/console/components/ButtonLabel/ButtonLabel.tsx @@ -1,7 +1,7 @@ import { ReactNode } from "react"; export type ButtonLabelProps = { - icon: ReactNode; + icon?: ReactNode; children?: ReactNode; loading?: boolean; iconPosition?: "left" | "right"; @@ -9,6 +9,24 @@ export type ButtonLabelProps = { iconSize?: "default" | "small"; }; +const BouncingDotsLoader = () => { + return ( +
    +
    +
    +
    +
    + ); +}; + export const ButtonLabel: React.FC = ({ children, icon, @@ -20,25 +38,32 @@ export const ButtonLabel: React.FC = ({ const iconClass = iconSize === "small" ? "scale-75" : ""; return (
    -
    - {iconPosition === "left" && !loading && {icon}} +
    + {icon && iconPosition === "left" && !loading && {icon}} {children && ( {children} )} - {iconPosition === "right" && !loading && {icon}} + {icon && iconPosition === "right" && !loading && {icon}}
    + {loading && !icon && ( +
    + +
    + )}
    ); }; diff --git a/webapps/console/lib/nextauth.config.ts b/webapps/console/lib/nextauth.config.ts index 34e736701..7d68efeca 100644 --- a/webapps/console/lib/nextauth.config.ts +++ b/webapps/console/lib/nextauth.config.ts @@ -2,62 +2,87 @@ import GithubProvider from "next-auth/providers/github"; import CredentialsProvider from "next-auth/providers/credentials"; import { NextAuthOptions, User } from "next-auth"; import { db } from "./server/db"; -import { checkRawToken, requireDefined } from "juava"; +import { checkHash, createHash, hash, requireDefined } from "juava"; import { ApiError } from "./shared/errors"; import { getServerLog } from "./server/log"; import { withProductAnalytics } from "./server/telemetry"; import { NextApiRequest } from "next"; +import { isTruish } from "./shared/chores"; const crypto = require("crypto"); const log = getServerLog("auth"); -// const googleProvider = GoogleProvider({ -// clientId: "942257799287-a7jjl052dugnfav58ij8lihq17o9mc41.apps.googleusercontent.com", -// clientSecret: "1eEfuTzfp5f9ZkDHg4YqnqhE", -// }); -const githubProvider = GithubProvider({ - clientId: process.env.GITHUB_CLIENT_ID as string, - clientSecret: process.env.GITHUB_CLIENT_SECRET as string, -}); +const githubProvider = process.env.GITHUB_CLIENT_ID + ? GithubProvider({ + clientId: process.env.GITHUB_CLIENT_ID as string, + clientSecret: process.env.GITHUB_CLIENT_SECRET as string, + }) + : undefined; -const firebase = { - apiKey: "AIzaSyDBm2HqvxleuJyD9xo8rh0vo1TQGp8Vohg", - authDomain: "backbase.jitsu.com", - databaseURL: "https://tracker-285220.firebaseio.com", - projectId: "tracker-285220", - storageBucket: "tracker-285220.appspot.com", - messagingSenderId: "942257799287", - appId: "1:942257799287:web:e3b0bd3435f929d6a00672", - measurementId: "G-6ZMG0NSJP8", -}; +function toId(email: string) { + return hash("sha256", email.toLowerCase().trim()); +} +export const credentialsLoginEnabled = + isTruish(process.env.ENABLE_CREDETIALS_LOGIN) || !!(process.env.SEED_USER_EMAIL && process.env.SEED_USER_PASSWORD); const credentialsProvider = - (process.env.ADMIN_CREDENTIALS || !process.env.GITHUB_CLIENT_ID) && + credentialsLoginEnabled && CredentialsProvider({ - authorize(credentials) { - if (!process.env.ADMIN_CREDENTIALS || !credentials) { + authorize: async function (credentials) { + if (!credentials) { + log.atWarn().log(`Failed attempt to login with empty credentials`); return null; } - log.atInfo().log(JSON.stringify(credentials)); - const userRecord = process.env.ADMIN_CREDENTIALS.split(",") - .map(s => s.trim().split(":")) - .find(([user]) => user.toLowerCase() === credentials.username.toLowerCase()); - if (!userRecord) { - log.atWarn().log(`Failed attempt to login with ${credentials.username}: no such user`); - return null; + const username = credentials.username; + if (!username) { + throw new ApiError("Username is not defined"); } - if (!checkRawToken(userRecord[1], credentials.password)) { - log.atWarn().log(`Failed attempt to login with ${credentials.username}: invalid password`); - return null; + console.log(JSON.stringify(credentials, null, 2)); + const user = await db.prisma().userProfile.findFirst({ where: { email: username }, include: { password: true } }); + if (!user) { + log.atDebug().log(`Attempt to login with unknown user: ${username}`); + const profileCount = await db.prisma().userProfile.count(); + if (profileCount === 0 && process.env.SEED_USER_EMAIL && process.env.SEED_USER_PASSWORD) { + log.atDebug().log(`There're no user profiles in DB, checking ${username} against seed user config`); + if (process.env.SEED_USER_EMAIL === username && process.env.SEED_USER_PASSWORD === credentials.password) { + const userId = toId(process.env.SEED_USER_EMAIL); + log.atDebug().log(`Adding a seed admin user with id ${userId} and email ${username}`); + await db.prisma().userProfile.create({ + data: { + id: userId, + email: username, + name: username, + externalId: userId, + loginProvider: "credentials", + admin: true, + password: { + create: { + hash: createHash(credentials.password), + changeAtNextLogin: true, + }, + }, + }, + }); + return { + id: userId, + externalId: userId, + email: process.env.SEED_USER_EMAIL, + name: process.env.SEED_USER_EMAIL, + }; + } else { + log.atWarn().log(`Attempt to login with unknown user: ${username} and invalid password`); + } + } + } else if (user.password && checkHash(user.password.hash, credentials.password)) { + return { + id: user.id, + externalId: user.externalId, + email: user.email, + name: user.name, + }; } - const userId = "id-" + credentials.username.toLowerCase().replace("@", "-").replace(".", "-"); - return { - id: userId, - externalId: userId, - email: credentials.username.toLowerCase(), - name: credentials.username.toLowerCase(), - }; + return null; }, credentials: { username: { label: "Email", type: "text" }, @@ -83,6 +108,8 @@ export async function getOrCreateUser(opts: { const admin = !(await db.prisma().userProfile.count()); user = await db.prisma().userProfile.create({ data: { + //we need this to be consistent with id generated by .authorize() call + id: loginProvider === "credentials" ? externalId : undefined, email, name, externalId: externalId, @@ -108,24 +135,22 @@ function generateSecret(base: (string | undefined)[]) { return secretKey; } -const providers: any[] = []; -if (process.env.GITHUB_CLIENT_ID && process.env.GITHUB_CLIENT_SECRET) { - providers.push(githubProvider); -} -providers.push(credentialsProvider); - export const nextAuthConfig: NextAuthOptions = { // Configure one or more authentication providers - providers: providers.filter(provider => !!provider) as any, + providers: [githubProvider, credentialsProvider].filter(provider => !!provider) as any, pages: { error: "/error/auth", // Error code passed in query string as ?error= + signIn: "/signin", // Displays signin buttons }, - theme: { - logo: "/logo-with-text.svg", - }, + secret: process.env.JWT_SECRET || - generateSecret([process.env.GITHUB_CLIENT_ID, process.env.DATABASE_URL, process.env.REDIS_URL]), + generateSecret([ + process.env.GITHUB_CLIENT_ID, + process.env.GOOGLE_CLIENT_ID, + process.env.DATABASE_URL, + process.env.REDIS_URL, + ]), callbacks: { jwt: async props => { const loginProvider = (props.account?.provider || props.token.loginProvider || "credentials") as string; diff --git a/webapps/console/lib/schema/index.ts b/webapps/console/lib/schema/index.ts index e1f1d94a1..371d3a0a3 100644 --- a/webapps/console/lib/schema/index.ts +++ b/webapps/console/lib/schema/index.ts @@ -52,7 +52,6 @@ export const noRestrictions: BillingSettings = { export const AppConfig = z.object({ docsUrl: z.string().optional(), websiteUrl: z.string().optional(), - credentialsLoginEnabled: z.boolean(), //iso date readOnlyUntil: z.string().optional(), disableSignup: z.boolean().optional(), @@ -76,7 +75,6 @@ export const AppConfig = z.object({ auth: z .object({ firebasePublic: z.any(), - githubEnabled: z.boolean().optional(), }) .optional(), frontendTelemetry: z.object({ diff --git a/webapps/console/lib/store/index.tsx b/webapps/console/lib/store/index.tsx index 94d9706d6..ef617fa57 100644 --- a/webapps/console/lib/store/index.tsx +++ b/webapps/console/lib/store/index.tsx @@ -49,7 +49,7 @@ export function getLinksCacheKey(workspaceId: string, opts?: UseConfigObjectLink return [`workspaceId=${workspaceId}`, "links", "withData=true"]; } -type UseConfigObjectsUpdaterResult = { loading: true; error?: never } | { loading: false; error: Error }; +type UseConfigObjectsUpdaterResult = { loading: true; error?: never } | { loading: false; error?: Error }; function toError(e: any) { return e instanceof Error ? e : new Error(e?.message || "Unknown error"); @@ -66,14 +66,16 @@ export const foreverCache = { //initialData: [] }; -async function initialDataLoad(workspaceIdOrSlug: string, queryClient: QueryClient): Promise<{ workspaceId: string }> { +async function initialDataLoad( + workspaceIdOrSlug: string, + queryClient: QueryClient, + signal: AbortSignal +): Promise<{ workspaceId: string }> { const loaders: Promise[] = []; - await queryClient.prefetchQuery( - getWorkspaceCacheKey(workspaceIdOrSlug), - async ({ signal }) => WorkspaceDbModel.parse(await rpc(`/api/workspace/${workspaceIdOrSlug}`, { signal })), - foreverCache - ); + const workspaceDbModel = WorkspaceDbModel.parse(await rpc(`/api/workspace/${workspaceIdOrSlug}`, { signal })); + + await queryClient.prefetchQuery(getWorkspaceCacheKey(workspaceIdOrSlug), async () => workspaceDbModel, foreverCache); const workspace = requireDefined( queryClient.getQueryData(getWorkspaceCacheKey(workspaceIdOrSlug)), `No data for workspace ${workspaceIdOrSlug} was prefetched` @@ -104,7 +106,14 @@ async function initialDataLoad(workspaceIdOrSlug: string, queryClient: QueryClie foreverCache ) ); - await Promise.all(loaders); + try { + getLog().atInfo().log("@@@@@@@@@@@@@@@@@@@ Loaders", loaders); + await Promise.all(loaders); + } catch (e) { + getLog().atError().log("@@@@@@@@@@@@@@@@@@@Failed to load initial data", e); + throw e; + } + return { workspaceId: workspace.id }; } @@ -176,7 +185,7 @@ export function useConfigObjectsUpdater(workspaceIdOrSlug: string): UseConfigObj let sleepTimeout; const abortController = new AbortController(); //reload data after every 5 seconds; - initialDataLoad(workspaceIdOrSlug, queryClient) + initialDataLoad(workspaceIdOrSlug, queryClient, abortController.signal) .then(res => { getLog().atDebug().log("Initial version of workspace config has been loaded"); //setup background task to reload data @@ -213,7 +222,9 @@ export function useConfigObjectsUpdater(workspaceIdOrSlug: string): UseConfigObj }, 0); setLoadedWorkspace(workspaceIdOrSlug); }) - .catch(setError) + .catch(e => { + setError(e); + }) .finally(() => setLoading(false)); return () => { @@ -232,7 +243,13 @@ export function useConfigObjectsUpdater(workspaceIdOrSlug: string): UseConfigObj } }; }, [queryClient, workspaceIdOrSlug, loading, loadedWorkspace]); - + if (error) { + return { loading: false, error: error! }; + } else if (loading || loadedWorkspace != workspaceIdOrSlug) { + return { loading: true }; + } else { + return { loading: false }; + } return loading || loadedWorkspace != workspaceIdOrSlug ? { loading: true } : { loading: false, error: error! }; } diff --git a/webapps/console/pages/_app.tsx b/webapps/console/pages/_app.tsx index c3ada9a1e..e3d84ffec 100644 --- a/webapps/console/pages/_app.tsx +++ b/webapps/console/pages/_app.tsx @@ -3,11 +3,10 @@ import { AppProps } from "next/app"; import "../styles/globals.css"; import { useRouter } from "next/router"; import React, { PropsWithChildren, useEffect, useState } from "react"; -import { SessionProvider, signIn, signOut, useSession } from "next-auth/react"; +import { SessionProvider, signOut, useSession } from "next-auth/react"; import { GlobalLoader } from "../components/GlobalLoader/GlobalLoader"; import { branding } from "../lib/branding"; import { Alert } from "antd"; -import { FiGithub } from "react-icons/fi"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { AppConfigContextProvider, @@ -18,7 +17,6 @@ import { WorkspaceContextProvider, } from "../lib/context"; import { AppConfig, ContextApiResponse, SessionUser } from "../lib/schema"; -import Link from "next/link"; import { ErrorBoundary, GlobalError, GlobalOverlay } from "../components/GlobalError/GlobalError"; import { feedbackError, useTitle } from "../lib/ui"; import { useApi } from "../lib/useApi"; @@ -32,6 +30,7 @@ import { JitsuButton } from "../components/JitsuButton/JitsuButton"; import { BillingProvider } from "../components/Billing/BillingProvider"; import { ClassicProjectProvider } from "../components/PageLayout/ClassicProjectProvider"; import { useConfigObjectList, useConfigObjectsUpdater, useLoadedWorkspace } from "../lib/store"; +import { Redirect } from "../components/Redirect/Redirect"; const log = getLog("app"); @@ -185,12 +184,7 @@ const NextJsAuthorizer: React.FC> = ({ children }) => { } else if (session.status === "loading") { return ; } - return ( - <> - - - - ); + return ; }; function LoginWrapper(props: PropsWithChildren<{ requiresLogin: boolean }>) { @@ -267,81 +261,6 @@ const LoadingBlur: React.FC<{}> = () => { ); }; -function NextJsSigninForm() { - const router = useRouter(); - const signup = router.query.signup === "true"; - const appConfig = useAppConfig(); - const signInAndRedirect = async (provider: string) => { - await signIn(provider); - }; - useEffect(() => { - if (!appConfig.auth?.githubEnabled) { - router.push("/api/auth/signin"); - } - }, [appConfig.auth, router]); - return ( - <> -
    -
    -
    -
    {branding.logo}
    -
    {branding.wordmark}
    -
    - } - type="primary" - className="w-72 mb-6 " - size="large" - onClick={() => signInAndRedirect("github")} - > - {signup ? "Sign up" : "Sign in"} with Github - -
    - {!signup && !appConfig.disableSignup && ( - <> - Don't have an account?{" "} - - Sign Up - {" "} - up for free. - - )} - {signup && ( - <> - Already registered?{" "} - - Sign In - - - )} -
    - {appConfig.credentialsLoginEnabled && ( -
    - - Sign In with Email - -
    - )} -
    -
    - - ); -} - const queryClient = new QueryClient(); if (typeof window !== "undefined") { window["queryClient"] = queryClient; @@ -429,6 +348,7 @@ const StoreLoader: React.FC< }> > = ({ workspaceIdOrSlug, children }) => { const configObjectsUpdater = useConfigObjectsUpdater(workspaceIdOrSlug); + console.log("configObjectsUpdater", configObjectsUpdater); if (configObjectsUpdater.error) { log .atError() diff --git a/webapps/console/pages/api/[...not-found-404].ts b/webapps/console/pages/api/[...not-found-404].ts index c539c0746..c549f6222 100644 --- a/webapps/console/pages/api/[...not-found-404].ts +++ b/webapps/console/pages/api/[...not-found-404].ts @@ -4,5 +4,5 @@ export default function handler(req: NextApiRequest, res: NextApiResponse) { res .status(404) .setHeader("Content-type", "application/json") - .send({ error: "API route not foud" + req.url }); + .send({ error: "API route not found: " + req.url }); } diff --git a/webapps/console/pages/api/app-config.ts b/webapps/console/pages/api/app-config.ts index eb0da9d19..5045b8fae 100644 --- a/webapps/console/pages/api/app-config.ts +++ b/webapps/console/pages/api/app-config.ts @@ -3,7 +3,7 @@ import { AppConfig } from "../../lib/schema"; import { getAppEndpoint } from "../../lib/domains"; import { getEeConnection } from "../../lib/server/ee"; import { isEEAvailable } from "./ee/jwt"; -import { isFirebaseEnabled, isGithubEnabled, requireFirebaseOptions } from "../../lib/server/firebase-server"; +import { isFirebaseEnabled, requireFirebaseOptions } from "../../lib/server/firebase-server"; import { nangoConfig } from "../../lib/server/oauth/nango-config"; import { isTruish } from "../../lib/shared/chores"; import { readOnlyUntil } from "../../lib/server/read-only-mode"; @@ -22,7 +22,6 @@ export default createRoute() return { docsUrl: process.env.JITSU_DOCUMENTATION_URL || "https://docs-jitsu-com.staging.jitsu.com/", readOnlyUntil: readOnlyUntil?.toISOString(), - credentialsLoginEnabled: !!process.env.ADMIN_CREDENTIALS, ee: { available: isEEAvailable(), host: isEEAvailable() ? getEeConnection().host : undefined, @@ -32,10 +31,6 @@ export default createRoute() ? { firebasePublic: requireFirebaseOptions().client, } - : isGithubEnabled() - ? { - githubEnabled: true, - } : undefined, billingEnabled: isEEAvailable(), customDomainsEnabled: customDomainCnames && customDomainCnames.length > 0, diff --git a/webapps/console/pages/api/init-user.ts b/webapps/console/pages/api/init-user.ts index a327fad27..2762ce70b 100644 --- a/webapps/console/pages/api/init-user.ts +++ b/webapps/console/pages/api/init-user.ts @@ -39,9 +39,6 @@ export default createRoute() }) .handler(async ({ req, query, user }) => { await initTelemetry(); - getServerLog() - .atInfo() - .log(`Looking for workspace for user ${JSON.stringify(user)}`); if (query.invite) { const token = await db.prisma().invitationToken.findFirst({ where: { token: query.invite } }); if (!token) { @@ -79,8 +76,10 @@ export default createRoute() where: { userId: requireDefined(user.internalId, `internal id is not defined`) }, }); if (!workspaceAccess) { + getServerLog().atInfo().log(`User ${user.internalId} has no access to any workspace. Creating a new one for him`); const dbUser = await db.prisma().userProfile.findFirst({ where: { id: user.internalId } }); if (!dbUser) { + getServerLog().atInfo().log(`User ${user.internalId} has no profile in db. Creating a new one`); if (process.env.DISABLE_SIGNUP === "true" || process.env.DISABLE_SIGNUP === "1") { throw new ApiError("Sign up is disabled", { code: "signup-disabled" }); } @@ -99,8 +98,10 @@ export default createRoute() .prisma() .workspace.create({ data: { name: pickWorkspaceName(query.projectName, user) } }); await withProductAnalytics(p => p.track("workspace_created"), { req, user, workspace: newWorkspace }); - await db.prisma().workspaceAccess.create({ data: { userId: user.internalId, workspaceId: newWorkspace.id } }); + getServerLog() + .atInfo() + .log(`Created a new workspace ${newWorkspace.id} for user ${user.internalId} (${user.email}).`); return { user: user, firstWorkspaceId: newWorkspace.id, firstWorkspaceSlug: null, newUser: true }; } const lastUsedWorkspaceId = ( diff --git a/webapps/console/pages/api/user/change-password.ts b/webapps/console/pages/api/user/change-password.ts new file mode 100644 index 000000000..8f869375a --- /dev/null +++ b/webapps/console/pages/api/user/change-password.ts @@ -0,0 +1,30 @@ +import { createRoute } from "../../../lib/api"; +import { z } from "zod"; +import { db } from "../../../lib/server/db"; +import { assertTrue, checkHash, createHash } from "juava"; + +export default createRoute() + .POST({ + auth: true, + body: z.object({ + currentPassword: z.string(), + newPassword: z.string(), + }), + }) + .handler(async ({ user, body }) => { + assertTrue(user.loginProvider === "credentials", "Only credentials login is supported"); + const password = await db.prisma().userPassword.findFirst({ where: { userId: user.internalId } }); + if (!password) { + throw new Error("Password is not set"); + } + if (!checkHash(password.hash, body.currentPassword)) { + throw new Error("Current password is invalid"); + } + await db + .prisma() + .userPassword.update({ where: { userId: user.internalId }, data: { hash: createHash(body.newPassword) } }); + return { + status: "ok", + }; + }) + .toNextApiHandler(); diff --git a/webapps/console/pages/index.tsx b/webapps/console/pages/index.tsx index 01b7c5671..369103c48 100644 --- a/webapps/console/pages/index.tsx +++ b/webapps/console/pages/index.tsx @@ -50,7 +50,7 @@ function WorkspaceRedirect() { log.atWarn().withCause(err).log(`Can't sign ut from next-auth`); }); firebaseSignOut().catch(err => { - log.atWarn().withCause(err).log(`Can't sign ut from next-auth`); + log.atWarn().withCause(err).log(`Can't sign ut from firebase`); }); }} > diff --git a/webapps/console/pages/signin.tsx b/webapps/console/pages/signin.tsx new file mode 100644 index 000000000..73196e736 --- /dev/null +++ b/webapps/console/pages/signin.tsx @@ -0,0 +1,142 @@ +import { getCsrfToken, getProviders, signIn, useSession } from "next-auth/react"; +import { Redirect } from "../components/Redirect/Redirect"; +import { Button, Input } from "antd"; +import { useAppConfig } from "../lib/context"; +import { AlertTriangle } from "lucide-react"; +import Link from "next/link"; +import { GithubOutlined } from "@ant-design/icons"; +import React, { useState } from "react"; +import { feedbackError } from "../lib/ui"; +import { useRouter } from "next/router"; +import { branding } from "../lib/branding"; + +function JitsuLogo() { + return ( +
    +
    {branding.logo}
    +
    {branding.wordmark}
    +
    + ); +} + +function CredentialsForm({ providerConfig, csrfToken }) { + const lastUsedLogin = localStorage.getItem("last-used-login-email") || undefined; + return ( +
    + +
    + + { + if (e.target.value) { + localStorage.setItem("last-used-login-email", e.target.value); + } + }} + /> +
    +
    + + +
    + + + ); +} + +function GitHubSignIn() { + const [loading, setLoading] = useState(false); + const router = useRouter(); + return ( +
    + +
    + ); +} + +const NextAuthSignInPage = ({ csrfToken, providers }) => { + const router = useRouter(); + const nextAuthSession = useSession(); + const app = useAppConfig(); + if (nextAuthSession.status === "authenticated") { + return ; + } + if (app.auth?.firebasePublic) { + return ( +
    + +
    + This page should not be used if Firebase authorization is enabled. Please proceed to a{" "} + + main page of the app + +
    +
    + ); + } + return ( +
    +
    + +
    +
    + {providers.credentials && } + {providers.credentials && providers.github &&
    } + {providers.github && } +
    + {router.query.error && ( +
    + Something went wrong. Please try again. Error code: {router.query.error} +
    + )} + {!app.disableSignup && providers.github && ( +
    + Automatic signup is enabled for this instance. Sign in with github and if you don't have an account, a new + account will be created automatically. This account won't have any access to pre-existing project unless the + access is explicitly granted +
    + )} +
    + ); +}; + +export async function getServerSideProps(context) { + return { + props: { + csrfToken: await getCsrfToken(context), + providers: await getProviders(), + publicPage: true, + }, + }; +} + +export default NextAuthSignInPage; diff --git a/webapps/console/pages/user.tsx b/webapps/console/pages/user.tsx index 5e93f71bc..4095baa60 100644 --- a/webapps/console/pages/user.tsx +++ b/webapps/console/pages/user.tsx @@ -4,11 +4,13 @@ import { useRouter } from "next/router"; import { useUser } from "../lib/context"; import { ApiKeysEditor } from "../components/ApiKeyEditor/ApiKeyEditor"; import { get, useApi } from "../lib/useApi"; -import { useState } from "react"; +import React, { useState } from "react"; import { ApiKey } from "../lib/schema"; import { feedbackError, feedbackSuccess, useUnsavedChanges } from "../lib/ui"; import { QueryResponse } from "../components/QueryResponse/QueryResponse"; import { JitsuButton } from "../components/JitsuButton/JitsuButton"; +import { ButtonLabel } from "../components/ButtonLabel/ButtonLabel"; +import { rpc } from "juava"; function ApiKeys() { const apiRes = useApi("/api/user/keys"); @@ -59,6 +61,64 @@ function ApiKeys() { ); } +const ChangePassword: React.FC<{}> = () => { + const [loading, setLoading] = useState(false); + const [currentPassword, setCurrentPassword] = useState(""); + const [newPassword, setNewPassword] = useState(""); + const [confirmNewPassword, setConfirmNewPassword] = useState(""); + let error: string | undefined = undefined; + if (currentPassword && newPassword && confirmNewPassword) { + if (newPassword !== confirmNewPassword) { + error = "New password and confirm password do not match"; + } else if (newPassword.length < 8) { + error = "Password must be at least 8 characters long"; + } + } + + return ( +
    +
    Change Password
    +
    + + setCurrentPassword(e.target.value)} /> +
    +
    + + setNewPassword(e.target.value)} /> +
    +
    + + setConfirmNewPassword(e.target.value)} + /> +
    +
    {error || "-"}
    + +
    + ); +}; + const UserPage = (props: any) => { const router = useRouter(); const user = useUser(); @@ -77,6 +137,7 @@ const UserPage = (props: any) => { You can't change email, since you logged in with an external user provider - {user.loginProvider}
    + {user.loginProvider === "credentials" && }
    diff --git a/webapps/console/pages/workspaces.tsx b/webapps/console/pages/workspaces.tsx index e2b3cec41..18581cbe2 100644 --- a/webapps/console/pages/workspaces.tsx +++ b/webapps/console/pages/workspaces.tsx @@ -14,6 +14,7 @@ import { feedbackError } from "../lib/ui"; import { JitsuButton } from "../components/JitsuButton/JitsuButton"; import { Badge, Input, Tag } from "antd"; import { useQueryStringState } from "../lib/useQueryStringState"; +import { Redirect } from "../components/Redirect/Redirect"; const log = getLog("worspaces"); @@ -49,6 +50,9 @@ const WorkspacesList = () => {
    ); } else if (data) { + if (data.length === 0) { + return ; + } return (
    {data.length > 5 && ( diff --git a/webapps/console/prisma/schema.prisma b/webapps/console/prisma/schema.prisma index 7ed83b97e..2d78864af 100644 --- a/webapps/console/prisma/schema.prisma +++ b/webapps/console/prisma/schema.prisma @@ -59,6 +59,17 @@ model UserProfile { workspaceAccess WorkspaceAccess[] userPreferences UserPreferences[] workspaceUserProperties WorkspaceUserProperties[] + password UserPassword? +} + +model UserPassword { + id String @id @default(cuid()) + createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) + updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) + userId String @unique + user UserProfile @relation(fields: [userId], references: [id]) + hash String + changeAtNextLogin Boolean @default(false) } model Workspace { From ed6a51c63fdedded2385b7b4a01430b0c4f13d18 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Wed, 31 Jan 2024 16:47:10 -0500 Subject: [PATCH 0550/1353] fix: docker example password --- docker/.env.example | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/.env.example b/docker/.env.example index 761c9e0b0..a57722218 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -7,7 +7,7 @@ # You can keep those variable empty if you are configuring Jitsu UI via Github auth (see below). In this case first # authorized user will be granted a full access to Jitsu UI. SEED_USER_EMAIL=admin@jitsu.com -SEED_USER_EMAIL=change-me! +SEED_USER_PASSWORD=change$me! # Domain name of your Jitsu server where events will be sent. E.g. jitsu.mycompany.com INGEST_DOMAIN=localhost From 6ecd13e72db1c37a3a9a1d9d83c9d89d8eb681f1 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 1 Feb 2024 12:28:47 +0400 Subject: [PATCH 0551/1353] cli/build-script expanded to support bulker repository release script and CONTRIBUTING.md --- .gitignore | 10 +- CONTRIBUTING.md | 56 ++++- cli/build-scripts/babel.config.cjs | 4 + cli/build-scripts/bin/jitsu-build-scripts | 3 + cli/build-scripts/package.json | 13 +- .../src/{ => commands}/docker.ts | 222 ++++++++++-------- cli/build-scripts/src/index.ts | 78 +++--- cli/build-scripts/webpack.config.js | 43 ++++ package.json | 1 + pnpm-lock.yaml | 175 +++----------- release.sh | 4 + 11 files changed, 320 insertions(+), 289 deletions(-) create mode 100644 cli/build-scripts/babel.config.cjs create mode 100755 cli/build-scripts/bin/jitsu-build-scripts rename cli/build-scripts/src/{ => commands}/docker.ts (60%) create mode 100644 cli/build-scripts/webpack.config.js create mode 100755 release.sh diff --git a/.gitignore b/.gitignore index ffa4f332f..2859664a8 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,12 @@ node_modules /types/protocols/dist/ /libs/functions/dist/ /docker/data/** -/cache/** \ No newline at end of file +/cache/** +/cli/build-scripts/compiled/src/commands/docker.js +/cli/build-scripts/compiled/src/box.js +/cli/build-scripts/compiled/src/colors.js +/cli/build-scripts/compiled/src/docker.js +/cli/build-scripts/compiled/src/index.js +/cli/build-scripts/compiled/package.json +/cli/build-scripts/dist/main.js +/cli/build-scripts/dist/main.js.map diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1af8539e4..59c1fb169 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,7 +1,9 @@ # Prerequisites -- `node: 16.x` -- `pnpm: >= 7.15.0` +- `node: 18.x` +- `npx` +- `pnpm: >= 8.2.0` +- `docker: >= 19.03.0` # Commands @@ -17,10 +19,19 @@ - `pnpm factory-reset` - if you have any problems -# Releasing +# Releasing NPM packages -We use [monorel](https://github.com/jitsu/monorel) to publish releases. At the moment only `@jitsu/jitsu-react`, and `@jitsu/js` are published to npm. To avoid confusion, -always release them together, even if only one of them has changes. +We use [monorel](https://github.com/jitsucom/monorel) to publish releases to npm. + +## Packages + +- `@jitsu/protocols` (./types/protocols) - Base types for JS and React SDKs and Functions library +- `@jitsu/jitsu-react` (./libs/jitsu-react) - React SDK +- `@jitsu/js` (./libs/jitsu-js) - JS SDK +- `@jitsu/functions-lib` (./libs/functions) - library for Jitsu Functions +- `@jitsu/jitsu-cli` (./cli/jitsu-cli) - CLI to create, debug and deploy Jitsu Functions + +To avoid confusion, always release all npm packages together, even if only one of them has changes. ## Common steps @@ -40,5 +51,40 @@ always release them together, even if only one of them has changes. - Same command, but with `--publish` - to **publish**. +# Releasing Docker packages + +We use [build-scripts](https://github.com/jitsucom/jitsu/tree/newjitsu/cli/build-scripts) along with `all.Dockerfile` to publish releases to Docker. + +## Packages + +- `jitsucom/console` (./webapps/console) - UI for Jitsu +- `jitsucom/rotor` (./services/rotor) - Functions Server for Jitsu + +To avoid confusion, always release all packages together, even if only one of them has changes. + +## Common steps + +- Make sure that you are logged to your docker account `docker login` +- `pnpm install && pnpm format:check && pnpm build && pnpm lint && pnpm test` should succeed +- All changes should be committed (check with `git status`). It's ok to release canary from branches! + +## Beta releases + +- `./release.sh --dryRun` - to **dry-run** publishing. +- `./release.sh` - to actually **publish** beta. + +## Stable releases + +- `./release.sh --release latest --dryRun` - to **dry-run** publishing. +- `./release.sh --release latest ` - to actually **publish** latest image. + +## Bumping versions + +For initial release or to bump major/minor version pass `--version` argument to `./release.sh` script. + +- `./release.sh --version 2.5.0` +- `./release.sh --release latest --version 2.5.0` + + diff --git a/cli/build-scripts/babel.config.cjs b/cli/build-scripts/babel.config.cjs new file mode 100644 index 000000000..e60440a86 --- /dev/null +++ b/cli/build-scripts/babel.config.cjs @@ -0,0 +1,4 @@ +module.exports = { + presets: ["@babel/preset-env", "@babel/preset-typescript"], + plugins: [], +}; diff --git a/cli/build-scripts/bin/jitsu-build-scripts b/cli/build-scripts/bin/jitsu-build-scripts new file mode 100755 index 000000000..864e6337f --- /dev/null +++ b/cli/build-scripts/bin/jitsu-build-scripts @@ -0,0 +1,3 @@ +#!/usr/bin/env node + +require("../dist/main.js"); \ No newline at end of file diff --git a/cli/build-scripts/package.json b/cli/build-scripts/package.json index 82e698be8..13a34ec6d 100644 --- a/cli/build-scripts/package.json +++ b/cli/build-scripts/package.json @@ -6,26 +6,31 @@ "publishConfig": { "access": "public" }, - "bin": "./bin/jitsu-cli", + "bin": "./bin/jitsu-build-scripts", "license": "MIT", "private": false, "scripts": { + "clean": "rm -rf ./dist", + "compile": "tsc -p . ", + "build": "pnpm compile && webpack", "exec": "ts-node src/index.ts" }, "dependencies": { "boxen": "^7.1.1", "colorette": "^2.0.20", - "isolated-vm": "4.7.2", - "jest-cli": "^29.7.0", "semver": "^7.5.4", "simple-git": "^3.22.0", "string-width": "^7.0.0", "tslib": "^2.6.2" }, "devDependencies": { - "@types/minimist": "^1.2.2", + "commander": "^11.0.0", "@types/node": "^20.10.8", "@types/semver": "^7.5.6", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.23.2", + "babel-loader": "^9.1.3", + "webpack": "^5.88.2", "juava": "workspace:*" } } diff --git a/cli/build-scripts/src/docker.ts b/cli/build-scripts/src/commands/docker.ts similarity index 60% rename from cli/build-scripts/src/docker.ts rename to cli/build-scripts/src/commands/docker.ts index c75800697..bf44f907f 100644 --- a/cli/build-scripts/src/docker.ts +++ b/cli/build-scripts/src/commands/docker.ts @@ -1,133 +1,72 @@ -import minimist from "minimist"; import * as path from "path"; import simpleGit from "simple-git"; import * as fs from "fs"; import { compare as semverCompare, parse as semverParse, SemVer } from "semver"; import * as child_process from "child_process"; -import { color } from "./colors"; -import { drawBox } from "./box"; +import { color } from "../colors"; +import { drawBox } from "../box"; type ReleaseStream = "beta" | "latest"; -const git = simpleGit(); - -function formatDate(date: Date): number { - const pad = number => number.toString().padStart(2, "0"); - - let year = date.getFullYear(); - let month = pad(date.getMonth() + 1); // getMonth() returns 0-11 - let day = pad(date.getDate()); - let hour = pad(date.getHours()); - let minute = pad(date.getMinutes()); - let second = pad(date.getSeconds()); - - return parseInt(`${year}${month}${day}${hour}${minute}${second}`); -} +type Target = "console" | "rotor" | "bulker" | "ingest" | "syncctl" | "sidecar"; -async function getAutomaticVersion(str: ReleaseStream, tagPrefix: string): Promise { - const versions = JSON.parse(fs.readFileSync(path.join(__dirname, "../../../.versions.json")).toString()); - if (str === "beta") { - const [major, minor] = versions.beta.split("."); - const gitHistory = await git.log(); - const latest = gitHistory.all.length; - const revision = gitHistory.latest!.hash.slice(0, 7); - return `${major}.${minor}.${latest}-beta.${formatDate(new Date())}.${revision}`; - } - const gitTags = await git.tags(); - const allSemvers = gitTags.all - .filter(tag => tag.startsWith(tagPrefix + "-") && tag.indexOf("beta") < 0) - .map(tag => tag.slice(tagPrefix.length + 1)) - .map(tag => (tag.startsWith("v") ? tag.slice(1) : tag)) - .map(t => semverParse(t)) - .filter(Boolean) as SemVer[]; - - const latest = allSemvers.sort((a, b) => semverCompare(a, b)).pop(); - if (latest) { - const nextVersion = `${latest.major}.${latest.minor}.${latest.patch + 1}`; - console.log(`Found latest stable release: ' + ${latest.version}. Going to use ${nextVersion} as next version`); - return nextVersion; - } - const [major, minor] = versions.latest.split("."); - return `${major}.${minor}.0`; -} +const git = simpleGit(); -export function runCommand( - command: string, - opts: { - args?: string[]; - outputHandler?: (data: any, opts: { stream: "stderr" | "stdout" }) => void; - } = {} -): Promise { - return new Promise((resolve, reject) => { - const fullCommand = `${command}${opts.args && opts.args.length > 0 ? " " + opts.args?.join(" ") : ""}`; - const proc = child_process.exec( - fullCommand, - { env: process.env, cwd: path.resolve(__dirname, "../../../") }, - error => { - if (error) { - console.log( - `Command \`${fullCommand}\`\n\tfailed with exit code ${error.code}: ${error?.message} || unknown error` - ); - reject(error); - } else { - resolve(0); - } - } - ); - proc.stdout?.on("data", data => { - if (data && opts.outputHandler) { - opts.outputHandler(data, { stream: "stdout" }); - } - }); - proc.stderr?.on("data", data => { - if (data && opts.outputHandler) { - opts.outputHandler(data, { stream: "stderr" }); - } - }); - }); -} +export type DockerArgs = { + targets: Target[]; + version?: string; + release?: ReleaseStream; + push?: boolean; + platform?: "linux/amd64" | "linux/arm64" | "linux/amd64,linux/arm64"; + gitTagPrefix?: string; + dryRun?: boolean; + pushGitTag?: boolean; + logs?: string; +}; -export async function docker(args: minimist.ParsedArgs): Promise { +export async function docker(dir: string | undefined, args: DockerArgs): Promise { let version = args.version; - const tag: ReleaseStream = args.tag || "beta"; - const tagPrefix = args.taxPrefix || "jitsu2"; - const dryRun = !!(args["dry-run"] || false); + const dockerTag: ReleaseStream = args.release || "beta"; + const tagPrefix = args.gitTagPrefix || "jitsu2"; console.log( drawBox({ - content: [`Hi, I'm Jitsu Docker Builder!`, ``, `I'm going to build docker images for \`${tag}\` release stream`], + content: [ + `Hi, I'm Jitsu Docker Builder!`, + ``, + `I'm going to build docker images for \`${dockerTag}\` release stream`, + ], }) ); - if (!version) { - version = await getAutomaticVersion(tag, tagPrefix); - console.info( - "💁🏻‍ Version (--version param) is not specified, using automatic version: " + color.bold(color.cyan(version)) - ); - } + + version = await adjustVersion(version, dockerTag, tagPrefix); + console.info(`💁🏻‍ Adjusted version for ${dockerTag} release: ` + color.bold(color.cyan(version))); const gitTag = `${tagPrefix}-${version}`; if ((await git.tags()).all.includes(gitTag)) { throw new Error(`Tag ${gitTag} for next version ${version} already exists. Aborting`); } - const logsDir = args["logs"] ? path.resolve(__dirname, "../../../", args["logs"]) : undefined; + const logsDir = args.logs ? path.resolve(__dirname, args.logs) : undefined; if (logsDir) { fs.mkdirSync(logsDir, { recursive: true }); } - for (const dockerTarget of ["console", "rotor"]) { + const targets = args.targets.flatMap(t => t.split(",")); + + for (const dockerTarget of targets) { console.log( `🚀 Building ${color.cyan(dockerTarget)} docker with tags: ${color.cyan( `jitsucom/${dockerTarget}:${version}` - )} and ${color.cyan(`jitsucom/${dockerTarget}:${tag}`)}...` + )} and ${color.cyan(`jitsucom/${dockerTarget}:${dockerTag}`)}...` ); const dockerImageName = `jitsucom/${dockerTarget}`; const dockerArgs = [ "buildx build", `--target ${dockerTarget}`, "--progress=plain", - args["platform"] && `--platform ${args["platform"]}`, - `-t ${dockerImageName}:${tag}`, + `--platform ${args.platform || "linux/amd64"}`, + `-t ${dockerImageName}:${dockerTag}`, `-t ${dockerImageName}:${version}`, `-f all.Dockerfile`, - args["push-docker"] ? "--push" : "--load", + args.push ? "--push" : "--load", ".", ].filter(Boolean); const qt = `${color.gray(color.bold("`"))}`; @@ -136,7 +75,7 @@ export async function docker(args: minimist.ParsedArgs): Promise { `docker ${dockerArgs.filter(args => !args.startsWith("--progress")).join(" ")}` )}${qt}\n\n\t` ); - if (dryRun) { + if (args.dryRun) { console.log(`🏃🏻 Skipping actual build because of ${color.cyan("--dry-run")} flag`); } else { const logPath = logsDir @@ -145,13 +84,14 @@ export async function docker(args: minimist.ParsedArgs): Promise { const stream = logsDir ? fs.createWriteStream(logPath!) : undefined; if (stream) { console.log(`📝 Writing logs to ${color.cyan(logPath!)}`); - stream.write(`Building ${dockerImageName}:${tag}\n`); + stream.write(`Building ${dockerImageName}:${dockerTag}\n`); stream.write(`Command:\n\tdocker ${dockerArgs.join(" ")}\n`); stream.write("=".repeat(80)); stream.write("\n\n"); } const exitCode = await runCommand("docker", { args: [...dockerArgs], + cwd: dir, outputHandler: (data, opts) => { const dataStr = data.toString(); dataStr.split("\n").forEach(line => { @@ -174,7 +114,7 @@ export async function docker(args: minimist.ParsedArgs): Promise { } } } - if (args["push-git-tag"]) { + if (!args.dryRun && args.push && args.pushGitTag) { console.log(`Pushing git tag ${tagPrefix}-${version}...`); await git.addTag(gitTag); try { @@ -184,3 +124,89 @@ export async function docker(args: minimist.ParsedArgs): Promise { } } } + +function formatDate(date: Date): number { + const pad = number => number.toString().padStart(2, "0"); + + let year = date.getFullYear(); + let month = pad(date.getMonth() + 1); // getMonth() returns 0-11 + let day = pad(date.getDate()); + let hour = pad(date.getHours()); + let minute = pad(date.getMinutes()); + let second = pad(date.getSeconds()); + + return parseInt(`${year}${month}${day}${hour}${minute}${second}`); +} + +async function adjustVersion(baseVersion: string | undefined, str: ReleaseStream, tagPrefix: string): Promise { + let version: SemVer | undefined; + if (!baseVersion) { + const gitTags = await git.tags(); + const allSemvers = gitTags.all + .filter(tag => tag.startsWith(tagPrefix + "-") && tag.indexOf("beta") < 0) + .map(tag => tag.slice(tagPrefix.length + 1)) + .map(tag => (tag.startsWith("v") ? tag.slice(1) : tag)) + .map(t => semverParse(t)) + .filter(Boolean) as SemVer[]; + + version = allSemvers.sort((a, b) => semverCompare(a, b)).pop(); + + if (!version) { + throw new Error(`Couldn't guess version from git tags. Please provide --version param`); + } + } else { + const bs = semverParse(baseVersion); + if (!bs) { + throw new Error(`Cannot parse --version ${baseVersion} param as semver`); + } + version = bs; + } + + if (str === "beta") { + const gitHistory = await git.log(); + const latest = gitHistory.all.length; + const revision = gitHistory.latest!.hash.slice(0, 7); + return `${version.major}.${version.minor}.${latest}-${str}.${formatDate(new Date())}.${revision}`; + } else { + const nextVersion = `${version.major}.${version.minor}.${version.patch + 1}`; + console.log(`Found latest stable release: ' + ${version.version}. Going to use ${nextVersion} as next version`); + return nextVersion; + } +} + +export function runCommand( + command: string, + opts: { + args?: string[]; + cwd?: string; + outputHandler?: (data: any, opts: { stream: "stderr" | "stdout" }) => void; + } = {} +): Promise { + return new Promise((resolve, reject) => { + const fullCommand = `${command}${opts.args && opts.args.length > 0 ? " " + opts.args?.join(" ") : ""}`; + const proc = child_process.exec( + fullCommand, + { env: process.env, cwd: opts.cwd ? path.resolve(__dirname, opts.cwd) : undefined }, + error => { + if (error) { + console.log( + `Command \`${fullCommand}\`\n\tfailed with exit code ${error.code}: ${error?.message} || unknown error` + ); + reject(error); + } else { + resolve(0); + } + } + ); + proc.stdout?.on("data", data => { + if (data && opts.outputHandler) { + opts.outputHandler(data, { stream: "stdout" }); + } + }); + proc.stderr?.on("data", data => { + if (data && opts.outputHandler) { + opts.outputHandler(data, { stream: "stderr" }); + } + }); + }); +} diff --git a/cli/build-scripts/src/index.ts b/cli/build-scripts/src/index.ts index dfec1d28c..aab7b49de 100644 --- a/cli/build-scripts/src/index.ts +++ b/cli/build-scripts/src/index.ts @@ -1,37 +1,49 @@ -import minimist from "minimist"; -import { docker } from "./docker"; +import { Command, Option, Argument } from "commander"; +import { docker } from "./commands/docker"; +import pkg from "../package.json"; -const commands: Record Promise> = { - docker: docker, -}; +const version = pkg.version; +const packageName = pkg.name; -async function main() { - const argv = minimist(process.argv.slice(2)); - if (argv._.length === 0) { - console.error(`No command specified. Specify one of the following commands: ${Object.keys(commands).join(", ")}`); - process.exit(1); - } - const commandName = argv._[0]; - const cmd = commands[commandName]; +console.log("Jitsu build-scripts. Version: " + version + "\n"); - if (!cmd) { - console.error(`Unknown command: ${commandName}. Available commands: ${Object.keys(commands).join(", ")}`); - process.exit(1); - } - argv._.shift(); - try { - await cmd(argv); - process.exit(0); - } catch (error: any) { - const msg = `Command ${commandName} failed: ${error?.message || "Unknown error"}`; - if (argv.debug) { - console.error(msg, error); - } else { - console.error(msg); - } - console.error(msg); - process.exit(1); - } -} +const p = new Command(); -main(); +p.name("build-scripts").description("CLI command to create, test and deploy extensions for Jitsu Next"); + +p.command("docker") + .description("Builds and pushes docker images for Jitsu Next services") + .addArgument(new Argument("[dir]", "directory of project to build. Must contain all.Dockerfile file")) + .addOption( + new Option("-t, --targets ", "list of targets to build").choices([ + "console", + "rotor", + "bulker", + "ingest", + "syncctl", + "sidecar", + ]) + ) + .option( + "-v, --version ", + "base version of release in semver format. Required for the first release or version bumps." + ) + .addOption(new Option("--release ", "docker release tag to use").default("beta").choices(["beta", "latest"])) + .option("--push", "whether to push images to docker hub or load it locally", false) + .addOption( + new Option("--platform ", "docker platform to build for") + .default("linux/amd64") + .choices(["linux/amd64", "linux/arm64", "linux/amd64,linux/arm64"]) + ) + .option("--gitTagPrefix ", "prefix that will be used for git tag before version", "jitsu2") + .option("--dryRun", "dry run. Just prints commands that will be executed and do not build anything", false) + .option("--pushGitTag", "push git tag to origin (only after docker push)", true) + .option("--logs ", "path to directory where logs will be stored") + .action(docker); + +//version +//p.version(packageName + " " + version, "-v, --version"); +//help +//p.helpOption("--help", "display help for command"); + +p.parse(); diff --git a/cli/build-scripts/webpack.config.js b/cli/build-scripts/webpack.config.js new file mode 100644 index 000000000..27b02df4f --- /dev/null +++ b/cli/build-scripts/webpack.config.js @@ -0,0 +1,43 @@ +const path = require("path"); +const webpack = require("webpack"); + +const config = { + entry: "./src/index.ts", + target: "node", + externals: { + "../package.json": "require('../package.json')", + }, + node: { + __dirname: false, + }, + devtool: "source-map", + output: { + path: path.resolve(__dirname, "dist"), + }, + plugins: [ + new webpack.IgnorePlugin({ resourceRegExp: /^fsevents$/ }), // Ignore MacOS-only module + ], + module: { + rules: [ + { + test: /\.(ts|tsx)$/i, + use: { + loader: "babel-loader", + }, + }, + { + test: /\.node$/, + loader: "node-loader", + }, + ], + }, + optimization: { + minimize: false, + }, + resolve: { + extensions: [".tsx", ".ts", ".jsx", ".js", ".node", "..."], + }, + mode: "production", +}; + +module.exports = () => config; diff --git a/package.json b/package.json index e1b1a9f93..7e2d20654 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "clean": "turbo run clean || exit 0", "lint": "turbo run lint --", "release": "pnpm build && pnpm test && monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/functions --filter ./libs/jitsu-js --filter ./libs/jitsu-react --npm-tag latest --git-tag 'jitsu-js-libs-v{version}' --push-tag", + "release:build-scripts": "pnpm build --filter ./cli/build-scripts && monorel --filter ./cli/build-scripts --npm-tag latest --version 0.0.3-dev.{rev}.{time} --git-tag 'jitsu-build-scripts-v{version}'", "release:canary": "monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/functions --filter ./libs/jitsu-js --filter ./libs/jitsu-react --version '1.9.0-canary.{rev}.{time}' --npm-tag canary --git-tag 'jitsu-js-libs-canary-v{version}' --push-tag" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 172eca69f..3876ce6ec 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -40,12 +40,6 @@ importers: colorette: specifier: ^2.0.20 version: 2.0.20 - isolated-vm: - specifier: 4.7.2 - version: 4.7.2 - jest-cli: - specifier: ^29.7.0 - version: 29.7.0(@types/node@20.10.8)(ts-node@10.8.2) semver: specifier: ^7.5.4 version: 7.5.4 @@ -59,18 +53,30 @@ importers: specifier: ^2.6.2 version: 2.6.2 devDependencies: - '@types/minimist': - specifier: ^1.2.2 - version: 1.2.2 + '@babel/preset-env': + specifier: ^7.23.2 + version: 7.23.2(@babel/core@7.21.4) + '@babel/preset-typescript': + specifier: ^7.23.2 + version: 7.23.2(@babel/core@7.21.4) '@types/node': specifier: ^20.10.8 version: 20.10.8 '@types/semver': specifier: ^7.5.6 version: 7.5.6 + babel-loader: + specifier: ^9.1.3 + version: 9.1.3(@babel/core@7.21.4)(webpack@5.88.2) + commander: + specifier: ^11.0.0 + version: 11.0.0 juava: specifier: workspace:* version: link:../../libs/juava + webpack: + specifier: ^5.88.2 + version: 5.88.2(webpack-cli@5.0.1) cli/jitsu-cli: dependencies: @@ -2060,7 +2066,7 @@ packages: '@babel/core': 7.21.4 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-wrap-function': 7.22.17 + '@babel/helper-wrap-function': 7.22.20 /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.21.4): resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} @@ -2073,19 +2079,6 @@ packages: '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.22.20 - /@babel/helper-replace-supers@7.20.7: - resolution: {integrity: sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-member-expression-to-functions': 7.22.15 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/template': 7.22.15 - '@babel/traverse': 7.21.4 - '@babel/types': 7.23.0 - transitivePeerDependencies: - - supports-color - /@babel/helper-replace-supers@7.22.9(@babel/core@7.21.4): resolution: {integrity: sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==} engines: {node: '>=6.9.0'} @@ -2109,12 +2102,6 @@ packages: dependencies: '@babel/types': 7.23.0 - /@babel/helper-split-export-declaration@7.18.6: - resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} @@ -2133,14 +2120,6 @@ packages: resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} engines: {node: '>=6.9.0'} - /@babel/helper-wrap-function@7.22.17: - resolution: {integrity: sha512-nAhoheCMlrqU41tAojw9GpVEKDlTS8r3lzFmF0lP52LwblCPbuFSO7nGIZoIcoU5NIm1ABrna0cJExE4Ay6l2Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-function-name': 7.22.5 - '@babel/template': 7.22.15 - '@babel/types': 7.23.0 - /@babel/helper-wrap-function@7.22.20: resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} engines: {node: '>=6.9.0'} @@ -2167,14 +2146,6 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/parser@7.21.4: - resolution: {integrity: sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.23.0 - dev: true - /@babel/parser@7.22.16: resolution: {integrity: sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==} engines: {node: '>=6.0.0'} @@ -2232,11 +2203,9 @@ packages: '@babel/core': 7.21.4 '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.20.7 - '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-replace-supers': 7.22.9(@babel/core@7.21.4) + '@babel/helper-split-export-declaration': 7.22.6 '@babel/plugin-syntax-decorators': 7.21.0(@babel/core@7.21.4) - transitivePeerDependencies: - - supports-color /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} @@ -4437,6 +4406,7 @@ packages: - babel-plugin-macros - supports-color - ts-node + dev: true /@jest/core@29.7.0(ts-node@10.9.1): resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} @@ -8964,6 +8934,7 @@ packages: resolution: {integrity: sha512-f8nQs3cLxbAFc00vEU59yf9UyGUftkPaLGfvbVOIDdx2i1b8epBqj2aNGyP19fiyXWvlmZ7qC1XLjAzw/OKIeA==} dependencies: undici-types: 5.26.5 + dev: true /@types/nodemailer@6.4.7: resolution: {integrity: sha512-f5qCBGAn/f0qtRcd4SEn88c8Fp3Swct1731X4ryPKqS61/A3LmmzN8zaEz7hneJvpjFbUUgY7lru/B/7ODTazg==} @@ -10564,7 +10535,7 @@ packages: '@babel/core': 7.21.4 find-cache-dir: 4.0.0 schema-utils: 4.0.0 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.0.1) dev: true /babel-plugin-istanbul@6.1.1: @@ -10716,7 +10687,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/parser': 7.21.4 + '@babel/parser': 7.22.16 dev: true /babel-preset-current-node-syntax@1.0.1(@babel/core@7.21.4): @@ -10983,8 +10954,8 @@ packages: hasBin: true dependencies: caniuse-lite: 1.0.30001534 - electron-to-chromium: 1.4.368 - node-releases: 2.0.10 + electron-to-chromium: 1.4.520 + node-releases: 2.0.13 update-browserslist-db: 1.0.11(browserslist@4.21.5) /bs-logger@0.2.6: @@ -11899,25 +11870,6 @@ packages: - supports-color - ts-node - /create-jest@29.7.0(@types/node@20.10.8)(ts-node@10.8.2): - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.10.8)(ts-node@10.8.2) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - dev: false - /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -12917,9 +12869,6 @@ packages: dependencies: jake: 10.8.5 - /electron-to-chromium@1.4.368: - resolution: {integrity: sha512-e2aeCAixCj9M7nJxdB/wDjO6mbYX+lJJxSJCXDzlr5YPGYVofuJwGN9nKg2o6wWInjX6XmxRinn3AeJMK81ltw==} - /electron-to-chromium@1.4.520: resolution: {integrity: sha512-Frfus2VpYADsrh1lB3v/ft/WVFlVzOIm+Q0p7U7VqHI6qr7NWHYKe+Wif3W50n7JAFoBsWVsoU0+qDks6WQ60g==} @@ -16452,34 +16401,6 @@ packages: - supports-color - ts-node - /jest-cli@29.7.0(@types/node@20.10.8)(ts-node@10.8.2): - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.7.0(ts-node@10.8.2) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.10.8)(ts-node@10.8.2) - exit: 0.1.2 - import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.10.8)(ts-node@10.8.2) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - dev: false - /jest-config@27.5.1(ts-node@10.8.2): resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -16723,6 +16644,7 @@ packages: transitivePeerDependencies: - babel-plugin-macros - supports-color + dev: true /jest-config@29.7.0(@types/node@18.15.11)(ts-node@10.9.1): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} @@ -16805,47 +16727,6 @@ packages: - babel-plugin-macros - supports-color - /jest-config@29.7.0(@types/node@20.10.8)(ts-node@10.8.2): - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.21.4 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.10.8 - babel-jest: 29.7.0(@babel/core@7.21.4) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 10.8.2(@types/node@18.15.11)(typescript@5.3.3) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - dev: false - /jest-diff@27.5.1: resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -20056,9 +19937,6 @@ packages: resolution: {integrity: sha512-wjaW+KutPOFemtBDuogyy6OMMOs2vpSOwuqbUhFUbrDEOTk66K2lmRyvOdO4t26qGtnPyZXQ4bAuF17cBhi5aQ==} dev: true - /node-releases@2.0.10: - resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} - /node-releases@2.0.13: resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} @@ -23841,7 +23719,7 @@ packages: peerDependencies: rollup: '>=0.66.0 <3' dependencies: - '@babel/code-frame': 7.21.4 + '@babel/code-frame': 7.22.13 jest-worker: 24.9.0 rollup: 1.32.1 rollup-pluginutils: 2.8.2 @@ -26090,6 +25968,7 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true /undici@5.23.0: resolution: {integrity: sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==} diff --git a/release.sh b/release.sh new file mode 100755 index 000000000..b1fd7bda0 --- /dev/null +++ b/release.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +npx jitsu-build-scripts docker -t console,rotor --push $@ + From fce838ea2a40bb53ec1e0e77f8491333b402a905 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 1 Feb 2024 13:46:41 +0400 Subject: [PATCH 0552/1353] console and docker-compose: switch to JITSU_INGEST_PUBLIC_URL update docs --- docker/.env.example | 15 +++++--- docker/README.md | 36 +++++++++++++------ docker/docker-compose.yml | 5 ++- .../TrackingIntegrationDocumentation.tsx | 16 ++++++--- webapps/console/lib/schema/index.ts | 3 +- webapps/console/pages/api/app-config.ts | 6 ++-- 6 files changed, 53 insertions(+), 28 deletions(-) diff --git a/docker/.env.example b/docker/.env.example index a57722218..c626562bb 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -9,8 +9,8 @@ SEED_USER_EMAIL=admin@jitsu.com SEED_USER_PASSWORD=change$me! -# Domain name of your Jitsu server where events will be sent. E.g. jitsu.mycompany.com -INGEST_DOMAIN=localhost +# Domain name of your Jitsu server where events will be sent. E.g. https://jitsu.mycompany.com or http://localhost:8080 +JITSU_INGEST_PUBLIC_URL=http://localhost:8080 # Public URL of your Jitsu UI. E.g. https://jitsu.mycompany.com:3000 or http://localhost:3000 JITSU_PUBLIC_URL=http://localhost:3000 @@ -23,8 +23,12 @@ JITSU_PUBLIC_URL=http://localhost:3000 CONSOLE_TOKEN=raw: BULKER_TOKEN=raw: SYNCCTL_TOKEN=raw: +POSTGRES_PASSWORD=raw: + +#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# OPTIONAL PARAMETERS +#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -### Optional ### JITSU_UI_PORT=3000 JITSU_INGEST_PORT=8080 @@ -33,7 +37,10 @@ JITSU_INGEST_PORT=8080 GITHUB_CLIENT_ID= GITHUB_CLIENT_SECRET= -### Connectors specific ### + +#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# Connectors specific +#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SYNCS_ENABLED=false EXTERNAL_BULKER_HOST=host.minikube.internal diff --git a/docker/README.md b/docker/README.md index 03699272d..e804a5afa 100644 --- a/docker/README.md +++ b/docker/README.md @@ -18,31 +18,45 @@ cp .env.example .env 2. Set up all required variables in `.env` file. -#### `ADMIN_CREDENTIALS` +#### `SEED_USER_EMAIL`, `SEED_USER_PASSWORD` **Required** -Comma-separated list of admin user credentials in format email:password, e.g.: email1@example.com:password1,email2@example.com:password2 +Initial user login and password. -#### `JITSU_PUBLIC_URL` +The very first user will be created with those credentials, and it will become an admin user. -This is an URL where Jitsu UI will be available. +**Please change the password right after first login.** -When using jitsu locally, no need to set this variable. +#### `JITSU_PUBLIC_URL` **Default value:** `http://localhost:${JITSU_UI_PORT}/` -When UI is deployed on remote server, set it with your remote server URL, e.g.: `https://jitsu.mycompany.com:3000`. +This is a URL where Jitsu UI will be available. + +When UI is deployed on remote server, set it with your remote server URL, e.g.: http://your-domain:3000. + +For production deployments, it is recommended to put it behind an HTTPs load balancer or reverse proxy. + +In this case, this value must be set to a public URL, such as: https://jitsu.my-company.com. + +#### `JITSU_INGEST_PUBLIC_URL` + +**Default value:** `http://localhost:${JITSU_INGEST_PORT}/` + +This is a URL where Jitsu Ingest will be available. + +When Jitsu is deployed on remote server, set it with your remote server URL, e.g.: http://your-domain:8080. -#### `INGEST_DOMAIN` +For production deployments, it is recommended to put it behind an HTTPs load balancer or reverse proxy. -Domain of the Jitsu Ingest API how it is available for external users. Ingest API is used for sending events to Jitsu. +In this case, this value must be set to a public URL, such as: https://jitsu.my-company.com. -When using jitsu locally, no need to set this variable. +#### `CONSOLE_TOKEN`, `POSTGRES_PASSWORD`, `BULKER_TOKEN`, `SYNCCTL_TOKEN` -**Default value:** `localhost` +Those secrets are used mostly for internal communication between Jitsu components. -When deployed on remote server, set it with your remote server domain, e.g.: `data.mycompany.com`. +Please make sure to generate random values for those variables, and keep `raw:` prefix for those variables ## Run Jitsu diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index a04187548..eb9ca9459 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -56,8 +56,6 @@ services: restart: "unless-stopped" platform: linux/amd64 environment: - INGEST_HOST: ${INGEST_DOMAIN:-localhost} - INGEST_PORT: ${JITSU_INGEST_PORT:-8080} ROTOR_URL: "http://rotor:3401" BULKER_URL: "http://bulker:3042" CONSOLE_RAW_AUTH_TOKENS: ${CONSOLE_TOKEN:-default} @@ -73,6 +71,7 @@ services: SYNCCTL_URL: "http://syncctl:${EXTERNAL_SYNCS_PORT:-3043}" SYNCCTL_AUTH_KEY: ${SYNCCTL_TOKEN:-default} GOOGLE_SCHEDULER_KEY: ${GOOGLE_SCHEDULER_KEY} + JITSU_INGEST_PUBLIC_URL: "${JITSU_INGEST_PUBLIC_URL:-http://localhost:${JITSU_INGEST_PORT:-8080}/}" JITSU_PUBLIC_URL: "${JITSU_PUBLIC_URL:-${NEXTAUTH_URL:-http://localhost:${JITSU_UI_PORT:-3000}/}}" NEXTAUTH_URL: "${JITSU_PUBLIC_URL:-${NEXTAUTH_URL:-http://localhost:${JITSU_UI_PORT:-3000}/}}" UPDATE_DB: "true" @@ -162,7 +161,7 @@ services: restart: "unless-stopped" environment: TERM: "xterm-256color" - INGEST_DATA_DOMAIN: ${INGEST_DOMAIN:-localhost} + INGEST_PUBLIC_URL: "${JITSU_INGEST_PUBLIC_URL:-http://localhost:${JITSU_INGEST_PORT:-8080}/}" INGEST_KAFKA_BOOTSTRAP_SERVERS: "kafka:9092" INGEST_RAW_AUTH_TOKENS: ${BULKER_TOKEN:-default} INGEST_REPOSITORY_URL: "http://console:3000/api/admin/export/streams-with-destinations" diff --git a/webapps/console/components/TrackingIntegrationDocumentation/TrackingIntegrationDocumentation.tsx b/webapps/console/components/TrackingIntegrationDocumentation/TrackingIntegrationDocumentation.tsx index 325d796e0..22760c781 100644 --- a/webapps/console/components/TrackingIntegrationDocumentation/TrackingIntegrationDocumentation.tsx +++ b/webapps/console/components/TrackingIntegrationDocumentation/TrackingIntegrationDocumentation.tsx @@ -100,9 +100,17 @@ export const TrackingIntegrationDocumentation: React.FC<{ streamId: string; onCa serializer: v => v, }); let domains: string[] = []; - if (appConfig.publicEndpoints.ingestHost) { - const port = appConfig.publicEndpoints.ingestPort; - domains.push(`${appConfig.publicEndpoints.ingestHost}${port != 80 && port != 443 ? `:${port}` : ""}`); + let protocol = appConfig.publicEndpoints.protocol; + if (appConfig.publicEndpoints.ingestUrl) { + //extract host and port + try { + const url = new URL(appConfig.publicEndpoints.ingestUrl); + const host = url.host; + protocol = url.protocol === "https:" ? "https" : "http"; + domains.push(host); + } catch (e) { + console.error("Can't parse ingest URL", appConfig.publicEndpoints.ingestUrl); + } } else { domains = stream ? appConfig.publicEndpoints.dataHost || appConfig.ee.available @@ -119,7 +127,7 @@ export const TrackingIntegrationDocumentation: React.FC<{ streamId: string; onCa const serverWriteKey = stream?.privateKeys?.[0] ? `${stream.privateKeys[0].id}:${stream.privateKeys[0].hint}` : "{server-write-key}"; - const displayDomain = `${appConfig.publicEndpoints.protocol}://${selectedDomain ?? domains?.[0]}`; + const displayDomain = `${protocol}://${selectedDomain ?? domains?.[0]}`; const wrap = (r: ReactNode) => { return (
    diff --git a/webapps/console/lib/schema/index.ts b/webapps/console/lib/schema/index.ts index 371d3a0a3..2897470e6 100644 --- a/webapps/console/lib/schema/index.ts +++ b/webapps/console/lib/schema/index.ts @@ -66,8 +66,7 @@ export const AppConfig = z.object({ protocol: z.enum(["http", "https"]), host: z.string(), dataHost: z.string().optional(), - ingestHost: z.string().optional(), - ingestPort: z.number().optional(), + ingestUrl: z.string().optional(), cname: z.string().optional(), //if differs from standard protocol port - 80 or 443 port: z.number().optional(), diff --git a/webapps/console/pages/api/app-config.ts b/webapps/console/pages/api/app-config.ts index 5045b8fae..5426e431b 100644 --- a/webapps/console/pages/api/app-config.ts +++ b/webapps/console/pages/api/app-config.ts @@ -16,8 +16,7 @@ export default createRoute() .handler(async ({ req }) => { const publicEndpoints = getAppEndpoint(req); const dataHost = mainDataDomain; - const ingestHost = process.env.INGEST_HOST; - const ingestPort = process.env.INGEST_PORT ? parseInt(process.env.INGEST_PORT) : 80; + const ingestUrl = process.env.JITSU_INGEST_PUBLIC_URL; return { docsUrl: process.env.JITSU_DOCUMENTATION_URL || "https://docs-jitsu-com.staging.jitsu.com/", @@ -51,8 +50,7 @@ export default createRoute() host: publicEndpoints.hostname, cname: process.env.CNAME || "cname.jitsu.com", dataHost, - ingestHost, - ingestPort, + ingestUrl, port: publicEndpoints.isDefaultPort ? undefined : publicEndpoints.port, }, logLevel: (process.env.FRONTEND_LOG_LEVEL || process.env.LOG_LEVEL || "info") as any, From 2acb4bce9f65eabb8a37fb9d77ffbfade8ae0fcf Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 1 Feb 2024 14:05:51 +0400 Subject: [PATCH 0553/1353] fix --- all.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/all.Dockerfile b/all.Dockerfile index f02b1f270..1ec02145f 100644 --- a/all.Dockerfile +++ b/all.Dockerfile @@ -26,7 +26,7 @@ RUN --mount=type=cache,id=onetag_pnpm,target=/root/.local/share/pnpm/store/v3 pn ENV NEXTJS_STANDALONE_BUILD=1 #Tubo cache is not working well ? RUN --mount=type=cache,id=onetag_turbo,target=/app/node_modules/.cache/turbo pnpm build -RUN pnpm build +#RUN pnpm build FROM base as console From 28ececd8745d370fca811a7f65535c06234693f7 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 1 Feb 2024 14:16:17 +0400 Subject: [PATCH 0554/1353] fix --- all.Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/all.Dockerfile b/all.Dockerfile index 1ec02145f..198de63c1 100644 --- a/all.Dockerfile +++ b/all.Dockerfile @@ -25,8 +25,8 @@ RUN --mount=type=cache,id=onetag_pnpm,target=/root/.local/share/pnpm/store/v3 pn ENV NEXTJS_STANDALONE_BUILD=1 #Tubo cache is not working well ? -RUN --mount=type=cache,id=onetag_turbo,target=/app/node_modules/.cache/turbo pnpm build -#RUN pnpm build +#RUN --mount=type=cache,id=onetag_turbo,target=/app/node_modules/.cache/turbo pnpm build +RUN pnpm build FROM base as console From 6ec988658bce8414bf6fcda5589f0fdf186867e3 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 1 Feb 2024 14:38:58 +0400 Subject: [PATCH 0555/1353] fix --- .dockerignore | 1 + .gitignore | 10 ++-------- docker/docker-compose.yml | 2 +- 3 files changed, 4 insertions(+), 9 deletions(-) create mode 120000 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 120000 index 000000000..3e4e48b0b --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +.gitignore \ No newline at end of file diff --git a/.gitignore b/.gitignore index 2859664a8..05a8dc3c1 100644 --- a/.gitignore +++ b/.gitignore @@ -16,11 +16,5 @@ node_modules /libs/functions/dist/ /docker/data/** /cache/** -/cli/build-scripts/compiled/src/commands/docker.js -/cli/build-scripts/compiled/src/box.js -/cli/build-scripts/compiled/src/colors.js -/cli/build-scripts/compiled/src/docker.js -/cli/build-scripts/compiled/src/index.js -/cli/build-scripts/compiled/package.json -/cli/build-scripts/dist/main.js -/cli/build-scripts/dist/main.js.map +/cli/build-scripts/compiled/ +/cli/build-scripts/dist/ diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index eb9ca9459..4230a83f0 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -64,7 +64,7 @@ services: DATABASE_URL: "postgresql://postgres:${POSTGRES_PASSWORD:-default}@postgres:5432/postgres?schema=newjitsu" REDIS_URL: "redis://default:${REDIS_PASSWORD:-default}@redis:6379" SEED_USER_EMAIL: ${SEED_USER_EMAIL:-} - SEED_USER_PASSWORD: ${SEED_USER_EMAIL:-} + SEED_USER_PASSWORD: ${SEED_USER_PASSWORD:-} GITHUB_CLIENT_ID: ${GITHUB_CLIENT_ID} GITHUB_CLIENT_SECRET: ${GITHUB_CLIENT_SECRET} SYNCS_ENABLED: ${SYNCS_ENABLED:-false} From b6b7596728ee46b4be6678b4af8708df7113e230 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 1 Feb 2024 14:39:48 +0400 Subject: [PATCH 0556/1353] fix --- all.Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/all.Dockerfile b/all.Dockerfile index 198de63c1..1ec02145f 100644 --- a/all.Dockerfile +++ b/all.Dockerfile @@ -25,8 +25,8 @@ RUN --mount=type=cache,id=onetag_pnpm,target=/root/.local/share/pnpm/store/v3 pn ENV NEXTJS_STANDALONE_BUILD=1 #Tubo cache is not working well ? -#RUN --mount=type=cache,id=onetag_turbo,target=/app/node_modules/.cache/turbo pnpm build -RUN pnpm build +RUN --mount=type=cache,id=onetag_turbo,target=/app/node_modules/.cache/turbo pnpm build +#RUN pnpm build FROM base as console From faab06ec1ebd5929a9c9532618d04b8611788caa Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 1 Feb 2024 16:26:59 +0400 Subject: [PATCH 0557/1353] fix --- docker/.env.example | 12 ++++++------ docker/README.md | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docker/.env.example b/docker/.env.example index c626562bb..dfb5e5519 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -7,7 +7,7 @@ # You can keep those variable empty if you are configuring Jitsu UI via Github auth (see below). In this case first # authorized user will be granted a full access to Jitsu UI. SEED_USER_EMAIL=admin@jitsu.com -SEED_USER_PASSWORD=change$me! +SEED_USER_PASSWORD=changeme # Domain name of your Jitsu server where events will be sent. E.g. https://jitsu.mycompany.com or http://localhost:8080 JITSU_INGEST_PUBLIC_URL=http://localhost:8080 @@ -18,12 +18,12 @@ JITSU_PUBLIC_URL=http://localhost:3000 #### Secrets ### # It is highly recommended to generate random values for those variables. -# You can use `openssl rand -hex 32` to generate random values. Please keep `raw:` prefix +# You can use `openssl rand -hex 32` to generate random values. -CONSOLE_TOKEN=raw: -BULKER_TOKEN=raw: -SYNCCTL_TOKEN=raw: -POSTGRES_PASSWORD=raw: +CONSOLE_TOKEN=changeme +BULKER_TOKEN=changeme +SYNCCTL_TOKEN=changeme +POSTGRES_PASSWORD=changeme #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # OPTIONAL PARAMETERS diff --git a/docker/README.md b/docker/README.md index e804a5afa..24123a4f3 100644 --- a/docker/README.md +++ b/docker/README.md @@ -56,7 +56,7 @@ In this case, this value must be set to a public URL, such as: https://jitsu.my- Those secrets are used mostly for internal communication between Jitsu components. -Please make sure to generate random values for those variables, and keep `raw:` prefix for those variables +Please make sure to generate random values for those variables. ## Run Jitsu From 77dd34ab49566926bb6e180bf02248949d2bf777 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 1 Feb 2024 16:50:46 +0400 Subject: [PATCH 0558/1353] docker-start-console: write exit code --- docker-start-console.sh | 5 +++-- release.sh | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/docker-start-console.sh b/docker-start-console.sh index 90c426d83..a6437474c 100755 --- a/docker-start-console.sh +++ b/docker-start-console.sh @@ -69,6 +69,7 @@ healthcheck() { start_console() { cd /app/webapps/console node server.js & echo $! > /app/console.pid + return $? } kill_console() { @@ -90,10 +91,10 @@ main() { fi echo "Starting the app" healthcheck $$ & - start_console + exit_code=$(start_console) sleep 1000 cancel_healthcheck="1" - echo "App stopped, exiting..." + echo "App stopped with exit code ${exit_code}, exiting..." elif [ "$cmd" = "db-prepare" ]; then diff --git a/release.sh b/release.sh index b1fd7bda0..f9a862350 100755 --- a/release.sh +++ b/release.sh @@ -1,4 +1,4 @@ #!/usr/bin/env bash -npx jitsu-build-scripts docker -t console,rotor --push $@ +npx jitsu-build-scripts@latest docker -t console,rotor --push $@ From cae8a70b00ee3343eb47fcfcd54527aae7205084 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 1 Feb 2024 17:00:41 +0400 Subject: [PATCH 0559/1353] all.Dockerfile don't cache turbo directory --- all.Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/all.Dockerfile b/all.Dockerfile index 1ec02145f..198de63c1 100644 --- a/all.Dockerfile +++ b/all.Dockerfile @@ -25,8 +25,8 @@ RUN --mount=type=cache,id=onetag_pnpm,target=/root/.local/share/pnpm/store/v3 pn ENV NEXTJS_STANDALONE_BUILD=1 #Tubo cache is not working well ? -RUN --mount=type=cache,id=onetag_turbo,target=/app/node_modules/.cache/turbo pnpm build -#RUN pnpm build +#RUN --mount=type=cache,id=onetag_turbo,target=/app/node_modules/.cache/turbo pnpm build +RUN pnpm build FROM base as console From aec6914e60253140ba955381fd11115bd8e52226 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 1 Feb 2024 19:43:28 +0400 Subject: [PATCH 0560/1353] docker-compose.yml switch to latest --- docker/docker-compose.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 4230a83f0..94b8e6340 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -52,7 +52,7 @@ services: console: tty: true - image: jitsucom/console:beta + image: jitsucom/console:latest restart: "unless-stopped" platform: linux/amd64 environment: @@ -103,7 +103,7 @@ services: bulker: tty: true - image: jitsucom/bulker:beta + image: jitsucom/bulker:latest platform: linux/amd64 restart: "unless-stopped" environment: @@ -130,7 +130,7 @@ services: rotor: tty: true - image: jitsucom/rotor:beta + image: jitsucom/rotor:latest platform: linux/amd64 restart: "unless-stopped" environment: @@ -156,7 +156,7 @@ services: ingest: tty: true - image: jitsucom/ingest:beta + image: jitsucom/ingest:latest platform: linux/amd64 restart: "unless-stopped" environment: @@ -185,7 +185,7 @@ services: syncctl: tty: true - image: jitsucom/syncctl:beta + image: jitsucom/syncctl:latest platform: linux/amd64 restart: "on-failure" environment: From 59092fa2c00a3f589585f117391f3e0a85e0a601 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 1 Feb 2024 20:23:40 +0400 Subject: [PATCH 0561/1353] jitsu-build-scripts: fixes --- cli/build-scripts/src/commands/docker.ts | 32 ++++++++++++++++-------- package.json | 2 +- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/cli/build-scripts/src/commands/docker.ts b/cli/build-scripts/src/commands/docker.ts index bf44f907f..5a2ad7b4e 100644 --- a/cli/build-scripts/src/commands/docker.ts +++ b/cli/build-scripts/src/commands/docker.ts @@ -40,7 +40,7 @@ export async function docker(dir: string | undefined, args: DockerArgs): Promise version = await adjustVersion(version, dockerTag, tagPrefix); console.info(`💁🏻‍ Adjusted version for ${dockerTag} release: ` + color.bold(color.cyan(version))); - const gitTag = `${tagPrefix}-${version}`; + const gitTag = `${tagPrefix}-v${version}`; if ((await git.tags()).all.includes(gitTag)) { throw new Error(`Tag ${gitTag} for next version ${version} already exists. Aborting`); } @@ -115,12 +115,12 @@ export async function docker(dir: string | undefined, args: DockerArgs): Promise } } if (!args.dryRun && args.push && args.pushGitTag) { - console.log(`Pushing git tag ${tagPrefix}-${version}...`); + console.log(`Pushing git tag ${gitTag}...`); await git.addTag(gitTag); try { await git.pushTags(); - } catch (e) { - //so far ignore, it happens when there's a conflict in tags + } catch (e: any) { + throw new Error(`Failed to push git tag ${gitTag}: ${e.message}`); } } } @@ -138,9 +138,13 @@ function formatDate(date: Date): number { return parseInt(`${year}${month}${day}${hour}${minute}${second}`); } -async function adjustVersion(baseVersion: string | undefined, str: ReleaseStream, tagPrefix: string): Promise { +async function adjustVersion( + manualVersion: string | undefined, + str: ReleaseStream, + tagPrefix: string +): Promise { let version: SemVer | undefined; - if (!baseVersion) { + if (!manualVersion) { const gitTags = await git.tags(); const allSemvers = gitTags.all .filter(tag => tag.startsWith(tagPrefix + "-") && tag.indexOf("beta") < 0) @@ -155,9 +159,9 @@ async function adjustVersion(baseVersion: string | undefined, str: ReleaseStream throw new Error(`Couldn't guess version from git tags. Please provide --version param`); } } else { - const bs = semverParse(baseVersion); + const bs = semverParse(manualVersion); if (!bs) { - throw new Error(`Cannot parse --version ${baseVersion} param as semver`); + throw new Error(`Cannot parse --version ${manualVersion} param as semver`); } version = bs; } @@ -168,9 +172,15 @@ async function adjustVersion(baseVersion: string | undefined, str: ReleaseStream const revision = gitHistory.latest!.hash.slice(0, 7); return `${version.major}.${version.minor}.${latest}-${str}.${formatDate(new Date())}.${revision}`; } else { - const nextVersion = `${version.major}.${version.minor}.${version.patch + 1}`; - console.log(`Found latest stable release: ' + ${version.version}. Going to use ${nextVersion} as next version`); - return nextVersion; + if (manualVersion) { + const nextVersion = `${version.major}.${version.minor}.${version.patch}`; + console.log(`Going to use ${nextVersion} as next version`); + return nextVersion; + } else { + const nextVersion = `${version.major}.${version.minor}.${version.patch + 1}`; + console.log(`Found latest stable release: ' + ${version.version}. Going to use ${nextVersion} as next version`); + return nextVersion; + } } } diff --git a/package.json b/package.json index 7e2d20654..98bcc3433 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "clean": "turbo run clean || exit 0", "lint": "turbo run lint --", "release": "pnpm build && pnpm test && monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/functions --filter ./libs/jitsu-js --filter ./libs/jitsu-react --npm-tag latest --git-tag 'jitsu-js-libs-v{version}' --push-tag", - "release:build-scripts": "pnpm build --filter ./cli/build-scripts && monorel --filter ./cli/build-scripts --npm-tag latest --version 0.0.3-dev.{rev}.{time} --git-tag 'jitsu-build-scripts-v{version}'", + "release:build-scripts": "pnpm build --filter ./cli/build-scripts && monorel --filter ./cli/build-scripts --npm-tag latest --version 0.0.4-dev.{rev}.{time} --publish --git-tag 'jitsu-build-scripts-v{version}'", "release:canary": "monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/functions --filter ./libs/jitsu-js --filter ./libs/jitsu-react --version '1.9.0-canary.{rev}.{time}' --npm-tag canary --git-tag 'jitsu-js-libs-canary-v{version}' --push-tag" }, "devDependencies": { From 5b58310d9c898022bb67388e6eea11a09d3ec5bb Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 2 Feb 2024 15:37:22 +0400 Subject: [PATCH 0562/1353] jitsu-build-scripts: git check that all changes were pulled from remote --- cli/build-scripts/src/commands/docker.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cli/build-scripts/src/commands/docker.ts b/cli/build-scripts/src/commands/docker.ts index 5a2ad7b4e..379a42b04 100644 --- a/cli/build-scripts/src/commands/docker.ts +++ b/cli/build-scripts/src/commands/docker.ts @@ -38,6 +38,12 @@ export async function docker(dir: string | undefined, args: DockerArgs): Promise }) ); + //git check that all changes are pulled from remote + const status = await git.status(); + if (status.behind > 0) { + throw new Error(`You are ${status.behind} commits behind the remote. Please pull the changes first.`); + } + version = await adjustVersion(version, dockerTag, tagPrefix); console.info(`💁🏻‍ Adjusted version for ${dockerTag} release: ` + color.bold(color.cyan(version))); const gitTag = `${tagPrefix}-v${version}`; From 2b850837f0dba2086586b3c47c0d4a86769ae164 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 2 Feb 2024 15:39:59 +0400 Subject: [PATCH 0563/1353] jitsu-build-scripts: fix --- cli/build-scripts/src/index.ts | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/cli/build-scripts/src/index.ts b/cli/build-scripts/src/index.ts index aab7b49de..0fe875436 100644 --- a/cli/build-scripts/src/index.ts +++ b/cli/build-scripts/src/index.ts @@ -14,16 +14,7 @@ p.name("build-scripts").description("CLI command to create, test and deploy exte p.command("docker") .description("Builds and pushes docker images for Jitsu Next services") .addArgument(new Argument("[dir]", "directory of project to build. Must contain all.Dockerfile file")) - .addOption( - new Option("-t, --targets ", "list of targets to build").choices([ - "console", - "rotor", - "bulker", - "ingest", - "syncctl", - "sidecar", - ]) - ) + .addOption(new Option("-t, --targets ", "list of Dockerfile targets to build.")) .option( "-v, --version ", "base version of release in semver format. Required for the first release or version bumps." From 64bbf08ca4a709213d869374eee0ee81a6ad9bfc Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 2 Feb 2024 15:54:20 +0400 Subject: [PATCH 0564/1353] jitsu-build-scripts: fix --- cli/build-scripts/src/commands/docker.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/cli/build-scripts/src/commands/docker.ts b/cli/build-scripts/src/commands/docker.ts index 379a42b04..a17bbd6f3 100644 --- a/cli/build-scripts/src/commands/docker.ts +++ b/cli/build-scripts/src/commands/docker.ts @@ -39,6 +39,7 @@ export async function docker(dir: string | undefined, args: DockerArgs): Promise ); //git check that all changes are pulled from remote + await git.fetch(); const status = await git.status(); if (status.behind > 0) { throw new Error(`You are ${status.behind} commits behind the remote. Please pull the changes first.`); From bef78ba8a541e73de70ed364cfa87f1894233077 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 6 Feb 2024 13:28:00 +0400 Subject: [PATCH 0565/1353] console: verifyAccess support for workspace slug along with id console: build docker image with NODE_ENV=production --- all.Dockerfile | 2 ++ webapps/console/lib/api.ts | 29 +++++++++++++++++++ .../[workspaceId]/reports/active-events.ts | 25 ++-------------- .../api/[workspaceId]/reports/event-stat.ts | 25 ++-------------- 4 files changed, 35 insertions(+), 46 deletions(-) diff --git a/all.Dockerfile b/all.Dockerfile index 198de63c1..16a9c335a 100644 --- a/all.Dockerfile +++ b/all.Dockerfile @@ -42,6 +42,8 @@ EXPOSE 3000 HEALTHCHECK CMD curl --fail http://localhost:3000/api/healthcheck || exit 1 +ENV NODE_ENV=production + ENTRYPOINT ["sh", "-c", "/app/docker-start-console.sh"] FROM base as rotor diff --git a/webapps/console/lib/api.ts b/webapps/console/lib/api.ts index 117e74f9a..ce34dfd25 100644 --- a/webapps/console/lib/api.ts +++ b/webapps/console/lib/api.ts @@ -284,10 +284,39 @@ export async function verifyAdmin(user: SessionUser) { throw new ApiError(`User ${userId} is not an admin`, { status: 403 }); } +export function looksLikeCuid(id: string) { + return id.length === 25 && id.charAt(0) === "c"; +} + +export async function getWorkspace(workspaceId: string | undefined) { + return requireDefined( + await db.prisma().workspace.findFirst({ + where: { + OR: [ + { + id: workspaceId, + }, + { + slug: workspaceId, + }, + ], + deleted: false, + }, + }), + `Workspace ${workspaceId} not found` + ); +} + export async function verifyAccess(user: SessionUser, workspaceId: string) { if (user.internalId === adminServiceAccountEmail && user.loginProvider === "admin/token") { return; } + if (!looksLikeCuid(workspaceId)) { + const w = await db.prisma().workspace.findFirst({ where: { slug: workspaceId } }); + if (w) { + workspaceId = w.id; + } + } const userId = requireDefined(user.internalId, `internalId is not defined`); if ((await db.prisma().workspaceAccess.count({ where: { userId, workspaceId } })) === 0) { if ((await db.prisma().userProfile.findFirst({ where: { id: user.internalId } }))?.admin) { diff --git a/webapps/console/pages/api/[workspaceId]/reports/active-events.ts b/webapps/console/pages/api/[workspaceId]/reports/active-events.ts index 87703216d..f1c410cff 100644 --- a/webapps/console/pages/api/[workspaceId]/reports/active-events.ts +++ b/webapps/console/pages/api/[workspaceId]/reports/active-events.ts @@ -1,36 +1,15 @@ import { z } from "zod"; -import { createRoute, verifyAccess } from "../../../../lib/api"; +import { createRoute, verifyAccess, getWorkspace } from "../../../../lib/api"; import { clickhouse } from "../../../../lib/server/clickhouse"; import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; import { getServerLog } from "../../../../lib/server/log"; -import { requireDefined } from "juava"; -import { db } from "../../../../lib/server/db"; import { ActiveEventsReport, ActiveEventsReportRow } from "../../../../lib/shared/reporting"; dayjs.extend(utc); const log = getServerLog("report-query"); -async function getWorkspace(workspaceId: string | undefined) { - return requireDefined( - await db.prisma().workspace.findFirst({ - where: { - OR: [ - { - id: workspaceId, - }, - { - slug: workspaceId, - }, - ], - deleted: false, - }, - }), - `Workspace ${workspaceId} not found` - ); -} - function toISOString(period: string) { const [date, time] = period.split(" "); return `${date}T${time}Z`; @@ -50,8 +29,8 @@ export default createRoute() }) .handler(async ({ user, query }) => { const { workspaceId } = query; - await verifyAccess(user, workspaceId); const workspace = await getWorkspace(workspaceId); + await verifyAccess(user, workspace.id); const metricsSchema = process.env.CLICKHOUSE_METRICS_SCHEMA || "newjitsu_metrics"; const end = query.end ? query.end.toISOString() : new Date().toISOString(); const start = query.start ? query.start.toISOString() : dayjs(end).subtract(1, "month").toDate().toISOString(); diff --git a/webapps/console/pages/api/[workspaceId]/reports/event-stat.ts b/webapps/console/pages/api/[workspaceId]/reports/event-stat.ts index 41d4ac53f..e5695018d 100644 --- a/webapps/console/pages/api/[workspaceId]/reports/event-stat.ts +++ b/webapps/console/pages/api/[workspaceId]/reports/event-stat.ts @@ -1,36 +1,15 @@ import { z } from "zod"; -import { createRoute, verifyAccess } from "../../../../lib/api"; +import { createRoute, verifyAccess, getWorkspace } from "../../../../lib/api"; import { clickhouse } from "../../../../lib/server/clickhouse"; import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; import { getServerLog } from "../../../../lib/server/log"; -import { requireDefined } from "juava"; -import { db } from "../../../../lib/server/db"; import { Report } from "../../../../lib/shared/reporting"; dayjs.extend(utc); const log = getServerLog("report-query"); -async function getWorkspace(workspaceId: string | undefined) { - return requireDefined( - await db.prisma().workspace.findFirst({ - where: { - OR: [ - { - id: workspaceId, - }, - { - slug: workspaceId, - }, - ], - deleted: false, - }, - }), - `Workspace ${workspaceId} not found` - ); -} - function toISOString(period: string) { const [date, time] = period.split(" "); return `${date}T${time}Z`; @@ -50,8 +29,8 @@ export default createRoute() }) .handler(async ({ user, query }) => { const { workspaceId } = query; - await verifyAccess(user, workspaceId); const workspace = await getWorkspace(workspaceId); + await verifyAccess(user, workspace.id); const metricsSchema = process.env.CLICKHOUSE_METRICS_SCHEMA || "newjitsu_metrics"; const start = query.start ? new Date(query.start).toISOString() From 50b727d086af17de872a2880f7c84fbd67857a55 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 6 Feb 2024 13:59:31 +0400 Subject: [PATCH 0566/1353] console: docker image: listen on all hosts --- docker-start-console.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-start-console.sh b/docker-start-console.sh index a6437474c..67bbe78eb 100755 --- a/docker-start-console.sh +++ b/docker-start-console.sh @@ -68,7 +68,7 @@ healthcheck() { start_console() { cd /app/webapps/console - node server.js & echo $! > /app/console.pid + HOSTNAME=0.0.0.0 node server.js & echo $! > /app/console.pid return $? } From fb73e5921cfdaf94e487e9cbf7978279b614360d Mon Sep 17 00:00:00 2001 From: Echoz Date: Tue, 6 Feb 2024 16:03:12 +0100 Subject: [PATCH 0567/1353] fix: minor typos (#1083) --- .../components/ConnectionsDiagram/ConnectionsDiagram.tsx | 2 +- webapps/console/pages/[workspaceId]/streams.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx b/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx index effd5c1c5..28b024b2f 100644 --- a/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx +++ b/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx @@ -292,7 +292,7 @@ export const ConnectionsDiagram: React.FC = ({ ) : (
    - Site (or stream) is a source of events which are bing pushed to Jitsu via SDK. It could be a website, web + Site (or stream) is a source of events which are being pushed to Jitsu via SDK. It could be a website, web application, mobile application or backend server
    diff --git a/webapps/console/pages/[workspaceId]/streams.tsx b/webapps/console/pages/[workspaceId]/streams.tsx index d5576bb03..d1d28b0bf 100644 --- a/webapps/console/pages/[workspaceId]/streams.tsx +++ b/webapps/console/pages/[workspaceId]/streams.tsx @@ -518,7 +518,7 @@ const StreamsList: React.FC<{}> = () => { <> Those keys are publicly accessible. They are used in client-side libraries, such as JavaScript. For additional security, consider limiting domains where those keys can be used by specifying{" "} - Authorized JavaScript Domains below.
    + Authorized JavaScript Domains above.

    Using public keys is not necessary, if you're using Custom Domains. In this case, { branding.productName From 9fb1da3890353b7118788050f61068393cfe1b76 Mon Sep 17 00:00:00 2001 From: Echoz Date: Tue, 6 Feb 2024 21:34:48 +0100 Subject: [PATCH 0568/1353] build: copy build output to the correct paths (#1085) --- console.Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/console.Dockerfile b/console.Dockerfile index 78181fa34..0bf3b2ab3 100644 --- a/console.Dockerfile +++ b/console.Dockerfile @@ -30,8 +30,8 @@ RUN npm -g install prisma@$(cat webapps/console/package.json | jq -r '.dependenc COPY --from=builder /app/docker-start-console.sh ./ COPY --from=builder /app/webapps/console/prisma/schema.prisma ./ COPY --from=builder /app/webapps/console/.next/standalone ./ -COPY --from=builder /app/webapps/console/.next/static /app/webapps/console/.next/standalone/webapps/console/.next/static -COPY --from=builder /app/webapps/console/public /app/webapps/console/.next/standalone/webapps/console/public +COPY --from=builder /app/webapps/console/.next/static ./webapps/console/.next/static +COPY --from=builder /app/webapps/console/public ./webapps/console/public EXPOSE 3000 From c2ff613658db3825dac465c1ea3df6903702ba21 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 8 Feb 2024 15:57:08 +0400 Subject: [PATCH 0569/1353] console: check domains using ingress-manager --- webapps/console/lib/server/custom-domains.ts | 39 +++++++++++++++---- .../lib/shared/domain-check-response.ts | 7 +++- .../console/pages/[workspaceId]/streams.tsx | 14 ++++--- .../pages/api/[workspaceId]/domain-check.ts | 35 +++++++++++++++-- .../console/pages/api/admin/domains-report.ts | 4 +- 5 files changed, 80 insertions(+), 19 deletions(-) diff --git a/webapps/console/lib/server/custom-domains.ts b/webapps/console/lib/server/custom-domains.ts index 0f60c4653..879593c8e 100644 --- a/webapps/console/lib/server/custom-domains.ts +++ b/webapps/console/lib/server/custom-domains.ts @@ -1,7 +1,9 @@ import { db } from "./db"; import { StreamConfig } from "../schema"; import dns from "dns"; -import { getLog } from "juava"; +import { getLog, requireDefined } from "juava"; +import { httpAgent, httpsAgent } from "./http-agent"; +import nodeFetch from "node-fetch-commonjs"; type DomainAvailability = { available: true; usedInWorkspaces?: never } | { available: false; usedInWorkspace: string }; @@ -31,7 +33,7 @@ export async function isDomainAvailable(domain: string, workspaceId: string): Pr } } -function resolveCname(domain: string): Promise { +export function resolveCname(domain: string): Promise { return new Promise((resolve, reject) => { dns.resolveCname(domain, (err, addresses) => { if (err) { @@ -52,16 +54,39 @@ function resolveCname(domain: string): Promise { }); } -export async function isCnameValid(domain: string): Promise { - if (!customDomainCnames || customDomainCnames.length == 0) { - throw new Error(`CUSTOM_DOMAIN_CNAMES is not set. isCnameValid() should not be called`); - } +export async function isDomainCnameValid(domain: string): Promise { let cnameRecord: string | undefined; try { cnameRecord = await resolveCname(domain); + return await checkCname(cnameRecord); } catch (e) { getLog().atError().withCause(e).log(`Domain ${domain} has no CNAME records`); return false; } - return !!(cnameRecord && customDomainCnames.includes(cnameRecord.toLowerCase())); +} + +export async function checkCname(cname?: string): Promise { + if (!customDomainCnames || customDomainCnames.length == 0) { + throw new Error(`CUSTOM_DOMAIN_CNAMES is not set. isCnameValid() should not be called`); + } + return !!(cname && customDomainCnames.includes(cname.toLowerCase())); +} + +export async function checkOrAddToIngress(domain: string): Promise { + const ingmgrURLEnv = requireDefined(process.env.INGMGR_URL, "env INGMGR_URL is not defined"); + const ingmgrAuthKey = process.env.INGMGR_AUTH_KEY ?? ""; + const isHttps = ingmgrURLEnv.startsWith("https://"); + const options = { + agent: (isHttps ? httpsAgent : httpAgent)(), + headers: {}, + }; + if (ingmgrAuthKey) { + options.headers["Authorization"] = `Bearer ${ingmgrAuthKey}`; + } + try { + const response = await nodeFetch(ingmgrURLEnv + "/api/domain?name=" + domain, options); + return await response.json(); + } catch (e: any) { + return { error: e.message }; + } } diff --git a/webapps/console/lib/shared/domain-check-response.ts b/webapps/console/lib/shared/domain-check-response.ts index c12cf86ee..f1c38b868 100644 --- a/webapps/console/lib/shared/domain-check-response.ts +++ b/webapps/console/lib/shared/domain-check-response.ts @@ -8,7 +8,12 @@ export const DomainCheckResponse = z.union([ }), z.object({ ok: z.literal(false), - reason: z.union([z.literal("used_by_other_workspace"), z.literal("invalid_domain_name")]), + reason: z.union([ + z.literal("used_by_other_workspace"), + z.literal("invalid_domain_name"), + z.literal("pending_ssl"), + z.literal("internal_error"), + ]), cnameValue: z.never().optional(), }), z.object({ diff --git a/webapps/console/pages/[workspaceId]/streams.tsx b/webapps/console/pages/[workspaceId]/streams.tsx index d1d28b0bf..25ba07674 100644 --- a/webapps/console/pages/[workspaceId]/streams.tsx +++ b/webapps/console/pages/[workspaceId]/streams.tsx @@ -111,7 +111,7 @@ const CustomDomain: React.FC<{ domain: string; deleteDomain: () => Promise - {!data?.ok && ( + {data?.reason === "requires_cname_configuration" && (
    @@ -187,7 +189,7 @@ const CustomDomain: React.FC<{ domain: string; deleteDomain: () => Promise
    {`${"Internal error"}`}
    )} - {!data?.ok && ( + {data?.reason === "requires_cname_configuration" && (
    Description:
    diff --git a/webapps/console/pages/api/[workspaceId]/domain-check.ts b/webapps/console/pages/api/[workspaceId]/domain-check.ts index 22558c2d9..42e020a58 100644 --- a/webapps/console/pages/api/[workspaceId]/domain-check.ts +++ b/webapps/console/pages/api/[workspaceId]/domain-check.ts @@ -1,7 +1,13 @@ import { getServerLog } from "../../../lib/server/log"; import { z } from "zod"; -import { customDomainCnames, isCnameValid, isDomainAvailable } from "../../../lib/server/custom-domains"; +import { + customDomainCnames, + isDomainAvailable, + resolveCname, + checkCname, + checkOrAddToIngress, +} from "../../../lib/server/custom-domains"; import { DomainCheckResponse } from "../../../lib/shared/domain-check-response"; import { createRoute, verifyAccess } from "../../../lib/api"; @@ -30,12 +36,35 @@ export default createRoute() ); return { ok: false, reason: "used_by_other_workspace" }; } - - const cnameValid = await isCnameValid(domain); + const cname = await resolveCname(domain); + const cnameValid = await checkCname(cname); if (!cnameValid) { log.atWarn().log(`Domain ${domain} is not valid`); return { ok: false, reason: "requires_cname_configuration", cnameValue: customDomainCnames[0] }; } + //TODO: remove condition after migration complete + if (cname === "cname2.jitsu.com") { + try { + const ingressStatus = await checkOrAddToIngress(domain); + log.atInfo().log(`Ingress status for ${domain}: ${JSON.stringify(ingressStatus)}`); + if (!ingressStatus) { + log.atWarn().log(`Incorrect ingress status ${domain} is not valid`); + return { ok: false, reason: "internal_error" }; + } + if (ingressStatus.status === "ok") { + return { ok: true }; + } else if (ingressStatus.status === "pending_ssl") { + return { ok: false, reason: "pending_ssl" }; + } else if (ingressStatus.status === "dns_error") { + return { ok: false, reason: "requires_cname_configuration", cnameValue: customDomainCnames[0] }; + } else { + return { ok: false, reason: "internal_error" }; + } + } catch (e) { + log.atError().withCause(e).log(`Error checking ingress status for ${domain}`); + return { ok: false, reason: "internal_error" }; + } + } return { ok: true }; }) .toNextApiHandler(); diff --git a/webapps/console/pages/api/admin/domains-report.ts b/webapps/console/pages/api/admin/domains-report.ts index 39dbe5acf..443d709dd 100644 --- a/webapps/console/pages/api/admin/domains-report.ts +++ b/webapps/console/pages/api/admin/domains-report.ts @@ -1,7 +1,7 @@ import { createRoute } from "../../../lib/api"; import { db } from "../../../lib/server/db"; import { assertDefined, assertTrue } from "juava"; -import { isCnameValid } from "../../../lib/server/custom-domains"; +import { isDomainCnameValid } from "../../../lib/server/custom-domains"; export default createRoute() .GET({ @@ -35,7 +35,7 @@ export default createRoute() let hasPrev: boolean = false; for (const row of domains.rows) { for (const domain of row.config.domains) { - const validCname = cache[domain] ?? (cache[domain] = await isCnameValid(domain)); + const validCname = cache[domain] ?? (cache[domain] = await isDomainCnameValid(domain)); const resRow = { configured: validCname, domain, From be38071a19901d499e824a2d330ac108998db9de Mon Sep 17 00:00:00 2001 From: Echoz Date: Thu, 8 Feb 2024 13:04:19 +0100 Subject: [PATCH 0570/1353] fix: handle error responses from bulker in log endpoint (#1084) --- .../console/pages/api/[workspaceId]/log/[type]/[actorId].ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts b/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts index 2329ed1a1..620b574fb 100644 --- a/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts +++ b/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts @@ -62,6 +62,9 @@ export const api: Api = { }`, options ); + if (!response.ok) { + throw new Error(`${response.status} ${response.statusText}`); + } const json = await response.json(); return json; } catch (e) { From e658402792004c730dd6bb2e4f3313642b2c6852 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 8 Feb 2024 16:29:27 +0400 Subject: [PATCH 0571/1353] console: custom-domains fix --- webapps/console/lib/server/custom-domains.ts | 37 +++++++++++--------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/webapps/console/lib/server/custom-domains.ts b/webapps/console/lib/server/custom-domains.ts index 879593c8e..958f9a70e 100644 --- a/webapps/console/lib/server/custom-domains.ts +++ b/webapps/console/lib/server/custom-domains.ts @@ -33,25 +33,30 @@ export async function isDomainAvailable(domain: string, workspaceId: string): Pr } } -export function resolveCname(domain: string): Promise { - return new Promise((resolve, reject) => { - dns.resolveCname(domain, (err, addresses) => { - if (err) { - reject(err); - } else { - if (addresses.length === 1) { - resolve(addresses[0]); - } else if (!addresses || addresses.length === 0) { - resolve(undefined); +export async function resolveCname(domain: string): Promise { + try { + return await new Promise((resolve, reject) => { + dns.resolveCname(domain, (err, addresses) => { + if (err) { + reject(err); } else { - getLog() - .atWarn() - .log(`Domain ${domain} has multiple CNAME records: ${addresses.join(", ")}. Using first one`); - resolve(addresses[0]); + if (addresses.length === 1) { + resolve(addresses[0]); + } else if (!addresses || addresses.length === 0) { + resolve(undefined); + } else { + getLog() + .atWarn() + .log(`Domain ${domain} has multiple CNAME records: ${addresses.join(", ")}. Using first one`); + resolve(addresses[0]); + } } - } + }); }); - }); + } catch (e) { + getLog().atError().withCause(e).log(`Domain ${domain} has no CNAME records`); + return undefined; + } } export async function isDomainCnameValid(domain: string): Promise { From dcd19e0400c9a41eb3ea98221e189c4344ed4baf Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 8 Feb 2024 16:38:54 +0400 Subject: [PATCH 0572/1353] console: change color for issuing cert status --- webapps/console/pages/[workspaceId]/streams.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/webapps/console/pages/[workspaceId]/streams.tsx b/webapps/console/pages/[workspaceId]/streams.tsx index 25ba07674..98e9b3041 100644 --- a/webapps/console/pages/[workspaceId]/streams.tsx +++ b/webapps/console/pages/[workspaceId]/streams.tsx @@ -37,7 +37,7 @@ const Streams: React.FC = () => { }; const StatusBadge: React.FC< - PropsWithChildren<{ status: "error" | "warning" | "success" | "loading"; className?: string }> + PropsWithChildren<{ status: "error" | "warning" | "info" | "success" | "loading"; className?: string }> > = ({ status, children, className }) => { let color: string | undefined; let defaultDescription: string; @@ -47,6 +47,9 @@ const StatusBadge: React.FC< } else if (status === "success") { color = "cyan"; defaultDescription = "Success"; + } else if (status === "info") { + color = "geekblue"; + defaultDescription = "Info"; } else if (status === "warning") { color = "orange"; defaultDescription = "Warning"; @@ -177,7 +180,7 @@ const CustomDomain: React.FC<{ domain: string; deleteDomain: () => Promise } else if (data?.reason === "requires_cname_configuration") { return Configuration Required; } else if (data?.reason === "pending_ssl") { - return Issuing Certificate; + return Issuing Certificate; } else { return {data?.reason || "ERROR"}; } From 29cc43a199b8c162e9edd3350d87567347cef810 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 8 Feb 2024 17:53:21 +0400 Subject: [PATCH 0573/1353] console: Issuing SSL certificate description --- webapps/console/pages/[workspaceId]/streams.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/webapps/console/pages/[workspaceId]/streams.tsx b/webapps/console/pages/[workspaceId]/streams.tsx index 98e9b3041..f46a98d3e 100644 --- a/webapps/console/pages/[workspaceId]/streams.tsx +++ b/webapps/console/pages/[workspaceId]/streams.tsx @@ -206,6 +206,12 @@ const CustomDomain: React.FC<{ domain: string; deleteDomain: () => Promise
    )} + {data?.reason === "pending_ssl" && ( +
    +
    Description:
    +
    Issuing SSL certificate for the domain. It may take up to 10 minutes.
    +
    + )}
    ); From b24da4c8ecd3eaed44062bd941e5f945dda44239 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 8 Feb 2024 20:03:40 +0400 Subject: [PATCH 0574/1353] domains-report: added 'deleted' field --- webapps/console/pages/api/admin/domains-report.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/webapps/console/pages/api/admin/domains-report.ts b/webapps/console/pages/api/admin/domains-report.ts index 443d709dd..e3c53fcf2 100644 --- a/webapps/console/pages/api/admin/domains-report.ts +++ b/webapps/console/pages/api/admin/domains-report.ts @@ -19,7 +19,8 @@ export default createRoute() s.config ->> 'name' as "streamName", s."updatedAt" as "updatedAt", s.config, - w.id as "workspaceId" + w.id as "workspaceId", + (s.deleted or w.deleted) as "deleted" from newjitsu."ConfigurationObject" s join newjitsu."Workspace" w on w.id = s."workspaceId" where s.type = 'stream' @@ -43,6 +44,7 @@ export default createRoute() misconfigurationReason: validCname ? null : "invalid_cname", sourceId: row.id, workspaceId: row.workspaceId, + deleted: row.deleted, }; res.write(`${hasPrev ? "," : ""}${JSON.stringify(resRow)}\n`); hasPrev = true; From 3e9649dcc67b417f17616da2994a91093640297d Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 9 Feb 2024 12:40:13 +0400 Subject: [PATCH 0575/1353] mixpanel-destination: user gzip where appropriate mongodb: upgrade lib mongodb: enable client compression --- libs/core-functions/package.json | 2 +- .../src/functions/lib/mongodb.ts | 2 +- .../src/functions/mixpanel-destination.ts | 10 ++- pnpm-lock.yaml | 66 +++++++++---------- types/protocols/functions.d.ts | 2 +- 5 files changed, 44 insertions(+), 38 deletions(-) diff --git a/libs/core-functions/package.json b/libs/core-functions/package.json index fee51a3f6..8d7d288f9 100644 --- a/libs/core-functions/package.json +++ b/libs/core-functions/package.json @@ -39,7 +39,7 @@ "isolated-vm": "4.7.2", "juava": "workspace:*", "lodash": "^4.17.21", - "mongodb": "^5.9.2", + "mongodb": "^6.3.0", "node-cache": "^5.1.2", "@mongodb-js/zstd": "^1.2.0", "ioredis": "^5.3.2", diff --git a/libs/core-functions/src/functions/lib/mongodb.ts b/libs/core-functions/src/functions/lib/mongodb.ts index f68a6939a..1f787432e 100644 --- a/libs/core-functions/src/functions/lib/mongodb.ts +++ b/libs/core-functions/src/functions/lib/mongodb.ts @@ -17,7 +17,7 @@ async function createClient() { log.atInfo().log(`Connecting to MongoDB server...`); // Create a new MongoClient - const client = new MongoClient(mongodbURL); + const client = new MongoClient(mongodbURL, { compressors: ["zstd"] }); // Connect the client to the server (optional starting in v4.7) await client.connect(); // Establish and verify connection diff --git a/libs/core-functions/src/functions/mixpanel-destination.ts b/libs/core-functions/src/functions/mixpanel-destination.ts index 245aaa962..5eb5f76b4 100644 --- a/libs/core-functions/src/functions/mixpanel-destination.ts +++ b/libs/core-functions/src/functions/mixpanel-destination.ts @@ -4,6 +4,7 @@ import type { AnalyticsServerEvent, Geo } from "@jitsu/protocols/analytics"; import { randomId, hash } from "juava"; import { MixpanelCredentials } from "../meta"; import { eventTimeSafeMs } from "./lib"; +import zlib from "zlib"; //See https://help.mixpanel.com/hc/en-us/articles/115004708186-Profile-Properties export const specialProperties = [ @@ -130,6 +131,7 @@ function trackEvent( url: `https://api.mixpanel.com/import?strict=1&project_id=${opts.projectId}`, headers: { "Content-type": "application/json", + "Content-Encoding": "gzip", Accept: "application/json", Authorization: `Basic ${getAuth(opts)}`, }, @@ -473,13 +475,17 @@ const MixpanelDestination: JitsuFunction ` : "" + message.payload + ? `${JSON.stringify(message.payload)} (size: ${payload.length} compressed: ${compressed.length}) --> ` + : "" }${result.status} ${await result.text()}`; if (result.status !== 200) { throw new Error(logMessage); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3876ce6ec..de40e23e2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -323,8 +323,8 @@ importers: specifier: ^4.17.21 version: 4.17.21 mongodb: - specifier: ^5.9.2 - version: 5.9.2(@mongodb-js/zstd@1.2.0) + specifier: ^6.3.0 + version: 6.3.0(@mongodb-js/zstd@1.2.0) node-cache: specifier: ^5.1.2 version: 5.1.2 @@ -5221,7 +5221,6 @@ packages: dependencies: sparse-bitfield: 3.0.3 dev: false - optional: true /@mongodb-js/zstd-darwin-arm64@1.2.0: resolution: {integrity: sha512-QWgW6IkWp3ErBXOvlOj9lw3lwMfey7eXh/p/Srb/7sEiu1e0yEO+LQ8IctmDWh8bfznKXmwUC0h7LKDbYR30yw==} @@ -9144,10 +9143,9 @@ packages: - webpack-cli dev: true - /@types/whatwg-url@8.2.2: - resolution: {integrity: sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==} + /@types/whatwg-url@11.0.4: + resolution: {integrity: sha512-lXCmTWSHJvf0TRSO58nm978b8HJ/EdsSsEKLd3ODHFjo+3VGAyyTp4v50nWvwtzBxSMQrVOK7tcuN0zGPLICMw==} dependencies: - '@types/node': 18.15.11 '@types/webidl-conversions': 7.0.0 dev: false @@ -10970,9 +10968,9 @@ packages: dependencies: node-int64: 0.4.0 - /bson@5.5.0: - resolution: {integrity: sha512-B+QB4YmDx9RStKv8LLSl/aVIEV3nYJc3cJNNTK2Cd1TL+7P+cNpw9mAPeCgc5K+j01Dv6sxUzcITXDx7ZU3F0w==} - engines: {node: '>=14.20.1'} + /bson@6.3.0: + resolution: {integrity: sha512-balJfqwwTBddxfnidJZagCBPP/f48zj9Sdp3OJswREOgsJzHiQSaOIAtApSgDQFYgHqAvFkp53AFSqjMDZoTFw==} + engines: {node: '>=16.20.1'} dev: false /buffer-crc32@0.2.13: @@ -18887,7 +18885,6 @@ packages: /memory-pager@1.5.0: resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} dev: false - optional: true /mensch@0.3.4: resolution: {integrity: sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==} @@ -19551,40 +19548,44 @@ packages: resolution: {integrity: sha512-jLXEEYSbqMkT/FuJLBZAVWGuhIb4JNwHE9kPTorAVmsdZ4UzHAfgWxLsVtD7pLRFaOwYPhNG9nUCpmFL1t/dIg==} dev: false - /mongodb-connection-string-url@2.6.0: - resolution: {integrity: sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==} + /mongodb-connection-string-url@3.0.0: + resolution: {integrity: sha512-t1Vf+m1I5hC2M5RJx/7AtxgABy1cZmIPQRMXw+gEIPn/cZNF3Oiy+l0UIypUwVB5trcWHq3crg2g3uAR9aAwsQ==} dependencies: - '@types/whatwg-url': 8.2.2 - whatwg-url: 11.0.0 + '@types/whatwg-url': 11.0.4 + whatwg-url: 13.0.0 dev: false - /mongodb@5.9.2(@mongodb-js/zstd@1.2.0): - resolution: {integrity: sha512-H60HecKO4Bc+7dhOv4sJlgvenK4fQNqqUIlXxZYQNbfEWSALGAwGoyJd/0Qwk4TttFXUOHJ2ZJQe/52ScaUwtQ==} - engines: {node: '>=14.20.1'} + /mongodb@6.3.0(@mongodb-js/zstd@1.2.0): + resolution: {integrity: sha512-tt0KuGjGtLUhLoU263+xvQmPHEGTw5LbcNC73EoFRYgSHwZt5tsoJC110hDyO1kjQzpgNrpdcSza9PknWN4LrA==} + engines: {node: '>=16.20.1'} peerDependencies: '@aws-sdk/credential-providers': ^3.188.0 - '@mongodb-js/zstd': ^1.0.0 - kerberos: ^1.0.0 || ^2.0.0 - mongodb-client-encryption: '>=2.3.0 <3' + '@mongodb-js/zstd': ^1.1.0 + gcp-metadata: ^5.2.0 + kerberos: ^2.0.1 + mongodb-client-encryption: '>=6.0.0 <7' snappy: ^7.2.2 + socks: ^2.7.1 peerDependenciesMeta: '@aws-sdk/credential-providers': optional: true '@mongodb-js/zstd': optional: true + gcp-metadata: + optional: true kerberos: optional: true mongodb-client-encryption: optional: true snappy: optional: true + socks: + optional: true dependencies: - '@mongodb-js/zstd': 1.2.0 - bson: 5.5.0 - mongodb-connection-string-url: 2.6.0 - socks: 2.7.1 - optionalDependencies: '@mongodb-js/saslprep': 1.1.0 + '@mongodb-js/zstd': 1.2.0 + bson: 6.3.0 + mongodb-connection-string-url: 3.0.0 dev: false /monorel@0.4.2: @@ -24344,7 +24345,6 @@ packages: dependencies: memory-pager: 1.5.0 dev: false - optional: true /spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -25343,9 +25343,9 @@ packages: punycode: 2.3.0 dev: false - /tr46@3.0.0: - resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} - engines: {node: '>=12'} + /tr46@4.1.1: + resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} + engines: {node: '>=14'} dependencies: punycode: 2.3.0 dev: false @@ -26742,11 +26742,11 @@ packages: resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} dev: false - /whatwg-url@11.0.0: - resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} - engines: {node: '>=12'} + /whatwg-url@13.0.0: + resolution: {integrity: sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==} + engines: {node: '>=16'} dependencies: - tr46: 3.0.0 + tr46: 4.1.1 webidl-conversions: 7.0.0 dev: false diff --git a/types/protocols/functions.d.ts b/types/protocols/functions.d.ts index 01436af25..ed51eb395 100644 --- a/types/protocols/functions.d.ts +++ b/types/protocols/functions.d.ts @@ -64,7 +64,7 @@ export type FetchType = (url: string, opts?: FetchOpts, logToRedis?: boolean) => export type FetchOpts = { method?: string; headers?: Record; - body?: string; + body?: string | Buffer; }; export type FunctionLogger = { info: (message: string, ...args: any[]) => void; From 5c8d5322cb061d7e3a6637043883a3829ece158c Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 9 Feb 2024 13:28:24 +0400 Subject: [PATCH 0576/1353] console: EventsBrowser: decompress gzipped payload --- .../components/DataView/EventsBrowser.tsx | 35 +++++++++++++------ 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/webapps/console/components/DataView/EventsBrowser.tsx b/webapps/console/components/DataView/EventsBrowser.tsx index 7ca7b3953..54ad280ff 100644 --- a/webapps/console/components/DataView/EventsBrowser.tsx +++ b/webapps/console/components/DataView/EventsBrowser.tsx @@ -23,6 +23,7 @@ import { ConnectionTitle } from "../../pages/[workspaceId]/connections"; import { StreamTitle } from "../../pages/[workspaceId]/streams"; import { trimMiddle } from "../../lib/shared/strings"; import { countries } from "../../lib/shared/countries"; +import zlib from "zlib"; dayjs.extend(utc); dayjs.extend(relativeTime); @@ -452,17 +453,29 @@ const FunctionsLogTable = ({ loadEvents, loading, streamType, entityType, actorI })(); }, [workspace.id]); - const functionLogs = events - ? events.map(e => { - e = { ...e }; - if (e.content.body) { - try { - e.content.body = JSON.parse(e.content.body); - } catch (e) {} + const functionLogs = events || ([] as EventsLogRecord[]); + + const mapHttpBody = (r: { event: EventsLogRecord }): { event: EventsLogRecord } => { + const e = r.event; + if (e.content.body) { + let string; + if (e.content.body.type === "Buffer" && e.content.body.data) { + if (e.content.headers?.["Content-Encoding"] === "gzip") { + string = zlib.gunzipSync(Buffer.from(e.content.body.data)).toString(); + } else { + string = Buffer.from(e.content.body.data).toString(); } - return e; - }) - : ([] as EventsLogRecord[]); + } else { + string = e.content.body; + } + try { + e.content.body = JSON.parse(string); + } catch (er) { + e.content.body = string; + } + } + return r; + }; const columns: ColumnsType = [ { @@ -565,7 +578,7 @@ const FunctionsLogTable = ({ loadEvents, loading, streamType, entityType, actorI loadEvents={loadEvents} className="border border-backgroundDark rounded-lg" events={functionLogs} - drawerNode={event => } + drawerNode={event => } columns={columns} /> ); From 42526971c5c05a0ef4f7458dcf62a96b75ee40e7 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 12 Feb 2024 11:40:17 +0400 Subject: [PATCH 0577/1353] @jitsu/js and rotor: support diff of events for device destinations jsondiffpatch: shrank version of library added to workspace --- .gitignore | 2 + libs/jitsu-js/package.json | 3 +- libs/jitsu-js/src/analytics-plugin.ts | 15 +- libs/jitsu-js/src/version.ts | 4 +- libs/jsondiffpatch/.eslintignore | 7 + libs/jsondiffpatch/.eslintrc.cjs | 28 + libs/jsondiffpatch/jest.config.cjs | 26 + libs/jsondiffpatch/package.json | 50 + libs/jsondiffpatch/src/contexts/context.ts | 46 + libs/jsondiffpatch/src/contexts/diff.ts | 26 + libs/jsondiffpatch/src/contexts/patch.ts | 19 + libs/jsondiffpatch/src/diffpatcher.ts | 41 + libs/jsondiffpatch/src/filters/dates.ts | 22 + libs/jsondiffpatch/src/filters/nested.ts | 110 ++ libs/jsondiffpatch/src/filters/trivial.ts | 106 ++ libs/jsondiffpatch/src/index.ts | 30 + libs/jsondiffpatch/src/pipe.ts | 123 ++ libs/jsondiffpatch/src/processor.ts | 88 ++ libs/jsondiffpatch/src/types.ts | 46 + libs/jsondiffpatch/test/examples/diffpatch.ts | 1375 +++++++++++++++++ libs/jsondiffpatch/test/index.spec.ts | 84 + libs/jsondiffpatch/test/tsconfig.json | 12 + libs/jsondiffpatch/tsconfig.json | 14 + pnpm-lock.yaml | 539 ++++++- services/rotor/package.json | 4 +- services/rotor/src/http/functions.ts | 34 +- 26 files changed, 2772 insertions(+), 82 deletions(-) create mode 100644 libs/jsondiffpatch/.eslintignore create mode 100644 libs/jsondiffpatch/.eslintrc.cjs create mode 100644 libs/jsondiffpatch/jest.config.cjs create mode 100644 libs/jsondiffpatch/package.json create mode 100644 libs/jsondiffpatch/src/contexts/context.ts create mode 100644 libs/jsondiffpatch/src/contexts/diff.ts create mode 100644 libs/jsondiffpatch/src/contexts/patch.ts create mode 100644 libs/jsondiffpatch/src/diffpatcher.ts create mode 100644 libs/jsondiffpatch/src/filters/dates.ts create mode 100644 libs/jsondiffpatch/src/filters/nested.ts create mode 100644 libs/jsondiffpatch/src/filters/trivial.ts create mode 100644 libs/jsondiffpatch/src/index.ts create mode 100644 libs/jsondiffpatch/src/pipe.ts create mode 100644 libs/jsondiffpatch/src/processor.ts create mode 100644 libs/jsondiffpatch/src/types.ts create mode 100644 libs/jsondiffpatch/test/examples/diffpatch.ts create mode 100644 libs/jsondiffpatch/test/index.spec.ts create mode 100644 libs/jsondiffpatch/test/tsconfig.json create mode 100644 libs/jsondiffpatch/tsconfig.json diff --git a/.gitignore b/.gitignore index 05a8dc3c1..498a98a57 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,5 @@ node_modules /cache/** /cli/build-scripts/compiled/ /cli/build-scripts/dist/ +/libs/jsondiffpatch/lib/ +/libs/jsondiffpatch/coverage/ diff --git a/libs/jitsu-js/package.json b/libs/jitsu-js/package.json index c7a3b7bb1..61312621b 100644 --- a/libs/jitsu-js/package.json +++ b/libs/jitsu-js/package.json @@ -42,7 +42,8 @@ "raw-loader": "^4.0.2", "rollup": "^3.2.5", "ts-jest": "29.0.5", - "typescript": "^5.3.3" + "typescript": "^5.3.3", + "jsondiffpatch": "workspace:*" }, "dependencies": { "analytics": "0.8.9" diff --git a/libs/jitsu-js/src/analytics-plugin.ts b/libs/jitsu-js/src/analytics-plugin.ts index 76decbeae..8bbd3f194 100644 --- a/libs/jitsu-js/src/analytics-plugin.ts +++ b/libs/jitsu-js/src/analytics-plugin.ts @@ -9,6 +9,8 @@ import { loadScript } from "./script-loader"; import { internalDestinationPlugins } from "./destination-plugins"; import { jitsuLibraryName, jitsuVersion } from "./version"; import { getTopLevelDomain } from "./tlds"; +import * as jsondiffpatch from "jsondiffpatch"; +const diff = jsondiffpatch.create(); const defaultConfig: Required = { /* Your segment writeKey */ @@ -390,6 +392,11 @@ export type InternalPluginDescriptor = { export type DeviceOptions = AnalyticsPluginDescriptor | InternalPluginDescriptor; +function isDiff(obj: any) { + const keys = Object.keys(obj); + return keys.length === 1 && keys[0] === "__diff"; +} + async function processDestinations( destinations: DestinationDescriptor[], method: string, @@ -402,7 +409,13 @@ async function processDestinations( for (const destination of destinations) { let newEvents = [originalEvent]; if (destination.newEvents) { - newEvents = destination.newEvents.map(e => (e === "same" ? originalEvent : e)); + try { + newEvents = destination.newEvents.map(e => + e === "same" ? originalEvent : isDiff(e) ? diff.patch(originalEvent, e.__diff) : e + ); + } catch (e) { + console.error(`[JITSU] Error applying '${destination.id}' changes to event: ${e?.message}`, e); + } } const credentials = { ...destination.credentials, ...destination.options }; diff --git a/libs/jitsu-js/src/version.ts b/libs/jitsu-js/src/version.ts index f789454fe..46441f83a 100644 --- a/libs/jitsu-js/src/version.ts +++ b/libs/jitsu-js/src/version.ts @@ -1,6 +1,6 @@ -//import pkg from "../package.json"; +import pkg from "../package.json"; -const jitsuVersion = "0.0.0"; +const jitsuVersion = pkg.version !== "0.0.0" ? pkg.version : "2.0.0"; const jitsuLibraryName = "@jitsu/js"; export { jitsuVersion, jitsuLibraryName }; diff --git a/libs/jsondiffpatch/.eslintignore b/libs/jsondiffpatch/.eslintignore new file mode 100644 index 000000000..ee60e3fcf --- /dev/null +++ b/libs/jsondiffpatch/.eslintignore @@ -0,0 +1,7 @@ +**/*{.,-}min.js +node_modules +build +.git +coverage +dist +lib diff --git a/libs/jsondiffpatch/.eslintrc.cjs b/libs/jsondiffpatch/.eslintrc.cjs new file mode 100644 index 000000000..4c3c57597 --- /dev/null +++ b/libs/jsondiffpatch/.eslintrc.cjs @@ -0,0 +1,28 @@ +module.exports = { + root: true, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended-type-checked', + ], + plugins: ['@typescript-eslint'], + parser: '@typescript-eslint/parser', + parserOptions: { + project: true, + tsconfigRootDir: __dirname, + }, + overrides: [ + { + files: ['test/**/*.ts'], + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended-type-checked', + ], + plugins: ['@typescript-eslint'], + parser: '@typescript-eslint/parser', + parserOptions: { + project: './test/tsconfig.json', + tsconfigRootDir: __dirname, + }, + }, + ], +}; diff --git a/libs/jsondiffpatch/jest.config.cjs b/libs/jsondiffpatch/jest.config.cjs new file mode 100644 index 000000000..da4c9cf49 --- /dev/null +++ b/libs/jsondiffpatch/jest.config.cjs @@ -0,0 +1,26 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + extensionsToTreatAsEsm: ['.ts'], + moduleNameMapper: { + '^(\\.{1,2}/.*)\\.js$': '$1', + }, + transform: { + '^.+\\.ts$': [ + 'ts-jest', + { + tsconfig: 'test/tsconfig.json', + useESM: true, + }, + ], + }, + coverageThreshold: { + global: { + branches: 50, + functions: 50, + lines: 50, + statements: 50, + }, + }, +}; diff --git a/libs/jsondiffpatch/package.json b/libs/jsondiffpatch/package.json new file mode 100644 index 000000000..9ccacccd4 --- /dev/null +++ b/libs/jsondiffpatch/package.json @@ -0,0 +1,50 @@ +{ + "name": "jsondiffpatch", + "version": "0.6.0", + "author": "Benjamin Eidelman ", + "description": "Diff & Patch for Javascript objects", + "contributors": [ + "Benjamin Eidelman " + ], + "main": "./lib/index.js", + "types": "./lib/index.d.ts", + "files": [ + "src/index.ts" + ], + "scripts": { + "build": "tsc", + "clean": "rm -rf ./lib", + "type-check": "tsc --noEmit", + "lint": "eslint . --ext .ts", + "test": "jest --coverage", + "prepack": "pnpm build", + "prepublishOnly": "pnpm test && pnpm run lint" + }, + "repository": { + "type": "git", + "url": "https://github.com/benjamine/jsondiffpatch.git" + }, + "keywords": [ + "json", + "diff", + "patch" + ], + "dependencies": { + }, + "devDependencies": { + "@types/jest": "^29.5.10", + "@typescript-eslint/eslint-plugin": "^6.13.1", + "@typescript-eslint/parser": "^6.13.1", + "eslint": "^8.55.0", + "eslint-config-prettier": "^9.1.0", + "jest": "^29.7.0", + "ts-jest": "^29.1.1", + "tslib": "^2.6.2", + "typescript": "~5.3.2" + }, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "homepage": "https://github.com/benjamine/jsondiffpatch" +} diff --git a/libs/jsondiffpatch/src/contexts/context.ts b/libs/jsondiffpatch/src/contexts/context.ts new file mode 100644 index 000000000..5aab3ecf3 --- /dev/null +++ b/libs/jsondiffpatch/src/contexts/context.ts @@ -0,0 +1,46 @@ +import type { Options } from '../types.js'; + +export default abstract class Context { + abstract pipe: string; + + result?: TResult; + hasResult?: boolean; + exiting?: boolean; + parent?: this; + childName?: string | number; + root?: this; + options?: Options; + children?: this[]; + nextAfterChildren?: this | null; + next?: this | null; + + setResult(result: TResult) { + this.result = result; + this.hasResult = true; + return this; + } + + exit() { + this.exiting = true; + return this; + } + + push(child: this, name?: string | number) { + child.parent = this; + if (typeof name !== 'undefined') { + child.childName = name; + } + child.root = this.root || this; + child.options = child.options || this.options; + if (!this.children) { + this.children = [child]; + this.nextAfterChildren = this.next || null; + this.next = child; + } else { + this.children[this.children.length - 1].next = child; + this.children.push(child); + } + child.next = this; + return this; + } +} diff --git a/libs/jsondiffpatch/src/contexts/diff.ts b/libs/jsondiffpatch/src/contexts/diff.ts new file mode 100644 index 000000000..0e6241f15 --- /dev/null +++ b/libs/jsondiffpatch/src/contexts/diff.ts @@ -0,0 +1,26 @@ +import Context from "./context.js"; +import type { Delta } from "../types.js"; + +class DiffContext extends Context { + left: unknown; + right: unknown; + pipe: "diff"; + + leftType?: string; + rightType?: string; + leftIsArray?: boolean; + rightIsArray?: boolean; + + constructor(left: unknown, right: unknown) { + super(); + this.left = left; + this.right = right; + this.pipe = "diff"; + } + + setResult(result: Delta) { + return super.setResult(result); + } +} + +export default DiffContext; diff --git a/libs/jsondiffpatch/src/contexts/patch.ts b/libs/jsondiffpatch/src/contexts/patch.ts new file mode 100644 index 000000000..8e96dec4c --- /dev/null +++ b/libs/jsondiffpatch/src/contexts/patch.ts @@ -0,0 +1,19 @@ +import Context from './context.js'; +import type { Delta } from '../types.js'; + +class PatchContext extends Context { + left: unknown; + delta: Delta; + pipe: 'patch'; + + nested?: boolean; + + constructor(left: unknown, delta: Delta) { + super(); + this.left = left; + this.delta = delta; + this.pipe = 'patch'; + } +} + +export default PatchContext; diff --git a/libs/jsondiffpatch/src/diffpatcher.ts b/libs/jsondiffpatch/src/diffpatcher.ts new file mode 100644 index 000000000..783c74d5c --- /dev/null +++ b/libs/jsondiffpatch/src/diffpatcher.ts @@ -0,0 +1,41 @@ +import Processor from "./processor.js"; +import Pipe from "./pipe.js"; +import DiffContext from "./contexts/diff.js"; +import PatchContext from "./contexts/patch.js"; + +import * as trivial from "./filters/trivial.js"; +import * as nested from "./filters/nested.js"; +import * as dates from "./filters/dates.js"; +import type { Delta, Options } from "./types.js"; + +class DiffPatcher { + processor: Processor; + + constructor(options?: Options) { + this.processor = new Processor(options); + this.processor.pipe( + new Pipe("diff") + .append(nested.collectChildrenDiffFilter, trivial.diffFilter, dates.diffFilter, nested.objectsDiffFilter) + .shouldHaveResult()! + ); + this.processor.pipe( + new Pipe("patch") + .append(nested.collectChildrenPatchFilter, trivial.patchFilter, nested.patchFilter) + .shouldHaveResult()! + ); + } + + options(options: Options) { + return this.processor.options(options); + } + + diff(left: unknown, right: unknown) { + return this.processor.process(new DiffContext(left, right)); + } + + patch(left: unknown, delta: Delta) { + return this.processor.process(new PatchContext(left, delta)); + } +} + +export default DiffPatcher; diff --git a/libs/jsondiffpatch/src/filters/dates.ts b/libs/jsondiffpatch/src/filters/dates.ts new file mode 100644 index 000000000..609037f5e --- /dev/null +++ b/libs/jsondiffpatch/src/filters/dates.ts @@ -0,0 +1,22 @@ +import type { Filter } from '../types.js'; +import type DiffContext from '../contexts/diff.js'; + +export const diffFilter: Filter = function datesDiffFilter( + context, +) { + if (context.left instanceof Date) { + if (context.right instanceof Date) { + if (context.left.getTime() !== context.right.getTime()) { + context.setResult([context.left, context.right]); + } else { + context.setResult(undefined); + } + } else { + context.setResult([context.left, context.right]); + } + context.exit(); + } else if (context.right instanceof Date) { + context.setResult([context.left, context.right]).exit(); + } +}; +diffFilter.filterName = 'dates'; diff --git a/libs/jsondiffpatch/src/filters/nested.ts b/libs/jsondiffpatch/src/filters/nested.ts new file mode 100644 index 000000000..edeb31968 --- /dev/null +++ b/libs/jsondiffpatch/src/filters/nested.ts @@ -0,0 +1,110 @@ +import DiffContext from "../contexts/diff.js"; +import PatchContext from "../contexts/patch.js"; +import type { ArrayDelta, Delta, Filter, ObjectDelta } from "../types.js"; + +export const collectChildrenDiffFilter: Filter = context => { + if (!context || !context.children) { + return; + } + const length = context.children.length; + let child; + let result = context.result as ObjectDelta | ArrayDelta; + for (let index = 0; index < length; index++) { + child = context.children[index]; + if (typeof child.result === "undefined") { + continue; + } + result = result || {}; + (result as Record)[child.childName!] = child.result; + } + if (result && context.leftIsArray) { + result._t = "a"; + } + context.setResult(result).exit(); +}; +collectChildrenDiffFilter.filterName = "collectChildren"; + +export const objectsDiffFilter: Filter = context => { + if (context.leftIsArray || context.leftType !== "object") { + return; + } + + const left = context.left as Record; + const right = context.right as Record; + + let name; + let child; + const propertyFilter = context.options!.propertyFilter; + for (name in left) { + if (!Object.prototype.hasOwnProperty.call(left, name)) { + continue; + } + if (propertyFilter && !propertyFilter(name, context)) { + continue; + } + child = new DiffContext(left[name], right[name]); + context.push(child, name); + } + for (name in right) { + if (!Object.prototype.hasOwnProperty.call(right, name)) { + continue; + } + if (propertyFilter && !propertyFilter(name, context)) { + continue; + } + if (typeof left[name] === "undefined") { + child = new DiffContext(undefined, right[name]); + context.push(child, name); + } + } + + if (!context.children || context.children.length === 0) { + context.setResult(undefined).exit(); + return; + } + context.exit(); +}; +objectsDiffFilter.filterName = "objects"; + +export const patchFilter: Filter = function nestedPatchFilter(context) { + if (!context.nested) { + return; + } + const nestedDelta = context.delta as ObjectDelta | ArrayDelta; + if (nestedDelta._t) { + return; + } + const objectDelta = nestedDelta as ObjectDelta; + let name; + let child; + for (name in objectDelta) { + child = new PatchContext((context.left as Record)[name], objectDelta[name]); + context.push(child, name); + } + context.exit(); +}; +patchFilter.filterName = "objects"; + +export const collectChildrenPatchFilter: Filter = function collectChildrenPatchFilter(context) { + if (!context || !context.children) { + return; + } + const deltaWithChildren = context.delta as ObjectDelta | ArrayDelta; + if (deltaWithChildren._t) { + return; + } + const object = context.left as Record; + const length = context.children.length; + let child; + for (let index = 0; index < length; index++) { + child = context.children[index]; + const property = child.childName as string; + if (Object.prototype.hasOwnProperty.call(context.left, property) && child.result === undefined) { + delete object[property]; + } else if (object[property] !== child.result) { + object[property] = child.result; + } + } + context.setResult(object).exit(); +}; +collectChildrenPatchFilter.filterName = "collectChildren"; diff --git a/libs/jsondiffpatch/src/filters/trivial.ts b/libs/jsondiffpatch/src/filters/trivial.ts new file mode 100644 index 000000000..42ca3025e --- /dev/null +++ b/libs/jsondiffpatch/src/filters/trivial.ts @@ -0,0 +1,106 @@ +import type DiffContext from "../contexts/diff.js"; +import type PatchContext from "../contexts/patch.js"; +import type { AddedDelta, DeletedDelta, Filter, ModifiedDelta } from "../types.js"; + +function arrayEquals(a: unknown[], b: unknown[]): boolean { + if (a.length !== b.length) { + return false; + } + for (let i = 0; i < a.length; i++) { + if (a[i] !== b[i]) { + return false; + } + } + return true; +} + +export const diffFilter: Filter = function trivialMatchesDiffFilter(context) { + if (context.left === context.right) { + context.setResult(undefined).exit(); + return; + } + if (typeof context.left === "undefined") { + if (typeof context.right === "function") { + throw new Error("functions are not supported"); + } + context.setResult([context.right]).exit(); + return; + } + if (typeof context.right === "undefined") { + context.setResult([context.left, 0, 0]).exit(); + return; + } + if (typeof context.left === "function" || typeof context.right === "function") { + throw new Error("functions are not supported"); + } + context.leftType = context.left === null ? "null" : typeof context.left; + context.rightType = context.right === null ? "null" : typeof context.right; + if (context.leftType !== context.rightType) { + context.setResult([context.left, context.right]).exit(); + return; + } + if (context.leftType === "boolean" || context.leftType === "number" || context.leftType === "string") { + context.setResult([context.left, context.right]).exit(); + return; + } + if (context.leftType === "object") { + context.leftIsArray = Array.isArray(context.left); + } + if (context.rightType === "object") { + context.rightIsArray = Array.isArray(context.right); + } + if (context.leftIsArray !== context.rightIsArray) { + context.setResult([context.left, context.right]).exit(); + return; + } + if (context.leftIsArray && context.rightIsArray) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + if (arrayEquals(context.left as unknown[], context.right as unknown[])) { + context.setResult(undefined).exit(); + return; + } else { + context.setResult([context.left, context.right]).exit(); + return; + } + } + + if (context.left instanceof RegExp) { + if (context.right instanceof RegExp) { + context.setResult([context.left.toString(), context.right.toString()]).exit(); + } else { + context.setResult([context.left, context.right]).exit(); + } + } +}; +diffFilter.filterName = "trivial"; + +export const patchFilter: Filter = function trivialMatchesPatchFilter(context) { + if (typeof context.delta === "undefined") { + context.setResult(context.left).exit(); + return; + } + context.nested = !Array.isArray(context.delta); + if (context.nested) { + return; + } + const nonNestedDelta = context.delta as AddedDelta | ModifiedDelta | DeletedDelta; + if (nonNestedDelta.length === 1) { + context.setResult(nonNestedDelta[0]).exit(); + return; + } + if (nonNestedDelta.length === 2) { + if (context.left instanceof RegExp) { + const regexArgs = /^\/(.*)\/([gimyu]+)$/.exec(nonNestedDelta[1] as string); + if (regexArgs) { + context.setResult(new RegExp(regexArgs[1], regexArgs[2])).exit(); + return; + } + } + context.setResult(nonNestedDelta[1]).exit(); + return; + } + if (nonNestedDelta.length === 3 && nonNestedDelta[2] === 0) { + context.setResult(undefined).exit(); + } +}; +patchFilter.filterName = "trivial"; diff --git a/libs/jsondiffpatch/src/index.ts b/libs/jsondiffpatch/src/index.ts new file mode 100644 index 000000000..65263b6bd --- /dev/null +++ b/libs/jsondiffpatch/src/index.ts @@ -0,0 +1,30 @@ +import DiffPatcher from "./diffpatcher.js"; +import type { Delta, Options } from "./types.js"; +import type Context from "./contexts/context.js"; +import type DiffContext from "./contexts/diff.js"; +import type PatchContext from "./contexts/patch.js"; + +export { DiffPatcher }; + +export type * from "./types.js"; +export type { Context, DiffContext, PatchContext }; + +export function create(options?: Options) { + return new DiffPatcher(options); +} + +let defaultInstance: DiffPatcher; + +export function diff(left: unknown, right: unknown) { + if (!defaultInstance) { + defaultInstance = new DiffPatcher(); + } + return defaultInstance.diff(left, right); +} + +export function patch(left: unknown, delta: Delta) { + if (!defaultInstance) { + defaultInstance = new DiffPatcher(); + } + return defaultInstance.patch(left, delta); +} diff --git a/libs/jsondiffpatch/src/pipe.ts b/libs/jsondiffpatch/src/pipe.ts new file mode 100644 index 000000000..9987dbe71 --- /dev/null +++ b/libs/jsondiffpatch/src/pipe.ts @@ -0,0 +1,123 @@ +import type Context from './contexts/context.js'; +import type Processor from './processor.js'; +import type { Filter } from './types.js'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +class Pipe> { + name: string; + filters: Filter[]; + processor?: Processor; + debug?: boolean; + resultCheck?: ((context: TContext) => void) | null; + + constructor(name: string) { + this.name = name; + this.filters = []; + } + + process(input: TContext) { + if (!this.processor) { + throw new Error('add this pipe to a processor before using it'); + } + const debug = this.debug; + const length = this.filters.length; + const context = input; + for (let index = 0; index < length; index++) { + const filter = this.filters[index]; + if (debug) { + this.log(`filter: ${filter.filterName}`); + } + filter(context); + if (typeof context === 'object' && context.exiting) { + context.exiting = false; + break; + } + } + if (!context.next && this.resultCheck) { + this.resultCheck(context); + } + } + + log(msg: string) { + console.log(`[jsondiffpatch] ${this.name} pipe, ${msg}`); + } + + append(...args: Filter[]) { + this.filters.push(...args); + return this; + } + + prepend(...args: Filter[]) { + this.filters.unshift(...args); + return this; + } + + indexOf(filterName: string) { + if (!filterName) { + throw new Error('a filter name is required'); + } + for (let index = 0; index < this.filters.length; index++) { + const filter = this.filters[index]; + if (filter.filterName === filterName) { + return index; + } + } + throw new Error(`filter not found: ${filterName}`); + } + + list() { + return this.filters.map((f) => f.filterName); + } + + after(filterName: string, ...params: Filter[]) { + const index = this.indexOf(filterName); + this.filters.splice(index + 1, 0, ...params); + return this; + } + + before(filterName: string, ...params: Filter[]) { + const index = this.indexOf(filterName); + this.filters.splice(index, 0, ...params); + return this; + } + + replace(filterName: string, ...params: Filter[]) { + const index = this.indexOf(filterName); + this.filters.splice(index, 1, ...params); + return this; + } + + remove(filterName: string) { + const index = this.indexOf(filterName); + this.filters.splice(index, 1); + return this; + } + + clear() { + this.filters.length = 0; + return this; + } + + shouldHaveResult(should?: boolean) { + if (should === false) { + this.resultCheck = null; + return; + } + if (this.resultCheck) { + return; + } + this.resultCheck = (context) => { + if (!context.hasResult) { + console.log(context); + const error: Error & { noResult?: boolean } = new Error( + `${this.name} failed`, + ); + error.noResult = true; + throw error; + } + }; + return this; + } +} + +export default Pipe; diff --git a/libs/jsondiffpatch/src/processor.ts b/libs/jsondiffpatch/src/processor.ts new file mode 100644 index 000000000..d5a3da7bf --- /dev/null +++ b/libs/jsondiffpatch/src/processor.ts @@ -0,0 +1,88 @@ +import type Context from "./contexts/context.js"; +import type Pipe from "./pipe.js"; +import type { Options } from "./types.js"; +import type DiffContext from "./contexts/diff.js"; +import type PatchContext from "./contexts/patch.js"; + +class Processor { + selfOptions: Options; + pipes: { + diff: Pipe; + patch: Pipe; + }; + + constructor(options?: Options) { + this.selfOptions = options || {}; + this.pipes = {} as { + diff: Pipe; + patch: Pipe; + }; + } + + options(options?: Options) { + if (options) { + this.selfOptions = options; + } + return this.selfOptions; + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + pipe>(name: string | Pipe, pipeArg?: Pipe) { + let pipe = pipeArg; + if (typeof name === "string") { + if (typeof pipe === "undefined") { + return this.pipes[name as keyof typeof this.pipes]!; + } else { + this.pipes[name as keyof typeof this.pipes] = pipe as Pipe< + // eslint-disable-next-line @typescript-eslint/no-explicit-any + Context + >; + } + } + if (name && (name as Pipe).name) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + pipe = name as Pipe>; + if (pipe.processor === this) { + return pipe; + } + this.pipes[pipe.name as keyof typeof this.pipes] = pipe as Pipe< + // eslint-disable-next-line @typescript-eslint/no-explicit-any + Context + >; + } + pipe!.processor = this; + return pipe!; + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + process>(input: TContext, pipe?: Pipe): TContext["result"] | undefined { + let context = input; + context.options = this.options(); + let nextPipe: Pipe | string | null = pipe || input.pipe || "default"; + let lastPipe; + while (nextPipe) { + if (typeof context.nextAfterChildren !== "undefined") { + // children processed and coming back to parent + context.next = context.nextAfterChildren; + context.nextAfterChildren = null; + } + + if (typeof nextPipe === "string") { + nextPipe = this.pipe(nextPipe) as Pipe; + } + nextPipe.process(context); + lastPipe = nextPipe; + nextPipe = null; + if (context) { + if (context.next) { + context = context.next; + nextPipe = context.pipe || lastPipe; + } + } + } + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return context.hasResult ? context.result : undefined; + } +} + +export default Processor; diff --git a/libs/jsondiffpatch/src/types.ts b/libs/jsondiffpatch/src/types.ts new file mode 100644 index 000000000..efeccd45a --- /dev/null +++ b/libs/jsondiffpatch/src/types.ts @@ -0,0 +1,46 @@ +import type Context from "./contexts/context.js"; +import type DiffContext from "./contexts/diff.js"; + +export interface Options { + objectHash?: (item: object, index?: number) => string | undefined; + matchByPosition?: boolean; + arrays?: { + detectMove?: boolean; + includeValueOnMove?: boolean; + }; + propertyFilter?: (name: string, context: DiffContext) => boolean; +} + +export type AddedDelta = [unknown]; +export type ModifiedDelta = [unknown, unknown]; +export type DeletedDelta = [unknown, 0, 0]; + +export interface ObjectDelta { + [property: string]: Delta; +} + +export interface ArrayDelta { + _t: "a"; + [index: number | `${number}`]: Delta; + [index: `_${number}`]: DeletedDelta | MovedDelta; +} + +export type MovedDelta = [unknown, number, 3]; + +export type TextDiffDelta = [string, 0, 2]; + +export type Delta = + | AddedDelta + | ModifiedDelta + | DeletedDelta + | ObjectDelta + | ArrayDelta + | MovedDelta + | TextDiffDelta + | undefined; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export interface Filter> { + (context: TContext): void; + filterName: string; +} diff --git a/libs/jsondiffpatch/test/examples/diffpatch.ts b/libs/jsondiffpatch/test/examples/diffpatch.ts new file mode 100644 index 000000000..f775822c8 --- /dev/null +++ b/libs/jsondiffpatch/test/examples/diffpatch.ts @@ -0,0 +1,1375 @@ +import type { Delta, Options } from "../../src"; + +interface Example { + name?: string; + options?: Options; + left: unknown; + right: unknown; + delta?: Delta; + reverse?: Delta; + exactReverse?: boolean; + noPatch?: boolean; + error?: RegExp; +} + +type ExampleGroup = Example[]; + +const exampleDate = () => new Date(2020, 10, 30, 15, 10, 3); + +const atomicValues: ExampleGroup = [ + // undefined + { + left: undefined, + right: undefined, + delta: undefined, + reverse: undefined, + }, + { + left: undefined, + right: null, + delta: [null], + reverse: [null, 0, 0], + }, + { + left: undefined, + right: false, + delta: [false], + reverse: [false, 0, 0], + }, + { + left: undefined, + right: true, + delta: [true], + reverse: [true, 0, 0], + }, + { + left: undefined, + right: 42, + delta: [42], + reverse: [42, 0, 0], + }, + { + left: undefined, + right: "some text", + delta: ["some text"], + reverse: ["some text", 0, 0], + }, + { + left: undefined, + right: exampleDate(), + delta: [exampleDate()], + reverse: [exampleDate(), 0, 0], + }, + { + left: undefined, + right: { + a: 1, + b: 2, + }, + delta: [ + { + a: 1, + b: 2, + }, + ], + reverse: [ + { + a: 1, + b: 2, + }, + 0, + 0, + ], + }, + { + left: undefined, + right: [1, 2, 3], + delta: [[1, 2, 3]], + reverse: [[1, 2, 3], 0, 0], + }, + { + left: undefined, + right(x: number) { + return x * x; + }, + error: /not supported/, + }, + + // null + { + left: null, + right: null, + delta: undefined, + reverse: undefined, + }, + { + left: null, + right: false, + delta: [null, false], + reverse: [false, null], + }, + { + left: null, + right: true, + delta: [null, true], + reverse: [true, null], + }, + { + left: null, + right: 42, + delta: [null, 42], + reverse: [42, null], + }, + { + left: null, + right: "some text", + delta: [null, "some text"], + reverse: ["some text", null], + }, + { + left: null, + right: exampleDate(), + delta: [null, exampleDate()], + reverse: [exampleDate(), null], + }, + { + left: null, + right: { + a: 1, + b: 2, + }, + delta: [ + null, + { + a: 1, + b: 2, + }, + ], + reverse: [ + { + a: 1, + b: 2, + }, + null, + ], + }, + { + left: null, + right(x: number) { + return x * x; + }, + error: /not supported/, + }, + + // false + { + left: false, + right: false, + delta: undefined, + reverse: undefined, + }, + { + left: false, + right: true, + delta: [false, true], + reverse: [true, false], + }, + { + left: false, + right: 42, + delta: [false, 42], + reverse: [42, false], + }, + { + left: false, + right: "some text", + delta: [false, "some text"], + reverse: ["some text", false], + }, + { + left: false, + right: exampleDate(), + delta: [false, exampleDate()], + reverse: [exampleDate(), false], + }, + { + left: false, + right: { + a: 1, + b: 2, + }, + delta: [ + false, + { + a: 1, + b: 2, + }, + ], + reverse: [ + { + a: 1, + b: 2, + }, + false, + ], + }, + { + left: false, + right: [1, 2, 3], + delta: [false, [1, 2, 3]], + reverse: [[1, 2, 3], false], + }, + { + left: false, + right(x: number) { + return x * x; + }, + error: /not supported/, + }, + + // true + { + left: true, + right: true, + delta: undefined, + reverse: undefined, + }, + { + left: true, + right: 42, + delta: [true, 42], + reverse: [42, true], + }, + { + left: true, + right: "some text", + delta: [true, "some text"], + reverse: ["some text", true], + }, + { + left: true, + right: exampleDate(), + delta: [true, exampleDate()], + reverse: [exampleDate(), true], + }, + { + left: true, + right: { + a: 1, + b: 2, + }, + delta: [ + true, + { + a: 1, + b: 2, + }, + ], + reverse: [ + { + a: 1, + b: 2, + }, + true, + ], + }, + { + left: true, + right: [1, 2, 3], + delta: [true, [1, 2, 3]], + reverse: [[1, 2, 3], true], + }, + { + left: true, + right(x: number) { + return x * x; + }, + error: /not supported/, + }, + + // number + { + name: "number -> same number", + left: 42, + right: 42, + delta: undefined, + reverse: undefined, + }, + { + left: 42, + right: -1, + delta: [42, -1], + reverse: [-1, 42], + }, + { + left: 42, + right: "some text", + delta: [42, "some text"], + reverse: ["some text", 42], + }, + { + left: 42, + right: exampleDate(), + delta: [42, exampleDate()], + reverse: [exampleDate(), 42], + }, + { + left: 42, + right: { + a: 1, + b: 2, + }, + delta: [ + 42, + { + a: 1, + b: 2, + }, + ], + reverse: [ + { + a: 1, + b: 2, + }, + 42, + ], + }, + { + left: 42, + right: [1, 2, 3], + delta: [42, [1, 2, 3]], + reverse: [[1, 2, 3], 42], + }, + { + left: 42, + right(x: number) { + return x * x; + }, + error: /not supported/, + }, + + // string + { + name: "string -> same string", + left: "some text", + right: "some text", + delta: undefined, + reverse: undefined, + }, + { + left: "some text", + right: "some fext", + delta: ["some text", "some fext"], + reverse: ["some fext", "some text"], + }, + { + left: "some text", + right: exampleDate(), + delta: ["some text", exampleDate()], + reverse: [exampleDate(), "some text"], + }, + { + left: "some text", + right: { + a: 1, + b: 2, + }, + delta: [ + "some text", + { + a: 1, + b: 2, + }, + ], + reverse: [ + { + a: 1, + b: 2, + }, + "some text", + ], + }, + { + left: "some text", + right: [1, 2, 3], + delta: ["some text", [1, 2, 3]], + reverse: [[1, 2, 3], "some text"], + }, + + // Date + { + name: "Date -> same Date", + left: exampleDate(), + right: exampleDate(), + delta: undefined, + reverse: undefined, + }, + { + left: exampleDate(), + right: new Date(2020, 5, 31, 15, 12, 30), + delta: [exampleDate(), new Date(2020, 5, 31, 15, 12, 30)], + reverse: [new Date(2020, 5, 31, 15, 12, 30), exampleDate()], + }, + { + left: exampleDate(), + right: { + a: 1, + b: 2, + }, + delta: [ + exampleDate(), + { + a: 1, + b: 2, + }, + ], + reverse: [ + { + a: 1, + b: 2, + }, + exampleDate(), + ], + }, + { + left: exampleDate(), + right: [1, 2, 3], + delta: [exampleDate(), [1, 2, 3]], + reverse: [[1, 2, 3], exampleDate()], + }, + { + left: exampleDate(), + right(x: number) { + return x * x; + }, + error: /not supported/, + }, + + // Function + { + name: "string -> Function", + left: "some text", + right(x: number) { + return x * x; + }, + error: /not supported/, + }, + + // RegExp + { + name: "RegExp -> RegExp", + left: /regex/g, + right: /another regex/gi, + delta: ["/regex/g", "/another regex/gi"], + reverse: ["/another regex/gi", "/regex/g"], + }, + + // object + { + name: "object -> same object", + left: { + a: 1, + b: 2, + }, + right: { + a: 1, + b: 2, + }, + delta: undefined, + reverse: undefined, + }, + { + left: { + a: 1, + b: 2, + }, + right: [1, 2, 3], + delta: [ + { + a: 1, + b: 2, + }, + [1, 2, 3], + ], + reverse: [ + [1, 2, 3], + { + a: 1, + b: 2, + }, + ], + }, + { + left: { + a: 1, + b: 2, + }, + right(x: number) { + return x * x; + }, + error: /not supported/, + }, + + // array + { + name: "array -> same array", + left: [1, 2, 3], + right: [1, 2, 3], + delta: undefined, + reverse: undefined, + }, + { + left: [1, 2, 3], + right(x: number) { + return x * x; + }, + error: /not supported/, + }, +]; + +const objects: ExampleGroup = [ + { + name: "first level", + left: { + a: 1, + b: 2, + }, + right: { + a: 42, + b: 2, + }, + delta: { + a: [1, 42], + }, + reverse: { + a: [42, 1], + }, + }, + { + name: "deep level", + left: { + a: { + j: { + k: { + l: { + m: { + n: { + o: 3, + }, + }, + }, + }, + }, + }, + b: 2, + }, + right: { + a: { + j: { + k: { + l: { + m: { + n: { + o: true, + }, + }, + }, + }, + }, + }, + b: 2, + }, + delta: { + a: { + j: { + k: { + l: { + m: { + n: { + o: [3, true], + }, + }, + }, + }, + }, + }, + }, + reverse: { + a: { + j: { + k: { + l: { + m: { + n: { + o: [true, 3], + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "multiple changes", + left: { + a: { + j: { + k: { + l: { + m: { + n: { + o: 3, + }, + }, + }, + }, + }, + }, + b: 2, + c: 5, + }, + right: { + a: { + j: { + k: { + l: { + m: { + n: { + o: 5, + w: 12, + }, + }, + }, + }, + }, + }, + b: 2, + }, + delta: { + a: { + j: { + k: { + l: { + m: { + n: { + o: [3, 5], + w: [12], + }, + }, + }, + }, + }, + }, + c: [5, 0, 0], + }, + reverse: { + a: { + j: { + k: { + l: { + m: { + n: { + o: [5, 3], + w: [12, 0, 0], + }, + }, + }, + }, + }, + }, + c: [5], + }, + }, + { + name: "key removed", + left: { + a: 1, + b: 2, + }, + right: { + a: 1, + }, + delta: { + b: [2, 0, 0], + }, + reverse: { + b: [2], + }, + }, + { + name: "hasOwnProperty", + left: { + hasOwnProperty: true, + }, + right: { + hasOwnProperty: true, + }, + }, +]; + +const arrays: ExampleGroup = [ + { + name: "simple values", + left: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + right: [1, 3, 4, 5, 8, 9, 9.1, 10], + delta: [ + [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + [1, 3, 4, 5, 8, 9, 9.1, 10], + ], + reverse: [ + [1, 3, 4, 5, 8, 9, 9.1, 10], + [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + ], + }, + { + name: "nested array", + left: { arr: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] }, + right: { arr: [1, 3, 4, 5, 8, 9, 9.1, 10] }, + delta: { + arr: [ + [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + [1, 3, 4, 5, 8, 9, 9.1, 10], + ], + }, + reverse: { + arr: [ + [1, 3, 4, 5, 8, 9, 9.1, 10], + [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + ], + }, + }, + { + name: "removed array", + left: { arr: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] }, + right: { arr2: [1, 3, 4, 5, 8, 9, 9.1, 10] }, + delta: { + arr: [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 0, 0], + arr2: [[1, 3, 4, 5, 8, 9, 9.1, 10]], + }, + reverse: { + arr2: [[1, 3, 4, 5, 8, 9, 9.1, 10], 0, 0], + arr: [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]], + }, + }, + { + name: "added block", + left: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + right: [1, 2, 3, 4, 5, 5.1, 5.2, 5.3, 6, 7, 8, 9, 10], + delta: [ + [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + [1, 2, 3, 4, 5, 5.1, 5.2, 5.3, 6, 7, 8, 9, 10], + ], + reverse: [ + [1, 2, 3, 4, 5, 5.1, 5.2, 5.3, 6, 7, 8, 9, 10], + [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + ], + }, + { + name: "movements", + left: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + right: [1, 2, 3, 7, 5, 6, 8, 9, 4, 10], + delta: [ + [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + [1, 2, 3, 7, 5, 6, 8, 9, 4, 10], + ], + reverse: [ + [1, 2, 3, 7, 5, 6, 8, 9, 4, 10], + [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + ], + }, + { + name: "movements(2)", + left: [1, 2, 3, 4], + right: [2, 4, 1, 3], + delta: [ + [1, 2, 3, 4], + [2, 4, 1, 3], + ], + reverse: [ + [2, 4, 1, 3], + [1, 2, 3, 4], + ], + exactReverse: false, + }, + { + name: "nested", + options: { + objectHash(obj: { id?: string }) { + if (obj && obj.id) { + return obj.id; + } + }, + }, + left: [ + 1, + 2, + { + id: 4, + width: 10, + }, + 4, + { + id: "five", + width: 4, + }, + 6, + 7, + 8, + 9, + 10, + ], + right: [ + 1, + 2, + { + id: 4, + width: 12, + }, + 4, + { + id: "five", + width: 4, + }, + 6, + 7, + 8, + 9, + 10, + ], + delta: [ + [ + 1, + 2, + { + id: 4, + width: 10, + }, + 4, + { + id: "five", + width: 4, + }, + 6, + 7, + 8, + 9, + 10, + ], + [ + 1, + 2, + { + id: 4, + width: 12, + }, + 4, + { + id: "five", + width: 4, + }, + 6, + 7, + 8, + 9, + 10, + ], + ], + reverse: [ + [ + 1, + 2, + { + id: 4, + width: 12, + }, + 4, + { + id: "five", + width: 4, + }, + 6, + 7, + 8, + 9, + 10, + ], + [ + 1, + 2, + { + id: 4, + width: 10, + }, + 4, + { + id: "five", + width: 4, + }, + 6, + 7, + 8, + 9, + 10, + ], + ], + }, + // { + // name: "nested with movement", + // options: { + // objectHash(obj: { id?: string }) { + // if (obj && obj.id) { + // return obj.id; + // } + // }, + // }, + // left: [ + // 1, + // 2, + // 4, + // { + // id: "five", + // width: 4, + // }, + // 6, + // 7, + // 8, + // { + // id: 4, + // width: 10, + // height: 3, + // }, + // 9, + // 10, + // ], + // right: [ + // 1, + // 2, + // { + // id: 4, + // width: 12, + // }, + // 4, + // { + // id: "five", + // width: 4, + // }, + // 6, + // 7, + // 8, + // 9, + // 10, + // ], + // delta: { + // _t: "a", + // 2: { + // width: [10, 12], + // height: [3, 0, 0], + // }, + // _7: ["", 2, 3], + // }, + // reverse: { + // _t: "a", + // 7: { + // width: [12, 10], + // height: [3], + // }, + // _2: ["", 7, 3], + // }, + // }, + // { + // name: "nested changes among array insertions and deletions", + // options: { + // objectHash(obj: { id?: string }) { + // if (obj && obj.id) { + // return obj.id; + // } + // }, + // }, + // left: [ + // { + // id: 1, + // }, + // { + // id: 2, + // }, + // { + // id: 4, + // }, + // { + // id: 5, + // }, + // { + // id: 6, + // inner: { + // property: "abc", + // }, + // }, + // { + // id: 7, + // }, + // { + // id: 8, + // }, + // { + // id: 10, + // }, + // { + // id: 11, + // }, + // { + // id: 12, + // }, + // ], + // right: [ + // { + // id: 3, + // }, + // { + // id: 4, + // }, + // { + // id: 6, + // inner: { + // property: "abcd", + // }, + // }, + // { + // id: 9, + // }, + // ], + // delta: { + // _t: "a", + // 0: [{ id: 3 }], + // 2: { + // inner: { + // property: ["abc", "abcd"], + // }, + // }, + // 3: [{ id: 9 }], + // _0: [{ id: 1 }, 0, 0], + // _1: [{ id: 2 }, 0, 0], + // _3: [{ id: 5 }, 0, 0], + // _5: [{ id: 7 }, 0, 0], + // _6: [{ id: 8 }, 0, 0], + // _7: [{ id: 10 }, 0, 0], + // _8: [{ id: 11 }, 0, 0], + // _9: [{ id: 12 }, 0, 0], + // }, + // reverse: { + // _t: "a", + // 0: [{ id: 1 }], + // 1: [{ id: 2 }], + // 3: [{ id: 5 }], + // 4: { + // inner: { + // property: ["abcd", "abc"], + // }, + // }, + // 5: [{ id: 7 }], + // 6: [{ id: 8 }], + // 7: [{ id: 10 }], + // 8: [{ id: 11 }], + // 9: [{ id: 12 }], + // _0: [{ id: 3 }, 0, 0], + // _3: [{ id: 9 }, 0, 0], + // }, + // }, + // { + // name: "nested change with item moved above", + // options: { + // objectHash(obj: { id?: string }) { + // if (obj && obj.id) { + // return obj.id; + // } + // }, + // }, + // left: [ + // { + // id: 1, + // }, + // { + // id: 2, + // }, + // { + // id: 3, + // inner: { + // property: "abc", + // }, + // }, + // { + // id: 4, + // }, + // { + // id: 5, + // }, + // { + // id: 6, + // }, + // ], + // right: [ + // { + // id: 1, + // }, + // { + // id: 2, + // }, + // { + // id: 6, + // }, + // { + // id: 3, + // inner: { + // property: "abcd", + // }, + // }, + // { + // id: 4, + // }, + // { + // id: 5, + // }, + // ], + // delta: { + // _t: "a", + // 3: { + // inner: { + // property: ["abc", "abcd"], + // }, + // }, + // _5: ["", 2, 3], + // }, + // reverse: { + // _t: "a", + // 2: { + // inner: { + // property: ["abcd", "abc"], + // }, + // }, + // _2: ["", 5, 3], + // }, + // }, + // { + // name: "nested change with item moved right above", + // options: { + // objectHash(obj: { id?: string }) { + // if (obj && obj.id) { + // return obj.id; + // } + // }, + // }, + // left: [ + // { + // id: 1, + // }, + // { + // id: 2, + // inner: { + // property: "abc", + // }, + // }, + // { + // id: 3, + // }, + // ], + // right: [ + // { + // id: 1, + // }, + // { + // id: 3, + // }, + // { + // id: 2, + // inner: { + // property: "abcd", + // }, + // }, + // ], + // delta: { + // _t: "a", + // 2: { + // inner: { + // property: ["abc", "abcd"], + // }, + // }, + // _2: ["", 1, 3], + // }, + // reverse: { + // _t: "a", + // 1: { + // inner: { + // property: ["abcd", "abc"], + // }, + // }, + // _2: ["", 1, 3], + // }, + // exactReverse: false, + // }, + // { + // name: "nested change with item moved right below", + // options: { + // objectHash(obj: { id?: string }) { + // if (obj && obj.id) { + // return obj.id; + // } + // }, + // }, + // left: [ + // { + // id: 1, + // }, + // { + // id: 2, + // }, + // { + // id: 3, + // inner: { + // property: "abc", + // }, + // }, + // { + // id: 4, + // }, + // ], + // right: [ + // { + // id: 2, + // }, + // { + // id: 3, + // inner: { + // property: "abcd", + // }, + // }, + // { + // id: 1, + // }, + // { + // id: 4, + // }, + // ], + // delta: { + // _t: "a", + // 1: { + // inner: { + // property: ["abc", "abcd"], + // }, + // }, + // _0: ["", 2, 3], + // }, + // reverse: { + // _t: "a", + // 2: { + // inner: { + // property: ["abcd", "abc"], + // }, + // }, + // _2: ["", 0, 3], + // }, + // }, + // { + // name: "nested with movements using custom objectHash", + // options: { + // objectHash(obj: { itemKey?: string }) { + // if (obj && obj.itemKey) { + // return obj.itemKey; + // } + // }, + // }, + // left: [ + // 1, + // 2, + // 4, + // { + // itemKey: "five", + // width: 4, + // }, + // 6, + // 7, + // 8, + // { + // itemKey: 4, + // width: 10, + // height: 3, + // }, + // 9, + // 10, + // ], + // right: [ + // 1, + // 2, + // { + // itemKey: 4, + // width: 12, + // }, + // 4, + // { + // itemKey: "five", + // width: 4, + // }, + // 6, + // 7, + // 8, + // 9, + // 10, + // ], + // delta: { + // _t: "a", + // 2: { + // width: [10, 12], + // height: [3, 0, 0], + // }, + // _7: ["", 2, 3], + // }, + // reverse: { + // _t: "a", + // 7: { + // width: [12, 10], + // height: [3], + // }, + // _2: ["", 7, 3], + // }, + // }, + { + name: "using property filter", + options: { + propertyFilter(name /*, context */) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-call + return name.slice(0, 1) !== "$"; + }, + }, + left: { + inner: { + $volatileData: 345, + $oldVolatileData: 422, + nonVolatile: 432, + }, + }, + right: { + inner: { + $volatileData: 346, + $newVolatileData: 32, + nonVolatile: 431, + }, + }, + delta: { + inner: { + nonVolatile: [432, 431], + }, + }, + reverse: { + inner: { + nonVolatile: [431, 432], + }, + }, + noPatch: true, + }, +]; + +const examples: Record = { + atomicValues, + objects, + arrays, +}; +export default examples; diff --git a/libs/jsondiffpatch/test/index.spec.ts b/libs/jsondiffpatch/test/index.spec.ts new file mode 100644 index 000000000..6e0571e8c --- /dev/null +++ b/libs/jsondiffpatch/test/index.spec.ts @@ -0,0 +1,84 @@ +import * as jsondiffpatch from "../src/index.js"; + +import examples from "./examples/diffpatch.js"; + +const DiffPatcher = jsondiffpatch.DiffPatcher; + +const valueDescription = (value: unknown) => { + if (value === null) { + return "null"; + } + if (typeof value === "boolean") { + return value.toString(); + } + if (value instanceof Date) { + return "Date"; + } + if (value instanceof RegExp) { + return "RegExp"; + } + if (Array.isArray(value)) { + return "array"; + } + if (typeof value === "string") { + if (value.length >= 60) { + return "large text"; + } + } + return typeof value; +}; + +describe("DiffPatcher", () => { + Object.keys(examples).forEach(groupName => { + const group = examples[groupName]; + describe(groupName, () => { + group.forEach(example => { + if (!example) { + return; + } + const name = example.name || `${valueDescription(example.left)} -> ${valueDescription(example.right)}`; + describe(name, () => { + let instance: jsondiffpatch.DiffPatcher; + beforeAll(function () { + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + instance = new DiffPatcher(example.options); + }); + if (example.error) { + it(`diff should fail with: ${example.error}`, function () { + expect(() => { + instance.diff(example.left, example.right); + }).toThrow(example.error); + }); + return; + } + it("can diff", function () { + const delta = instance.diff(example.left, example.right); + expect(delta).toEqual(example.delta); + }); + it("can diff backwards", function () { + const reverse = instance.diff(example.right, example.left); + expect(reverse).toEqual(example.reverse); + }); + if (!example.noPatch) { + it("can patch", function () { + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + const right = instance.patch(example.left, example.delta); + expect(right).toEqual(example.right); + }); + } + }); + }); + }); + }); + + describe("static shortcuts", () => { + it("diff", () => { + const delta = jsondiffpatch.diff(4, 5); + expect(delta).toEqual([4, 5]); + }); + it("patch", () => { + const right = jsondiffpatch.patch(4, [4, 5]); + expect(right).toEqual(5); + }); + }); +}); diff --git a/libs/jsondiffpatch/test/tsconfig.json b/libs/jsondiffpatch/test/tsconfig.json new file mode 100644 index 000000000..5f07a6ed9 --- /dev/null +++ b/libs/jsondiffpatch/test/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "target": "es6", + "module": "node16", + "types": ["jest"], + "isolatedModules": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": false + } +} diff --git a/libs/jsondiffpatch/tsconfig.json b/libs/jsondiffpatch/tsconfig.json new file mode 100644 index 000000000..ab3efb1af --- /dev/null +++ b/libs/jsondiffpatch/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2015", + "declaration": true, + "outDir": "lib", + "isolatedModules": true, + "moduleResolution": "node", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": false + }, + "include": ["src"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index de40e23e2..5103336fa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -275,7 +275,7 @@ importers: version: 6.10.0(react-dom@18.2.0)(react@18.2.0) react-scripts: specifier: ^5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.29.0)(react@18.2.0)(ts-node@10.8.2)(typescript@5.3.3) + version: 5.0.1(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.55.0)(react@18.2.0)(ts-node@10.8.2)(typescript@5.3.3) web-vitals: specifier: ^2.1.4 version: 2.1.4 @@ -460,6 +460,9 @@ importers: jest: specifier: ^29.2.2 version: 29.5.0(@types/node@16.18.23)(ts-node@10.8.2) + jsondiffpatch: + specifier: workspace:* + version: link:../jsondiffpatch node-fetch-commonjs: specifier: ^3.2.4 version: 3.2.4 @@ -522,6 +525,36 @@ importers: specifier: ^5.3.3 version: 5.3.3 + libs/jsondiffpatch: + devDependencies: + '@types/jest': + specifier: ^29.5.10 + version: 29.5.11 + '@typescript-eslint/eslint-plugin': + specifier: ^6.13.1 + version: 6.13.1(@typescript-eslint/parser@6.13.1)(eslint@8.55.0)(typescript@5.3.3) + '@typescript-eslint/parser': + specifier: ^6.13.1 + version: 6.13.1(eslint@8.55.0)(typescript@5.3.3) + eslint: + specifier: ^8.55.0 + version: 8.55.0 + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@8.55.0) + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) + ts-jest: + specifier: ^29.1.1 + version: 29.1.1(@babel/core@7.21.4)(jest@29.7.0)(typescript@5.3.3) + tslib: + specifier: ^2.6.2 + version: 2.6.2 + typescript: + specifier: ~5.3.2 + version: 5.3.3 + libs/juava: dependencies: lodash: @@ -585,6 +618,9 @@ importers: json5: specifier: ^2.1.0 version: 2.2.3 + jsondiffpatch: + specifier: workspace:* + version: link:../../libs/jsondiffpatch juava: specifier: workspace:* version: link:../../libs/juava @@ -618,6 +654,9 @@ importers: prom-client: specifier: ^14.2.0 version: 14.2.0 + semver: + specifier: ^7.5.4 + version: 7.5.4 tar: specifier: ^6.2.0 version: 6.2.0 @@ -1154,6 +1193,10 @@ importers: packages: + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + /@adobe/css-tools@4.3.1: resolution: {integrity: sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==} dev: true @@ -1885,7 +1928,7 @@ packages: transitivePeerDependencies: - supports-color - /@babel/eslint-parser@7.21.3(@babel/core@7.21.4)(eslint@8.29.0): + /@babel/eslint-parser@7.21.3(@babel/core@7.21.4)(eslint@8.55.0): resolution: {integrity: sha512-kfhmPimwo6k4P8zxNs8+T7yR44q1LdpsZdE1NkCsVlfiuTPRfnGgjaF8Qgug9q9Pou17u6wneYF0lDCZJATMFg==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: @@ -1894,7 +1937,7 @@ packages: dependencies: '@babel/core': 7.21.4 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 8.29.0 + eslint: 8.55.0 eslint-visitor-keys: 2.1.0 semver: 6.3.1 dev: false @@ -3535,20 +3578,18 @@ packages: /@emotion/unitless@0.7.5: resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} - /@eslint-community/eslint-utils@4.4.0(eslint@8.29.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.55.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.29.0 - eslint-visitor-keys: 3.4.0 - dev: false + eslint: 8.55.0 + eslint-visitor-keys: 3.4.3 - /@eslint-community/regexpp@4.5.0: - resolution: {integrity: sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==} + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: false /@eslint/eslintrc@1.4.1: resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} @@ -3556,7 +3597,7 @@ packages: dependencies: ajv: 6.12.6 debug: 4.3.4 - espree: 9.5.1 + espree: 9.6.1 globals: 13.20.0 ignore: 5.2.4 import-fresh: 3.3.0 @@ -3566,6 +3607,26 @@ packages: transitivePeerDependencies: - supports-color + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.20.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + /@eslint/js@8.55.0: + resolution: {integrity: sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@fastify/busboy@1.2.1: resolution: {integrity: sha512-7PQA7EH43S0CxcOa9OeAnaeA0oQ+e/DHNPZwSQM9CQHW76jle5+OvLdibRp/Aafs9KXbLhxyjOTkRjWUbQEd3Q==} engines: {node: '>=14'} @@ -4147,6 +4208,16 @@ packages: - supports-color dev: true + /@humanwhocodes/config-array@0.11.14: + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.2 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + /@humanwhocodes/config-array@0.11.8: resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} engines: {node: '>=10.10.0'} @@ -4168,6 +4239,9 @@ packages: /@humanwhocodes/object-schema@1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + /@humanwhocodes/object-schema@2.0.2: + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + /@ioredis/commands@1.2.0: resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} @@ -8731,7 +8805,7 @@ packages: resolution: {integrity: sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==} dependencies: '@types/estree': 1.0.1 - '@types/json-schema': 7.0.11 + '@types/json-schema': 7.0.15 /@types/estree@0.0.39: resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} @@ -8850,6 +8924,9 @@ packages: /@types/json-schema@7.0.11: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} @@ -9169,7 +9246,7 @@ packages: dependencies: '@types/yargs-parser': 21.0.0 - /@typescript-eslint/eslint-plugin@5.58.0(@typescript-eslint/parser@5.58.0)(eslint@8.29.0)(typescript@5.3.3): + /@typescript-eslint/eslint-plugin@5.58.0(@typescript-eslint/parser@5.58.0)(eslint@8.55.0)(typescript@5.3.3): resolution: {integrity: sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -9180,13 +9257,13 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.5.0 - '@typescript-eslint/parser': 5.58.0(eslint@8.29.0)(typescript@5.3.3) + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 5.58.0(eslint@8.55.0)(typescript@5.3.3) '@typescript-eslint/scope-manager': 5.58.0 - '@typescript-eslint/type-utils': 5.58.0(eslint@8.29.0)(typescript@5.3.3) - '@typescript-eslint/utils': 5.58.0(eslint@8.29.0)(typescript@5.3.3) + '@typescript-eslint/type-utils': 5.58.0(eslint@8.55.0)(typescript@5.3.3) + '@typescript-eslint/utils': 5.58.0(eslint@8.55.0)(typescript@5.3.3) debug: 4.3.4 - eslint: 8.29.0 + eslint: 8.55.0 grapheme-splitter: 1.0.4 ignore: 5.2.4 natural-compare-lite: 1.4.0 @@ -9197,14 +9274,43 @@ packages: - supports-color dev: false - /@typescript-eslint/experimental-utils@5.58.0(eslint@8.29.0)(typescript@5.3.3): + /@typescript-eslint/eslint-plugin@6.13.1(@typescript-eslint/parser@6.13.1)(eslint@8.55.0)(typescript@5.3.3): + resolution: {integrity: sha512-5bQDGkXaxD46bPvQt08BUz9YSaO4S0fB1LB5JHQuXTfkGPI3+UUeS387C/e9jRie5GqT8u5kFTrMvAjtX4O5kA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 6.13.1(eslint@8.55.0)(typescript@5.3.3) + '@typescript-eslint/scope-manager': 6.13.1 + '@typescript-eslint/type-utils': 6.13.1(eslint@8.55.0)(typescript@5.3.3) + '@typescript-eslint/utils': 6.13.1(eslint@8.55.0)(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.13.1 + debug: 4.3.4 + eslint: 8.55.0 + graphemer: 1.4.0 + ignore: 5.2.4 + natural-compare: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.2.1(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/experimental-utils@5.58.0(eslint@8.55.0)(typescript@5.3.3): resolution: {integrity: sha512-LA/sRPaynZlrlYxdefrZbMx8dqs/1Kc0yNG+XOk5CwwZx7tTv263ix3AJNioF0YBVt7hADpAUR20owl6pv4MIQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.58.0(eslint@8.29.0)(typescript@5.3.3) - eslint: 8.29.0 + '@typescript-eslint/utils': 5.58.0(eslint@8.55.0)(typescript@5.3.3) + eslint: 8.55.0 transitivePeerDependencies: - supports-color - typescript @@ -9249,6 +9355,47 @@ packages: transitivePeerDependencies: - supports-color + /@typescript-eslint/parser@5.58.0(eslint@8.55.0)(typescript@5.3.3): + resolution: {integrity: sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.58.0 + '@typescript-eslint/types': 5.58.0 + '@typescript-eslint/typescript-estree': 5.58.0(typescript@5.3.3) + debug: 4.3.4 + eslint: 8.55.0 + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/parser@6.13.1(eslint@8.55.0)(typescript@5.3.3): + resolution: {integrity: sha512-fs2XOhWCzRhqMmQf0eicLa/CWSaYss2feXsy7xBD/pLyWke/jCIVc2s1ikEAtSW7ina1HNhv7kONoEfVNEcdDQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 6.13.1 + '@typescript-eslint/types': 6.13.1 + '@typescript-eslint/typescript-estree': 6.13.1(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.13.1 + debug: 4.3.4 + eslint: 8.55.0 + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/scope-manager@5.58.0: resolution: {integrity: sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -9256,7 +9403,15 @@ packages: '@typescript-eslint/types': 5.58.0 '@typescript-eslint/visitor-keys': 5.58.0 - /@typescript-eslint/type-utils@5.58.0(eslint@8.29.0)(typescript@5.3.3): + /@typescript-eslint/scope-manager@6.13.1: + resolution: {integrity: sha512-BW0kJ7ceiKi56GbT2KKzZzN+nDxzQK2DS6x0PiSMPjciPgd/JRQGMibyaN2cPt2cAvuoH0oNvn2fwonHI+4QUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.13.1 + '@typescript-eslint/visitor-keys': 6.13.1 + dev: true + + /@typescript-eslint/type-utils@5.58.0(eslint@8.55.0)(typescript@5.3.3): resolution: {integrity: sha512-FF5vP/SKAFJ+LmR9PENql7fQVVgGDOS+dq3j+cKl9iW/9VuZC/8CFmzIP0DLKXfWKpRHawJiG70rVH+xZZbp8w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -9267,19 +9422,44 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 5.58.0(typescript@5.3.3) - '@typescript-eslint/utils': 5.58.0(eslint@8.29.0)(typescript@5.3.3) + '@typescript-eslint/utils': 5.58.0(eslint@8.55.0)(typescript@5.3.3) debug: 4.3.4 - eslint: 8.29.0 + eslint: 8.55.0 tsutils: 3.21.0(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: false + /@typescript-eslint/type-utils@6.13.1(eslint@8.55.0)(typescript@5.3.3): + resolution: {integrity: sha512-A2qPlgpxx2v//3meMqQyB1qqTg1h1dJvzca7TugM3Yc2USDY+fsRBiojAEo92HO7f5hW5mjAUF6qobOPzlBCBQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 6.13.1(typescript@5.3.3) + '@typescript-eslint/utils': 6.13.1(eslint@8.55.0)(typescript@5.3.3) + debug: 4.3.4 + eslint: 8.55.0 + ts-api-utils: 1.2.1(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/types@5.58.0: resolution: {integrity: sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/types@6.13.1: + resolution: {integrity: sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + /@typescript-eslint/typescript-estree@5.58.0(typescript@5.3.3): resolution: {integrity: sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -9300,19 +9480,40 @@ packages: transitivePeerDependencies: - supports-color - /@typescript-eslint/utils@5.58.0(eslint@8.29.0)(typescript@5.3.3): + /@typescript-eslint/typescript-estree@6.13.1(typescript@5.3.3): + resolution: {integrity: sha512-sBLQsvOC0Q7LGcUHO5qpG1HxRgePbT6wwqOiGLpR8uOJvPJbfs0mW3jPA3ujsDvfiVwVlWUDESNXv44KtINkUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.13.1 + '@typescript-eslint/visitor-keys': 6.13.1 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.2.1(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@5.58.0(eslint@8.55.0)(typescript@5.3.3): resolution: {integrity: sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.29.0) - '@types/json-schema': 7.0.11 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) + '@types/json-schema': 7.0.15 '@types/semver': 7.5.6 '@typescript-eslint/scope-manager': 5.58.0 '@typescript-eslint/types': 5.58.0 '@typescript-eslint/typescript-estree': 5.58.0(typescript@5.3.3) - eslint: 8.29.0 + eslint: 8.55.0 eslint-scope: 5.1.1 semver: 7.5.4 transitivePeerDependencies: @@ -9320,12 +9521,42 @@ packages: - typescript dev: false + /@typescript-eslint/utils@6.13.1(eslint@8.55.0)(typescript@5.3.3): + resolution: {integrity: sha512-ouPn/zVoan92JgAegesTXDB/oUp6BP1v8WpfYcqh649ejNc9Qv+B4FF2Ff626kO1xg0wWwwG48lAJ4JuesgdOw==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.6 + '@typescript-eslint/scope-manager': 6.13.1 + '@typescript-eslint/types': 6.13.1 + '@typescript-eslint/typescript-estree': 6.13.1(typescript@5.3.3) + eslint: 8.55.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /@typescript-eslint/visitor-keys@5.58.0: resolution: {integrity: sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: '@typescript-eslint/types': 5.58.0 - eslint-visitor-keys: 3.4.0 + eslint-visitor-keys: 3.4.3 + + /@typescript-eslint/visitor-keys@6.13.1: + resolution: {integrity: sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.13.1 + eslint-visitor-keys: 3.4.3 + dev: true + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} /@vercel/build-utils@7.2.1: resolution: {integrity: sha512-WCqSBCPNlANEOsmroCzCZq6ZxArV20RHBbdaZzhZjkGtEReSZx5BSOsrnkewFJFuu5pNGYegAaVi0VCkA1irZQ==} @@ -9408,7 +9639,7 @@ packages: dependencies: '@mapbox/node-pre-gyp': 1.0.10 '@rollup/pluginutils': 4.2.1 - acorn: 8.8.2 + acorn: 8.11.3 async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 @@ -9858,12 +10089,12 @@ packages: dependencies: acorn: 8.8.2 - /acorn-jsx@5.3.2(acorn@8.8.2): + /acorn-jsx@5.3.2(acorn@8.11.3): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.8.2 + acorn: 8.11.3 /acorn-walk@7.2.0: resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} @@ -9879,6 +10110,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + /acorn@8.8.2: resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} engines: {node: '>=0.4.0'} @@ -13394,7 +13630,16 @@ packages: - supports-color dev: true - /eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.29.0)(jest@27.5.1)(typescript@5.3.3): + /eslint-config-prettier@9.1.0(eslint@8.55.0): + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.55.0 + dev: true + + /eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.55.0)(jest@27.5.1)(typescript@5.3.3): resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -13405,20 +13650,20 @@ packages: optional: true dependencies: '@babel/core': 7.21.4 - '@babel/eslint-parser': 7.21.3(@babel/core@7.21.4)(eslint@8.29.0) + '@babel/eslint-parser': 7.21.3(@babel/core@7.21.4)(eslint@8.55.0) '@rushstack/eslint-patch': 1.2.0 - '@typescript-eslint/eslint-plugin': 5.58.0(@typescript-eslint/parser@5.58.0)(eslint@8.29.0)(typescript@5.3.3) - '@typescript-eslint/parser': 5.58.0(eslint@8.29.0)(typescript@5.3.3) + '@typescript-eslint/eslint-plugin': 5.58.0(@typescript-eslint/parser@5.58.0)(eslint@8.55.0)(typescript@5.3.3) + '@typescript-eslint/parser': 5.58.0(eslint@8.55.0)(typescript@5.3.3) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 - eslint: 8.29.0 - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.29.0) + eslint: 8.55.0 + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.55.0) eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.29.0) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.58.0)(eslint@8.29.0)(jest@27.5.1)(typescript@5.3.3) - eslint-plugin-jsx-a11y: 6.7.1(eslint@8.29.0) - eslint-plugin-react: 7.32.2(eslint@8.29.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.29.0) - eslint-plugin-testing-library: 5.10.2(eslint@8.29.0)(typescript@5.3.3) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.58.0)(eslint@8.55.0)(jest@27.5.1)(typescript@5.3.3) + eslint-plugin-jsx-a11y: 6.7.1(eslint@8.55.0) + eslint-plugin-react: 7.32.2(eslint@8.55.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.55.0) + eslint-plugin-testing-library: 5.10.2(eslint@8.55.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: - '@babel/plugin-syntax-flow' @@ -13538,7 +13783,7 @@ packages: - supports-color dev: true - /eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.29.0): + /eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.55.0): resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -13548,7 +13793,7 @@ packages: dependencies: '@babel/plugin-syntax-flow': 7.21.4(@babel/core@7.21.4) '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.21.4) - eslint: 8.29.0 + eslint: 8.55.0 lodash: 4.17.21 string-natural-compare: 3.0.1 dev: false @@ -13585,7 +13830,7 @@ packages: - eslint-import-resolver-webpack - supports-color - /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.58.0)(eslint@8.29.0)(jest@27.5.1)(typescript@5.3.3): + /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.58.0)(eslint@8.55.0)(jest@27.5.1)(typescript@5.3.3): resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} peerDependencies: @@ -13598,9 +13843,9 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.58.0(@typescript-eslint/parser@5.58.0)(eslint@8.29.0)(typescript@5.3.3) - '@typescript-eslint/experimental-utils': 5.58.0(eslint@8.29.0)(typescript@5.3.3) - eslint: 8.29.0 + '@typescript-eslint/eslint-plugin': 5.58.0(@typescript-eslint/parser@5.58.0)(eslint@8.55.0)(typescript@5.3.3) + '@typescript-eslint/experimental-utils': 5.58.0(eslint@8.55.0)(typescript@5.3.3) + eslint: 8.55.0 jest: 27.5.1(ts-node@10.8.2) transitivePeerDependencies: - supports-color @@ -13657,6 +13902,31 @@ packages: semver: 6.3.1 dev: false + /eslint-plugin-jsx-a11y@6.7.1(eslint@8.55.0): + resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + '@babel/runtime': 7.21.0 + aria-query: 5.1.3 + array-includes: 3.1.6 + array.prototype.flatmap: 1.3.1 + ast-types-flow: 0.0.7 + axe-core: 4.6.3 + axobject-query: 3.1.1 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 8.55.0 + has: 1.0.3 + jsx-ast-utils: 3.3.3 + language-tags: 1.0.5 + minimatch: 3.1.2 + object.entries: 1.1.6 + object.fromentries: 2.0.6 + semver: 6.3.1 + dev: false + /eslint-plugin-react-hooks@4.6.0(eslint@8.24.0): resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} @@ -13675,6 +13945,15 @@ packages: eslint: 8.29.0 dev: false + /eslint-plugin-react-hooks@4.6.0(eslint@8.55.0): + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 8.55.0 + dev: false + /eslint-plugin-react@7.32.2(eslint@8.24.0): resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} engines: {node: '>=4'} @@ -13723,14 +14002,38 @@ packages: string.prototype.matchall: 4.0.8 dev: false - /eslint-plugin-testing-library@5.10.2(eslint@8.29.0)(typescript@5.3.3): + /eslint-plugin-react@7.32.2(eslint@8.55.0): + resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.6 + array.prototype.flatmap: 1.3.1 + array.prototype.tosorted: 1.1.1 + doctrine: 2.1.0 + eslint: 8.55.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.3 + minimatch: 3.1.2 + object.entries: 1.1.6 + object.fromentries: 2.0.6 + object.hasown: 1.1.2 + object.values: 1.1.6 + prop-types: 15.8.1 + resolve: 2.0.0-next.4 + semver: 6.3.1 + string.prototype.matchall: 4.0.8 + dev: false + + /eslint-plugin-testing-library@5.10.2(eslint@8.55.0)(typescript@5.3.3): resolution: {integrity: sha512-f1DmDWcz5SDM+IpCkEX0lbFqrrTs8HRsEElzDEqN/EBI0hpRj8Cns5+IVANXswE8/LeybIJqPAOQIFu2j5Y5sw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} peerDependencies: eslint: ^7.5.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.58.0(eslint@8.29.0)(typescript@5.3.3) - eslint: 8.29.0 + '@typescript-eslint/utils': 5.58.0(eslint@8.55.0)(typescript@5.3.3) + eslint: 8.55.0 transitivePeerDependencies: - supports-color - typescript @@ -13769,6 +14072,13 @@ packages: esrecurse: 4.3.0 estraverse: 5.3.0 + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + /eslint-utils@3.0.0(eslint@8.24.0): resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} @@ -13796,7 +14106,11 @@ packages: resolution: {integrity: sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /eslint-webpack-plugin@3.2.0(eslint@8.29.0)(webpack@5.88.2): + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + /eslint-webpack-plugin@3.2.0(eslint@8.55.0)(webpack@5.88.2): resolution: {integrity: sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -13804,7 +14118,7 @@ packages: webpack: ^5.0.0 dependencies: '@types/eslint': 8.37.0 - eslint: 8.29.0 + eslint: 8.55.0 jest-worker: 28.1.3 micromatch: 4.0.5 normalize-path: 3.0.0 @@ -13907,13 +14221,67 @@ packages: transitivePeerDependencies: - supports-color + /eslint@8.55.0: + resolution: {integrity: sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.55.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.20.0 + graphemer: 1.4.0 + ignore: 5.2.4 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + /espree@9.5.1: resolution: {integrity: sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.8.2 - acorn-jsx: 5.3.2(acorn@8.8.2) - eslint-visitor-keys: 3.4.0 + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 3.4.3 + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 3.4.3 /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} @@ -14461,7 +14829,7 @@ packages: dependencies: is-callable: 1.2.7 - /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.29.0)(typescript@5.3.3)(webpack@5.88.2): + /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.55.0)(typescript@5.3.3)(webpack@5.88.2): resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} engines: {node: '>=10', yarn: '>=1.0.0'} peerDependencies: @@ -14476,12 +14844,12 @@ packages: optional: true dependencies: '@babel/code-frame': 7.22.13 - '@types/json-schema': 7.0.11 + '@types/json-schema': 7.0.15 chalk: 4.1.2 chokidar: 3.5.3 cosmiconfig: 6.0.0 deepmerge: 4.3.1 - eslint: 8.29.0 + eslint: 8.55.0 fs-extra: 9.1.0 glob: 7.2.3 memfs: 3.5.0 @@ -15046,6 +15414,9 @@ packages: /grapheme-splitter@1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + /grouped-queue@2.0.0: resolution: {integrity: sha512-/PiFUa7WIsl48dUeCvhIHnwNmAAzlI/eHoJl0vu3nsFA366JleY7Ff8EVTplZu5kO0MIdZjKTTnzItL61ahbnw==} engines: {node: '>=8.0.0'} @@ -18068,7 +18439,7 @@ packages: optional: true dependencies: abab: 2.0.6 - acorn: 8.8.2 + acorn: 8.11.3 acorn-globals: 6.0.0 cssom: 0.4.4 cssstyle: 2.3.0 @@ -18145,7 +18516,7 @@ packages: /json-schema-to-ts@1.6.4: resolution: {integrity: sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA==} dependencies: - '@types/json-schema': 7.0.11 + '@types/json-schema': 7.0.15 ts-toolbelt: 6.15.5 dev: true @@ -20295,6 +20666,17 @@ packages: type-check: 0.4.0 word-wrap: 1.2.3 + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + /ora@5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} @@ -22226,7 +22608,7 @@ packages: dependencies: chalk: 4.1.2 escodegen: 1.14.3 - espree: 9.5.1 + espree: 9.6.1 estraverse: 5.3.0 glob: 8.1.0 jsdoc: 4.0.2 @@ -22971,7 +23353,7 @@ packages: pure-color: 1.3.0 dev: false - /react-dev-utils@12.0.1(eslint@8.29.0)(typescript@5.3.3)(webpack@5.88.2): + /react-dev-utils@12.0.1(eslint@8.55.0)(typescript@5.3.3)(webpack@5.88.2): resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} engines: {node: '>=14'} peerDependencies: @@ -22990,7 +23372,7 @@ packages: escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.29.0)(typescript@5.3.3)(webpack@5.88.2) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.55.0)(typescript@5.3.3)(webpack@5.88.2) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -23104,7 +23486,7 @@ packages: react: 18.2.0 dev: false - /react-scripts@5.0.1(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.29.0)(react@18.2.0)(ts-node@10.8.2)(typescript@5.3.3): + /react-scripts@5.0.1(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.55.0)(react@18.2.0)(ts-node@10.8.2)(typescript@5.3.3): resolution: {integrity: sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==} engines: {node: '>=14.0.0'} hasBin: true @@ -23131,9 +23513,9 @@ packages: css-minimizer-webpack-plugin: 3.4.1(webpack@5.88.2) dotenv: 10.0.0 dotenv-expand: 5.1.0 - eslint: 8.29.0 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.29.0)(jest@27.5.1)(typescript@5.3.3) - eslint-webpack-plugin: 3.2.0(eslint@8.29.0)(webpack@5.88.2) + eslint: 8.55.0 + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.55.0)(jest@27.5.1)(typescript@5.3.3) + eslint-webpack-plugin: 3.2.0(eslint@8.55.0)(webpack@5.88.2) file-loader: 6.2.0(webpack@5.88.2) fs-extra: 10.1.0 html-webpack-plugin: 5.5.0(webpack@5.88.2) @@ -23150,7 +23532,7 @@ packages: prompts: 2.4.2 react: 18.2.0 react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@8.29.0)(typescript@5.3.3)(webpack@5.88.2) + react-dev-utils: 12.0.1(eslint@8.55.0)(typescript@5.3.3)(webpack@5.88.2) react-refresh: 0.11.0 resolve: 1.22.2 resolve-url-loader: 4.0.0 @@ -23941,7 +24323,7 @@ packages: resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==} engines: {node: '>= 8.9.0'} dependencies: - '@types/json-schema': 7.0.11 + '@types/json-schema': 7.0.15 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) dev: false @@ -23950,7 +24332,7 @@ packages: resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} engines: {node: '>= 8.9.0'} dependencies: - '@types/json-schema': 7.0.11 + '@types/json-schema': 7.0.15 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) dev: false @@ -25136,7 +25518,7 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - acorn: 8.8.2 + acorn: 8.11.3 commander: 2.20.3 source-map: 0.6.1 source-map-support: 0.5.21 @@ -25362,6 +25744,15 @@ packages: resolution: {integrity: sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==} dev: false + /ts-api-utils@1.2.1(typescript@5.3.3): + resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.3.3 + dev: true + /ts-easing@0.2.0: resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==} dev: false @@ -25565,7 +25956,7 @@ packages: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 '@types/node': 14.18.33 - acorn: 8.8.2 + acorn: 8.11.3 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 diff --git a/services/rotor/package.json b/services/rotor/package.json index bef89aeb1..ccefc2d53 100644 --- a/services/rotor/package.json +++ b/services/rotor/package.json @@ -42,7 +42,9 @@ "pg-cursor": "~2.10.1", "prom-client": "^14.2.0", "tar": "^6.2.0", - "tslib": "^2.4.0" + "tslib": "^2.4.0", + "jsondiffpatch": "workspace:*", + "semver": "^7.5.4" }, "devDependencies": { "@babel/preset-env": "^7.23.2", diff --git a/services/rotor/src/http/functions.ts b/services/rotor/src/http/functions.ts index 36f076233..b2fd9f76b 100644 --- a/services/rotor/src/http/functions.ts +++ b/services/rotor/src/http/functions.ts @@ -6,9 +6,12 @@ import { rotorMessageHandler } from "../lib/message-handler"; import { CONNECTION_IDS_HEADER } from "../lib/rotor"; import { AnyEvent } from "@jitsu/protocols/functions"; import isEqual from "lodash/isEqual"; +import { parse as semverParse } from "semver"; +import * as jsondiffpatch from "jsondiffpatch"; import Prometheus from "prom-client"; +const jsondiffpatchInstance = jsondiffpatch.create(); const log = getLog("functions_handler"); const handlerMetric = new Prometheus.Counter({ @@ -54,7 +57,7 @@ export const FunctionsHandlerMulti = (metrics: Metrics, geoResolver?: GeoResolve handlerMetric.inc({ connectionId: id, status: "success" }, 1); }); const events = Object.fromEntries( - results.map(result => [result?.connectionId, mapTheSame(message, result?.events)]) + results.map(result => [result?.connectionId, mapDiff(message, result?.events)]) ); res.json(events); }) @@ -66,9 +69,34 @@ export const FunctionsHandlerMulti = (metrics: Metrics, geoResolver?: GeoResolve }); }; -function mapTheSame(message: IngestMessage, newEvents?: AnyEvent[]) { +function mapDiff(message: IngestMessage, newEvents?: AnyEvent[]) { if (!newEvents) { return []; } - return newEvents.map(e => (isEqual(message.httpPayload, e) ? "same" : e)); + + return newEvents.map(e => { + if (isEqual(message.httpPayload, e)) { + return "same"; + } + let supportsDiff = false; + const library = message.httpPayload?.context?.library; + if (library?.name === "@jitsu/js") { + const semver = semverParse(library.version); + if (semver && semver.major >= 2) { + supportsDiff = true; + } + } + if (!supportsDiff) { + return e; + } + + const originalSize = JSON.stringify(message.httpPayload).length; + const diff = jsondiffpatchInstance.diff(message.httpPayload, e); + const diffSize = JSON.stringify(diff).length; + if (diffSize > originalSize) { + return e; + } else { + return { __diff: diff }; + } + }); } From 3ec04af413cf230d55730e527a921a096fa44850 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 12 Feb 2024 11:42:55 +0400 Subject: [PATCH 0578/1353] formatting fix --- libs/jsondiffpatch/.eslintrc.cjs | 22 ++++++++-------------- libs/jsondiffpatch/jest.config.cjs | 14 +++++++------- libs/jsondiffpatch/src/contexts/context.ts | 4 ++-- libs/jsondiffpatch/src/contexts/patch.ts | 8 ++++---- libs/jsondiffpatch/src/filters/dates.ts | 10 ++++------ libs/jsondiffpatch/src/pipe.ts | 20 +++++++++----------- 6 files changed, 34 insertions(+), 44 deletions(-) diff --git a/libs/jsondiffpatch/.eslintrc.cjs b/libs/jsondiffpatch/.eslintrc.cjs index 4c3c57597..7a496e685 100644 --- a/libs/jsondiffpatch/.eslintrc.cjs +++ b/libs/jsondiffpatch/.eslintrc.cjs @@ -1,26 +1,20 @@ module.exports = { root: true, - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended-type-checked', - ], - plugins: ['@typescript-eslint'], - parser: '@typescript-eslint/parser', + extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended-type-checked"], + plugins: ["@typescript-eslint"], + parser: "@typescript-eslint/parser", parserOptions: { project: true, tsconfigRootDir: __dirname, }, overrides: [ { - files: ['test/**/*.ts'], - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended-type-checked', - ], - plugins: ['@typescript-eslint'], - parser: '@typescript-eslint/parser', + files: ["test/**/*.ts"], + extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended-type-checked"], + plugins: ["@typescript-eslint"], + parser: "@typescript-eslint/parser", parserOptions: { - project: './test/tsconfig.json', + project: "./test/tsconfig.json", tsconfigRootDir: __dirname, }, }, diff --git a/libs/jsondiffpatch/jest.config.cjs b/libs/jsondiffpatch/jest.config.cjs index da4c9cf49..8d9565ceb 100644 --- a/libs/jsondiffpatch/jest.config.cjs +++ b/libs/jsondiffpatch/jest.config.cjs @@ -1,16 +1,16 @@ /** @type {import('ts-jest').JestConfigWithTsJest} */ module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', - extensionsToTreatAsEsm: ['.ts'], + preset: "ts-jest", + testEnvironment: "node", + extensionsToTreatAsEsm: [".ts"], moduleNameMapper: { - '^(\\.{1,2}/.*)\\.js$': '$1', + "^(\\.{1,2}/.*)\\.js$": "$1", }, transform: { - '^.+\\.ts$': [ - 'ts-jest', + "^.+\\.ts$": [ + "ts-jest", { - tsconfig: 'test/tsconfig.json', + tsconfig: "test/tsconfig.json", useESM: true, }, ], diff --git a/libs/jsondiffpatch/src/contexts/context.ts b/libs/jsondiffpatch/src/contexts/context.ts index 5aab3ecf3..dbe394fdc 100644 --- a/libs/jsondiffpatch/src/contexts/context.ts +++ b/libs/jsondiffpatch/src/contexts/context.ts @@ -1,4 +1,4 @@ -import type { Options } from '../types.js'; +import type { Options } from "../types.js"; export default abstract class Context { abstract pipe: string; @@ -27,7 +27,7 @@ export default abstract class Context { push(child: this, name?: string | number) { child.parent = this; - if (typeof name !== 'undefined') { + if (typeof name !== "undefined") { child.childName = name; } child.root = this.root || this; diff --git a/libs/jsondiffpatch/src/contexts/patch.ts b/libs/jsondiffpatch/src/contexts/patch.ts index 8e96dec4c..a66c52012 100644 --- a/libs/jsondiffpatch/src/contexts/patch.ts +++ b/libs/jsondiffpatch/src/contexts/patch.ts @@ -1,10 +1,10 @@ -import Context from './context.js'; -import type { Delta } from '../types.js'; +import Context from "./context.js"; +import type { Delta } from "../types.js"; class PatchContext extends Context { left: unknown; delta: Delta; - pipe: 'patch'; + pipe: "patch"; nested?: boolean; @@ -12,7 +12,7 @@ class PatchContext extends Context { super(); this.left = left; this.delta = delta; - this.pipe = 'patch'; + this.pipe = "patch"; } } diff --git a/libs/jsondiffpatch/src/filters/dates.ts b/libs/jsondiffpatch/src/filters/dates.ts index 609037f5e..d697fa379 100644 --- a/libs/jsondiffpatch/src/filters/dates.ts +++ b/libs/jsondiffpatch/src/filters/dates.ts @@ -1,9 +1,7 @@ -import type { Filter } from '../types.js'; -import type DiffContext from '../contexts/diff.js'; +import type { Filter } from "../types.js"; +import type DiffContext from "../contexts/diff.js"; -export const diffFilter: Filter = function datesDiffFilter( - context, -) { +export const diffFilter: Filter = function datesDiffFilter(context) { if (context.left instanceof Date) { if (context.right instanceof Date) { if (context.left.getTime() !== context.right.getTime()) { @@ -19,4 +17,4 @@ export const diffFilter: Filter = function datesDiffFilter( context.setResult([context.left, context.right]).exit(); } }; -diffFilter.filterName = 'dates'; +diffFilter.filterName = "dates"; diff --git a/libs/jsondiffpatch/src/pipe.ts b/libs/jsondiffpatch/src/pipe.ts index 9987dbe71..83bd79c71 100644 --- a/libs/jsondiffpatch/src/pipe.ts +++ b/libs/jsondiffpatch/src/pipe.ts @@ -1,6 +1,6 @@ -import type Context from './contexts/context.js'; -import type Processor from './processor.js'; -import type { Filter } from './types.js'; +import type Context from "./contexts/context.js"; +import type Processor from "./processor.js"; +import type { Filter } from "./types.js"; // eslint-disable-next-line @typescript-eslint/no-explicit-any class Pipe> { @@ -17,7 +17,7 @@ class Pipe> { process(input: TContext) { if (!this.processor) { - throw new Error('add this pipe to a processor before using it'); + throw new Error("add this pipe to a processor before using it"); } const debug = this.debug; const length = this.filters.length; @@ -28,7 +28,7 @@ class Pipe> { this.log(`filter: ${filter.filterName}`); } filter(context); - if (typeof context === 'object' && context.exiting) { + if (typeof context === "object" && context.exiting) { context.exiting = false; break; } @@ -54,7 +54,7 @@ class Pipe> { indexOf(filterName: string) { if (!filterName) { - throw new Error('a filter name is required'); + throw new Error("a filter name is required"); } for (let index = 0; index < this.filters.length; index++) { const filter = this.filters[index]; @@ -66,7 +66,7 @@ class Pipe> { } list() { - return this.filters.map((f) => f.filterName); + return this.filters.map(f => f.filterName); } after(filterName: string, ...params: Filter[]) { @@ -106,12 +106,10 @@ class Pipe> { if (this.resultCheck) { return; } - this.resultCheck = (context) => { + this.resultCheck = context => { if (!context.hasResult) { console.log(context); - const error: Error & { noResult?: boolean } = new Error( - `${this.name} failed`, - ); + const error: Error & { noResult?: boolean } = new Error(`${this.name} failed`); error.noResult = true; throw error; } From 88751aad33cac106c9ffe0c606a1c3b00b521457 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 13 Feb 2024 15:32:19 +0400 Subject: [PATCH 0579/1353] rotor metrics: reduce granularity of active_incoming metrics to 'hour' mixpanel-destination: use utm properties from properties as a source of initial urm props. --- .../src/functions/mixpanel-destination.ts | 25 +++++++++++++---- services/rotor/src/lib/metrics.ts | 28 +++++++++++-------- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/libs/core-functions/src/functions/mixpanel-destination.ts b/libs/core-functions/src/functions/mixpanel-destination.ts index 5eb5f76b4..a76e1ff6c 100644 --- a/libs/core-functions/src/functions/mixpanel-destination.ts +++ b/libs/core-functions/src/functions/mixpanel-destination.ts @@ -1,6 +1,6 @@ import { FullContext, JitsuFunction } from "@jitsu/protocols/functions"; import { RetryError } from "@jitsu/functions-lib"; -import type { AnalyticsServerEvent, Geo } from "@jitsu/protocols/analytics"; +import type { AnalyticsContext, AnalyticsServerEvent, Geo } from "@jitsu/protocols/analytics"; import { randomId, hash } from "juava"; import { MixpanelCredentials } from "../meta"; import { eventTimeSafeMs } from "./lib"; @@ -28,16 +28,27 @@ export type HttpRequest = { headers?: Record; }; -function utm(param: Record, prefix: string = "utm_"): Record { +// Map and extracts campaign parameters from context.campaign into object with utm properties +function utmFromCampaign(param: Record, prefix: string = ""): Record { return Object.entries(param).reduce( (acc, [key, value]) => ({ ...acc, - [`${prefix}${key === "name" ? "campaign" : key}`]: value, + [`${prefix}utm_${key === "name" ? "campaign" : key}`]: value, }), {} ); } +// Extracts utm parameters from properties and returns them as a new object +function extractUtmParams(properties: Record, prefix: string = ""): Record { + return Object.entries(properties).reduce((acc, [key, value]) => { + if (key.startsWith("utm_")) { + acc[`${prefix}${key}`] = value; + } + return acc; + }, {}); +} + function evict(obj: Record, key: string) { const val = obj[key]; delete obj[key]; @@ -118,7 +129,7 @@ function trackEvent( delete traits.groupId; const customProperties = { - ...utm(analyticsContext.campaign || {}), + ...utmFromCampaign(analyticsContext.campaign || {}), ...(analyticsContext.page || {}), ...traits, ...(event.properties || {}), @@ -250,6 +261,10 @@ function setProfileMessage(ctx: FullContext, distinctId: string, event: Analytic }, ]; if (event.context?.page?.referrer || event.context?.page?.referring_domain) { + const utm = { + ...utmFromCampaign(event.context?.campaign || {}, "initial_"), + ...extractUtmParams(event.properties || {}, "initial_"), + }; reqs.push({ id: randomId(), url: "https://api.mixpanel.com/engage?verbose=1#profile-set-once", @@ -263,7 +278,7 @@ function setProfileMessage(ctx: FullContext, distinctId: string, event: Analytic $distinct_id: distinctId, $ip: event.context?.ip, $set_once: { - ...utm(event.context?.campaign || {}, "initial_utm_"), + ...utm, $initial_referrer: event.context?.page?.referrer, $initial_referring_domain: event.context?.page?.referring_domain, }, diff --git a/services/rotor/src/lib/metrics.ts b/services/rotor/src/lib/metrics.ts index a7e563fac..efedbf20f 100644 --- a/services/rotor/src/lib/metrics.ts +++ b/services/rotor/src/lib/metrics.ts @@ -12,7 +12,7 @@ export const log = getLog("metrics"); const bulkerBase = requireDefined(process.env.BULKER_URL, "env BULKER_URL is not defined"); const bulkerAuthKey = requireDefined(process.env.BULKER_AUTH_KEY, "env BULKER_AUTH_KEY is not defined"); const metricsDestinationId = process.env.METRICS_DESTINATION_ID; -const oldMetricsTable = "active_incoming"; +const billingMetricsTable = "active_incoming"; const metricsTable = "metrics"; const max_batch_size = 10000; @@ -20,7 +20,7 @@ const flush_interval_ms = 60000; type MetricsEvent = MetricsMeta & { functionId: string; - timestamp: string; + timestamp: Date; status: string; events: number; }; @@ -49,23 +49,27 @@ export function createMetrics(producer?: Producer): Metrics { })), }), producer.send({ - topic: `in.id.metrics.m.batch.t.${oldMetricsTable}`, + topic: `in.id.metrics.m.batch.t.${billingMetricsTable}`, compression: getCompressionType(), messages: buf .filter(m => m.functionId.startsWith("builtin.destination.") && m.status !== "dropped") - .map(m => ({ - value: JSON.stringify({ - timestamp: m.timestamp, - workspaceId: m.workspaceId, - messageId: m.messageId, - }), - })), + .map(m => { + const d = new Date(m.timestamp); + d.setMinutes(0); + return { + value: JSON.stringify({ + timestamp: d, + workspaceId: m.workspaceId, + messageId: m.messageId, + }), + }; + }), }), ]); } else { //create readable stream const streamOld = new Readable(); - const resOld = fetch(`${bulkerBase}/bulk/${metricsDestinationId}?tableName=${oldMetricsTable}&mode=batch`, { + const resOld = fetch(`${bulkerBase}/bulk/${metricsDestinationId}?tableName=${billingMetricsTable}&mode=batch`, { method: "POST", headers: { Authorization: `Bearer ${bulkerAuthKey}` }, body: streamOld, @@ -170,7 +174,7 @@ export function createMetrics(producer?: Producer): Metrics { return prefix + status; })(el); buffer.push({ - timestamp: d.toISOString(), + timestamp: d, ...omit(el.metricsMeta, "retries"), functionId: el.functionId, status, From c2ee61e69b494b5e62558f81f019ec5cf6678967 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 13 Feb 2024 17:05:14 +0400 Subject: [PATCH 0580/1353] console: new mv_active_incoming2 with partitions console: active-events switched to mv_active_incoming2 ee-api: workspace-stat switched to mv_active_incoming2 --- .../[workspaceId]/reports/active-events.ts | 2 +- webapps/console/prisma/metrics.sql | 20 +++++++++++++++++++ .../ee-api/pages/api/report/workspace-stat.ts | 2 +- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/webapps/console/pages/api/[workspaceId]/reports/active-events.ts b/webapps/console/pages/api/[workspaceId]/reports/active-events.ts index f1c410cff..f7dcedd93 100644 --- a/webapps/console/pages/api/[workspaceId]/reports/active-events.ts +++ b/webapps/console/pages/api/[workspaceId]/reports/active-events.ts @@ -40,7 +40,7 @@ export default createRoute() date_trunc({granularity:String}, timestamp) as period, uniqMerge(count) as "activeEvents", count(*) as "srcSize" - from ${metricsSchema}.mv_active_incoming + from ${metricsSchema}.mv_active_incoming2 where timestamp >= toDateTime({start:String}, 'UTC') and timestamp <= toDateTime({end:String}, 'UTC') and diff --git a/webapps/console/prisma/metrics.sql b/webapps/console/prisma/metrics.sql index a642e5939..6a2a8999b 100644 --- a/webapps/console/prisma/metrics.sql +++ b/webapps/console/prisma/metrics.sql @@ -7,6 +7,26 @@ create table newjitsu_metrics.active_incoming on cluster jitsu_cluster ) engine = Null; +CREATE MATERIALIZED VIEW newjitsu_metrics.mv_active_incoming2 on cluster jitsu_cluster + ( + `workspaceId` LowCardinality(String), + `timestamp` DateTime, + `count` AggregateFunction(uniq, String) + ) + ENGINE = ReplicatedAggregatingMergeTree('/clickhouse/tables/{shard}/newjitsu_metrics/mv_active_incoming2_0', + '{replica}') + ORDER BY (workspaceId, timestamp) + PARTITION BY toYYYYMM(timestamp) + SETTINGS index_granularity = 8192 +AS +SELECT + workspaceId, + timestamp, + uniqState(messageId) AS count +FROM newjitsu_metrics.active_incoming +GROUP BY + workspaceId, + timestamp; CREATE MATERIALIZED VIEW newjitsu_metrics.mv_active_incoming on cluster jitsu_cluster ( diff --git a/webapps/ee-api/pages/api/report/workspace-stat.ts b/webapps/ee-api/pages/api/report/workspace-stat.ts index c559ef105..c13673648 100644 --- a/webapps/ee-api/pages/api/report/workspace-stat.ts +++ b/webapps/ee-api/pages/api/report/workspace-stat.ts @@ -56,7 +56,7 @@ async function getClickhousePart({ date_trunc('${granularity}', timestamp) as period, workspaceId as "workspaceId", uniqMerge(count) as events - from ${metricsSchema}.mv_active_incoming + from ${metricsSchema}.mv_active_incoming2 where timestamp >= toDateTime('2023-07-28 00:00:00', 'UTC') and timestamp >= toDateTime({start :String}, 'UTC') and From 6bdddbeaf7252d50adc49a566e711b0ac31ece15 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Tue, 13 Feb 2024 12:47:34 -0500 Subject: [PATCH 0581/1353] cosmetic changes in admin pages, removed unused sql view generations --- libs/juava/src/rpc.ts | 3 +- .../components/GlobalError/GlobalError.tsx | 73 +++++++++++-------- webapps/console/lib/server/db.ts | 12 +++ webapps/console/lib/useApi.ts | 2 +- webapps/console/pages/_app.tsx | 6 +- webapps/console/pages/admin/workspaces.tsx | 11 ++- .../console/prisma/sql/01-export-views.sql | 61 ---------------- webapps/console/scripts/sql-exec.ts | 54 -------------- .../ee-api/pages/api/billing/workspaces.ts | 10 +++ .../ee-api/pages/api/report/workspace-stat.ts | 13 +++- 10 files changed, 93 insertions(+), 152 deletions(-) delete mode 100644 webapps/console/prisma/sql/01-export-views.sql delete mode 100644 webapps/console/scripts/sql-exec.ts diff --git a/libs/juava/src/rpc.ts b/libs/juava/src/rpc.ts index 36b794bb1..b75ad4a66 100644 --- a/libs/juava/src/rpc.ts +++ b/libs/juava/src/rpc.ts @@ -92,13 +92,14 @@ export const rpc: RpcFunc = async (url, { body, ...rest } = {}) => { const errorJson = tryJson(errorText); const defaultErrorMessage = `Error ${result.status} on ${method} ${url}`; console.error(defaultErrorMessage, errorJson); + //Try to extract meaningful error message from response. We don't need to include a full message since it will be visible //in the logs. On the other hand, error message could be displayed in UI const errorMessage = extractString(errorJson.message) || extractString(errorJson.error) || extractString(errorJson.error?.error) || - `${result.status} ${result.statusText} on ${url}`; //a 500 error without JSON message, propbably just html page + `${result.status} ${result.statusText}`; throw new ApiResponseError(errorMessage, typeof errorJson === "string" ? undefined : errorJson, { url: urlWithQuery, ...requestParams, diff --git a/webapps/console/components/GlobalError/GlobalError.tsx b/webapps/console/components/GlobalError/GlobalError.tsx index 24ded50f6..ff9312786 100644 --- a/webapps/console/components/GlobalError/GlobalError.tsx +++ b/webapps/console/components/GlobalError/GlobalError.tsx @@ -1,18 +1,18 @@ import React, { ErrorInfo, ReactNode } from "react"; -import { Expandable } from "../Expandable/Expandable"; import { CodeBlock } from "../CodeBlock/CodeBlock"; import { FaExclamationCircle } from "react-icons/fa"; import { Button, Collapse } from "antd"; -import { signOut } from "next-auth/react"; import { getErrorMessage, getLog } from "juava"; -import { firebaseSignOut } from "../../lib/firebase-client"; import { PropsWithChildrenClassname } from "../../lib/ui"; import { AlertCircle } from "lucide-react"; import classNames from "classnames"; +import { signOut } from "next-auth/react"; +import { firebaseSignOut } from "../../lib/firebase-client"; export type GlobalErrorProps = { error?: any; title?: string; + children?: ReactNode; hideActions?: boolean; }; @@ -100,7 +100,25 @@ function maxLen(str: string, maxLen = 200) { return str.length <= maxLen - 2 ? str : str.substring(0, maxLen) + "..."; } -export function ErrorCard(props: { error?: any; title?: string; hideActions?: boolean }) { +export function ErrorCard(props: { error?: any; title?: string; hideActions?: boolean; children?: ReactNode }) { + const title = props.title || (props.error ? maxLen(getErrorMessage(props.error), 60) : "Error"); + const description = ( + <> + {props.children || `We encountered an error processing your request`}. Please try refreshing the page, or logging + out and back in. If the problem persists, please contact support. + + ); + const [detailsVisible, setDetailsVisible] = React.useState(false); + const universalSignOut = async () => { + //we can't use current session here, since the error can be originated + //from auth layer. Try to logout using all methods + signOut().catch(err => { + log.atWarn().withCause(err).log(`Can't sign ut from next-auth`); + }); + firebaseSignOut().catch(err => { + log.atWarn().withCause(err).log(`Can't sign ut from next-auth`); + }); + }; return (
    - - {props.title || (props.error ? maxLen(getErrorMessage(props.error), 60) : "Error")} - {!props.hideActions && ( -
    +
    +
    +
    {description}
    + {!props.hideActions && ( +
    + - )} - {!props.hideActions && ( - - )} -
    + {props.error && ( + + )} +
    + )}
    - {props.error && ( + {props.error && detailsVisible && (
    - (exp ? "Hide Details" : "Show Details")}> - {(props.error?.stack || props.error?.message) && } - {typeof props.error === "string" && } - + {(props.error?.stack || props.error?.message) && } + {typeof props.error === "string" && }
    )}
    diff --git a/webapps/console/lib/server/db.ts b/webapps/console/lib/server/db.ts index baff3d05e..e68877860 100644 --- a/webapps/console/lib/server/db.ts +++ b/webapps/console/lib/server/db.ts @@ -84,6 +84,18 @@ export function createPg(): Pool { const connectionUrl = getApplicationDatabaseUrl(); const parsedUrl = new URL(connectionUrl); const schema = parsedUrl.searchParams.get("schema"); + if (schema !== "newjitsu") { + const tBorder = `┌─────────────────────────────────────────────────────────────────────┐`; + const bBorder = `└─────────────────────────────────────────────────────────────────────┘`; + const msg = [ + "\n", + tBorder, + `│ Jitsu requires to connect to the database with "newjitsu" schema`.padEnd(tBorder.length - 2, " ") + "│", + bBorder, + ].join("\n"); + log.atError().log(msg); + throw new Error(`Invalid schema ${schema} in database connection URL. Expected 'newjitsu' schema.`); + } const sslMode = parsedUrl.searchParams.get("sslmode") || ("disable" as PrismaSSLMode); if (sslMode === "require" || sslMode === "prefer") { throw new Error(`sslmode=${sslMode} is not supported`); diff --git a/webapps/console/lib/useApi.ts b/webapps/console/lib/useApi.ts index d624801ad..5fa98505e 100644 --- a/webapps/console/lib/useApi.ts +++ b/webapps/console/lib/useApi.ts @@ -123,7 +123,7 @@ export function useApi = } return zodParsed.data; }, - { retry: false, cacheTime: 0 } + { retry: false, cacheTime: 0, staleTime: 0 } ); return { ...queryResult, reload: () => setVersion(version + 1) }; } diff --git a/webapps/console/pages/_app.tsx b/webapps/console/pages/_app.tsx index e3d84ffec..70d9847ba 100644 --- a/webapps/console/pages/_app.tsx +++ b/webapps/console/pages/_app.tsx @@ -274,10 +274,12 @@ function AppLoader({ children, pageProps }: PropsWithChildren) { setOrigin(window.location.origin); }, []); - if (isLoading || !data || !origin) { + console.log("AppLoader", { data, isLoading, error }); + + if (isLoading || !origin) { return ; } else if (error) { - return ; + return ; } let originUrl; try { diff --git a/webapps/console/pages/admin/workspaces.tsx b/webapps/console/pages/admin/workspaces.tsx index 71634afe2..9666a571e 100644 --- a/webapps/console/pages/admin/workspaces.tsx +++ b/webapps/console/pages/admin/workspaces.tsx @@ -10,6 +10,7 @@ import hash from "stable-hash"; import { JsonAsTable } from "../../components/JsonAsTable/JsonAsTable"; import { useQuery } from "@tanstack/react-query"; import Link from "next/link"; + const View = ({ data }) => { const [rollup, setRollup] = useState(false); const router = useRouter(); @@ -68,7 +69,15 @@ const View = ({ data }) => { billing: { type: "custom", render: (val, row) => { - if (val?.renewAfterExpiration === true) { + if (val?.planId === "enterprise") { + return ( + +
    + ENTERPRISE +
    + + ); + } else if (val?.renewAfterExpiration === true) { return (
    diff --git a/webapps/console/prisma/sql/01-export-views.sql b/webapps/console/prisma/sql/01-export-views.sql deleted file mode 100644 index 983a0c63c..000000000 --- a/webapps/console/prisma/sql/01-export-views.sql +++ /dev/null @@ -1,61 +0,0 @@ -create or replace view newjitsu.enriched_connections as -select link.id as "id", - link.type as "type", - json_build_object('id', link.id, - 'workspaceId', ws.id, - 'destinationId', dst.id, - 'streamId', src.id, - 'usesBulker', link."data" ?& array ['mode', 'dataLayout'], - 'type', dst."config" ->> 'destinationType', - 'options', link.data, - 'updatedAt', to_char(link."updatedAt", 'YYYY-MM-DD"T"HH24:MI:SS"Z"'), - 'credentials', dst.config, - 'credentialsHash', md5(dst.config::text) - ) as "enrichedConnection" -from newjitsu."ConfigurationObjectLink" link - join newjitsu."Workspace" ws on link."workspaceId" = ws.id and ws.deleted = false - join newjitsu."ConfigurationObject" dst - on dst.id = link."toId" and dst.type = 'destination' and dst."workspaceId" = link."workspaceId" and - dst.deleted = false - join newjitsu."ConfigurationObject" src - on src.id = link."fromId" and src.type in ('stream', 'service') and - src."workspaceId" = link."workspaceId" and src.deleted = false -where link.deleted = false; - -create or replace view newjitsu.last_updated as select greatest( - (select max("updatedAt") from newjitsu."ConfigurationObjectLink"), - (select max("updatedAt") from newjitsu."ConfigurationObject"), - (select max("updatedAt") from newjitsu."Workspace") - ) as "last_updated"; - -create or replace view newjitsu.streams_with_destinations as -select b."streamId", - json_build_object('stream', b."srcConfig", - 'deleted', b."deleted", - 'backupEnabled', true, - 'destinations', b."connectionData", - 'updatedAt', to_char(b."updatedAt", 'YYYY-MM-DD"T"HH24:MI:SS"Z"')) -from (select src.id as "streamId", - ws.id, - src.deleted or ws.deleted as "deleted", - (src."config" || jsonb_build_object('id', src.id, 'workspaceId', ws.id)) as "srcConfig", - json_agg(case - when dst.id is not null and - dst.deleted = false and - link.id is not null and - link.deleted = false - then json_build_object('id', dst.id, - 'credentials', dst."config", - 'destinationType', dst."config" ->> 'destinationType', - 'connectionId', link."id", - 'options', link."data") - end) as "connectionData", - max(greatest(link."updatedAt", src."updatedAt", dst."updatedAt", ws."updatedAt")) as "updatedAt" - from newjitsu."ConfigurationObject" src - join newjitsu."Workspace" ws on src."workspaceId" = ws.id - left join newjitsu."ConfigurationObjectLink" link - on src.id = link."fromId" and link."workspaceId" = src."workspaceId" - left join newjitsu."ConfigurationObject" dst - on dst.id = link."toId" and dst.type = 'destination' and dst."workspaceId" = link."workspaceId" - where src."type" = 'stream' - group by 1, 2) b \ No newline at end of file diff --git a/webapps/console/scripts/sql-exec.ts b/webapps/console/scripts/sql-exec.ts deleted file mode 100644 index 117d0a93c..000000000 --- a/webapps/console/scripts/sql-exec.ts +++ /dev/null @@ -1,54 +0,0 @@ -/** - * This script is used during build time only. It compliments `prisma schema push` and should be run after it. - * - * It makes sure that certain objects, such as views and triggers, that cannot be defined in Prisma schema are created in the database. - * It does so by executing SQL scripts that are located in a directory provided as a first argument. - * - * It also relies on presence of DATABASE_URL environment variable (same as `prisma schema push`). - * NOTE: This as a copy of ee-api/scripts/sql-exec.ts, since ee-api and console doesn't have a common dependency where we - * can put this script. A little copy-paste is not a big deal! - * */ -import { Client } from "pg"; -import * as fs from "fs"; -import path from "path"; - -async function main() { - const _sqlDir = process.argv[2]; - if (!_sqlDir) { - throw new Error("SQL directory is not provided. It should be the first argument"); - } - const sqlDir = path.resolve(_sqlDir); - console.log(`Running SQL scripts from ${sqlDir}`); - - const dbUrl = process.env.DATABASE_URL; - if (!dbUrl) { - throw new Error("DATABASE_URL is not defined"); - } - const defaultSchema = new URL(dbUrl).searchParams.get("schema"); - const client = new Client({ - connectionString: dbUrl, - }); - await client.connect(); - console.log(`✅ Connected to SQL database`); - const files = fs.readdirSync(sqlDir); - for (const file of files) { - const fullPath = path.join(sqlDir, file); - const sql = fs.readFileSync(fullPath, "utf-8"); - process.stdout.write(`Running ${file}...`); - try { - await client.query(sql); - process.stdout.write(`\r✅ ${file} - DONE\n`); - } catch (e: any) { - process.stdout.write(`\r🔴 ${file} - ERROR\n`); - console.error(`Error executing SQL script from ${fullPath}: ${e?.message || "unknown error"}`, e); - process.exit(1); - } - } -} - -main() - .then(() => process.exit(0)) - .catch(e => { - console.error(`🔴Error executing SQL scripts: ${e?.message || "unknown error"}`, e); - process.exit(1); - }); diff --git a/webapps/ee-api/pages/api/billing/workspaces.ts b/webapps/ee-api/pages/api/billing/workspaces.ts index caa480488..9aef286af 100644 --- a/webapps/ee-api/pages/api/billing/workspaces.ts +++ b/webapps/ee-api/pages/api/billing/workspaces.ts @@ -57,6 +57,16 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse const result = Object.fromEntries( allWorkspaces .map(w => { + if (w.obj.customBilling) { + return [ + w.id, + { + planId: "enterprise", + planName: "enterprise", + pastDue: false, + }, + ]; + } const customerSubscriptions = subscriptions[w.obj.stripeCustomerId]; if (!customerSubscriptions) { return [w.id, undefined]; diff --git a/webapps/ee-api/pages/api/report/workspace-stat.ts b/webapps/ee-api/pages/api/report/workspace-stat.ts index c13673648..c28e2a2a6 100644 --- a/webapps/ee-api/pages/api/report/workspace-stat.ts +++ b/webapps/ee-api/pages/api/report/workspace-stat.ts @@ -9,6 +9,7 @@ import { listAllSubscriptions, stripe, stripeDataTable } from "../../../lib/stri import Stripe from "stripe"; import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; + dayjs.extend(utc); const log = getServerLog("/api/report"); @@ -155,7 +156,10 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse const start = getDate(req.query.start as string, minusDays(new Date(), 32).toISOString()).toISOString(); const end = getDate(req.query.end as string, new Date().toISOString()).toISOString(); const granularity = "day"; // = ((req.query.granularity as string) || "day").toLowerCase(); + const timer = Date.now(); + log.atInfo().log("Building workspace report"); const reportResult = await buildWorkspaceReport(start, end, granularity, workspaceId); + log.atInfo().log(`Workspace report built in ${Date.now() - timer}ms. Rows in result: ${reportResult.length}`); let records = extended ? await extend(reportResult) : reportResult; if (req.query.billing === "true") { const allWorkspaces = workspaceId @@ -184,8 +188,15 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse } const workspacePlans: Record = {}; + console.log(`All workspaces`, allWorkspaces); + for (const { id: workspaceId, obj } of allWorkspaces) { - const { stripeCustomerId } = obj; + const { stripeCustomerId, customBilling } = obj; + if (customBilling) { + workspacePlans[workspaceId] = "enterprise"; + continue; + } + const customerSubscriptions = subscriptions[stripeCustomerId]; if (!customerSubscriptions) { continue; From 165ac2634bd6c9252553e8f8debcb7c4b5cfe91c Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Tue, 13 Feb 2024 15:21:55 -0500 Subject: [PATCH 0582/1353] fix: remove deleted sql-exec script from package.json --- webapps/console/package.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/webapps/console/package.json b/webapps/console/package.json index 5aa63113a..4b751a42a 100644 --- a/webapps/console/package.json +++ b/webapps/console/package.json @@ -19,9 +19,8 @@ "compile": "tsc -p .", "tool:hash": "ts-node scripts/password-hash.ts", "db:code-gen": "prisma generate", - "db:post-update": "dotenv -e ../../.env.local -- ts-node ./scripts/sql-exec.ts ./prisma/sql", - "db:update-schema": "dotenv -e ../../.env.local -- prisma db push && pnpm run db:post-update", - "db:update-schema-force": "dotenv -e ../../.env.local -- prisma db push --accept-data-loss && pnpm run db:post-update" + "db:update-schema": "dotenv -e ../../.env.local -- prisma db push", + "db:update-schema-force": "dotenv -e ../../.env.local -- prisma db push --accept-data-loss" }, "dependencies": { "@ant-design/cssinjs": "^1.5.6", From 698b220248f6231ef8096555d12273e8917f51d3 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Tue, 13 Feb 2024 16:04:06 -0500 Subject: [PATCH 0583/1353] Update issue templates --- .github/ISSUE_TEMPLATE/issue-template.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/issue-template.md diff --git a/.github/ISSUE_TEMPLATE/issue-template.md b/.github/ISSUE_TEMPLATE/issue-template.md new file mode 100644 index 000000000..1cc152f7d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/issue-template.md @@ -0,0 +1,24 @@ +--- +name: Issue template +about: Template of an issue +title: '' +labels: '' +assignees: vklimontovich + +--- + +IMPORTANT: GitHub is for discussing issues of self-hosting Jitsu. Please make sure that your issue can be reproduced for self-hosting environment. If you're experiencing problem with your Jitsu Cloud account, please contact support@jitsu.com + +### Summary + + + +### System configuration and versions + + + +### Artifacts (logs, etc) + + From ebc5377e817265fa8073375a457338670179485c Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Tue, 13 Feb 2024 16:09:42 -0500 Subject: [PATCH 0584/1353] issue template updated --- .github/ISSUE_TEMPLATE/issue-template.md | 28 ++++++++++++++++-------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/issue-template.md b/.github/ISSUE_TEMPLATE/issue-template.md index 1cc152f7d..28533efd4 100644 --- a/.github/ISSUE_TEMPLATE/issue-template.md +++ b/.github/ISSUE_TEMPLATE/issue-template.md @@ -1,24 +1,34 @@ --- name: Issue template -about: Template of an issue +about: Template for creating issues, both bugs and feature requests title: '' labels: '' assignees: vklimontovich --- +``` +┌─────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ IMPORTANT: GitHub is for discussing issues of self-hosting Jitsu. Please make sure that your │ +│ issue can be reproduced for self-hosting environment. If you're experiencing problem with your │ +│ Jitsu Cloud account, please contact support@jitsu.com │ +└─────────────────────────────────────────────────────────────────────────────────────────────────┘ -IMPORTANT: GitHub is for discussing issues of self-hosting Jitsu. Please make sure that your issue can be reproduced for self-hosting environment. If you're experiencing problem with your Jitsu Cloud account, please contact support@jitsu.com +Please delete this block before submitting the issue +``` -### Summary +## Summary - + -### System configuration and versions +## System configuration and versions +Is it Jitsu Classic or Jitsu Next? What is the version of Docker images you're using? +--> -### Artifacts (logs, etc) +## Artifacts (logs, etc) - + From 7c570967a26dcf1bd70b8776766b3263c388cfdc Mon Sep 17 00:00:00 2001 From: zjalicflw <146714008+zjalicflw@users.noreply.github.com> Date: Wed, 14 Feb 2024 12:40:24 +0100 Subject: [PATCH 0585/1353] Remove redundant port in URL, formatting (#1088) --- docker/.env.example | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docker/.env.example b/docker/.env.example index dfb5e5519..ebd3105b2 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -12,10 +12,9 @@ SEED_USER_PASSWORD=changeme # Domain name of your Jitsu server where events will be sent. E.g. https://jitsu.mycompany.com or http://localhost:8080 JITSU_INGEST_PUBLIC_URL=http://localhost:8080 -# Public URL of your Jitsu UI. E.g. https://jitsu.mycompany.com:3000 or http://localhost:3000 +# Public URL of your Jitsu UI. E.g. https://jitsu.mycompany.com or http://localhost:3000 JITSU_PUBLIC_URL=http://localhost:3000 - #### Secrets ### # It is highly recommended to generate random values for those variables. # You can use `openssl rand -hex 32` to generate random values. @@ -37,7 +36,6 @@ JITSU_INGEST_PORT=8080 GITHUB_CLIENT_ID= GITHUB_CLIENT_SECRET= - #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # Connectors specific #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -60,4 +58,4 @@ SYNCCTL_KUBERNETES_CONTEXT= # google service account key GOOGLE_SCHEDULER_KEY= # for Google Ads connector -GOOGLE_ADS_DEVELOPER_TOKEN= \ No newline at end of file +GOOGLE_ADS_DEVELOPER_TOKEN= From d26fc7b4d874fe7bd016cc6bd2f8dbbd3d5ac857 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Sat, 17 Feb 2024 19:47:30 +0400 Subject: [PATCH 0586/1353] console: domain-check: use ingmgr for all domains --- .../pages/api/[workspaceId]/domain-check.ts | 38 +++++++++---------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/webapps/console/pages/api/[workspaceId]/domain-check.ts b/webapps/console/pages/api/[workspaceId]/domain-check.ts index 42e020a58..1a8505a31 100644 --- a/webapps/console/pages/api/[workspaceId]/domain-check.ts +++ b/webapps/console/pages/api/[workspaceId]/domain-check.ts @@ -42,29 +42,25 @@ export default createRoute() log.atWarn().log(`Domain ${domain} is not valid`); return { ok: false, reason: "requires_cname_configuration", cnameValue: customDomainCnames[0] }; } - //TODO: remove condition after migration complete - if (cname === "cname2.jitsu.com") { - try { - const ingressStatus = await checkOrAddToIngress(domain); - log.atInfo().log(`Ingress status for ${domain}: ${JSON.stringify(ingressStatus)}`); - if (!ingressStatus) { - log.atWarn().log(`Incorrect ingress status ${domain} is not valid`); - return { ok: false, reason: "internal_error" }; - } - if (ingressStatus.status === "ok") { - return { ok: true }; - } else if (ingressStatus.status === "pending_ssl") { - return { ok: false, reason: "pending_ssl" }; - } else if (ingressStatus.status === "dns_error") { - return { ok: false, reason: "requires_cname_configuration", cnameValue: customDomainCnames[0] }; - } else { - return { ok: false, reason: "internal_error" }; - } - } catch (e) { - log.atError().withCause(e).log(`Error checking ingress status for ${domain}`); + try { + const ingressStatus = await checkOrAddToIngress(domain); + log.atInfo().log(`Ingress status for ${domain}: ${JSON.stringify(ingressStatus)}`); + if (!ingressStatus) { + log.atWarn().log(`Incorrect ingress status ${domain} is not valid`); return { ok: false, reason: "internal_error" }; } + if (ingressStatus.status === "ok") { + return { ok: true }; + } else if (ingressStatus.status === "pending_ssl") { + return { ok: false, reason: "pending_ssl" }; + } else if (ingressStatus.status === "dns_error") { + return { ok: false, reason: "requires_cname_configuration", cnameValue: customDomainCnames[0] }; + } else { + return { ok: false, reason: "internal_error" }; + } + } catch (e) { + log.atError().withCause(e).log(`Error checking ingress status for ${domain}`); + return { ok: false, reason: "internal_error" }; } - return { ok: true }; }) .toNextApiHandler(); From efb9b2c0cd90a9dd2c355b5850af5123f34bb06e Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Mon, 19 Feb 2024 14:47:35 -0500 Subject: [PATCH 0587/1353] telemetry fixes --- libs/jitsu-js/src/analytics-plugin.ts | 12 +++++++ libs/jitsu-js/src/jitsu.ts | 5 +++ webapps/console/lib/server/telemetry.ts | 35 +++++++++++-------- .../api/[workspaceId]/config/[type]/index.ts | 2 +- webapps/console/pages/api/ping.ts | 5 +-- .../workspace/[workspaceIdOrSlug]/index.ts | 4 ++- 6 files changed, 45 insertions(+), 18 deletions(-) diff --git a/libs/jitsu-js/src/analytics-plugin.ts b/libs/jitsu-js/src/analytics-plugin.ts index 8bbd3f194..203c59cbd 100644 --- a/libs/jitsu-js/src/analytics-plugin.ts +++ b/libs/jitsu-js/src/analytics-plugin.ts @@ -10,6 +10,7 @@ import { internalDestinationPlugins } from "./destination-plugins"; import { jitsuLibraryName, jitsuVersion } from "./version"; import { getTopLevelDomain } from "./tlds"; import * as jsondiffpatch from "jsondiffpatch"; + const diff = jsondiffpatch.create(); const defaultConfig: Required = { @@ -22,6 +23,7 @@ const defaultConfig: Required = { echoEvents: false, cookieDomain: undefined, runtime: undefined, + fetchTimeoutMs: undefined, s2s: undefined, }; @@ -546,6 +548,12 @@ async function send( // console.log(`[JITSU] Sending event to ${url}: `, JSON.stringify(payload, null, 2)); // } const adjustedPayload = adjustPayload(payload, jitsuConfig, store, s2s); + const abortController = jitsuConfig.fetchTimeoutMs ? new AbortController() : undefined; + const abortTimeout = + jitsuConfig.fetchTimeoutMs ? + setTimeout(() => { + abortController.abort(); + }, jitsuConfig.fetchTimeoutMs) : undefined; const authHeader = jitsuConfig.writeKey ? { "X-Write-Key": jitsuConfig.writeKey } : {}; let fetchResult; @@ -559,7 +567,11 @@ async function send( ...debugHeader, }, body: JSON.stringify(adjustedPayload), + signal: abortController?.signal, }); + if (abortTimeout) { + clearTimeout(abortTimeout); + } } catch (e: any) { throw new Error(`Calling ${url} failed: ${e.message}`); } diff --git a/libs/jitsu-js/src/jitsu.ts b/libs/jitsu-js/src/jitsu.ts index 3e4a77b1d..4565c4c54 100644 --- a/libs/jitsu-js/src/jitsu.ts +++ b/libs/jitsu-js/src/jitsu.ts @@ -45,6 +45,11 @@ type JitsuOptions = { * If not set at all, it will be detected automatically by presence of `window` object */ s2s?: boolean; + + /** + * Timeout for fetch requests. Default value: 5000 + */ + fetchTimeoutMs?: number; }; type PersistentStorage = { diff --git a/webapps/console/lib/server/telemetry.ts b/webapps/console/lib/server/telemetry.ts index 6e4ffd1d3..0ec317af6 100644 --- a/webapps/console/lib/server/telemetry.ts +++ b/webapps/console/lib/server/telemetry.ts @@ -30,6 +30,7 @@ const anonymousTelemetry = anonymousTelemetryEnabled ? jitsuAnalytics({ host: "https://ingest.g.jitsu.com", writeKey: anonymousTelemetryJitsuKey, + debug: true, }) : emptyAnalytics; @@ -39,7 +40,8 @@ function createAnalytics() { host: productTelemetryHost, writeKey: productTelemetryBackendKey, s2s: true, - //debug: true, + fetchTimeoutMs: 1000, +// debug: true, }) : emptyAnalytics; } @@ -144,28 +146,33 @@ export function withProductAnalytics( return Promise.all(allPromises); } -let deploymentId = "unknown"; +let deploymentId: string | undefined = undefined -export async function initTelemetry(): Promise<{ deploymentId: string }> { +export async function initTelemetry(): Promise<{ deploymentId: string } | undefined> { if (anonymousTelemetryEnabled) { - try { - const instanceIdVal = await db.prisma().globalProps.findFirst({ where: { name: "deploymentId" } }); - if (instanceIdVal) { - deploymentId = (instanceIdVal.value as any).id; - } else { - deploymentId = randomId(); - log.atInfo().log("Initializing telemetry with deploymentId: " + deploymentId); - await db.prisma().globalProps.create({ data: { name: "deploymentId", value: { id: deploymentId } } }); + if (!deploymentId) { + try { + const instanceIdVal = await db.prisma().globalProps.findFirst({ where: { name: "deploymentId" } }); + if (instanceIdVal) { + deploymentId = (instanceIdVal.value as any).id; + log.atInfo().log(`Deployment id is going to be used for telemetry: ${deploymentId}`); + } else { + deploymentId = randomId(); + log.atInfo().log(`Creating new deployment id ${deploymentId}`); + await db.prisma().globalProps.create({ data: { name: "deploymentId", value: { id: deploymentId } } }); + await trackTelemetryEvent("deployment_created") + } + } catch (e) { + log.atWarn().withCause(e).log("Failed to initialize telemetry"); } - } catch (e) { - log.atWarn().withCause(e).log("Failed to initialize telemetry"); } } - return { deploymentId }; + return deploymentId ? { deploymentId } : undefined; } export async function trackTelemetryEvent(event: string, props: any = {}): Promise { try { + anonymousTelemetry.setAnonymousId(deploymentId || "unknown"); const result = await anonymousTelemetry.track(`console.${event}`, { ...props, deploymentId, diff --git a/webapps/console/pages/api/[workspaceId]/config/[type]/index.ts b/webapps/console/pages/api/[workspaceId]/config/[type]/index.ts index 0a66d6d07..f70711047 100644 --- a/webapps/console/pages/api/[workspaceId]/config/[type]/index.ts +++ b/webapps/console/pages/api/[workspaceId]/config/[type]/index.ts @@ -62,7 +62,7 @@ export const api: Api = { const created = await db.prisma().configurationObject.create({ data: { id, workspaceId: workspaceId, config: object, type }, }); - await trackTelemetryEvent("config-object-delete", { objectType: type }); + await trackTelemetryEvent("config-object-create", { objectType: type }); await withProductAnalytics( p => p.track("create_object", { diff --git a/webapps/console/pages/api/ping.ts b/webapps/console/pages/api/ping.ts index 4672ef5a2..6cb5210f1 100644 --- a/webapps/console/pages/api/ping.ts +++ b/webapps/console/pages/api/ping.ts @@ -4,11 +4,12 @@ import { initTelemetry, trackTelemetryEvent } from "../../lib/server/telemetry"; export default createRoute() .GET({ auth: false }) .handler(async ({ user }) => { - const { deploymentId } = await initTelemetry(); + const telemetry = await initTelemetry(); await trackTelemetryEvent("ping"); return { health: "ok", - deploymentId, + telemetryEnabled: !!telemetry, + deploymentId: telemetry?.deploymentId, }; }) .toNextApiHandler(); diff --git a/webapps/console/pages/api/workspace/[workspaceIdOrSlug]/index.ts b/webapps/console/pages/api/workspace/[workspaceIdOrSlug]/index.ts index 5b6e0aa9c..2a8d767e3 100644 --- a/webapps/console/pages/api/workspace/[workspaceIdOrSlug]/index.ts +++ b/webapps/console/pages/api/workspace/[workspaceIdOrSlug]/index.ts @@ -5,7 +5,7 @@ import { ApiError } from "../../../../lib/shared/errors"; import { getUserPreferenceService } from "../../../../lib/server/user-preferences"; import { getServerLog } from "../../../../lib/server/log"; import { SessionUser } from "../../../../lib/schema"; -import { withProductAnalytics } from "../../../../lib/server/telemetry"; +import { initTelemetry, withProductAnalytics } from "../../../../lib/server/telemetry"; const log = getServerLog(); @@ -38,6 +38,8 @@ export const api: Api = { auth: true, types: { query: z.object({ workspaceIdOrSlug: z.string() }) }, handle: async ({ req, query: { workspaceIdOrSlug }, user }) => { + //we need to initialize telemetry to get deploymentId for old deployments. Not an optimal solution, because of additional query. But guarantees to work + await initTelemetry(); const workspace = await db .prisma() .workspace.findFirst({ where: { OR: [{ id: workspaceIdOrSlug }, { slug: workspaceIdOrSlug }] } }); From 60784493a8eed606ff114dfcdb69906ba9d38a17 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Mon, 19 Feb 2024 14:47:35 -0500 Subject: [PATCH 0588/1353] telemetry fixes --- libs/jitsu-js/src/analytics-plugin.ts | 12 +++++++ libs/jitsu-js/src/jitsu.ts | 5 +++ webapps/console/lib/server/telemetry.ts | 35 +++++++++++-------- .../api/[workspaceId]/config/[type]/index.ts | 2 +- webapps/console/pages/api/ping.ts | 5 +-- .../workspace/[workspaceIdOrSlug]/index.ts | 4 ++- 6 files changed, 45 insertions(+), 18 deletions(-) diff --git a/libs/jitsu-js/src/analytics-plugin.ts b/libs/jitsu-js/src/analytics-plugin.ts index 8bbd3f194..203c59cbd 100644 --- a/libs/jitsu-js/src/analytics-plugin.ts +++ b/libs/jitsu-js/src/analytics-plugin.ts @@ -10,6 +10,7 @@ import { internalDestinationPlugins } from "./destination-plugins"; import { jitsuLibraryName, jitsuVersion } from "./version"; import { getTopLevelDomain } from "./tlds"; import * as jsondiffpatch from "jsondiffpatch"; + const diff = jsondiffpatch.create(); const defaultConfig: Required = { @@ -22,6 +23,7 @@ const defaultConfig: Required = { echoEvents: false, cookieDomain: undefined, runtime: undefined, + fetchTimeoutMs: undefined, s2s: undefined, }; @@ -546,6 +548,12 @@ async function send( // console.log(`[JITSU] Sending event to ${url}: `, JSON.stringify(payload, null, 2)); // } const adjustedPayload = adjustPayload(payload, jitsuConfig, store, s2s); + const abortController = jitsuConfig.fetchTimeoutMs ? new AbortController() : undefined; + const abortTimeout = + jitsuConfig.fetchTimeoutMs ? + setTimeout(() => { + abortController.abort(); + }, jitsuConfig.fetchTimeoutMs) : undefined; const authHeader = jitsuConfig.writeKey ? { "X-Write-Key": jitsuConfig.writeKey } : {}; let fetchResult; @@ -559,7 +567,11 @@ async function send( ...debugHeader, }, body: JSON.stringify(adjustedPayload), + signal: abortController?.signal, }); + if (abortTimeout) { + clearTimeout(abortTimeout); + } } catch (e: any) { throw new Error(`Calling ${url} failed: ${e.message}`); } diff --git a/libs/jitsu-js/src/jitsu.ts b/libs/jitsu-js/src/jitsu.ts index 3e4a77b1d..4565c4c54 100644 --- a/libs/jitsu-js/src/jitsu.ts +++ b/libs/jitsu-js/src/jitsu.ts @@ -45,6 +45,11 @@ type JitsuOptions = { * If not set at all, it will be detected automatically by presence of `window` object */ s2s?: boolean; + + /** + * Timeout for fetch requests. Default value: 5000 + */ + fetchTimeoutMs?: number; }; type PersistentStorage = { diff --git a/webapps/console/lib/server/telemetry.ts b/webapps/console/lib/server/telemetry.ts index 6e4ffd1d3..72fed4676 100644 --- a/webapps/console/lib/server/telemetry.ts +++ b/webapps/console/lib/server/telemetry.ts @@ -30,6 +30,7 @@ const anonymousTelemetry = anonymousTelemetryEnabled ? jitsuAnalytics({ host: "https://ingest.g.jitsu.com", writeKey: anonymousTelemetryJitsuKey, + //debug: true, }) : emptyAnalytics; @@ -39,7 +40,8 @@ function createAnalytics() { host: productTelemetryHost, writeKey: productTelemetryBackendKey, s2s: true, - //debug: true, + fetchTimeoutMs: 1000, +// debug: true, }) : emptyAnalytics; } @@ -144,28 +146,33 @@ export function withProductAnalytics( return Promise.all(allPromises); } -let deploymentId = "unknown"; +let deploymentId: string | undefined = undefined -export async function initTelemetry(): Promise<{ deploymentId: string }> { +export async function initTelemetry(): Promise<{ deploymentId: string } | undefined> { if (anonymousTelemetryEnabled) { - try { - const instanceIdVal = await db.prisma().globalProps.findFirst({ where: { name: "deploymentId" } }); - if (instanceIdVal) { - deploymentId = (instanceIdVal.value as any).id; - } else { - deploymentId = randomId(); - log.atInfo().log("Initializing telemetry with deploymentId: " + deploymentId); - await db.prisma().globalProps.create({ data: { name: "deploymentId", value: { id: deploymentId } } }); + if (!deploymentId) { + try { + const instanceIdVal = await db.prisma().globalProps.findFirst({ where: { name: "deploymentId" } }); + if (instanceIdVal) { + deploymentId = (instanceIdVal.value as any).id; + log.atInfo().log(`Deployment id is going to be used for telemetry: ${deploymentId}`); + } else { + deploymentId = randomId(); + log.atInfo().log(`Creating new deployment id ${deploymentId}`); + await db.prisma().globalProps.create({ data: { name: "deploymentId", value: { id: deploymentId } } }); + await trackTelemetryEvent("deployment_created") + } + } catch (e) { + log.atWarn().withCause(e).log("Failed to initialize telemetry"); } - } catch (e) { - log.atWarn().withCause(e).log("Failed to initialize telemetry"); } } - return { deploymentId }; + return deploymentId ? { deploymentId } : undefined; } export async function trackTelemetryEvent(event: string, props: any = {}): Promise { try { + anonymousTelemetry.setAnonymousId(deploymentId || "unknown"); const result = await anonymousTelemetry.track(`console.${event}`, { ...props, deploymentId, diff --git a/webapps/console/pages/api/[workspaceId]/config/[type]/index.ts b/webapps/console/pages/api/[workspaceId]/config/[type]/index.ts index 0a66d6d07..f70711047 100644 --- a/webapps/console/pages/api/[workspaceId]/config/[type]/index.ts +++ b/webapps/console/pages/api/[workspaceId]/config/[type]/index.ts @@ -62,7 +62,7 @@ export const api: Api = { const created = await db.prisma().configurationObject.create({ data: { id, workspaceId: workspaceId, config: object, type }, }); - await trackTelemetryEvent("config-object-delete", { objectType: type }); + await trackTelemetryEvent("config-object-create", { objectType: type }); await withProductAnalytics( p => p.track("create_object", { diff --git a/webapps/console/pages/api/ping.ts b/webapps/console/pages/api/ping.ts index 4672ef5a2..6cb5210f1 100644 --- a/webapps/console/pages/api/ping.ts +++ b/webapps/console/pages/api/ping.ts @@ -4,11 +4,12 @@ import { initTelemetry, trackTelemetryEvent } from "../../lib/server/telemetry"; export default createRoute() .GET({ auth: false }) .handler(async ({ user }) => { - const { deploymentId } = await initTelemetry(); + const telemetry = await initTelemetry(); await trackTelemetryEvent("ping"); return { health: "ok", - deploymentId, + telemetryEnabled: !!telemetry, + deploymentId: telemetry?.deploymentId, }; }) .toNextApiHandler(); diff --git a/webapps/console/pages/api/workspace/[workspaceIdOrSlug]/index.ts b/webapps/console/pages/api/workspace/[workspaceIdOrSlug]/index.ts index 5b6e0aa9c..2a8d767e3 100644 --- a/webapps/console/pages/api/workspace/[workspaceIdOrSlug]/index.ts +++ b/webapps/console/pages/api/workspace/[workspaceIdOrSlug]/index.ts @@ -5,7 +5,7 @@ import { ApiError } from "../../../../lib/shared/errors"; import { getUserPreferenceService } from "../../../../lib/server/user-preferences"; import { getServerLog } from "../../../../lib/server/log"; import { SessionUser } from "../../../../lib/schema"; -import { withProductAnalytics } from "../../../../lib/server/telemetry"; +import { initTelemetry, withProductAnalytics } from "../../../../lib/server/telemetry"; const log = getServerLog(); @@ -38,6 +38,8 @@ export const api: Api = { auth: true, types: { query: z.object({ workspaceIdOrSlug: z.string() }) }, handle: async ({ req, query: { workspaceIdOrSlug }, user }) => { + //we need to initialize telemetry to get deploymentId for old deployments. Not an optimal solution, because of additional query. But guarantees to work + await initTelemetry(); const workspace = await db .prisma() .workspace.findFirst({ where: { OR: [{ id: workspaceIdOrSlug }, { slug: workspaceIdOrSlug }] } }); From 79cc7c3f92922f333e1df9006de62ecd664308f3 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Mon, 19 Feb 2024 14:50:43 -0500 Subject: [PATCH 0589/1353] prettier --- libs/jitsu-js/src/analytics-plugin.ts | 10 +++++----- webapps/console/lib/server/telemetry.ts | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/libs/jitsu-js/src/analytics-plugin.ts b/libs/jitsu-js/src/analytics-plugin.ts index 203c59cbd..b8333b992 100644 --- a/libs/jitsu-js/src/analytics-plugin.ts +++ b/libs/jitsu-js/src/analytics-plugin.ts @@ -549,11 +549,11 @@ async function send( // } const adjustedPayload = adjustPayload(payload, jitsuConfig, store, s2s); const abortController = jitsuConfig.fetchTimeoutMs ? new AbortController() : undefined; - const abortTimeout = - jitsuConfig.fetchTimeoutMs ? - setTimeout(() => { - abortController.abort(); - }, jitsuConfig.fetchTimeoutMs) : undefined; + const abortTimeout = jitsuConfig.fetchTimeoutMs + ? setTimeout(() => { + abortController.abort(); + }, jitsuConfig.fetchTimeoutMs) + : undefined; const authHeader = jitsuConfig.writeKey ? { "X-Write-Key": jitsuConfig.writeKey } : {}; let fetchResult; diff --git a/webapps/console/lib/server/telemetry.ts b/webapps/console/lib/server/telemetry.ts index 72fed4676..db201b55b 100644 --- a/webapps/console/lib/server/telemetry.ts +++ b/webapps/console/lib/server/telemetry.ts @@ -41,7 +41,7 @@ function createAnalytics() { writeKey: productTelemetryBackendKey, s2s: true, fetchTimeoutMs: 1000, -// debug: true, + // debug: true, }) : emptyAnalytics; } @@ -146,7 +146,7 @@ export function withProductAnalytics( return Promise.all(allPromises); } -let deploymentId: string | undefined = undefined +let deploymentId: string | undefined = undefined; export async function initTelemetry(): Promise<{ deploymentId: string } | undefined> { if (anonymousTelemetryEnabled) { @@ -160,7 +160,7 @@ export async function initTelemetry(): Promise<{ deploymentId: string } | undefi deploymentId = randomId(); log.atInfo().log(`Creating new deployment id ${deploymentId}`); await db.prisma().globalProps.create({ data: { name: "deploymentId", value: { id: deploymentId } } }); - await trackTelemetryEvent("deployment_created") + await trackTelemetryEvent("deployment_created"); } } catch (e) { log.atWarn().withCause(e).log("Failed to initialize telemetry"); From b11726ca69eb0524fae7685cd9dd80d0a4521467 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Mon, 19 Feb 2024 16:39:29 -0500 Subject: [PATCH 0590/1353] removed excesive logging --- webapps/console/pages/_app.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/webapps/console/pages/_app.tsx b/webapps/console/pages/_app.tsx index 70d9847ba..b1a1a0403 100644 --- a/webapps/console/pages/_app.tsx +++ b/webapps/console/pages/_app.tsx @@ -274,8 +274,6 @@ function AppLoader({ children, pageProps }: PropsWithChildren) { setOrigin(window.location.origin); }, []); - console.log("AppLoader", { data, isLoading, error }); - if (isLoading || !origin) { return ; } else if (error) { From b2cb2a7b4a3d22d2d69d84cec4a5a433db0bda2d Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 20 Feb 2024 17:42:58 +0400 Subject: [PATCH 0591/1353] rotor: support authorization token rotor: fixed graceful shutdown --- docker/docker-compose.yml | 5 +- .../src/functions/lib/mongodb.ts | 3 + .../src/functions/udf_wrapper.ts | 1 + libs/juava/src/boolean.ts | 3 + libs/juava/src/index.ts | 1 + libs/juava/src/security.ts | 9 +- libs/juava/src/singleton.ts | 30 ++- pnpm-lock.yaml | 6 +- services/rotor/package.json | 4 +- services/rotor/src/index.ts | 218 ++++++++++-------- services/rotor/src/lib/redis-logger.ts | 11 +- services/rotor/src/lib/redis.ts | 2 +- services/rotor/src/lib/rotor.ts | 14 +- types/protocols/functions.d.ts | 1 + .../pages/api/[workspaceId]/function/run.ts | 11 +- webapps/console/scripts/password-hash.ts | 6 +- 16 files changed, 196 insertions(+), 129 deletions(-) create mode 100644 libs/juava/src/boolean.ts diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 94b8e6340..3759e50de 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -57,6 +57,7 @@ services: platform: linux/amd64 environment: ROTOR_URL: "http://rotor:3401" + ROTOR_AUTH_KEY: ${BULKER_TOKEN:-default} BULKER_URL: "http://bulker:3042" CONSOLE_RAW_AUTH_TOKENS: ${CONSOLE_TOKEN:-default} BULKER_AUTH_KEY: ${BULKER_TOKEN:-default} @@ -134,8 +135,7 @@ services: platform: linux/amd64 restart: "unless-stopped" environment: - DISABLE_SERVICE_prisma: "true" - DISABLE_SERVICE_pg: "true" + ROTOR_RAW_AUTH_TOKENS: ${BULKER_TOKEN:-default} BULKER_URL: "http://bulker:3042" BULKER_AUTH_KEY: ${BULKER_TOKEN:-default} KAFKA_BOOTSTRAP_SERVERS: "kafka:9092" @@ -170,6 +170,7 @@ services: INGEST_CACHE_DIR: "/tmp/cache" INGEST_REDIS_URL: "redis://default:${REDIS_PASSWORD:-default}@redis:6379" INGEST_ROTOR_URL: "http://rotor:3401" + INGEST_ROTOR_AUTH_KEY: ${BULKER_TOKEN:-default} healthcheck: test: ["CMD", "curl", "-f", "http://ingest:3049/health"] interval: 2s diff --git a/libs/core-functions/src/functions/lib/mongodb.ts b/libs/core-functions/src/functions/lib/mongodb.ts index 1f787432e..f2a6b12e2 100644 --- a/libs/core-functions/src/functions/lib/mongodb.ts +++ b/libs/core-functions/src/functions/lib/mongodb.ts @@ -9,6 +9,9 @@ const log = getLog("mongodb"); export const mongodb = getSingleton("mongodb", createClient, { optional: true, + cleanupFunc: async (client: MongoClient) => { + await client.close(); + }, }); async function createClient() { diff --git a/libs/core-functions/src/functions/udf_wrapper.ts b/libs/core-functions/src/functions/udf_wrapper.ts index bc0a430a3..f45184eca 100644 --- a/libs/core-functions/src/functions/udf_wrapper.ts +++ b/libs/core-functions/src/functions/udf_wrapper.ts @@ -316,6 +316,7 @@ export async function UDFTestRun({ }); } }, + close() {}, }; const ctx = createFullContext(id, eventsStore, storeImpl, eventContext, {}, config); if (typeof code === "string") { diff --git a/libs/juava/src/boolean.ts b/libs/juava/src/boolean.ts new file mode 100644 index 000000000..b4b218dfa --- /dev/null +++ b/libs/juava/src/boolean.ts @@ -0,0 +1,3 @@ +export function isTruish(val: any) { + return val === "true" || val === "1" || val === "yes" || val === true || val === 1; +} diff --git a/libs/juava/src/index.ts b/libs/juava/src/index.ts index dd5bd0395..15682616a 100644 --- a/libs/juava/src/index.ts +++ b/libs/juava/src/index.ts @@ -10,3 +10,4 @@ export * from "./rpc"; export * from "./singleton"; export * from "./cache"; export * from "./sql-params"; +export * from "./boolean"; diff --git a/libs/juava/src/security.ts b/libs/juava/src/security.ts index d317ec60f..edf64dc46 100644 --- a/libs/juava/src/security.ts +++ b/libs/juava/src/security.ts @@ -2,7 +2,14 @@ const crypto = require("crypto"); const defaultSeed = "dea42a58-acf4-45af-85bb-e77e94bd5025"; -const globalSeed: string[] = (process.env.GLOBAL_HASH_SECRET || defaultSeed).split(",").map(s => s.trim()); +const globalSeed: string[] = ( + process.env.GLOBAL_HASH_SECRET || + process.env.CONSOLE_TOKEN_SECRET || + process.env.ROTOR_TOKEN_SECRET || + defaultSeed +) + .split(",") + .map(s => s.trim()); function hashInternal(secret: string, randomSeed: string, globalSeed: string) { return `${randomSeed}.${hash("sha512", secret + randomSeed + globalSeed)}`; diff --git a/libs/juava/src/singleton.ts b/libs/juava/src/singleton.ts index ab177a458..565b79256 100644 --- a/libs/juava/src/singleton.ts +++ b/libs/juava/src/singleton.ts @@ -19,9 +19,10 @@ export type CachedValue = ( export interface Singleton { (): T; waitInit: () => Promise; + close: () => Promise; } -function clearSingleton(globalName: string, cleanupFunc?: (t: T) => {}) { +function clearSingleton(globalName: string, cleanupFunc?: (t: T) => void) { log.atInfo().log(`️🚮🚮🚮 ${globalName} deleting stale singleton`); const cachedValue = global[`singletons_${globalName}`]; if (cachedValue?.success) { @@ -46,7 +47,13 @@ function getDisableServiceVar(globalName: string) { export function getSingleton( globalName: string, factory: () => T | Promise, - opts: { ttlSec?: number; optional?: boolean; silent?: boolean; errorTtlSec?: number; cleanupFunc?: (t: T) => {} } = { + opts: { + ttlSec?: number; + optional?: boolean; + silent?: boolean; + errorTtlSec?: number; + cleanupFunc?: (t: T) => void; + } = { ttlSec: 0, errorTtlSec: 0, optional: false, @@ -109,6 +116,12 @@ export function getSingleton( cachedValue.debounceCleanup(); const result = () => cachedValue.value as T; result.waitInit = () => Promise.resolve(cachedValue.value as T); + result.close = () => { + if (opts.cleanupFunc) { + opts.cleanupFunc(cachedValue.value); + } + return Promise.resolve(); + }; return result; } else if (cachedValue && !cachedValue.success) { cachedValue.debounceCleanup(); @@ -146,11 +159,24 @@ export function getSingleton( } }; result.waitInit = () => awaiter; + result.close = () => { + const globalInstance = global[`singletons_${globalName}`]; + if (opts.cleanupFunc && globalInstance.success) { + opts.cleanupFunc(globalInstance.value); + } + return Promise.resolve(); + }; return result; } else { handleSuccess(newInstance, startedAtTs); const result = () => newInstance as T; result.waitInit = () => Promise.resolve(newInstance as T); + result.close = () => { + if (opts.cleanupFunc) { + opts.cleanupFunc(newInstance as T); + } + return Promise.resolve(); + }; return result; } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5103336fa..65bd4fb96 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -582,9 +582,6 @@ importers: '@amplitude/ua-parser-js': specifier: ^0.7.33 version: 0.7.33 - '@jitsu-internal/console': - specifier: workspace:* - version: link:../../webapps/console '@jitsu/core-functions': specifier: workspace:* version: link:../../libs/core-functions @@ -697,6 +694,9 @@ importers: '@rollup/plugin-typescript': specifier: ^9.0.2 version: 9.0.2(rollup@3.20.2)(tslib@2.5.0)(typescript@5.3.3) + '@types/express': + specifier: ^4.17.13 + version: 4.17.17 '@types/glob': specifier: ^8.0.0 version: 8.1.0 diff --git a/services/rotor/package.json b/services/rotor/package.json index ccefc2d53..d806c8a3d 100644 --- a/services/rotor/package.json +++ b/services/rotor/package.json @@ -11,14 +11,13 @@ "scripts": { "compile": "rm -rf ./dist && tsc -p . ", "bundle_extenals": "cp dist_package.json ./dist/package.json && cd ./dist/ && npm install", - "build": "pnpm compile && webpack && cp ../../webapps/console/prisma/schema.prisma ./dist/schema.prisma && pnpm bundle_extenals", + "build": "pnpm compile && webpack && pnpm bundle_extenals", "start": "dotenv -e ../../.env.local -- node dist/main.js", "rotor:dev": "dotenv -e ../../.env.local -- nodemon --watch \"src/**\" --ext \"ts,json,tsx\" --exec \"ts-node src/index.ts\"", "test": "tsc -p . && jest --verbose" }, "dependencies": { "@amplitude/ua-parser-js": "^0.7.33", - "@jitsu-internal/console": "workspace:*", "@jitsu/core-functions": "workspace:*", "@jitsu/functions-lib": "workspace:*", "@maxmind/geoip2-node": "4.2.0", @@ -66,6 +65,7 @@ "@types/pg": "^8.6.5", "@types/web": "0.0.69", "@types/webpack": "^5.28.0", + "@types/express": "^4.17.13", "@webpack-cli/generators": "^3.0.0", "babel-loader": "^9.1.3", "clean-webpack-plugin": "^4.0.0", diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index 6ec8552d9..7211e0580 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -1,4 +1,4 @@ -import { disableService, getLog, randomId, setServerJsonFormat } from "juava"; +import { checkHash, checkRawToken, disableService, getLog, randomId, setServerJsonFormat, isTruish } from "juava"; import { connectToKafka, destinationMessagesTopic, @@ -19,8 +19,8 @@ import { rotorMessageHandler } from "./lib/message-handler"; import { redis } from "./lib/redis"; import { redisLogger } from "./lib/redis-logger"; import { DummyMetrics, Metrics } from "./lib/metrics"; -import { isTruish } from "@jitsu-internal/console/lib/shared/chores"; import { connectionsStore, functionsStore } from "./lib/entity-store"; +import { Server } from "node:net"; export const log = getLog("rotor"); @@ -33,23 +33,20 @@ const http = express(); http.use(express.json({ limit: "20mb" })); http.use(express.urlencoded({ limit: "20mb" })); +const metricsHttp = express(); + const rotorHttpPort = process.env.ROTOR_HTTP_PORT || process.env.PORT || 3401; +const rotorMetricsPort = process.env.ROTOR_METRICS_PORT || 9091; + +let started = false; async function main() { const errorTypes = ["unhandledRejection", "uncaughtException"]; const signalTraps = ["SIGTERM", "SIGINT", "SIGUSR2"]; errorTypes.forEach(type => { - process.once(type, err => { + process.on(type, err => { log.atError().withCause(err).log(`process.on ${type}`); - // process.exit(1); - }); - }); - - signalTraps.forEach(type => { - process.once(type, () => { - log.atInfo().log(`Signal ${type} received`); - process.kill(process.pid, type); }); }); @@ -57,16 +54,15 @@ async function main() { log.atInfo().log(`Process exited with code ${code}`); }); - const args = minimist(process.argv.slice(2)); - if (args._?.[0] === "local") { - await processLocalFile(args); - } else if (args._?.[0] === "test-connection") { - await testConnection(args); - } else if (process.env.KAFKA_BOOTSTRAP_SERVERS && !isTruish(process.env.HTTP_ONLY)) { + let httpServer: Server; + let metricsServer: Server | undefined; + let geoResolver: GeoResolver; + try { Prometheus.collectDefaultMetrics(); await mongodb.waitInit(); await redis.waitInit(); await redisLogger.waitInit(); + const connStore = await connectionsStore.get(); if (!connStore.enabled) { log.atError().log("Connection store is not configured. Rotor will not work"); @@ -77,10 +73,42 @@ async function main() { log.atError().log("Functions store is not configured. Rotor will not work"); process.exit(1); } + + geoResolver = await initMaxMindClient(process.env.MAXMIND_LICENSE_KEY || ""); + metricsServer = initMetricsServer(); + } catch (e) { + log.atError().withCause(e).log("Failed to start"); + process.exit(1); + } + + const gracefulShutdown = async () => { + if (httpServer) { + httpServer.close(); + } + connectionsStore.stop(); + functionsStore.stop(); + redisLogger.close(); + mongodb.close(); + redis.close(); + const extraDelay = process.env.SHUTDOWN_EXTRA_DELAY_SEC + ? 1000 * parseInt(process.env.SHUTDOWN_EXTRA_DELAY_SEC) + : 5000; + if (extraDelay > 0) { + log.atInfo().log(`Giving extra ${extraDelay / 1000}s. to flush logs and scrape metrics...`); + //extra time to flush logs + setTimeout(() => { + if (metricsServer) { + metricsServer.close(); + } + process.exit(started ? 0 : 1); + }, extraDelay); + } + }; + + if (process.env.KAFKA_BOOTSTRAP_SERVERS && !isTruish(process.env.HTTP_ONLY)) { //kafka consumer mode const kafkaTopics = [destinationMessagesTopic()]; const consumerGroupId = rotorConsumerGroupId(); - const geoResolver = await initMaxMindClient(process.env.MAXMIND_LICENSE_KEY || ""); const rotor = kafkaRotor({ credentials: getCredentialsFromEnv(), kafkaTopics: kafkaTopics, @@ -93,38 +121,48 @@ async function main() { .start() .then(chMetrics => { log.atInfo().log(`Kafka processing started. Listening for topics ${kafkaTopics} with group ${consumerGroupId}`); - initHTTP(chMetrics, geoResolver); + httpServer = initHTTP(chMetrics, geoResolver); }) .catch(async e => { - log.atError().withCause(e).log("Failed to start kafka processing"); + log.atError().withCause(e).log("Failed to start rotor processing"); await rotor.close(); process.exit(1); }); - process.on("beforeExit", async () => { - await rotor.close(); + signalTraps.forEach(type => { + process.once(type, () => { + log.atInfo().log(`Signal ${type} received. Closing rotor`); + rotor.close().then(gracefulShutdown); + }); }); } else { - Prometheus.collectDefaultMetrics(); - await mongodb.waitInit(); - await redis.waitInit(); - await redisLogger.waitInit(); - const connStore = await connectionsStore.get(); - if (!connStore.enabled) { - log.atError().log("Connection store is not configured. Rotor will not work"); - process.exit(1); - } - const funcStore = await functionsStore.get(); - if (!funcStore.enabled) { - log.atError().log("Functions store is not configured. Rotor will not work"); - process.exit(1); - } - const geoResolver = await initMaxMindClient(process.env.MAXMIND_LICENSE_KEY || ""); - initHTTP(DummyMetrics, geoResolver); + httpServer = initHTTP(DummyMetrics, geoResolver); + signalTraps.forEach(type => { + process.once(type, () => { + gracefulShutdown(); + }); + }); } } function initHTTP(metrics: Metrics, geoResolver: GeoResolver) { + http.use((req, res, next) => { + console.log("path:", req.path); + if (req.path === "/health") { + return next(); + } + let token = req.headers.authorization; + if (!token || !token.startsWith("Bearer ")) { + res.status(401).json({ error: "Authorization header with Bearer token is required" }); + return; + } + token = token.substring("Bearer ".length); + if (!checkAuth(token)) { + res.status(401).json({ error: `Invalid token: ${token}` }); + return; + } + next(); + }); http.get("/health", (req, res) => { res.json({ status: "pass", @@ -142,80 +180,56 @@ function initHTTP(metrics: Metrics, geoResolver: GeoResolver) { }, }); }); - http.get("/metrics", async (req, res) => { + http.post("/udfrun", UDFRunHandler); + http.post("/func", FunctionsHandler(metrics, geoResolver)); + http.post("/func/multi", FunctionsHandlerMulti(metrics, geoResolver)); + const httpServer = http.listen(rotorHttpPort, () => { + log.atInfo().log(`Listening on port ${rotorHttpPort}`); + started = true; + }); + httpServer.on("error", e => { + log.atError().withCause(e).log("Failed to start http server. Exiting..."); + process.kill(process.pid, "SIGTERM"); + }); + return httpServer; +} + +function initMetricsServer() { + metricsHttp.get("/metrics", async (req, res) => { res.set("Content-Type", Prometheus.register.contentType); const result = await Prometheus.register.metrics(); res.end(result); }); - http.post("/udfrun", UDFRunHandler); - http.post("/func", FunctionsHandler(metrics, geoResolver)); - http.post("/func/multi", FunctionsHandlerMulti(metrics, geoResolver)); - http.listen(rotorHttpPort, () => { - log.atInfo().log(`Listening health-checks on port ${rotorHttpPort}`); + const metricsServer = metricsHttp.listen(rotorMetricsPort, () => { + log.atInfo().log(`Listening metrics on port ${rotorMetricsPort}`); }); + metricsServer.on("error", e => { + log.atError().withCause(e).log("Failed to start metrics server"); + }); + return metricsServer; } -async function processLocalFile(args: minimist.ParsedArgs) { - if (args["f"]) { - glob(args["f"], async (err, files) => { - if (err) { - log.atError().withCause(err).log(`Failed to read files ${args["f"]}`); - process.exit(1); - } - for (const file of files) { - const content = JSON.parse(fs.readFileSync(file, "utf8")); - const events = Array.isArray(content) ? content : [content]; - log.atInfo().log(`Reading file ${file}. Events: ${events.length}`); - for (const event of events) { - try { - await rotorMessageHandler(JSON.stringify(event)); - } catch (e) { - log - .atError() - .withCause(e) - .log(`Failed to process event from ${file}: ${JSON.stringify(event)}`); - } - } - } - }); - } else if (args["j"]) { - const content = JSON.parse(args["j"]); - const events = Array.isArray(content) ? content : [content]; - for (const event of events) { - try { - await rotorMessageHandler(JSON.stringify(event)); - } catch (e) { - log - .atError() - .withCause(e) - .log(`Failed to process event: ${JSON.stringify(event)}`); +function checkAuth(token: string): boolean { + let tokens: string[] = []; + let checkFunction: (token: string, secret: string) => boolean = () => false; + if (process.env.ROTOR_AUTH_TOKENS) { + tokens = process.env.ROTOR_AUTH_TOKENS.split(","); + checkFunction = checkHash; + } else if (process.env.ROTOR_RAW_AUTH_TOKENS) { + tokens = process.env.ROTOR_RAW_AUTH_TOKENS.split(","); + checkFunction = checkRawToken; + } else { + log.atWarn().log("No auth tokens are configured. Rotor is open for everyone."); + return true; + } + if (tokens.length > 0) { + for (const tokenHashOrPlain of tokens) { + if (checkFunction(tokenHashOrPlain, token)) { + return true; } } } -} - -async function testConnection(args: minimist.ParsedArgs) { - const credentials = getCredentialsFromEnv(); - const kafka = connectToKafka({ ...credentials, defaultAppId: "connection-tester" }); - const producer = kafka.producer(); - await producer.connect(); - const topic = "connection-tester" + randomId(5); - const testMessage = { value: "test" }; - await producer.send({ topic, messages: [testMessage] }); - await producer.disconnect(); - - const consumer = kafka.consumer({ groupId: topic }); - await consumer.connect(); - await consumer.subscribe({ topic, fromBeginning: true }); - const message = (await new Promise(resolve => { - consumer.run({ - eachMessage: async ({ message }) => { - resolve(message); - }, - }); - })) as any; - log.atInfo().log(`Received message: ${message.value}`); - await consumer.disconnect(); + return false; } main(); diff --git a/services/rotor/src/lib/redis-logger.ts b/services/rotor/src/lib/redis-logger.ts index b3d4384c2..4ca0be660 100644 --- a/services/rotor/src/lib/redis-logger.ts +++ b/services/rotor/src/lib/redis-logger.ts @@ -6,7 +6,11 @@ export const log = getLog("redisLogger"); const eventsLogSize = process.env.EVENTS_LOG_MAX_SIZE ? parseInt(process.env.EVENTS_LOG_MAX_SIZE) : 1000; -export const redisLogger = getSingleton("redisLogger", createRedisLogger); +export const redisLogger = getSingleton("redisLogger", createRedisLogger, { + cleanupFunc: (logger: EventsStore) => { + logger.close(); + }, +}); export function createRedisLogger(): EventsStore { const buffer: Record = {}; @@ -48,7 +52,7 @@ export function createRedisLogger(): EventsStore { } }; - setInterval(async () => { + const interval = setInterval(async () => { if (Object.keys(buffer).length === 0) { return; } @@ -71,5 +75,8 @@ export function createRedisLogger(): EventsStore { log.atError().withCause(e).log("Failed to put event to redis events log"); } }, + close: () => { + clearInterval(interval); + }, }; } diff --git a/services/rotor/src/lib/redis.ts b/services/rotor/src/lib/redis.ts index 9d885e6dc..ccdcd48f8 100644 --- a/services/rotor/src/lib/redis.ts +++ b/services/rotor/src/lib/redis.ts @@ -4,7 +4,7 @@ import { requireDefined, getLog } from "juava"; export const log = getLog("redis"); -export const redis = getSingleton("redis", createRedis); +export const redis = getSingleton("redis", createRedis, { cleanupFunc: redis => redis.disconnect() }); function hideSensitiveInfoFromURL(url: string) { let parsed: URL; diff --git a/services/rotor/src/lib/rotor.ts b/services/rotor/src/lib/rotor.ts index f6ab2c8e2..e97ccd6cf 100644 --- a/services/rotor/src/lib/rotor.ts +++ b/services/rotor/src/lib/rotor.ts @@ -50,6 +50,7 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { let admin: Admin; let closeQueue: () => Promise; let interval: NodeJS.Timer; + let metrics: Metrics; return { start: async () => { const kafka = connectToKafka({ defaultAppId: kafkaClientId, ...cfg.credentials }); @@ -64,7 +65,7 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { producer = kafka.producer({ allowAutoTopicCreation: false }); await producer.connect(); - const metrics = createMetrics(producer); + metrics = createMetrics(producer); admin = kafka.admin(); const topicOffsets = new Prometheus.Gauge({ @@ -284,15 +285,10 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { if (interval) { clearInterval(interval); } - log.atInfo().log("Kafka-rotor closed gracefully. 💜"); - const extraDelay = process.env.SHUTDOWN_EXTRA_DELAY_SEC - ? 1000 * parseInt(process.env.SHUTDOWN_EXTRA_DELAY_SEC) - : 5000; - if (extraDelay > 0) { - log.atInfo().log(`Giving extra ${extraDelay / 1000}s. to flush logs...`); - //extra time to flush logs - await new Promise(resolve => setTimeout(resolve, extraDelay)); + if (metrics) { + metrics.close(); } + log.atInfo().log("Kafka-rotor closed gracefully. 💜"); }, }; } diff --git a/types/protocols/functions.d.ts b/types/protocols/functions.d.ts index ed51eb395..21792c2f2 100644 --- a/types/protocols/functions.d.ts +++ b/types/protocols/functions.d.ts @@ -42,6 +42,7 @@ export interface TTLStore extends Store { */ export interface EventsStore { log(connectionId: string, error: boolean, msg: Record): void; + close(): void; } /** * A special properties that user can set on an event to define how diff --git a/webapps/console/pages/api/[workspaceId]/function/run.ts b/webapps/console/pages/api/[workspaceId]/function/run.ts index 67696b0c3..e5596c41c 100644 --- a/webapps/console/pages/api/[workspaceId]/function/run.ts +++ b/webapps/console/pages/api/[workspaceId]/function/run.ts @@ -51,13 +51,18 @@ export const api: Api = { process.env.ROTOR_URL, `env ROTOR_URL is not set. Rotor is required to run functions` ); + const rotorAuthKey = process.env.ROTOR_AUTH_KEY; + const headers: Record = { + "Content-Type": "application/json", + }; + if (rotorAuthKey) { + headers["Authorization"] = `Bearer ${rotorAuthKey}`; + } const res = await rpc(rotorURL + "/udfrun", { method: "POST", body: body, - headers: { - "Content-Type": "application/json", - }, + headers, }); return resultType.parse(res); }, diff --git a/webapps/console/scripts/password-hash.ts b/webapps/console/scripts/password-hash.ts index 858cbe35b..161799f45 100644 --- a/webapps/console/scripts/password-hash.ts +++ b/webapps/console/scripts/password-hash.ts @@ -9,12 +9,14 @@ async function main(): Promise { if (!args._ || args._.length === 0) { log.atInfo().log("No secret provided as a first arg, generating a random one"); } - const secret = !args._ || args._.length === 0 ? randomId(16) : args._[0]; + const secret = !args._ || args._.length === 0 ? randomId(32) : args._[0]; log .atInfo() .log( `Calculating password hash. Using ${ - process.env.GLOBAL_HASH_SECRET ? "custom GLOBAL_HASH_SECRET" : "default hash secret" + process.env.GLOBAL_HASH_SECRET || process.env.CONSOLE_TOKEN_SECRET + ? "custom token secret" + : "default hash secret" }` ); log.atInfo().log(`Hashing ${secret} → ${createHash(secret)}`); From 3569637cf595c5793853b5a5782355aec0b038b2 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 20 Feb 2024 17:55:19 +0400 Subject: [PATCH 0592/1353] rotor: remove extra logging --- services/rotor/src/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index 7211e0580..deb60510a 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -147,7 +147,6 @@ async function main() { function initHTTP(metrics: Metrics, geoResolver: GeoResolver) { http.use((req, res, next) => { - console.log("path:", req.path); if (req.path === "/health") { return next(); } From adc8e364fadd46cf105978192bbf342f076c5856 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 20 Feb 2024 19:15:14 +0400 Subject: [PATCH 0593/1353] rotor: allow not using auth --- services/rotor/src/index.ts | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index deb60510a..a1afc1531 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -150,14 +150,21 @@ function initHTTP(metrics: Metrics, geoResolver: GeoResolver) { if (req.path === "/health") { return next(); } - let token = req.headers.authorization; - if (!token || !token.startsWith("Bearer ")) { - res.status(401).json({ error: "Authorization header with Bearer token is required" }); - return; + let token = req.headers.authorization || ""; + if (token) { + if (token.startsWith("Bearer ")) { + token = token.substring("Bearer ".length); + } else { + res.status(401).json({ error: "Authorization header with Bearer token is required" }); + return; + } } - token = token.substring("Bearer ".length); if (!checkAuth(token)) { - res.status(401).json({ error: `Invalid token: ${token}` }); + if (token) { + res.status(401).json({ error: `Invalid token: ${token}` }); + } else { + res.status(401).json({ error: "Authorization header with Bearer token is required" }); + } return; } next(); From 027426e42068b150d8de97c16047d39f5ba2abcc Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Tue, 20 Feb 2024 10:31:10 -0500 Subject: [PATCH 0594/1353] feat (@jitsu/js): now it's possible to pass array to jitsuQ as in jitsuQ.push(['track', 'eventName', ...otherArgs]) --- .../__tests__/playwright/cases/callbacks.html | 21 +++++++++++++++++++ .../__tests__/playwright/integration.test.ts | 18 ++++++++++++++++ libs/jitsu-js/src/browser.ts | 19 +++++++++++++++-- 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 libs/jitsu-js/__tests__/playwright/cases/callbacks.html diff --git a/libs/jitsu-js/__tests__/playwright/cases/callbacks.html b/libs/jitsu-js/__tests__/playwright/cases/callbacks.html new file mode 100644 index 000000000..e2c379168 --- /dev/null +++ b/libs/jitsu-js/__tests__/playwright/cases/callbacks.html @@ -0,0 +1,21 @@ + + + + + + + Tracking page + + + + + +

    Test

    + + diff --git a/libs/jitsu-js/__tests__/playwright/integration.test.ts b/libs/jitsu-js/__tests__/playwright/integration.test.ts index d973712af..886af196e 100644 --- a/libs/jitsu-js/__tests__/playwright/integration.test.ts +++ b/libs/jitsu-js/__tests__/playwright/integration.test.ts @@ -191,6 +191,24 @@ function describeEvent(type: string, body: any) { .join(", "); return `${type}${type === "track" ? `(${body.event})` : ""}[${params}]`; } + +test("jitsu-queue-callbacks", async ({ browser }) => { + const browserContext = await browser.newContext(); + const { page, uncaughtErrors } = await createLoggingPage(browserContext); + const [pageResult] = await Promise.all([page.goto(`${server.baseUrl}/callbacks.html`)]); + await page.waitForFunction(() => window["jitsu"] !== undefined, undefined, { + timeout: 1000, + polling: 100, + }); + //wait for some time since the server has an artificial latency of 30ms + await new Promise(resolve => setTimeout(resolve, 1000)); + console.log( + `📝 Request log size of ${requestLog.length}`, + requestLog.map(x => describeEvent(x.type, x.body)) + ); + expect(requestLog.length).toBe(3); +}); + test("url-bug", async ({ browser }) => { //tests a bug in getanalytics.io where the url without slash provided by // causes incorrect page path diff --git a/libs/jitsu-js/src/browser.ts b/libs/jitsu-js/src/browser.ts index 70a50c69c..c6f4c0bbf 100644 --- a/libs/jitsu-js/src/browser.ts +++ b/libs/jitsu-js/src/browser.ts @@ -1,4 +1,4 @@ -import { JitsuOptions } from "./jitsu"; +import type { AnalyticsInterface, JitsuOptions } from "./jitsu"; import { jitsuAnalytics } from "./index"; export type JitsuBrowserOptions = { @@ -40,6 +40,21 @@ function getScriptAttributes(scriptElement: HTMLScriptElement) { ); } +function runCallback(callback: any, jitsu: AnalyticsInterface) { + if (typeof callback === "function") { + callback(jitsu); + } else if (Array.isArray(callback) && typeof callback[0] === "string") { + const [method, ...args] = callback; + if (typeof jitsu[method] === "function") { + jitsu[method](...args); + } else { + console.warn(`Method ${method} is not supported, ignoring callback`); + } + } else { + console.warn(`Invalid jitsu queue callback`, callback); + } +} + (function () { function readJitsuOptions(): JitsuBrowserOptions { const scriptElement = window.document.currentScript as HTMLScriptElement; @@ -93,7 +108,7 @@ function getScriptAttributes(scriptElement: HTMLScriptElement) { } callbackQueue.forEach((callback: any) => { try { - callback(jitsu); + runCallback(callback, jitsu); } catch (e: any) { console.warn(`Error processing callback from Jitsu queue`, e); } From de39f0169586d71187675f12ee88e0e5ebd399fa Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 21 Feb 2024 15:05:30 +0400 Subject: [PATCH 0595/1353] docker-compose: explicitly set ENABLE_CREDETIALS_LOGIN --- docker/docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 3759e50de..a43fbf24f 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -66,6 +66,7 @@ services: REDIS_URL: "redis://default:${REDIS_PASSWORD:-default}@redis:6379" SEED_USER_EMAIL: ${SEED_USER_EMAIL:-} SEED_USER_PASSWORD: ${SEED_USER_PASSWORD:-} + ENABLE_CREDETIALS_LOGIN: ${ENABLE_CREDETIALS_LOGIN:-true} GITHUB_CLIENT_ID: ${GITHUB_CLIENT_ID} GITHUB_CLIENT_SECRET: ${GITHUB_CLIENT_SECRET} SYNCS_ENABLED: ${SYNCS_ENABLED:-false} From e1e11903869b4b1637af9032a451597437f2b803 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 21 Feb 2024 20:24:50 +0400 Subject: [PATCH 0596/1353] reduce fetch timeout ms to 5000 --- libs/core-functions/src/context.ts | 2 +- libs/core-functions/src/functions/udf_wrapper.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/core-functions/src/context.ts b/libs/core-functions/src/context.ts index accaf29d8..e91324573 100644 --- a/libs/core-functions/src/context.ts +++ b/libs/core-functions/src/context.ts @@ -14,7 +14,7 @@ export function createFullContext( systemContext: SystemContext | {} = {}, props: Record = {}, event?: any, - fetchTimeoutMs: number = 15000 + fetchTimeoutMs: number = 5000 ): FullContext { const ar = functionId.split("."); const id = ar.pop(); diff --git a/libs/core-functions/src/functions/udf_wrapper.ts b/libs/core-functions/src/functions/udf_wrapper.ts index f45184eca..44b23b9f4 100644 --- a/libs/core-functions/src/functions/udf_wrapper.ts +++ b/libs/core-functions/src/functions/udf_wrapper.ts @@ -29,7 +29,7 @@ export const UDFWrapper = (functionId, name, functionCode: string): UDFWrapperRe let isolate: Isolate; try { //const wrappedCode = `let exports = {}\n${functionCode}\n${wrapperJs}`; - isolate = new Isolate({ memoryLimit: 128 }); + isolate = new Isolate({ memoryLimit: 64 }); const context = isolate.createContextSync(); const jail = context.global; From 97ee56506d8ddd6ed197a5172c48e8638194f7b1 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 21 Feb 2024 21:31:53 +0400 Subject: [PATCH 0597/1353] rotor: switch to builtin fetch all.Dockerfile use node 21 --- all.Dockerfile | 4 ++-- libs/core-functions/package.json | 1 - libs/core-functions/src/context.ts | 6 ++---- pnpm-lock.yaml | 3 --- services/rotor/src/lib/entity-store.ts | 4 +--- 5 files changed, 5 insertions(+), 13 deletions(-) diff --git a/all.Dockerfile b/all.Dockerfile index 16a9c335a..d507fe997 100644 --- a/all.Dockerfile +++ b/all.Dockerfile @@ -2,7 +2,7 @@ # Build & push it with # docker buildx build --platform linux/amd64 . -f console.Dockerfile --push -t jitsucom/console:latest -FROM node:18-slim as base +FROM node:21-slim as base WORKDIR /app RUN apt-get update -y @@ -60,4 +60,4 @@ COPY --from=builder /app/services/rotor/dist . ENV NODE_ENV=production -ENTRYPOINT ["sh", "-c", "node --max-old-space-size=4096 main.js"] +ENTRYPOINT ["sh", "-c", "node --no-node-snapshot --max-old-space-size=1024 main.js"] diff --git a/libs/core-functions/package.json b/libs/core-functions/package.json index 8d7d288f9..746f03a1a 100644 --- a/libs/core-functions/package.json +++ b/libs/core-functions/package.json @@ -28,7 +28,6 @@ "@types/node": "^18.15.3", "jest": "^29.5.0", "json5": "^2.1.0", - "node-fetch-commonjs": "^3.2.4", "ts-jest": "29.0.5", "express": "^4.18.2" }, diff --git a/libs/core-functions/src/context.ts b/libs/core-functions/src/context.ts index e91324573..35bde34bb 100644 --- a/libs/core-functions/src/context.ts +++ b/libs/core-functions/src/context.ts @@ -1,7 +1,5 @@ import { EventContext, EventsStore, FetchOpts, FullContext, Store } from "@jitsu/protocols/functions"; -import nodeFetch, { RequestInit } from "node-fetch-commonjs"; import { getErrorMessage, getLog, stopwatch } from "juava"; -import { httpAgent, httpsAgent } from "./functions/lib/http-agent"; import { SystemContext } from "./functions/lib"; const log = getLog("functions-context"); @@ -43,12 +41,12 @@ export function createFullContext( let internalInit: RequestInit = { ...init, - agent: (url.startsWith("https://") ? httpsAgent : httpAgent)(), + keepalive: true, signal: controller.signal, }; let fetchResult: any = undefined; try { - fetchResult = await nodeFetch(url, internalInit); + fetchResult = await fetch(url, internalInit); } catch (err: any) { if (err.name === "AbortError") { err.message = `Fetch request exceeded timeout ${fetchTimeoutMs}ms and was aborted`; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 65bd4fb96..949e332f0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -368,9 +368,6 @@ importers: json5: specifier: ^2.1.0 version: 2.2.3 - node-fetch-commonjs: - specifier: ^3.2.4 - version: 3.2.4 ts-jest: specifier: 29.0.5 version: 29.0.5(@babel/core@7.21.4)(jest@29.5.0)(typescript@5.3.3) diff --git a/services/rotor/src/lib/entity-store.ts b/services/rotor/src/lib/entity-store.ts index 81beb393d..87dbba937 100644 --- a/services/rotor/src/lib/entity-store.ts +++ b/services/rotor/src/lib/entity-store.ts @@ -1,7 +1,5 @@ import { createInMemoryStore } from "./inmem-store"; import { getLog } from "juava"; -import { httpAgent, httpsAgent } from "@jitsu/core-functions"; -import fetch from "node-fetch-commonjs"; const log = getLog("entity-store"); @@ -42,7 +40,7 @@ const refreshFunc = const res = await fetch(`${base}${storeId}`, { method: "GET", headers: headers, - agent: await (repositoryBase.startsWith("https://") ? httpsAgent : httpAgent).waitInit(), + keepalive: true, }); if (res.status === 304) { log.atDebug().log(`${storeId} nod modified: ${ifModifiedSince}`); From 465ae5efedcc7bed0eb72b187e9de4be7977e4fd Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Wed, 21 Feb 2024 12:34:11 -0500 Subject: [PATCH 0598/1353] fix: tests --- libs/jitsu-js/__tests__/playwright/integration.test.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/libs/jitsu-js/__tests__/playwright/integration.test.ts b/libs/jitsu-js/__tests__/playwright/integration.test.ts index 886af196e..f45c95cdb 100644 --- a/libs/jitsu-js/__tests__/playwright/integration.test.ts +++ b/libs/jitsu-js/__tests__/playwright/integration.test.ts @@ -192,7 +192,12 @@ function describeEvent(type: string, body: any) { return `${type}${type === "track" ? `(${body.event})` : ""}[${params}]`; } +function clearRequestLog() { + requestLog.length = 0; +} + test("jitsu-queue-callbacks", async ({ browser }) => { + clearRequestLog(); const browserContext = await browser.newContext(); const { page, uncaughtErrors } = await createLoggingPage(browserContext); const [pageResult] = await Promise.all([page.goto(`${server.baseUrl}/callbacks.html`)]); @@ -210,6 +215,7 @@ test("jitsu-queue-callbacks", async ({ browser }) => { }); test("url-bug", async ({ browser }) => { + clearRequestLog(); //tests a bug in getanalytics.io where the url without slash provided by // causes incorrect page path const browserContext = await browser.newContext(); @@ -239,7 +245,7 @@ test("url-bug", async ({ browser }) => { }); test("basic", async ({ browser }) => { - requestLog.length = 0; + clearRequestLog(); const browserContext = await browser.newContext(); const { page: firstPage, uncaughtErrors: firstPageErrors } = await createLoggingPage(browserContext); @@ -308,7 +314,7 @@ test("basic", async ({ browser }) => { timeout: 1000, polling: 100, }); - requestLog.length = 0; + clearRequestLog(); await secondPage.evaluate(generateTestEvents); expect(secondPageErrors.length).toBe(0); From 460a20ae08de3103705d544fd7d478d92e92e160 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 21 Feb 2024 21:56:33 +0400 Subject: [PATCH 0599/1353] bring back node-fetch-commonjs for test --- libs/core-functions/package.json | 1 + pnpm-lock.yaml | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/libs/core-functions/package.json b/libs/core-functions/package.json index 746f03a1a..8d7d288f9 100644 --- a/libs/core-functions/package.json +++ b/libs/core-functions/package.json @@ -28,6 +28,7 @@ "@types/node": "^18.15.3", "jest": "^29.5.0", "json5": "^2.1.0", + "node-fetch-commonjs": "^3.2.4", "ts-jest": "29.0.5", "express": "^4.18.2" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 949e332f0..cd5376880 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -368,6 +368,9 @@ importers: json5: specifier: ^2.1.0 version: 2.2.3 + node-fetch-commonjs: + specifier: ^3.2.4 + version: 3.3.1 ts-jest: specifier: 29.0.5 version: 29.0.5(@babel/core@7.21.4)(jest@29.5.0)(typescript@5.3.3) @@ -20206,7 +20209,6 @@ packages: dependencies: formdata-polyfill: 4.0.10 web-streams-polyfill: 3.2.1 - dev: false /node-fetch@2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} From 4dbf2eb828d6c7399e6e8b3743c76820167082ab Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Wed, 21 Feb 2024 16:26:27 -0500 Subject: [PATCH 0600/1353] feat: version end-point for self-hosted installation --- all.Dockerfile | 17 +++++- cli/build-scripts/src/commands/docker.ts | 17 +++++- console.Dockerfile | 41 --------------- release.sh | 2 +- rotor.Dockerfile | 38 -------------- rotorbuild.sh | 3 -- services/rotor/src/index.ts | 13 +++++ services/rotor/src/lib/version.ts | 67 ++++++++++++++++++++++++ webapps/console/lib/version.ts | 43 +++++++++++++++ webapps/console/next.config.js | 11 ++-- webapps/console/pages/api/version.ts | 39 ++++++++++++++ webapps/console/pages/signin.tsx | 13 ++++- 12 files changed, 212 insertions(+), 92 deletions(-) delete mode 100644 console.Dockerfile delete mode 100644 rotor.Dockerfile delete mode 100755 rotorbuild.sh create mode 100644 services/rotor/src/lib/version.ts create mode 100644 webapps/console/lib/version.ts create mode 100644 webapps/console/pages/api/version.ts diff --git a/all.Dockerfile b/all.Dockerfile index d507fe997..3b18437c4 100644 --- a/all.Dockerfile +++ b/all.Dockerfile @@ -30,6 +30,11 @@ RUN pnpm build FROM base as console +ARG JITSU_BUILD_VERSION=dev, +ARG JITSU_BUILD_DOCKER_TAG=dev, +ARG JITSU_BUILD_COMMIT_SHA=unknown, + + WORKDIR /app RUN npm -g install prisma@$(cat webapps/console/package.json | jq -r '.dependencies.prisma') COPY --from=builder /app/docker-start-console.sh ./ @@ -43,11 +48,19 @@ EXPOSE 3000 HEALTHCHECK CMD curl --fail http://localhost:3000/api/healthcheck || exit 1 ENV NODE_ENV=production +ENV JITSU_VERSION_COMMIT_SHA=${JITSU_BUILD_COMMIT_SHA} +ENV JITSU_VERSION_DOCKER_TAG=${JITSU_BUILD_DOCKER_TAG} +ENV JITSU_VERSION_STRING=${JITSU_BUILD_VERSION} ENTRYPOINT ["sh", "-c", "/app/docker-start-console.sh"] FROM base as rotor +ARG JITSU_BUILD_VERSION=dev, +ARG JITSU_BUILD_DOCKER_TAG=dev, +ARG JITSU_BUILD_COMMIT_SHA=unknown, + + WORKDIR /app RUN addgroup --system --gid 1001 runner RUN adduser --system --uid 1001 runner @@ -55,9 +68,11 @@ USER runner EXPOSE 3401 - COPY --from=builder /app/services/rotor/dist . ENV NODE_ENV=production +ENV JITSU_VERSION_COMMIT_SHA=${JITSU_BUILD_COMMIT_SHA} +ENV JITSU_VERSION_DOCKER_TAG=${JITSU_BUILD_DOCKER_TAG} +ENV JITSU_VERSION_STRING=${JITSU_BUILD_VERSION} ENTRYPOINT ["sh", "-c", "node --no-node-snapshot --max-old-space-size=1024 main.js"] diff --git a/cli/build-scripts/src/commands/docker.ts b/cli/build-scripts/src/commands/docker.ts index a17bbd6f3..b82d52603 100644 --- a/cli/build-scripts/src/commands/docker.ts +++ b/cli/build-scripts/src/commands/docker.ts @@ -1,5 +1,5 @@ import * as path from "path"; -import simpleGit from "simple-git"; +import simpleGit, { SimpleGit } from "simple-git"; import * as fs from "fs"; import { compare as semverCompare, parse as semverParse, SemVer } from "semver"; import * as child_process from "child_process"; @@ -24,8 +24,13 @@ export type DockerArgs = { logs?: string; }; +async function getLastCommitSha(git: SimpleGit): Promise { + return (await git.log({ n: 1 }))?.latest?.hash || "unknown"; +} + export async function docker(dir: string | undefined, args: DockerArgs): Promise { let version = args.version; + const projectRootDir = dir ? path.resolve(process.cwd(), dir) : process.cwd(); const dockerTag: ReleaseStream = args.release || "beta"; const tagPrefix = args.gitTagPrefix || "jitsu2"; console.log( @@ -37,6 +42,11 @@ export async function docker(dir: string | undefined, args: DockerArgs): Promise ], }) ); + console.log( + `📦 Project root directory: ${color.cyan(projectRootDir)}${ + dir ? ` (provided as ${color.cyan(dir)})` : ` (default)` + }}` + ); //git check that all changes are pulled from remote await git.fetch(); @@ -72,6 +82,9 @@ export async function docker(dir: string | undefined, args: DockerArgs): Promise `--platform ${args.platform || "linux/amd64"}`, `-t ${dockerImageName}:${dockerTag}`, `-t ${dockerImageName}:${version}`, + `--build-arg JITSU_BUILD_VERSION=${version}`, + `--build-arg JITSU_BUILD_DOCKER_TAG=${dockerTag}`, + `--build-arg JITSU_BUILD_COMMIT_SHA=${await getLastCommitSha(git)}`, `-f all.Dockerfile`, args.push ? "--push" : "--load", ".", @@ -98,7 +111,7 @@ export async function docker(dir: string | undefined, args: DockerArgs): Promise } const exitCode = await runCommand("docker", { args: [...dockerArgs], - cwd: dir, + cwd: projectRootDir, outputHandler: (data, opts) => { const dataStr = data.toString(); dataStr.split("\n").forEach(line => { diff --git a/console.Dockerfile b/console.Dockerfile deleted file mode 100644 index 0bf3b2ab3..000000000 --- a/console.Dockerfile +++ /dev/null @@ -1,41 +0,0 @@ -# Run `docker login`, use jitsucom account -# Build & push it with -# docker buildx build --platform linux/amd64 . -f console.Dockerfile --push -t jitsucom/console:latest - -FROM node:18-slim as base - -RUN apt-get update -y -RUN apt-get install nano curl bash netcat-traditional jq -y - -FROM base as builder - -RUN apt-get update -y -RUN apt-get install git openssl1.1 procps python3 make g++ -y -RUN npm -g install pnpm - -# Create app directory -WORKDIR /app -COPY pnpm-lock.yaml . -RUN --mount=type=cache,id=onetag_pnpm,target=/root/.local/share/pnpm/store/v3 pnpm fetch -COPY . . -RUN --mount=type=cache,id=onetag_pnpm,target=/root/.local/share/pnpm/store/v3 pnpm install -r --unsafe-perm -RUN --mount=type=cache,id=console_turborepo,target=/app/node_modules/.cache/turbo pnpm build -RUN export NEXTJS_STANDALONE_BUILD=1 && pnpm build -RUN rm .env* - -FROM base as runner - -WORKDIR /app -RUN npm -g install prisma@$(cat webapps/console/package.json | jq -r '.dependencies.prisma') -COPY --from=builder /app/docker-start-console.sh ./ -COPY --from=builder /app/webapps/console/prisma/schema.prisma ./ -COPY --from=builder /app/webapps/console/.next/standalone ./ -COPY --from=builder /app/webapps/console/.next/static ./webapps/console/.next/static -COPY --from=builder /app/webapps/console/public ./webapps/console/public - - -EXPOSE 3000 - -HEALTHCHECK CMD curl --fail http://localhost:3000/api/healthcheck || exit 1 - -ENTRYPOINT ["sh", "-c", "/app/docker-start-console.sh"] diff --git a/release.sh b/release.sh index f9a862350..0d72517dd 100755 --- a/release.sh +++ b/release.sh @@ -1,4 +1,4 @@ #!/usr/bin/env bash -npx jitsu-build-scripts@latest docker -t console,rotor --push $@ +pnpm run build-scripts docker ../../ -t console,rotor --push $@ diff --git a/rotor.Dockerfile b/rotor.Dockerfile deleted file mode 100644 index d958122a8..000000000 --- a/rotor.Dockerfile +++ /dev/null @@ -1,38 +0,0 @@ -# Run `docker login`, use jitsucom account -# Build & push it with -# docker buildx build --platform linux/amd64 . -f rotor.Dockerfile --push -t jitsucom/rotor:latest - - -FROM node:20-bullseye-slim as builder - -RUN apt-get update -y -RUN apt-get install nano curl git openssl1.1 procps python3 make g++ bash -y - -# Create app directory -WORKDIR /app -RUN npm -g install pnpm -COPY pnpm-lock.yaml . -RUN --mount=type=cache,id=onetag_pnpm,target=/root/.local/share/pnpm/store/v3 pnpm fetch -COPY . . -RUN --mount=type=cache,id=onetag_pnpm,target=/root/.local/share/pnpm/store/v3 pnpm install -r --unsafe-perm -RUN --mount=type=cache,id=rotor_turborepo,target=/app/node_modules/.cache/turbo pnpm build --filter=@jitsu-internal/rotor - - -FROM node:20-bullseye-slim AS runner - -RUN apt-get update -y -RUN apt-get install nano curl procps bash -y - -WORKDIR /app -RUN addgroup --system --gid 1001 runner -RUN adduser --system --uid 1001 runner -USER runner - -EXPOSE 3401 - - -COPY --from=builder /app/services/rotor/dist . - -ENV NODE_ENV=production - -ENTRYPOINT ["sh", "-c", "node --max-old-space-size=4096 --no-node-snapshot main.js"] diff --git a/rotorbuild.sh b/rotorbuild.sh deleted file mode 100755 index 566b51479..000000000 --- a/rotorbuild.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash - -docker buildx build --platform linux/amd64 . -f rotor.Dockerfile --push -t jitsucom/rotor:latest \ No newline at end of file diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index a1afc1531..f00c2fd13 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -21,6 +21,7 @@ import { redisLogger } from "./lib/redis-logger"; import { DummyMetrics, Metrics } from "./lib/metrics"; import { connectionsStore, functionsStore } from "./lib/entity-store"; import { Server } from "node:net"; +import { getApplicationVersion, getDiagnostics } from "./lib/version"; export const log = getLog("rotor"); @@ -169,6 +170,18 @@ function initHTTP(metrics: Metrics, geoResolver: GeoResolver) { } next(); }); + http.get("/version", (req, res) => { + res.json({ + ...getApplicationVersion(), + node: { + version: process.version, + platform: process.platform, + arch: process.arch, + env: process.env.NODE_ENV, + }, + diagnostics: isTruish(process.env.__DANGEROUS_ENABLE_FULL_DIAGNOSTICS) ? getDiagnostics() : undefined, + }); + }); http.get("/health", (req, res) => { res.json({ status: "pass", diff --git a/services/rotor/src/lib/version.ts b/services/rotor/src/lib/version.ts new file mode 100644 index 000000000..aa40c3cf2 --- /dev/null +++ b/services/rotor/src/lib/version.ts @@ -0,0 +1,67 @@ +import { isTruish } from "juava"; + +/** + * A little code duplication with console. Not ideal, although better than + * moving it to common dependency (juava). + */ +export type ApplicationVersion = { + /** + * Version as 3.2.1 or "dev" + */ + version: string; + /** + * "latest" or "beta" or "dev" + */ + stream: string; + + git?: { + //Id of latest commit + commitId: string; + }; +}; + +export type EnvVars = { + JITSU_VERSION_COMMIT_SHA?: string; + JITSU_VERSION_DOCKER_TAG?: string; + JITSU_VERSION_STRING?: string; + VERCEL_GIT_COMMIT_SHA?: string; +}; + +function getGit(env: EnvVars): ApplicationVersion["git"] { + if (env.JITSU_VERSION_COMMIT_SHA) { + return { + commitId: env.JITSU_VERSION_COMMIT_SHA, + }; + } else if (env.JITSU_VERSION_COMMIT_SHA) { + return { + commitId: env.JITSU_VERSION_COMMIT_SHA, + }; + } +} + +export function getApplicationVersion(): ApplicationVersion { + const env = process.env as EnvVars; + return { + version: env.JITSU_VERSION_STRING || "dev", + stream: env.JITSU_VERSION_DOCKER_TAG || "dev", + git: getGit(env), + }; +} + +function sortByKey(dict: Record): Record { + return Object.fromEntries(Object.entries(dict).sort(([a], [b]) => a.localeCompare(b))); +} + +export function getDiagnostics() { + if (isTruish(process.env.__DANGEROUS_ENABLE_FULL_DIAGNOSTICS)) { + return { + env: sortByKey(process.env), + proc: { + config: sortByKey(process.config), + versions: sortByKey(process.versions), + execPath: process.execPath, + argv: process.argv, + }, + }; + } +} diff --git a/webapps/console/lib/version.ts b/webapps/console/lib/version.ts new file mode 100644 index 000000000..ae1830a68 --- /dev/null +++ b/webapps/console/lib/version.ts @@ -0,0 +1,43 @@ +export type ApplicationVersion = { + /** + * Version as 3.2.1 or "dev" + */ + version: string; + /** + * "latest" or "beta" or "dev" + */ + stream: string; + + git?: { + //Id of latest commit + commitId: string; + }; +}; + +export type EnvVars = { + JITSU_VERSION_COMMIT_SHA?: string; + JITSU_VERSION_DOCKER_TAG?: string; + JITSU_VERSION_STRING?: string; + VERCEL_GIT_COMMIT_SHA?: string; +}; + +function getGit(env: EnvVars): ApplicationVersion["git"] { + if (env.JITSU_VERSION_COMMIT_SHA) { + return { + commitId: env.JITSU_VERSION_COMMIT_SHA, + }; + } else if (env.JITSU_VERSION_COMMIT_SHA) { + return { + commitId: env.JITSU_VERSION_COMMIT_SHA, + }; + } +} + +export function getApplicationVersion(): ApplicationVersion { + const env = process.env as EnvVars; + return { + version: env.JITSU_VERSION_STRING || "dev", + stream: env.JITSU_VERSION_DOCKER_TAG || "dev", + git: getGit(env), + }; +} diff --git a/webapps/console/next.config.js b/webapps/console/next.config.js index d2121b8f0..7da0de5ad 100644 --- a/webapps/console/next.config.js +++ b/webapps/console/next.config.js @@ -78,9 +78,9 @@ module.exports = { config.plugins.push(new opts.webpack.IgnorePlugin({ resourceRegExp: /^mongodb$/ })); config.plugins.push(new opts.webpack.IgnorePlugin({ resourceRegExp: /^posthog-node$/ })); } - if (opts.isServer) { - config.devtool = 'source-map' - } + // if (opts.isServer) { + config.devtool = "source-map"; + // } config.externals["isolated-vm"] = "require('isolated-vm')"; config.module.rules.push({ test: /\.txt$/, @@ -123,8 +123,9 @@ module.exports = withSentryConfig( // // Routes browser requests to Sentry through a Next.js rewrite to circumvent ad-blockers (increases server load) // tunnelRoute: "/monitoring", - // Hides source maps from generated client bundles - hideSourceMaps: true, + //enable source maps on client + hideSourceMaps: false, + productionBrowserSourceMaps: true, // Automatically tree-shake Sentry logger statements to reduce bundle size disableLogger: true, diff --git a/webapps/console/pages/api/version.ts b/webapps/console/pages/api/version.ts new file mode 100644 index 000000000..fbd002fc8 --- /dev/null +++ b/webapps/console/pages/api/version.ts @@ -0,0 +1,39 @@ +import { createRoute } from "../../lib/api"; +import { getApplicationVersion } from "../../lib/version"; +import { isTruish } from "juava"; + +function sortByKey(dict: Record): Record { + return Object.fromEntries(Object.entries(dict).sort(([a], [b]) => a.localeCompare(b))); +} + +function getDiagnostics() { + if (isTruish(process.env.__DANGEROUS_ENABLE_FULL_DIAGNOSTICS)) { + return { + env: sortByKey(process.env), + proc: { + config: sortByKey(process.config), + versions: sortByKey(process.versions), + execPath: process.execPath, + argv: process.argv, + }, + }; + } +} + +export default createRoute() + .GET({ + auth: false, + }) + .handler(async () => { + return { + ...getApplicationVersion(), + node: { + version: process.version, + platform: process.platform, + arch: process.arch, + env: process.env.NODE_ENV, + }, + diagnostics: getDiagnostics(), + }; + }) + .toNextApiHandler(); diff --git a/webapps/console/pages/signin.tsx b/webapps/console/pages/signin.tsx index 73196e736..61901ea4e 100644 --- a/webapps/console/pages/signin.tsx +++ b/webapps/console/pages/signin.tsx @@ -130,10 +130,21 @@ const NextAuthSignInPage = ({ csrfToken, providers }) => { }; export async function getServerSideProps(context) { + const providers = await getProviders(); + if (!providers) { + throw new Error( + [ + `No auth providers found. Please check your configuration and grep logs for CLIENT_FETCH_ERROR.`, + `Firebase configured via FIREBASE_AUTH: ${!!process.env.FIREBASE_AUTH}`, + `GitHub configured (via GITHUB_CLIENT_ID) : ${!!process.env.GITHUB_CLIENT_ID}`, + `Seed user configured (via SEED_USER_EMAIL) : ${!!process.env.SEED_USER_EMAIL}`, + ].join("\n") + ); + } return { props: { csrfToken: await getCsrfToken(context), - providers: await getProviders(), + providers: providers, publicPage: true, }, }; From 3a79d3a1ecabfd8f8d5b677ce9241b0c66a7466d Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 22 Feb 2024 16:43:18 +0400 Subject: [PATCH 0601/1353] rotor: introduce clickhouse events logger rotor: actually reduce fetch timeout ms to 5000 --- all.Dockerfile | 2 +- libs/core-functions/src/context.ts | 39 +++++-- .../core-functions/src/functions/lib/index.ts | 3 +- .../src/functions/udf_wrapper.ts | 8 +- libs/core-functions/src/index.ts | 3 +- pnpm-lock.yaml | 21 ++-- services/rotor/package.json | 1 + services/rotor/src/http/functions.ts | 100 ++++++++++-------- services/rotor/src/index.ts | 32 +++--- services/rotor/src/lib/clickhouse-logger.ts | 76 +++++++++++++ services/rotor/src/lib/functions-chain.ts | 17 +-- services/rotor/src/lib/message-handler.ts | 21 ++-- services/rotor/src/lib/redis-logger.ts | 8 +- services/rotor/src/lib/rotor.ts | 15 ++- types/protocols/functions.d.ts | 7 -- webapps/console/package.json | 2 +- webapps/ee-api/package.json | 2 +- 17 files changed, 234 insertions(+), 123 deletions(-) create mode 100644 services/rotor/src/lib/clickhouse-logger.ts diff --git a/all.Dockerfile b/all.Dockerfile index 3b18437c4..a7ee1b3bc 100644 --- a/all.Dockerfile +++ b/all.Dockerfile @@ -75,4 +75,4 @@ ENV JITSU_VERSION_COMMIT_SHA=${JITSU_BUILD_COMMIT_SHA} ENV JITSU_VERSION_DOCKER_TAG=${JITSU_BUILD_DOCKER_TAG} ENV JITSU_VERSION_STRING=${JITSU_BUILD_VERSION} -ENTRYPOINT ["sh", "-c", "node --no-node-snapshot --max-old-space-size=1024 main.js"] +ENTRYPOINT ["sh", "-c", "node --no-node-snapshot --max-old-space-size=2048 main.js"] diff --git a/libs/core-functions/src/context.ts b/libs/core-functions/src/context.ts index 35bde34bb..70d6b73a8 100644 --- a/libs/core-functions/src/context.ts +++ b/libs/core-functions/src/context.ts @@ -1,9 +1,32 @@ -import { EventContext, EventsStore, FetchOpts, FullContext, Store } from "@jitsu/protocols/functions"; -import { getErrorMessage, getLog, stopwatch } from "juava"; +import { EventContext, FetchOpts, FullContext, Store } from "@jitsu/protocols/functions"; +import { getErrorMessage, getLog, LogLevel, stopwatch } from "juava"; import { SystemContext } from "./functions/lib"; const log = getLog("functions-context"); +/** + * Store for incoming events, destination results and function log messages + */ +export interface EventsStore { + log(connectionId: string, level: LogLevel, msg: Record): void; + close(): void; +} + +export function MultiEventsStore(stores: EventsStore[]): EventsStore { + return { + log(connectionId: string, level: LogLevel, msg: Record): void { + for (const store of stores) { + store.log(connectionId, level, msg); + } + }, + close(): void { + for (const store of stores) { + store.close(); + } + }, + }; +} + export function createFullContext( functionId: string, eventsStore: EventsStore, @@ -53,7 +76,7 @@ export function createFullContext( } const elapsedMs = sw.elapsedMs(); if (logToRedis) { - eventsStore.log(connectionId, false, { ...baseInfo, error: getErrorMessage(err), elapsedMs: elapsedMs }); + eventsStore.log(connectionId, "warn", { ...baseInfo, error: getErrorMessage(err), elapsedMs: elapsedMs }); } log .atWarn() @@ -70,7 +93,7 @@ export function createFullContext( const cloned = fetchResult.clone(); const respText = await trimResponse(cloned); if (logToRedis) { - eventsStore.log(connectionId, false, { + eventsStore.log(connectionId, fetchResult.status >= 300 ? "warn" : "info", { ...baseInfo, status: fetchResult.status, statusText: fetchResult.statusText, @@ -91,7 +114,7 @@ export function createFullContext( log: { debug: (message, ...args: any[]) => { log.atDebug().log(`[CON:${connectionId}]: [f:${id}][DEBUG]: ${message}`, ...args); - eventsStore.log(connectionId, false, { + eventsStore.log(connectionId, "debug", { type: "log-debug", functionId: id, functionType: type, @@ -103,7 +126,7 @@ export function createFullContext( }, warn: (message, ...args: any[]) => { log.atWarn().log(`[CON:${connectionId}]: [f:${id}][WARN]: ${message}`, ...args); - eventsStore.log(connectionId, false, { + eventsStore.log(connectionId, "warn", { type: "log-warn", functionId: id, functionType: type, @@ -114,7 +137,7 @@ export function createFullContext( }); }, error: (message, ...args: any[]) => { - eventsStore.log(connectionId, true, { + eventsStore.log(connectionId, "error", { type: "log-error", functionId: id, functionType: type, @@ -135,7 +158,7 @@ export function createFullContext( }, info: (message, ...args: any[]) => { log.atInfo().log(`[CON:${connectionId}]: [f:${id}][INFO]: ${message}`, ...args); - eventsStore.log(connectionId, false, { + eventsStore.log(connectionId, "info", { type: "log-info", functionId: id, functionType: type, diff --git a/libs/core-functions/src/functions/lib/index.ts b/libs/core-functions/src/functions/lib/index.ts index 86afa9db6..2865d2cf3 100644 --- a/libs/core-functions/src/functions/lib/index.ts +++ b/libs/core-functions/src/functions/lib/index.ts @@ -5,7 +5,8 @@ import { ProcessingContext, ServerContextReservedProps, } from "@jitsu/protocols/analytics"; -import { AnonymousEventsStore, EventsStore, TTLStore } from "@jitsu/protocols/functions"; +import { AnonymousEventsStore, TTLStore } from "@jitsu/protocols/functions"; +import { EventsStore } from "../../context"; export type MetricsMeta = { workspaceId: string; diff --git a/libs/core-functions/src/functions/udf_wrapper.ts b/libs/core-functions/src/functions/udf_wrapper.ts index 44b23b9f4..80e0d5623 100644 --- a/libs/core-functions/src/functions/udf_wrapper.ts +++ b/libs/core-functions/src/functions/udf_wrapper.ts @@ -1,8 +1,8 @@ -import { getLog } from "juava"; +import { getLog, LogLevel } from "juava"; import { Isolate, ExternalCopy, Callback, Reference } from "isolated-vm"; -import { EventContext, EventsStore, FetchOpts, FuncReturn, JitsuFunction, Store } from "@jitsu/protocols/functions"; +import { EventContext, FetchOpts, FuncReturn, JitsuFunction, Store } from "@jitsu/protocols/functions"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; -import { createFullContext } from "../context"; +import { createFullContext, EventsStore } from "../context"; import { createMemoryStore, isDropResult, memoryStoreDump } from "../index"; import { functionsLibCode, wrapperCode } from "./lib/udf-wrapper-code"; import { parseUserAgent } from "./lib/ua"; @@ -279,7 +279,7 @@ export async function UDFTestRun({ } const eventsStore: EventsStore = { - log(connectionId: string, error: boolean, msg: Record) { + log(connectionId: string, level: LogLevel, msg: Record) { switch (msg.type) { case "log-info": case "log-warn": diff --git a/libs/core-functions/src/index.ts b/libs/core-functions/src/index.ts index 2270871ee..3042be0c0 100644 --- a/libs/core-functions/src/index.ts +++ b/libs/core-functions/src/index.ts @@ -59,7 +59,8 @@ export function isDropResult(result: FuncReturn): boolean { export * as bulkerDestination from "./functions/bulker-destination"; export { UDFWrapper, UDFTestRun } from "./functions/udf_wrapper"; export type { UDFTestRequest, UDFTestResponse, logType } from "./functions/udf_wrapper"; -export { createFullContext } from "./context"; +export { createFullContext, MultiEventsStore } from "./context"; +export type { EventsStore } from "./context"; export * as mixpanelDestination from "./functions/mixpanel-destination"; export * as ga4Destination from "./functions/ga4-destination"; export * as webhookDestination from "./functions/webhook-destination"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cd5376880..00ba88d25 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -582,6 +582,9 @@ importers: '@amplitude/ua-parser-js': specifier: ^0.7.33 version: 0.7.33 + '@clickhouse/client': + specifier: ^0.2.10 + version: 0.2.10 '@jitsu/core-functions': specifier: workspace:* version: link:../../libs/core-functions @@ -781,8 +784,8 @@ importers: specifier: ^1.5.6 version: 1.8.1(react-dom@18.2.0)(react@18.2.0) '@clickhouse/client': - specifier: ^0.2.4 - version: 0.2.4 + specifier: ^0.2.10 + version: 0.2.10 '@dnd-kit/core': specifier: ^6.0.8 version: 6.0.8(react-dom@18.2.0)(react@18.2.0) @@ -1094,8 +1097,8 @@ importers: specifier: ^3.418.0 version: 3.418.0 '@clickhouse/client': - specifier: ^0.2.4 - version: 0.2.4 + specifier: ^0.2.10 + version: 0.2.10 '@types/node': specifier: 18.11.12 version: 18.11.12 @@ -3306,15 +3309,15 @@ packages: /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - /@clickhouse/client-common@0.2.4: - resolution: {integrity: sha512-XVmxvU0kACANTmQSfdYCIA/reDkH5353AOvfwKRXMNwag8pX2IIoO8zoJjZvtfbGPy5LoI+UKj3aoiKSl8Z8qA==} + /@clickhouse/client-common@0.2.10: + resolution: {integrity: sha512-BvTY0IXS96y9RUeNCpKL4HUzHmY80L0lDcGN0lmUD6zjOqYMn78+xyHYJ/AIAX7JQsc+/KwFt2soZutQTKxoGQ==} dev: false - /@clickhouse/client@0.2.4: - resolution: {integrity: sha512-qeKYMHoNxRG8xQ4CPEnPcAbreivhWm3QTw9v5BkovS9j/mnt9NcUzWpmdZTsL/vTl63fSTXVkiA9/QY++r3/qQ==} + /@clickhouse/client@0.2.10: + resolution: {integrity: sha512-ZwBgzjEAFN/ogS0ym5KHVbR7Hx/oYCX01qGp2baEyfN2HM73kf/7Vp3GvMHWRy+zUXISONEtFv7UTViOXnmFrg==} engines: {node: '>=16'} dependencies: - '@clickhouse/client-common': 0.2.4 + '@clickhouse/client-common': 0.2.10 dev: false /@cspotcode/source-map-support@0.8.1: diff --git a/services/rotor/package.json b/services/rotor/package.json index d806c8a3d..b12832ee6 100644 --- a/services/rotor/package.json +++ b/services/rotor/package.json @@ -43,6 +43,7 @@ "tar": "^6.2.0", "tslib": "^2.4.0", "jsondiffpatch": "workspace:*", + "@clickhouse/client": "^0.2.10", "semver": "^7.5.4" }, "devDependencies": { diff --git a/services/rotor/src/http/functions.ts b/services/rotor/src/http/functions.ts index b2fd9f76b..089234cb9 100644 --- a/services/rotor/src/http/functions.ts +++ b/services/rotor/src/http/functions.ts @@ -10,6 +10,7 @@ import { parse as semverParse } from "semver"; import * as jsondiffpatch from "jsondiffpatch"; import Prometheus from "prom-client"; +import { EventsStore } from "@jitsu/core-functions"; const jsondiffpatchInstance = jsondiffpatch.create(); const log = getLog("functions_handler"); @@ -20,54 +21,63 @@ const handlerMetric = new Prometheus.Counter({ labelNames: ["connectionId", "status"] as const, }); -export const FunctionsHandler = (metrics: Metrics, geoResolver?: GeoResolver) => async (req, res) => { - const message = req.body as IngestMessage; - //log.atInfo().log(`Functions handler. Message ID: ${message.messageId} connectionId: ${message.connectionId}`); - const result = await rotorMessageHandler(message, {}, metrics, geoResolver); - if (result?.events && result.events.length > 0) { - res.json(result.events); - } else { - res.status(204).send(); - } -}; - -export const FunctionsHandlerMulti = (metrics: Metrics, geoResolver?: GeoResolver) => async (req, res, next) => { - const connectionIds = (req.query.ids ?? "").split(",") as string[]; - const message = req.body as IngestMessage; - const functionsFetchTimeout = req.headers["x-request-timeout-ms"] - ? parseInt(req.headers["x-request-timeout-ms"] as string) - : 2000; - const prom = connectionIds - .filter(id => !!id) - .map(id => { - //log.atInfo().log(`Functions handler2. Message ID: ${message.messageId} connectionId: ${id}`); - return rotorMessageHandler( - message, - { [CONNECTION_IDS_HEADER]: id }, - metrics, - geoResolver, - undefined, - 0, - functionsFetchTimeout - ); +export const FunctionsHandler = + (eventsLogger: EventsStore, metrics: Metrics, geoResolver?: GeoResolver) => async (req, res) => { + const message = req.body as IngestMessage; + //log.atInfo().log(`Functions handler. Message ID: ${message.messageId} connectionId: ${message.connectionId}`); + const result = await rotorMessageHandler(message, { + eventsLogger, + metrics, + geoResolver, }); - await Promise.all(prom) - .then(results => { - connectionIds.forEach((id, i) => { - handlerMetric.inc({ connectionId: id, status: "success" }, 1); + if (result?.events && result.events.length > 0) { + res.json(result.events); + } else { + res.status(204).send(); + } + }; + +export const FunctionsHandlerMulti = + (eventsLogger: EventsStore, metrics: Metrics, geoResolver?: GeoResolver) => async (req, res, next) => { + const connectionIds = (req.query.ids ?? "").split(",") as string[]; + const message = req.body as IngestMessage; + const functionsFetchTimeout = req.headers["x-request-timeout-ms"] + ? parseInt(req.headers["x-request-timeout-ms"] as string) + : 2000; + const prom = connectionIds + .filter(id => !!id) + .map(id => { + //log.atInfo().log(`Functions handler2. Message ID: ${message.messageId} connectionId: ${id}`); + return rotorMessageHandler( + message, + { + eventsLogger, + metrics, + geoResolver, + }, + { [CONNECTION_IDS_HEADER]: id }, + undefined, + 0, + functionsFetchTimeout + ); }); - const events = Object.fromEntries( - results.map(result => [result?.connectionId, mapDiff(message, result?.events)]) - ); - res.json(events); - }) - .catch(e => { - connectionIds.forEach((id, i) => { - handlerMetric.inc({ connectionId: id, status: "error" }, 1); + await Promise.all(prom) + .then(results => { + connectionIds.forEach((id, i) => { + handlerMetric.inc({ connectionId: id, status: "success" }, 1); + }); + const events = Object.fromEntries( + results.map(result => [result?.connectionId, mapDiff(message, result?.events)]) + ); + res.json(events); + }) + .catch(e => { + connectionIds.forEach((id, i) => { + handlerMetric.inc({ connectionId: id, status: "error" }, 1); + }); + next(e); }); - next(e); - }); -}; + }; function mapDiff(message: IngestMessage, newEvents?: AnyEvent[]) { if (!newEvents) { diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index f00c2fd13..d76e569bf 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -1,15 +1,7 @@ import { checkHash, checkRawToken, disableService, getLog, randomId, setServerJsonFormat, isTruish } from "juava"; -import { - connectToKafka, - destinationMessagesTopic, - getCredentialsFromEnv, - rotorConsumerGroupId, -} from "./lib/kafka-config"; +import { destinationMessagesTopic, getCredentialsFromEnv, rotorConsumerGroupId } from "./lib/kafka-config"; import { kafkaRotor } from "./lib/rotor"; -import { mongodb } from "@jitsu/core-functions"; -import minimist from "minimist"; -import { glob } from "glob"; -import fs from "fs"; +import { EventsStore, mongodb, MultiEventsStore } from "@jitsu/core-functions"; import express from "express"; import { UDFRunHandler } from "./http/udf"; import Prometheus from "prom-client"; @@ -22,6 +14,7 @@ import { DummyMetrics, Metrics } from "./lib/metrics"; import { connectionsStore, functionsStore } from "./lib/entity-store"; import { Server } from "node:net"; import { getApplicationVersion, getDiagnostics } from "./lib/version"; +import { createClickhouseLogger } from "./lib/clickhouse-logger"; export const log = getLog("rotor"); @@ -58,11 +51,16 @@ async function main() { let httpServer: Server; let metricsServer: Server | undefined; let geoResolver: GeoResolver; + let eventsLogger: EventsStore; try { Prometheus.collectDefaultMetrics(); await mongodb.waitInit(); await redis.waitInit(); - await redisLogger.waitInit(); + const eventsLoggers = [await redisLogger.waitInit()]; + if (process.env.CLICKHOUSE_URL) { + eventsLoggers.push(createClickhouseLogger()); + } + eventsLogger = MultiEventsStore(eventsLoggers); const connStore = await connectionsStore.get(); if (!connStore.enabled) { @@ -88,6 +86,7 @@ async function main() { } connectionsStore.stop(); functionsStore.stop(); + eventsLogger.close(); redisLogger.close(); mongodb.close(); redis.close(); @@ -112,6 +111,7 @@ async function main() { const consumerGroupId = rotorConsumerGroupId(); const rotor = kafkaRotor({ credentials: getCredentialsFromEnv(), + eventsLogger, kafkaTopics: kafkaTopics, consumerGroupId, geoResolver, @@ -122,7 +122,7 @@ async function main() { .start() .then(chMetrics => { log.atInfo().log(`Kafka processing started. Listening for topics ${kafkaTopics} with group ${consumerGroupId}`); - httpServer = initHTTP(chMetrics, geoResolver); + httpServer = initHTTP(eventsLogger, chMetrics, geoResolver); }) .catch(async e => { log.atError().withCause(e).log("Failed to start rotor processing"); @@ -137,7 +137,7 @@ async function main() { }); }); } else { - httpServer = initHTTP(DummyMetrics, geoResolver); + httpServer = initHTTP(eventsLogger, DummyMetrics, geoResolver); signalTraps.forEach(type => { process.once(type, () => { gracefulShutdown(); @@ -146,7 +146,7 @@ async function main() { } } -function initHTTP(metrics: Metrics, geoResolver: GeoResolver) { +function initHTTP(eventsLogger: EventsStore, metrics: Metrics, geoResolver: GeoResolver) { http.use((req, res, next) => { if (req.path === "/health") { return next(); @@ -200,8 +200,8 @@ function initHTTP(metrics: Metrics, geoResolver: GeoResolver) { }); }); http.post("/udfrun", UDFRunHandler); - http.post("/func", FunctionsHandler(metrics, geoResolver)); - http.post("/func/multi", FunctionsHandlerMulti(metrics, geoResolver)); + http.post("/func", FunctionsHandler(eventsLogger, metrics, geoResolver)); + http.post("/func/multi", FunctionsHandlerMulti(eventsLogger, metrics, geoResolver)); const httpServer = http.listen(rotorHttpPort, () => { log.atInfo().log(`Listening on port ${rotorHttpPort}`); started = true; diff --git a/services/rotor/src/lib/clickhouse-logger.ts b/services/rotor/src/lib/clickhouse-logger.ts new file mode 100644 index 000000000..8f14da301 --- /dev/null +++ b/services/rotor/src/lib/clickhouse-logger.ts @@ -0,0 +1,76 @@ +import { getLog, LogLevel, requireDefined } from "juava"; + +export const log = getLog("clickhouseLogger"); + +import { createClient } from "@clickhouse/client"; +import { EventsStore } from "@jitsu/core-functions"; + +type LogEntry = { + actorId: string; + type: string; + timestamp: Date; + level: LogLevel; + message: any; +}; + +export function createClickhouseLogger(): EventsStore { + const buffer: LogEntry[] = []; + + const clickhouse = createClient({ + host: requireDefined(process.env.CLICKHOUSE_URL, `env CLICKHOUSE_URL is not defined`), + username: process.env.CLICKHOUSE_USERNAME || "default", + password: requireDefined(process.env.CLICKHOUSE_PASSWORD, `env CLICKHOUSE_PASSWORD is not defined`), + clickhouse_settings: { + async_insert: 1, + wait_for_async_insert: 0, + async_insert_max_data_size: "5000000", + async_insert_busy_timeout_ms: 5000, + date_time_input_format: "best_effort", + }, + }); + + const flush = async () => { + if (buffer.length === 0) { + return; + } + const copy = [...buffer]; + buffer.length = 0; + const res = await clickhouse.insert({ + table: "newjitsu_metrics.events_log", + format: "JSONEachRow", + values: copy, + }); + if (res.executed) { + log.atInfo().log(`Inserted ${copy.length} records.`); + } else { + log.atError().log(`Failed to insert ${copy.length} records: ${JSON.stringify(res)}`); + } + }; + + const interval = setInterval(async () => { + if (Object.keys(buffer).length === 0) { + return; + } + await flush(); + }, 5000); + + return { + log: (connectionId: string, level: LogLevel, message) => { + if (level === "debug") { + return; + } + const logEntry = { + actorId: connectionId, + type: "function", + timestamp: new Date(), + level, + message, + }; + buffer.push(logEntry); + }, + close: () => { + clearInterval(interval); + clickhouse.close(); + }, + }; +} diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index 037ecd580..cd6dd2cad 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -1,14 +1,7 @@ -import { - AnyEvent, - EventContext, - EventsStore, - FullContext, - FuncReturn, - JitsuFunction, - Store, -} from "@jitsu/protocols/functions"; +import { AnyEvent, EventContext, FullContext, FuncReturn, JitsuFunction, Store } from "@jitsu/protocols/functions"; import { createFullContext, + EventsStore, getBuiltinFunction, isDropResult, MetricsMeta, @@ -47,7 +40,7 @@ const functionsInFlight = new Prometheus.Gauge({ const functionsTime = new Prometheus.Histogram({ name: "rotor_functions_time", help: "Functions execution time in ms", - buckets: [1, 10, 100, 200, 1000, 10000], + buckets: [1, 10, 100, 200, 1000, 2000, 3000, 4000, 5000], // add `as const` here to enforce label names labelNames: ["connectionId", "functionId"] as const, }); @@ -104,7 +97,7 @@ export function buildFunctionChain( connection: EnrichedConnectionConfig, func: EntityStore, functionsFilter?: (id: string) => boolean, - fetchTimeoutMs: number = 15000 + fetchTimeoutMs: number = 5000 ) { let mainFunction; const connectionData = connection.options as any; @@ -232,7 +225,7 @@ export async function runChain( store: Store, eventContext: EventContext, systemContext?: SystemContext, - fetchTimeoutMs: number = 15000 + fetchTimeoutMs: number = 5000 ): Promise { const execLog: FunctionExecLog = []; let events = [event]; diff --git a/services/rotor/src/lib/message-handler.ts b/services/rotor/src/lib/message-handler.ts index f0b410dcf..b4d6072c8 100644 --- a/services/rotor/src/lib/message-handler.ts +++ b/services/rotor/src/lib/message-handler.ts @@ -16,8 +16,8 @@ import { parseUserAgent, SystemContext, createTtlStore, + EventsStore, } from "@jitsu/core-functions"; -import { redisLogger } from "./redis-logger"; import { buildFunctionChain, checkError, runChain } from "./functions-chain"; import { redis } from "./redis"; import { EnrichedConnectionConfig } from "./config-types"; @@ -26,14 +26,19 @@ export const log = getLog("rotor"); const anonymousEventsStore = mongoAnonymousEventsStore(); const fastStoreWorskpaceId = (process.env.FAST_STORE_WORKSPACE_ID ?? "").split(",").filter(x => x.length > 0); +export type MessageHandlerContext = { + eventsLogger: EventsStore; + metrics?: Metrics; + geoResolver?: GeoResolver; +}; + export async function rotorMessageHandler( _message: string | object | undefined, + rotorContext: MessageHandlerContext, headers?, - metrics?: Metrics, - geoResolver?: GeoResolver, functionsFilter?: (id: string) => boolean, retries: number = 0, - fetchTimeoutMs: number = 15000 + fetchTimeoutMs: number = 5000 ) { if (!_message) { return; @@ -46,7 +51,7 @@ export async function rotorMessageHandler( if (!funcStore || !funcStore.enabled) { throw newError("Functions store is not enabled"); } - const eventStore = redisLogger(); + const eventStore = rotorContext.eventsLogger; const message = (typeof _message === "string" ? JSON.parse(_message) : _message) as IngestMessage; const connectionId = @@ -69,8 +74,8 @@ export async function rotorMessageHandler( const geo = Object.keys(event.context.geo || {}).length > 0 ? event.context.geo - : geoResolver && event.context.ip - ? await geoResolver.resolve(event.context.ip) + : rotorContext.geoResolver && event.context.ip + ? await rotorContext.geoResolver.resolve(event.context.ip) : undefined; event.context.geo = geo; const ctx: EventContext = { @@ -120,7 +125,7 @@ export async function rotorMessageHandler( const chainRes = await runChain(funcChain, event, eventStore, store, ctx, systemContext, fetchTimeoutMs); chainRes.connectionId = connectionId; - metrics?.logMetrics(chainRes.execLog); + rotorContext.metrics?.logMetrics(chainRes.execLog); checkError(chainRes); return chainRes; } diff --git a/services/rotor/src/lib/redis-logger.ts b/services/rotor/src/lib/redis-logger.ts index 4ca0be660..a14fbe5ef 100644 --- a/services/rotor/src/lib/redis-logger.ts +++ b/services/rotor/src/lib/redis-logger.ts @@ -1,6 +1,6 @@ import { getLog, getSingleton } from "juava"; -import { EventsStore } from "@jitsu/protocols/functions"; import { redis } from "./redis"; +import { EventsStore } from "@jitsu/core-functions"; export const log = getLog("redisLogger"); @@ -60,14 +60,14 @@ export function createRedisLogger(): EventsStore { }, 5000); return { - log: (connectionId: string, error, msg) => { + log: (connectionId: string, level, msg) => { const key = (isErr: boolean) => `events_log:functions.${isErr ? "error" : "all"}#${connectionId}`; try { if (msg.type === "log-debug") { return; } - const logEntry = JSON.stringify({ timestamp: new Date().toISOString(), error, ...msg }); - if (error) { + const logEntry = JSON.stringify({ timestamp: new Date().toISOString(), error: level === "error", ...msg }); + if (level === "error") { put(key(true), logEntry); } put(key(false), logEntry); diff --git a/services/rotor/src/lib/rotor.ts b/services/rotor/src/lib/rotor.ts index e97ccd6cf..013c61f55 100644 --- a/services/rotor/src/lib/rotor.ts +++ b/services/rotor/src/lib/rotor.ts @@ -12,6 +12,8 @@ import { FuncChainResult } from "./functions-chain"; import type { Admin, Consumer, Producer, KafkaMessage } from "kafkajs"; import { CompressionTypes } from "kafkajs"; import { GeoResolver } from "./maxmind"; +import { MessageHandlerContext } from "./message-handler"; +import { EventsStore } from "@jitsu/core-functions"; const log = getLog("kafka-rotor"); @@ -26,13 +28,13 @@ export type KafkaRotorConfig = { credentials: KafkaCredentials; consumerGroupId: string; kafkaTopics: string[]; + eventsLogger: EventsStore; kafkaClientId?: string; geoResolver?: GeoResolver; handle: ( message: string, + rotorContext: MessageHandlerContext, headers?, - metrics?: Metrics, - geoResolver?: GeoResolver, functionsFilter?: (id: string) => boolean, retries?: number ) => Promise; @@ -44,7 +46,7 @@ export type KafkaRotor = { }; export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { - const { kafkaTopics, consumerGroupId, handle, kafkaClientId = "kafka-rotor", geoResolver } = cfg; + const { kafkaTopics, consumerGroupId, eventsLogger, handle, kafkaClientId = "kafka-rotor", geoResolver } = cfg; let consumer: Consumer; let producer: Producer; let admin: Admin; @@ -132,12 +134,15 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { const conProms = connectionIds.map(connectionId => handle( value.toString(), + { + eventsLogger, + metrics, + geoResolver, + }, { ...headers, [CONNECTION_IDS_HEADER]: connectionId, }, - metrics, - geoResolver, retriedFunctionId ? id => { if (retriedFunctionId.startsWith("udf.")) { diff --git a/types/protocols/functions.d.ts b/types/protocols/functions.d.ts index 21792c2f2..66500d3d5 100644 --- a/types/protocols/functions.d.ts +++ b/types/protocols/functions.d.ts @@ -37,13 +37,6 @@ export interface TTLStore extends Store { getWithTTL(key: string): Promise<{ value: any; ttl: number } | undefined>; } -/** - * Store for incoming events, destination results and function log messages - */ -export interface EventsStore { - log(connectionId: string, error: boolean, msg: Record): void; - close(): void; -} /** * A special properties that user can set on an event to define how * event will be processed further diff --git a/webapps/console/package.json b/webapps/console/package.json index 4b751a42a..93dbaaecf 100644 --- a/webapps/console/package.json +++ b/webapps/console/package.json @@ -24,7 +24,7 @@ }, "dependencies": { "@ant-design/cssinjs": "^1.5.6", - "@clickhouse/client": "^0.2.4", + "@clickhouse/client": "^0.2.10", "@dnd-kit/core": "^6.0.8", "@dnd-kit/modifiers": "^6.0.1", "@dnd-kit/sortable": "^7.0.2", diff --git a/webapps/ee-api/package.json b/webapps/ee-api/package.json index 77ee5cccd..6cbe89e25 100644 --- a/webapps/ee-api/package.json +++ b/webapps/ee-api/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "@aws-sdk/client-s3": "^3.418.0", - "@clickhouse/client": "^0.2.4", + "@clickhouse/client": "^0.2.10", "@types/node": "18.11.12", "@types/react": "18.0.28", "@types/react-dom": "18.0.11", From e4ed3e14a722864079d7e4305b6dc2c1706dc231 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 22 Feb 2024 18:37:59 +0400 Subject: [PATCH 0602/1353] rotor: ratelimit event logs --- libs/core-functions/src/context.ts | 4 ++-- pnpm-lock.yaml | 9 +++++++- services/rotor/package.json | 3 ++- services/rotor/src/lib/clickhouse-logger.ts | 24 ++++++++++++++------- 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/libs/core-functions/src/context.ts b/libs/core-functions/src/context.ts index 70d6b73a8..7b865d2e6 100644 --- a/libs/core-functions/src/context.ts +++ b/libs/core-functions/src/context.ts @@ -1,5 +1,5 @@ import { EventContext, FetchOpts, FullContext, Store } from "@jitsu/protocols/functions"; -import { getErrorMessage, getLog, LogLevel, stopwatch } from "juava"; +import { getErrorMessage, getLog, LogLevel, newError, stopwatch } from "juava"; import { SystemContext } from "./functions/lib"; const log = getLog("functions-context"); @@ -72,7 +72,7 @@ export function createFullContext( fetchResult = await fetch(url, internalInit); } catch (err: any) { if (err.name === "AbortError") { - err.message = `Fetch request exceeded timeout ${fetchTimeoutMs}ms and was aborted`; + err = newError(`Fetch request exceeded timeout ${fetchTimeoutMs}ms and was aborted`, err); } const elapsedMs = sw.elapsedMs(); if (logToRedis) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 00ba88d25..1f12c488e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -654,6 +654,9 @@ importers: prom-client: specifier: ^14.2.0 version: 14.2.0 + rate-limiter-flexible: + specifier: ^5.0.0 + version: 5.0.0 semver: specifier: ^7.5.4 version: 7.5.4 @@ -10772,7 +10775,7 @@ packages: '@babel/core': 7.21.4 find-cache-dir: 4.0.0 schema-utils: 4.0.0 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.88.2(webpack-cli@5.1.4) dev: true /babel-plugin-istanbul@6.1.1: @@ -22773,6 +22776,10 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} + /rate-limiter-flexible@5.0.0: + resolution: {integrity: sha512-ivCyLBwPtR5IRrz+aZnztVwX16ZK3iAjdlW21I/vjHq56at5Zb8eIefDzODg8R7hwPOHpBtb6Pj9Zdmn0nRb8g==} + dev: false + /raw-body@2.4.1: resolution: {integrity: sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==} engines: {node: '>= 0.8'} diff --git a/services/rotor/package.json b/services/rotor/package.json index b12832ee6..1b71b369c 100644 --- a/services/rotor/package.json +++ b/services/rotor/package.json @@ -44,7 +44,8 @@ "tslib": "^2.4.0", "jsondiffpatch": "workspace:*", "@clickhouse/client": "^0.2.10", - "semver": "^7.5.4" + "semver": "^7.5.4", + "rate-limiter-flexible": "^5.0.0" }, "devDependencies": { "@babel/preset-env": "^7.23.2", diff --git a/services/rotor/src/lib/clickhouse-logger.ts b/services/rotor/src/lib/clickhouse-logger.ts index 8f14da301..2526c6455 100644 --- a/services/rotor/src/lib/clickhouse-logger.ts +++ b/services/rotor/src/lib/clickhouse-logger.ts @@ -4,6 +4,7 @@ export const log = getLog("clickhouseLogger"); import { createClient } from "@clickhouse/client"; import { EventsStore } from "@jitsu/core-functions"; +import { RateLimiterMemory } from "rate-limiter-flexible"; type LogEntry = { actorId: string; @@ -29,6 +30,11 @@ export function createClickhouseLogger(): EventsStore { }, }); + const rateLimiter = new RateLimiterMemory({ + points: 20, + duration: 5, + }); + const flush = async () => { if (buffer.length === 0) { return; @@ -59,14 +65,16 @@ export function createClickhouseLogger(): EventsStore { if (level === "debug") { return; } - const logEntry = { - actorId: connectionId, - type: "function", - timestamp: new Date(), - level, - message, - }; - buffer.push(logEntry); + rateLimiter.consume(connectionId + "_" + level, 1).then(() => { + const logEntry = { + actorId: connectionId, + type: "function", + timestamp: new Date(), + level, + message, + }; + buffer.push(logEntry); + }); }, close: () => { clearInterval(interval); From 2b434cfca73945b10dc1ac3fbaae5795f985109a Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 22 Feb 2024 18:52:21 +0400 Subject: [PATCH 0603/1353] rotor: ratelimit event logs --- services/rotor/src/lib/clickhouse-logger.ts | 23 ++++++++++++--------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/services/rotor/src/lib/clickhouse-logger.ts b/services/rotor/src/lib/clickhouse-logger.ts index 2526c6455..7ce04c545 100644 --- a/services/rotor/src/lib/clickhouse-logger.ts +++ b/services/rotor/src/lib/clickhouse-logger.ts @@ -65,16 +65,19 @@ export function createClickhouseLogger(): EventsStore { if (level === "debug") { return; } - rateLimiter.consume(connectionId + "_" + level, 1).then(() => { - const logEntry = { - actorId: connectionId, - type: "function", - timestamp: new Date(), - level, - message, - }; - buffer.push(logEntry); - }); + rateLimiter + .consume(connectionId + "_" + level, 1) + .then(() => { + const logEntry = { + actorId: connectionId, + type: "function", + timestamp: new Date(), + level, + message, + }; + buffer.push(logEntry); + }) + .catch(() => {}); }, close: () => { clearInterval(interval); From c3f64682c80002d2f2161bda00a7fdf78a98c8dc Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 22 Feb 2024 19:08:09 +0400 Subject: [PATCH 0604/1353] rotor: yet another graceful shutdown fix --- all.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/all.Dockerfile b/all.Dockerfile index a7ee1b3bc..444907360 100644 --- a/all.Dockerfile +++ b/all.Dockerfile @@ -75,4 +75,4 @@ ENV JITSU_VERSION_COMMIT_SHA=${JITSU_BUILD_COMMIT_SHA} ENV JITSU_VERSION_DOCKER_TAG=${JITSU_BUILD_DOCKER_TAG} ENV JITSU_VERSION_STRING=${JITSU_BUILD_VERSION} -ENTRYPOINT ["sh", "-c", "node --no-node-snapshot --max-old-space-size=2048 main.js"] +CMD ["node --no-node-snapshot --max-old-space-size=2048 main.js"] From fd52d673a73506d629eec20c3b464733a2a2157f Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 22 Feb 2024 19:17:45 +0400 Subject: [PATCH 0605/1353] rotor: yet another graceful shutdown fix --- all.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/all.Dockerfile b/all.Dockerfile index 444907360..f4ad8bac5 100644 --- a/all.Dockerfile +++ b/all.Dockerfile @@ -75,4 +75,4 @@ ENV JITSU_VERSION_COMMIT_SHA=${JITSU_BUILD_COMMIT_SHA} ENV JITSU_VERSION_DOCKER_TAG=${JITSU_BUILD_DOCKER_TAG} ENV JITSU_VERSION_STRING=${JITSU_BUILD_VERSION} -CMD ["node --no-node-snapshot --max-old-space-size=2048 main.js"] +CMD ["--no-node-snapshot --max-old-space-size=2048 main.js"] From d51f2b88a206670561c2cfd3a61216415102875f Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 22 Feb 2024 19:24:49 +0400 Subject: [PATCH 0606/1353] rotor: yet another graceful shutdown fix --- all.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/all.Dockerfile b/all.Dockerfile index f4ad8bac5..72e0dc394 100644 --- a/all.Dockerfile +++ b/all.Dockerfile @@ -75,4 +75,4 @@ ENV JITSU_VERSION_COMMIT_SHA=${JITSU_BUILD_COMMIT_SHA} ENV JITSU_VERSION_DOCKER_TAG=${JITSU_BUILD_DOCKER_TAG} ENV JITSU_VERSION_STRING=${JITSU_BUILD_VERSION} -CMD ["--no-node-snapshot --max-old-space-size=2048 main.js"] +CMD ["--no-node-snapshot", "--max-old-space-size=2048", "main.js"] From 54113807c39216bfee01c4a9ceca372a30aafd62 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Thu, 22 Feb 2024 12:37:06 -0500 Subject: [PATCH 0607/1353] feat:docker compose version is parameterized --- docker/docker-compose.yml | 12 +++++++----- services/rotor/src/index.ts | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index a43fbf24f..ad83cfc42 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -52,7 +52,7 @@ services: console: tty: true - image: jitsucom/console:latest + image: jitsucom/console:${DOCKER_TAG:-latest} restart: "unless-stopped" platform: linux/amd64 environment: @@ -105,7 +105,7 @@ services: bulker: tty: true - image: jitsucom/bulker:latest + image: jitsucom/bulker:${DOCKER_TAG:-latest} platform: linux/amd64 restart: "unless-stopped" environment: @@ -132,7 +132,7 @@ services: rotor: tty: true - image: jitsucom/rotor:latest + image: jitsucom/rotor:${DOCKER_TAG:-latest} platform: linux/amd64 restart: "unless-stopped" environment: @@ -154,10 +154,12 @@ services: condition: service_healthy bulker: condition: service_healthy +# ports: +# - "3401:3401" ingest: tty: true - image: jitsucom/ingest:latest + image: jitsucom/ingest:${DOCKER_TAG:-latest} platform: linux/amd64 restart: "unless-stopped" environment: @@ -187,7 +189,7 @@ services: syncctl: tty: true - image: jitsucom/syncctl:latest + image: jitsucom/syncctl:${DOCKER_TAG:-latest} platform: linux/amd64 restart: "on-failure" environment: diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index d76e569bf..4ed3f74c2 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -148,7 +148,7 @@ async function main() { function initHTTP(eventsLogger: EventsStore, metrics: Metrics, geoResolver: GeoResolver) { http.use((req, res, next) => { - if (req.path === "/health") { + if (req.path === "/health" || req.path === "/version") { return next(); } let token = req.headers.authorization || ""; From c75dec86e07b7f961db026ab1004c94c5eecea73 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Thu, 22 Feb 2024 12:42:51 -0500 Subject: [PATCH 0608/1353] fix: prettier --- docker/docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index ad83cfc42..33b591258 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -154,8 +154,8 @@ services: condition: service_healthy bulker: condition: service_healthy -# ports: -# - "3401:3401" + # ports: + # - "3401:3401" ingest: tty: true From a7d6e6c21acc7c27583a3ebe13999482581d876f Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 26 Feb 2024 22:20:35 +0400 Subject: [PATCH 0609/1353] console: gtm device destination: fix gtm tag initialization --- libs/jitsu-js/src/destination-plugins/gtm.ts | 49 ++++++++------------ 1 file changed, 19 insertions(+), 30 deletions(-) diff --git a/libs/jitsu-js/src/destination-plugins/gtm.ts b/libs/jitsu-js/src/destination-plugins/gtm.ts index c58cde673..c069a45c3 100644 --- a/libs/jitsu-js/src/destination-plugins/gtm.ts +++ b/libs/jitsu-js/src/destination-plugins/gtm.ts @@ -2,15 +2,9 @@ import { loadScript } from "../script-loader"; import { AnalyticsClientEvent } from "@jitsu/protocols/analytics"; import { applyFilters, CommonDestinationCredentials, InternalPlugin } from "./index"; -const defaultScriptSrc = "https://www.googletagmanager.com/gtag/js"; - export type GtmDestinationCredentials = { - debug?: boolean; containerId?: string; dataLayerName?: string; - preview?: string; - auth?: string; - customScriptSrc?: string; } & CommonDestinationCredentials; export const gtmPlugin: InternalPlugin = { @@ -83,31 +77,26 @@ async function initGtmIfNeeded(config: GtmDestinationCredentials, payload: Analy setGtmState("loading"); const dlName = config.dataLayerName || "dataLayer"; - const dlParam = dlName !== "dataLayer" ? "&l=" + dlName : ""; - const previewParams = config.preview - ? `>m_preview=${config.preview}>m_auth=${config.auth}>m_cookies_win=x` - : ""; const tagId = config.containerId; - const scriptSrc = `${config.customScriptSrc || defaultScriptSrc}?id=${tagId}${dlParam}${previewParams}`; - - window[dlName] = window[dlName] || []; - const gtag = function () { - window[dlName].push(arguments); - }; - window[dlName].push({ - user_id: payload.userId, - }); - // @ts-ignore - gtag("js", new Date()); - // @ts-ignore - gtag("config", tagId); - loadScript(scriptSrc) - .then(() => { - setGtmState("loaded"); - }) - .catch(e => { - console.warn(`GTM (containerId=${tagId}) init failed: ${e.message}`, e); - setGtmState("failed"); + (function (w, l, i) { + w[l] = w[l] || []; + w[l].push({ + user_id: payload.userId, + }); + w[l].push({ + "gtm.start": new Date().getTime(), + event: "gtm.js", }); + const dl = l != "dataLayer" ? "&l=" + l : ""; + const scriptSrc = "https://www.googletagmanager.com/gtm.js?id=" + i + dl; + loadScript(scriptSrc) + .then(() => { + setGtmState("loaded"); + }) + .catch(e => { + console.warn(`GTM (containerId=${tagId}) init failed: ${e.message}`, e); + setGtmState("failed"); + }); + })(window, dlName, tagId); } From 94860a0226bc623044a7622415fafe0f7e70de47 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 26 Feb 2024 22:49:18 +0400 Subject: [PATCH 0610/1353] jsondiffpath: fix turbo caching --- .gitignore | 2 +- libs/jsondiffpatch/package.json | 6 +++--- libs/jsondiffpatch/tsconfig.json | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 498a98a57..1ee2403f8 100644 --- a/.gitignore +++ b/.gitignore @@ -18,5 +18,5 @@ node_modules /cache/** /cli/build-scripts/compiled/ /cli/build-scripts/dist/ -/libs/jsondiffpatch/lib/ /libs/jsondiffpatch/coverage/ +/libs/jsondiffpatch/dist/ diff --git a/libs/jsondiffpatch/package.json b/libs/jsondiffpatch/package.json index 9ccacccd4..dea74be0d 100644 --- a/libs/jsondiffpatch/package.json +++ b/libs/jsondiffpatch/package.json @@ -6,14 +6,14 @@ "contributors": [ "Benjamin Eidelman " ], - "main": "./lib/index.js", - "types": "./lib/index.d.ts", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", "files": [ "src/index.ts" ], "scripts": { "build": "tsc", - "clean": "rm -rf ./lib", + "clean": "rm -rf ./dist", "type-check": "tsc --noEmit", "lint": "eslint . --ext .ts", "test": "jest --coverage", diff --git a/libs/jsondiffpatch/tsconfig.json b/libs/jsondiffpatch/tsconfig.json index ab3efb1af..14340da01 100644 --- a/libs/jsondiffpatch/tsconfig.json +++ b/libs/jsondiffpatch/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "target": "ES2015", "declaration": true, - "outDir": "lib", + "outDir": "dist", "isolatedModules": true, "moduleResolution": "node", "esModuleInterop": true, From 1633b50744989b2b50888759243663d47369a7da Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Mon, 26 Feb 2024 17:36:08 -0500 Subject: [PATCH 0611/1353] Introduce GoogleAds and Facebook sync to Mixpanel (#1090) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit To introduce a syncs to non-Bulker destinations. The first concrete cases supported is Facebook Ads → Mixpanel and Google Ads → MixPanel --- libs/core-functions/package.json | 17 +- .../src/functions/mixpanel-destination.ts | 4 +- .../src/functions/syncs/mixpanel.ts | 78 ++++ libs/juava/src/log.ts | 4 + pnpm-lock.yaml | 175 +++++++- types/protocols/functions.d.ts | 23 +- .../FieldListEditorLayout.tsx | 15 +- .../ServiceEditor/ServiceEditor.tsx | 4 +- .../SyncEditorPage/SyncEditorPage.tsx | 102 +++-- webapps/console/lib/schema/destinations.tsx | 45 ++ webapps/console/lib/server/oauth/services.ts | 10 +- webapps/console/lib/server/sync.ts | 398 +++++++++++++++--- webapps/console/lib/server/syncs/mixpanel.ts | 279 ++++++++++++ webapps/console/package.json | 2 + .../pages/[workspaceId]/syncs/edit.tsx | 5 +- .../pages/[workspaceId]/syncs/index.tsx | 5 +- .../pages/api/[workspaceId]/config/link.ts | 2 +- .../pages/api/[workspaceId]/sources/run.ts | 4 +- 18 files changed, 1030 insertions(+), 142 deletions(-) create mode 100644 libs/core-functions/src/functions/syncs/mixpanel.ts create mode 100644 webapps/console/lib/server/syncs/mixpanel.ts diff --git a/libs/core-functions/package.json b/libs/core-functions/package.json index 8d7d288f9..bb7b7859e 100644 --- a/libs/core-functions/package.json +++ b/libs/core-functions/package.json @@ -20,32 +20,33 @@ "test": "tsc -p . && jest --verbose" }, "devDependencies": { - "@jitsu/protocols": "workspace:*", "@jitsu/functions-lib": "workspace:*", + "@jitsu/protocols": "workspace:*", "@jitsu/sdk-js": "^3.1.3", "@types/jest": "^29.1.1", "@types/lodash": "^4.14.185", "@types/node": "^18.15.3", + "express": "^4.18.2", "jest": "^29.5.0", "json5": "^2.1.0", "node-fetch-commonjs": "^3.2.4", - "ts-jest": "29.0.5", - "express": "^4.18.2" + "ts-jest": "29.0.5" }, "dependencies": { - "parse-duration": "^1.1.0", "@amplitude/ua-parser-js": "^0.7.33", + "@mongodb-js/zstd": "^1.2.0", + "agentkeepalive": "4.3.0", "dayjs": "^1.11.10", + "google-ads-api": "^14.2.0", + "ioredis": "^5.3.2", "isolated-vm": "4.7.2", "juava": "workspace:*", "lodash": "^4.17.21", "mongodb": "^6.3.0", "node-cache": "^5.1.2", - "@mongodb-js/zstd": "^1.2.0", - "ioredis": "^5.3.2", + "parse-duration": "^1.1.0", "posthog-node": "^2.4.0", "tslib": "^2.4.0", - "zod": "3.21.4", - "agentkeepalive": "4.3.0" + "zod": "3.21.4" } } diff --git a/libs/core-functions/src/functions/mixpanel-destination.ts b/libs/core-functions/src/functions/mixpanel-destination.ts index a76e1ff6c..90da9fcb9 100644 --- a/libs/core-functions/src/functions/mixpanel-destination.ts +++ b/libs/core-functions/src/functions/mixpanel-destination.ts @@ -1,7 +1,7 @@ import { FullContext, JitsuFunction } from "@jitsu/protocols/functions"; import { RetryError } from "@jitsu/functions-lib"; -import type { AnalyticsContext, AnalyticsServerEvent, Geo } from "@jitsu/protocols/analytics"; -import { randomId, hash } from "juava"; +import type { AnalyticsServerEvent, Geo } from "@jitsu/protocols/analytics"; +import { hash, randomId } from "juava"; import { MixpanelCredentials } from "../meta"; import { eventTimeSafeMs } from "./lib"; import zlib from "zlib"; diff --git a/libs/core-functions/src/functions/syncs/mixpanel.ts b/libs/core-functions/src/functions/syncs/mixpanel.ts new file mode 100644 index 000000000..952523bfb --- /dev/null +++ b/libs/core-functions/src/functions/syncs/mixpanel.ts @@ -0,0 +1,78 @@ +import { SyncFunction } from "@jitsu/protocols/functions"; +import { MixpanelCredentials } from "../../meta"; +import { GoogleAdsApi } from "google-ads-api"; +import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; + +dayjs.extend(utc); + +export type GoogleAdsCredentials = { + credentials: { + client_id: string; + access_token: string; + client_secret: string; + refresh_token: string; + developer_token: string; + }; + customer_id: string; +}; + +export type FacebookCredentials = { + client_id: string; + access_token: string; + client_secret: string; +}; + +export type MixpanelAdReportRaw = { + time: Date; + source: string; + campaign_id: string; + utm_source: string; + utm_campaign: string; + cost: number; + impressions: number; + clicks: number; +}; + +export const mixpanelGoogleAdsSync: SyncFunction = async ({ + source, + destination, + ctx: { log, store }, +}) => { + const googleAdsProps = source.credentials; + const firstRun = !(await store.get("last-run")); + const initialLookbackWindowDays = 30, + lookbackWindowDays = 2; + const lookbackWindow = firstRun ? initialLookbackWindowDays : lookbackWindowDays; + await log.info( + `Connecting to Google Ads API with client id = ${googleAdsProps.credentials.client_id}. Fist run: ${firstRun}, look-back window: ${lookbackWindow} days.` + ); + const client = new GoogleAdsApi({ + client_id: googleAdsProps.credentials.client_id, + client_secret: googleAdsProps.credentials.client_secret, + developer_token: googleAdsProps.credentials.developer_token, + }); + + const customer = client.Customer({ + customer_id: googleAdsProps.customer_id, + refresh_token: googleAdsProps.credentials.refresh_token, + }); + + const start = `${dayjs().utc().subtract(lookbackWindow, "day").format("YYYYMMDD")}`; + const end = dayjs().utc().format("YYYYMMDD"); + await customer.query(` + SELECT + segments.date, + campaign.id, + campaign.name, + metrics.cost_micros, + metrics.clicks, + metrics.impressions + FROM + campaign + WHERE + metrics.cost_micros > 0 + AND + segments.date BETWEEN ${start} AND ${end} + `); +}; diff --git a/libs/juava/src/log.ts b/libs/juava/src/log.ts index 1f1f876fb..1c16e7233 100644 --- a/libs/juava/src/log.ts +++ b/libs/juava/src/log.ts @@ -53,6 +53,9 @@ export function getLog(_opts?: LoggerOpts | string): LogFactory { const minSeverity = levelSeverities[level || globalLogLevel || "info"]; return minSeverity <= levelSeverities.warn ? logMessageBuilder(component, "warn") : noopLogMessageBuilder; }, + at(level: string): LogMessageBuilder { + return (this[`at${level.charAt(0).toUpperCase() + level.slice(1).toLowerCase()}`] || this.atInfo)(); + }, }; } @@ -176,6 +179,7 @@ export type LogFactory = { atWarn(): LogMessageBuilder; atError(): LogMessageBuilder; atDebug(): LogMessageBuilder; + at(level: string): any; }; export type LogMessageBuilder = { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1f12c488e..eef43fbb3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -310,6 +310,9 @@ importers: dayjs: specifier: ^1.11.10 version: 1.11.10 + google-ads-api: + specifier: ^14.2.0 + version: 14.2.0 ioredis: specifier: ^5.3.2 version: 5.3.2 @@ -885,12 +888,18 @@ importers: dayjs: specifier: ^1.11.10 version: 1.11.10 + facebook-nodejs-business-sdk: + specifier: ^19.0.0 + version: 19.0.0 firebase: specifier: ^10.4.0 version: 10.4.0 firebase-admin: specifier: ^11.11.0 version: 11.11.0 + google-ads-api: + specifier: ^14.2.0 + version: 14.2.0 googleapis: specifier: ^126.0.1 version: 126.0.1 @@ -4191,18 +4200,6 @@ packages: protobufjs: 7.2.5 yargs: 17.7.2 - /@grpc/proto-loader@0.7.6: - resolution: {integrity: sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==} - engines: {node: '>=6'} - hasBin: true - dependencies: - '@types/long': 4.0.2 - lodash.camelcase: 4.3.0 - long: 4.0.0 - protobufjs: 7.2.5 - yargs: 16.2.0 - dev: false - /@humanwhocodes/config-array@0.10.7: resolution: {integrity: sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==} engines: {node: '>=10.10.0'} @@ -4254,6 +4251,11 @@ packages: /@isaacs/string-locale-compare@1.1.0: resolution: {integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==} + /@isaacs/ttlcache@1.4.1: + resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==} + engines: {node: '>=12'} + dev: false + /@istanbuljs/load-nyc-config@1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -10664,7 +10666,7 @@ packages: /axios@0.24.0: resolution: {integrity: sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==} dependencies: - follow-redirects: 1.15.2 + follow-redirects: 1.15.5 transitivePeerDependencies: - debug dev: false @@ -10672,12 +10674,22 @@ packages: /axios@0.27.2: resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} dependencies: - follow-redirects: 1.15.2 + follow-redirects: 1.15.5 form-data: 4.0.0 transitivePeerDependencies: - debug dev: false + /axios@1.6.7: + resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} + dependencies: + follow-redirects: 1.15.5 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + /axobject-query@3.1.1: resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} dependencies: @@ -10775,7 +10787,7 @@ packages: '@babel/core': 7.21.4 find-cache-dir: 4.0.0 schema-utils: 4.0.0 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.0.1) dev: true /babel-plugin-istanbul@6.1.1: @@ -12490,6 +12502,13 @@ packages: resolution: {integrity: sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg==} deprecated: Cuid and other k-sortable and non-cryptographic ids (Ulid, ObjectId, KSUID, all UUIDs) are all insecure. Use @paralleldrive/cuid2 instead. + /currency-codes@1.5.1: + resolution: {integrity: sha512-hqy8vtlIYKzO6pe2TE0V4/riZALIc7nhtE9cvxk5FDRCvfGplgzUvpTmZlMsyO+NeK5U41j+sQXJOo8l8v9kdg==} + dependencies: + first-match: 0.0.1 + nub: 0.0.0 + dev: false + /d3-array@3.2.4: resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} engines: {node: '>=12'} @@ -14489,6 +14508,18 @@ packages: engines: {'0': node >=0.6.0} dev: false + /facebook-nodejs-business-sdk@19.0.0: + resolution: {integrity: sha512-/e8MoXj7gI5xdNQzq454QdCrPs1WWa0Bo1ovKo9927mrFNGiMugoJeXvzXxqEu0Iabm02ZFpIRCpdODj0LUL2g==} + dependencies: + axios: 1.6.7 + currency-codes: 1.5.1 + iso-3166-1: 2.1.1 + js-sha256: 0.9.0 + mixwith: 0.1.1 + transitivePeerDependencies: + - debug + dev: false + /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -14524,7 +14555,6 @@ packages: /fast-text-encoding@1.0.6: resolution: {integrity: sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==} dev: false - optional: true /fast-xml-parser@4.2.5: resolution: {integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==} @@ -14798,6 +14828,10 @@ packages: dependencies: readable-stream: 2.3.8 + /first-match@0.0.1: + resolution: {integrity: sha512-VvKbnaxrC0polTFDC+teKPTdl2mn6B/KUW+WB3C9RzKDeNwbzfLdnUz3FxC+tnjvus6bI0jWrWicQyVIPdS37A==} + dev: false + /flat-cache@3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -14820,8 +14854,8 @@ packages: - encoding dev: false - /follow-redirects@1.15.2: - resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + /follow-redirects@1.15.5: + resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -15037,6 +15071,20 @@ packages: strip-ansi: 6.0.1 wide-align: 1.1.5 + /gaxios@4.3.3: + resolution: {integrity: sha512-gSaYYIO1Y3wUtdfHmjDUZ8LWaxJQpiavzbF5Kq53akSzvmVg0RfyOcFDbO1KJ/KCGRFz2qG+lS81F0nkr7cRJA==} + engines: {node: '>=10'} + dependencies: + abort-controller: 3.0.0 + extend: 3.0.2 + https-proxy-agent: 5.0.1 + is-stream: 2.0.1 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /gaxios@5.1.0: resolution: {integrity: sha512-aezGIjb+/VfsJtIcHGcBSerNEDdfdHeMros+RbYbGpmonKWQCOVOes0LVZhn1lDtIgq55qq0HaxymIoae3Fl/A==} engines: {node: '>=12'} @@ -15064,6 +15112,17 @@ packages: - supports-color dev: false + /gcp-metadata@4.3.1: + resolution: {integrity: sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==} + engines: {node: '>=10'} + dependencies: + gaxios: 4.3.3 + json-bigint: 1.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /gcp-metadata@5.2.0: resolution: {integrity: sha512-aFhhvvNycky2QyhG+dcfEdHBF0FRbYcf39s6WNHUDysKSrbJ5vuFbjydxBcmewtXeV248GP8dWT3ByPNxsyHCw==} engines: {node: '>=12'} @@ -15293,6 +15352,46 @@ packages: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} dev: true + /google-ads-api@14.2.0: + resolution: {integrity: sha512-WPFAS0bqybDmuI70YQPV6kqih8klrAUDOe1KOxIpQgYGUn1u8u7yGGkWwemPFa/owFi3ZTV0VN2wG68pU3B/bQ==} + dependencies: + '@isaacs/ttlcache': 1.4.1 + google-ads-node: 12.0.2 + google-auth-library: 7.14.1 + google-gax: 4.0.3 + long: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /google-ads-node@12.0.2: + resolution: {integrity: sha512-vCVLFckkTo7TJnpHYKLELoaH4gDs3Kv/eye/TtndC3vxKAEIGZJtSoBW7RKx9S00iv5Ld5osgOUBTdIRMFGwVw==} + dependencies: + google-gax: 4.0.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /google-auth-library@7.14.1: + resolution: {integrity: sha512-5Rk7iLNDFhFeBYc3s8l1CqzbEBcdhwR193RlD4vSNFajIcINKI8W8P0JLmBpwymHqqWbX34pJDQu39cSy/6RsA==} + engines: {node: '>=10'} + dependencies: + arrify: 2.0.1 + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + fast-text-encoding: 1.0.6 + gaxios: 4.3.3 + gcp-metadata: 4.3.1 + gtoken: 5.3.2 + jws: 4.0.0 + lru-cache: 6.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /google-auth-library@8.7.0: resolution: {integrity: sha512-1M0NG5VDIvJZEnstHbRdckLZESoJwguinwN8Dhae0j2ZKIQFIV63zxm6Fo6nM4xkgqUr2bbMtV5Dgo+Hy6oo0Q==} engines: {node: '>=12'} @@ -15359,7 +15458,7 @@ packages: engines: {node: '>=14'} dependencies: '@grpc/grpc-js': 1.8.13 - '@grpc/proto-loader': 0.7.6 + '@grpc/proto-loader': 0.7.10 '@types/long': 4.0.2 abort-controller: 3.0.0 duplexify: 4.1.2 @@ -15374,6 +15473,14 @@ packages: - supports-color dev: false + /google-p12-pem@3.1.4: + resolution: {integrity: sha512-HHuHmkLgwjdmVRngf5+gSmpkyaRI6QmOg77J8tkNBHhNEI62sGHyw4/+UkgyZEI7h84NbWprXDJ+sa3xOYFvTg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + node-forge: 1.3.1 + dev: false + /google-p12-pem@4.0.1: resolution: {integrity: sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==} engines: {node: '>=12.0.0'} @@ -15427,6 +15534,18 @@ packages: resolution: {integrity: sha512-/PiFUa7WIsl48dUeCvhIHnwNmAAzlI/eHoJl0vu3nsFA366JleY7Ff8EVTplZu5kO0MIdZjKTTnzItL61ahbnw==} engines: {node: '>=8.0.0'} + /gtoken@5.3.2: + resolution: {integrity: sha512-gkvEKREW7dXWF8NV8pVrKfW7WqReAmjjkMBh6lNCCGOM4ucS0r0YyXXl0r/9Yj8wcW/32ISkfc8h5mPTDbtifQ==} + engines: {node: '>=10'} + dependencies: + gaxios: 4.3.3 + google-p12-pem: 3.1.4 + jws: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /gtoken@6.1.2: resolution: {integrity: sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==} engines: {node: '>=12.0.0'} @@ -15763,7 +15882,7 @@ packages: engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.2 + follow-redirects: 1.15.5 requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -16417,6 +16536,10 @@ packages: /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + /iso-3166-1@2.1.1: + resolution: {integrity: sha512-RZxXf8cw5Y8LyHZIwIRvKw8sWTIHh2/txBT+ehO0QroesVfnz3JNFFX4i/OC/Yuv2bDIVYrHna5PMvjtpefq5w==} + dev: false + /isobject@3.0.1: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} @@ -18389,6 +18512,10 @@ packages: /js-sdsl@4.4.0: resolution: {integrity: sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==} + /js-sha256@0.9.0: + resolution: {integrity: sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==} + dev: false + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -19507,6 +19634,10 @@ packages: minipass: 3.3.6 yallist: 4.0.0 + /mixwith@0.1.1: + resolution: {integrity: sha512-DQsf/liljH/9e+94jR+xfK8vlKceeKdOM9H9UEXLwGuvEEpO6debNtJ9yt1ZKzPKPrwqGxzMdu0BR1fnQb6i4A==} + dev: false + /mjml-accordion@4.14.1: resolution: {integrity: sha512-dpNXyjnhYwhM75JSjD4wFUa9JgHm86M2pa0CoTzdv1zOQz67ilc4BoK5mc2S0gOjJpjBShM5eOJuCyVIuAPC6w==} dependencies: @@ -20499,6 +20630,10 @@ packages: boolbase: 1.0.0 dev: false + /nub@0.0.0: + resolution: {integrity: sha512-dK0Ss9C34R/vV0FfYJXuqDAqHlaW9fvWVufq9MmGF2umCuDbd5GRfRD9fpi/LiM0l4ZXf8IBB+RYmZExqCrf0w==} + dev: false + /num2fraction@1.2.2: resolution: {integrity: sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==} dev: true diff --git a/types/protocols/functions.d.ts b/types/protocols/functions.d.ts index 66500d3d5..6e9275d6f 100644 --- a/types/protocols/functions.d.ts +++ b/types/protocols/functions.d.ts @@ -60,11 +60,11 @@ export type FetchOpts = { headers?: Record; body?: string | Buffer; }; -export type FunctionLogger = { - info: (message: string, ...args: any[]) => void; - warn: (message: string, ...args: any[]) => void; - debug: (message: string, ...args: any[]) => void; - error: (message: string, ...args: any[]) => void; +export type FunctionLogger = { + info: (message: string, ...args: any[]) => void | Promise; + warn: (message: string, ...args: any[]) => void | Promise; + debug: (message: string, ...args: any[]) => void | Promise; + error: (message: string, ...args: any[]) => void | Promise; }; export type FunctionContext = { log: FunctionLogger; @@ -176,6 +176,19 @@ export type FunctionCommand = "drop"; export type FuncReturn = AnyEvent[] | AnyEvent | null | undefined | FunctionCommand | false; +export type SyncFunction< + Dest extends AnyProps = AnyProps, + Cred extends AnyProps = AnyProps, + SyncProps extends AnyProps = AnyProps +> = (p: { + source: { package: string; credentials: Cred; syncProps: SyncProps }; + destination: Dest; + ctx: { + log: FunctionLogger; + store: Store; + }; +}) => Promise; + export interface JitsuFunction { (event: E, ctx: FullContext

    ): Promise | FuncReturn; diff --git a/webapps/console/components/FieldListEditorLayout/FieldListEditorLayout.tsx b/webapps/console/components/FieldListEditorLayout/FieldListEditorLayout.tsx index 36ad015b3..81832c2bd 100644 --- a/webapps/console/components/FieldListEditorLayout/FieldListEditorLayout.tsx +++ b/webapps/console/components/FieldListEditorLayout/FieldListEditorLayout.tsx @@ -19,13 +19,14 @@ export type FieldListEditorLayoutProps = { items: (EditorItem | undefined | false)[]; groups?: Record< string, - { - expandable?: boolean; - hideArrow?: boolean; - initiallyExpanded?: boolean; - title?: Title; - className?: string; - } + | { + expandable?: boolean; + hideArrow?: boolean; + initiallyExpanded?: boolean; + title?: Title; + className?: string; + } + | undefined >; }; diff --git a/webapps/console/components/ServiceEditor/ServiceEditor.tsx b/webapps/console/components/ServiceEditor/ServiceEditor.tsx index b6f112807..9159a7a44 100644 --- a/webapps/console/components/ServiceEditor/ServiceEditor.tsx +++ b/webapps/console/components/ServiceEditor/ServiceEditor.tsx @@ -81,12 +81,11 @@ export const ServiceEditor: React.FC = props => { return; } (async () => { - console.log("Loading specs"); setLoadingSpecs(true); try { const firstRes = await rpc(`/api/${workspace.id}/sources/spec?package=${obj.package}&version=${obj.version}`); if (firstRes.ok) { - console.log("Loaded cached specs:", JSON.stringify(firstRes, null, 2)); + getLog().atDebug().log("Loaded cached specs", firstRes); setSpecs(firstRes.specs); } else if (firstRes.error) { feedbackError(`Cannot load specs for ${obj.package}:${obj.version}`, { @@ -106,7 +105,6 @@ export const ServiceEditor: React.FC = props => { }); return; } else { - console.log("Loaded specs:", JSON.stringify(resp, null, 2)); setSpecs(resp.specs); return; } diff --git a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx index 5d1a96a6d..9e949abd8 100644 --- a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx +++ b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx @@ -5,7 +5,7 @@ import React, { useCallback, useEffect, useState } from "react"; import { z } from "zod"; import { ConfigurationObjectLinkDbModel } from "../../prisma/schema"; import { useRouter } from "next/router"; -import { assertTrue, getLog, hash as juavaHash, rpc } from "juava"; +import { assertTrue, getLog, hash as juavaHash, requireDefined, rpc } from "juava"; import { Disable } from "../Disable/Disable"; import { Button, Checkbox, Input, Select, Switch, Tooltip } from "antd"; import { getCoreDestinationType } from "../../lib/schema/destinations"; @@ -96,9 +96,6 @@ function DestinationSelector(props: SelectorProps) { updateOptions({ tableNamePrefix: e.target.value })} - /> -

    - ), - }, - ]; + destinationType.usesBulker + ? { + name: "Table Name Prefix", + documentation: + "Prefix to add to all table names resulting from this sync. E.g. 'mysrc_'. Useful to avoid table names collisions with other syncs.", + component: ( +
    + updateOptions({ tableNamePrefix: e.target.value })} + /> +
    + ), + } + : undefined, + ].filter(Boolean) as EditorItem[]; if (appConfig.syncs.scheduler.enabled) { const disableScheduling = billing.enabled && !billing.loading && !billing.settings.maximumSyncFrequency; configItems.push({ @@ -539,7 +547,35 @@ function SyncEditor({ }); } } - if (service) { + //we should disable sync if non-bulker destination generally supports, but not supported by this service + const disableSync = + service && !destinationType.usesBulker && destinationType.syncs && !destinationType.syncs[service.package]; + + if (service && !destinationType.usesBulker && destinationType.syncs) { + //destination supports sync, so we have two options (see below) + const syncOptions = destinationType.syncs[service.package]; + if (syncOptions) { + //destination and service (source) are compatible, show description (later we might want to implement options) + configItems.push({ + group: "Options", + key: "options", + component:
    {syncOptions.description}
    , + }); + } else { + //destination and service (source) are not compatible, show error message + configItems.push({ + group: "Options", + key: "options", + component: ( +
    + Sync from {service.name} to {destination.name} is not supported. +
    + ), + }); + } + } + + if (service && destinationType.usesBulker) { if (loadingCatalog) { configItems.push({ group: "Streams", @@ -664,9 +700,9 @@ function SyncEditor({ expandable: false, title: (
    -
    Streams
    +
    Streams {destinationType.usesBulker}
    - Switch All + Switch All1 0} onChange={ch => { @@ -718,17 +754,21 @@ function SyncEditor({ )}
    - setRunSyncAfterSave(!runSyncAfterSave)}> + setRunSyncAfterSave(!runSyncAfterSave)} + > Run{!existingLink ? " first" : ""} sync after save - ); @@ -83,7 +98,7 @@ function GitHubSignIn() { ); } -const NextAuthSignInPage = ({ csrfToken, providers }) => { +const NextAuthSignInPage = ({ csrfToken, providers: { github, credentials } }) => { const router = useRouter(); const nextAuthSession = useSession(); const app = useAppConfig(); @@ -109,16 +124,16 @@ const NextAuthSignInPage = ({ csrfToken, providers }) => {
    - {providers.credentials && } - {providers.credentials && providers.github &&
    } - {providers.github && } + {credentials.enabled && } + {credentials.enabled && github.enabled &&
    } + {github.enabled && }
    {router.query.error && (
    Something went wrong. Please try again. Error code: {router.query.error}
    )} - {!app.disableSignup && providers.github && ( + {!app.disableSignup && github.enabled && (
    Automatic signup is enabled for this instance. Sign in with github and if you don't have an account, a new account will be created automatically. This account won't have any access to pre-existing project unless the @@ -130,21 +145,23 @@ const NextAuthSignInPage = ({ csrfToken, providers }) => { }; export async function getServerSideProps(context) { - const providers = await getProviders(); - if (!providers) { - throw new Error( - [ - `No auth providers found. Please check your configuration and grep logs for CLIENT_FETCH_ERROR.`, - `Firebase configured via FIREBASE_AUTH: ${!!process.env.FIREBASE_AUTH}`, - `GitHub configured (via GITHUB_CLIENT_ID) : ${!!process.env.GITHUB_CLIENT_ID}`, - `Seed user configured (via SEED_USER_EMAIL) : ${!!process.env.SEED_USER_EMAIL}`, - ].join("\n") - ); + if (process.env.FIREBASE_AUTH) { + throw new Error(`Firebase auth is enabled. This page should not be used.`); + } + if (!githubLoginEnabled && !credentialsLoginEnabled) { + throw new Error(`No auth providers are enabled found. Available providers: github, credentials`); } return { props: { - csrfToken: await getCsrfToken(context), - providers: providers, + providers: { + credentials: { + enabled: credentialsLoginEnabled, + callbackUrl: "/api/auth/callback/credentials", + }, + github: { + enabled: githubLoginEnabled, + }, + }, publicPage: true, }, }; From 07c7fc6db5ae9c31151d9b58cb2be58fcf551989 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Tue, 27 Feb 2024 16:08:22 -0500 Subject: [PATCH 0620/1353] prettier fix --- webapps/console/components/Redirect/Redirect.tsx | 2 +- webapps/console/lib/modal.tsx | 1 - webapps/console/lib/nextauth.config.ts | 4 ++-- webapps/console/pages/signin.tsx | 10 ++-------- 4 files changed, 5 insertions(+), 12 deletions(-) diff --git a/webapps/console/components/Redirect/Redirect.tsx b/webapps/console/components/Redirect/Redirect.tsx index 450bc489e..09878cd04 100644 --- a/webapps/console/components/Redirect/Redirect.tsx +++ b/webapps/console/components/Redirect/Redirect.tsx @@ -2,7 +2,7 @@ import { useEffect } from "react"; import { useRouter } from "next/router"; import { LoadingAnimation } from "../GlobalLoader/GlobalLoader"; -export const Redirect: React.FC<{ href: string, title?: string }> = ({ title, href }) => { +export const Redirect: React.FC<{ href: string; title?: string }> = ({ title, href }) => { const router = useRouter(); useEffect(() => { router.push(href); diff --git a/webapps/console/lib/modal.tsx b/webapps/console/lib/modal.tsx index c8f957a9d..e49c040c8 100644 --- a/webapps/console/lib/modal.tsx +++ b/webapps/console/lib/modal.tsx @@ -115,7 +115,6 @@ export function PromptContextProvider({ children }) { const [okText, setOkText] = useState(null); const [initialValue, setInitialValue] = useState(); - return ( { + const { data, isLoading, error } = useQuery(["next-auth-csrfToken"], async () => { return { csrfToken: await getCsrfToken(), }; @@ -65,7 +59,7 @@ function CredentialsForm({}) {
    ); From 4132a0c2e679262ce29d9e44b37c2c38be033c8d Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 29 Feb 2024 14:36:01 +0400 Subject: [PATCH 0621/1353] events-log-trim API endpoint to trim Events Log --- .../pages/api/admin/events-log-trim.ts | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 webapps/console/pages/api/admin/events-log-trim.ts diff --git a/webapps/console/pages/api/admin/events-log-trim.ts b/webapps/console/pages/api/admin/events-log-trim.ts new file mode 100644 index 000000000..2e8bfa5bc --- /dev/null +++ b/webapps/console/pages/api/admin/events-log-trim.ts @@ -0,0 +1,115 @@ +import { createRoute } from "../../../lib/api"; +import { db } from "../../../lib/server/db"; +import { assertDefined, assertTrue, getLog, stopwatch } from "juava"; +import { clickhouse } from "../../../lib/server/clickhouse"; +import dayjs from "dayjs"; + +export const log = getLog("events-log-trim"); + +export default createRoute() + .GET({ + auth: true, + streaming: true, + }) + .handler(async ({ res, user }) => { + const userProfile = await db.prisma().userProfile.findFirst({ where: { id: user.internalId } }); + assertDefined(userProfile, "User profile not found"); + assertTrue(userProfile.admin, "Not enough permissions"); + log.atInfo().log(`Trimming events log`); + const metricsSchema = process.env.CLICKHOUSE_METRICS_SCHEMA || "newjitsu_metrics"; + const clickhouseCluster = process.env.CLICKHOUSE_CLUSTER || "jitsu_cluster"; + const eventsLogSize = process.env.EVENTS_LOG_SIZE ? parseInt(process.env.EVENTS_LOG_SIZE) : 200000; + const statQuery: string = `select actorId, type, timestamp + from (select actorId, + type, + timestamp, + row_number() OVER (PARTITION BY actorId, type ORDER BY timestamp desc) rn + from ${metricsSchema}.events_log + where xor(level = 'error', {withoutErrors:UInt8})) rows + where rn = {eventsLogSize:UInt32}`; + const deleteQuery: string = `delete + from ${metricsSchema}.events_log + where actorId = {actorId:String} + and + type = {type :String} + and xor(level = 'error', {withoutErrors:UInt8}) + and + timestamp + < {timestamp :DateTime64};`; + const dropPartitionQuery: string = `alter table ${metricsSchema}.events_log on cluster ${clickhouseCluster} drop partition {partition:String}`; + const result: any[] = []; + for (const trimErrors of [false, true]) { + const sw = stopwatch(); + const chResult = (await ( + await clickhouse.query({ + query: statQuery, + query_params: { + eventsLogSize: eventsLogSize, + withoutErrors: !trimErrors, + }, + clickhouse_settings: { + wait_end_of_query: 1, + }, + }) + ).json()) as any; + log + .atInfo() + .log( + `Trimming ${trimErrors ? "error level" : "non-error levels"} for ${ + chResult.data.length + } actors. (Loaded in ${sw.elapsedPretty()})` + ); + for (const row of chResult.data) { + const actorId = row.actorId; + const type = row.type; + const timestamp = row.timestamp; + try { + const cr = await clickhouse.command({ + query: deleteQuery, + query_params: { + actorId: actorId, + type: type, + withoutErrors: !trimErrors, + timestamp: timestamp, + }, + clickhouse_settings: { + enable_lightweight_delete: 1, + }, + }); + result.push({ ...row, trimErrors }); + log + .atInfo() + .log(`Trimmed ${trimErrors ? "error level" : "non-error levels"} for ${actorId} ${type} ${timestamp}`); + } catch (e: any) { + result.push({ ...row, errors: trimErrors, error: e.message }); + log + .atError() + .withCause(e) + .log( + `Failed to trim ${trimErrors ? "error level" : "non-error levels"} for ${actorId} ${type} ${timestamp}` + ); + } + } + } + const oldPartition = dayjs().subtract(2, "month").format("YYYYMM"); + try { + await clickhouse.command({ + query: dropPartitionQuery, + query_params: { + partition: oldPartition, + }, + }); + log.atInfo().log(`Deleted partition ${oldPartition}`); + } catch (e: any) { + log.atError().withCause(e).log(`Failed to delete partition ${oldPartition}`); + } + res.writeHead(200, { + "Content-Type": "application/json", + }); + res.write(JSON.stringify(result, null, 2)); + res.end(); + }) + .toNextApiHandler(); +export const config = { + maxDuration: 300, //5 mins +}; From 654dc7d2354b2b27af64669cc973cf9fd66fffeb Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 29 Feb 2024 16:29:17 +0400 Subject: [PATCH 0622/1353] events-log-trim fix auth --- webapps/console/pages/api/admin/events-log-trim.ts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/webapps/console/pages/api/admin/events-log-trim.ts b/webapps/console/pages/api/admin/events-log-trim.ts index 2e8bfa5bc..5a0907512 100644 --- a/webapps/console/pages/api/admin/events-log-trim.ts +++ b/webapps/console/pages/api/admin/events-log-trim.ts @@ -1,6 +1,5 @@ -import { createRoute } from "../../../lib/api"; -import { db } from "../../../lib/server/db"; -import { assertDefined, assertTrue, getLog, stopwatch } from "juava"; +import { createRoute, verifyAdmin } from "../../../lib/api"; +import { getLog, stopwatch } from "juava"; import { clickhouse } from "../../../lib/server/clickhouse"; import dayjs from "dayjs"; @@ -12,9 +11,7 @@ export default createRoute() streaming: true, }) .handler(async ({ res, user }) => { - const userProfile = await db.prisma().userProfile.findFirst({ where: { id: user.internalId } }); - assertDefined(userProfile, "User profile not found"); - assertTrue(userProfile.admin, "Not enough permissions"); + await verifyAdmin(user); log.atInfo().log(`Trimming events log`); const metricsSchema = process.env.CLICKHOUSE_METRICS_SCHEMA || "newjitsu_metrics"; const clickhouseCluster = process.env.CLICKHOUSE_CLUSTER || "jitsu_cluster"; From bda9245524e500d2a6becd4eab5ccd5b0626ae8c Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Fri, 1 Mar 2024 17:27:28 -0500 Subject: [PATCH 0623/1353] feat: auto cancellation for foreground tasks --- webapps/console/lib/server/sync.ts | 38 ++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/webapps/console/lib/server/sync.ts b/webapps/console/lib/server/sync.ts index 0f19cba1d..580aefdf2 100644 --- a/webapps/console/lib/server/sync.ts +++ b/webapps/console/lib/server/sync.ts @@ -402,14 +402,36 @@ export async function scheduleSync({ error: `Sync ${syncIdOrModel} not found`, }; } + const service = sync.from; + if (!service) { + return { + ok: false, + error: `Service ${sync.from} not found`, + }; + } + const destinationConfig = sync.to.config as DestinationConfig; + const destinationType = getCoreDestinationType(destinationConfig.destinationType); + const serviceConfig = { ...(service.config as any), ...service }; const running = await db.prisma().source_task.findFirst({ where: { sync_id: syncIdOrModel as string, status: "RUNNING", }, }); + const runSynchronously = !destinationType.usesBulker && destinationType.syncs; if (running) { - if (ignoreRunning) { + const msInMin = 1000 * 60; + if (ignoreRunning || (runSynchronously && Date.now() - running.updated_at.getTime() >= 2 * msInMin)) { + await db.prisma().task_log.create({ + data: { + timestamp: new Date(), + logger: "sync", + task_id: running.task_id, + sync_id: sync.id, + message: `Synchronous task ${running.task_id} was running due to timeout`, + level: "ERROR", + } + }) await db.prisma().source_task.update({ where: { task_id: running.task_id, @@ -431,13 +453,8 @@ export async function scheduleSync({ }; } } - const service = sync.from; - if (!service) { - return { - ok: false, - error: `Service ${sync.from} not found`, - }; - } + + if (isEEAvailable()) { const checkResult = await checkQuota({ user, @@ -503,10 +520,7 @@ export async function scheduleSync({ } } } - const destinationConfig = sync.to.config as DestinationConfig; - const destinationType = getCoreDestinationType(destinationConfig.destinationType); - const serviceConfig = { ...(service.config as any), ...service }; - if (!destinationType.usesBulker && destinationType.syncs) { + if (runSynchronously) { const started = Date.now(); try { await runSyncSynchronously({ From 8a4a7a75ffe341b0e8c6cde691a3f3e45bda340b Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Fri, 1 Mar 2024 17:28:10 -0500 Subject: [PATCH 0624/1353] mark stalled tasks as FAILED instead of CANCELLED --- webapps/console/lib/server/sync.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/lib/server/sync.ts b/webapps/console/lib/server/sync.ts index 580aefdf2..281841ba3 100644 --- a/webapps/console/lib/server/sync.ts +++ b/webapps/console/lib/server/sync.ts @@ -437,7 +437,7 @@ export async function scheduleSync({ task_id: running.task_id, }, data: { - status: "CANCELED", + status: "FAILED", updated_at: new Date(), }, }); From 87d8fc5a1b739cfa22b133864277d1a8da54315f Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Fri, 1 Mar 2024 17:30:55 -0500 Subject: [PATCH 0625/1353] fix: prettier --- webapps/console/lib/server/sync.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/webapps/console/lib/server/sync.ts b/webapps/console/lib/server/sync.ts index 281841ba3..b5d59745e 100644 --- a/webapps/console/lib/server/sync.ts +++ b/webapps/console/lib/server/sync.ts @@ -430,8 +430,8 @@ export async function scheduleSync({ sync_id: sync.id, message: `Synchronous task ${running.task_id} was running due to timeout`, level: "ERROR", - } - }) + }, + }); await db.prisma().source_task.update({ where: { task_id: running.task_id, @@ -454,7 +454,6 @@ export async function scheduleSync({ } } - if (isEEAvailable()) { const checkResult = await checkQuota({ user, From 401dd56680c2067624cb8122202cea04e373d1d6 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 4 Mar 2024 12:01:48 +0400 Subject: [PATCH 0626/1353] sync.ts fix typo --- webapps/console/lib/server/sync.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/lib/server/sync.ts b/webapps/console/lib/server/sync.ts index b5d59745e..bc8a44d6b 100644 --- a/webapps/console/lib/server/sync.ts +++ b/webapps/console/lib/server/sync.ts @@ -580,7 +580,7 @@ export async function scheduleSync({ package: serviceConfig.package, version: serviceConfig.version, taskId, - syncIdOr: sync.id, + syncId: sync.id, startedBy: trigger === "manual" ? (user ? user.internalId : "manual") : "scheduled", tableNamePrefix: sync.data?.["tableNamePrefix"] ?? "", }, From da42e4a0b66212b8721867e1213f710716c2fd60 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 4 Mar 2024 17:07:31 +0400 Subject: [PATCH 0627/1353] console: Live Events switch to CH --- .../console/components/DataView/DataView.tsx | 12 +- .../components/DataView/EventsBrowser.tsx | 193 +++++++++--------- .../FunctionsDebugger/FunctionsDebugger.tsx | 2 +- webapps/console/lib/server/events-log.ts | 5 +- webapps/console/lib/useApi.ts | 25 ++- .../api/[workspaceId]/log/[type]/[actorId].ts | 91 +++++---- .../pages/api/admin/events-log-trim.ts | 6 +- 7 files changed, 177 insertions(+), 157 deletions(-) diff --git a/webapps/console/components/DataView/DataView.tsx b/webapps/console/components/DataView/DataView.tsx index 150a2bffc..4db7b1db8 100644 --- a/webapps/console/components/DataView/DataView.tsx +++ b/webapps/console/components/DataView/DataView.tsx @@ -5,8 +5,8 @@ import React from "react"; import { EventsBrowser } from "./EventsBrowser"; export type DataViewState = { - activeView: "incoming" | "functions" | "bulker"; - viewState: Record<"incoming" | "functions" | "bulker", any>; + activeView: "incoming" | "function" | "bulker"; + viewState: Record<"incoming" | "function" | "bulker", any>; }; export function DataView() { @@ -15,7 +15,7 @@ export function DataView() { //state of nested Tab viewState: { incoming: {}, - functions: {}, + function: {}, bulker: {}, }, }; @@ -59,12 +59,12 @@ export function DataView() { ), }, { - key: "functions", + key: "function", label: `API Destinations & Functions Logs`, children: ( ), diff --git a/webapps/console/components/DataView/EventsBrowser.tsx b/webapps/console/components/DataView/EventsBrowser.tsx index 649957705..b7d1d392d 100644 --- a/webapps/console/components/DataView/EventsBrowser.tsx +++ b/webapps/console/components/DataView/EventsBrowser.tsx @@ -3,7 +3,7 @@ import utc from "dayjs/plugin/utc"; import relativeTime from "dayjs/plugin/relativeTime"; import { EventsLogRecord } from "../../lib/server/events-log"; import { ColumnsType } from "antd/es/table"; -import { Alert, Checkbox, Collapse, DatePicker, Select, Spin, Table, Tag, Tooltip } from "antd"; +import { Alert, Collapse, DatePicker, Select, Spin, Table, Tag, Tooltip } from "antd"; import { TableWithDrawer } from "./TableWithDrawer"; import { JSONView } from "./JSONView"; import { useAppConfig, useWorkspace } from "../../lib/context"; @@ -17,7 +17,7 @@ import { get, getConfigApi, useEventsLogApi } from "../../lib/useApi"; import { FunctionTitle } from "../../pages/[workspaceId]/functions"; import { DestinationConfig, FunctionConfig, ServiceConfig, StreamConfig } from "../../lib/schema"; import { arrayToMap } from "../../lib/shared/arrays"; -import { Globe, RefreshCw, Server } from "lucide-react"; +import { Bug, Globe, RefreshCw, Server } from "lucide-react"; import { JitsuButton } from "../JitsuButton/JitsuButton"; import { ConnectionTitle } from "../../pages/[workspaceId]/connections"; import { StreamTitle } from "../../pages/[workspaceId]/streams"; @@ -30,15 +30,15 @@ import { useConfigObjectLinkMutation, UseConfigObjectLinkResult, useConfigObject dayjs.extend(utc); dayjs.extend(relativeTime); -const formatDate = (date: string | Date) => dayjs(date).utc().format("YYYY-MM-DD HH:mm:ss"); +const formatDate = (date: string | Date) => dayjs(date).utc(true).format("YYYY-MM-DD HH:mm:ss"); -type StreamType = "incoming" | "functions" | "bulker"; -type EventType = "all" | "error"; +type StreamType = "incoming" | "function" | "bulker"; +type Level = "all" | "error" | "info" | "debug" | "warn"; type DatesRange = [string | null, string | null]; type EventsBrowserProps = { streamType: StreamType; - eventType: "all" | "error"; + level: Level; actorId: string; dates: DatesRange; patchQueryStringState: (key: string, value: any) => void; @@ -50,8 +50,8 @@ type EventsBrowserState = { entitiesMap?: Record; eventsLoading: boolean; events?: EventsLogRecord[]; - beforeId: string; refreshTime: Date; + beforeDate?: Date; error?: string; }; @@ -109,7 +109,7 @@ export const RelativeDate: React.FC<{ date: string | Date; fromNow?: boolean }> export const EventsBrowser = ({ streamType = "incoming", - eventType = "all", + level = "all", actorId = "", dates, patchQueryStringState, @@ -132,7 +132,7 @@ export const EventsBrowser = ({ entitiesMap: undefined, eventsLoading: false, events: undefined, - beforeId: "", + beforeDate: undefined, refreshTime: new Date(), }; @@ -153,8 +153,10 @@ export const EventsBrowser = ({ return new Date(); }, []); - const [{ bulkerMode, entitiesLoading, entitiesMap, eventsLoading, events, beforeId, refreshTime, error }, dispatch] = - useReducer(eventStreamReducer, { ...defaultState, refreshTime: initDate }); + const [ + { bulkerMode, entitiesLoading, entitiesMap, eventsLoading, events, beforeDate, refreshTime, error }, + dispatch, + ] = useReducer(eventStreamReducer, { ...defaultState, refreshTime: initDate }); const [shownEvents, setShownEvents] = useState([]); @@ -167,7 +169,7 @@ export const EventsBrowser = ({ const eventsLogApi = useEventsLogApi(); useEffect(() => { - if (streamType === "functions" && actorId) { + if (streamType === "function" && actorId) { (async () => { const connection = connections.find(c => c.id === actorId); if (connection) { @@ -191,10 +193,10 @@ export const EventsBrowser = ({ async ( streamType: StreamType, entitiesMap: any, - eventType: EventType, + level: Level, actorId: string, - beforeId: string, - dates: DatesRange + dates: DatesRange, + beforeDate?: Date ) => { try { if (actorId && entitiesMap && entitiesMap[actorId]) { @@ -211,22 +213,23 @@ export const EventsBrowser = ({ } dispatch({ type: "eventsLoading", value: true }); const data = await eventsLogApi.get( - `${eventsLogStream}.${eventType}`, + `${eventsLogStream}`, + level === "all" ? "all" : [level], actorId, { - beforeId: beforeId, - start: dates && dates[0] ? dates[0] : undefined, - end: dates && dates[1] ? dates[1] : undefined, + start: dates && dates[0] ? new Date(dates[0]) : undefined, + end: beforeDate || (dates && dates[1] ? new Date(dates[1]) : undefined), }, 100 ); - if (beforeId) { + if (beforeDate) { dispatch({ type: "addEvents", value: data }); } else { dispatch({ type: "events", value: data }); } if (data.length > 0) { - dispatch({ type: "beforeId", value: data[data.length - 1].id }); + const d = dayjs(data[data.length - 1].date).utc(true); + dispatch({ type: "beforeDate", value: d.toDate() }); } dispatch({ type: "error", value: "" }); } @@ -265,7 +268,7 @@ export const EventsBrowser = ({ usesBulker: typeof link.data?.mode === "string", //usesFunctions: Array.isArray(link.data?.functions) && link.data?.functions.length > 0, })) - .filter(link => (streamType === "bulker" && link.usesBulker) || streamType === "functions"); + .filter(link => (streamType === "bulker" && link.usesBulker) || streamType === "function"); }; } @@ -292,8 +295,8 @@ export const EventsBrowser = ({ }, [streamType, entitiesMap, actorId, workspace.id, patchQueryStringState, entitiesLoading]); useEffect(() => { - loadEvents(streamType, entitiesMap, eventType, actorId, "", dates); - }, [loadEvents, streamType, entitiesMap, eventType, actorId, dates, refreshTime]); + loadEvents(streamType, entitiesMap, level, actorId, dates); + }, [loadEvents, streamType, entitiesMap, level, actorId, dates, refreshTime]); // //load more events on reaching bottom // useEffect(() => { @@ -301,7 +304,7 @@ export const EventsBrowser = ({ // const scrolling_function = e => { // const div = document.getElementsByClassName("global-wrapper")[0]; // if (div.scrollHeight - div.scrollTop == div.clientHeight) { - // if (!eventsLoading && beforeId) { + // if (!eventsLoading && beforeDate) { // force += -e.wheelDeltaY; // document.getElementById("lmore")!.style.transform = `scale(${ // 1 + Math.max(0, Math.min(force / 6000, 0.333)) @@ -309,7 +312,7 @@ export const EventsBrowser = ({ // if (force > 2000) { // force = 0; // window.removeEventListener("wheel", scrolling_function); - // loadEvents(streamType, entitiesMap, eventType, actorId, beforeId, dates); + // loadEvents(streamType, entitiesMap, eventType, actorId, beforeDate, dates); // } // if (force < 0) { // force = 0; @@ -324,7 +327,7 @@ export const EventsBrowser = ({ // return () => { // window.removeEventListener("wheel", scrolling_function); // }; - // }, [loadEvents, eventsLoading, streamType, entitiesMap, eventType, actorId, dates, refreshTime, beforeId]); + // }, [loadEvents, eventsLoading, streamType, entitiesMap, eventType, actorId, dates, refreshTime, beforeDate]); const entitiesSelectOptions = useMemo(() => { if (entitiesMap) { @@ -346,7 +349,7 @@ export const EventsBrowser = ({ switch (streamType) { case "incoming": return IncomingEventsTable; - case "functions": + case "function": return FunctionsLogTable; case "bulker": if (bulkerMode === "batch") { @@ -370,7 +373,7 @@ export const EventsBrowser = ({ notFoundContent={ entityType === "stream" ? (
    Project doesn't have Sites
    - ) : streamType === "functions" ? ( + ) : streamType === "function" ? (
    Project doesn't have Connections using Functions
    ) : (
    Project doesn't have data warehouse Connections
    @@ -380,7 +383,7 @@ export const EventsBrowser = ({ loading={entitiesLoading} onChange={e => { dispatch({ type: "events", value: [] }); - dispatch({ type: "beforeId", value: "" }); + dispatch({ type: "beforeDate", value: undefined }); patchQueryStringState("actorId", e); }} value={actorId} @@ -388,78 +391,92 @@ export const EventsBrowser = ({ />
    - Statuses: + {streamType == "function" ? "Level: " : "Status: "} updateSelectedStream(name, "table_name", e.target.value)} + value={syncOptions?.streams?.[name]?.table_name || (syncOptions?.tableNamePrefix ?? "") + name} + > +
    +
    ), component: (
    diff --git a/webapps/console/lib/server/sync.ts b/webapps/console/lib/server/sync.ts index 8fb20b1fc..5c32698dc 100644 --- a/webapps/console/lib/server/sync.ts +++ b/webapps/console/lib/server/sync.ts @@ -170,9 +170,12 @@ export function selectStreamsFromCatalog(catalog: any, selectedStreams: any): an .map((s: any) => { const stream = selectedStreams[s.namespace ? s.namespace + "." + s.name : s.name]; return { - ...stream, + ...omit(stream, "table_name"), destination_sync_mode: "overwrite", - stream: s, + stream: { + ...s, + table_name: stream.table_name, + }, }; }); return { streams }; From d68a5c1ffef6c347cb1d169b606d405d685da388 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 27 Mar 2024 19:47:46 +0400 Subject: [PATCH 0670/1353] console: SyncEditor UI improvs --- .../SyncEditorPage/SyncEditorPage.tsx | 113 ++++++++++-------- 1 file changed, 62 insertions(+), 51 deletions(-) diff --git a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx index d54095f74..678ec8d24 100644 --- a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx +++ b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx @@ -620,64 +620,75 @@ function SyncEditor({ name: (
    - Stream: {name} + {name} -
    - Table:{" "} - updateSelectedStream(name, "table_name", e.target.value)} - value={syncOptions?.streams?.[name]?.table_name || (syncOptions?.tableNamePrefix ?? "") + name} - > -
    ), component: ( -
    -
    - Mode:{" "} - updateSelectedStream(name, "sync_mode", v)} + /> +
    +
    + {stream.supported_sync_modes.includes("incremental") && + syncOptions?.streams?.[name]?.sync_mode === "incremental" && ( + <> + Cursor field:{" "} + + { - updateSelectedStream(name, "cursor_field", v ? [v] : undefined); - }} - /> - - - )} +
    +
    + Table:
    + updateSelectedStream(name, "table_name", e.target.value)} + value={syncOptions?.streams?.[name]?.table_name || (syncOptions?.tableNamePrefix ?? "") + name} + > +
    +
    - { - if (enabled) { - addStream(name); - } else { - deleteSelectedStream(name); - } - }} - />
    ), }); From baeeacfa9d0b08acd514ee78a5da757c99c8a8b8 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Wed, 27 Mar 2024 13:58:12 -0400 Subject: [PATCH 0671/1353] feat: hubspot destination --- .../__tests__/hubspot-destination.test.ts | 32 +++ .../core-functions/__tests__/lib/test-data.ts | 42 ++- libs/core-functions/package.json | 1 + .../src/functions/hubspot-destination.ts | 259 ++++++++++++++++++ libs/core-functions/src/meta.ts | 24 +- pnpm-lock.yaml | 244 ++++++++++++++++- webapps/console/lib/schema/destinations.tsx | 48 +++- webapps/console/lib/server/sync.ts | 2 +- .../pages/[workspaceId]/destinations.tsx | 16 +- .../pages/[workspaceId]/syncs/index.tsx | 26 +- .../pages/[workspaceId]/syncs/tasks.tsx | 74 +++-- webapps/ee-api/pages/api/quotas/sync.ts | 2 +- .../ee-api/pages/api/report/workspace-stat.ts | 2 +- 13 files changed, 708 insertions(+), 64 deletions(-) create mode 100644 libs/core-functions/__tests__/hubspot-destination.test.ts create mode 100644 libs/core-functions/src/functions/hubspot-destination.ts diff --git a/libs/core-functions/__tests__/hubspot-destination.test.ts b/libs/core-functions/__tests__/hubspot-destination.test.ts new file mode 100644 index 000000000..1bc90a3ba --- /dev/null +++ b/libs/core-functions/__tests__/hubspot-destination.test.ts @@ -0,0 +1,32 @@ +import { testJitsuFunction, TestOptions } from "./lib/testing-lib"; +import { eventsSequence } from "./lib/test-data"; +import { HubspotCredentials } from "../src/meta"; +import { HubspotDestination } from "../src/functions/hubspot-destination"; +import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; +import { undefined } from "zod"; + +test("hubspot-integration-test", async () => { + if (!process.env.TEST_HUBSPOT_DESTINATIONS) { + console.log("Skipping mixpanel destination integration test - TEST_HUBSPOT_DESTINATIONS is not set"); + return; + } + const groupEvent: AnalyticsServerEvent = { + context: undefined, + messageId: "group1", + type: "group", + traits: { + name: "Company 1", + }, + }; + const events = [...eventsSequence(), groupEvent]; + const opts: TestOptions = { + func: HubspotDestination, + configEnvVar: "TEST_HUBSPOT_DESTINATIONS", + events: events, + }; + await testJitsuFunction(opts); +}); + +// test("mixpanel-destination-unit", () => {љ +// //implement later, when testing library is ready to mock fetch +// }); diff --git a/libs/core-functions/__tests__/lib/test-data.ts b/libs/core-functions/__tests__/lib/test-data.ts index ee0285d89..330828540 100644 --- a/libs/core-functions/__tests__/lib/test-data.ts +++ b/libs/core-functions/__tests__/lib/test-data.ts @@ -65,6 +65,7 @@ function identify(opts: { url: string; userId?: string; traits?: Record; + groupId?: string; }): AnalyticsServerEvent { return { type: "identify", @@ -79,18 +80,43 @@ function identify(opts: { requestIp: "99.177.205.92", sentAt: new Date().toISOString(), timestamp: new Date().toISOString(), + groupId: opts.groupId, }; } export function eventsSequence() { const traits = { email: "john.doe.1@gmail.com", name: "John Doe" }; - const events = [ - identify({ anonymousId: "anonymousId1", url: "https://jitsu.com?test=1" }), - event("page", { anonymousId: "anonymousId1", url: "https://jitsu.com?test=1" }), - event("page", { anonymousId: "anonymousId1", url: "https://jitsu.com/signup" }), - identify({ anonymousId: "anonymousId1", url: "https://jitsu.com?test=1", userId: "userId", traits }), - event("page", { anonymousId: "anonymousId1", userId: "userId1", url: "https://app.jitsu.com", traits }), - event("track/signup", { anonymousId: "anonymousId", userId: "userId1", url: "https://app.jitsu.com", traits }), + return [ + identify({ + anonymousId: "anonymousId1", + url: "https://jitsu.com?test=1", + groupId: "group1", + }), + event("page", { + anonymousId: "anonymousId1", + url: "https://jitsu.com?test=1", + }), + event("page", { + anonymousId: "anonymousId1", + url: "https://jitsu.com/signup", + }), + identify({ + anonymousId: "anonymousId1", + url: "https://jitsu.com?test=1", + userId: "userId", + traits, + }), + event("page", { + anonymousId: "anonymousId1", + userId: "userId1", + url: "https://app.jitsu.com", + traits, + }), + event("track/signup", { + anonymousId: "anonymousId", + userId: "userId1", + url: "https://app.jitsu.com", + traits, + }), ]; - return events; } diff --git a/libs/core-functions/package.json b/libs/core-functions/package.json index bb7b7859e..c2e68bc01 100644 --- a/libs/core-functions/package.json +++ b/libs/core-functions/package.json @@ -34,6 +34,7 @@ }, "dependencies": { "@amplitude/ua-parser-js": "^0.7.33", + "@hubspot/api-client": "^11.1.0", "@mongodb-js/zstd": "^1.2.0", "agentkeepalive": "4.3.0", "dayjs": "^1.11.10", diff --git a/libs/core-functions/src/functions/hubspot-destination.ts b/libs/core-functions/src/functions/hubspot-destination.ts new file mode 100644 index 000000000..30c89eaf0 --- /dev/null +++ b/libs/core-functions/src/functions/hubspot-destination.ts @@ -0,0 +1,259 @@ +import type { FullContext, FunctionLogger, JitsuFunction } from "@jitsu/protocols/functions"; +import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; +import { HubspotCredentials } from "../meta"; +import { Client } from "@hubspot/api-client"; +import { + PropertyCreateFieldTypeEnum, + PropertyCreateTypeEnum, +} from "@hubspot/api-client/lib/codegen/crm/properties/models/PropertyCreate"; +import { FilterOperatorEnum } from "@hubspot/api-client/lib/codegen/crm/contacts/models/Filter"; +import { FilterGroup } from "@hubspot/api-client/lib/codegen/crm/contacts/models/FilterGroup"; +import omit from "lodash/omit"; +import assert from "node:assert"; +import { BehavioralEventHttpCompletionRequest } from "@hubspot/api-client/lib/codegen/events/send/models/BehavioralEventHttpCompletionRequest"; + +const JITSU_USER_ID_PROPERTY = "jitsu_user_id"; + +const JITSU_GROUP_ID_PROPERTY = "jitsu_group_id"; + +function splitName(name?: string): [string | undefined, string | undefined] { + if (!name) { + return [undefined, undefined]; + } + const [firstName, ...rest] = name.split(" "); + return [firstName, rest.join(" ") || undefined]; +} + +type PropertyOptions = { group?: string; objectType?: string }; + +class HubspotHelper { + private client: Client; + private log: FunctionLogger; + + constructor(client: Client, ctx: FullContext) { + this.client = client; + this.log = ctx.log; + } + + async checkIfPropertyExists(propertyName: string, opts: PropertyOptions = {}): Promise { + const properties = await this.client.crm.properties.coreApi.getAll(opts.objectType || "contacts"); + return properties.results.some(property => property.name === propertyName); + } + + async createProperty(propertyName: string, opts: PropertyOptions = {}): Promise { + await this.client.crm.properties.coreApi.create(opts.objectType || "contacts", { + name: propertyName, + label: propertyName, + type: PropertyCreateTypeEnum.String, + fieldType: PropertyCreateFieldTypeEnum.Text, + groupName: opts.group || "contactinformation", + description: `Custom property, created by Jitsu Integration`, + }); + this.log.info(`Property '${propertyName}' created successfully.`); + } + + async ensurePropertyExists(propertyName: string, opts: PropertyOptions = {}): Promise { + const exists = await this.checkIfPropertyExists(propertyName, opts); + if (!exists) { + this.log.info(`Property '${propertyName}' does not exist. Creating...`); + await this.createProperty(propertyName, opts); + } else { + //this.log.debug(`Property '${propertyName}' already exists`); + } + } + + async upsertHubspotCompany(c: { + companyId: string; + name: string; + customProps?: Record; + doNotUpdate?: boolean; + }): Promise { + const filterGroup: FilterGroup = { + filters: [ + { + propertyName: JITSU_GROUP_ID_PROPERTY, + operator: FilterOperatorEnum.Eq, + value: c.companyId, + }, + ], + }; + const searchResults = await this.client.crm.companies.searchApi.doSearch({ + filterGroups: [filterGroup], + limit: 10, + after: "0", + properties: [], + sorts: [], + }); + + const companyProperties = { + properties: { + name: c.name, + [JITSU_GROUP_ID_PROPERTY]: c.companyId, + }, + }; + + if (searchResults.results.length > 0) { + // Contact exists, update it + const companyId = searchResults.results[0].id; + if (!c.doNotUpdate) { + await this.client.crm.companies.basicApi.update(companyId, companyProperties); + } + return companyId; + } else { + // Contact does not exist, create it + const { id: companyId } = await this.client.crm.companies.basicApi.create({ + ...companyProperties, + associations: [], + }); + console.log(`Company '${companyId}' with jitsu id '${c.companyId}' and name '${c.name}' was created`); + return companyId; + } + } + + async upsertHubspotContact(u: { + userId: string; + name?: string; + email: string; + customProps?: Record; + }): Promise { + console.log(`Searching contact by ${u.userId} and ${u.email}`); + const existingContactId = await this.getContactByJitsuId(u.userId, u.email); + console.log(`Found ${existingContactId}`); + + const [fistName, lastName] = splitName(u.name); + + const contactProperties = { + properties: { + email: u.email, + firstname: fistName, + lastname: lastName, + [JITSU_USER_ID_PROPERTY]: u.userId, + }, + }; + + if (existingContactId) { + // Contact exists, update it + await this.client.crm.contacts.basicApi.update(existingContactId, contactProperties); + console.log(`Contact '${existingContactId}' with jitsu id '${u.userId}' and email '${u.email}' was updated`); + return existingContactId; + } else { + // Contact does not exist, create it + const { id: contactId } = await this.client.crm.contacts.basicApi.create({ + ...contactProperties, + associations: [], + }); + console.log(`Contact '${contactId}' with jitsu id '${u.userId}' and email '${u.email}' was created`); + return contactId; + } + } + + async associateContactWithCompany(contactId: string, companyId: string): Promise { + await this.client.crm.associations.batchApi.create("contacts", "companies", { + inputs: [ + { + _from: { + id: contactId, + }, + to: { + id: companyId, + }, + // The type of association, 2 is the ID for Contact to Company association + type: "2", + }, + ], + }); + } + + async searchContactByField(fieldName: string, fieldValue: string): Promise { + const filterGroup: FilterGroup = { + filters: [ + { + propertyName: fieldName, + operator: FilterOperatorEnum.Eq, + value: fieldValue, + }, + ], + }; + const searchResults = await this.client.crm.contacts.searchApi.doSearch({ + filterGroups: [filterGroup], + limit: 10, + after: "0", + properties: [], + sorts: [], + }); + + return searchResults?.results?.[0]?.id; + } + + public async getContactByJitsuId(jitsuUserId: string, email?: string): Promise { + return ( + (await this.searchContactByField(JITSU_USER_ID_PROPERTY, jitsuUserId)) || + (email ? await this.searchContactByField("email", email) : undefined) + ); + } +} + +const HubspotDestination: JitsuFunction = async (event, ctx) => { + assert(ctx.props.accessToken); + const hubspotClient = new Client({ accessToken: ctx.props.accessToken }); + const helper = new HubspotHelper(hubspotClient, ctx); + await helper.ensurePropertyExists(JITSU_USER_ID_PROPERTY); + await helper.ensurePropertyExists(JITSU_GROUP_ID_PROPERTY, { + objectType: "company", + group: "companyinformation", + }); + hubspotClient.init(); + let contactId: string | undefined = undefined; + let companyId: string | undefined = undefined; + if (event.type === "identify" && event.userId && event.traits.email) { + ctx.log.info("Upserting contact"); + contactId = await helper.upsertHubspotContact({ + userId: event.userId, + name: event.traits.name as string | undefined, + email: event.traits.email as string, + customProps: omit(event.traits, "name"), + }); + if (event.groupId) { + companyId = await helper.upsertHubspotCompany({ + companyId: event.groupId, + name: `Company ${event.groupId}`, + doNotUpdate: true, + }); + } + } + if (event.type === "group" && event.groupId) { + const groupName = event.type === "group" ? event.traits?.name : undefined; + + await helper.upsertHubspotCompany({ + companyId: event.groupId, + name: (groupName || `Company ${event.groupId}`) as string | undefined, + customProps: omit(event.traits, "email", "name"), + }); + if (event.userId) { + contactId = await helper.getContactByJitsuId(event.userId); + } + } + if (contactId && companyId) { + await helper.associateContactWithCompany(contactId, companyId); + } + const email = (event.traits?.email || event.properties?.email || undefined) as string | undefined; + + if (email && ctx.props.sendPageViewEvents) { + const url = event.context?.page?.url || event.properties?.url; + const properties: Record = {}; + if (url) { + properties.url = url.toString(); + } + const hubspotEvent: BehavioralEventHttpCompletionRequest = { + email: email, + eventName: event.type === "track" ? event.event : event.type, + objectId: contactId, + occurredAt: event.timestamp ? new Date(event.timestamp) : new Date(), + properties: properties, + uuid: event.messageId, + }; + await hubspotClient.events.send.behavioralEventsTrackingApi.send(hubspotEvent); + } +}; + +export { HubspotDestination }; diff --git a/libs/core-functions/src/meta.ts b/libs/core-functions/src/meta.ts index 378033604..d968e53f4 100644 --- a/libs/core-functions/src/meta.ts +++ b/libs/core-functions/src/meta.ts @@ -215,7 +215,12 @@ export const MongodbDestinationConfig = z.object({ export const MongodbDestinationConfigUi: Partial< Record< keyof MongodbDestinationConfig, - { documentation?: string; editor?: string; hidden?: boolean; password?: boolean } + { + documentation?: string; + editor?: string; + hidden?: boolean; + password?: boolean; + } > > = { hosts: { @@ -248,3 +253,20 @@ export const Ga4Credentials = z.object({ //validationMode: z.boolean().default(false).optional(), }); export type Ga4Credentials = z.infer; + +export const HubspotCredentials = z.object({ + accessToken: z + .string() + .describe( + [ + "To obtain an access secret, go to Settings » Account Setup » Private Apps, create a new private app copy the Access token. See detailed guide.", + "Please make sure to grant an application all read and write permissions under CRM section", + ].join("\n") + ), + sendPageViewEvents: z + .boolean() + .optional() + .describe("If on, Jitsu will send page view events to hubspot (only events with a known email). Please note"), +}); + +export type HubspotCredentials = z.infer; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7c8b973e7..6a76be687 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,5 +1,9 @@ lockfileVersion: '6.0' +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + importers: .: @@ -197,7 +201,7 @@ importers: version: 7.5.4 ts-jest: specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.21.4)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.3.3) + version: 29.1.1(@babel/core@7.21.4)(jest@29.7.0)(typescript@5.3.3) ts-loader: specifier: ^9.4.4 version: 9.4.4(typescript@5.3.3)(webpack@5.88.2) @@ -301,6 +305,9 @@ importers: '@amplitude/ua-parser-js': specifier: ^0.7.33 version: 0.7.33 + '@hubspot/api-client': + specifier: ^11.1.0 + version: 11.1.0 '@mongodb-js/zstd': specifier: ^1.2.0 version: 1.2.0 @@ -550,7 +557,7 @@ importers: version: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) ts-jest: specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.21.4)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.3.3) + version: 29.1.1(@babel/core@7.21.4)(jest@29.7.0)(typescript@5.3.3) tslib: specifier: ^2.6.2 version: 2.6.2 @@ -4122,6 +4129,7 @@ packages: /@google-cloud/paginator@3.0.7: resolution: {integrity: sha512-jJNutk0arIQhmpUUQJPJErsojqo834KcyB6X7a1mxuic8i1tKXxde8E69IZxNZawRIlZdIK2QY4WALvlK5MzYQ==} engines: {node: '>=10'} + requiresBuild: true dependencies: arrify: 2.0.1 extend: 3.0.2 @@ -4131,12 +4139,14 @@ packages: /@google-cloud/projectify@3.0.0: resolution: {integrity: sha512-HRkZsNmjScY6Li8/kb70wjGlDDyLkVk3KvoEo9uIoxSjYLJasGiCch9+PqRVDOCGUFvEIqyogl+BeqILL4OJHA==} engines: {node: '>=12.0.0'} + requiresBuild: true dev: false optional: true /@google-cloud/promisify@3.0.1: resolution: {integrity: sha512-z1CjRjtQyBOYL+5Qr9DdYIfrdLBe746jRTYfaYU6MeXkqp7UfYs/jX16lFFVzZ7PGEJvqZNqYUEtb1mvDww4pA==} engines: {node: '>=12'} + requiresBuild: true dev: false optional: true @@ -4203,6 +4213,21 @@ packages: protobufjs: 7.2.5 yargs: 17.7.2 + /@hubspot/api-client@11.1.0: + resolution: {integrity: sha512-HUkvUJKKvKhED0RZfpjnTX+b5+RNRlFfAllT7ozLP7gEoT5fp5aT148mnBdNZTr1UPfScBdDQa42ixHjgkIlNQ==} + dependencies: + '@types/node-fetch': 2.6.11 + bottleneck: 2.19.5 + es6-promise: 4.2.8 + form-data: 2.5.1 + lodash.get: 4.4.2 + lodash.merge: 4.6.2 + node-fetch: 2.7.0 + url-parse: 1.5.10 + transitivePeerDependencies: + - encoding + dev: false + /@humanwhocodes/config-array@0.10.7: resolution: {integrity: sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==} engines: {node: '>=10.10.0'} @@ -4233,6 +4258,7 @@ packages: minimatch: 3.1.2 transitivePeerDependencies: - supports-color + dev: false /@humanwhocodes/gitignore-to-minimatch@1.0.2: resolution: {integrity: sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==} @@ -5199,6 +5225,7 @@ packages: /@jsdoc/salty@0.2.5: resolution: {integrity: sha512-TfRP53RqunNe2HBobVBJ0VLhK1HbfvBYeTC1ahnN64PWvyYyGebmMiPkuwvD9fpw2ZbkoPb8Q7mwy0aR8Z9rvw==} engines: {node: '>=v12.0.0'} + requiresBuild: true dependencies: lodash: 4.17.21 dev: false @@ -8948,6 +8975,7 @@ packages: /@types/linkify-it@3.0.2: resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==} + requiresBuild: true dev: false optional: true @@ -8969,6 +8997,7 @@ packages: /@types/markdown-it@12.2.3: resolution: {integrity: sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==} + requiresBuild: true dependencies: '@types/linkify-it': 3.0.2 '@types/mdurl': 1.0.2 @@ -8977,6 +9006,7 @@ packages: /@types/mdurl@1.0.2: resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==} + requiresBuild: true dev: false optional: true @@ -8997,6 +9027,13 @@ packages: resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} dev: true + /@types/node-fetch@2.6.11: + resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} + dependencies: + '@types/node': 18.15.11 + form-data: 4.0.0 + dev: false + /@types/node@14.18.33: resolution: {integrity: sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==} dev: true @@ -9122,6 +9159,7 @@ packages: /@types/rimraf@3.0.2: resolution: {integrity: sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==} + requiresBuild: true dependencies: '@types/glob': 8.1.0 '@types/node': 18.15.11 @@ -9365,6 +9403,7 @@ packages: typescript: 5.3.3 transitivePeerDependencies: - supports-color + dev: false /@typescript-eslint/parser@5.58.0(eslint@8.55.0)(typescript@5.3.3): resolution: {integrity: sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==} @@ -10602,6 +10641,7 @@ packages: /async-retry@1.3.3: resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + requiresBuild: true dependencies: retry: 0.13.1 dev: false @@ -11147,6 +11187,10 @@ packages: /boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + /bottleneck@2.19.5: + resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} + dev: false + /bowser@2.11.0: resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} dev: false @@ -11254,6 +11298,7 @@ packages: /buildcheck@0.0.5: resolution: {integrity: sha512-jYWpRy8eedl/JZqkOeq0X0bNcaK04hXKhIi4gYsDKZUJWRjJJWViYfsMXO0BJQ40zSLcdLoa+iqe48Kz2PtQag==} engines: {node: '>=10.0.0'} + requiresBuild: true dev: true optional: true @@ -11421,6 +11466,7 @@ packages: /catharsis@0.9.0: resolution: {integrity: sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==} engines: {node: '>= 10'} + requiresBuild: true dependencies: lodash: 4.17.21 dev: false @@ -13207,11 +13253,13 @@ packages: /ent@2.2.0: resolution: {integrity: sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==} + requiresBuild: true dev: false optional: true /entities@2.1.0: resolution: {integrity: sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==} + requiresBuild: true dev: false optional: true @@ -13340,6 +13388,10 @@ packages: is-date-object: 1.0.5 is-symbol: 1.0.4 + /es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + dev: false + /es6-promisify@6.1.1: resolution: {integrity: sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg==} dev: true @@ -13585,6 +13637,7 @@ packages: resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} engines: {node: '>=4.0'} hasBin: true + requiresBuild: true dependencies: esprima: 4.0.1 estraverse: 4.3.0 @@ -13648,7 +13701,7 @@ packages: eslint: 8.24.0 eslint-import-resolver-node: 0.3.7 eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.24.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.29.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.24.0) eslint-plugin-jsx-a11y: 6.7.1(eslint@8.24.0) eslint-plugin-react: 7.32.2(eslint@8.24.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.24.0) @@ -13686,7 +13739,7 @@ packages: confusing-browser-globals: 1.0.11 eslint: 8.55.0 eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.55.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.29.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint@8.55.0) eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.58.0)(eslint@8.55.0)(jest@27.5.1)(typescript@5.3.3) eslint-plugin-jsx-a11y: 6.7.1(eslint@8.55.0) eslint-plugin-react: 7.32.2(eslint@8.55.0) @@ -13727,6 +13780,7 @@ packages: tsconfig-paths: 3.14.2 transitivePeerDependencies: - supports-color + dev: false /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.24.0): resolution: {integrity: sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==} @@ -13739,7 +13793,7 @@ packages: enhanced-resolve: 5.15.0 eslint: 8.24.0 eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.24.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.29.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.24.0) get-tsconfig: 4.5.0 globby: 13.1.4 is-core-module: 2.12.0 @@ -13780,6 +13834,7 @@ packages: eslint-import-resolver-typescript: 2.7.1(eslint-plugin-import@2.27.5)(eslint@8.29.0) transitivePeerDependencies: - supports-color + dev: false /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.24.0): resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} @@ -13811,6 +13866,35 @@ packages: - supports-color dev: true + /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint@8.55.0): + resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 5.58.0(eslint@8.55.0)(typescript@5.3.3) + debug: 3.2.7(supports-color@5.5.0) + eslint: 8.55.0 + eslint-import-resolver-node: 0.3.7 + transitivePeerDependencies: + - supports-color + dev: false + /eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.55.0): resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} engines: {node: '>=12.0.0'} @@ -13857,6 +13941,73 @@ packages: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color + dev: false + + /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.24.0): + resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 5.58.0(eslint@8.24.0)(typescript@5.3.3) + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 + array.prototype.flatmap: 1.3.1 + debug: 3.2.7(supports-color@5.5.0) + doctrine: 2.1.0 + eslint: 8.24.0 + eslint-import-resolver-node: 0.3.7 + eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.24.0) + has: 1.0.3 + is-core-module: 2.12.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.values: 1.1.6 + resolve: 1.22.2 + semver: 6.3.1 + tsconfig-paths: 3.14.2 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.58.0)(eslint@8.55.0): + resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 5.58.0(eslint@8.55.0)(typescript@5.3.3) + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 + array.prototype.flatmap: 1.3.1 + debug: 3.2.7(supports-color@5.5.0) + doctrine: 2.1.0 + eslint: 8.55.0 + eslint-import-resolver-node: 0.3.7 + eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint@8.55.0) + has: 1.0.3 + is-core-module: 2.12.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.values: 1.1.6 + resolve: 1.22.2 + semver: 6.3.1 + tsconfig-paths: 3.14.2 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: false /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.58.0)(eslint@8.55.0)(jest@27.5.1)(typescript@5.3.3): resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} @@ -14125,6 +14276,7 @@ packages: dependencies: eslint: 8.29.0 eslint-visitor-keys: 2.1.0 + dev: false /eslint-visitor-keys@2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} @@ -14248,6 +14400,7 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color + dev: false /eslint@8.55.0: resolution: {integrity: sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==} @@ -14904,6 +15057,15 @@ packages: webpack: 5.88.2(webpack-cli@5.0.1) dev: false + /form-data@2.5.1: + resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} + engines: {node: '>= 0.12'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + /form-data@3.0.1: resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} engines: {node: '>= 6'} @@ -15031,6 +15193,7 @@ packages: /functional-red-black-tree@1.0.1: resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + requiresBuild: true dev: false optional: true @@ -15094,6 +15257,7 @@ packages: /gaxios@5.1.0: resolution: {integrity: sha512-aezGIjb+/VfsJtIcHGcBSerNEDdfdHeMros+RbYbGpmonKWQCOVOes0LVZhn1lDtIgq55qq0HaxymIoae3Fl/A==} engines: {node: '>=12'} + requiresBuild: true dependencies: extend: 3.0.2 https-proxy-agent: 5.0.1 @@ -15132,6 +15296,7 @@ packages: /gcp-metadata@5.2.0: resolution: {integrity: sha512-aFhhvvNycky2QyhG+dcfEdHBF0FRbYcf39s6WNHUDysKSrbJ5vuFbjydxBcmewtXeV248GP8dWT3ByPNxsyHCw==} engines: {node: '>=12'} + requiresBuild: true dependencies: gaxios: 5.1.0 json-bigint: 1.0.0 @@ -15401,6 +15566,7 @@ packages: /google-auth-library@8.7.0: resolution: {integrity: sha512-1M0NG5VDIvJZEnstHbRdckLZESoJwguinwN8Dhae0j2ZKIQFIV63zxm6Fo6nM4xkgqUr2bbMtV5Dgo+Hy6oo0Q==} engines: {node: '>=12'} + requiresBuild: true dependencies: arrify: 2.0.1 base64-js: 1.5.1 @@ -15437,6 +15603,7 @@ packages: resolution: {integrity: sha512-2fyb61vWxUonHiArRNJQmE4tx5oY1ni8VPo08fzII409vDSCWG7apDX4qNOQ2GXXT82gLBn3d3P1Dydh7pWjyw==} engines: {node: '>=12'} hasBin: true + requiresBuild: true dependencies: '@grpc/grpc-js': 1.8.13 '@grpc/proto-loader': 0.7.10 @@ -15491,6 +15658,7 @@ packages: resolution: {integrity: sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==} engines: {node: '>=12.0.0'} hasBin: true + requiresBuild: true dependencies: node-forge: 1.3.1 dev: false @@ -15555,6 +15723,7 @@ packages: /gtoken@6.1.2: resolution: {integrity: sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==} engines: {node: '>=12.0.0'} + requiresBuild: true dependencies: gaxios: 5.1.0 google-p12-pem: 4.0.1 @@ -16446,6 +16615,7 @@ packages: /is-stream-ended@0.1.4: resolution: {integrity: sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==} + requiresBuild: true dev: false optional: true @@ -18540,6 +18710,7 @@ packages: /js2xmlparser@4.0.2: resolution: {integrity: sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==} + requiresBuild: true dependencies: xmlcreate: 2.0.4 dev: false @@ -18549,6 +18720,7 @@ packages: resolution: {integrity: sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==} engines: {node: '>=12.0.0'} hasBin: true + requiresBuild: true dependencies: '@babel/parser': 7.22.16 '@jsdoc/salty': 0.2.5 @@ -18838,6 +19010,7 @@ packages: /klaw@3.0.0: resolution: {integrity: sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==} + requiresBuild: true dependencies: graceful-fs: 4.2.11 dev: false @@ -18912,6 +19085,7 @@ packages: /levn@0.3.0: resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} engines: {node: '>= 0.8.0'} + requiresBuild: true dependencies: prelude-ls: 1.1.2 type-check: 0.3.2 @@ -18943,6 +19117,7 @@ packages: /linkify-it@3.0.3: resolution: {integrity: sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==} + requiresBuild: true dependencies: uc.micro: 1.0.6 dev: false @@ -19053,6 +19228,10 @@ packages: resolution: {integrity: sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==} dev: false + /lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + dev: false + /lodash.includes@4.3.0: resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} dev: false @@ -19277,6 +19456,7 @@ packages: /markdown-it-anchor@8.6.7(@types/markdown-it@12.2.3)(markdown-it@12.3.2): resolution: {integrity: sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==} + requiresBuild: true peerDependencies: '@types/markdown-it': '*' markdown-it: '*' @@ -19289,6 +19469,7 @@ packages: /markdown-it@12.3.2: resolution: {integrity: sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==} hasBin: true + requiresBuild: true dependencies: argparse: 2.0.1 entities: 2.1.0 @@ -19311,6 +19492,7 @@ packages: resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} engines: {node: '>= 12'} hasBin: true + requiresBuild: true dev: false optional: true @@ -19348,6 +19530,7 @@ packages: /mdurl@1.0.1: resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + requiresBuild: true dev: false optional: true @@ -19504,6 +19687,7 @@ packages: resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} engines: {node: '>=10.0.0'} hasBin: true + requiresBuild: true dev: false optional: true @@ -20163,6 +20347,7 @@ packages: /nan@2.17.0: resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==} + requiresBuild: true dev: true optional: true @@ -22566,6 +22751,7 @@ packages: /prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} + requiresBuild: true dev: false /prelude-ls@1.2.1: @@ -22749,6 +22935,7 @@ packages: resolution: {integrity: sha512-VPWMgIcRNyQwWUv8OLPyGQ/0lQY/QTQAVN5fh+XzfDwsVw1FZ2L3DM/bcBf8WPiRz2tNpaov9lPZfNcmNo6LXA==} engines: {node: '>=12.0.0'} hasBin: true + requiresBuild: true peerDependencies: protobufjs: ^7.0.0 dependencies: @@ -22836,6 +23023,7 @@ packages: /prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + requiresBuild: true dev: true optional: true @@ -24045,6 +24233,7 @@ packages: /requizzle@0.2.4: resolution: {integrity: sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==} + requiresBuild: true dependencies: lodash: 4.17.21 dev: false @@ -24131,6 +24320,7 @@ packages: /retry-request@5.0.2: resolution: {integrity: sha512-wfI3pk7EE80lCIXprqh7ym48IHYdwmAAzESdbU8Q9l7pnRCk9LEhpbOTNKjz6FARLm/Bl5m+4F0ABxOkYUujSQ==} engines: {node: '>=12'} + requiresBuild: true dependencies: debug: 4.3.4 extend: 3.0.2 @@ -25042,6 +25232,7 @@ packages: /stream-events@1.0.5: resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==} + requiresBuild: true dependencies: stubs: 3.0.0 dev: false @@ -25274,6 +25465,7 @@ packages: /stubs@3.0.0: resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} + requiresBuild: true dev: false optional: true @@ -25579,6 +25771,7 @@ packages: /teeny-request@8.0.3: resolution: {integrity: sha512-jJZpA5He2y52yUhA7pyAGZlgQpcB+xLjcN0eUFxr9c8hP/H7uOXbBNVo/O0C/xVfJLJs680jvkFgVJEEvk9+ww==} engines: {node: '>=12'} + requiresBuild: true dependencies: http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 @@ -25808,6 +26001,7 @@ packages: /tmp@0.2.1: resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} engines: {node: '>=8.17.0'} + requiresBuild: true dependencies: rimraf: 3.0.2 dev: false @@ -26009,6 +26203,40 @@ packages: yargs-parser: 21.1.1 dev: true + /ts-jest@29.1.1(@babel/core@7.21.4)(jest@29.7.0)(typescript@5.3.3): + resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@babel/core': 7.21.4 + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@18.15.11)(ts-node@10.9.2) + jest-util: 29.5.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.5.4 + typescript: 5.3.3 + yargs-parser: 21.1.1 + dev: true + /ts-loader@9.4.2(typescript@5.3.3)(webpack@5.78.0): resolution: {integrity: sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==} engines: {node: '>=12.0.0'} @@ -26103,7 +26331,7 @@ packages: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 '@types/node': 14.18.33 - acorn: 8.11.3 + acorn: 8.8.2 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 @@ -26381,6 +26609,7 @@ packages: /type-check@0.3.2: resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} engines: {node: '>= 0.8.0'} + requiresBuild: true dependencies: prelude-ls: 1.1.2 dev: false @@ -26474,6 +26703,7 @@ packages: /uc.micro@1.0.6: resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} + requiresBuild: true dev: false optional: true @@ -26501,6 +26731,7 @@ packages: /underscore@1.13.6: resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} + requiresBuild: true dev: false optional: true @@ -27642,6 +27873,7 @@ packages: /xmlcreate@2.0.4: resolution: {integrity: sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==} + requiresBuild: true dev: false optional: true diff --git a/webapps/console/lib/schema/destinations.tsx b/webapps/console/lib/schema/destinations.tsx index 52deac0d1..b646d6860 100644 --- a/webapps/console/lib/schema/destinations.tsx +++ b/webapps/console/lib/schema/destinations.tsx @@ -27,6 +27,7 @@ import intercomIcon from "./icons/intercom"; import webhookIcon from "./icons/webhook"; import { branding } from "../branding"; import * as meta from "@jitsu/core-functions/src/meta"; +import { HubspotCredentials } from "@jitsu/core-functions/src/meta"; const s3Regions = [ "us-west-1", @@ -179,6 +180,7 @@ export type DestinationType = { comingSoon?: boolean; icon?: ReactNode; description: ReactNode; + documentation?: ReactNode; //For cloud (=server side) destinations - name builtin of the function that implements it implementingFunction?: string; //For device destinations - how this destination should be invoked? Information such as analytics plugin name, package name @@ -294,7 +296,10 @@ const tagDestination = { name: "tag", } as DeviceOptions, credentialsUi: { - code: { editor: "SnippedEditor", editorProps: { languages: ["html", "javascript"] } }, + code: { + editor: "SnippedEditor", + editorProps: { languages: ["html", "javascript"] }, + }, }, connectionOptions: DeviceDestinationsConnectionOptions, }; @@ -440,7 +445,11 @@ export const coreDestinations: DestinationType[] = [ credentialsUi: { keyFile: { editor: "CodeEditor", - editorProps: { language: "json", height: "250px", monacoOptions: { lineNumbers: "off" } }, + editorProps: { + language: "json", + height: "250px", + monacoOptions: { lineNumbers: "off" }, + }, }, }, }, @@ -714,15 +723,40 @@ export const coreDestinations: DestinationType[] = [ { id: "hubspot", icon: hubspotIcon, - comingSoon: true, connectionOptions: CloudDestinationsConnectionOptions, title: "Hubspot", tags: "CRM", - credentials: z.object({ - apiKey: z.string().describe("API Key::Hubspot API Key"), - hubId: z.string().describe("Hub ID::Hubspot Hub ID"), - }), + credentials: HubspotCredentials, description: "Hubspot is a CRM. Jitsu sends data to Hubspot API and updates contacts and company records", + documentation: ( + <> + The integration performs several functions: +
      +
    • + For each .identify() event, it either creates or updates a contact in the CRM. Jitsu utilizes a + custom property named jitsu_user_id, which is automatically generated, as the unique identifier + for the contact object. This identifier corresponds to the .userId property within the{" "} + identify event. +
    • +
    • + For each .group() event, it either creates or updates a company profile in the CRM. Here, Jitsu + employs a custom property called jitsu_group_id, which is also automatically generated, to + serve as the unique identifier for the company object. This identifier is derived from the{" "} + .groupId property within the group event. +
    • +
    • + If an event includes both groupId and userId, Jitsu will establish a linkage + between the two identifiers, effectively associating the user with the company. +
    • +
    • + When the sendPageViews feature is activated, Jitsu will forward page events, along + with other related events, to HubSpot for any identified user. Important: To utilize this + functionality, ensure that your HubSpot plan includes access to the{" "} + Events API. +
    • +
    + + ), }, { id: "devnull", diff --git a/webapps/console/lib/server/sync.ts b/webapps/console/lib/server/sync.ts index 5c32698dc..4d4a11893 100644 --- a/webapps/console/lib/server/sync.ts +++ b/webapps/console/lib/server/sync.ts @@ -561,7 +561,7 @@ export async function scheduleSync({ await dbLog({ taskId, syncId: sync.id, - message: `Error running sync: ${e?.message}${e?.stack ? `\n${e.stack}` : ""}`, + message: `Error running sync: ${syncError}${e?.stack ? `\n${e.stack}` : ""}`, level: "ERROR", }); } diff --git a/webapps/console/pages/[workspaceId]/destinations.tsx b/webapps/console/pages/[workspaceId]/destinations.tsx index bad00d202..d7936c272 100644 --- a/webapps/console/pages/[workspaceId]/destinations.tsx +++ b/webapps/console/pages/[workspaceId]/destinations.tsx @@ -1,5 +1,5 @@ import { WorkspacePageLayout } from "../../components/PageLayout/WorkspacePageLayout"; -import { Button, Modal, Popover, Skeleton, Table, Tabs, Tooltip } from "antd"; +import { Button, Collapse, Modal, Popover, Skeleton, Table, Tabs, Tooltip } from "antd"; import { ConfigEditor, ConfigEditorProps, FieldDisplay } from "../../components/ConfigObjectEditor/ConfigEditor"; import { DestinationConfig } from "../../lib/schema"; import { confirmOp, feedbackError, serialization } from "../../lib/ui"; @@ -827,6 +827,20 @@ const DestinationsList: React.FC<{ type?: string }> = ({ type }) => { editorComponent={props => { return customEditors[props.object.destinationType]; }} + subtitle={object => { + const destinationDocs = getCoreDestinationType((object as any).destinationType)?.documentation; + if (destinationDocs) { + // eslint-disable-next-line react/jsx-no-undef + return ( + + +
    {destinationDocs}
    +
    +
    + ); + } + return undefined; + }} /> ); diff --git a/webapps/console/pages/[workspaceId]/syncs/index.tsx b/webapps/console/pages/[workspaceId]/syncs/index.tsx index 9fc1248fc..3d39fd3d0 100644 --- a/webapps/console/pages/[workspaceId]/syncs/index.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/index.tsx @@ -524,18 +524,22 @@ export const SyncTitle: React.FC<{ }> = ({ syncId, service, size = "small", destination, showLink, className = false }) => { return (
    - +
    + +
    {"→"} - - {showLink && ( - } - /> - )} +
    + + {showLink && ( + } + /> + )} +
    ); }; diff --git a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx index 3b452a052..d7894a29e 100644 --- a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx @@ -3,7 +3,7 @@ import { useWorkspace } from "../../../lib/context"; import { useApi } from "../../../lib/useApi"; import { source_taskDbModel } from "../../../prisma/schema"; import { z } from "zod"; -import { DatePicker, notification, Popover, Select, Table, Tag } from "antd"; +import { Button, DatePicker, notification, Popover, Select, Table, Tag } from "antd"; import React, { PropsWithChildren, useCallback, useEffect, useMemo, useState } from "react"; import { useQueryStringState } from "../../../lib/useQueryStringState"; import { ColumnType } from "antd/es/table/interface"; @@ -14,15 +14,25 @@ import JSON5 from "json5"; import { ErrorCard } from "../../../components/GlobalError/GlobalError"; import { arrayToMap } from "../../../lib/shared/arrays"; import { JitsuButton, WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; -import { AlertCircle, CheckCircle2, ChevronLeft, ListMinusIcon, RefreshCw, XCircle } from "lucide-react"; -import { FaExternalLinkAlt, FaPlay, FaRegPlayCircle } from "react-icons/fa"; +import { + AlertCircle, + CheckCircle2, + ChevronLeft, + Edit3, + ListMinusIcon, + PlayCircle, + RefreshCw, + XCircle, +} from "lucide-react"; +import { FaExternalLinkAlt, FaRegPlayCircle } from "react-icons/fa"; import { useRouter } from "next/router"; -import { formatDateOnly, formatTime, SyncTitle } from "./index"; +import { displayTaskRunError, formatDateOnly, formatTime, SyncTitle } from "./index"; import { ButtonGroup, ButtonProps } from "../../../components/ButtonGroup/ButtonGroup"; import { rpc } from "juava"; -import { feedbackError, useKeyboard } from "../../../lib/ui"; +import { feedbackError, feedbackSuccess, useKeyboard } from "../../../lib/ui"; import hash from "object-hash"; import { useConfigObjectLinks, useConfigObjectList } from "../../../lib/store"; +import { ButtonLabel } from "../../../components/ButtonLabel/ButtonLabel"; dayjs.extend(utc); dayjs.extend(relativeTime); @@ -418,28 +428,9 @@ function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap, re render: (text, task, index) => { const items: ButtonProps[] = [ { - disabled: index > 0 || task.status === "RUNNING", - tooltip: - index > 0 - ? "Only last task may be restarted" - : task.status === "RUNNING" - ? "Sync is already running" - : undefined, - icon: , - onClick: async () => { - try { - const runStatus = await rpc(`/api/${workspace.id}/sources/run?syncId=${task.sync_id}`); - if (runStatus?.error) { - feedbackError(runStatus.error, { placement: "top" }); - } else if (refreshCb) { - refreshCb(); - } - } catch (e) { - feedbackError("Failed to run sync", { error: e, placement: "top" }); - } finally { - } - }, - label: "Run Again", + icon: , + href: `/syncs/edit?id=${task.task_id}`, + label: "Edit Sync", }, { icon: , @@ -467,6 +458,32 @@ function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap, re ); } +const ReRunButton: React.FC<{ syncId: string; updateStatus: () => void }> = props => { + const [loading, setLoading] = useState(false); + const workspace = useWorkspace(); + const rerun = async () => { + try { + setLoading(true); + const runStatus = await rpc(`/api/${workspace.id}/sources/run?syncId=${props.syncId}`); + if (runStatus?.error) { + displayTaskRunError(workspace, runStatus); + } else { + feedbackSuccess("Sync started"); + } + } catch (e) { + feedbackError("Failed to run sync", { error: e, placement: "top" }); + } finally { + setLoading(false); + props.updateStatus(); + } + }; + return ( + + ); +}; + export type TasksViewState = { dates?: DatesRange; syncId?: string; @@ -665,6 +682,9 @@ function Tasks() {
    + {state.syncId && state.syncId !== "all" && ( + setRefresh(refresh + 1)} /> + )} 0 && "animate-spin"}`} />} type="link" diff --git a/webapps/ee-api/pages/api/quotas/sync.ts b/webapps/ee-api/pages/api/quotas/sync.ts index 39b15692a..ca7c3d403 100644 --- a/webapps/ee-api/pages/api/quotas/sync.ts +++ b/webapps/ee-api/pages/api/quotas/sync.ts @@ -34,7 +34,7 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse max(started_at) as "lastSync" from newjitsu.source_task task join newjitsu."ConfigurationObjectLink" sync on task.sync_id = sync."id" - where task.status = 'SUCCESS' and "workspaceId" = :workspaceId + where task.status = 'SUCCESS' OR task.status = 'PARTIAL' and "workspaceId" = :workspaceId and started_at > now() - interval '24 hour' and deleted = false group by "workspaceId";`, diff --git a/webapps/ee-api/pages/api/report/workspace-stat.ts b/webapps/ee-api/pages/api/report/workspace-stat.ts index 9ca9cb548..e78fd1dd8 100644 --- a/webapps/ee-api/pages/api/report/workspace-stat.ts +++ b/webapps/ee-api/pages/api/report/workspace-stat.ts @@ -65,7 +65,7 @@ async function getClickhousePart({ workspaceId ? "and workspaceId = {workspaceId:String}" : "" } group by period, workspaceId - order by period desc, workspaceId desc; + order by period desc, workspaceId desc;у `; const queryParams = removeUndefined({ start: isoDateTOClickhouse(dayjs(start).utc().startOf("day").toISOString()), From 5b48957cc078ff876b9d01828d3be13e25506e85 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Wed, 27 Mar 2024 14:15:56 -0400 Subject: [PATCH 0672/1353] feat: remove excessive logging --- libs/core-functions/src/functions/hubspot-destination.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/libs/core-functions/src/functions/hubspot-destination.ts b/libs/core-functions/src/functions/hubspot-destination.ts index 30c89eaf0..a8bb8cbd6 100644 --- a/libs/core-functions/src/functions/hubspot-destination.ts +++ b/libs/core-functions/src/functions/hubspot-destination.ts @@ -105,7 +105,6 @@ class HubspotHelper { ...companyProperties, associations: [], }); - console.log(`Company '${companyId}' with jitsu id '${c.companyId}' and name '${c.name}' was created`); return companyId; } } @@ -116,9 +115,7 @@ class HubspotHelper { email: string; customProps?: Record; }): Promise { - console.log(`Searching contact by ${u.userId} and ${u.email}`); const existingContactId = await this.getContactByJitsuId(u.userId, u.email); - console.log(`Found ${existingContactId}`); const [fistName, lastName] = splitName(u.name); @@ -134,7 +131,6 @@ class HubspotHelper { if (existingContactId) { // Contact exists, update it await this.client.crm.contacts.basicApi.update(existingContactId, contactProperties); - console.log(`Contact '${existingContactId}' with jitsu id '${u.userId}' and email '${u.email}' was updated`); return existingContactId; } else { // Contact does not exist, create it @@ -142,7 +138,6 @@ class HubspotHelper { ...contactProperties, associations: [], }); - console.log(`Contact '${contactId}' with jitsu id '${u.userId}' and email '${u.email}' was created`); return contactId; } } @@ -206,7 +201,6 @@ const HubspotDestination: JitsuFunction Date: Wed, 27 Mar 2024 22:26:52 +0400 Subject: [PATCH 0673/1353] rotor: added hubspot-destination --- libs/core-functions/src/functions/hubspot-destination.ts | 1 + libs/core-functions/src/index.ts | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/libs/core-functions/src/functions/hubspot-destination.ts b/libs/core-functions/src/functions/hubspot-destination.ts index a8bb8cbd6..574e3e934 100644 --- a/libs/core-functions/src/functions/hubspot-destination.ts +++ b/libs/core-functions/src/functions/hubspot-destination.ts @@ -250,4 +250,5 @@ const HubspotDestination: JitsuFunction = { "builtin.destination.bulker": BulkerDestination as JitsuFunction, @@ -30,7 +31,7 @@ const builtinDestinations: Record "builtin.destination.mongodb": MongodbDestination as JitsuFunction, "builtin.destination.amplitude": AmplitudeDestination as JitsuFunction, "builtin.destination.facebook-conversions": FacebookConversionsApi as JitsuFunction, - "builtin.destination.hubspot": () => null, + "builtin.destination.hubspot": HubspotDestination as JitsuFunction, "builtin.destination.devnull": () => null, "builtin.destination.tag": () => undefined, "builtin.destination.gtm": () => undefined, From 29fdcc2ebc82142816d282f384e811a9e37ce4f1 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 27 Mar 2024 22:32:46 +0400 Subject: [PATCH 0674/1353] rotor: fixes --- libs/core-functions/src/functions/hubspot-destination.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libs/core-functions/src/functions/hubspot-destination.ts b/libs/core-functions/src/functions/hubspot-destination.ts index 574e3e934..711056d8c 100644 --- a/libs/core-functions/src/functions/hubspot-destination.ts +++ b/libs/core-functions/src/functions/hubspot-destination.ts @@ -125,7 +125,7 @@ class HubspotHelper { firstname: fistName, lastname: lastName, [JITSU_USER_ID_PROPERTY]: u.userId, - }, + } as { [key: string]: string }, }; if (existingContactId) { @@ -200,7 +200,7 @@ const HubspotDestination: JitsuFunction Date: Wed, 27 Mar 2024 15:59:47 -0400 Subject: [PATCH 0675/1353] feat: add documentation to destination export --- webapps/console/pages/api/destinations.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/webapps/console/pages/api/destinations.ts b/webapps/console/pages/api/destinations.ts index aa3e666eb..9e3ea57bd 100644 --- a/webapps/console/pages/api/destinations.ts +++ b/webapps/console/pages/api/destinations.ts @@ -15,8 +15,12 @@ export default createRoute() res.setHeader("Access-Control-Allow-Credentials", "true"); return { destinations: coreDestinations.map(d => ({ - ...omit(d, "icon", "credentials", "credentialsUi", "connectionOptions", "deviceOptions", "description"), + ...omit(d, "icon", "credentials", "credentialsUi", "connectionOptions", "deviceOptions", "description", "documentation"), icon: d.icon && renderToStaticMarkup(d.icon as any), + documentation: + typeof d.documentation === "string" + ? d.documentation + : d.documentation && renderToStaticMarkup(d.documentation as any), description: typeof d.description === "string" ? d.description From c98fcd3b7aed8619d95d617eb80a65f0cdea6caa Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Wed, 27 Mar 2024 16:06:54 -0400 Subject: [PATCH 0676/1353] prettier --- webapps/console/pages/api/destinations.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/webapps/console/pages/api/destinations.ts b/webapps/console/pages/api/destinations.ts index 9e3ea57bd..7de182ed7 100644 --- a/webapps/console/pages/api/destinations.ts +++ b/webapps/console/pages/api/destinations.ts @@ -15,7 +15,16 @@ export default createRoute() res.setHeader("Access-Control-Allow-Credentials", "true"); return { destinations: coreDestinations.map(d => ({ - ...omit(d, "icon", "credentials", "credentialsUi", "connectionOptions", "deviceOptions", "description", "documentation"), + ...omit( + d, + "icon", + "credentials", + "credentialsUi", + "connectionOptions", + "deviceOptions", + "description", + "documentation" + ), icon: d.icon && renderToStaticMarkup(d.icon as any), documentation: typeof d.documentation === "string" From 2efd6af202f4afb46dddc0d19f37f699dfa35a88 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Wed, 27 Mar 2024 16:36:05 -0400 Subject: [PATCH 0677/1353] removed typo --- webapps/ee-api/pages/api/report/workspace-stat.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/ee-api/pages/api/report/workspace-stat.ts b/webapps/ee-api/pages/api/report/workspace-stat.ts index e78fd1dd8..9ca9cb548 100644 --- a/webapps/ee-api/pages/api/report/workspace-stat.ts +++ b/webapps/ee-api/pages/api/report/workspace-stat.ts @@ -65,7 +65,7 @@ async function getClickhousePart({ workspaceId ? "and workspaceId = {workspaceId:String}" : "" } group by period, workspaceId - order by period desc, workspaceId desc;у + order by period desc, workspaceId desc; `; const queryParams = removeUndefined({ start: isoDateTOClickhouse(dayjs(start).utc().startOf("day").toISOString()), From 34aa6087b965e2bf6c6c813d26fcd7bfab72a957 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 28 Mar 2024 13:04:45 +0400 Subject: [PATCH 0678/1353] rotor: added profile endpoint --- libs/core-functions/package.json | 2 +- pnpm-lock.yaml | 190 ++++++------------------------- services/rotor/package.json | 4 +- services/rotor/src/index.ts | 10 +- 4 files changed, 47 insertions(+), 159 deletions(-) diff --git a/libs/core-functions/package.json b/libs/core-functions/package.json index c2e68bc01..ba539fa07 100644 --- a/libs/core-functions/package.json +++ b/libs/core-functions/package.json @@ -43,7 +43,7 @@ "isolated-vm": "4.7.2", "juava": "workspace:*", "lodash": "^4.17.21", - "mongodb": "^6.3.0", + "mongodb": "^6.5.0", "node-cache": "^5.1.2", "parse-duration": "^1.1.0", "posthog-node": "^2.4.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6a76be687..d654a13a3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,9 +1,5 @@ lockfileVersion: '6.0' -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - importers: .: @@ -201,7 +197,7 @@ importers: version: 7.5.4 ts-jest: specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.21.4)(jest@29.7.0)(typescript@5.3.3) + version: 29.1.1(@babel/core@7.21.4)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.3.3) ts-loader: specifier: ^9.4.4 version: 9.4.4(typescript@5.3.3)(webpack@5.88.2) @@ -333,8 +329,8 @@ importers: specifier: ^4.17.21 version: 4.17.21 mongodb: - specifier: ^6.3.0 - version: 6.3.0(@mongodb-js/zstd@1.2.0) + specifier: ^6.5.0 + version: 6.5.0(@mongodb-js/zstd@1.2.0) node-cache: specifier: ^5.1.2 version: 5.1.2 @@ -557,7 +553,7 @@ importers: version: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) ts-jest: specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.21.4)(jest@29.7.0)(typescript@5.3.3) + version: 29.1.1(@babel/core@7.21.4)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.3.3) tslib: specifier: ^2.6.2 version: 2.6.2 @@ -673,6 +669,9 @@ importers: tslib: specifier: ^2.4.0 version: 2.5.0 + wtfnode: + specifier: ^0.9.1 + version: 0.9.1 devDependencies: '@babel/preset-env': specifier: ^7.23.2 @@ -740,6 +739,9 @@ importers: '@types/webpack': specifier: ^5.28.0 version: 5.28.1(webpack-cli@5.0.1) + '@types/wtfnode': + specifier: ^0.7.3 + version: 0.7.3 '@webpack-cli/generators': specifier: ^3.0.0 version: 3.0.1(mem-fs-editor@9.7.0)(mem-fs@2.3.0)(prettier@2.8.7)(webpack-cli@5.0.1)(webpack@5.78.0) @@ -4258,7 +4260,6 @@ packages: minimatch: 3.1.2 transitivePeerDependencies: - supports-color - dev: false /@humanwhocodes/gitignore-to-minimatch@1.0.2: resolution: {integrity: sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==} @@ -5327,9 +5328,8 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /@mongodb-js/saslprep@1.1.0: - resolution: {integrity: sha512-Xfijy7HvfzzqiOAhAepF4SGN5e9leLkMvg/OPOF97XemjfVCYN/oWa75wnkc6mltMSTwY+XlbhWgUOJmkFspSw==} - requiresBuild: true + /@mongodb-js/saslprep@1.1.5: + resolution: {integrity: sha512-XLNOMH66KhJzUJNwT/qlMnS4WsNDWD5ASdyaSH3EtK+F4r/CFGa3jT4GNi4mfOitGvWXtdLgQJkQjxSVrio+jA==} dependencies: sparse-bitfield: 3.0.3 dev: false @@ -9281,6 +9281,10 @@ packages: '@types/node': 18.15.11 dev: false + /@types/wtfnode@0.7.3: + resolution: {integrity: sha512-UMkHpx+o2xRWLJ7PmT3bBzvIA9/0oFw80oPtY/xO4jfdq+Gznn4wP7K9B/JjMxyxy+wF+5oRPIykxeBbEDjwRg==} + dev: true + /@types/yargs-parser@21.0.0: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} @@ -9403,7 +9407,6 @@ packages: typescript: 5.3.3 transitivePeerDependencies: - supports-color - dev: false /@typescript-eslint/parser@5.58.0(eslint@8.55.0)(typescript@5.3.3): resolution: {integrity: sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==} @@ -11269,8 +11272,8 @@ packages: dependencies: node-int64: 0.4.0 - /bson@6.3.0: - resolution: {integrity: sha512-balJfqwwTBddxfnidJZagCBPP/f48zj9Sdp3OJswREOgsJzHiQSaOIAtApSgDQFYgHqAvFkp53AFSqjMDZoTFw==} + /bson@6.5.0: + resolution: {integrity: sha512-DXf1BTAS8vKyR90BO4x5v3rKVarmkdkzwOrnYDFdjAY694ILNDkmA3uRh1xXJEl+C1DAh8XCvAQ+Gh3kzubtpg==} engines: {node: '>=16.20.1'} dev: false @@ -13701,7 +13704,7 @@ packages: eslint: 8.24.0 eslint-import-resolver-node: 0.3.7 eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.24.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.24.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.29.0) eslint-plugin-jsx-a11y: 6.7.1(eslint@8.24.0) eslint-plugin-react: 7.32.2(eslint@8.24.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.24.0) @@ -13739,7 +13742,7 @@ packages: confusing-browser-globals: 1.0.11 eslint: 8.55.0 eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.55.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint@8.55.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.29.0) eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.58.0)(eslint@8.55.0)(jest@27.5.1)(typescript@5.3.3) eslint-plugin-jsx-a11y: 6.7.1(eslint@8.55.0) eslint-plugin-react: 7.32.2(eslint@8.55.0) @@ -13780,7 +13783,6 @@ packages: tsconfig-paths: 3.14.2 transitivePeerDependencies: - supports-color - dev: false /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.24.0): resolution: {integrity: sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==} @@ -13793,7 +13795,7 @@ packages: enhanced-resolve: 5.15.0 eslint: 8.24.0 eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.24.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.24.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.29.0) get-tsconfig: 4.5.0 globby: 13.1.4 is-core-module: 2.12.0 @@ -13834,7 +13836,6 @@ packages: eslint-import-resolver-typescript: 2.7.1(eslint-plugin-import@2.27.5)(eslint@8.29.0) transitivePeerDependencies: - supports-color - dev: false /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.24.0): resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} @@ -13866,35 +13867,6 @@ packages: - supports-color dev: true - /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint@8.55.0): - resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - '@typescript-eslint/parser': 5.58.0(eslint@8.55.0)(typescript@5.3.3) - debug: 3.2.7(supports-color@5.5.0) - eslint: 8.55.0 - eslint-import-resolver-node: 0.3.7 - transitivePeerDependencies: - - supports-color - dev: false - /eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.55.0): resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} engines: {node: '>=12.0.0'} @@ -13941,73 +13913,6 @@ packages: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - dev: false - - /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.24.0): - resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - dependencies: - '@typescript-eslint/parser': 5.58.0(eslint@8.24.0)(typescript@5.3.3) - array-includes: 3.1.6 - array.prototype.flat: 1.3.1 - array.prototype.flatmap: 1.3.1 - debug: 3.2.7(supports-color@5.5.0) - doctrine: 2.1.0 - eslint: 8.24.0 - eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.24.0) - has: 1.0.3 - is-core-module: 2.12.0 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.values: 1.1.6 - resolve: 1.22.2 - semver: 6.3.1 - tsconfig-paths: 3.14.2 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: true - - /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.58.0)(eslint@8.55.0): - resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - dependencies: - '@typescript-eslint/parser': 5.58.0(eslint@8.55.0)(typescript@5.3.3) - array-includes: 3.1.6 - array.prototype.flat: 1.3.1 - array.prototype.flatmap: 1.3.1 - debug: 3.2.7(supports-color@5.5.0) - doctrine: 2.1.0 - eslint: 8.55.0 - eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint@8.55.0) - has: 1.0.3 - is-core-module: 2.12.0 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.values: 1.1.6 - resolve: 1.22.2 - semver: 6.3.1 - tsconfig-paths: 3.14.2 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: false /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.58.0)(eslint@8.55.0)(jest@27.5.1)(typescript@5.3.3): resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} @@ -14276,7 +14181,6 @@ packages: dependencies: eslint: 8.29.0 eslint-visitor-keys: 2.1.0 - dev: false /eslint-visitor-keys@2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} @@ -14400,7 +14304,6 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color - dev: false /eslint@8.55.0: resolution: {integrity: sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==} @@ -20253,8 +20156,8 @@ packages: whatwg-url: 13.0.0 dev: false - /mongodb@6.3.0(@mongodb-js/zstd@1.2.0): - resolution: {integrity: sha512-tt0KuGjGtLUhLoU263+xvQmPHEGTw5LbcNC73EoFRYgSHwZt5tsoJC110hDyO1kjQzpgNrpdcSza9PknWN4LrA==} + /mongodb@6.5.0(@mongodb-js/zstd@1.2.0): + resolution: {integrity: sha512-Fozq68InT+JKABGLqctgtb8P56pRrJFkbhW0ux+x1mdHeyinor8oNzJqwLjV/t5X5nJGfTlluxfyMnOXNggIUA==} engines: {node: '>=16.20.1'} peerDependencies: '@aws-sdk/credential-providers': ^3.188.0 @@ -20280,9 +20183,9 @@ packages: socks: optional: true dependencies: - '@mongodb-js/saslprep': 1.1.0 + '@mongodb-js/saslprep': 1.1.5 '@mongodb-js/zstd': 1.2.0 - bson: 6.3.0 + bson: 6.5.0 mongodb-connection-string-url: 3.0.0 dev: false @@ -26203,40 +26106,6 @@ packages: yargs-parser: 21.1.1 dev: true - /ts-jest@29.1.1(@babel/core@7.21.4)(jest@29.7.0)(typescript@5.3.3): - resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - dependencies: - '@babel/core': 7.21.4 - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.15.11)(ts-node@10.9.2) - jest-util: 29.5.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.5.4 - typescript: 5.3.3 - yargs-parser: 21.1.1 - dev: true - /ts-loader@9.4.2(typescript@5.3.3)(webpack@5.78.0): resolution: {integrity: sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==} engines: {node: '>=12.0.0'} @@ -27849,6 +27718,11 @@ packages: optional: true dev: false + /wtfnode@0.9.1: + resolution: {integrity: sha512-Ip6C2KeQPl/F3aP1EfOnPoQk14Udd9lffpoqWDNH3Xt78svxPbv53ngtmtfI0q2Te3oTq79XKTnRNXVIn/GsPA==} + hasBin: true + dev: false + /xdg-app-paths@5.1.0: resolution: {integrity: sha512-RAQ3WkPf4KTU1A8RtFx3gWywzVKe00tfOPFfl2NDGqbIFENQO4kqAJp7mhQjNj/33W5x5hiWWUdyfPq/5SU3QA==} engines: {node: '>=6'} @@ -28092,3 +27966,7 @@ packages: node-addon-api: 2.0.2 prebuild-install: 5.3.6 dev: false + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false diff --git a/services/rotor/package.json b/services/rotor/package.json index 66d6799ab..ad4ddd21b 100644 --- a/services/rotor/package.json +++ b/services/rotor/package.json @@ -44,7 +44,8 @@ "tslib": "^2.4.0", "jsondiffpatch": "workspace:*", "@clickhouse/client": "^0.2.10", - "semver": "^7.5.4" + "semver": "^7.5.4", + "wtfnode": "^0.9.1" }, "devDependencies": { "@babel/preset-env": "^7.23.2", @@ -67,6 +68,7 @@ "@types/web": "0.0.69", "@types/webpack": "^5.28.0", "@types/express": "^4.17.13", + "@types/wtfnode": "^0.7.3", "@webpack-cli/generators": "^3.0.0", "babel-loader": "^9.1.3", "clean-webpack-plugin": "^4.0.0", diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index 01325e643..71ac9a9a2 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -1,4 +1,4 @@ -import { checkHash, checkRawToken, disableService, getLog, randomId, setServerJsonFormat, isTruish } from "juava"; +import { checkHash, checkRawToken, disableService, getLog, setServerJsonFormat, isTruish } from "juava"; import { destinationMessagesTopic, getCredentialsFromEnv, rotorConsumerGroupId } from "./lib/kafka-config"; import { kafkaRotor } from "./lib/rotor"; import { DummyEventsStore, EventsStore, mongodb } from "@jitsu/core-functions"; @@ -15,8 +15,10 @@ import { getApplicationVersion, getDiagnostics } from "./lib/version"; import { createClickhouseLogger } from "./lib/clickhouse-logger"; import { Redis } from "ioredis"; import { createRedis } from "./lib/redis"; +import wtf from "wtfnode"; export const log = getLog("rotor"); +export const profileLog = getLog("profile"); disableService("prisma"); disableService("pg"); @@ -204,6 +206,12 @@ function initHTTP(rotorContext: Omit { + wtf.setLogger("info", (message?: any, ...optionalParams: any[]) => { + profileLog.atInfo().log(message, optionalParams); + }); + wtf.dump(); + }); http.post("/func/multi", FunctionsHandlerMulti(rotorContext)); const httpServer = http.listen(rotorHttpPort, () => { log.atInfo().log(`Listening on port ${rotorHttpPort}`); From 9586432fa2933039ad6fd0935f80e5c470bec377 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 28 Mar 2024 13:16:37 +0400 Subject: [PATCH 0679/1353] rotor: added profile endpoint --- services/rotor/src/index.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index 71ac9a9a2..5b9f1cb5f 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -1,3 +1,4 @@ +import wtf from "wtfnode"; import { checkHash, checkRawToken, disableService, getLog, setServerJsonFormat, isTruish } from "juava"; import { destinationMessagesTopic, getCredentialsFromEnv, rotorConsumerGroupId } from "./lib/kafka-config"; import { kafkaRotor } from "./lib/rotor"; @@ -15,8 +16,7 @@ import { getApplicationVersion, getDiagnostics } from "./lib/version"; import { createClickhouseLogger } from "./lib/clickhouse-logger"; import { Redis } from "ioredis"; import { createRedis } from "./lib/redis"; -import wtf from "wtfnode"; - +import util from "util"; export const log = getLog("rotor"); export const profileLog = getLog("profile"); @@ -207,10 +207,14 @@ function initHTTP(rotorContext: Omit { + res.setHeader("Content-Type", "text/plain"); wtf.setLogger("info", (message?: any, ...optionalParams: any[]) => { + res.write(util.format(message, ...optionalParams) + "\n"); profileLog.atInfo().log(message, optionalParams); }); wtf.dump(); + await new Promise(resolve => setTimeout(resolve, 5000)); + res.end(); }); http.post("/func/multi", FunctionsHandlerMulti(rotorContext)); const httpServer = http.listen(rotorHttpPort, () => { From e416068b68614923758e8772b04ad1a414705d31 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 28 Mar 2024 14:53:47 +0400 Subject: [PATCH 0680/1353] rotor: destinations: make sure fetch responses are consumed in all cases --- .../src/functions/amplitude-destination.ts | 2 +- .../src/functions/bulker-destination.ts | 2 ++ .../src/functions/ga4-destination.ts | 2 +- .../src/functions/mixpanel-destination.ts | 2 -- .../src/functions/webhook-destination.ts | 6 ++++-- pnpm-lock.yaml | 15 --------------- services/rotor/package.json | 4 +--- services/rotor/src/index.ts | 11 ++--------- 8 files changed, 11 insertions(+), 33 deletions(-) diff --git a/libs/core-functions/src/functions/amplitude-destination.ts b/libs/core-functions/src/functions/amplitude-destination.ts index 9ed399f50..6417d9db2 100644 --- a/libs/core-functions/src/functions/amplitude-destination.ts +++ b/libs/core-functions/src/functions/amplitude-destination.ts @@ -130,7 +130,7 @@ const AmplitudeDestination: JitsuFunction = asyn if (result.status !== 200 && result.status !== 204) { throw new Error(`Ga4:${JSON.stringify(gaRequest)} --> ${result.status} ${await result.text()}`); } else { - ctx.log.debug(`Ga4:${JSON.stringify(gaRequest)} --> ${result.status}`); + ctx.log.debug(`Ga4:${JSON.stringify(gaRequest)} --> ${result.status} ${await result.text()}`); } } catch (e: any) { throw new RetryError(`Failed to send request to Ga4: ${JSON.stringify(gaRequest)}: ${e?.message}`); diff --git a/libs/core-functions/src/functions/mixpanel-destination.ts b/libs/core-functions/src/functions/mixpanel-destination.ts index 90da9fcb9..4ac543dcf 100644 --- a/libs/core-functions/src/functions/mixpanel-destination.ts +++ b/libs/core-functions/src/functions/mixpanel-destination.ts @@ -439,10 +439,8 @@ function getDeviceId(ctx: FullContext, event: AnalyticsServerEvent) { } const MixpanelDestination: JitsuFunction = async (event, ctx) => { - ctx.log.debug(`Mixpanel destination (props=${JSON.stringify(ctx.props)}) received event ${JSON.stringify(event)}`); if (typeof ctx.props.filterBotTraffic === "undefined" || ctx.props.filterBotTraffic) { if (ctx.ua?.bot) { - ctx.log.debug(`Skipping bot traffic`); return; } } diff --git a/libs/core-functions/src/functions/webhook-destination.ts b/libs/core-functions/src/functions/webhook-destination.ts index d569a5c09..1bf047e23 100644 --- a/libs/core-functions/src/functions/webhook-destination.ts +++ b/libs/core-functions/src/functions/webhook-destination.ts @@ -1,5 +1,5 @@ import { JitsuFunction } from "@jitsu/protocols/functions"; -import { RetryError } from "@jitsu/functions-lib"; +import { HTTPError, RetryError } from "@jitsu/functions-lib"; import type { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import { WebhookDestinationConfig } from "../meta"; @@ -18,7 +18,9 @@ const WebhookDestination: JitsuFunction=6'} diff --git a/services/rotor/package.json b/services/rotor/package.json index ad4ddd21b..66d6799ab 100644 --- a/services/rotor/package.json +++ b/services/rotor/package.json @@ -44,8 +44,7 @@ "tslib": "^2.4.0", "jsondiffpatch": "workspace:*", "@clickhouse/client": "^0.2.10", - "semver": "^7.5.4", - "wtfnode": "^0.9.1" + "semver": "^7.5.4" }, "devDependencies": { "@babel/preset-env": "^7.23.2", @@ -68,7 +67,6 @@ "@types/web": "0.0.69", "@types/webpack": "^5.28.0", "@types/express": "^4.17.13", - "@types/wtfnode": "^0.7.3", "@webpack-cli/generators": "^3.0.0", "babel-loader": "^9.1.3", "clean-webpack-plugin": "^4.0.0", diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index 5b9f1cb5f..27f89058f 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -1,4 +1,3 @@ -import wtf from "wtfnode"; import { checkHash, checkRawToken, disableService, getLog, setServerJsonFormat, isTruish } from "juava"; import { destinationMessagesTopic, getCredentialsFromEnv, rotorConsumerGroupId } from "./lib/kafka-config"; import { kafkaRotor } from "./lib/rotor"; @@ -16,9 +15,8 @@ import { getApplicationVersion, getDiagnostics } from "./lib/version"; import { createClickhouseLogger } from "./lib/clickhouse-logger"; import { Redis } from "ioredis"; import { createRedis } from "./lib/redis"; -import util from "util"; +import * as util from "util"; export const log = getLog("rotor"); -export const profileLog = getLog("profile"); disableService("prisma"); disableService("pg"); @@ -208,12 +206,7 @@ function initHTTP(rotorContext: Omit { res.setHeader("Content-Type", "text/plain"); - wtf.setLogger("info", (message?: any, ...optionalParams: any[]) => { - res.write(util.format(message, ...optionalParams) + "\n"); - profileLog.atInfo().log(message, optionalParams); - }); - wtf.dump(); - await new Promise(resolve => setTimeout(resolve, 5000)); + res.write(util.inspect(process["_getActiveHandles"]())); res.end(); }); http.post("/func/multi", FunctionsHandlerMulti(rotorContext)); From b63b759ad88efaf605d700672f1573e8d4271bac Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Sun, 31 Mar 2024 10:16:04 +0400 Subject: [PATCH 0681/1353] console: event log API: respect vercel response size limit --- .../pages/api/[workspaceId]/log/[type]/[actorId].ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts b/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts index b5ac5c9bb..d44138b17 100644 --- a/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts +++ b/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts @@ -11,6 +11,9 @@ dayjs.extend(utc); const log = getServerLog("events-log"); const metricsSchema = process.env.CLICKHOUSE_METRICS_SCHEMA || process.env.CLICKHOUSE_DATABASE || "newjitsu_metrics"; +//Vercel Limit: https://vercel.com/docs/functions/runtimes#request-body-size +const maxResponseSize = 4500000; + export const api: Api = { url: inferUrl(__filename), GET: { @@ -71,7 +74,12 @@ export const api: Api = { }, }) ).json()) as any; + let written = 0; for (const row of chResult.data) { + written += row.content.length + 70; + if (written > maxResponseSize) { + break; + } result.push({ date: dayjs(row.date).utc(true).toDate(), level: row.level, From 9abd608531095df038e2fbc338ebecfc1a1b2b2a Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 1 Apr 2024 20:51:38 +0400 Subject: [PATCH 0682/1353] rotor: heap snapshot endpoint rotor: mongodb limit pool size --- libs/core-functions/src/functions/lib/mongodb.ts | 2 +- libs/core-functions/src/functions/lib/ua.ts | 2 +- services/rotor/src/index.ts | 7 +++++++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/libs/core-functions/src/functions/lib/mongodb.ts b/libs/core-functions/src/functions/lib/mongodb.ts index f97b4ea08..fb9e1cc95 100644 --- a/libs/core-functions/src/functions/lib/mongodb.ts +++ b/libs/core-functions/src/functions/lib/mongodb.ts @@ -19,7 +19,7 @@ async function createClient() { log.atInfo().log(`Connecting to MongoDB server...`); // Create a new MongoClient - const client = new MongoClient(mongodbURL, { compressors: ["zstd"] }); + const client = new MongoClient(mongodbURL, { compressors: ["zstd"], maxPoolSize: 32 }); // Connect the client to the server (optional starting in v4.7) await client.connect(); // Establish and verify connection diff --git a/libs/core-functions/src/functions/lib/ua.ts b/libs/core-functions/src/functions/lib/ua.ts index f1c35b91b..d4f274b75 100644 --- a/libs/core-functions/src/functions/lib/ua.ts +++ b/libs/core-functions/src/functions/lib/ua.ts @@ -5,7 +5,7 @@ import NodeCache from "node-cache"; const BotUAKeywords = ["bot", "spider", "headless", "crawler", "uptimia"]; const uaCacheTTL = 60 * 10; // 10 min; -const uaCache = new NodeCache({ stdTTL: uaCacheTTL, checkperiod: 60, maxKeys: 10000 }); +const uaCache = new NodeCache({ stdTTL: uaCacheTTL, checkperiod: 60, maxKeys: 1000, useClones: false }); export function parseUserAgent(userAgent?: string): UserAgent { if (!userAgent) { diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index 27f89058f..c9c275d68 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -16,6 +16,7 @@ import { createClickhouseLogger } from "./lib/clickhouse-logger"; import { Redis } from "ioredis"; import { createRedis } from "./lib/redis"; import * as util from "util"; +import { getHeapSnapshot } from "node:v8"; export const log = getLog("rotor"); disableService("prisma"); @@ -209,6 +210,12 @@ function initHTTP(rotorContext: Omit { + const snapshot = getHeapSnapshot(); + log.atInfo().log("snapshot"); + snapshot.pipe(res); + log.atInfo().log("snapshot2"); + }); http.post("/func/multi", FunctionsHandlerMulti(rotorContext)); const httpServer = http.listen(rotorHttpPort, () => { log.atInfo().log(`Listening on port ${rotorHttpPort}`); From 65ddcb30230e4f32a28a520ae901d7ebd7d77466 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 3 Apr 2024 11:26:57 +0400 Subject: [PATCH 0683/1353] rotor: rotate udf isolates every 5min --- libs/core-functions/src/functions/udf_wrapper.ts | 11 +++++++---- services/rotor/src/lib/functions-chain.ts | 6 +++--- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/libs/core-functions/src/functions/udf_wrapper.ts b/libs/core-functions/src/functions/udf_wrapper.ts index 3703ca6cc..bc56c14d7 100644 --- a/libs/core-functions/src/functions/udf_wrapper.ts +++ b/libs/core-functions/src/functions/udf_wrapper.ts @@ -1,5 +1,5 @@ import { getLog, LogLevel, sanitize, stopwatch } from "juava"; -import { Isolate, ExternalCopy, Callback, Reference, Module } from "isolated-vm"; +import { Isolate, ExternalCopy, Callback, Reference, Module, Context } from "isolated-vm"; import { EventContext, FetchOpts, FuncReturn, JitsuFunction, Store } from "@jitsu/protocols/functions"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import { createFullContext, EventsStore } from "../context"; @@ -32,9 +32,10 @@ export const UDFWrapper = (connectionId: string, functions: UDFFunction[]): UDFW log.atInfo().log(`[${connectionId}] Compiling ${functions.length} UDF functions`); const sw = stopwatch(); let isolate: Isolate; + let context: Context; try { isolate = new Isolate({ memoryLimit: 128 }); - const context = isolate.createContextSync(); + context = isolate.createContextSync(); const jail = context.global; // This make the global object available in the context as 'global'. We use 'derefInto()' here @@ -96,7 +97,7 @@ export const UDFWrapper = (connectionId: string, functions: UDFFunction[]): UDFW throw new Error(`import is not allowed: ${specifier}`); }); wrapper.evaluateSync(); - const wrapperFunc = wrap(connectionId, isolate, wrapper); + const wrapperFunc = wrap(connectionId, isolate, context, wrapper); log.atInfo().log(`[${connectionId}] total UDF compile time: ${sw.elapsedPretty()}`); return wrapperFunc; } catch (e) { @@ -107,6 +108,7 @@ export const UDFWrapper = (connectionId: string, functions: UDFFunction[]): UDFW close: () => { try { if (isolate) { + context.release(); isolate.dispose(); log.atInfo().log(`[${connectionId}] isolate closed`); } @@ -118,7 +120,7 @@ export const UDFWrapper = (connectionId: string, functions: UDFFunction[]): UDFW } }; -function wrap(connectionId: string, isolate: Isolate, wrapper: Module) { +function wrap(connectionId: string, isolate: Isolate, context: Context, wrapper: Module) { const exported = wrapper.namespace; const ref = exported.getSync("wrappedFunctionChain", { @@ -208,6 +210,7 @@ function wrap(connectionId: string, isolate: Isolate, wrapper: Module) { close: () => { try { if (isolate) { + context.release(); isolate.dispose(); log.atInfo().log(`[${connectionId}] isolate closed.`); } diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index bad8aa939..33bf383d2 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -47,8 +47,8 @@ const functionsTime = new Prometheus.Histogram({ labelNames: ["connectionId", "functionId"] as const, }); -//cache compiled udfs for 10min (ttl is extended on each access) -const udfTTL = 60 * 10; +//cache compiled udfs for 5min +const udfTTL = 60 * 5; const udfCache = new NodeCache({ stdTTL: udfTTL, checkperiod: 60, useClones: false }); udfCache.on("del", (key, value) => { log.atInfo().log(`UDF ${key} deleted from cache`); @@ -157,7 +157,7 @@ export function buildFunctionChain(connection: EnrichedConnectionConfig, funcSto cached = { wrapper, hash }; udfCache.set(connection.id, cached); } - udfCache.ttl(connection.id, udfTTL); + //udfCache.ttl(connection.id, udfTTL); } const aggregatedFunctions: any[] = [ ...(connectionData.functions || []).filter(f => f.functionId.startsWith("builtin.transformation.")), From dede7b406b5071c722536a5484c89dd6416b4e13 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 3 Apr 2024 16:34:00 +0400 Subject: [PATCH 0684/1353] rotor: rollback: rotate udf isolates every 5min rotor: udf isolate-vm release all passed references --- libs/core-functions/__tests__/udf.test.ts | 5 +- .../src/functions/lib/udf-wrapper-code.ts | 19 +++- .../src/functions/lib/udf-wrapper-code.txtjs | 19 +++- .../src/functions/udf_wrapper.ts | 101 ++++++++++-------- services/rotor/src/lib/functions-chain.ts | 4 +- 5 files changed, 94 insertions(+), 54 deletions(-) diff --git a/libs/core-functions/__tests__/udf.test.ts b/libs/core-functions/__tests__/udf.test.ts index fb36b9015..3c11c6c36 100644 --- a/libs/core-functions/__tests__/udf.test.ts +++ b/libs/core-functions/__tests__/udf.test.ts @@ -28,6 +28,7 @@ export const config = { }; const udf = async (event, { log, fetch, props, store, geo, ...meta }) => { console.log("udf") + log.error("just for the test error. ignore it") event.test = "test123" const url = \`http://localhost:${port}/\`; console.log("url", url) @@ -37,6 +38,8 @@ const udf = async (event, { log, fetch, props, store, geo, ...meta }) => { event.store1 = await store.get("store1") event.fetch_result = result store.set("test", result) + store.set("test2", result) + await store.del("test2", result) console.log("done") return event; }; @@ -62,7 +65,7 @@ export default udf; }, workspaceId: "test", }); - console.log("res", res); + console.log("res", JSON.stringify(res, null, 2)); expect(res.result).toEqual({ messageId: "test", diff --git a/libs/core-functions/src/functions/lib/udf-wrapper-code.ts b/libs/core-functions/src/functions/lib/udf-wrapper-code.ts index aabda4da3..7d4183070 100644 --- a/libs/core-functions/src/functions/lib/udf-wrapper-code.ts +++ b/libs/core-functions/src/functions/lib/udf-wrapper-code.ts @@ -103,7 +103,7 @@ export function checkError(chainRes, funcCtx) { functionId: error.functionId || el.functionId } } else { - funcCtx.log.error(\`Function execution failed\`, error.name, error.message, {udfId: error.functionId || el.functionId}); + funcCtx.log.error.apply(undefined, [\`Function execution failed\`, error.name, error.message, {udfId: error.functionId || el.functionId}]); } } } @@ -205,10 +205,10 @@ async function runChain( } const wrappedFunctionChain = async function (eventcopy, ctxcopy) { - const c = ctxcopy.copy(); + const c = ctxcopy; let chain = []; //** @UDF_FUNCTIONS_CHAIN **// - const event = eventcopy.copy(); + const event = eventcopy; const chainRes = await runChain(chain, event, c); checkError(chainRes, c); if (Array.isArray(chainRes.events) && chainRes.events.length === 1) { @@ -235,7 +235,18 @@ const wrappedUserFunction = (id, f) => async function (event, c) { }, }, store: { - ...c.store, + set: async (key,value,opts) => { + await c.store.set.apply(undefined, [key, value,opts], { + arguments: {copy: true}, + result: { ignore: true} + }); + }, + del: async key => { + await c.store.del.apply(undefined, [key], { + arguments: {copy: true}, + result: {ignore: true} + }); + }, get: async key => { const res = await c.store.get.apply(undefined, [key], { arguments: {copy: true}, diff --git a/libs/core-functions/src/functions/lib/udf-wrapper-code.txtjs b/libs/core-functions/src/functions/lib/udf-wrapper-code.txtjs index 407999415..22b2f9662 100644 --- a/libs/core-functions/src/functions/lib/udf-wrapper-code.txtjs +++ b/libs/core-functions/src/functions/lib/udf-wrapper-code.txtjs @@ -18,7 +18,7 @@ export function checkError(chainRes, funcCtx) { functionId: error.functionId || el.functionId } } else { - funcCtx.log.error(`Function execution failed`, error.name, error.message, {udfId: error.functionId || el.functionId}); + funcCtx.log.error.apply(undefined, [`Function execution failed`, error.name, error.message, {udfId: error.functionId || el.functionId}]); } } } @@ -120,10 +120,10 @@ async function runChain( } const wrappedFunctionChain = async function (eventcopy, ctxcopy) { - const c = ctxcopy.copy(); + const c = ctxcopy; let chain = []; //** @UDF_FUNCTIONS_CHAIN **// - const event = eventcopy.copy(); + const event = eventcopy; const chainRes = await runChain(chain, event, c); checkError(chainRes, c); if (Array.isArray(chainRes.events) && chainRes.events.length === 1) { @@ -150,7 +150,18 @@ const wrappedUserFunction = (id, f) => async function (event, c) { }, }, store: { - ...c.store, + set: async (key,value,opts) => { + await c.store.set.apply(undefined, [key, value, opts], { + arguments: {copy: true}, + result: { ignore: true} + }); + }, + del: async key => { + await c.store.del.apply(undefined, [key], { + arguments: {copy: true}, + result: {ignore: true} + }); + }, get: async key => { const res = await c.store.get.apply(undefined, [key], { arguments: {copy: true}, diff --git a/libs/core-functions/src/functions/udf_wrapper.ts b/libs/core-functions/src/functions/udf_wrapper.ts index bc56c14d7..99fa8bd57 100644 --- a/libs/core-functions/src/functions/udf_wrapper.ts +++ b/libs/core-functions/src/functions/udf_wrapper.ts @@ -1,5 +1,5 @@ import { getLog, LogLevel, sanitize, stopwatch } from "juava"; -import { Isolate, ExternalCopy, Callback, Reference, Module, Context } from "isolated-vm"; +import { Isolate, ExternalCopy, Reference, Module, Context } from "isolated-vm"; import { EventContext, FetchOpts, FuncReturn, JitsuFunction, Store } from "@jitsu/protocols/functions"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import { createFullContext, EventsStore } from "../context"; @@ -133,51 +133,54 @@ function wrap(connectionId: string, isolate: Isolate, context: Context, wrapper: if (isolate.isDisposed) { throw new Error("Isolate is disposed"); } + let refs: Reference[] = []; + const eventCopy = new ExternalCopy(event); + const ctxCopy = new ExternalCopy({ + ...ctx, + log: { + info: makeReference(refs, ctx.log.info), + warn: makeReference(refs, ctx.log.warn), + debug: makeReference(refs, ctx.log.debug), + error: makeReference(refs, ctx.log.error), + }, + fetch: makeReference(refs, async (url: string, opts?: FetchOpts, extra?: any) => { + const res = await ctx.fetch(url, opts, extra); + const headers: any = {}; + res.headers.forEach((v, k) => { + headers[k] = v; + }); + const text = await res.text(); + const j = { + status: res.status, + statusText: res.statusText, + type: res.type, + redirected: res.redirected, + body: text, + bodyUsed: true, + url: res.url, + ok: res.ok, + headers: headers, + }; + return JSON.stringify(j); + }), + store: { + get: makeReference(refs, async (key: string) => { + const res = await ctx.store.get(key); + return JSON.stringify(res); + }), + set: makeReference(refs, ctx.store.set), + del: makeReference(refs, ctx.store.del), + ttl: makeReference(refs, async (key: string) => { + return await ctx.store.ttl(key); + }), + }, + }); try { const res = await ref.apply( undefined, [ - new ExternalCopy(event), - new ExternalCopy({ - ...ctx, - log: { - info: new Callback(ctx.log.info), - warn: new Callback(ctx.log.warn), - debug: new Callback(ctx.log.debug), - error: new Callback(ctx.log.error), - }, - fetch: new Reference(async (url: string, opts?: FetchOpts, extra?: any) => { - const res = await ctx.fetch(url, opts, extra); - const headers: any = {}; - res.headers.forEach((v, k) => { - headers[k] = v; - }); - const text = await res.text(); - const j = { - status: res.status, - statusText: res.statusText, - type: res.type, - redirected: res.redirected, - body: text, - bodyUsed: true, - url: res.url, - ok: res.ok, - headers: headers, - }; - return JSON.stringify(j); - }), - store: { - get: new Reference(async (key: string) => { - const res = await ctx.store.get(key); - return JSON.stringify(res); - }), - set: new Callback(ctx.store.set, { ignored: true }), - del: new Callback(ctx.store.del, { ignored: true }), - ttl: new Reference(async (key: string) => { - return await ctx.store.ttl(key); - }), - }, - }), + eventCopy.copyInto({ release: true, transferIn: true }), + ctxCopy.copyInto({ release: true, transferIn: true }), ], { result: { promise: true }, @@ -191,7 +194,9 @@ function wrap(connectionId: string, isolate: Isolate, context: Context, wrapper: case "boolean": return res; default: - return (res as Reference).copy(); + const r = (res as Reference).copy(); + (res as Reference).release(); + return r; } } catch (e: any) { if (isolate.isDisposed) { @@ -203,6 +208,10 @@ function wrap(connectionId: string, isolate: Isolate, context: Context, wrapper: } //log.atInfo().log(`ERROR name: ${e.name} message: ${e.message} json: ${e.stack}`); throw e; + } finally { + for (const r of refs) { + r.release(); + } } }; return { @@ -221,6 +230,12 @@ function wrap(connectionId: string, isolate: Isolate, context: Context, wrapper: }; } +function makeReference(refs: Reference[], obj: any): Reference { + const ref = new Reference(obj); + refs.push(ref); + return ref; +} + export type UDFTestRequest = { functionId: string; functionName: string; diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index 33bf383d2..1a32e0b25 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -48,7 +48,7 @@ const functionsTime = new Prometheus.Histogram({ }); //cache compiled udfs for 5min -const udfTTL = 60 * 5; +const udfTTL = 60 * 10; const udfCache = new NodeCache({ stdTTL: udfTTL, checkperiod: 60, useClones: false }); udfCache.on("del", (key, value) => { log.atInfo().log(`UDF ${key} deleted from cache`); @@ -157,7 +157,7 @@ export function buildFunctionChain(connection: EnrichedConnectionConfig, funcSto cached = { wrapper, hash }; udfCache.set(connection.id, cached); } - //udfCache.ttl(connection.id, udfTTL); + udfCache.ttl(connection.id, udfTTL); } const aggregatedFunctions: any[] = [ ...(connectionData.functions || []).filter(f => f.functionId.startsWith("builtin.transformation.")), From 28b88aeb896d6263a9951c5dde3ddea67a65320b Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 3 Apr 2024 16:54:44 +0400 Subject: [PATCH 0685/1353] rotor: fix --- libs/core-functions/src/functions/lib/udf-wrapper-code.ts | 2 +- libs/core-functions/src/functions/lib/udf-wrapper-code.txtjs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/core-functions/src/functions/lib/udf-wrapper-code.ts b/libs/core-functions/src/functions/lib/udf-wrapper-code.ts index 7d4183070..3b52334f6 100644 --- a/libs/core-functions/src/functions/lib/udf-wrapper-code.ts +++ b/libs/core-functions/src/functions/lib/udf-wrapper-code.ts @@ -103,7 +103,7 @@ export function checkError(chainRes, funcCtx) { functionId: error.functionId || el.functionId } } else { - funcCtx.log.error.apply(undefined, [\`Function execution failed\`, error.name, error.message, {udfId: error.functionId || el.functionId}]); + funcCtx.log.error.apply(undefined, [\`Function execution failed\`, error.name, error.message, {udfId: error.functionId || el.functionId}], {arguments: {copy: true}}); } } } diff --git a/libs/core-functions/src/functions/lib/udf-wrapper-code.txtjs b/libs/core-functions/src/functions/lib/udf-wrapper-code.txtjs index 22b2f9662..db8732775 100644 --- a/libs/core-functions/src/functions/lib/udf-wrapper-code.txtjs +++ b/libs/core-functions/src/functions/lib/udf-wrapper-code.txtjs @@ -18,7 +18,7 @@ export function checkError(chainRes, funcCtx) { functionId: error.functionId || el.functionId } } else { - funcCtx.log.error.apply(undefined, [`Function execution failed`, error.name, error.message, {udfId: error.functionId || el.functionId}]); + funcCtx.log.error.apply(undefined, [`Function execution failed`, error.name, error.message, {udfId: error.functionId || el.functionId}], {arguments: {copy: true}}); } } } From 965b8d1c375cd86a904519712dbcb3a2ae1a36a8 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Sun, 7 Apr 2024 20:05:19 -0400 Subject: [PATCH 0686/1353] fix: intercom destination debug logger --- .../src/functions/intercom-destination.ts | 135 ++++++++++++++---- 1 file changed, 108 insertions(+), 27 deletions(-) diff --git a/libs/core-functions/src/functions/intercom-destination.ts b/libs/core-functions/src/functions/intercom-destination.ts index d65cc2d7b..9feabeadb 100644 --- a/libs/core-functions/src/functions/intercom-destination.ts +++ b/libs/core-functions/src/functions/intercom-destination.ts @@ -4,6 +4,7 @@ import { IntercomDestinationCredentials } from "../meta"; import { JsonFetcher, jsonFetcher } from "./lib/json-fetch"; import { isEqual, pick } from "lodash"; import { requireDefined } from "juava"; +import { RetryError } from "@jitsu/functions-lib"; type ExtendedCtx = FullContext & { jsonFetch: JsonFetcher; @@ -17,13 +18,14 @@ function nullsToUndefined(obj: any) { export type IntercomCompany = { id: string; - company_id?: string; + // company_id?: string; [key: string]: any; }; export type IntercomContact = { id: string; - company_id?: string; + custom_attributes?: Record; + // company_id?: string; }; async function getContactByOurUserId( @@ -132,11 +134,11 @@ function toDate(timestamp?: string | number | Date): Date { } } -async function createOrUpdateContact(event: AnalyticsServerEvent, { jsonFetch, log, props }: ExtendedCtx) { - if (!event.traits?.email) { - return; - } - const existingContact = await jsonFetch(`https://api.intercom.io/contacts/search`, { +async function getContactByExternalIdOrEmail( + { email, externalId }: { email: string; externalId?: string }, + { jsonFetch, props, log }: ExtendedCtx +): Promise { + const result = await jsonFetch(`https://api.intercom.io/contacts/search`, { headers: { Authorization: `Bearer ${props.accessToken}`, Accept: "application/json", @@ -149,14 +151,14 @@ async function createOrUpdateContact(event: AnalyticsServerEvent, { jsonFetch, l { field: "email", operator: "=", - value: (event.traits || {}).email, + value: email, }, - ...(event.userId + ...(externalId ? [ { field: "external_id", operator: "=", - value: event.userId, + value: externalId, }, ] : []), @@ -164,10 +166,46 @@ async function createOrUpdateContact(event: AnalyticsServerEvent, { jsonFetch, l }, }, }); - const newContact = { + log.debug( + `Intercom: search for contact by email=${email} and external_id=${externalId} returned ${result.data.length} contacts` + ); + if (result.data.length > 1) { + log.warn( + `Intercom: search for contact by email=${email} and external_id=${externalId} returned more than 1 (=${result.data.length}) contacts` + ); + } + return result.data?.[0]; +} + +function extractContactIdFromErrorMessage(body: any): string | undefined { + const message = body?.errors?.[0]?.message; + if (!message) { + return; + } + const idPattern = /id=([a-zA-Z0-9]+)/; + const match = message.match(idPattern); + + if (match && match[1]) { + return match[1]; + } +} + +async function createOrUpdateContact(event: AnalyticsServerEvent, ctx: ExtendedCtx): Promise { + const { jsonFetch, log, props } = ctx; + if (!event.traits?.email) { + log.warn( + `Intercom: ${event.type} with userId=${event.userId} doesn't have email, skipping. Intercom requires email to create a contact` + ); + return; + } + const email = event.traits.email as string; + + const existingContact = await getContactByExternalIdOrEmail({ email, externalId: event.userId }, ctx); + + const contactData = { role: "user", external_id: event.userId || undefined, - email: (event.traits || {}).email, + email, name: event.traits?.name || (event.traits?.firstName && event.traits?.lastName @@ -176,32 +214,58 @@ async function createOrUpdateContact(event: AnalyticsServerEvent, { jsonFetch, l phone: event.traits?.phone, custom_attributes: {}, // omit(event.traits || {}, "name", "firstName", "lastName", "phone", "email"), }; - if (existingContact.data.length === 0) { + if (!existingContact) { log.debug( - `Contact ${(event.traits || {}).email} not found, creating a new one:\n${JSON.stringify(newContact, null, 2)}` + `Contact with email=${email} and userId=${event.userId} not found, creating a new one:\n${JSON.stringify( + contactData, + null, + 2 + )}` ); - const createContactResponse = await jsonFetch(`https://api.intercom.io/contacts`, { + const createContactResponse = await fetch(`https://api.intercom.io/contacts`, { headers: { Authorization: `Bearer ${props.accessToken}`, Accept: "application/json", "Content-Type": "application/json", }, - body: newContact, + body: JSON.stringify(contactData), }); - return createContactResponse.id; + if (!createContactResponse.ok) { + if (createContactResponse.status === 409) { + const body = await createContactResponse.json(); + log.warn( + `Intercom: contact with email=${email} and userId=${ + event.userId + } already exists, skipping. Request: ${email}, ${JSON.stringify( + contactData, + null, + 2 + )}, response: ${JSON.stringify(body, null, 2)}` + ); + return extractContactIdFromErrorMessage(body); + } else { + const body = await createContactResponse.json(); + const errorMessage = `Intercom: attempt to create a contact email=${email} and userId=${ + event.userId + } failed with ${createContactResponse.status} ${ + createContactResponse.statusText + }. Request: ${email}, ${JSON.stringify(contactData, null, 2)}, response: ${JSON.stringify(body, null, 2)}`; + //log.warn(errorMessage); + throw new RetryError(errorMessage, { drop: false }); + } + } + return (await createContactResponse.json()).id; } else { - const contact = existingContact.data[0]; + const contact = existingContact; const forComparison = { ...nullsToUndefined(pick(contact, "name", "email", "phone", "role", "external_id")), custom_attributes: contact.custom_attributes || {}, } as any; - if (isEqual(forComparison, newContact) && !alwaysUpdate) { - log.debug(`Contact ${(event.traits || {}).email} already exists and is up to date, skipping`); + if (isEqual(forComparison, contactData) && !alwaysUpdate) { + log.debug(`Contact with email=${email} and userId=${event.userId} already exists and is up to date, skipping`); return; } else { - log.debug( - `Contact ${(event.traits || {}).email} needs to be updated, updating ${JSON.stringify(newContact, null, 2)}` - ); + log.debug(`Contact with email=${email} and userId=${event.userId} needs to be updated, updating ${JSON.stringify(contactData, null, 2)}`); await jsonFetch(`https://api.intercom.io/contacts/${contact.id}`, { method: "PUT", headers: { @@ -209,8 +273,8 @@ async function createOrUpdateContact(event: AnalyticsServerEvent, { jsonFetch, l Accept: "application/json", "Content-Type": "application/json", }, - body: newContact, - //body: forComparison.external_id ? omit(newContact, "external_id") : newContact, + body: contactData, + //body: forComparison.external_id ? omit(contactData, "external_id") : contactData, }); } return contact.id; @@ -264,11 +328,28 @@ const IntercomDestination: JitsuFunction Date: Sun, 7 Apr 2024 21:35:26 -0400 Subject: [PATCH 0687/1353] fix: intercom destination debug logger --- libs/core-functions/src/functions/intercom-destination.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/libs/core-functions/src/functions/intercom-destination.ts b/libs/core-functions/src/functions/intercom-destination.ts index 9feabeadb..ff820dab8 100644 --- a/libs/core-functions/src/functions/intercom-destination.ts +++ b/libs/core-functions/src/functions/intercom-destination.ts @@ -265,7 +265,13 @@ async function createOrUpdateContact(event: AnalyticsServerEvent, ctx: ExtendedC log.debug(`Contact with email=${email} and userId=${event.userId} already exists and is up to date, skipping`); return; } else { - log.debug(`Contact with email=${email} and userId=${event.userId} needs to be updated, updating ${JSON.stringify(contactData, null, 2)}`); + log.debug( + `Contact with email=${email} and userId=${event.userId} needs to be updated, updating ${JSON.stringify( + contactData, + null, + 2 + )}` + ); await jsonFetch(`https://api.intercom.io/contacts/${contact.id}`, { method: "PUT", headers: { From 1a3d5a4a48ea6ea03d6a8ad39d826ad8a1efbe7c Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 9 Apr 2024 11:30:40 +0400 Subject: [PATCH 0688/1353] Feat/newjitsu/func chain refactor (#1097) * rotor: refactoring: Introduce FunctionChainContext that is stored and cached along with FuncChain * rotor: udf: pass FunctionChainContext and FunctionContext to isolate once as global object instead of doing it on every event. * rotor: bulker and mixpanel destinations optimizations --- cli/jitsu-cli/data/page.json | 3 +- ...est.ts => datalayout-jitsu-legacy.test.ts} | 62 -- .../__tests__/datalayout-segment.test.ts | 68 ++ .../__tests__/lib/datalayout-test-data.ts | 587 ++++++++++++++++++ .../__tests__/lib/testing-lib.ts | 26 +- libs/core-functions/__tests__/udf.test.ts | 13 +- .../__tests__/user-recognition.test.ts | 34 +- libs/core-functions/src/context.ts | 235 ------- .../src/functions/amplitude-destination.ts | 8 +- .../src/functions/bulker-destination.ts | 182 +++--- .../src/functions/facebook-conversions.ts | 6 +- .../src/functions/ga4-destination.ts | 2 +- .../src/functions/june-destination.ts | 11 +- .../core-functions/src/functions/lib/index.ts | 312 +++++++++- .../src/functions/lib/json-fetch.ts | 12 +- .../src/functions/lib/udf-wrapper-code.ts | 299 ++++----- .../src/functions/lib/udf-wrapper-code.txtjs | 229 +++---- .../src/functions/mixpanel-destination.ts | 147 +++-- .../src/functions/segment-destination.ts | 11 +- .../src/functions/udf_wrapper.ts | 165 +++-- .../src/functions/user-recognition.ts | 7 +- libs/core-functions/src/index.ts | 12 +- pnpm-lock.yaml | 93 ++- services/rotor/package.json | 2 + services/rotor/src/lib/config-types.ts | 1 + services/rotor/src/lib/functions-chain.ts | 160 +++-- services/rotor/src/lib/message-handler.ts | 54 +- types/protocols/functions.d.ts | 11 +- .../FunctionsDebugger/FunctionsDebugger.tsx | 4 +- .../FunctionsDebugger/example_events.ts | 11 +- .../HTTPApi.tsx | 2 +- .../pages/api/admin/export/[name]/index.ts | 2 + 32 files changed, 1780 insertions(+), 991 deletions(-) rename libs/core-functions/__tests__/{jitsu-legacy.test.ts => datalayout-jitsu-legacy.test.ts} (74%) create mode 100644 libs/core-functions/__tests__/datalayout-segment.test.ts create mode 100644 libs/core-functions/__tests__/lib/datalayout-test-data.ts delete mode 100644 libs/core-functions/src/context.ts diff --git a/cli/jitsu-cli/data/page.json b/cli/jitsu-cli/data/page.json index 8397bed6b..5424407c5 100644 --- a/cli/jitsu-cli/data/page.json +++ b/cli/jitsu-cli/data/page.json @@ -21,6 +21,7 @@ "name": "jitsu-js", "version": "1.0.0" }, + "ip": "69.162.81.155", "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/111.0", "locale": "en-US", "screen": { @@ -41,7 +42,7 @@ "search": "", "title": "Example page event", "url": "https://example.com/", - "enconding": "UTF-8" + "encoding": "UTF-8" }, "campaign": { "name": "example", diff --git a/libs/core-functions/__tests__/jitsu-legacy.test.ts b/libs/core-functions/__tests__/datalayout-jitsu-legacy.test.ts similarity index 74% rename from libs/core-functions/__tests__/jitsu-legacy.test.ts rename to libs/core-functions/__tests__/datalayout-jitsu-legacy.test.ts index 5d89efe27..a425668d5 100644 --- a/libs/core-functions/__tests__/jitsu-legacy.test.ts +++ b/libs/core-functions/__tests__/datalayout-jitsu-legacy.test.ts @@ -181,65 +181,3 @@ test("legacy event", () => { console.log(JSON.stringify(pageLegacyResult, null, 2)); expect(pageLegacyResult).toStrictEqual(legacyPageExpected); }); - -const pageSegmentExpected = { - message_id: "d0c6abf6-97f7-487a-a197-8f236c728fa8", - anonymous_id: "6638caf0-d2c2-4bc0-aecf-8b290b559a37", - context: { - campaign: { - medium: "medium", - name: "campaign", - source: "source", - }, - library: { - name: "jitsu-js", - version: "1.0.0", - }, - locale: "en-US", - page: { - host: "localhost:3088", - path: "/basic.html", - referrer: "https://referrer.com", - referring_domain: "", - search: "?utm_source=source&utm_medium=medium&utm_campaign=campaign", - title: "Tracking page", - url: "https://localhost:3088/basic.html?utm_source=source&utm_medium=medium&utm_campaign=campaign", - }, - screen: { - density: 1, - height: 720, - inner_height: 720, - inner_width: 1280, - width: 1280, - }, - traits: { - case_name: "identify-without-user-id", - email: "john.doe3@gmail.com", - case_last_name: "Doe", - user_name: "jj", - }, - user_agent: - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/107.0.5304.18 Safari/537.36", - }, - sent_at: "2022-11-14T08:56:34.395Z", - timestamp: "2022-11-14T08:56:34.395Z", - type: "page", - user_id: "userId2", - case_name: "page-with-name", - hash: "", - height: 720, - name: "test-page", - path: "/basic.html", - search: "?utm_source=source&utm_medium=medium&utm_campaign=campaign", - title: "Tracking page", - url: "https://localhost:3088/basic.html?utm_source=source&utm_medium=medium&utm_campaign=campaign", - width: 1280, -}; - -test("segment event", () => { - const pageSegmentResult = segmentLayout(page, false); - expect(Array.isArray(pageSegmentResult)).toBe(false); - const pageSegment = (pageSegmentResult as MappedEvent).event; - console.log(JSON.stringify(pageSegment, null, 2)); - expect(pageSegment).toStrictEqual(pageSegmentExpected); -}); diff --git a/libs/core-functions/__tests__/datalayout-segment.test.ts b/libs/core-functions/__tests__/datalayout-segment.test.ts new file mode 100644 index 000000000..f2c14abcc --- /dev/null +++ b/libs/core-functions/__tests__/datalayout-segment.test.ts @@ -0,0 +1,68 @@ +import { MappedEvent, segmentLayout } from "../src/functions/bulker-destination"; + +import { + group, + groupExpected, + groupExpectedSingleTable, + identify, + identifyExpected, + identifyExpectedSingleTable, + page, + pageExpected, + pageExpectedSingleTable, + track, + trackExpected, + trackExpectedSingleTable, +} from "./lib/datalayout-test-data"; + +test("segment event", () => { + const pageResult = segmentLayout(page, false); + expect(Array.isArray(pageResult)).toBe(false); + const pageEvent = (pageResult as MappedEvent).event; + console.log(JSON.stringify(pageEvent, null, 2)); + expect(pageEvent).toStrictEqual(pageExpected); + + const identifyResult = segmentLayout(identify, false); + expect(Array.isArray(identifyResult)).toBe(false); + const identifyEvent = (identifyResult as MappedEvent).event; + console.log(JSON.stringify(identifyEvent, null, 2)); + expect(identifyEvent).toStrictEqual(identifyExpected); + + const trackResult = segmentLayout(track, false); + expect(Array.isArray(trackResult)).toBe(true); + const trackEvents = (trackResult as MappedEvent[]).map(t => t.event); + console.log(JSON.stringify(trackEvents, null, 2)); + expect(trackEvents).toStrictEqual(trackExpected); + + const groupResult = segmentLayout(group, false); + expect(Array.isArray(groupResult)).toBe(false); + const groupEvents = (groupResult as MappedEvent).event; + console.log(JSON.stringify(groupEvents, null, 2)); + expect(groupEvents).toStrictEqual(groupExpected); +}); + +test("segment event single table", () => { + const pageResult = segmentLayout(page, true); + expect(Array.isArray(pageResult)).toBe(false); + const pageEvent = (pageResult as MappedEvent).event; + console.log(JSON.stringify(pageEvent, null, 2)); + expect(pageEvent).toStrictEqual(pageExpectedSingleTable); + + const identifyResult = segmentLayout(identify, true); + expect(Array.isArray(identifyResult)).toBe(false); + const identifyEvent = (identifyResult as MappedEvent).event; + console.log(JSON.stringify(identifyEvent, null, 2)); + expect(identifyEvent).toStrictEqual(identifyExpectedSingleTable); + + const trackResult = segmentLayout(track, true); + expect(Array.isArray(trackResult)).toBe(false); + const trackEvent = (trackResult as MappedEvent).event; + console.log(JSON.stringify(trackEvent, null, 2)); + expect(trackEvent).toStrictEqual(trackExpectedSingleTable); + + const groupResult = segmentLayout(group, true); + expect(Array.isArray(groupResult)).toBe(false); + const groupEvents = (groupResult as MappedEvent).event; + console.log(JSON.stringify(groupEvents, null, 2)); + expect(groupEvents).toStrictEqual(groupExpectedSingleTable); +}); diff --git a/libs/core-functions/__tests__/lib/datalayout-test-data.ts b/libs/core-functions/__tests__/lib/datalayout-test-data.ts new file mode 100644 index 000000000..98e1bdd87 --- /dev/null +++ b/libs/core-functions/__tests__/lib/datalayout-test-data.ts @@ -0,0 +1,587 @@ +import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; + +export const page: AnalyticsServerEvent = { + messageId: "d0c6abf6-97f7-487a-a197-8f236c728fa8", + anonymousId: "6638caf0-d2c2-4bc0-aecf-8b290b559a37", + context: { + groupId: "cl9y5kgth0002ccfn3vtqz64g", + campaign: { + medium: "medium", + name: "campaign", + source: "source", + }, + library: { + name: "jitsu-js", + version: "1.0.0", + }, + locale: "en-US", + page: { + host: "localhost:3088", + path: "/basic.html", + referrer: "https://referrer.com", + referring_domain: "", + search: "?utm_source=source&utm_medium=medium&utm_campaign=campaign", + title: "Tracking page", + url: "https://localhost:3088/basic.html?utm_source=source&utm_medium=medium&utm_campaign=campaign", + }, + screen: { + density: 1, + height: 720, + innerHeight: 720, + innerWidth: 1280, + width: 1280, + }, + traits: { + caseName: "identify-without-user-id", + CaseLastName: "Doe", + User_Name: "jj", + email: "john.doe3@gmail.com", + }, + userAgent: + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/107.0.5304.18 Safari/537.36", + }, + properties: { + caseName: "page-with-name", + hash: "", + height: 720, + name: "test-page", + path: "/basic.html", + search: "?utm_source=source&utm_medium=medium&utm_campaign=campaign", + title: "Tracking page", + url: "https://localhost:3088/basic.html?utm_source=source&utm_medium=medium&utm_campaign=campaign", + width: 1280, + }, + sentAt: "2022-11-14T08:56:34.395Z", + timestamp: "2022-11-14T08:56:34.395Z", + type: "page", + userId: "userId2", +}; + +export const pageExpected = { + message_id: "d0c6abf6-97f7-487a-a197-8f236c728fa8", + anonymous_id: "6638caf0-d2c2-4bc0-aecf-8b290b559a37", + context: { + group_id: "cl9y5kgth0002ccfn3vtqz64g", + campaign: { + medium: "medium", + name: "campaign", + source: "source", + }, + library: { + name: "jitsu-js", + version: "1.0.0", + }, + locale: "en-US", + page: { + host: "localhost:3088", + path: "/basic.html", + referrer: "https://referrer.com", + referring_domain: "", + search: "?utm_source=source&utm_medium=medium&utm_campaign=campaign", + title: "Tracking page", + url: "https://localhost:3088/basic.html?utm_source=source&utm_medium=medium&utm_campaign=campaign", + }, + screen: { + density: 1, + height: 720, + inner_height: 720, + inner_width: 1280, + width: 1280, + }, + traits: { + case_name: "identify-without-user-id", + email: "john.doe3@gmail.com", + case_last_name: "Doe", + user_name: "jj", + }, + user_agent: + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/107.0.5304.18 Safari/537.36", + }, + sent_at: "2022-11-14T08:56:34.395Z", + timestamp: "2022-11-14T08:56:34.395Z", + type: "page", + user_id: "userId2", + case_name: "page-with-name", + hash: "", + height: 720, + name: "test-page", + path: "/basic.html", + search: "?utm_source=source&utm_medium=medium&utm_campaign=campaign", + title: "Tracking page", + url: "https://localhost:3088/basic.html?utm_source=source&utm_medium=medium&utm_campaign=campaign", + width: 1280, +}; + +export const pageExpectedSingleTable = { + message_id: "d0c6abf6-97f7-487a-a197-8f236c728fa8", + anonymous_id: "6638caf0-d2c2-4bc0-aecf-8b290b559a37", + context: { + group_id: "cl9y5kgth0002ccfn3vtqz64g", + campaign: { + medium: "medium", + name: "campaign", + source: "source", + }, + library: { + name: "jitsu-js", + version: "1.0.0", + }, + locale: "en-US", + page: { + host: "localhost:3088", + path: "/basic.html", + referrer: "https://referrer.com", + referring_domain: "", + search: "?utm_source=source&utm_medium=medium&utm_campaign=campaign", + title: "Tracking page", + url: "https://localhost:3088/basic.html?utm_source=source&utm_medium=medium&utm_campaign=campaign", + }, + screen: { + density: 1, + height: 720, + inner_height: 720, + inner_width: 1280, + width: 1280, + }, + traits: { + case_name: "identify-without-user-id", + email: "john.doe3@gmail.com", + case_last_name: "Doe", + user_name: "jj", + }, + user_agent: + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/107.0.5304.18 Safari/537.36", + }, + sent_at: "2022-11-14T08:56:34.395Z", + timestamp: "2022-11-14T08:56:34.395Z", + type: "page", + user_id: "userId2", + case_name: "page-with-name", + hash: "", + height: 720, + name: "test-page", + path: "/basic.html", + search: "?utm_source=source&utm_medium=medium&utm_campaign=campaign", + title: "Tracking page", + url: "https://localhost:3088/basic.html?utm_source=source&utm_medium=medium&utm_campaign=campaign", + width: 1280, +}; + +export const identify: AnalyticsServerEvent = { + writeKey: "writeKey", + messageId: "a6c09b16-c2bc-4193-990f-5e2b694ae610", + anonymousId: "6638caf0-d2c2-4bc0-aecf-8b290b559a37", + context: { + groupId: "cl9y5kgth0002ccfn3vtqz64g", + ip: "141.136.89.181", + campaign: { + medium: "medium", + name: "campaign", + source: "source", + }, + library: { + name: "jitsu-js", + version: "1.0.0", + }, + locale: "en-US", + page: { + host: "localhost:3088", + path: "/basic.html", + referrer: "https://referrer.com", + referring_domain: "referrer.com", + search: "?utm_source=source&utm_medium=medium&utm_campaign=campaign", + title: "Tracking page", + url: "https://localhost:3088/basic.html?utm_source=source&utm_medium=medium&utm_campaign=campaign", + }, + screen: { + density: 1, + height: 720, + innerHeight: 720, + innerWidth: 1280, + width: 1280, + }, + userAgent: + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/107.0.5304.18 Safari/537.36", + }, + sentAt: "2022-11-14T08:56:34.387Z", + timestamp: "2022-11-14T08:56:34.387Z", + traits: { + caseName: "basic-identify", + CaseLastName: "Doe", + User_Name: "jj", + email: "john.doe2@gmail.com", + }, + type: "identify", + userId: "userId2", +}; + +export const identifyExpected = { + write_key: "writeKey", + message_id: "a6c09b16-c2bc-4193-990f-5e2b694ae610", + anonymous_id: "6638caf0-d2c2-4bc0-aecf-8b290b559a37", + context: { + ip: "141.136.89.181", + group_id: "cl9y5kgth0002ccfn3vtqz64g", + campaign: { + medium: "medium", + name: "campaign", + source: "source", + }, + library: { + name: "jitsu-js", + version: "1.0.0", + }, + locale: "en-US", + page: { + host: "localhost:3088", + path: "/basic.html", + referrer: "https://referrer.com", + referring_domain: "referrer.com", + search: "?utm_source=source&utm_medium=medium&utm_campaign=campaign", + title: "Tracking page", + url: "https://localhost:3088/basic.html?utm_source=source&utm_medium=medium&utm_campaign=campaign", + }, + screen: { + density: 1, + height: 720, + inner_height: 720, + inner_width: 1280, + width: 1280, + }, + user_agent: + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/107.0.5304.18 Safari/537.36", + }, + sent_at: "2022-11-14T08:56:34.387Z", + timestamp: "2022-11-14T08:56:34.387Z", + case_name: "basic-identify", + case_last_name: "Doe", + user_name: "jj", + email: "john.doe2@gmail.com", + user_id: "userId2", +}; + +export const identifyExpectedSingleTable = { + write_key: "writeKey", + message_id: "a6c09b16-c2bc-4193-990f-5e2b694ae610", + anonymous_id: "6638caf0-d2c2-4bc0-aecf-8b290b559a37", + context: { + ip: "141.136.89.181", + group_id: "cl9y5kgth0002ccfn3vtqz64g", + campaign: { + medium: "medium", + name: "campaign", + source: "source", + }, + library: { + name: "jitsu-js", + version: "1.0.0", + }, + locale: "en-US", + page: { + host: "localhost:3088", + path: "/basic.html", + referrer: "https://referrer.com", + referring_domain: "referrer.com", + search: "?utm_source=source&utm_medium=medium&utm_campaign=campaign", + title: "Tracking page", + url: "https://localhost:3088/basic.html?utm_source=source&utm_medium=medium&utm_campaign=campaign", + }, + screen: { + density: 1, + height: 720, + inner_height: 720, + inner_width: 1280, + width: 1280, + }, + traits: { + case_name: "basic-identify", + case_last_name: "Doe", + user_name: "jj", + email: "john.doe2@gmail.com", + }, + user_agent: + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/107.0.5304.18 Safari/537.36", + }, + sent_at: "2022-11-14T08:56:34.387Z", + timestamp: "2022-11-14T08:56:34.387Z", + type: "identify", + user_id: "userId2", +}; + +export const track: AnalyticsServerEvent = { + type: "track", + event: "testEvent", + properties: { + testProp: "test event properties", + nestedObj: { + nestedProp: "sad", + }, + }, + userId: "user@example.com", + anonymousId: "6638caf0-d2c2-4bc0-aecf-8b290b559a37", + timestamp: "2022-11-14T08:56:34.395Z", + sentAt: "2022-11-14T08:56:34.395Z", + messageId: "d0c6abf6-97f7-487a-a197-8f236c728fa8", + context: { + groupId: "cl9y5kgth0002ccfn3vtqz64g", + library: { + name: "jitsu-js", + version: "1.0.0", + }, + ip: "127.0.0.1", + userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/111.0", + locale: "en-US", + screen: { + width: 2304, + height: 1296, + innerWidth: 1458, + innerHeight: 1186, + density: 2, + }, + traits: { + email: "user@example.com", + }, + page: { + path: "/", + referrer: "", + referring_domain: "", + host: "example.com", + search: "", + title: "Example page event", + url: "https://example.com/", + encoding: "UTF-8", + }, + campaign: { + name: "example", + source: "g", + }, + }, + requestIp: "127.0.0.1", + receivedAt: "2022-11-14T08:56:34.395Z", +}; + +export const trackExpected = [ + { + event: "testEvent", + user_id: "user@example.com", + anonymous_id: "6638caf0-d2c2-4bc0-aecf-8b290b559a37", + timestamp: "2022-11-14T08:56:34.395Z", + sent_at: "2022-11-14T08:56:34.395Z", + message_id: "d0c6abf6-97f7-487a-a197-8f236c728fa8", + context: { + group_id: "cl9y5kgth0002ccfn3vtqz64g", + library: { + name: "jitsu-js", + version: "1.0.0", + }, + ip: "127.0.0.1", + user_agent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/111.0", + locale: "en-US", + screen: { + width: 2304, + height: 1296, + inner_width: 1458, + inner_height: 1186, + density: 2, + }, + traits: { + email: "user@example.com", + }, + page: { + path: "/", + referrer: "", + referring_domain: "", + host: "example.com", + search: "", + title: "Example page event", + url: "https://example.com/", + encoding: "UTF-8", + }, + campaign: { + name: "example", + source: "g", + }, + }, + request_ip: "127.0.0.1", + received_at: "2022-11-14T08:56:34.395Z", + }, + { + event: "testEvent", + test_prop: "test event properties", + nested_obj: { + nested_prop: "sad", + }, + user_id: "user@example.com", + anonymous_id: "6638caf0-d2c2-4bc0-aecf-8b290b559a37", + timestamp: "2022-11-14T08:56:34.395Z", + sent_at: "2022-11-14T08:56:34.395Z", + message_id: "d0c6abf6-97f7-487a-a197-8f236c728fa8", + context: { + group_id: "cl9y5kgth0002ccfn3vtqz64g", + library: { + name: "jitsu-js", + version: "1.0.0", + }, + ip: "127.0.0.1", + user_agent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/111.0", + locale: "en-US", + screen: { + width: 2304, + height: 1296, + inner_width: 1458, + inner_height: 1186, + density: 2, + }, + traits: { + email: "user@example.com", + }, + page: { + path: "/", + referrer: "", + referring_domain: "", + host: "example.com", + search: "", + title: "Example page event", + url: "https://example.com/", + encoding: "UTF-8", + }, + campaign: { + name: "example", + source: "g", + }, + }, + request_ip: "127.0.0.1", + received_at: "2022-11-14T08:56:34.395Z", + }, +]; + +export const trackExpectedSingleTable = { + event: "testEvent", + test_prop: "test event properties", + nested_obj: { + nested_prop: "sad", + }, + user_id: "user@example.com", + anonymous_id: "6638caf0-d2c2-4bc0-aecf-8b290b559a37", + timestamp: "2022-11-14T08:56:34.395Z", + sent_at: "2022-11-14T08:56:34.395Z", + message_id: "d0c6abf6-97f7-487a-a197-8f236c728fa8", + context: { + group_id: "cl9y5kgth0002ccfn3vtqz64g", + library: { + name: "jitsu-js", + version: "1.0.0", + }, + ip: "127.0.0.1", + user_agent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/111.0", + locale: "en-US", + screen: { + width: 2304, + height: 1296, + inner_width: 1458, + inner_height: 1186, + density: 2, + }, + traits: { + email: "user@example.com", + }, + page: { + path: "/", + referrer: "", + referring_domain: "", + host: "example.com", + search: "", + title: "Example page event", + url: "https://example.com/", + encoding: "UTF-8", + }, + campaign: { + name: "example", + source: "g", + }, + }, + type: "track", + request_ip: "127.0.0.1", + received_at: "2022-11-14T08:56:34.395Z", +}; + +export const group: AnalyticsServerEvent = { + anonymousId: "fab18d01-fb6a-4845-b9ca-300b9db35527", + context: { + campaign: {}, + clientIds: {}, + library: { + env: "node", + name: "@jitsu/js", + version: "2.0.0", + }, + page: {}, + }, + groupId: "cl9y5kgth0002ccfn3vtqz64g", + messageId: "17dnlr6evs61jakjuz1xt6", + receivedAt: "2024-04-08T10:39:20.766Z", + requestIp: "127.0.0.1", + sentAt: "2024-04-08T10:39:20.764Z", + timestamp: "2024-04-08T10:39:20.764Z", + traits: { + name: "Ildar Nurislamov's workspace", + workspaceId: "cl9y5kgth0002ccfn3vtqz64g", + workspaceName: "Ildar Nurislamov's workspace", + workspaceSlug: "ildar", + }, + type: "group", + writeKey: "n6Cp3jwTGDFUZfD568wgve0mdCmPaT77:***", +}; + +export const groupExpected = { + anonymous_id: "fab18d01-fb6a-4845-b9ca-300b9db35527", + context: { + campaign: {}, + client_ids: {}, + library: { + env: "node", + name: "@jitsu/js", + version: "2.0.0", + }, + page: {}, + }, + group_id: "cl9y5kgth0002ccfn3vtqz64g", + message_id: "17dnlr6evs61jakjuz1xt6", + received_at: "2024-04-08T10:39:20.766Z", + request_ip: "127.0.0.1", + sent_at: "2024-04-08T10:39:20.764Z", + timestamp: "2024-04-08T10:39:20.764Z", + name: "Ildar Nurislamov's workspace", + workspace_id: "cl9y5kgth0002ccfn3vtqz64g", + workspace_name: "Ildar Nurislamov's workspace", + workspace_slug: "ildar", + write_key: "n6Cp3jwTGDFUZfD568wgve0mdCmPaT77:***", +}; + +export const groupExpectedSingleTable = { + anonymous_id: "fab18d01-fb6a-4845-b9ca-300b9db35527", + context: { + campaign: {}, + client_ids: {}, + group: { + name: "Ildar Nurislamov's workspace", + workspace_id: "cl9y5kgth0002ccfn3vtqz64g", + workspace_name: "Ildar Nurislamov's workspace", + workspace_slug: "ildar", + }, + group_id: "cl9y5kgth0002ccfn3vtqz64g", + library: { + env: "node", + name: "@jitsu/js", + version: "2.0.0", + }, + page: {}, + }, + message_id: "17dnlr6evs61jakjuz1xt6", + received_at: "2024-04-08T10:39:20.766Z", + request_ip: "127.0.0.1", + type: "group", + sent_at: "2024-04-08T10:39:20.764Z", + timestamp: "2024-04-08T10:39:20.764Z", + write_key: "n6Cp3jwTGDFUZfD568wgve0mdCmPaT77:***", +}; diff --git a/libs/core-functions/__tests__/lib/testing-lib.ts b/libs/core-functions/__tests__/lib/testing-lib.ts index a96245449..e33cba6b0 100644 --- a/libs/core-functions/__tests__/lib/testing-lib.ts +++ b/libs/core-functions/__tests__/lib/testing-lib.ts @@ -1,10 +1,10 @@ import { AnalyticsInterface, AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import { getLog, logFormat, requireDefined } from "juava"; -import { AnyEvent, EventContext, FuncReturn, FunctionContext, JitsuFunction } from "@jitsu/protocols/functions"; import nodeFetch from "node-fetch-commonjs"; +import { AnyEvent, EventContext, FuncReturn, JitsuFunction } from "@jitsu/protocols/functions"; import { createStore } from "./mem-store"; import * as JSON5 from "json5"; -import { SystemContext } from "../../src"; +import { FunctionChainContext, FunctionContext, InternalFetchType, wrapperFunction } from "../../src/functions/lib"; export type Or = | ({ [P in keyof T1]: T1[P] } & { [P in keyof T2]?: never }) @@ -13,7 +13,8 @@ export type Or = export type TestOptions = { mockFetch?: boolean; func: JitsuFunction; - ctx?: EventContext & FunctionContext & { $system?: Partial }; + chainCtx?: FunctionChainContext; + ctx?: EventContext; } & Or<{ config: T }, { configEnvVar: string }> & Or<{ generateEvents: (jitsu: AnalyticsInterface) => void }, { events: AnalyticsServerEvent[] }>; @@ -47,14 +48,17 @@ export async function testJitsuFunction(opts: TestOptions): Promise< throw new Error("mockFetch() is not supported yet"); } const events: AnalyticsServerEvent[] = opts.events; - const func = opts.func; - const fetch = nodeFetch; const log = { - info: (msg: any, ...args: any[]) => testLogger.atInfo().log(msg, ...args), - error: (msg: any, ...args: any[]) => testLogger.atError().log(msg, ...args), - debug: (msg: any, ...args: any[]) => testLogger.atDebug().log(msg, ...args), - warn: (msg: any, ...args: any[]) => testLogger.atWarn().log(msg, ...args), + info: (ctx: FunctionContext, msg: any, ...args: any[]) => testLogger.atInfo().log(msg, ...args), + error: (ctx: FunctionContext, msg: any, ...args: any[]) => testLogger.atError().log(msg, ...args), + debug: (ctx: FunctionContext, msg: any, ...args: any[]) => testLogger.atDebug().log(msg, ...args), + warn: (ctx: FunctionContext, msg: any, ...args: any[]) => testLogger.atWarn().log(msg, ...args), }; + const func = wrapperFunction( + { log, fetch: nodeFetch as unknown as InternalFetchType, store: createStore(), ...opts.chainCtx }, + { function: { id: "test", type: "test" }, props: config }, + opts.func + ); let res: AnyEvent[] = null; for (const event of events) { @@ -65,11 +69,7 @@ export async function testJitsuFunction(opts: TestOptions): Promise< `📌Testing ${logFormat.bold(event.event || event.type)} message of ${toDate(event.timestamp).toISOString()}` ); const r = await func(event, { - props: config, - fetch, - log, headers: {}, - store: createStore(), ...opts.ctx, }); if (r) { diff --git a/libs/core-functions/__tests__/udf.test.ts b/libs/core-functions/__tests__/udf.test.ts index 3c11c6c36..d30ae6c11 100644 --- a/libs/core-functions/__tests__/udf.test.ts +++ b/libs/core-functions/__tests__/udf.test.ts @@ -47,11 +47,10 @@ const udf = async (event, { log, fetch, props, store, geo, ...meta }) => { export default udf; `; - wrapper = UDFWrapper("udf", [{ id: "udf", name: "UDF Wrapper test", code: udfCode }]); const res = await UDFTestRun({ - functionId: "udf", + functionId: "udftest", functionName: "UDF Wrapper test", - code: wrapper, + code: udfCode, event: { messageId: "test", type: "page", @@ -65,7 +64,13 @@ export default udf; }, workspaceId: "test", }); - console.log("res", JSON.stringify(res, null, 2)); + console.log("res:" + JSON.stringify(res.result, null, 2)); + console.log("log:" + JSON.stringify(res.logs, null, 2)); + console.log("store:" + JSON.stringify(res.store, null, 2)); + console.log("error:" + JSON.stringify(res.error, null, 2)); + console.log("dropped:" + JSON.stringify(res.dropped, null, 2)); + + expect(res.error).toBeUndefined(); expect(res.result).toEqual({ messageId: "test", diff --git a/libs/core-functions/__tests__/user-recognition.test.ts b/libs/core-functions/__tests__/user-recognition.test.ts index a674c8d03..91467cc1e 100644 --- a/libs/core-functions/__tests__/user-recognition.test.ts +++ b/libs/core-functions/__tests__/user-recognition.test.ts @@ -3,7 +3,8 @@ import UserRecognitionFunction, { UserRecognitionConfig } from "../src/functions import { prefixLogMessage, testJitsuFunction, TestOptions } from "./lib/testing-lib"; import { createAnonymousEventsStore, createStore } from "./lib/mem-store"; import nodeFetch from "node-fetch-commonjs"; -import { FetchOpts, FetchResponse, FetchType } from "@jitsu/protocols/functions"; +import { FunctionContext } from "../src"; +import { InternalFetchType } from "../src/functions/lib"; const anonymousEvents: AnalyticsServerEvent[] = [ { @@ -94,6 +95,17 @@ test("user-recognition-test", async () => { const store = createStore(); const options: TestOptions = { func: UserRecognitionFunction, + chainCtx: { + fetch: nodeFetch as unknown as InternalFetchType, + store: store, + log: { + info: (ctx: FunctionContext, msg: any, ...args: any[]) => console.log(prefixLogMessage("INFO", msg), args), + error: (ctx: FunctionContext, msg: any, ...args: any[]) => console.error(prefixLogMessage("ERROR", msg), args), + debug: (ctx: FunctionContext, msg: any, ...args: any[]) => console.debug(prefixLogMessage("DEBUG", msg), args), + warn: (ctx: FunctionContext, msg: any, ...args: any[]) => console.warn(prefixLogMessage("WARN", msg), args), + }, + anonymousEventsStore: createAnonymousEventsStore(), + }, ctx: { headers: {}, connection: { @@ -113,24 +125,8 @@ test("user-recognition-test", async () => { id: "test", type: "browser", }, - fetch: nodeFetch as unknown as FetchType, - store: store, - log: { - info: (msg: any, ...args: any[]) => console.log(prefixLogMessage("INFO", msg), args), - error: (msg: any, ...args: any[]) => console.error(prefixLogMessage("ERROR", msg), args), - debug: (msg: any, ...args: any[]) => console.debug(prefixLogMessage("DEBUG", msg), args), - warn: (msg: any, ...args: any[]) => console.warn(prefixLogMessage("WARN", msg), args), - }, - $system: { - anonymousEventsStore: createAnonymousEventsStore(), - store: store, - metricsMeta: { - workspaceId: "123", - messageId: "123", - streamId: "123", - destinationId: "123", - connectionId: "123", - }, + workspace: { + id: "test", }, }, config: {} as UserRecognitionConfig, diff --git a/libs/core-functions/src/context.ts b/libs/core-functions/src/context.ts deleted file mode 100644 index c7dea1178..000000000 --- a/libs/core-functions/src/context.ts +++ /dev/null @@ -1,235 +0,0 @@ -import { EventContext, FetchOpts, FullContext, Store } from "@jitsu/protocols/functions"; -import { getErrorMessage, getLog, LogLevel, newError, stopwatch } from "juava"; -import { SystemContext } from "./functions/lib"; - -const log = getLog("functions-context"); - -/** - * Store for incoming events, destination results and function log messages - */ -export interface EventsStore { - log(connectionId: string, level: LogLevel, msg: Record): void; - close(): void; -} - -export const DummyEventsStore: EventsStore = { - log(connectionId: string, level: LogLevel, msg: Record): void {}, - close(): void {}, -}; - -export function MultiEventsStore(stores: EventsStore[]): EventsStore { - return { - log(connectionId: string, level: LogLevel, msg: Record): void { - for (const store of stores) { - store.log(connectionId, level, msg); - } - }, - close(): void { - for (const store of stores) { - store.close(); - } - }, - }; -} - -export function createFullContext( - functionId: string, - eventsStore: EventsStore, - store: Store, - eventContext: EventContext, - systemContext: SystemContext | {} = {}, - props: Record = {}, - event?: any, - fetchTimeoutMs: number = 5000 -): FullContext { - const ar = functionId.split("."); - const id = ar.pop(); - const type = ar.join("."); - const connectionId = eventContext.connection?.id ?? ""; - const debugEnabled = new Date(eventContext.connection.options?.debugTill ?? 0) > new Date(); - return { - props: props, - store: store, - async fetch(url: string, init?: FetchOpts, extra?: { log: boolean; udfId?: string }): Promise { - //capture execution time - const sw = stopwatch(); - const logToRedis = typeof extra?.log === "boolean" ? extra.log : true; - const baseInfo = - debugEnabled && logToRedis - ? { - functionId: extra?.udfId || id, - functionType: type, - type: "http-request", - url: url, - method: init?.method || "GET", - body: init?.body, - headers: init?.headers ? hideSensitiveHeaders(init.headers) : undefined, - event: event, - } - : undefined; - const controller = new AbortController(); - setTimeout(() => { - controller.abort(); - }, fetchTimeoutMs); - - let internalInit: RequestInit = { - ...init, - keepalive: true, - signal: controller.signal, - }; - let fetchResult: any = undefined; - try { - fetchResult = await fetch(url, internalInit); - } catch (err: any) { - if (err.name === "AbortError") { - err = newError(`Fetch request exceeded timeout ${fetchTimeoutMs}ms and was aborted`, err); - } - if (debugEnabled) { - const elapsedMs = sw.elapsedMs(); - if (logToRedis) { - eventsStore.log(connectionId, "debug", { ...baseInfo, error: getErrorMessage(err), elapsedMs: elapsedMs }); - } - log - .atDebug() - .log( - `[CON:${connectionId}]: [f:${id}][ERROR][FETCH]: ${url} Error: ${getErrorMessage( - err - )} ElapsedMs: ${elapsedMs}` - ); - } - throw err; - } - - if (debugEnabled) { - const elapsedMs = sw.elapsedMs(); - //clone response to be able to read it twice - const cloned = fetchResult.clone(); - const respText = await trimResponse(cloned); - if (logToRedis) { - eventsStore.log(connectionId, "debug", { - ...baseInfo, - status: fetchResult.status, - statusText: fetchResult.statusText, - elapsedMs: elapsedMs, - response: tryJson(respText), - }); - } - if (fetchResult.status >= 300) { - log - .atDebug() - .log( - `[CON:${connectionId}]: [f:${id}][ERROR][FETCH]: ${url} Status: ${fetchResult.status} Response: ${respText} ElapsedMs: ${elapsedMs}` - ); - } - } - - return fetchResult; - }, - log: { - debug: (message, ...args: any[]) => { - if (debugEnabled) { - const opts = args?.length > 0 ? args[args.length - 1] : undefined; - if (typeof opts === "object" && opts.udfId) { - args.pop(); - } - const fid = opts?.udfId || id; - log.atDebug().log(`[CON:${connectionId}]: [f:${fid}][DEBUG]: ${message}`, ...args); - eventsStore.log(connectionId, "debug", { - type: "log-debug", - functionId: fid, - functionType: type, - message: { - text: message, - args, - }, - }); - } - }, - warn: (message, ...args: any[]) => { - const opts = args?.length > 0 ? args[args.length - 1] : undefined; - if (typeof opts === "object" && opts.udfId) { - args.pop(); - } - const fid = opts?.udfId || id; - log.atWarn().log(`[CON:${connectionId}]: [f:${fid}][WARN]: ${message}`, ...args); - eventsStore.log(connectionId, "warn", { - type: "log-warn", - functionId: fid, - functionType: type, - message: { - text: message, - args, - }, - }); - }, - error: (message, ...args: any[]) => { - const opts = args?.length > 0 ? args[args.length - 1] : undefined; - if (typeof opts === "object" && opts.udfId) { - args.pop(); - } - const fid = opts?.udfId || id; - eventsStore.log(connectionId, "error", { - type: "log-error", - functionId: fid, - functionType: type, - message: { - text: message, - args, - }, - }); - const l = log.atError(); - if (args?.length > 0) { - const last = args[args.length - 1]; - if (last.stack) { - l.withCause(last); - args = args.slice(0, args.length - 1); - } - } - l.log(`[CON:${connectionId}]: [f:${fid}][ERROR]: ${message}`, ...args); - }, - info: (message, ...args: any[]) => { - const opts = args?.length > 0 ? args[args.length - 1] : undefined; - if (typeof opts === "object" && opts.udfId) { - args.pop(); - } - const fid = opts?.udfId || id; - log.atInfo().log(`[CON:${connectionId}]: [f:${fid}][INFO]: ${message}`, ...args); - eventsStore.log(connectionId, "info", { - type: "log-info", - functionId: fid, - functionType: type, - message: { - text: message, - args, - }, - }); - }, - }, - ...eventContext, - ...systemContext, - }; -} - -function hideSensitiveHeaders(headers: Record): Record { - const result: Record = {}; - for (const [k, v] of Object.entries(headers)) { - result[k] = k.toLowerCase().includes("authorization") || k.toLowerCase().includes("token") ? "*****" : v; - } - return result; -} - -async function trimResponse(fetchResult: Response, maxLen: number = 1000): Promise { - const text = await fetchResult.text(); - if (text.length > maxLen) { - return `${text.substring(0, maxLen)} ... [truncated, length: ${text.length}]`; - } - return text; -} - -function tryJson(text: string, maxLen: number = 1000): any { - try { - return JSON.parse(text); - } catch (err) { - return text; - } -} diff --git a/libs/core-functions/src/functions/amplitude-destination.ts b/libs/core-functions/src/functions/amplitude-destination.ts index 6417d9db2..eb43d9f0d 100644 --- a/libs/core-functions/src/functions/amplitude-destination.ts +++ b/libs/core-functions/src/functions/amplitude-destination.ts @@ -3,19 +3,17 @@ import { RetryError } from "@jitsu/functions-lib"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import { randomUUID } from "crypto"; import { AmplitudeDestinationConfig } from "../meta"; -import { requireDefined } from "juava"; -import { eventTimeSafeMs, SystemContext } from "./lib"; +import { eventTimeSafeMs } from "./lib"; const AmplitudeDestination: JitsuFunction = async ( event, - { props, fetch, log, geo, ua, ...ctx } + { props, store, fetch, log, geo, ua, ...ctx } ) => { try { const deviceId = event.anonymousId; let sessionId: number | undefined = undefined; if (deviceId) { - const systemContext = requireDefined((ctx as any as SystemContext).$system, `$system context is not available`); - const ttlStore = systemContext.store; + const ttlStore = store; const ttlSec = 60 * (props.sessionWindow ?? 30); const sessionKey = `${ctx.source.id}_${deviceId}_sess`; const savedSessionValue = await ttlStore.getWithTTL(sessionKey); diff --git a/libs/core-functions/src/functions/bulker-destination.ts b/libs/core-functions/src/functions/bulker-destination.ts index ee319a920..4c2ed142c 100644 --- a/libs/core-functions/src/functions/bulker-destination.ts +++ b/libs/core-functions/src/functions/bulker-destination.ts @@ -3,8 +3,7 @@ import { HTTPError, RetryError } from "@jitsu/functions-lib"; import { AnalyticsServerEvent, DataLayoutType } from "@jitsu/protocols/analytics"; import omit from "lodash/omit"; -import { requireDefined } from "juava"; -import { MetricsMeta, SystemContext } from "./lib"; +import { MetricsMeta } from "./lib"; const TableNameParameter = "JITSU_TABLE_NAME"; export type MappedEvent = { @@ -31,7 +30,11 @@ function toSnakeCase(param: any): any { if (Array.isArray(param)) { return param.map(toSnakeCase); } else if (typeof param === "object" && param !== null) { - return Object.fromEntries(Object.entries(param).map(([key, value]) => [idToSnakeCase(key), toSnakeCase(value)])); + const r = {}; + for (const [key, value] of Object.entries(param)) { + r[idToSnakeCase(key)] = toSnakeCase(value); + } + return r; } else { return param; } @@ -111,119 +114,144 @@ export function segmentLayout(event: AnalyticsServerEvent, singleTable: boolean) case "identify": if (singleTable) { transformed = { - ...(event.context || event.traits - ? { - context: { - ...event.context, - traits: omit({ ...event.context?.traits, ...event.traits }, ["groupId"]), - groupId: event.traits?.groupId || event.context?.traits?.groupId || undefined, - }, - } - : {}), - ...event.properties, - ...omit(event, ["context", "properties", "traits", "type", TableNameParameter]), + context: { + traits: {}, + }, }; + transferAsSnakeCase(transformed.context, event.context, ["groupId", "traits"]); + transferAsSnakeCase(transformed.context.traits, event.context?.traits, ["groupId"]); + transferAsSnakeCase(transformed.context.traits, event.traits, ["groupId"]); + transferValueAsSnakeCase( + transformed.context, + "group_id", + event.context?.groupId || event.traits?.groupId || event.context?.traits?.groupId + ); + transferAsSnakeCase(transformed, event.properties); + transferAsSnakeCase(transformed, event, ["context", "properties", "traits", "type", TableNameParameter]); } else { transformed = { - ...(event.context ? { context: omit(event.context, "traits") } : {}), - ...event.properties, - ...event.context?.traits, - ...event.traits, - ...omit(event, ["context", "properties", "traits", "type", TableNameParameter]), + context: {}, }; + transferAsSnakeCase(transformed.context, event.context, ["traits"]); + transferAsSnakeCase(transformed, event.properties); + transferAsSnakeCase(transformed, event.context?.traits); + transferAsSnakeCase(transformed, event.traits); + transferAsSnakeCase(transformed, event, ["context", "properties", "traits", "type", TableNameParameter]); } break; case "group": if (singleTable) { transformed = { - ...(event.context || event.traits - ? { context: { ...event.context, group: event.traits, groupId: event.groupId } } - : {}), - ...event.properties, - ...omit(event, ["context", "properties", "traits", "type", "groupId", TableNameParameter]), + context: { + group: {}, + }, }; + transferAsSnakeCase(transformed.context, event.context); + transferAsSnakeCase(transformed.context.group, event.traits); + transferValueAsSnakeCase(transformed.context, "group_id", event.groupId); + transferAsSnakeCase(transformed, event.properties); + transferAsSnakeCase(transformed, event, [ + "context", + "properties", + "traits", + "type", + "groupId", + TableNameParameter, + ]); } else { transformed = { - ...(event.context ? { context: omit(event.context, "traits") } : {}), - ...event.properties, - ...event.traits, - ...omit(event, ["context", "properties", "traits", "type", TableNameParameter]), + context: {}, }; + transferAsSnakeCase(transformed.context, event.context, ["traits"]); + transferAsSnakeCase(transformed, event.properties); + transferAsSnakeCase(transformed, event.traits); + transferAsSnakeCase(transformed, event, ["context", "properties", "traits", "type", TableNameParameter]); } break; case "track": if (singleTable) { transformed = { - ...(event.context || typeof event.properties?.traits === "object" - ? { - context: { - ...event.context, - traits: omit( - { - ...event.context?.traits, - ...(typeof event.properties?.traits === "object" ? event.properties?.traits : {}), - }, - ["groupId"] - ), - groupId: event.context?.traits?.groupId, - }, - } - : {}), - ...(event.properties ? omit(event.properties, ["traits"]) : {}), - ...omit(event, ["context", "properties", "type", TableNameParameter]), + context: { + traits: {}, + }, }; + transferAsSnakeCase(transformed.context, event.context, ["groupId", "traits"]); + transferAsSnakeCase(transformed.context.traits, event.context?.traits, ["groupId"]); + transferAsSnakeCase(transformed.context.traits, event.properties?.traits, ["groupId"]); + transferValueAsSnakeCase( + transformed.context, + "group_id", + event.context?.groupId || event.context?.traits?.groupId + ); + transferAsSnakeCase(transformed, event.properties, ["traits"]); + transferAsSnakeCase(transformed, event, ["context", "properties", "type", TableNameParameter]); } else { - baseTrackFlat = toSnakeCase({ - ...omit(event, ["properties", "type", TableNameParameter]), - }); - transformed = { - ...(event.properties || {}), - ...omit(event, ["properties", "type", TableNameParameter]), - }; + baseTrackFlat = {}; + transferAsSnakeCase(baseTrackFlat, event, ["properties", "type", TableNameParameter]); + transformed = {}; + transferAsSnakeCase(transformed, event.properties); + transferAsSnakeCase(transformed, event, ["properties", "type", TableNameParameter]); } break; default: if (singleTable) { transformed = { - ...(event.context - ? { - context: { - ...event.context, - traits: omit(event.context?.traits, ["groupId"]), - groupId: event.context?.traits?.groupId, - }, - } - : {}), - ...(event.properties || {}), - ...omit(event, ["context", "properties", TableNameParameter]), + context: { + traits: {}, + }, }; + transferAsSnakeCase(transformed.context, event.context, ["groupId", "traits"]); + transferAsSnakeCase(transformed.context.traits, event.context?.traits, ["groupId"]); + transferValueAsSnakeCase( + transformed.context, + "group_id", + event.context?.groupId || event.context?.traits?.groupId + ); + transferAsSnakeCase(transformed, event.properties); + transferAsSnakeCase(transformed, event, ["context", "properties", TableNameParameter]); } else { - transformed = { - ...(event.properties || {}), - ...omit(event, ["properties", TableNameParameter]), - }; + transformed = {}; + transferAsSnakeCase(transformed, event.properties); + transferAsSnakeCase(transformed, event, ["properties", TableNameParameter]); } } - const flat: Record = toSnakeCase(transformed); if (event[TableNameParameter]) { - flat.type = event.type; - return { event: flat, table: event[TableNameParameter] }; + transformed.type = event.type; + return { event: transformed, table: event[TableNameParameter] }; } if (singleTable) { - flat.type = event.type; - return { event: flat, table: "events" }; + transformed.type = event.type; + return { event: transformed, table: "events" }; } else { if (event.type === "track" && event.event) { return [ { event: baseTrackFlat, table: "tracks" }, - { event: flat, table: event.event }, + { event: transformed, table: event.event }, ]; } else { - return { event: flat, table: plural(event.type) }; + return { event: transformed, table: plural(event.type) }; } } } +function transferAsSnakeCase(target: Record, source: any, omit?: string[]) { + if (typeof source !== "object") { + return; + } + for (const [k, v] of Object.entries(source)) { + if (!omit || !omit.includes(k)) { + target[idToSnakeCase(k)] = toSnakeCase(v); + } + } +} + +function transferValueAsSnakeCase(target: Record, property: string, source: any) { + if (typeof source === "undefined") { + return; + } + target[property] = toSnakeCase(source); +} + export function plural(s: string) { switch (s) { case "identify": @@ -256,9 +284,11 @@ export type BulkerDestinationConfig = { const BulkerDestination: JitsuFunction = async (event, ctx) => { const { bulkerEndpoint, destinationId, authToken, dataLayout = "segment-single-table" } = ctx.props; try { - const systemContext = requireDefined((ctx as any as SystemContext).$system, `$system context is not available`); const metricsMeta: Omit = { - ...omit(systemContext.metricsMeta, "retries", "messageId"), + workspaceId: ctx.workspace.id, + streamId: ctx.source.id, + destinationId: ctx.destination.id, + connectionId: ctx.connection.id, functionId: "builtin.destination.bulker", }; let adjustedEvent = event; diff --git a/libs/core-functions/src/functions/facebook-conversions.ts b/libs/core-functions/src/functions/facebook-conversions.ts index deaf981ba..252a6078c 100644 --- a/libs/core-functions/src/functions/facebook-conversions.ts +++ b/libs/core-functions/src/functions/facebook-conversions.ts @@ -86,9 +86,9 @@ const FacebookConversionsApi: JitsuFunction ${fetchResult.status} ${ - fetchResult.statusText - }:\n${toPrettyString(responseJson)}` + `Facebook API - ${baseUrl}**** ---------> ${fetchResult.status} ${fetchResult.statusText}:\n${toPrettyString( + responseJson + )}` ); if (!fetchResult.ok) { throw new RetryError( diff --git a/libs/core-functions/src/functions/ga4-destination.ts b/libs/core-functions/src/functions/ga4-destination.ts index eb0cd2434..714ee009e 100644 --- a/libs/core-functions/src/functions/ga4-destination.ts +++ b/libs/core-functions/src/functions/ga4-destination.ts @@ -349,7 +349,7 @@ const Ga4Destination: JitsuFunction = asyn if (result.status !== 200 && result.status !== 204) { throw new Error(`Ga4:${JSON.stringify(gaRequest)} --> ${result.status} ${await result.text()}`); } else { - ctx.log.debug(`Ga4:${JSON.stringify(gaRequest)} --> ${result.status} ${await result.text()}`); + ctx.log.debug(`Ga4: ${result.status} ${await result.text()}`); } } catch (e: any) { throw new RetryError(`Failed to send request to Ga4: ${JSON.stringify(gaRequest)}: ${e?.message}`); diff --git a/libs/core-functions/src/functions/june-destination.ts b/libs/core-functions/src/functions/june-destination.ts index cda7e635b..99554c0e4 100644 --- a/libs/core-functions/src/functions/june-destination.ts +++ b/libs/core-functions/src/functions/june-destination.ts @@ -101,13 +101,14 @@ const JuneDestination: JitsuFunction = as headers: httpRequest.headers, ...(httpRequest.payload ? { body: JSON.stringify(httpRequest.payload) } : {}), }); - const logMessage = `June.so ${method} ${httpRequest.url}:${ - httpRequest.payload ? `${JSON.stringify(httpRequest.payload)} --> ` : "" - }${result.status} ${await result.text()}`; if (result.status !== 200) { - throw new Error(logMessage); + throw new Error( + `June.so ${method} ${httpRequest.url}:${ + httpRequest.payload ? `${JSON.stringify(httpRequest.payload)} --> ` : "" + }${result.status} ${await result.text()}` + ); } else { - ctx.log.debug(logMessage); + ctx.log.debug(`June.so ${method} ${httpRequest.url}: ${result.status} ${await result.text()}`); } } } catch (e: any) { diff --git a/libs/core-functions/src/functions/lib/index.ts b/libs/core-functions/src/functions/lib/index.ts index 2865d2cf3..6ea3adef9 100644 --- a/libs/core-functions/src/functions/lib/index.ts +++ b/libs/core-functions/src/functions/lib/index.ts @@ -5,8 +5,51 @@ import { ProcessingContext, ServerContextReservedProps, } from "@jitsu/protocols/analytics"; -import { AnonymousEventsStore, TTLStore } from "@jitsu/protocols/functions"; -import { EventsStore } from "../../context"; +import { + AnonymousEventsStore, + AnyEvent, + AnyProps, + EventContext, + FetchOpts, + FetchResponse, + FullContext, + FuncReturn, + FunctionLogger, + JitsuFunction, + Metrics, + TTLStore, +} from "@jitsu/protocols/functions"; +import { getErrorMessage, getLog, LogLevel, newError, stopwatch } from "juava"; + +const log = getLog("functions"); + +/** + * Store for incoming events, destination results and function log messages + */ +export interface EventsStore { + log(connectionId: string, level: LogLevel, msg: Record): void; + close(): void; +} + +export const DummyEventsStore: EventsStore = { + log(connectionId: string, level: LogLevel, msg: Record): void {}, + close(): void {}, +}; + +export function MultiEventsStore(stores: EventsStore[]): EventsStore { + return { + log(connectionId: string, level: LogLevel, msg: Record): void { + for (const store of stores) { + store.log(connectionId, level, msg); + } + }, + close(): void { + for (const store of stores) { + store.close(); + } + }, + }; +} export type MetricsMeta = { workspaceId: string; @@ -18,18 +61,90 @@ export type MetricsMeta = { retries?: number; }; -/** - * Function execution context available for built-in functions only - */ -export type SystemContext = { - $system: { - anonymousEventsStore: AnonymousEventsStore; - metricsMeta: MetricsMeta; - store: TTLStore; - eventsStore: EventsStore; +export type FetchType = ( + url: string, + opts?: FetchOpts, + extra?: { log?: boolean; event?: AnyEvent } +) => Promise; + +export type InternalFetchType = ( + url: string, + opts?: FetchOpts, + extra?: { log?: boolean; ctx?: FunctionContext; event?: AnyEvent } +) => Promise; + +export type FunctionChainContext = { + log: { + info: (ctx: FunctionContext, message: string, ...args: any[]) => void | Promise; + warn: (ctx: FunctionContext, message: string, ...args: any[]) => void | Promise; + debug: (ctx: FunctionContext, message: string, ...args: any[]) => void | Promise; + error: (ctx: FunctionContext, message: string, ...args: any[]) => void | Promise; }; + fetch: InternalFetchType; + store: TTLStore; + anonymousEventsStore?: AnonymousEventsStore; + metrics?: Metrics; }; +export function wrapperFunction( + chainCtx: FunctionChainContext, + funcCtx: FunctionContext

    , + jitsuFunction: JitsuFunction +): JitsuFunctionWrapper { + const log = createFunctionLogger(chainCtx, funcCtx); + const debugFetch = createFetchWrapper(chainCtx, funcCtx); + const props = funcCtx.props; + const store = chainCtx.store; + + return async (event: E, ctx: EventContext) => { + let ftch = chainCtx.fetch; + const debugEnabled = funcCtx.function.debugTill && funcCtx.function.debugTill > new Date(); + if (debugEnabled) { + ftch = async (url, opts, extra) => { + return debugFetch(url, opts, { ...extra, event }); + }; + } + const fullContext: FullContext

    = { + ...ctx, + log, + fetch: ftch, + store, + props, + }; + fullContext["anonymousEventsStore"] = chainCtx.anonymousEventsStore; + return jitsuFunction(event, fullContext); + }; +} + +function createFunctionLogger(chainCtx: FunctionChainContext, funcCtx: FunctionContext): FunctionLogger { + return { + info: (message: string, ...args: any) => chainCtx.log.info(funcCtx, message, ...args), + warn: (message: string, ...args: any) => chainCtx.log.warn(funcCtx, message, ...args), + debug: (message: string, ...args: any) => chainCtx.log.debug(funcCtx, message, ...args), + error: (message: string, ...args: any) => chainCtx.log.error(funcCtx, message, ...args), + }; +} + +function createFetchWrapper(chainCtx: FunctionChainContext, funcCtx: FunctionContext): FetchType { + return (url: string, opts?: FetchOpts, debug?: { event?: AnyEvent; log?: boolean }) => { + return chainCtx.fetch(url, opts, { log: debug?.log, ctx: funcCtx, event: debug?.event }); + }; +} + +export type FunctionContext

    = { + function: { + id: string; + type: string; + debugTill?: Date; + }; + props: P; +}; + +export type JitsuFunctionWrapper = ( + event: E, + ctx: EventContext +) => Promise | FuncReturn; + type KnownEventKeys = keyof Required; //to make sure we const knownProps: Record, true> = @@ -109,3 +224,178 @@ export function eventTimeSafeMs(event: AnalyticsServerEvent) { const receivedAt = event.receivedAt ? new Date(event.receivedAt as string).getTime() : NaN; return Math.min(!isNaN(ts) ? ts : now, !isNaN(receivedAt) ? receivedAt : now, now); } + +export const makeLog = (connectionId: string, eventsStore: EventsStore) => ({ + debug: (ctx: FunctionContext, message: any, ...args: any[]) => { + if (ctx.function.debugTill && ctx.function.debugTill > new Date()) { + const fid = ctx.function.id; + log.atDebug().log(`[CON:${connectionId}]: [f:${fid}][DEBUG]: ${message}`, ...args); + eventsStore.log(connectionId, "debug", { + type: "log-debug", + functionId: fid, + functionType: ctx.function.type, + message: { + text: message, + args, + }, + }); + } + }, + warn: (ctx: FunctionContext, message: any, ...args: any[]) => { + const fid = ctx.function.id; + log.atWarn().log(`[CON:${connectionId}]: [f:${fid}][WARN]: ${message}`, ...args); + eventsStore.log(connectionId, "warn", { + type: "log-warn", + functionId: fid, + functionType: ctx.function.type, + message: { + text: message, + args, + }, + }); + }, + error: (ctx: FunctionContext, message: any, ...args: any[]) => { + const fid = ctx.function.id; + eventsStore.log(connectionId, "error", { + type: "log-error", + functionId: fid, + functionType: ctx.function.type, + message: { + text: message, + args, + }, + }); + const l = log.atError(); + if (args?.length > 0) { + const last = args[args.length - 1]; + if (last.stack) { + l.withCause(last); + args = args.slice(0, args.length - 1); + } + } + l.log(`[CON:${connectionId}]: [f:${fid}][ERROR]: ${message}`, ...args); + }, + info: (ctx: FunctionContext, message: any, ...args: any[]) => { + const fid = ctx.function.id; + log.atInfo().log(`[CON:${connectionId}]: [f:${fid}][INFO]: ${message}`, ...args); + eventsStore.log(connectionId, "info", { + type: "log-info", + functionId: fid, + functionType: ctx.function.type, + message: { + text: message, + args, + }, + }); + }, +}); + +export const makeFetch = + (connectionId: string, eventsStore: EventsStore, fetchTimeoutMs: number = 5000) => + async ( + url: string, + init?: FetchOpts, + extra?: { log?: boolean; ctx?: FunctionContext; event?: AnyEvent } + ): Promise => { + //capture execution time + const sw = stopwatch(); + const ctx = extra?.ctx?.function; + const id = ctx?.id || "unknown"; + const type = ctx?.type || "unknown"; + const debugEnabled = ctx?.debugTill && ctx?.debugTill > new Date(); + const logToRedis = typeof extra?.log === "boolean" ? extra.log : true; + const baseInfo = + debugEnabled && logToRedis + ? { + functionId: id, + functionType: type, + type: "http-request", + url: url, + method: init?.method || "GET", + body: init?.body, + headers: init?.headers ? hideSensitiveHeaders(init.headers) : undefined, + event: extra?.event || {}, + } + : undefined; + const controller = new AbortController(); + setTimeout(() => { + controller.abort(); + }, fetchTimeoutMs); + + let internalInit: RequestInit = { + ...init, + keepalive: true, + signal: controller.signal, + }; + let fetchResult: any = undefined; + try { + fetchResult = await fetch(url, internalInit); + } catch (err: any) { + if (err.name === "AbortError") { + err = newError(`Fetch request exceeded timeout ${fetchTimeoutMs}ms and was aborted`, err); + } + if (debugEnabled) { + const elapsedMs = sw.elapsedMs(); + if (logToRedis) { + eventsStore.log(connectionId, "debug", { ...baseInfo, error: getErrorMessage(err), elapsedMs: elapsedMs }); + } + log + .atDebug() + .log( + `[CON:${connectionId}]: [f:${id}][ERROR][FETCH]: ${url} Error: ${getErrorMessage( + err + )} ElapsedMs: ${elapsedMs}` + ); + } + throw err; + } + + if (debugEnabled) { + const elapsedMs = sw.elapsedMs(); + //clone response to be able to read it twice + const cloned = fetchResult.clone(); + const respText = await trimResponse(cloned); + if (logToRedis) { + eventsStore.log(connectionId, "debug", { + ...baseInfo, + status: fetchResult.status, + statusText: fetchResult.statusText, + elapsedMs: elapsedMs, + response: tryJson(respText), + }); + } + if (fetchResult.status >= 300) { + log + .atDebug() + .log( + `[CON:${connectionId}]: [f:${id}][ERROR][FETCH]: ${url} Status: ${fetchResult.status} Response: ${respText} ElapsedMs: ${elapsedMs}` + ); + } + } + + return fetchResult; + }; + +function hideSensitiveHeaders(headers: Record): Record { + const result: Record = {}; + for (const [k, v] of Object.entries(headers)) { + result[k] = k.toLowerCase().includes("authorization") || k.toLowerCase().includes("token") ? "*****" : v; + } + return result; +} + +async function trimResponse(fetchResult: Response, maxLen: number = 1000): Promise { + const text = await fetchResult.text(); + if (text.length > maxLen) { + return `${text.substring(0, maxLen)} ... [truncated, length: ${text.length}]`; + } + return text; +} + +function tryJson(text: string, maxLen: number = 1000): any { + try { + return JSON.parse(text); + } catch (err) { + return text; + } +} diff --git a/libs/core-functions/src/functions/lib/json-fetch.ts b/libs/core-functions/src/functions/lib/json-fetch.ts index 530a6011e..41f7bb336 100644 --- a/libs/core-functions/src/functions/lib/json-fetch.ts +++ b/libs/core-functions/src/functions/lib/json-fetch.ts @@ -1,10 +1,10 @@ -import { FetchOpts, FetchType, FunctionLogger } from "@jitsu/protocols/functions"; +import { AnyEvent, FunctionLogger, FetchOpts, FetchResponse } from "@jitsu/protocols/functions"; export type JsonFetchOpts = Omit & { body?: any; }; -export type JsonFetcher = (url: string, options?: JsonFetchOpts) => Promise; +export type JsonFetcher = (url: string, options?: JsonFetchOpts, debug?: { event?: AnyEvent }) => Promise; const maxResponseLen = 300; @@ -35,7 +35,7 @@ export class JsonFetchError extends Error { } export function jsonFetcher( - fetch: FetchType, + fetch: (url: string, opts?: FetchOpts, debug?: { event?: AnyEvent }) => Promise, { log, debug }: { log: FunctionLogger; debug?: boolean } = { log: console } ): JsonFetcher { return async (url: string, options?: JsonFetchOpts) => { @@ -54,9 +54,9 @@ export function jsonFetcher( }); let responseText = await response.text(); if (debug) { - const message = `${method} ${url} → ${response.ok ? "🟢" : "🔴"}${response.status} ${response.statusText}.${ - bodyStr ? `\n📨Request body:\n${prettifyJson(bodyStr)}` : "" - }\n📩Response body${responseText ? `: \n${prettifyJson(responseText)}` : " is empty"}`; + const message = `${method} ${url} → ${response.ok ? "🟢" : "🔴"}${response.status} ${ + response.statusText + }.\n📩Response body${responseText ? `: \n${prettifyJson(responseText)}` : " is empty"}`; if (response.ok) { log.debug(message); } else { diff --git a/libs/core-functions/src/functions/lib/udf-wrapper-code.ts b/libs/core-functions/src/functions/lib/udf-wrapper-code.ts index 3b52334f6..54c423731 100644 --- a/libs/core-functions/src/functions/lib/udf-wrapper-code.ts +++ b/libs/core-functions/src/functions/lib/udf-wrapper-code.ts @@ -11,84 +11,12 @@ class RetryError extends Error { export { DropRetryErrorName, RetryError, RetryErrorName };`; -export const wrapperCode = `//JS -import * as udf from "udf"; -import { RetryError } from "@jitsu/functions-lib"; - -const userFunction = udf.default; -const meta = udf.config || {}; - -global.RetryError = RetryError; - -const wrappedUserFunction = async function (eventcopy, ctxcopy) { - const c = ctxcopy.copy(); - const ctx = { - ...c, - store: { - ...c.store, - get: async key => { - const res = await c.store.get.apply(undefined, [key], { arguments: { copy: true }, result: { promise: true } }); - return res ? JSON.parse(res) : undefined; - }, - ttl: async key => { - return await c.store.ttl.apply(undefined, [key], { arguments: { copy: true }, result: { promise: true } }); - }, - }, - fetch: async (url, opts) => { - const res = await c.fetch.apply(undefined, [url, opts], { arguments: { copy: true }, result: { promise: true } }); - const r = JSON.parse(res); - - return { - ...r, - json: async () => { - return JSON.parse(r.body); - }, - text: async () => { - return r.body; - }, - arrayBuffer: async () => { - throw new Error("Method 'arrayBuffer' is not implemented"); - }, - blob: async () => { - throw new Error("Method 'blob' is not implemented"); - }, - formData: async () => { - throw new Error("Method 'formData' is not implemented"); - }, - clone: async () => { - throw new Error("Method 'clone' is not implemented"); - }, - }; - }, - }; - const event = eventcopy.copy(); - if (!userFunction || typeof userFunction !== "function") { - throw new Error("Function not found. Please export default function."); - } - console = { - ...console, - log: ctx.log.info, - error: ctx.log.error, - warn: ctx.log.warn, - debug: ctx.log.debug, - info: ctx.log.info, - assert: (asrt, ...args) => { - if (!asrt) { - ctx.log.error("Assertion failed", ...args); - } - }, - }; - return userFunction(event, ctx); -}; -export { meta, wrappedUserFunction }; -`; - export const chainWrapperCode = `//** @UDF_FUNCTIONS_IMPORT **// import {DropRetryErrorName, RetryError, RetryErrorName} from "@jitsu/functions-lib"; global.RetryError = RetryError; -export function checkError(chainRes, funcCtx) { +export function checkError(chainRes) { let errObj = undefined; for (const el of chainRes.execLog) { const error = el.error; @@ -103,7 +31,12 @@ export function checkError(chainRes, funcCtx) { functionId: error.functionId || el.functionId } } else { - funcCtx.log.error.apply(undefined, [\`Function execution failed\`, error.name, error.message, {udfId: error.functionId || el.functionId}], {arguments: {copy: true}}); + _jitsu_log.error.apply(undefined, [{ + function: { + ..._jitsu_funcCtx.function, + id: error.functionId || el.functionId + } + }, \`Function execution failed\`, error.name, error.message], {arguments: {copy: true}}); } } } @@ -131,7 +64,7 @@ function deepCopy(o) { } const newO = {} - for (const [k,v] of Object.entries(o)) { + for (const [k, v] of Object.entries(o)) { newO[k] = !v || typeof v !== "object" ? v : deepCopy(v) } return newO @@ -144,7 +77,7 @@ function isDropResult(result) { async function runChain( chain, event, - funcCtx + ctx ) { const execLog = []; let events = [event]; @@ -155,26 +88,24 @@ async function runChain( for (let i = 0; i < events.length; i++) { const event = events[i]; let result = undefined; - const sw = Date.now(); - const rat = new Date(event.receivedAt); - const execLogMeta = { - eventIndex: i, - receivedAt: rat && rat != "Invalid Date" ? rat : new Date(), - functionId: f.id, - }; + // const execLogMeta = { + // eventIndex: i, + // receivedAt: rat && rat != "Invalid Date" ? rat : new Date(), + // functionId: f.id, + // }; try { - result = await f.f(deepCopy(event), funcCtx); + result = await f.f(deepCopy(event), ctx); if (k < chain.length - 1 && Array.isArray(result) && result.length > 1) { const l = result.length; result = undefined; - throw new Error("Got " + l + "events as result of function #" + k + 1 + " of " + chain.length + ". Only the last function in a chain is allowed to multiply events."); + throw new Error("Got " + l + " events as result of function #" + (k + 1) + " of " + chain.length + ". Only the last function in a chain is allowed to multiply events."); } - execLog.push({ - ...execLogMeta, - ms: Date.now() - sw, - dropped: isDropResult(result), - }); + // execLog.push({ + // ...execLogMeta, + // ms: Date.now() - sw, + // dropped: isDropResult(result), + // }); } catch (err) { if (err.name === DropRetryErrorName) { result = "drop"; @@ -183,11 +114,11 @@ async function runChain( err.retryPolicy = f.meta.retryPolicy; } execLog.push({ - ...execLogMeta, - event, + functionId: f.id, error: err, - ms: Date.now() - sw, - dropped: isDropResult(result), + //event, + // ms: Date.now() - sw, + // dropped: isDropResult(result), }); } if (!isDropResult(result)) { @@ -204,107 +135,117 @@ async function runChain( return {events, execLog}; } -const wrappedFunctionChain = async function (eventcopy, ctxcopy) { - const c = ctxcopy; +const wrappedFunctionChain = async function (event, ctx) { let chain = []; //** @UDF_FUNCTIONS_CHAIN **// - const event = eventcopy; - const chainRes = await runChain(chain, event, c); - checkError(chainRes, c); + const chainRes = await runChain(chain, event, ctx); + checkError(chainRes); if (Array.isArray(chainRes.events) && chainRes.events.length === 1) { return chainRes.events[0]; } return chainRes.events; }; -const wrappedUserFunction = (id, f) => async function (event, c) { - const ctx = { - ...c, - log: { - info: (...args) => { - c.log.info.apply(undefined, [...args, {udfId: id}], {arguments: {copy: true}}); - }, - error: (...args) => { - c.log.error.apply(undefined, [...args, {udfId: id}], {arguments: {copy: true}}); - }, - warn: (...args) => { - c.log.warn.apply(undefined, [...args, {udfId: id}], {arguments: {copy: true}}); +const wrappedUserFunction = (id, f, funcCtx) => { + + const log = { + info: (...args) => { + _jitsu_log.info.apply(undefined, [funcCtx, ...args], {arguments: {copy: true}}); + }, + error: (...args) => { + _jitsu_log.error.apply(undefined, [funcCtx, ...args], {arguments: {copy: true}}); + }, + warn: (...args) => { + _jitsu_log.warn.apply(undefined, [funcCtx, ...args], {arguments: {copy: true}}); + }, + debug: (...args) => { + _jitsu_log.debug.apply(undefined, [funcCtx, ...args], {arguments: {copy: true}}); + }, + } + + const store = { + set: async (key, value, opts) => { + await _jitsu_store.set.apply(undefined, [key, value, opts], { + arguments: {copy: true}, + result: {ignore: true} + }); + }, + del: async key => { + await _jitsu_store.del.apply(undefined, [key], { + arguments: {copy: true}, + result: {ignore: true} + }); + }, + get: async key => { + const res = await _jitsu_store.get.apply(undefined, [key], { + arguments: {copy: true}, + result: {promise: true} + }); + return res ? JSON.parse(res) : undefined; + }, + ttl: async key => { + return await _jitsu_store.ttl.apply(undefined, [key], { + arguments: {copy: true}, + result: {promise: true} + }); + }, + } + + const fetch = async (url, opts, extras) => { + let res + if (extras) { + res = await _jitsu_fetch.apply(undefined, [url, opts, {ctx: funcCtx, event: extras.event}], { + arguments: {copy: true}, + result: {promise: true} + }); + } else { + res = await _jitsu_fetch.apply(undefined, [url, opts], { + arguments: {copy: true}, + result: {promise: true} + }); + } + const r = JSON.parse(res); + + return { + ...r, + json: async () => { + return JSON.parse(r.body); }, - debug: (...args) => { - c.log.debug.apply(undefined, [...args, {udfId: id}], {arguments: {copy: true}}); + text: async () => { + return r.body; }, - }, - store: { - set: async (key,value,opts) => { - await c.store.set.apply(undefined, [key, value,opts], { - arguments: {copy: true}, - result: { ignore: true} - }); + arrayBuffer: async () => { + throw new Error("Method 'arrayBuffer' is not implemented"); }, - del: async key => { - await c.store.del.apply(undefined, [key], { - arguments: {copy: true}, - result: {ignore: true} - }); + blob: async () => { + throw new Error("Method 'blob' is not implemented"); }, - get: async key => { - const res = await c.store.get.apply(undefined, [key], { - arguments: {copy: true}, - result: {promise: true} - }); - return res ? JSON.parse(res) : undefined; + formData: async () => { + throw new Error("Method 'formData' is not implemented"); }, - ttl: async key => { - return await c.store.ttl.apply(undefined, [key], { - arguments: {copy: true}, - result: {promise: true} - }); + clone: async () => { + throw new Error("Method 'clone' is not implemented"); }, - }, - fetch: async (url, opts) => { - const res = await c.fetch.apply(undefined, [url, opts, {udfId: id}], { - arguments: {copy: true}, - result: {promise: true} - }); - const r = JSON.parse(res); + }; + } - return { - ...r, - json: async () => { - return JSON.parse(r.body); - }, - text: async () => { - return r.body; - }, - arrayBuffer: async () => { - throw new Error("Method 'arrayBuffer' is not implemented"); - }, - blob: async () => { - throw new Error("Method 'blob' is not implemented"); - }, - formData: async () => { - throw new Error("Method 'formData' is not implemented"); - }, - clone: async () => { - throw new Error("Method 'clone' is not implemented"); - }, - }; - }, - }; - console = { - ...console, - log: ctx.log.info, - error: ctx.log.error, - warn: ctx.log.warn, - debug: ctx.log.debug, - info: ctx.log.info, - assert: (asrt, ...args) => { - if (!asrt) { - ctx.log.error("Assertion failed", ...args); + return async function (event, c) { + const debugEnabled = funcCtx.function.debugTill && funcCtx.function.debugTill > new Date(); + let ftch = fetch + if (debugEnabled) { + ftch = async(url, opts) => { + return fetch(url, opts, {event}); } - }, - }; - return f(event, ctx); + } + const ctx = { + ...c, + props: funcCtx.props, + log, + store, + fetch: ftch, + }; + return await f(event, ctx); + } }; export {wrappedFunctionChain}; diff --git a/libs/core-functions/src/functions/lib/udf-wrapper-code.txtjs b/libs/core-functions/src/functions/lib/udf-wrapper-code.txtjs index db8732775..cece04219 100644 --- a/libs/core-functions/src/functions/lib/udf-wrapper-code.txtjs +++ b/libs/core-functions/src/functions/lib/udf-wrapper-code.txtjs @@ -3,7 +3,7 @@ import {DropRetryErrorName, RetryError, RetryErrorName} from "@jitsu/functions-l global.RetryError = RetryError; -export function checkError(chainRes, funcCtx) { +export function checkError(chainRes) { let errObj = undefined; for (const el of chainRes.execLog) { const error = el.error; @@ -18,7 +18,12 @@ export function checkError(chainRes, funcCtx) { functionId: error.functionId || el.functionId } } else { - funcCtx.log.error.apply(undefined, [`Function execution failed`, error.name, error.message, {udfId: error.functionId || el.functionId}], {arguments: {copy: true}}); + _jitsu_log.error.apply(undefined, [{ + function: { + ..._jitsu_funcCtx.function, + id: error.functionId || el.functionId + } + }, `Function execution failed`, error.name, error.message], {arguments: {copy: true}}); } } } @@ -46,7 +51,7 @@ function deepCopy(o) { } const newO = {} - for (const [k,v] of Object.entries(o)) { + for (const [k, v] of Object.entries(o)) { newO[k] = !v || typeof v !== "object" ? v : deepCopy(v) } return newO @@ -59,7 +64,7 @@ function isDropResult(result) { async function runChain( chain, event, - funcCtx + ctx ) { const execLog = []; let events = [event]; @@ -70,26 +75,24 @@ async function runChain( for (let i = 0; i < events.length; i++) { const event = events[i]; let result = undefined; - const sw = Date.now(); - const rat = new Date(event.receivedAt); - const execLogMeta = { - eventIndex: i, - receivedAt: rat && rat != "Invalid Date" ? rat : new Date(), - functionId: f.id, - }; + // const execLogMeta = { + // eventIndex: i, + // receivedAt: rat && rat != "Invalid Date" ? rat : new Date(), + // functionId: f.id, + // }; try { - result = await f.f(deepCopy(event), funcCtx); + result = await f.f(deepCopy(event), ctx); if (k < chain.length - 1 && Array.isArray(result) && result.length > 1) { const l = result.length; result = undefined; - throw new Error("Got " + l + "events as result of function #" + k + 1 + " of " + chain.length + ". Only the last function in a chain is allowed to multiply events."); + throw new Error("Got " + l + " events as result of function #" + (k + 1) + " of " + chain.length + ". Only the last function in a chain is allowed to multiply events."); } - execLog.push({ - ...execLogMeta, - ms: Date.now() - sw, - dropped: isDropResult(result), - }); + // execLog.push({ + // ...execLogMeta, + // ms: Date.now() - sw, + // dropped: isDropResult(result), + // }); } catch (err) { if (err.name === DropRetryErrorName) { result = "drop"; @@ -98,11 +101,11 @@ async function runChain( err.retryPolicy = f.meta.retryPolicy; } execLog.push({ - ...execLogMeta, - event, + functionId: f.id, error: err, - ms: Date.now() - sw, - dropped: isDropResult(result), + //event, + // ms: Date.now() - sw, + // dropped: isDropResult(result), }); } if (!isDropResult(result)) { @@ -119,107 +122,117 @@ async function runChain( return {events, execLog}; } -const wrappedFunctionChain = async function (eventcopy, ctxcopy) { - const c = ctxcopy; +const wrappedFunctionChain = async function (event, ctx) { let chain = []; //** @UDF_FUNCTIONS_CHAIN **// - const event = eventcopy; - const chainRes = await runChain(chain, event, c); - checkError(chainRes, c); + const chainRes = await runChain(chain, event, ctx); + checkError(chainRes); if (Array.isArray(chainRes.events) && chainRes.events.length === 1) { return chainRes.events[0]; } return chainRes.events; }; -const wrappedUserFunction = (id, f) => async function (event, c) { - const ctx = { - ...c, - log: { - info: (...args) => { - c.log.info.apply(undefined, [...args, {udfId: id}], {arguments: {copy: true}}); - }, - error: (...args) => { - c.log.error.apply(undefined, [...args, {udfId: id}], {arguments: {copy: true}}); - }, - warn: (...args) => { - c.log.warn.apply(undefined, [...args, {udfId: id}], {arguments: {copy: true}}); - }, - debug: (...args) => { - c.log.debug.apply(undefined, [...args, {udfId: id}], {arguments: {copy: true}}); - }, +const wrappedUserFunction = (id, f, funcCtx) => { + + const log = { + info: (...args) => { + _jitsu_log.info.apply(undefined, [funcCtx, ...args], {arguments: {copy: true}}); }, - store: { - set: async (key,value,opts) => { - await c.store.set.apply(undefined, [key, value, opts], { - arguments: {copy: true}, - result: { ignore: true} - }); - }, - del: async key => { - await c.store.del.apply(undefined, [key], { - arguments: {copy: true}, - result: {ignore: true} - }); - }, - get: async key => { - const res = await c.store.get.apply(undefined, [key], { - arguments: {copy: true}, - result: {promise: true} - }); - return res ? JSON.parse(res) : undefined; - }, - ttl: async key => { - return await c.store.ttl.apply(undefined, [key], { - arguments: {copy: true}, - result: {promise: true} - }); - }, + error: (...args) => { + _jitsu_log.error.apply(undefined, [funcCtx, ...args], {arguments: {copy: true}}); + }, + warn: (...args) => { + _jitsu_log.warn.apply(undefined, [funcCtx, ...args], {arguments: {copy: true}}); + }, + debug: (...args) => { + _jitsu_log.debug.apply(undefined, [funcCtx, ...args], {arguments: {copy: true}}); + }, + } + + const store = { + set: async (key, value, opts) => { + await _jitsu_store.set.apply(undefined, [key, value, opts], { + arguments: {copy: true}, + result: {ignore: true} + }); + }, + del: async key => { + await _jitsu_store.del.apply(undefined, [key], { + arguments: {copy: true}, + result: {ignore: true} + }); }, - fetch: async (url, opts) => { - const res = await c.fetch.apply(undefined, [url, opts, {udfId: id}], { + get: async key => { + const res = await _jitsu_store.get.apply(undefined, [key], { arguments: {copy: true}, result: {promise: true} }); - const r = JSON.parse(res); - - return { - ...r, - json: async () => { - return JSON.parse(r.body); - }, - text: async () => { - return r.body; - }, - arrayBuffer: async () => { - throw new Error("Method 'arrayBuffer' is not implemented"); - }, - blob: async () => { - throw new Error("Method 'blob' is not implemented"); - }, - formData: async () => { - throw new Error("Method 'formData' is not implemented"); - }, - clone: async () => { - throw new Error("Method 'clone' is not implemented"); - }, - }; + return res ? JSON.parse(res) : undefined; }, - }; - console = { - ...console, - log: ctx.log.info, - error: ctx.log.error, - warn: ctx.log.warn, - debug: ctx.log.debug, - info: ctx.log.info, - assert: (asrt, ...args) => { - if (!asrt) { - ctx.log.error("Assertion failed", ...args); - } + ttl: async key => { + return await _jitsu_store.ttl.apply(undefined, [key], { + arguments: {copy: true}, + result: {promise: true} + }); }, - }; - return f(event, ctx); + } + + const fetch = async (url, opts, extras) => { + let res + if (extras) { + res = await _jitsu_fetch.apply(undefined, [url, opts, {ctx: funcCtx, event: extras.event}], { + arguments: {copy: true}, + result: {promise: true} + }); + } else { + res = await _jitsu_fetch.apply(undefined, [url, opts], { + arguments: {copy: true}, + result: {promise: true} + }); + } + const r = JSON.parse(res); + + return { + ...r, + json: async () => { + return JSON.parse(r.body); + }, + text: async () => { + return r.body; + }, + arrayBuffer: async () => { + throw new Error("Method 'arrayBuffer' is not implemented"); + }, + blob: async () => { + throw new Error("Method 'blob' is not implemented"); + }, + formData: async () => { + throw new Error("Method 'formData' is not implemented"); + }, + clone: async () => { + throw new Error("Method 'clone' is not implemented"); + }, + }; + } + + return async function (event, c) { + const debugEnabled = funcCtx.function.debugTill && funcCtx.function.debugTill > new Date(); + let ftch = fetch + if (debugEnabled) { + ftch = async(url, opts) => { + return fetch(url, opts, {event}); + } + } + const ctx = { + ...c, + props: funcCtx.props, + log, + store, + fetch: ftch, + }; + return await f(event, ctx); + } }; export {wrappedFunctionChain}; diff --git a/libs/core-functions/src/functions/mixpanel-destination.ts b/libs/core-functions/src/functions/mixpanel-destination.ts index 4ac543dcf..f443646ec 100644 --- a/libs/core-functions/src/functions/mixpanel-destination.ts +++ b/libs/core-functions/src/functions/mixpanel-destination.ts @@ -1,9 +1,10 @@ import { FullContext, JitsuFunction } from "@jitsu/protocols/functions"; import { RetryError } from "@jitsu/functions-lib"; import type { AnalyticsServerEvent, Geo } from "@jitsu/protocols/analytics"; -import { hash, randomId } from "juava"; +import { hash } from "juava"; import { MixpanelCredentials } from "../meta"; import { eventTimeSafeMs } from "./lib"; +import { randomUUID } from "crypto"; import zlib from "zlib"; //See https://help.mixpanel.com/hc/en-us/articles/115004708186-Profile-Properties @@ -21,7 +22,6 @@ export const specialProperties = [ const CLICK_IDS = ["dclid", "fbclid", "gclid", "ko_click_id", "li_fat_id", "msclkid", "ttclid", "twclid", "wbraid"]; export type HttpRequest = { - id: string; method?: string; url: string; payload?: any; @@ -137,8 +137,14 @@ function trackEvent( userAgent: analyticsContext.userAgent, }; const pageUrl = evict(customProperties, "url"); + + const app = analyticsContext.app || ({} as any); + const network = analyticsContext.network || ({} as any); + const screen = analyticsContext.screen || ({} as any); + const device = analyticsContext.device || ({} as any); + const ua = ctx.ua || ({} as any); + const uaDevice = ua.device || ({} as any); return { - id: randomId(), url: `https://api.mixpanel.com/import?strict=1&project_id=${opts.projectId}`, headers: { "Content-type": "application/json", @@ -154,12 +160,12 @@ function trackEvent( time: eventTimeSafeMs(event), $device_id: deviceId, distinct_id: distinctId, - $insert_id: hash("md5", event.messageId) + "-" + randomId(), + $insert_id: randomUUID(), $user_id: event.userId ? `${event.userId}` : undefined, - $browser: ctx.ua?.browser?.name, - $browser_version: ctx.ua?.browser?.version, - $os: analyticsContext.os?.name || ctx.ua?.os?.name, - $os_version: analyticsContext.os?.version || ctx.ua?.os?.version, + $browser: ua.browser?.name, + $browser_version: ua.browser?.version, + $os: analyticsContext.os?.name || ua.os?.name, + $os_version: analyticsContext.os?.version || ua.os?.version, $current_url: pageUrl, ...clickParams(pageUrl), current_page_title: evict(customProperties, "title"), @@ -170,32 +176,32 @@ function trackEvent( ...geoParams(analyticsContext.geo), //mobile - $app_namespace: analyticsContext.app?.namespace, - $app_name: analyticsContext.app?.name, - $app_build_number: analyticsContext.app?.build, - $app_release: analyticsContext.app?.build, - $app_version: analyticsContext.app?.version, - $app_version_string: analyticsContext.app?.version, - - $carrier: analyticsContext?.network?.carrier, - $has_telephone: analyticsContext?.network?.cellular, - $bluetooth_enabled: analyticsContext.network?.bluetooth, - $wifi: analyticsContext?.network?.wifi, - - $screen_dpi: analyticsContext.screen?.density, - $screen_height: analyticsContext.screen?.height, - $screen_width: analyticsContext.screen?.width, + $app_namespace: app.namespace, + $app_name: app.name, + $app_build_number: app.build, + $app_release: app.build, + $app_version: app.version, + $app_version_string: app.version, + + $carrier: network.carrier, + $has_telephone: network.cellular, + $bluetooth_enabled: network.bluetooth, + $wifi: network.wifi, + + $screen_dpi: screen.density, + $screen_height: screen.height, + $screen_width: screen.width, // $bluetooth_version: "ble", // $brand: "google", // $had_persisted_distinct_id: false, // $has_nfc: false, - $device_type: analyticsContext.device?.type || ctx.ua?.device?.type, - $device_name: analyticsContext.device?.name || ctx.ua?.device?.model, - $manufacturer: analyticsContext.device?.manufacturer || ctx.ua?.device?.vendor, - $model: analyticsContext.device?.model || ctx.ua?.device?.model, - advertising_id: analyticsContext.device?.advertisingId, - ad_tracking_enabled: analyticsContext.device?.adTrackingEnabled, + $device_type: device.type || uaDevice.type, + $device_name: device.name || uaDevice.model, + $manufacturer: device.manufacturer || uaDevice.vendor, + $model: device.model || uaDevice.model, + advertising_id: device.advertisingId, + ad_tracking_enabled: device.adTrackingEnabled, ...customProperties, }, @@ -206,38 +212,45 @@ function trackEvent( function setProfileMessage(ctx: FullContext, distinctId: string, event: AnalyticsServerEvent): HttpRequest[] { const opts = ctx.props as MixpanelCredentials; - const traits = { ...(event.traits || event.context?.traits || {}) }; + + const analyticsContext = event.context || {}; + const traits = { ...(event.traits || analyticsContext.traits || {}) }; + const app = analyticsContext.app; + const device = analyticsContext.device; + const os = analyticsContext.os; + const page = analyticsContext.page; + const ua = ctx.ua; + specialProperties.forEach(prop => { if (traits[prop]) { traits[`$${prop}`] = traits[prop]; delete traits[prop]; } }); - const groupId = event.context?.groupId || traits.groupId; + const groupId = analyticsContext.groupId || traits.groupId; delete traits.groupId; let mobileDeviceInfo: any = {}; - if (event.context?.os?.name === "Android" && event.context?.app) { + if (os?.name === "Android" && app) { mobileDeviceInfo = { - $android_app_version: event.context.app.version, - $android_app_version_code: event.context.app.build, - $android_manufacturer: event.context.device?.manufacturer, - $android_model: event.context.device?.model, - $android_os: event.context.os?.name, - $android_os_version: event.context.os?.version, + $android_app_version: app.version, + $android_app_version_code: app.build, + $android_manufacturer: device?.manufacturer, + $android_model: device?.model, + $android_os: os.name, + $android_os_version: os.version, }; - } else if (event.context?.device?.manufacturer === "Apple" && event.context?.app) { + } else if (device?.manufacturer === "Apple" && app) { mobileDeviceInfo = { - $ios_app_version: event.context.app.build, - $ios_app_release: event.context.app.version, - $ios_device_model: event.context.device?.model, - $ios_version: event.context.os?.version, + $ios_app_version: app.build, + $ios_app_release: app.version, + $ios_device_model: device.model, + $ios_version: os?.version, }; } const reqs: HttpRequest[] = [ { - id: randomId(), url: "https://api.mixpanel.com/engage?verbose=1#profile-set", headers: { "Content-type": "application/json", @@ -247,26 +260,25 @@ function setProfileMessage(ctx: FullContext, distinctId: string, event: Analytic { $token: opts.projectToken, $distinct_id: distinctId, - $ip: event.context?.ip, + $ip: analyticsContext.ip, $set: { - ...geoParams(event.context?.geo), + ...geoParams(analyticsContext.geo), ...traits, - $browser: ctx.ua?.browser?.name, - $browser_version: ctx.ua?.browser?.version, - $os: ctx.ua?.os?.name, + $browser: ua?.browser?.name, + $browser_version: ua?.browser?.version, + $os: ua?.os?.name, ...mobileDeviceInfo, }, }, ], }, ]; - if (event.context?.page?.referrer || event.context?.page?.referring_domain) { + if (page?.referrer || page?.referring_domain) { const utm = { - ...utmFromCampaign(event.context?.campaign || {}, "initial_"), + ...utmFromCampaign(analyticsContext.campaign || {}, "initial_"), ...extractUtmParams(event.properties || {}, "initial_"), }; reqs.push({ - id: randomId(), url: "https://api.mixpanel.com/engage?verbose=1#profile-set-once", headers: { "Content-type": "application/json", @@ -276,11 +288,11 @@ function setProfileMessage(ctx: FullContext, distinctId: string, event: Analytic { $token: opts.projectToken, $distinct_id: distinctId, - $ip: event.context?.ip, + $ip: analyticsContext.ip, $set_once: { ...utm, - $initial_referrer: event.context?.page?.referrer, - $initial_referring_domain: event.context?.page?.referring_domain, + $initial_referrer: page?.referrer, + $initial_referring_domain: page?.referring_domain, }, }, ], @@ -291,11 +303,10 @@ function setProfileMessage(ctx: FullContext, distinctId: string, event: Analytic const unionPayload: any = { $token: opts.projectToken, $distinct_id: distinctId, - $ip: event.context?.ip, + $ip: analyticsContext.ip, $union: { [groupKey]: [groupId] }, }; reqs.push({ - id: randomId(), url: "https://api.mixpanel.com/engage?verbose=1#profile-union", headers: { "Content-type": "application/json", @@ -324,7 +335,6 @@ function setGroupMessage(event: AnalyticsServerEvent, opts: MixpanelCredentials) }; return { - id: randomId(), url: "https://api.mixpanel.com/groups?verbose=1#group-set", headers: { "Content-type": "application/json", @@ -350,7 +360,6 @@ function merge(ctx: FullContext, messageId: string, identifiedId: string, anonym const basicAuth = getAuth(opts); return [ { - id: randomId(), url: `https://api.mixpanel.com/import?strict=1&project_id=${opts.projectId}`, headers: { "Content-type": "application/json", @@ -361,7 +370,7 @@ function merge(ctx: FullContext, messageId: string, identifiedId: string, anonym { event: "$merge", properties: { - $insert_id: messageId + "-" + randomId(), + $insert_id: randomUUID(), $distinct_ids: [identifiedId, anonymousId], token: opts.projectToken, }, @@ -379,7 +388,6 @@ function alias(ctx: FullContext, messageId: string, identifiedId: string, anonym const basicAuth = getAuth(opts); return [ { - id: randomId(), url: `https://api.mixpanel.com/import?strict=1&project_id=${opts.projectId}`, headers: { "Content-type": "application/json", @@ -390,7 +398,7 @@ function alias(ctx: FullContext, messageId: string, identifiedId: string, anonym { event: "$create_alias", properties: { - $insert_id: messageId + "-" + randomId(), + $insert_id: randomUUID(), distinct_id: anonymousId, alias: identifiedId, token: opts.projectToken, @@ -495,15 +503,16 @@ const MixpanelDestination: JitsuFunction ` - : "" - }${result.status} ${await result.text()}`; if (result.status !== 200) { - throw new Error(logMessage); + throw new Error( + `MixPanel ${method} ${message.url}:${ + message.payload + ? `${JSON.stringify(message.payload)} (size: ${payload.length} compressed: ${compressed.length}) --> ` + : "" + }${result.status} ${await result.text()}` + ); } else { - ctx.log.debug(logMessage); + ctx.log.debug(`MixPanel ${method} ${message.url}: ${result.status} ${await result.text()}`); } } } catch (e: any) { diff --git a/libs/core-functions/src/functions/segment-destination.ts b/libs/core-functions/src/functions/segment-destination.ts index 9b9b82973..440b5943d 100644 --- a/libs/core-functions/src/functions/segment-destination.ts +++ b/libs/core-functions/src/functions/segment-destination.ts @@ -40,13 +40,14 @@ const SegmentDestination: JitsuFunction ` : "" - }${result.status} ${await result.text()}`; if (result.status !== 200) { - throw new RetryError(logMessage); + throw new RetryError( + `Segment ${httpRequest.method} ${httpRequest.url}:${ + httpRequest.payload ? `${JSON.stringify(httpRequest.payload)} --> ` : "" + }${result.status} ${await result.text()}` + ); } else { - ctx.log.debug(logMessage); + ctx.log.debug(`Segment ${httpRequest.method} ${httpRequest.url}: ${result.status} ${await result.text()}`); } } catch (e: any) { throw new RetryError( diff --git a/libs/core-functions/src/functions/udf_wrapper.ts b/libs/core-functions/src/functions/udf_wrapper.ts index 99fa8bd57..e645daac2 100644 --- a/libs/core-functions/src/functions/udf_wrapper.ts +++ b/libs/core-functions/src/functions/udf_wrapper.ts @@ -1,11 +1,22 @@ import { getLog, LogLevel, sanitize, stopwatch } from "juava"; import { Isolate, ExternalCopy, Reference, Module, Context } from "isolated-vm"; -import { EventContext, FetchOpts, FuncReturn, JitsuFunction, Store } from "@jitsu/protocols/functions"; +import { EventContext, FuncReturn, Store, TTLStore, FetchOpts } from "@jitsu/protocols/functions"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; -import { createFullContext, EventsStore } from "../context"; -import { createMemoryStore, isDropResult, memoryStoreDump } from "../index"; + +import { + createMemoryStore, + EventsStore, + FunctionChainContext, + FunctionContext, + isDropResult, + makeFetch, + makeLog, + memoryStoreDump, +} from "../index"; import { functionsLibCode, chainWrapperCode } from "./lib/udf-wrapper-code"; import { parseUserAgent } from "./lib/ua"; +import { RetryError } from "@jitsu/functions-lib"; +import { JitsuFunctionWrapper } from "./lib"; const log = getLog("udf-wrapper"); @@ -18,7 +29,7 @@ export type logType = { }; export type UDFWrapperResult = { - userFunction: JitsuFunction; + userFunction: JitsuFunctionWrapper; close: () => void; }; @@ -28,11 +39,17 @@ export type UDFFunction = { code: string; }; -export const UDFWrapper = (connectionId: string, functions: UDFFunction[]): UDFWrapperResult => { - log.atInfo().log(`[${connectionId}] Compiling ${functions.length} UDF functions`); +export const UDFWrapper = ( + connectionId: string, + chainCtx: FunctionChainContext, + funcCtx: FunctionContext, + functions: UDFFunction[] +): UDFWrapperResult => { + log.atInfo().log(`[CON:${connectionId}] Compiling ${functions.length} UDF functions`); const sw = stopwatch(); let isolate: Isolate; let context: Context; + let refs: Reference[] = []; try { isolate = new Isolate({ memoryLimit: 128 }); context = isolate.createContextSync(); @@ -42,6 +59,54 @@ export const UDFWrapper = (connectionId: string, functions: UDFFunction[]): UDFW // because otherwise 'global' would actually be a Reference{} object in the new isolate. jail.setSync("global", jail.derefInto()); + jail.setSync("_jitsu_funcCtx", new ExternalCopy(funcCtx).copyInto({ release: true, transferIn: true })); + jail.setSync( + "_jitsu_log", + new ExternalCopy({ + info: makeReference(refs, chainCtx.log.info), + warn: makeReference(refs, chainCtx.log.warn), + debug: makeReference(refs, chainCtx.log.debug), + error: makeReference(refs, chainCtx.log.error), + }).copyInto({ release: true, transferIn: true }) + ); + jail.setSync( + "_jitsu_fetch", + makeReference(refs, async (url: string, opts?: FetchOpts, extra?: any) => { + const res = await chainCtx.fetch(url, opts, extra); + const headers: any = {}; + res.headers.forEach((v, k) => { + headers[k] = v; + }); + const text = await res.text(); + const j = { + status: res.status, + statusText: res.statusText, + type: res.type, + redirected: res.redirected, + body: text, + bodyUsed: true, + url: res.url, + ok: res.ok, + headers: headers, + }; + return JSON.stringify(j); + }) + ); + jail.setSync( + "_jitsu_store", + new ExternalCopy({ + get: makeReference(refs, async (key: string) => { + const res = await chainCtx.store.get(key); + return JSON.stringify(res); + }), + set: makeReference(refs, chainCtx.store.set), + del: makeReference(refs, chainCtx.store.del), + ttl: makeReference(refs, async (key: string) => { + return await chainCtx.store.ttl(key); + }), + }).copyInto({ release: true, transferIn: true }) + ); + const functionsLib = isolate.compileModuleSync(functionsLibCode, { filename: "functions-lib.js", }); @@ -62,7 +127,7 @@ export const UDFWrapper = (connectionId: string, functions: UDFFunction[]): UDFW throw new Error(`import is not allowed: ${specifier}`); }); udfModules[moduleName] = udf; - log.atDebug().log(`[${connectionId}] [f:${f.id}] UDF function '${f.name}' compiled in ${sw.elapsedPretty()}`); + log.atDebug().log(`[CON:${connectionId}] [f:${f.id}] UDF function '${f.name}' compiled in ${sw.elapsedPretty()}`); } let code = chainWrapperCode.replace( @@ -77,7 +142,7 @@ export const UDFWrapper = (connectionId: string, functions: UDFFunction[]): UDFW Object.keys(udfModules) .map(m => { const id = m.split("_").pop(); - return `{id: "${id}", meta: ${m}.config, f: wrappedUserFunction("${id}", ${m}.default)}`; + return `{id: "${id}", meta: ${m}.config, f: wrappedUserFunction("${id}", ${m}.default, { props: _jitsu_funcCtx.props, function:{ ..._jitsu_funcCtx.function, id: "${id}"}})}`; }) .join(",") + "];" @@ -98,7 +163,7 @@ export const UDFWrapper = (connectionId: string, functions: UDFFunction[]): UDFW }); wrapper.evaluateSync(); const wrapperFunc = wrap(connectionId, isolate, context, wrapper); - log.atInfo().log(`[${connectionId}] total UDF compile time: ${sw.elapsedPretty()}`); + log.atInfo().log(`[CON:${connectionId}] total UDF compile time: ${sw.elapsedPretty()}`); return wrapperFunc; } catch (e) { return { @@ -108,6 +173,9 @@ export const UDFWrapper = (connectionId: string, functions: UDFFunction[]): UDFW close: () => { try { if (isolate) { + for (const r of refs) { + r.release(); + } context.release(); isolate.dispose(); log.atInfo().log(`[${connectionId}] isolate closed`); @@ -129,52 +197,12 @@ function wrap(connectionId: string, isolate: Isolate, context: Context, wrapper: if (!ref || ref.typeof !== "function") { throw new Error("Function not found. Please export wrappedFunctionChain function."); } - const userFunction: JitsuFunction = async (event, ctx) => { + const userFunction: JitsuFunctionWrapper = async (event, ctx) => { if (isolate.isDisposed) { - throw new Error("Isolate is disposed"); + throw new RetryError("Isolate is disposed", { drop: true }); } - let refs: Reference[] = []; const eventCopy = new ExternalCopy(event); - const ctxCopy = new ExternalCopy({ - ...ctx, - log: { - info: makeReference(refs, ctx.log.info), - warn: makeReference(refs, ctx.log.warn), - debug: makeReference(refs, ctx.log.debug), - error: makeReference(refs, ctx.log.error), - }, - fetch: makeReference(refs, async (url: string, opts?: FetchOpts, extra?: any) => { - const res = await ctx.fetch(url, opts, extra); - const headers: any = {}; - res.headers.forEach((v, k) => { - headers[k] = v; - }); - const text = await res.text(); - const j = { - status: res.status, - statusText: res.statusText, - type: res.type, - redirected: res.redirected, - body: text, - bodyUsed: true, - url: res.url, - ok: res.ok, - headers: headers, - }; - return JSON.stringify(j); - }), - store: { - get: makeReference(refs, async (key: string) => { - const res = await ctx.store.get(key); - return JSON.stringify(res); - }), - set: makeReference(refs, ctx.store.set), - del: makeReference(refs, ctx.store.del), - ttl: makeReference(refs, async (key: string) => { - return await ctx.store.ttl(key); - }), - }, - }); + const ctxCopy = new ExternalCopy(ctx); try { const res = await ref.apply( undefined, @@ -199,6 +227,7 @@ function wrap(connectionId: string, isolate: Isolate, context: Context, wrapper: return r; } } catch (e: any) { + //console.error(e); if (isolate.isDisposed) { throw new Error("Isolate is disposed"); } @@ -208,10 +237,6 @@ function wrap(connectionId: string, isolate: Isolate, context: Context, wrapper: } //log.atInfo().log(`ERROR name: ${e.name} message: ${e.message} json: ${e.stack}`); throw e; - } finally { - for (const r of refs) { - r.release(); - } } }; return { @@ -268,6 +293,7 @@ export async function UDFTestRun({ event, config, userAgent, + workspaceId, }: UDFTestRequest): Promise { const logs: logType[] = []; let wrapper: UDFWrapperResult | undefined = undefined; @@ -312,8 +338,11 @@ export async function UDFTestRun({ connection: { id: "functionsDebugger", }, + workspace: { + id: workspaceId, + }, }; - let storeImpl: Store; + let storeImpl: TTLStore; if ( typeof store?.set === "function" && typeof store?.get === "function" && @@ -354,7 +383,7 @@ export async function UDFTestRun({ } logs.push({ message: `${msg.method} ${msg.url} :: ${statusText}`, - level: msg.error ? "error" : "info", + level: msg.error ? "error" : "debug", timestamp: new Date(), type: "http", data: { @@ -367,13 +396,27 @@ export async function UDFTestRun({ }, close() {}, }; - const ctx = createFullContext(id, eventsStore, storeImpl, eventContext, {}, config); + const chainCtx: FunctionChainContext = { + store: storeImpl, + fetch: makeFetch("functionsDebugger", eventsStore), + log: makeLog("functionsDebugger", eventsStore), + }; + const d = new Date(); + d.setDate(d.getDate() + 1); + const funcCtx: FunctionContext = { + function: { + type: "udf", + id, + debugTill: d, + }, + props: config, + }; if (typeof code === "string") { - wrapper = UDFWrapper(id, [{ id, name, code }]); + wrapper = UDFWrapper(id, chainCtx, funcCtx, [{ id, name, code }]); } else { wrapper = code; } - const result = await wrapper?.userFunction(event, ctx); + const result = await wrapper?.userFunction(event, eventContext); return { dropped: isDropResult(result), result: typeof result === "undefined" ? event : result, diff --git a/libs/core-functions/src/functions/user-recognition.ts b/libs/core-functions/src/functions/user-recognition.ts index 069c4badd..b2b206ea3 100644 --- a/libs/core-functions/src/functions/user-recognition.ts +++ b/libs/core-functions/src/functions/user-recognition.ts @@ -1,11 +1,9 @@ import { z } from "zod"; -import { JitsuFunction } from "@jitsu/protocols/functions"; +import { AnonymousEventsStore, JitsuFunction } from "@jitsu/protocols/functions"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; -import { requireDefined } from "juava"; import get from "lodash/get"; import set from "lodash/set"; import merge from "lodash/merge"; -import { SystemContext } from "./lib"; export const UserRecognitionConfig = z.object({ /** @@ -36,8 +34,7 @@ const UserRecognitionFunction: JitsuFunction= 0.4.0'} dependencies: - function-bind: 1.1.1 + function-bind: 1.1.2 /he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} @@ -25339,7 +25353,6 @@ packages: /strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} - dev: false /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} @@ -25762,7 +25775,7 @@ packages: hasBin: true dependencies: '@jridgewell/source-map': 0.3.3 - acorn: 8.8.2 + acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 dev: true @@ -26140,6 +26153,34 @@ packages: code-block-writer: 11.0.3 dev: true + /ts-node-dev@2.0.0(@types/node@16.11.6)(typescript@5.3.3): + resolution: {integrity: sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==} + engines: {node: '>=0.8.0'} + hasBin: true + peerDependencies: + node-notifier: '*' + typescript: '*' + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + chokidar: 3.5.3 + dynamic-dedupe: 0.3.0 + minimist: 1.2.8 + mkdirp: 1.0.4 + resolve: 1.22.2 + rimraf: 2.7.1 + source-map-support: 0.5.21 + tree-kill: 1.2.2 + ts-node: 10.9.2(@types/node@16.11.6)(typescript@5.3.3) + tsconfig: 7.0.0 + typescript: 5.3.3 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + dev: true + /ts-node@10.8.2(@types/node@18.15.11)(typescript@5.3.3): resolution: {integrity: sha512-LYdGnoGddf1D6v8REPtIH+5iq/gTDuZqv2/UJUU7tKjuEU8xVZorBM+buCGNjj+pGEud+sOoM4CX3/YzINpENA==} hasBin: true @@ -26232,6 +26273,37 @@ packages: yn: 3.1.1 dev: true + /ts-node@10.9.2(@types/node@16.11.6)(typescript@5.3.3): + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + '@types/node': 16.11.6 + acorn: 8.8.2 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.3.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + /ts-node@10.9.2(@types/node@18.11.12)(typescript@5.3.3): resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true @@ -26309,6 +26381,15 @@ packages: minimist: 1.2.8 strip-bom: 3.0.0 + /tsconfig@7.0.0: + resolution: {integrity: sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==} + dependencies: + '@types/strip-bom': 3.0.0 + '@types/strip-json-comments': 0.0.30 + strip-bom: 3.0.0 + strip-json-comments: 2.0.1 + dev: true + /tslib@1.10.0: resolution: {integrity: sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==} dev: true diff --git a/services/rotor/package.json b/services/rotor/package.json index 66d6799ab..4cca39777 100644 --- a/services/rotor/package.json +++ b/services/rotor/package.json @@ -14,6 +14,7 @@ "build": "pnpm compile && webpack && pnpm bundle_extenals", "start": "dotenv -e ../../.env.local -- node dist/main.js", "rotor:dev": "dotenv -e ../../.env.local -- nodemon --watch \"src/**\" --ext \"ts,json,tsx\" --exec \"ts-node src/index.ts\"", + "rotor:profile": "dotenv -e ../../.env.local -- nodemon --watch \"src/**\" --ext \"ts,json,tsx\" --exec \"ts-node-dev --inspect -- src/index.ts\"", "test": "tsc -p . && BULKER_URL=dummy BULKER_AUTH_KEY=dummy jest --verbose" }, "dependencies": { @@ -83,6 +84,7 @@ "ts-jest": "^29.1.1", "ts-loader": "^9.4.2", "ts-node": "~10.9.1", + "ts-node-dev": "^2.0.0", "typescript": "^5.3.3", "webpack": "^5.75.0", "webpack-cli": "^5.0.0" diff --git a/services/rotor/src/lib/config-types.ts b/services/rotor/src/lib/config-types.ts index 8a968424b..c5c885f43 100644 --- a/services/rotor/src/lib/config-types.ts +++ b/services/rotor/src/lib/config-types.ts @@ -47,6 +47,7 @@ export type EnrichedConnectionConfig = { //destinationType type: string; options: any; + optionsHash: string; credentials: { [key: string]: any; diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index 1a32e0b25..05089913f 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -1,12 +1,19 @@ -import { AnyEvent, EventContext, FullContext, FuncReturn, JitsuFunction, Store } from "@jitsu/protocols/functions"; +import { AnonymousEventsStore, AnyEvent, EventContext, FuncReturn } from "@jitsu/protocols/functions"; import { - createFullContext, - EventsStore, + createMongoStore, + createMultiStore, + createTtlStore, + FunctionChainContext, + FunctionContext, getBuiltinFunction, isDropResult, + JitsuFunctionWrapper, + makeFetch, + makeLog, MetricsMeta, - SystemContext, + mongodb, UDFWrapper, + wrapperFunction, } from "@jitsu/core-functions"; import Prometheus from "prom-client"; import { RetryErrorName, DropRetryErrorName } from "@jitsu/functions-lib"; @@ -17,16 +24,22 @@ import NodeCache from "node-cache"; import isEqual from "lodash/isEqual"; import { EnrichedConnectionConfig, FunctionConfig } from "./config-types"; import { EntityStore } from "./entity-store"; +import { MessageHandlerContext } from "./message-handler"; + +const fastStoreWorkspaceId = (process.env.FAST_STORE_WORKSPACE_ID ?? "").split(",").filter(x => x.length > 0); export type Func = { id: string; - exec: JitsuFunction; - config: any; - enableSystemContext: boolean; + exec: JitsuFunctionWrapper; + context: FunctionContext; hash?: string; }; -export type FuncChain = Func[]; +export type FuncChain = { + context: FunctionChainContext; + functions: Func[]; +}; + export type FuncChainFilter = "all" | "udf-n-dst" | "dst-only"; const log = getLog("functions-chain"); @@ -95,7 +108,13 @@ const getCachedOrLoad = (cache: NodeCache, key: string, loader: (key: string) => return loaded; }; -export function buildFunctionChain(connection: EnrichedConnectionConfig, funcStore: EntityStore) { +export function buildFunctionChain( + connection: EnrichedConnectionConfig, + funcStore: EntityStore, + rotorContext: MessageHandlerContext, + anonymousEventsStore: AnonymousEventsStore, + fetchTimeoutMs: number = 5000 +): FuncChain { let mainFunction; const connectionData = connection.options as any; if (connection.usesBulker) { @@ -121,6 +140,20 @@ export function buildFunctionChain(connection: EnrichedConnectionConfig, funcSto ); } } + let store = rotorContext.dummyPersistentStore; + if (!store) { + store = createMongoStore(connection.workspaceId, mongodb(), fastStoreWorkspaceId.includes(connection.workspaceId)); + if (rotorContext.redisClient) { + store = createMultiStore(store, createTtlStore(connection.workspaceId, rotorContext.redisClient)); + } + } + const chainCtx: FunctionChainContext = { + fetch: makeFetch(connection.id, rotorContext.eventsLogger, fetchTimeoutMs), + log: makeLog(connection.id, rotorContext.eventsLogger), + store, + anonymousEventsStore, + }; + const udfFuncs: FunctionConfig[] = (connectionData?.functions || []) .filter(f => f.functionId.startsWith("udf.")) .map(f => { @@ -141,11 +174,21 @@ export function buildFunctionChain(connection: EnrichedConnectionConfig, funcSto let hash: any[]; if (udfFuncs.length > 0) { hash = udfFuncs.map(f => f.codeHash); + hash.push(connection.updatedAt); cached = udfCache.get(connection.id); if (!cached || !isEqual(cached?.hash, hash)) { log.atInfo().log(`UDF for connection ${connection.id} changed (hash ${hash} != ${cached?.hash}). Reloading`); const wrapper = UDFWrapper( connection.id, + chainCtx, + { + function: { + id: "PIPELINE", + type: "udf", + debugTill: connectionData.debugTill ? new Date(connectionData.debugTill) : undefined, + }, + props: {}, + }, udfFuncs.map(f => ({ id: f.id, name: f.name, code: f.code })) ); const oldWrapper = cached?.wrapper; @@ -165,60 +208,78 @@ export function buildFunctionChain(connection: EnrichedConnectionConfig, funcSto mainFunction, ]; - const udfPipelineFunc = async (event: AnyEvent, ctx: FullContext) => { - try { - return await cached.wrapper.userFunction(event, ctx); - } catch (e: any) { - if (e?.message === "Isolate is disposed") { - log.atError().log(`UDF for con:${connection.id} VM was disposed. Reloading`); - const wrapper = UDFWrapper( - connection.id, - udfFuncs.map(f => ({ id: f.id, name: f.name, code: f.code })) - ); - udfCache.set(connection.id, { wrapper, hash }); - return await cached.wrapper.userFunction(event, ctx); - } else { - throw e; + const udfPipelineFunc = (chainCtx: FunctionChainContext, funcCtx: FunctionContext): JitsuFunctionWrapper => { + return async (event: AnyEvent, ctx: EventContext) => { + try { + return cached.wrapper.userFunction(event, ctx); + } catch (e: any) { + if (e?.message === "Isolate is disposed") { + log.atError().log(`UDF for con:${connection.id} VM was disposed. Reloading`); + const wrapper = UDFWrapper( + connection.id, + chainCtx, + funcCtx, + udfFuncs.map(f => ({ id: f.id, name: f.name, code: f.code })) + ); + udfCache.set(connection.id, { wrapper, hash }); + return cached.wrapper.userFunction(event, ctx); + } else { + throw e; + } } - } + }; }; - const funcChain: FuncChain = aggregatedFunctions.map(f => { + const funcs: Func[] = aggregatedFunctions.map(f => { + const ar = f.functionId.split("."); + const id = ar.pop(); + const type = ar.join("."); + const funcCtx: FunctionContext = { + function: { + id, + type, + debugTill: connectionData.debugTill ? new Date(connectionData.debugTill) : undefined, + }, + props: f.functionOptions || {}, + }; if (f.functionId.startsWith("builtin.")) { return { id: f.functionId as string, - config: f.functionOptions as any, - exec: requireDefined(getBuiltinFunction(f.functionId), `Unknown function ${f.functionId}`) as JitsuFunction, - enableSystemContext: true, - }; + context: funcCtx, + exec: wrapperFunction( + chainCtx, + funcCtx, + requireDefined(getBuiltinFunction(f.functionId), `Unknown function ${f.functionId}`) + ), + } as Func; } else if (f.functionId === "udf.PIPELINE") { return { id: f.functionId as string, - config: {}, - exec: udfPipelineFunc, - enableSystemContext: false, + context: funcCtx, + exec: udfPipelineFunc(chainCtx, funcCtx), }; } else { throw newError(`Function of unknown type: ${f.functionId}`); } }); - return funcChain; + + return { + functions: funcs, + context: chainCtx, + }; } export async function runChain( chain: FuncChain, event: AnyEvent, - eventsStore: EventsStore, - store: Store, eventContext: EventContext, + metricsMeta: MetricsMeta, runFuncs: FuncChainFilter = "all", - retriesEnabled: boolean = true, - systemContext?: SystemContext, - fetchTimeoutMs: number = 5000 + retriesEnabled: boolean = true ): Promise { const execLog: FunctionExecLog = []; let events = [event]; - for (const f of chain) { + for (const f of chain.functions) { switch (runFuncs) { case "udf-n-dst": if (f.id !== "udf.PIPELINE" && !f.id.startsWith("builtin.destination.")) { @@ -237,25 +298,15 @@ export async function runChain( const event = events[i]; let result: FuncReturn = undefined; const sw = stopwatch(); - const funcCtx = createFullContext( - f.id, - eventsStore, - store, - eventContext, - f.enableSystemContext && systemContext ? systemContext : {}, - f.config, - event, - fetchTimeoutMs - ); const rat = new Date(event.receivedAt) as any; const execLogMeta = { eventIndex: i, receivedAt: rat && rat != "Invalid Date" ? rat : new Date(), functionId: f.id, - metricsMeta: systemContext?.$system?.metricsMeta, + metricsMeta: metricsMeta, }; try { - result = await f.exec(event, funcCtx); + result = await f.exec(event, eventContext); const ms = sw.elapsedMs(); functionsTime.observe({ connectionId: eventContext.connection?.id ?? "", functionId: f.id }, ms); // if (ms > 100) { @@ -287,13 +338,10 @@ export async function runChain( if (r) { args.push(r); } - if (err.functionId) { - args.push({ udfId: err.functionId }); - } if (r?.retry?.left ?? 0 > 0) { - funcCtx.log.warn(`Function execution failed`, ...args); + chain.context.log.warn(f.context, `Function execution failed`, ...args); } else { - funcCtx.log.error(`Function execution failed`, ...args); + chain.context.log.error(f.context, `Function execution failed`, ...args); } if (f.id === "udf.PIPELINE") { if (err.name !== DropRetryErrorName && err.event) { diff --git a/services/rotor/src/lib/message-handler.ts b/services/rotor/src/lib/message-handler.ts index 2b09d239d..ab42a91be 100644 --- a/services/rotor/src/lib/message-handler.ts +++ b/services/rotor/src/lib/message-handler.ts @@ -1,23 +1,12 @@ -import { getLog, newError, requireDefined } from "juava"; +import { getLog, requireDefined } from "juava"; import { Metrics } from "./metrics"; import { GeoResolver } from "./maxmind"; import { IngestMessage } from "@jitsu/protocols/async-request"; import { CONNECTION_IDS_HEADER } from "./rotor"; import { EntityStore } from "./entity-store"; - import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; -import { EventContext, Store, TTLStore } from "@jitsu/protocols/functions"; -import { - createMongoStore, - mongodb, - MetricsMeta, - mongoAnonymousEventsStore, - parseUserAgent, - SystemContext, - EventsStore, - createTtlStore, - createMultiStore, -} from "@jitsu/core-functions"; +import { EventContext, TTLStore } from "@jitsu/protocols/functions"; +import { MetricsMeta, mongoAnonymousEventsStore, parseUserAgent, EventsStore } from "@jitsu/core-functions"; import NodeCache from "node-cache"; import { buildFunctionChain, checkError, FuncChain, FuncChainFilter, runChain } from "./functions-chain"; import { EnrichedConnectionConfig, FunctionConfig } from "./config-types"; @@ -25,7 +14,6 @@ import { Redis } from "ioredis"; export const log = getLog("rotor"); const anonymousEventsStore = mongoAnonymousEventsStore(); -const fastStoreWorskpaceId = (process.env.FAST_STORE_WORKSPACE_ID ?? "").split(",").filter(x => x.length > 0); //cache function chains for 1m const funcsChainTTL = 60; @@ -66,7 +54,6 @@ export async function rotorMessageHandler( } const connStore = rotorContext.connectionStore; const funcStore = rotorContext.functionsStore; - const eventStore = rotorContext.eventsLogger; const message = (typeof _message === "string" ? JSON.parse(_message) : _message) as IngestMessage; const connectionId = @@ -112,6 +99,9 @@ export async function rotorMessageHandler( id: connection.id, options: connection.options, }, + workspace: { + id: connection.workspaceId, + }, }; const metricsMeta: MetricsMeta = { @@ -122,23 +112,6 @@ export async function rotorMessageHandler( connectionId: connection.id, retries, }; - let store = rotorContext.dummyPersistentStore; - if (!store) { - store = createMongoStore(connection.workspaceId, mongodb(), fastStoreWorskpaceId.includes(connection.workspaceId)); - if (rotorContext.redisClient) { - store = createMultiStore(store, createTtlStore(connection.workspaceId, rotorContext.redisClient)); - } - } - - //system context for builtin functions only - const systemContext: SystemContext = { - $system: { - anonymousEventsStore: anonymousEventsStore, - metricsMeta, - store, - eventsStore: eventStore, - }, - }; let lastUpdated = Math.max( new Date(connection.updatedAt || 0).getTime(), @@ -147,21 +120,12 @@ export async function rotorMessageHandler( const cacheKey = `${connection.id}_${lastUpdated}`; let funcChain: FuncChain | undefined = funcsChainCache.get(cacheKey); if (!funcChain) { - funcChain = buildFunctionChain(connection, funcStore); + log.atDebug().log(`[${connection.id}] Refreshing function chain. Dt: ${lastUpdated}`); + funcChain = buildFunctionChain(connection, funcStore, rotorContext, anonymousEventsStore, fetchTimeoutMs); funcsChainCache.set(cacheKey, funcChain); } - const chainRes = await runChain( - funcChain, - event, - eventStore, - store, - ctx, - runFuncs, - retriesEnabled, - systemContext, - fetchTimeoutMs - ); + const chainRes = await runChain(funcChain, event, ctx, metricsMeta, runFuncs, retriesEnabled); chainRes.connectionId = connectionId; rotorContext.metrics?.logMetrics(chainRes.execLog); checkError(chainRes); diff --git a/types/protocols/functions.d.ts b/types/protocols/functions.d.ts index e11832ca1..4aac12de9 100644 --- a/types/protocols/functions.d.ts +++ b/types/protocols/functions.d.ts @@ -53,11 +53,7 @@ export type AnyProps = Record; export type FetchResponse = Response; -export type FetchType = ( - url: string, - opts?: FetchOpts, - extra?: { log: boolean; udfId?: string } -) => Promise; +export type FetchType = (url: string, opts?: FetchOpts, extras?: any) => Promise; export type FetchOpts = { method?: string; @@ -73,7 +69,7 @@ export type FunctionLogger = { export type FunctionContext = { log: FunctionLogger; fetch: FetchType; - store: Store; + store: TTLStore; metrics?: Metrics; }; @@ -162,6 +158,9 @@ export type EventContext = { mode?: string; options?: any; }; + workspace: { + id: string; + }; // number of retries attempted retries?: number; }; diff --git a/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx b/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx index 69543f734..ed72b522a 100644 --- a/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx +++ b/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx @@ -12,7 +12,7 @@ import { arrayToMap } from "../../lib/shared/arrays"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import { ColumnsType } from "antd/es/table"; import { UTCDate, UTCHeader } from "../DataView/EventsBrowser"; -import { examplePageEvent, exampleTrackEvents, exportIdentifyEvent } from "./example_events"; +import { examplePageEvent, exampleTrackEvents, exampleIdentifyEvent } from "./example_events"; import { rpc } from "juava"; import { logType } from "@jitsu/core-functions"; import { RetryErrorName, DropRetryErrorName } from "@jitsu/functions-lib"; @@ -761,7 +761,7 @@ const ExamplesDropdown = ({ selectEvent }: { selectEvent: (e: any) => void }) => { key: "identify", onClick: () => { - selectEvent(exportIdentifyEvent()); + selectEvent(exampleIdentifyEvent()); }, label: "Identify", }, diff --git a/webapps/console/components/FunctionsDebugger/example_events.ts b/webapps/console/components/FunctionsDebugger/example_events.ts index 9dfc3b1f8..b2dd6da73 100644 --- a/webapps/console/components/FunctionsDebugger/example_events.ts +++ b/webapps/console/components/FunctionsDebugger/example_events.ts @@ -24,6 +24,7 @@ export const examplePageEvent = () => { name: "jitsu-js", version: "1.0.0", }, + ip: "127.0.0.1", userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/111.0", locale: "en-US", screen: { @@ -44,7 +45,7 @@ export const examplePageEvent = () => { search: "", title: "Example page event", url: "https://example.com/", - enconding: "UTF-8", + encoding: "UTF-8", }, campaign: { name: "example", @@ -56,7 +57,7 @@ export const examplePageEvent = () => { }; }; -export const exportIdentifyEvent = () => { +export const exampleIdentifyEvent = () => { return { type: "identify", userId: "user@example.com", @@ -73,6 +74,7 @@ export const exportIdentifyEvent = () => { name: "jitsu-js", version: "1.0.0", }, + ip: "127.0.0.1", userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/113.0", locale: "en-US", screen: { @@ -90,7 +92,7 @@ export const exportIdentifyEvent = () => { search: "", title: "Example page event", url: "https://example.com/", - enconding: "UTF-8", + encoding: "UTF-8", }, campaign: { name: "example", @@ -120,6 +122,7 @@ export const exampleTrackEvents = () => { name: "jitsu-js", version: "1.0.0", }, + ip: "127.0.0.1", userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/111.0", locale: "en-US", screen: { @@ -140,7 +143,7 @@ export const exampleTrackEvents = () => { search: "", title: "Example page event", url: "https://example.com/", - enconding: "UTF-8", + encoding: "UTF-8", }, campaign: { name: "example", diff --git a/webapps/console/components/TrackingIntegrationDocumentation/HTTPApi.tsx b/webapps/console/components/TrackingIntegrationDocumentation/HTTPApi.tsx index 1946f17ec..ebdba9956 100644 --- a/webapps/console/components/TrackingIntegrationDocumentation/HTTPApi.tsx +++ b/webapps/console/components/TrackingIntegrationDocumentation/HTTPApi.tsx @@ -88,7 +88,7 @@ export const HTTPManual: React.FC<{ domain: string; writeKey?: string }> = ({ do "search": "", "title": "Example page event", "url": "https://example.com/", - "enconding": "UTF-8" + "encoding": "UTF-8" }, "campaign": { "name": "example", diff --git a/webapps/console/pages/api/admin/export/[name]/index.ts b/webapps/console/pages/api/admin/export/[name]/index.ts index 6ff93409f..8ee8bbff5 100644 --- a/webapps/console/pages/api/admin/export/[name]/index.ts +++ b/webapps/console/pages/api/admin/export/[name]/index.ts @@ -160,8 +160,10 @@ const exports: Export[] = [ destinationId: to.id, usesBulker: !!coreDestinationType?.usesBulker, options: data, + optionsHash: hash(data), updatedAt: dateMax(updatedAt, to.updatedAt), credentials: omit(to.config, "destinationType", "type", "name"), + credentialsHash: hash(omit(to.config, "destinationType", "type", "name")), }) ); needComma = true; From f1cd83e697d600abf1f3261935145c918e79e926 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 9 Apr 2024 14:52:34 +0400 Subject: [PATCH 0689/1353] rotor: functions logger bring back old name --- libs/core-functions/src/functions/lib/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/core-functions/src/functions/lib/index.ts b/libs/core-functions/src/functions/lib/index.ts index 6ea3adef9..3cf1b329f 100644 --- a/libs/core-functions/src/functions/lib/index.ts +++ b/libs/core-functions/src/functions/lib/index.ts @@ -21,7 +21,7 @@ import { } from "@jitsu/protocols/functions"; import { getErrorMessage, getLog, LogLevel, newError, stopwatch } from "juava"; -const log = getLog("functions"); +const log = getLog("functions-context"); /** * Store for incoming events, destination results and function log messages From 5df8843e6f04ea1b34485074a07a461d5eea798c Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 9 Apr 2024 17:43:01 +0400 Subject: [PATCH 0690/1353] rotor: bulker-destination optimize idToSnakeCase --- libs/core-functions/__tests__/strings.test.ts | 48 +++++++++++++++++++ .../src/functions/bulker-destination.ts | 9 ++-- .../src/functions/lib/strings.ts | 28 +++++++++++ 3 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 libs/core-functions/__tests__/strings.test.ts create mode 100644 libs/core-functions/src/functions/lib/strings.ts diff --git a/libs/core-functions/__tests__/strings.test.ts b/libs/core-functions/__tests__/strings.test.ts new file mode 100644 index 000000000..e60c42fe4 --- /dev/null +++ b/libs/core-functions/__tests__/strings.test.ts @@ -0,0 +1,48 @@ +import { idToSnakeCaseFast, idToSnakeCaseRegex } from "../src/functions/lib/strings"; + +const data: Record = { + // must be not touched + plain: "plain", + plain_: "plain_", + _plain: "_plain", + _plain_string: "_plain_string", + _plain__string: "_plain__string", + + // simple + camelCase: "camel_case", + camelCaseA: "camel_case_a", + + // node adding '_' before first + CamelCase: "camel_case", + CCamelCase: "c_camel_case", + + // abbreviations. not fixed yet + camelUSCase: "camel_u_s_case", + camelCaseEU: "camel_case_e_u", + + // not adding extra '_' if already exists + _CamelCase: "_camel_case", + __CamelCase: "__camel_case", + Camel_Case: "camel_case", + Camel__Case: "camel__case", + + // but not collapsing existing ones + _camelCase: "_camel_case", + camelCase_: "camel_case_", + camelCase__: "camel_case__", + __camelCase: "__camel_case", +}; + +test("test idToSnakeCaseFast", async () => { + for (const [value, expected] of Object.entries(data)) { + const res = idToSnakeCaseFast(value); + expect(res).toEqual(expected); + } +}); + +test("test idToSnakeCaseRegex", async () => { + for (const [value, expected] of Object.entries(data)) { + const res = idToSnakeCaseRegex(value); + expect(res).toEqual(expected); + } +}); diff --git a/libs/core-functions/src/functions/bulker-destination.ts b/libs/core-functions/src/functions/bulker-destination.ts index 4c2ed142c..a4d91acc3 100644 --- a/libs/core-functions/src/functions/bulker-destination.ts +++ b/libs/core-functions/src/functions/bulker-destination.ts @@ -4,6 +4,7 @@ import { AnalyticsServerEvent, DataLayoutType } from "@jitsu/protocols/analytics import omit from "lodash/omit"; import { MetricsMeta } from "./lib"; +import { idToSnakeCaseFast } from "./lib/strings"; const TableNameParameter = "JITSU_TABLE_NAME"; export type MappedEvent = { @@ -22,17 +23,13 @@ function anonymizeIp(ip: string | undefined) { } } -function idToSnakeCase(id: string) { - return id.replace(/((?<=[a-zA-Z0-9])[A-Z])/g, "_$1").toLowerCase(); -} - function toSnakeCase(param: any): any { if (Array.isArray(param)) { return param.map(toSnakeCase); } else if (typeof param === "object" && param !== null) { const r = {}; for (const [key, value] of Object.entries(param)) { - r[idToSnakeCase(key)] = toSnakeCase(value); + r[idToSnakeCaseFast(key)] = toSnakeCase(value); } return r; } else { @@ -240,7 +237,7 @@ function transferAsSnakeCase(target: Record, source: any, omit?: st } for (const [k, v] of Object.entries(source)) { if (!omit || !omit.includes(k)) { - target[idToSnakeCase(k)] = toSnakeCase(v); + target[idToSnakeCaseFast(k)] = toSnakeCase(v); } } } diff --git a/libs/core-functions/src/functions/lib/strings.ts b/libs/core-functions/src/functions/lib/strings.ts new file mode 100644 index 000000000..886948110 --- /dev/null +++ b/libs/core-functions/src/functions/lib/strings.ts @@ -0,0 +1,28 @@ +export function idToSnakeCaseRegex(id: string) { + return id.replace(/((?<=[a-zA-Z0-9])[A-Z])/g, "_$1").toLowerCase(); +} + +const aCode = "A".charCodeAt(0); +const zCode = "Z".charCodeAt(0); +const _Code = "_".charCodeAt(0); + +export function idToSnakeCaseFast(id: string) { + let res = id[0].toLowerCase(); + let upperIndex = 0; + let i = 1; + let needUnderscore = id.charCodeAt(0) != _Code; + for (; i < id.length; i++) { + const c = id.charCodeAt(i); + if (c >= aCode && c <= zCode) { + res += id.substring(upperIndex + 1, i) + (needUnderscore ? "_" : "") + id.charAt(i).toLowerCase(); + upperIndex = i; + } + needUnderscore = c != _Code; + } + if (upperIndex == 0) { + return id; + } else if (upperIndex < i) { + res += id.substring(upperIndex + 1, id.length); + } + return res; +} From 6ba6af54296c1312135b5338fafc3679ab41fc38 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 9 Apr 2024 21:59:41 +0400 Subject: [PATCH 0691/1353] rotor: fix for idToSnakeCaseFast --- libs/core-functions/__tests__/strings.test.ts | 3 +++ libs/core-functions/src/functions/lib/strings.ts | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/libs/core-functions/__tests__/strings.test.ts b/libs/core-functions/__tests__/strings.test.ts index e60c42fe4..1c5e843a1 100644 --- a/libs/core-functions/__tests__/strings.test.ts +++ b/libs/core-functions/__tests__/strings.test.ts @@ -11,9 +11,12 @@ const data: Record = { // simple camelCase: "camel_case", camelCaseA: "camel_case_a", + cCase: "c_case", // node adding '_' before first + Camel: "camel", CamelCase: "camel_case", + CCamel: "c_camel", CCamelCase: "c_camel_case", // abbreviations. not fixed yet diff --git a/libs/core-functions/src/functions/lib/strings.ts b/libs/core-functions/src/functions/lib/strings.ts index 886948110..e82947010 100644 --- a/libs/core-functions/src/functions/lib/strings.ts +++ b/libs/core-functions/src/functions/lib/strings.ts @@ -10,7 +10,8 @@ export function idToSnakeCaseFast(id: string) { let res = id[0].toLowerCase(); let upperIndex = 0; let i = 1; - let needUnderscore = id.charCodeAt(0) != _Code; + const firstChar = id.charCodeAt(0); + let needUnderscore = firstChar != _Code; for (; i < id.length; i++) { const c = id.charCodeAt(i); if (c >= aCode && c <= zCode) { @@ -19,7 +20,7 @@ export function idToSnakeCaseFast(id: string) { } needUnderscore = c != _Code; } - if (upperIndex == 0) { + if (upperIndex == 0 && !(firstChar >= aCode && firstChar <= zCode)) { return id; } else if (upperIndex < i) { res += id.substring(upperIndex + 1, id.length); From 9f02480679714efe4d65d86c908fe33b4775c9e8 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Tue, 9 Apr 2024 17:25:44 -0400 Subject: [PATCH 0692/1353] fix: intercom last seen property --- .../src/functions/intercom-destination.ts | 52 +++++++++++++------ libs/core-functions/src/meta.ts | 6 +++ 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/libs/core-functions/src/functions/intercom-destination.ts b/libs/core-functions/src/functions/intercom-destination.ts index ff820dab8..d60a185ad 100644 --- a/libs/core-functions/src/functions/intercom-destination.ts +++ b/libs/core-functions/src/functions/intercom-destination.ts @@ -56,22 +56,21 @@ async function getContactByOurUserId( async function getCompanyByGroupId( groupId: string, - { jsonFetch, props }: ExtendedCtx + { jsonFetch, props, fetch }: ExtendedCtx ): Promise { - try { - return await jsonFetch(`https://api.intercom.io/companies?company_id=${groupId}`, { - headers: { - Authorization: `Bearer ${props.accessToken}`, - Accept: "application/json", - "Content-Type": "application/json", - }, - }); - } catch (e: any) { - if (e.responseStatus === 404) { - return undefined; - } else { - throw e; - } + const response = await fetch(`https://api.intercom.io/companies?company_id=${groupId}`, { + headers: { + Authorization: `Bearer ${props.accessToken}`, + Accept: "application/json", + "Content-Type": "application/json", + }, + }); + if (response.status === 404) { + return undefined; + } else if (response.ok) { + return await response.json(); + } else { + throw new Error(`Intercom: failed to get company by groupId=${groupId}, status ${response.status} ${response.statusText}`); } } @@ -206,6 +205,7 @@ async function createOrUpdateContact(event: AnalyticsServerEvent, ctx: ExtendedC role: "user", external_id: event.userId || undefined, email, + last_seen_at: toDate(event.timestamp).toISOString(), name: event.traits?.name || (event.traits?.firstName && event.traits?.lastName @@ -223,6 +223,7 @@ async function createOrUpdateContact(event: AnalyticsServerEvent, ctx: ExtendedC )}` ); const createContactResponse = await fetch(`https://api.intercom.io/contacts`, { + method: "POST", headers: { Authorization: `Bearer ${props.accessToken}`, Accept: "application/json", @@ -254,7 +255,10 @@ async function createOrUpdateContact(event: AnalyticsServerEvent, ctx: ExtendedC throw new RetryError(errorMessage, { drop: false }); } } - return (await createContactResponse.json()).id; + const newContact = await createContactResponse.json(); + const newContactId = newContact.id; + log.debug(`Contact with email=${email} and userId=${event.userId} created, id=${newContactId}: ${JSON.stringify(newContact, null, 2)}`); + return newContactId; } else { const contact = existingContact; const forComparison = { @@ -365,6 +369,22 @@ const IntercomDestination: JitsuFunctiona detailed guide" ), + updateLastSeenOnEveryEvent: z + .boolean() + .optional() + .describe( + "By default, the last seen property will be updated only on .identify() calls. If enabled, the property will be updated on every event. However, enabling this option may lead to higher API usage." + ), }); export type IntercomDestinationCredentials = z.infer; From f206247243a24193bcfb05c5fcf8b19a05200e83 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Tue, 9 Apr 2024 17:25:44 -0400 Subject: [PATCH 0693/1353] fix compillation error --- .../src/functions/intercom-destination.ts | 52 +++++++++++++------ libs/core-functions/src/meta.ts | 6 +++ 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/libs/core-functions/src/functions/intercom-destination.ts b/libs/core-functions/src/functions/intercom-destination.ts index ff820dab8..62567680c 100644 --- a/libs/core-functions/src/functions/intercom-destination.ts +++ b/libs/core-functions/src/functions/intercom-destination.ts @@ -56,22 +56,21 @@ async function getContactByOurUserId( async function getCompanyByGroupId( groupId: string, - { jsonFetch, props }: ExtendedCtx + { jsonFetch, props, fetch }: ExtendedCtx ): Promise { - try { - return await jsonFetch(`https://api.intercom.io/companies?company_id=${groupId}`, { - headers: { - Authorization: `Bearer ${props.accessToken}`, - Accept: "application/json", - "Content-Type": "application/json", - }, - }); - } catch (e: any) { - if (e.responseStatus === 404) { - return undefined; - } else { - throw e; - } + const response = await fetch(`https://api.intercom.io/companies?company_id=${groupId}`, { + headers: { + Authorization: `Bearer ${props.accessToken}`, + Accept: "application/json", + "Content-Type": "application/json", + }, + }); + if (response.status === 404) { + return undefined; + } else if (response.ok) { + return await response.json(); + } else { + throw new Error(`Intercom: failed to get company by groupId=${groupId}, status ${response.status} ${response.statusText}`); } } @@ -206,6 +205,7 @@ async function createOrUpdateContact(event: AnalyticsServerEvent, ctx: ExtendedC role: "user", external_id: event.userId || undefined, email, + last_seen_at: toDate(event.timestamp).toISOString(), name: event.traits?.name || (event.traits?.firstName && event.traits?.lastName @@ -223,6 +223,7 @@ async function createOrUpdateContact(event: AnalyticsServerEvent, ctx: ExtendedC )}` ); const createContactResponse = await fetch(`https://api.intercom.io/contacts`, { + method: "POST", headers: { Authorization: `Bearer ${props.accessToken}`, Accept: "application/json", @@ -254,7 +255,10 @@ async function createOrUpdateContact(event: AnalyticsServerEvent, ctx: ExtendedC throw new RetryError(errorMessage, { drop: false }); } } - return (await createContactResponse.json()).id; + const newContact = await createContactResponse.json(); + const newContactId = newContact.id; + log.debug(`Contact with email=${email} and userId=${event.userId} created, id=${newContactId}: ${JSON.stringify(newContact, null, 2)}`); + return newContactId; } else { const contact = existingContact; const forComparison = { @@ -365,6 +369,22 @@ const IntercomDestination: JitsuFunctiona detailed guide" ), + updateLastSeenOnEveryEvent: z + .boolean() + .optional() + .describe( + "By default, the last seen property will be updated only on .identify() calls. If enabled, the property will be updated on every event. However, enabling this option may lead to higher API usage." + ), }); export type IntercomDestinationCredentials = z.infer; From 2b8c79e45331fa58c7ce7e45b34f67fb7413d382 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Tue, 9 Apr 2024 17:46:27 -0400 Subject: [PATCH 0694/1353] fix: prettier --- .../src/functions/intercom-destination.ts | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/libs/core-functions/src/functions/intercom-destination.ts b/libs/core-functions/src/functions/intercom-destination.ts index 62567680c..645cb02fb 100644 --- a/libs/core-functions/src/functions/intercom-destination.ts +++ b/libs/core-functions/src/functions/intercom-destination.ts @@ -70,7 +70,9 @@ async function getCompanyByGroupId( } else if (response.ok) { return await response.json(); } else { - throw new Error(`Intercom: failed to get company by groupId=${groupId}, status ${response.status} ${response.statusText}`); + throw new Error( + `Intercom: failed to get company by groupId=${groupId}, status ${response.status} ${response.statusText}` + ); } } @@ -257,7 +259,13 @@ async function createOrUpdateContact(event: AnalyticsServerEvent, ctx: ExtendedC } const newContact = await createContactResponse.json(); const newContactId = newContact.id; - log.debug(`Contact with email=${email} and userId=${event.userId} created, id=${newContactId}: ${JSON.stringify(newContact, null, 2)}`); + log.debug( + `Contact with email=${email} and userId=${event.userId} created, id=${newContactId}: ${JSON.stringify( + newContact, + null, + 2 + )}` + ); return newContactId; } else { const contact = existingContact; @@ -370,7 +378,10 @@ const IntercomDestination: JitsuFunction Date: Wed, 10 Apr 2024 14:59:09 +0400 Subject: [PATCH 0695/1353] rotor: fix for memory leak --- .../core-functions/src/functions/lib/store.ts | 28 +++++++++++++++---- .../src/functions/lib/udf-wrapper-code.ts | 4 +-- .../src/functions/lib/udf-wrapper-code.txtjs | 4 +-- services/rotor/src/http/udf.ts | 2 +- services/rotor/src/lib/functions-chain.ts | 7 ++++- 5 files changed, 33 insertions(+), 12 deletions(-) diff --git a/libs/core-functions/src/functions/lib/store.ts b/libs/core-functions/src/functions/lib/store.ts index a27688578..30e983945 100644 --- a/libs/core-functions/src/functions/lib/store.ts +++ b/libs/core-functions/src/functions/lib/store.ts @@ -64,13 +64,25 @@ interface StoreValue { const MongoCreatedCollections: Record> = {}; -export const createMongoStore = (namespace: string, mongo: MongoClient, fast: boolean): TTLStore => { +export const createMongoStore = ( + namespace: string, + mongo: MongoClient, + useLocalCache: boolean, + fast: boolean +): TTLStore => { const localCache: Record = {}; const readOptions = fast ? { readPreference: ReadPreference.NEAREST } : {}; const writeOptions = fast ? { writeConcern: { w: 1, journal: false } } : {}; const dbName = `persistent_store`; + function getFromLocalCache(key: string): StoreValue | undefined { + if (!useLocalCache) { + return undefined; + } + return localCache[key]; + } + async function ensureCollection(): Promise> { let collection = MongoCreatedCollections[namespace]; if (collection) { @@ -103,7 +115,7 @@ export const createMongoStore = (namespace: string, mongo: MongoClient, fast: bo return { get: async (key: string) => { const res = - localCache[key] || + getFromLocalCache(key) || (await ensureCollection() .then(c => c.findOne({ _id: key }, readOptions)) .catch(e => { @@ -113,7 +125,7 @@ export const createMongoStore = (namespace: string, mongo: MongoClient, fast: bo }, getWithTTL: async (key: string) => { const res = - localCache[key] || + getFromLocalCache(key) || (await ensureCollection() .then(c => c.findOne({ _id: key }, readOptions)) .catch(e => { @@ -142,7 +154,9 @@ export const createMongoStore = (namespace: string, mongo: MongoClient, fast: bo }) ) .then(() => { - localCache[key] = colObj; + if (useLocalCache) { + localCache[key] = colObj; + } }) .catch(e => { log.atError().withCause(e).log(`Error setting key ${key} from mongo store ${namespace}`); @@ -152,7 +166,9 @@ export const createMongoStore = (namespace: string, mongo: MongoClient, fast: bo await ensureCollection() .then(c => c.deleteOne({ _id: key }, writeOptions)) .then(() => { - delete localCache[key]; + if (useLocalCache) { + delete localCache[key]; + } }) .catch(e => { log.atError().withCause(e).log(`Error deleting key ${key} from mongo store ${namespace}`); @@ -160,7 +176,7 @@ export const createMongoStore = (namespace: string, mongo: MongoClient, fast: bo }, ttl: async (key: string) => { const res = - localCache[key] || + getFromLocalCache(key) || (await ensureCollection() .then(c => c.findOne({ _id: key }, readOptions)) .catch(e => { diff --git a/libs/core-functions/src/functions/lib/udf-wrapper-code.ts b/libs/core-functions/src/functions/lib/udf-wrapper-code.ts index 54c423731..82bafe0fe 100644 --- a/libs/core-functions/src/functions/lib/udf-wrapper-code.ts +++ b/libs/core-functions/src/functions/lib/udf-wrapper-code.ts @@ -167,13 +167,13 @@ const wrappedUserFunction = (id, f, funcCtx) => { set: async (key, value, opts) => { await _jitsu_store.set.apply(undefined, [key, value, opts], { arguments: {copy: true}, - result: {ignore: true} + result: {promise: true} }); }, del: async key => { await _jitsu_store.del.apply(undefined, [key], { arguments: {copy: true}, - result: {ignore: true} + result: {promise: true} }); }, get: async key => { diff --git a/libs/core-functions/src/functions/lib/udf-wrapper-code.txtjs b/libs/core-functions/src/functions/lib/udf-wrapper-code.txtjs index cece04219..986ee8dce 100644 --- a/libs/core-functions/src/functions/lib/udf-wrapper-code.txtjs +++ b/libs/core-functions/src/functions/lib/udf-wrapper-code.txtjs @@ -154,13 +154,13 @@ const wrappedUserFunction = (id, f, funcCtx) => { set: async (key, value, opts) => { await _jitsu_store.set.apply(undefined, [key, value, opts], { arguments: {copy: true}, - result: {ignore: true} + result: {promise: true} }); }, del: async key => { await _jitsu_store.del.apply(undefined, [key], { arguments: {copy: true}, - result: {ignore: true} + result: {promise: true} }); }, get: async key => { diff --git a/services/rotor/src/http/udf.ts b/services/rotor/src/http/udf.ts index 8041967a1..916e4d73c 100644 --- a/services/rotor/src/http/udf.ts +++ b/services/rotor/src/http/udf.ts @@ -13,7 +13,7 @@ const log = getLog("udf_run"); export const UDFRunHandler = async (req, res) => { const body = req.body as UDFTestRequest; log.atInfo().log(`Running function: ${body?.functionId} workspace: ${body?.workspaceId}`, JSON.stringify(body)); - body.store = createMongoStore(body?.workspaceId, mongodb(), false); + body.store = createMongoStore(body?.workspaceId, mongodb(), true, false); const result = await UDFTestRun(body); if (result.error) { log diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index 05089913f..a19cf1d8f 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -142,7 +142,12 @@ export function buildFunctionChain( } let store = rotorContext.dummyPersistentStore; if (!store) { - store = createMongoStore(connection.workspaceId, mongodb(), fastStoreWorkspaceId.includes(connection.workspaceId)); + store = createMongoStore( + connection.workspaceId, + mongodb(), + false, + fastStoreWorkspaceId.includes(connection.workspaceId) + ); if (rotorContext.redisClient) { store = createMultiStore(store, createTtlStore(connection.workspaceId, rotorContext.redisClient)); } From f6977d115e292e1688aae1675d35abde92879f07 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 11 Apr 2024 15:42:16 +0400 Subject: [PATCH 0696/1353] rotor: small optimization --- .../src/functions/bulker-destination.ts | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/libs/core-functions/src/functions/bulker-destination.ts b/libs/core-functions/src/functions/bulker-destination.ts index a4d91acc3..780960ddd 100644 --- a/libs/core-functions/src/functions/bulker-destination.ts +++ b/libs/core-functions/src/functions/bulker-destination.ts @@ -291,20 +291,16 @@ const BulkerDestination: JitsuFunction Date: Fri, 12 Apr 2024 11:47:55 +0400 Subject: [PATCH 0697/1353] rotor: reduce unnecessary logging --- services/rotor/src/lib/clickhouse-logger.ts | 6 +++--- services/rotor/src/lib/metrics.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/services/rotor/src/lib/clickhouse-logger.ts b/services/rotor/src/lib/clickhouse-logger.ts index 3f1177fb3..11baa7384 100644 --- a/services/rotor/src/lib/clickhouse-logger.ts +++ b/services/rotor/src/lib/clickhouse-logger.ts @@ -33,8 +33,8 @@ export function createClickhouseLogger(): EventsStore { clickhouse_settings: { async_insert: 1, wait_for_async_insert: 0, - async_insert_max_data_size: "5000000", - async_insert_busy_timeout_ms: 5000, + async_insert_max_data_size: "10000000", + async_insert_busy_timeout_ms: 10000, date_time_input_format: "best_effort", }, }); @@ -51,7 +51,7 @@ export function createClickhouseLogger(): EventsStore { values: copy, }); if (res.executed) { - log.atInfo().log(`Inserted ${copy.length} records.`); + log.atDebug().log(`Inserted ${copy.length} records.`); } else { log.atError().log(`Failed to insert ${copy.length} records: ${JSON.stringify(res)}`); } diff --git a/services/rotor/src/lib/metrics.ts b/services/rotor/src/lib/metrics.ts index 201aaed87..993c565ab 100644 --- a/services/rotor/src/lib/metrics.ts +++ b/services/rotor/src/lib/metrics.ts @@ -130,7 +130,7 @@ export function createMetrics(producer?: Producer): Metrics { const copy = [...buffer]; await flush(copy); buffer.length = 0; - log.atInfo().log(`Periodic flushing ${copy.length} metrics events took ${sw.elapsedPretty()}`); + log.atDebug().log(`Periodic flushing ${copy.length} metrics events took ${sw.elapsedPretty()}`); } catch (e) { log.atError().withCause(e).log(`Failed to flush metrics`); } From 817c935d74e8ae167c39f9eada7a99ba48807f14 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 15 Apr 2024 11:27:06 +0400 Subject: [PATCH 0698/1353] rotor: reduce kafka sessionTimeout to 30s --- services/rotor/src/lib/metrics.ts | 2 +- services/rotor/src/lib/rotor.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/services/rotor/src/lib/metrics.ts b/services/rotor/src/lib/metrics.ts index 993c565ab..11a448b8d 100644 --- a/services/rotor/src/lib/metrics.ts +++ b/services/rotor/src/lib/metrics.ts @@ -186,7 +186,7 @@ export function createMetrics(producer?: Producer): Metrics { const copy = [...buffer]; setImmediate(async () => flush(copy) - .then(() => log.atInfo().log(`Flushed ${copy.length} metrics events. Took: ${sw.elapsedPretty()}`)) + .then(() => log.atDebug().log(`Flushed ${copy.length} metrics events. Took: ${sw.elapsedPretty()}`)) .catch(e => { log.atError().withCause(e).log(`Failed to flush metrics`); }) diff --git a/services/rotor/src/lib/rotor.ts b/services/rotor/src/lib/rotor.ts index a7bc06868..3cdfdbaa6 100644 --- a/services/rotor/src/lib/rotor.ts +++ b/services/rotor/src/lib/rotor.ts @@ -60,7 +60,7 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { consumer = kafka.consumer({ groupId: consumerGroupId, allowAutoTopicCreation: false, - sessionTimeout: 120000, + sessionTimeout: 30000, }); await consumer.connect(); log.atInfo().log("Subscribing to kafka topics: ", kafkaTopics); From cd0057a4987ea997351603c2866035f39c4e5828 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 15 Apr 2024 14:34:59 +0400 Subject: [PATCH 0699/1353] rotor: reduce kafka sessionTimeout to 10s --- services/rotor/src/lib/rotor.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/rotor/src/lib/rotor.ts b/services/rotor/src/lib/rotor.ts index 3cdfdbaa6..6c1e9419b 100644 --- a/services/rotor/src/lib/rotor.ts +++ b/services/rotor/src/lib/rotor.ts @@ -60,7 +60,7 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { consumer = kafka.consumer({ groupId: consumerGroupId, allowAutoTopicCreation: false, - sessionTimeout: 30000, + sessionTimeout: 10000, }); await consumer.connect(); log.atInfo().log("Subscribing to kafka topics: ", kafkaTopics); From ebba5c4dea3593fa821bc84a69a158dcf43f268e Mon Sep 17 00:00:00 2001 From: jbmolle Date: Mon, 15 Apr 2024 20:04:32 +0200 Subject: [PATCH 0700/1353] fix: setAnonymousId not working #1098 Co-authored-by: Jean-Baptiste --- libs/jitsu-js/src/index.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/libs/jitsu-js/src/index.ts b/libs/jitsu-js/src/index.ts index 4d1ab9521..8305e3276 100644 --- a/libs/jitsu-js/src/index.ts +++ b/libs/jitsu-js/src/index.ts @@ -16,7 +16,7 @@ export default function parse(input) { if (parseFloat(value) === value) { value = parseFloat(value); } - } catch (e) {} + } catch (e) { } if (value === null || value === "") { return; } @@ -24,7 +24,7 @@ export default function parse(input) { } export const emptyAnalytics: AnalyticsInterface = { - setAnonymousId: () => {}, + setAnonymousId: () => { }, track: () => Promise.resolve(), page: () => Promise.resolve(), user: () => ({}), @@ -123,15 +123,15 @@ function createUnderlyingAnalyticsInstance( setAnonymousId: (id: string) => { if (opts.debug) { console.log("[JITSU DEBUG] Setting anonymous id to " + id); - //Workaround for analytics.js bug. Underlying setAnonymousId doesn't work set the id immediately, - //so we got to it manually here. See https://github.com/jitsucom/jitsu/issues/1060 - storage.setItem("__anon_id", id); - const userState = analytics.user(); - if (userState) { - userState.anonymousId = id; - } - (analytics as any).setAnonymousId(id); } + //Workaround for analytics.js bug. Underlying setAnonymousId doesn't work set the id immediately, + //so we got to it manually here. See https://github.com/jitsucom/jitsu/issues/1060 + storage.setItem("__anon_id", id); + const userState = analytics.user(); + if (userState) { + userState.anonymousId = id; + } + (analytics as any).setAnonymousId(id); }, async group( groupId?: ID, From c86e511ffde7ae262893f92f679c402cf2ae323d Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 16 Apr 2024 15:00:19 +0400 Subject: [PATCH 0701/1353] rotor & console: support for MixPanel batch mode (#1100) * rotor & console: support for MixPanel batch mode --- .../core-functions/src/functions/lib/index.ts | 2 + .../src/functions/mixpanel-destination.ts | 236 +++++++++++------- libs/jitsu-js/src/index.ts | 4 +- services/rotor/src/lib/functions-chain.ts | 10 +- services/rotor/src/lib/rotor.ts | 4 +- .../ConnectionEditorPage.tsx | 6 +- .../console/components/DataView/DataView.tsx | 2 +- .../components/DataView/EventsBrowser.tsx | 15 +- webapps/console/lib/schema/destinations.tsx | 6 +- .../pages/api/admin/export/[name]/index.ts | 2 +- 10 files changed, 174 insertions(+), 113 deletions(-) diff --git a/libs/core-functions/src/functions/lib/index.ts b/libs/core-functions/src/functions/lib/index.ts index 3cf1b329f..56a9bec3b 100644 --- a/libs/core-functions/src/functions/lib/index.ts +++ b/libs/core-functions/src/functions/lib/index.ts @@ -84,6 +84,7 @@ export type FunctionChainContext = { store: TTLStore; anonymousEventsStore?: AnonymousEventsStore; metrics?: Metrics; + connectionOptions?: any; }; export function wrapperFunction( @@ -112,6 +113,7 @@ export function wrapperFunction; + eventType: string; + insertId?: string; + skipLogs?: boolean; }; // Map and extracts campaign parameters from context.campaign into object with utm properties @@ -114,7 +120,7 @@ function trackEvent( distinctId: string, eventType: string, event: AnalyticsServerEvent -): HttpRequest { +): MixpanelRequest { const opts = ctx.props as MixpanelCredentials; const analyticsContext = event.context || {}; const traits = { ...(event.traits || analyticsContext.traits || {}) }; @@ -144,73 +150,96 @@ function trackEvent( const device = analyticsContext.device || ({} as any); const ua = ctx.ua || ({} as any); const uaDevice = ua.device || ({} as any); - return { - url: `https://api.mixpanel.com/import?strict=1&project_id=${opts.projectId}`, - headers: { - "Content-type": "application/json", - "Content-Encoding": "gzip", - Accept: "application/json", - Authorization: `Basic ${getAuth(opts)}`, + const insertId = randomUUID(); + const eventPayload = { + event: eventType, + properties: { + ip: analyticsContext.ip, + time: eventTimeSafeMs(event), + $device_id: deviceId, + distinct_id: distinctId, + $insert_id: insertId, + $user_id: event.userId ? `${event.userId}` : undefined, + $browser: ua.browser?.name, + $browser_version: ua.browser?.version, + $os: analyticsContext.os?.name || ua.os?.name, + $os_version: analyticsContext.os?.version || ua.os?.version, + $current_url: pageUrl, + ...clickParams(pageUrl), + current_page_title: evict(customProperties, "title"), + $referrer: evict(customProperties, "referrer"), + $referring_domain: evict(customProperties, "referring_domain"), + $session_id: analyticsContext.sessionId, + + ...geoParams(analyticsContext.geo), + + //mobile + $app_namespace: app.namespace, + $app_name: app.name, + $app_build_number: app.build, + $app_release: app.build, + $app_version: app.version, + $app_version_string: app.version, + + $carrier: network.carrier, + $has_telephone: network.cellular, + $bluetooth_enabled: network.bluetooth, + $wifi: network.wifi, + + $screen_dpi: screen.density, + $screen_height: screen.height, + $screen_width: screen.width, + + // $bluetooth_version: "ble", + // $brand: "google", + // $had_persisted_distinct_id: false, + // $has_nfc: false, + $device_type: device.type || uaDevice.type, + $device_name: device.name || uaDevice.model, + $manufacturer: device.manufacturer || uaDevice.vendor, + $model: device.model || uaDevice.model, + advertising_id: device.advertisingId, + ad_tracking_enabled: device.adTrackingEnabled, + + ...customProperties, }, - payload: [ - { - event: eventType, - properties: { - ip: analyticsContext.ip, - time: eventTimeSafeMs(event), - $device_id: deviceId, - distinct_id: distinctId, - $insert_id: randomUUID(), - $user_id: event.userId ? `${event.userId}` : undefined, - $browser: ua.browser?.name, - $browser_version: ua.browser?.version, - $os: analyticsContext.os?.name || ua.os?.name, - $os_version: analyticsContext.os?.version || ua.os?.version, - $current_url: pageUrl, - ...clickParams(pageUrl), - current_page_title: evict(customProperties, "title"), - $referrer: evict(customProperties, "referrer"), - $referring_domain: evict(customProperties, "referring_domain"), - $session_id: analyticsContext.sessionId, - - ...geoParams(analyticsContext.geo), - - //mobile - $app_namespace: app.namespace, - $app_name: app.name, - $app_build_number: app.build, - $app_release: app.build, - $app_version: app.version, - $app_version_string: app.version, - - $carrier: network.carrier, - $has_telephone: network.cellular, - $bluetooth_enabled: network.bluetooth, - $wifi: network.wifi, - - $screen_dpi: screen.density, - $screen_height: screen.height, - $screen_width: screen.width, - - // $bluetooth_version: "ble", - // $brand: "google", - // $had_persisted_distinct_id: false, - // $has_nfc: false, - $device_type: device.type || uaDevice.type, - $device_name: device.name || uaDevice.model, - $manufacturer: device.manufacturer || uaDevice.vendor, - $model: device.model || uaDevice.model, - advertising_id: device.advertisingId, - ad_tracking_enabled: device.adTrackingEnabled, - - ...customProperties, - }, - }, - ], }; + if (ctx["connectionOptions"]?.mode === "batch" && bulkerBase) { + const metricsMeta: Omit = { + workspaceId: ctx.workspace.id, + streamId: ctx.source.id, + destinationId: ctx.destination.id, + connectionId: ctx.connection.id, + functionId: "builtin.destination.bulker", + }; + return { + url: `${bulkerBase}/post/${ctx.connection.id}?tableName=import`, + eventType, + insertId, + headers: { + ...(bulkerAuthKey ? { Authorization: `Bearer ${bulkerAuthKey}` } : {}), + metricsMeta: JSON.stringify(metricsMeta), + }, + payload: eventPayload, + skipLogs: true, + }; + } else { + return { + url: `https://api.mixpanel.com/import?strict=1&project_id=${opts.projectId}`, + eventType, + insertId, + headers: { + "Content-type": "application/json", + "Content-Encoding": "gzip", + Accept: "application/json", + Authorization: `Basic ${getAuth(opts)}`, + }, + payload: [eventPayload], + }; + } } -function setProfileMessage(ctx: FullContext, distinctId: string, event: AnalyticsServerEvent): HttpRequest[] { +function setProfileMessage(ctx: FullContext, distinctId: string, event: AnalyticsServerEvent): MixpanelRequest[] { const opts = ctx.props as MixpanelCredentials; const analyticsContext = event.context || {}; @@ -249,13 +278,14 @@ function setProfileMessage(ctx: FullContext, distinctId: string, event: Analytic }; } - const reqs: HttpRequest[] = [ + const reqs: MixpanelRequest[] = [ { url: "https://api.mixpanel.com/engage?verbose=1#profile-set", headers: { "Content-type": "application/json", Accept: "text-plain", }, + eventType: "profile-set", payload: [ { $token: opts.projectToken, @@ -284,6 +314,7 @@ function setProfileMessage(ctx: FullContext, distinctId: string, event: Analytic "Content-type": "application/json", Accept: "text-plain", }, + eventType: "profile-set-once", payload: [ { $token: opts.projectToken, @@ -308,6 +339,7 @@ function setProfileMessage(ctx: FullContext, distinctId: string, event: Analytic }; reqs.push({ url: "https://api.mixpanel.com/engage?verbose=1#profile-union", + eventType: "profile-union", headers: { "Content-type": "application/json", Accept: "text-plain", @@ -318,7 +350,7 @@ function setProfileMessage(ctx: FullContext, distinctId: string, event: Analytic return reqs; } -function setGroupMessage(event: AnalyticsServerEvent, opts: MixpanelCredentials): HttpRequest { +function setGroupMessage(event: AnalyticsServerEvent, opts: MixpanelCredentials): MixpanelRequest { const props = { ...(event.traits || {}) }; specialProperties.forEach(prop => { if (props[prop]) { @@ -336,6 +368,7 @@ function setGroupMessage(event: AnalyticsServerEvent, opts: MixpanelCredentials) return { url: "https://api.mixpanel.com/groups?verbose=1#group-set", + eventType: "group-set", headers: { "Content-type": "application/json", Accept: "text-plain", @@ -352,12 +385,14 @@ function getAuth(props: MixpanelCredentials) { return base64(`${props.serviceAccountUserName}:${props.serviceAccountPassword}`); } -function merge(ctx: FullContext, messageId: string, identifiedId: string, anonymousId: string): HttpRequest[] { +function merge(ctx: FullContext, messageId: string, identifiedId: string, anonymousId: string): MixpanelRequest[] { if (!anonymousId) { return []; } const opts = ctx.props as MixpanelCredentials; const basicAuth = getAuth(opts); + const insertId = randomUUID(); + return [ { url: `https://api.mixpanel.com/import?strict=1&project_id=${opts.projectId}`, @@ -366,11 +401,13 @@ function merge(ctx: FullContext, messageId: string, identifiedId: string, anonym Accept: "text-plain", Authorization: `Basic ${basicAuth}`, }, + eventType: "$merge", + insertId, payload: [ { event: "$merge", properties: { - $insert_id: randomUUID(), + $insert_id: insertId, $distinct_ids: [identifiedId, anonymousId], token: opts.projectToken, }, @@ -380,12 +417,13 @@ function merge(ctx: FullContext, messageId: string, identifiedId: string, anonym ]; } -function alias(ctx: FullContext, messageId: string, identifiedId: string, anonymousId: string): HttpRequest[] { +function alias(ctx: FullContext, messageId: string, identifiedId: string, anonymousId: string): MixpanelRequest[] { if (!anonymousId) { return []; } const opts = ctx.props as MixpanelCredentials; const basicAuth = getAuth(opts); + const insertId = randomUUID(); return [ { url: `https://api.mixpanel.com/import?strict=1&project_id=${opts.projectId}`, @@ -394,11 +432,13 @@ function alias(ctx: FullContext, messageId: string, identifiedId: string, anonym Accept: "text-plain", Authorization: `Basic ${basicAuth}`, }, + eventType: "$create_alias", + insertId, payload: [ { event: "$create_alias", properties: { - $insert_id: randomUUID(), + $insert_id: insertId, distinct_id: anonymousId, alias: identifiedId, token: opts.projectToken, @@ -467,7 +507,7 @@ const MixpanelDestination: JitsuFunction ` - : "" - }${result.status} ${await result.text()}` - ); + if (message.skipLogs) { + throw new HTTPError( + `MixPanel event '${message.eventType}' $insert_id:${message.insertId} Failed to batch event. HTTP Error: ${result.status} ${result.statusText}`, + result.status, + await result.text() + ); + } else { + throw new Error( + `MixPanel${message.insertId ? " $insert_id:" + message.insertId : ""} ${method} ${message.url}:${ + message.payload + ? `${JSON.stringify(message.payload)} (size: ${payload.length} compressed: ${compressed.length}) --> ` + : "" + }${result.status} ${await result.text()}` + ); + } } else { - ctx.log.debug(`MixPanel ${method} ${message.url}: ${result.status} ${await result.text()}`); + if (message.skipLogs) { + ctx.log.debug(`MixPanel event '${message.eventType}' $insert_id:${message.insertId} added to batch.`); + } else { + ctx.log.debug( + `MixPanel${message.insertId ? " $insert_id:" + message.insertId : ""} ${method} ${message.url}: ${ + result.status + } ${await result.text()}` + ); + } } } } catch (e: any) { diff --git a/libs/jitsu-js/src/index.ts b/libs/jitsu-js/src/index.ts index 8305e3276..54689e93a 100644 --- a/libs/jitsu-js/src/index.ts +++ b/libs/jitsu-js/src/index.ts @@ -16,7 +16,7 @@ export default function parse(input) { if (parseFloat(value) === value) { value = parseFloat(value); } - } catch (e) { } + } catch (e) {} if (value === null || value === "") { return; } @@ -24,7 +24,7 @@ export default function parse(input) { } export const emptyAnalytics: AnalyticsInterface = { - setAnonymousId: () => { }, + setAnonymousId: () => {}, track: () => Promise.resolve(), page: () => Promise.resolve(), user: () => ({}), diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index a19cf1d8f..1fb1b85c0 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -98,15 +98,6 @@ export function checkError(chainRes: FuncChainResult) { } } } -const getCachedOrLoad = (cache: NodeCache, key: string, loader: (key: string) => any) => { - const cached = cache.get(key); - if (cached) { - return cached; - } - const loaded = loader(key); - cache.set(key, loaded); - return loaded; -}; export function buildFunctionChain( connection: EnrichedConnectionConfig, @@ -157,6 +148,7 @@ export function buildFunctionChain( log: makeLog(connection.id, rotorContext.eventsLogger), store, anonymousEventsStore, + connectionOptions: connectionData, }; const udfFuncs: FunctionConfig[] = (connectionData?.functions || []) diff --git a/services/rotor/src/lib/rotor.ts b/services/rotor/src/lib/rotor.ts index 6c1e9419b..252b28ee4 100644 --- a/services/rotor/src/lib/rotor.ts +++ b/services/rotor/src/lib/rotor.ts @@ -11,9 +11,7 @@ import { createMetrics, Metrics } from "./metrics"; import { FuncChainFilter, FuncChainResult } from "./functions-chain"; import type { Admin, Consumer, Producer, KafkaMessage } from "kafkajs"; import { CompressionTypes } from "kafkajs"; -import { GeoResolver } from "./maxmind"; import { functionFilter, MessageHandlerContext } from "./message-handler"; -import { EventsStore } from "@jitsu/core-functions"; import { connectionsStore, functionsStore } from "./entity-store"; const log = getLog("kafka-rotor"); @@ -225,7 +223,7 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { await consumer.run({ autoCommitInterval: 10000, autoCommit: true, - partitionsConsumedConcurrently: 4, + partitionsConsumedConcurrently: 8, eachMessage: async ({ message, topic, partition }) => { //make sure that queue has no more entities than concurrency limit (running tasks not included) await onSizeLessThan(concurrency); diff --git a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx index 069f790c9..a8c7880f2 100644 --- a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx +++ b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx @@ -404,12 +404,12 @@ function ConnectionEditor({ ), component: ( updateOptions({ batchSize: batchSize ?? 10000 })} /> ), diff --git a/webapps/console/components/DataView/DataView.tsx b/webapps/console/components/DataView/DataView.tsx index 4db7b1db8..fbd5d9679 100644 --- a/webapps/console/components/DataView/DataView.tsx +++ b/webapps/console/components/DataView/DataView.tsx @@ -71,7 +71,7 @@ export function DataView() { }, { key: "bulker", - label: `Data Warehouse Events`, + label: `Batch Events`, children: ( 0, }; }) - .filter(link => (streamType === "bulker" && link.usesBulker) || streamType === "function"); + .filter( + link => + (streamType === "bulker" && (link.usesBulker || link.mode === "batch")) || streamType === "function" + ); }; } @@ -782,10 +785,12 @@ const BatchTable = ({ loadEvents, loading, streamType, entityType, actorId, even dataIndex: "content", render: d => d.error || - "Schema: " + - Object.entries(d.representation?.schema || {}) - .map(([k, v]) => k) - .join(", "), + (d.representation?.schema + ? "Schema: " + + Object.entries(d.representation?.schema || {}) + .map(([k, v]) => k) + .join(", ") + : d.representation?.response ?? ""), }, ]; diff --git a/webapps/console/lib/schema/destinations.tsx b/webapps/console/lib/schema/destinations.tsx index b646d6860..f84c5e4e8 100644 --- a/webapps/console/lib/schema/destinations.tsx +++ b/webapps/console/lib/schema/destinations.tsx @@ -608,7 +608,11 @@ export const coreDestinations: DestinationType[] = [ icon: mixpanelIcon, title: "Mixpanel", tags: "Product Analytics", - connectionOptions: CloudDestinationsConnectionOptions, + connectionOptions: CloudDestinationsConnectionOptions.merge(BatchModeOptions).merge( + z.object({ + mode: z.enum(["stream", "batch"]).default("stream"), + }) + ), credentials: meta.MixpanelCredentials, credentialsUi: meta.MixpanelCredentialsUi, description: "Mixpanel is a product analytics platform that provides insights into user behavior.", diff --git a/webapps/console/pages/api/admin/export/[name]/index.ts b/webapps/console/pages/api/admin/export/[name]/index.ts index 8ee8bbff5..90f5da3b9 100644 --- a/webapps/console/pages/api/admin/export/[name]/index.ts +++ b/webapps/console/pages/api/admin/export/[name]/index.ts @@ -62,7 +62,7 @@ const exports: Export[] = [ lastId = objects[objects.length - 1].id; for (const { data, from, id, to, updatedAt, workspace } of objects) { const destinationType = to.config.destinationType; - if (getCoreDestinationTypeNonStrict(destinationType)?.usesBulker) { + if (getCoreDestinationTypeNonStrict(destinationType)?.usesBulker || data.mode === "batch") { if (needComma) { writer.write(","); } From 4375208165fcda613a76f4ec66edcb9a3b14daee Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 16 Apr 2024 15:23:05 +0400 Subject: [PATCH 0702/1353] fix --- webapps/console/pages/api/admin/export/[name]/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/pages/api/admin/export/[name]/index.ts b/webapps/console/pages/api/admin/export/[name]/index.ts index 90f5da3b9..f53e55a14 100644 --- a/webapps/console/pages/api/admin/export/[name]/index.ts +++ b/webapps/console/pages/api/admin/export/[name]/index.ts @@ -62,7 +62,7 @@ const exports: Export[] = [ lastId = objects[objects.length - 1].id; for (const { data, from, id, to, updatedAt, workspace } of objects) { const destinationType = to.config.destinationType; - if (getCoreDestinationTypeNonStrict(destinationType)?.usesBulker || data.mode === "batch") { + if (getCoreDestinationTypeNonStrict(destinationType)?.usesBulker || data?.mode === "batch") { if (needComma) { writer.write(","); } From 1f11936b4e559dfcb8bb7dad9f87caf407331994 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 17 Apr 2024 15:19:41 +0400 Subject: [PATCH 0703/1353] Mixpanel tweaks --- .../src/functions/mixpanel-destination.ts | 14 ++++-- services/rotor/__tests__/inmem-store.test.ts | 2 - services/rotor/__tests__/kafka.test.ts | 45 +++++++++++++++++ .../ConnectionEditorPage.tsx | 42 ++++++++-------- .../console/components/DataView/DataView.tsx | 2 +- .../components/DataView/EventsBrowser.tsx | 49 +++++++++++++------ webapps/console/lib/schema/destinations.tsx | 3 ++ .../pages/api/admin/export/[name]/index.ts | 3 +- 8 files changed, 115 insertions(+), 45 deletions(-) create mode 100644 services/rotor/__tests__/kafka.test.ts diff --git a/libs/core-functions/src/functions/mixpanel-destination.ts b/libs/core-functions/src/functions/mixpanel-destination.ts index 91824f6c8..0a386a166 100644 --- a/libs/core-functions/src/functions/mixpanel-destination.ts +++ b/libs/core-functions/src/functions/mixpanel-destination.ts @@ -1,7 +1,7 @@ import { FullContext, JitsuFunction } from "@jitsu/protocols/functions"; import { HTTPError, RetryError } from "@jitsu/functions-lib"; import type { AnalyticsServerEvent, Geo } from "@jitsu/protocols/analytics"; -import { hash, requireDefined } from "juava"; +import { hash } from "juava"; import { MixpanelCredentials } from "../meta"; import { eventTimeSafeMs, MetricsMeta } from "./lib"; import { randomUUID } from "crypto"; @@ -150,7 +150,7 @@ function trackEvent( const device = analyticsContext.device || ({} as any); const ua = ctx.ua || ({} as any); const uaDevice = ua.device || ({} as any); - const insertId = randomUUID(); + const insertId = getInsertId(event.messageId, eventType); const eventPayload = { event: eventType, properties: { @@ -213,7 +213,7 @@ function trackEvent( functionId: "builtin.destination.bulker", }; return { - url: `${bulkerBase}/post/${ctx.connection.id}?tableName=import`, + url: `${bulkerBase}/post/${ctx.connection.id}?tableName=import&modeOverride=batch`, eventType, insertId, headers: { @@ -385,13 +385,17 @@ function getAuth(props: MixpanelCredentials) { return base64(`${props.serviceAccountUserName}:${props.serviceAccountPassword}`); } +function getInsertId(messageId: string, eventType: string) { + return hash("md5", (messageId || randomUUID()) + "_" + eventType); +} + function merge(ctx: FullContext, messageId: string, identifiedId: string, anonymousId: string): MixpanelRequest[] { if (!anonymousId) { return []; } const opts = ctx.props as MixpanelCredentials; const basicAuth = getAuth(opts); - const insertId = randomUUID(); + const insertId = getInsertId(messageId, "merge"); return [ { @@ -423,7 +427,7 @@ function alias(ctx: FullContext, messageId: string, identifiedId: string, anonym } const opts = ctx.props as MixpanelCredentials; const basicAuth = getAuth(opts); - const insertId = randomUUID(); + const insertId = getInsertId(messageId, "alias"); return [ { url: `https://api.mixpanel.com/import?strict=1&project_id=${opts.projectId}`, diff --git a/services/rotor/__tests__/inmem-store.test.ts b/services/rotor/__tests__/inmem-store.test.ts index 538d60abd..d839f7359 100644 --- a/services/rotor/__tests__/inmem-store.test.ts +++ b/services/rotor/__tests__/inmem-store.test.ts @@ -1,7 +1,5 @@ import { createInMemoryStore } from "../src/lib/inmem-store"; -import { expect } from "@playwright/test"; import { getLog } from "juava"; -import { reject } from "lodash"; import * as path from "path"; const log = getLog("inmem-store-test"); diff --git a/services/rotor/__tests__/kafka.test.ts b/services/rotor/__tests__/kafka.test.ts new file mode 100644 index 000000000..646575899 --- /dev/null +++ b/services/rotor/__tests__/kafka.test.ts @@ -0,0 +1,45 @@ +import { getLog } from "juava"; +import { connectToKafka } from "../src/lib/kafka-config"; + +import "@sensejs/kafkajs-zstd-support"; + +const log = getLog("kafka-test"); +test.skip("Kafka Test", async () => { + const kafka = connectToKafka({ defaultAppId: "test", brokers: "localhost:9092" }); + const consumer = kafka.consumer({ + groupId: "test", + allowAutoTopicCreation: true, + sessionTimeout: 10000, + }); + await consumer.connect(); + await consumer.subscribe({ topics: ["autocommit-test"], fromBeginning: true }); + + const producer = kafka.producer({ allowAutoTopicCreation: false }); + await producer.connect(); + + for (let i = 0; i < 200; i++) { + producer.send({ + topic: "autocommit-test", + messages: [ + { + value: `message #${i}`, + }, + ], + }); + } + + await consumer.run({ + autoCommitInterval: 10000, + autoCommit: true, + partitionsConsumedConcurrently: 8, + eachMessage: async ({ topic, partition, message }) => { + log.atInfo().log(`${topic}:${partition}: ${message.offset} => ${message.value?.toString()}`); + await new Promise(resolve => setTimeout(resolve, 100)); + }, + }); + setTimeout(() => { + consumer.disconnect(); + }, 15000); + + await new Promise(resolve => setTimeout(resolve, 20000)); +}, 40000); diff --git a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx index a8c7880f2..def2451bc 100644 --- a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx +++ b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx @@ -611,27 +611,27 @@ function ConnectionEditor({ ), }); } - if (hasZodFields(connectionOptionsZodType, "multithreading")) { - configItems.push({ - group: "Advanced", - documentation: ( - <> - Use multiple threads to send data to the endpoint. Faster, but doesn't guarantee order of events. Recommended - on high volumes of data. - - ), - name: "Multithreading", - component: ( - { - updateOptions({ multithreading: m }); - }} - /> - ), - }); - } + // if (hasZodFields(connectionOptionsZodType, "multithreading")) { + // configItems.push({ + // group: "Advanced", + // documentation: ( + // <> + // Use multiple threads to send data to the endpoint. Faster, but doesn't guarantee order of events. Recommended + // on high volumes of data. + // + // ), + // name: "Multithreading", + // component: ( + // { + // updateOptions({ multithreading: m }); + // }} + // /> + // ), + // }); + // } return (

    diff --git a/webapps/console/components/DataView/DataView.tsx b/webapps/console/components/DataView/DataView.tsx index fbd5d9679..3404e4252 100644 --- a/webapps/console/components/DataView/DataView.tsx +++ b/webapps/console/components/DataView/DataView.tsx @@ -71,7 +71,7 @@ export function DataView() { }, { key: "bulker", - label: `Batch Events`, + label: `Batches & Data Warehouse Events`, children: ( { try { @@ -207,13 +208,11 @@ export const EventsBrowser = ({ let eventsLogStream = streamType as string; if (streamType === "bulker") { const entity = entitiesMap[actorId]; - if (entity.mode === "stream") { - dispatch({ type: "bulkerMode", value: "stream" }); - eventsLogStream = "bulker_stream"; - } else if (entity.mode === "batch") { - dispatch({ type: "bulkerMode", value: "batch" }); - eventsLogStream = "bulker_batch"; + if (!bulkerMode) { + bulkerMode = entity.mode; + dispatch({ type: "bulkerMode", value: bulkerMode }); } + eventsLogStream = "bulker_" + bulkerMode; } dispatch({ type: "eventsLoading", value: true }); const data = await eventsLogApi.get( @@ -275,12 +274,12 @@ export const EventsBrowser = ({ service: servicesMap[link.fromId], destination: dst, usesBulker: destinationType?.usesBulker || false, + hybrid: destinationType?.hybrid || false, //usesFunctions: Array.isArray(link.data?.functions) && link.data?.functions.length > 0, }; }) .filter( - link => - (streamType === "bulker" && (link.usesBulker || link.mode === "batch")) || streamType === "function" + link => (streamType === "bulker" && (link.usesBulker || link.hybrid)) || streamType === "function" ); }; } @@ -308,8 +307,8 @@ export const EventsBrowser = ({ }, [streamType, entitiesMap, actorId, workspace.id, patchQueryStringState, entitiesLoading]); useEffect(() => { - loadEvents(streamType, entitiesMap, level, actorId, dates); - }, [loadEvents, streamType, entitiesMap, level, actorId, dates, refreshTime]); + loadEvents(streamType, entitiesMap, level, actorId, dates, bulkerMode); + }, [loadEvents, streamType, entitiesMap, level, actorId, dates, bulkerMode, refreshTime]); // //load more events on reaching bottom // useEffect(() => { @@ -401,6 +400,7 @@ export const EventsBrowser = ({ loading={entitiesLoading} onChange={e => { dispatch({ type: "events", value: [] }); + dispatch({ type: "bulkerMode", value: undefined }); dispatch({ type: "beforeDate", value: undefined }); patchQueryStringState("actorId", e); }} @@ -411,7 +411,7 @@ export const EventsBrowser = ({
    {streamType == "function" ? "Level: " : "Status: "} { + setShownEvents([]); + dispatch({ type: "events", value: undefined }); + dispatch({ type: "beforeDate", value: undefined }); + dispatch({ type: "bulkerMode", value: e }); + }} + options={[ + { value: "batch", label: "Batch" }, + { value: "stream", label: "Stream" }, + ]} + /> +
    + )}
    Date range: { const checked = !debugEnabled; - const debugTill = checked ? dayjs().add(5, "minute").toISOString() : undefined; + const debugTill = checked ? dayjs().add(15, "minute").toISOString() : undefined; const newConnection = { ...connection, data: { ...connection.data, debugTill } }; setConnection(newConnection); setDebugEnabled(checked); @@ -518,7 +537,7 @@ export const EventsBrowser = ({ entityType={entityType} actorId={actorId} events={shownEvents} - loadEvents={() => loadEvents(streamType, entitiesMap, level, actorId, dates, beforeDate)} + loadEvents={() => loadEvents(streamType, entitiesMap, level, actorId, dates, bulkerMode, beforeDate)} /> ) : ( @@ -693,7 +712,7 @@ const StreamEventsTable = ({ loadEvents, loading, streamType, entityType, actorI className: "whitespace-nowrap", dataIndex: ["content", "original"], render: (o: any) => { - return o.type || o.event; + return o?.type || o?.event; }, }, { diff --git a/webapps/console/lib/schema/destinations.tsx b/webapps/console/lib/schema/destinations.tsx index f84c5e4e8..634ac1db4 100644 --- a/webapps/console/lib/schema/destinations.tsx +++ b/webapps/console/lib/schema/destinations.tsx @@ -173,6 +173,8 @@ export type DestinationType = { title: string; isSynchronous?: boolean; usesBulker?: boolean; + // destinations that relies on both rotor for flexible logic in typescript and bulker for batching + hybrid?: boolean; tags: string | string[]; credentials: SomeZodObject; connectionOptions: SomeZodObject; @@ -607,6 +609,7 @@ export const coreDestinations: DestinationType[] = [ id: "mixpanel", icon: mixpanelIcon, title: "Mixpanel", + hybrid: true, tags: "Product Analytics", connectionOptions: CloudDestinationsConnectionOptions.merge(BatchModeOptions).merge( z.object({ diff --git a/webapps/console/pages/api/admin/export/[name]/index.ts b/webapps/console/pages/api/admin/export/[name]/index.ts index f53e55a14..14596ec16 100644 --- a/webapps/console/pages/api/admin/export/[name]/index.ts +++ b/webapps/console/pages/api/admin/export/[name]/index.ts @@ -62,7 +62,8 @@ const exports: Export[] = [ lastId = objects[objects.length - 1].id; for (const { data, from, id, to, updatedAt, workspace } of objects) { const destinationType = to.config.destinationType; - if (getCoreDestinationTypeNonStrict(destinationType)?.usesBulker || data?.mode === "batch") { + const coreDestinationType = getCoreDestinationTypeNonStrict(destinationType); + if (coreDestinationType?.usesBulker || coreDestinationType?.hybrid) { if (needComma) { writer.write(","); } From 83263ff80f1fec87039ad94cd8bb271c98a63e32 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 17 Apr 2024 15:50:14 +0400 Subject: [PATCH 0704/1353] small fix --- webapps/console/components/DataView/EventsBrowser.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webapps/console/components/DataView/EventsBrowser.tsx b/webapps/console/components/DataView/EventsBrowser.tsx index 9c3bb9cac..b254f3d1f 100644 --- a/webapps/console/components/DataView/EventsBrowser.tsx +++ b/webapps/console/components/DataView/EventsBrowser.tsx @@ -46,7 +46,7 @@ type EventsBrowserProps = { }; type EventsBrowserState = { - bulkerMode: "stream" | "batch"; + bulkerMode?: "stream" | "batch"; entitiesLoading: boolean; entitiesMap?: Record; eventsLoading: boolean; @@ -131,7 +131,7 @@ export const EventsBrowser = ({ }); const defaultState: EventsBrowserState = { - bulkerMode: "stream", + bulkerMode: undefined, entitiesLoading: false, entitiesMap: undefined, eventsLoading: false, From d5c77a24926ceeb15f12e4540cfdb89368705992 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 18 Apr 2024 16:30:16 +0400 Subject: [PATCH 0705/1353] rotor: ga4: support app events --- .../core-functions/src/functions/ga4-destination.ts | 13 ++++++++++--- types/protocols/analytics.d.ts | 3 +++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/libs/core-functions/src/functions/ga4-destination.ts b/libs/core-functions/src/functions/ga4-destination.ts index 714ee009e..6a373e0d0 100644 --- a/libs/core-functions/src/functions/ga4-destination.ts +++ b/libs/core-functions/src/functions/ga4-destination.ts @@ -22,7 +22,8 @@ function removeProperties(properties: Record, toRemove: string[]): } type Ga4Request = { - client_id: string; + app_instance_id?: string; + client_id?: string; user_id?: string; timestamp_micros: number; user_properties?: Record; @@ -132,8 +133,12 @@ function getUserProperties(event: AnalyticsServerEvent): Record { return userProperties; } -function getClientId(event: AnalyticsServerEvent): string { - return event.context?.clientIds?.ga4?.clientId || event.anonymousId || ""; +function getClientId(event: AnalyticsServerEvent): string | null | undefined { + return event.context?.clientIds?.ga4?.clientId || event.anonymousId; +} + +function getFirebaseAppInstanceId(event: AnalyticsServerEvent): string | undefined { + return event.context?.clientIds?.firebase?.appInstanceId; } function getSessionId(event: AnalyticsServerEvent, measurementId: string): string | undefined { @@ -309,6 +314,7 @@ const Ga4Destination: JitsuFunction = asyn return; } const sessionId = getSessionId(event, ctx.props.measurementId); + const firebaseAppInstanceId = getFirebaseAppInstanceId(event); const userProperties = getUserProperties(event); const events: Ga4Event[] = []; @@ -331,6 +337,7 @@ const Ga4Destination: JitsuFunction = asyn const url = `https://www.google-analytics.com${debug}/mp/collect?measurement_id=${ctx.props.measurementId}&api_secret=${ctx.props.apiSecret}`; gaRequest = { + app_instance_id: firebaseAppInstanceId, client_id: clientId, user_id: event.userId, timestamp_micros: eventTimeSafeMs(event) * 1000, diff --git a/types/protocols/analytics.d.ts b/types/protocols/analytics.d.ts index 9f360a297..67e149d52 100644 --- a/types/protocols/analytics.d.ts +++ b/types/protocols/analytics.d.ts @@ -222,6 +222,9 @@ interface AnalyticsContext { clientId: string; sessionIds?: any; }; + firebase?: { + appInstanceId: string; + }; //from cookies: _fbc - Facebook click ID, _fbp - Facebook browser ID. //see https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/customer-information-parameters fbc?: string; From 4d084236b34b0b71c25e3142218c8baf25f657b8 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 19 Apr 2024 12:12:07 +0400 Subject: [PATCH 0706/1353] console: fix for default batch size for Mixpanel --- .../components/ConnectionEditorPage/ConnectionEditorPage.tsx | 4 ++-- webapps/console/lib/schema/destinations.tsx | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx index def2451bc..239807f0d 100644 --- a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx +++ b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx @@ -404,9 +404,9 @@ function ConnectionEditor({ ), component: ( ; export const FunctionsConnectionOptions = z.object({ functions: z.array(z.object({ functionId: z.string(), functionOptions: z.any() })).optional(), + debugTill: z.string().optional(), }); //Options of any source -> destination connection that are not specific to any particular destination @@ -613,6 +614,7 @@ export const coreDestinations: DestinationType[] = [ tags: "Product Analytics", connectionOptions: CloudDestinationsConnectionOptions.merge(BatchModeOptions).merge( z.object({ + batchSize: z.number().min(1).max(500).default(500), mode: z.enum(["stream", "batch"]).default("stream"), }) ), From 99aa22aea1e7af1d7b8d53ba1cd4bb719dc76e8c Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 19 Apr 2024 13:41:39 +0400 Subject: [PATCH 0707/1353] console & rotor: enable back fetch logs by default --- .../core-functions/src/functions/lib/index.ts | 24 ++++++++++--------- .../src/functions/lib/udf-wrapper-code.ts | 4 ++-- .../src/functions/lib/udf-wrapper-code.txtjs | 4 ++-- .../src/functions/udf_wrapper.ts | 3 ++- services/rotor/src/lib/functions-chain.ts | 2 +- .../pages/api/admin/export/[name]/index.ts | 5 +++- 6 files changed, 24 insertions(+), 18 deletions(-) diff --git a/libs/core-functions/src/functions/lib/index.ts b/libs/core-functions/src/functions/lib/index.ts index 56a9bec3b..4c3317772 100644 --- a/libs/core-functions/src/functions/lib/index.ts +++ b/libs/core-functions/src/functions/lib/index.ts @@ -93,16 +93,18 @@ export function wrapperFunction ): JitsuFunctionWrapper { const log = createFunctionLogger(chainCtx, funcCtx); - const debugFetch = createFetchWrapper(chainCtx, funcCtx); + const fetchWithLog = createFetchWrapper(chainCtx, funcCtx); const props = funcCtx.props; const store = chainCtx.store; return async (event: E, ctx: EventContext) => { let ftch = chainCtx.fetch; - const debugEnabled = funcCtx.function.debugTill && funcCtx.function.debugTill > new Date(); - if (debugEnabled) { + const fetchLogEnabled = + chainCtx.connectionOptions?.fetchLogLevel !== "debug" || + (funcCtx.function.debugTill && funcCtx.function.debugTill > new Date()); + if (fetchLogEnabled) { ftch = async (url, opts, extra) => { - return debugFetch(url, opts, { ...extra, event }); + return fetchWithLog(url, opts, { ...extra, event }); }; } const fullContext: FullContext

    = { @@ -293,7 +295,7 @@ export const makeLog = (connectionId: string, eventsStore: EventsStore) => ({ }); export const makeFetch = - (connectionId: string, eventsStore: EventsStore, fetchTimeoutMs: number = 5000) => + (connectionId: string, eventsStore: EventsStore, logLevel: "info" | "debug", fetchTimeoutMs: number = 5000) => async ( url: string, init?: FetchOpts, @@ -304,10 +306,10 @@ export const makeFetch = const ctx = extra?.ctx?.function; const id = ctx?.id || "unknown"; const type = ctx?.type || "unknown"; - const debugEnabled = ctx?.debugTill && ctx?.debugTill > new Date(); + const logEnabled = logLevel === "info" || (ctx?.debugTill && ctx?.debugTill > new Date()); const logToRedis = typeof extra?.log === "boolean" ? extra.log : true; const baseInfo = - debugEnabled && logToRedis + logEnabled && logToRedis ? { functionId: id, functionType: type, @@ -336,10 +338,10 @@ export const makeFetch = if (err.name === "AbortError") { err = newError(`Fetch request exceeded timeout ${fetchTimeoutMs}ms and was aborted`, err); } - if (debugEnabled) { + if (logEnabled) { const elapsedMs = sw.elapsedMs(); if (logToRedis) { - eventsStore.log(connectionId, "debug", { ...baseInfo, error: getErrorMessage(err), elapsedMs: elapsedMs }); + eventsStore.log(connectionId, logLevel, { ...baseInfo, error: getErrorMessage(err), elapsedMs: elapsedMs }); } log .atDebug() @@ -352,13 +354,13 @@ export const makeFetch = throw err; } - if (debugEnabled) { + if (logEnabled) { const elapsedMs = sw.elapsedMs(); //clone response to be able to read it twice const cloned = fetchResult.clone(); const respText = await trimResponse(cloned); if (logToRedis) { - eventsStore.log(connectionId, "debug", { + eventsStore.log(connectionId, logLevel, { ...baseInfo, status: fetchResult.status, statusText: fetchResult.statusText, diff --git a/libs/core-functions/src/functions/lib/udf-wrapper-code.ts b/libs/core-functions/src/functions/lib/udf-wrapper-code.ts index 82bafe0fe..2b8f09955 100644 --- a/libs/core-functions/src/functions/lib/udf-wrapper-code.ts +++ b/libs/core-functions/src/functions/lib/udf-wrapper-code.ts @@ -230,9 +230,9 @@ const wrappedUserFunction = (id, f, funcCtx) => { } return async function (event, c) { - const debugEnabled = funcCtx.function.debugTill && funcCtx.function.debugTill > new Date(); + const fetchLogEnabled = _jitsu_fetch_log_level !== "debug" || (funcCtx.function.debugTill && funcCtx.function.debugTill > new Date()); let ftch = fetch - if (debugEnabled) { + if (fetchLogEnabled) { ftch = async(url, opts) => { return fetch(url, opts, {event}); } diff --git a/libs/core-functions/src/functions/lib/udf-wrapper-code.txtjs b/libs/core-functions/src/functions/lib/udf-wrapper-code.txtjs index 986ee8dce..4ef197c7b 100644 --- a/libs/core-functions/src/functions/lib/udf-wrapper-code.txtjs +++ b/libs/core-functions/src/functions/lib/udf-wrapper-code.txtjs @@ -217,9 +217,9 @@ const wrappedUserFunction = (id, f, funcCtx) => { } return async function (event, c) { - const debugEnabled = funcCtx.function.debugTill && funcCtx.function.debugTill > new Date(); + const fetchLogEnabled = _jitsu_fetch_log_level !== "debug" || (funcCtx.function.debugTill && funcCtx.function.debugTill > new Date()); let ftch = fetch - if (debugEnabled) { + if (fetchLogEnabled) { ftch = async(url, opts) => { return fetch(url, opts, {event}); } diff --git a/libs/core-functions/src/functions/udf_wrapper.ts b/libs/core-functions/src/functions/udf_wrapper.ts index e645daac2..52b2acb1d 100644 --- a/libs/core-functions/src/functions/udf_wrapper.ts +++ b/libs/core-functions/src/functions/udf_wrapper.ts @@ -69,6 +69,7 @@ export const UDFWrapper = ( error: makeReference(refs, chainCtx.log.error), }).copyInto({ release: true, transferIn: true }) ); + jail.setSync("_jitsu_fetch_log_level", chainCtx.connectionOptions?.fetchLogLevel || "info"); jail.setSync( "_jitsu_fetch", makeReference(refs, async (url: string, opts?: FetchOpts, extra?: any) => { @@ -398,7 +399,7 @@ export async function UDFTestRun({ }; const chainCtx: FunctionChainContext = { store: storeImpl, - fetch: makeFetch("functionsDebugger", eventsStore), + fetch: makeFetch("functionsDebugger", eventsStore, "info"), log: makeLog("functionsDebugger", eventsStore), }; const d = new Date(); diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index 1fb1b85c0..665a0f867 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -144,7 +144,7 @@ export function buildFunctionChain( } } const chainCtx: FunctionChainContext = { - fetch: makeFetch(connection.id, rotorContext.eventsLogger, fetchTimeoutMs), + fetch: makeFetch(connection.id, rotorContext.eventsLogger, connectionData.fetchLogLevel || "info", fetchTimeoutMs), log: makeLog(connection.id, rotorContext.eventsLogger), store, anonymousEventsStore, diff --git a/webapps/console/pages/api/admin/export/[name]/index.ts b/webapps/console/pages/api/admin/export/[name]/index.ts index 14596ec16..ee5000530 100644 --- a/webapps/console/pages/api/admin/export/[name]/index.ts +++ b/webapps/console/pages/api/admin/export/[name]/index.ts @@ -160,7 +160,10 @@ const exports: Export[] = [ streamId: from.id, destinationId: to.id, usesBulker: !!coreDestinationType?.usesBulker, - options: data, + options: { + ...data, + ...((workspace.featuresEnabled ?? []).includes("nofetchlogs") ? { fetchLogLevel: "debug" } : {}), + }, optionsHash: hash(data), updatedAt: dateMax(updatedAt, to.updatedAt), credentials: omit(to.config, "destinationType", "type", "name"), From 633ce9ffaa14ec4c3ad80bef0f5772e195d5b793 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 19 Apr 2024 16:44:08 +0400 Subject: [PATCH 0708/1353] rotor: amplitude: support for screen events --- .../src/functions/amplitude-destination.ts | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/libs/core-functions/src/functions/amplitude-destination.ts b/libs/core-functions/src/functions/amplitude-destination.ts index eb43d9f0d..a7a85343a 100644 --- a/libs/core-functions/src/functions/amplitude-destination.ts +++ b/libs/core-functions/src/functions/amplitude-destination.ts @@ -73,9 +73,13 @@ const AmplitudeDestination: JitsuFunction Date: Mon, 22 Apr 2024 11:33:37 -0400 Subject: [PATCH 0709/1353] Improve GTM integration (#1101) * improved GTM integration --- .../__tests__/intercom-destination.test.ts | 2 + libs/jitsu-js/src/analytics-plugin.ts | 2 +- libs/jitsu-js/src/destination-plugins/gtm.ts | 58 ++++++++++++++++--- .../jitsu-js/src/destination-plugins/index.ts | 3 +- libs/jitsu-js/src/index.ts | 15 ++++- webapps/console/lib/firebase-client.tsx | 6 +- webapps/console/lib/store/index.tsx | 2 +- webapps/console/pages/_app.tsx | 4 +- webapps/console/pages/admin/events-debug.tsx | 48 +++++++++++++++ .../console/pages/api/fb-auth/create-user.ts | 5 +- webapps/console/pages/api/init-user.ts | 24 +++++++- webapps/console/prisma/schema.prisma | 4 ++ 12 files changed, 154 insertions(+), 19 deletions(-) create mode 100644 webapps/console/pages/admin/events-debug.tsx diff --git a/libs/core-functions/__tests__/intercom-destination.test.ts b/libs/core-functions/__tests__/intercom-destination.test.ts index 0b38d10fb..1bf10375f 100644 --- a/libs/core-functions/__tests__/intercom-destination.test.ts +++ b/libs/core-functions/__tests__/intercom-destination.test.ts @@ -2,6 +2,8 @@ import { testJitsuFunction, TestOptions } from "./lib/testing-lib"; import { IntercomDestinationCredentials } from "../src/meta"; import IntercomDestination from "../src/functions/intercom-destination"; import { setGlobalLogLevel, setServerLogColoring } from "juava"; +import { JitsuFunction } from "@jitsu/protocols/functions"; +import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; setServerLogColoring(true); setGlobalLogLevel("debug"); diff --git a/libs/jitsu-js/src/analytics-plugin.ts b/libs/jitsu-js/src/analytics-plugin.ts index b8333b992..1a505b48c 100644 --- a/libs/jitsu-js/src/analytics-plugin.ts +++ b/libs/jitsu-js/src/analytics-plugin.ts @@ -426,7 +426,7 @@ async function processDestinations( if (plugin) { for (const event of newEvents) { try { - promises.push(plugin.handle(credentials, event)); + promises.push(plugin.handle({ ...credentials, debug: true }, event)); } catch (e) { console.warn( `[JITSU] Error processing event with internal plugin '${destination.deviceOptions.name}': ${e?.message}`, diff --git a/libs/jitsu-js/src/destination-plugins/gtm.ts b/libs/jitsu-js/src/destination-plugins/gtm.ts index c069a45c3..79d7aa2dd 100644 --- a/libs/jitsu-js/src/destination-plugins/gtm.ts +++ b/libs/jitsu-js/src/destination-plugins/gtm.ts @@ -7,51 +7,91 @@ export type GtmDestinationCredentials = { dataLayerName?: string; } & CommonDestinationCredentials; +function omit(obj: any, ...keys: string[]) { + return Object.fromEntries(Object.entries(obj).filter(([k]) => !keys.includes(k))); +} + export const gtmPlugin: InternalPlugin = { id: "gtm", async handle(config, payload: AnalyticsClientEvent) { + const debug = !!config.debug; if (!applyFilters(payload, config)) { return; } await initGtmIfNeeded(config, payload); const dataLayer = window[config.dataLayerName || "dataLayer"]; + //traits could be in both nodes, context.traits takes precedence + const traits = { + ...(payload?.traits || {}), + ...(payload?.context?.traits || {}), + }; + //remove properties that defined separately + const idsFromTraits = omit(traits, "id", "userId", "user_id", "anonymousId", "userId"); + if (debug) { + console.debug("GTM plugin will be applied to following payload", payload); + } + + // See https://developers.google.com/tag-platform/tag-manager/server-side/common-event-data + const userData = { + email_address: traits.email, + }; const ids = { ...(payload.userId ? { user_id: payload.userId, userId: payload.userId } : {}), ...(payload.anonymousId ? { anonymousId: payload.anonymousId } : {}), + ...idsFromTraits, + user_data: Object.keys(userData).length > 0 ? userData : undefined, + }; + if (debug) { + console.debug("GTM plugin will set following user-related data layer vars", ids); + } + const pageProperties = payload.properties || {}; + const pageVariables = { + page_location: pageProperties.url || payload.context?.page?.url, + page_title: pageProperties.title || payload.context?.page?.title, + page_path: pageProperties.path || payload.context?.page?.path, + page_hash: pageProperties.hash || payload.context?.page?.hash, + page_search: pageProperties.search || payload.context?.page?.search, + page_referrer: payload?.context?.page?.referrer ?? "", + }; + if (debug) { + console.debug("GTM plugin will set following context (page) related data layer vars", ids); + } + const pushToDataLayer = (data: any) => { + dataLayer.push(data); + if (debug) { + console.debug("GTM plugin will push following data to dataLayer", data); + } }; switch (payload.type) { case "page": const { properties: pageProperties, context } = payload; const pageEvent = { event: "page_view", - page_location: pageProperties.url, - page_title: pageProperties.title, - page_path: pageProperties.path, - page_hash: pageProperties.hash, - page_search: pageProperties.search, - page_referrer: context?.page?.referrer ?? "", + ...pageVariables, ...ids, }; - dataLayer.push(pageEvent); + pushToDataLayer(pageEvent); break; case "track": const { properties: trackProperties } = payload; const trackEvent: any = { event: payload.event, + ...pageVariables, ...trackProperties, ...ids, }; - dataLayer.push(trackEvent); + pushToDataLayer(trackEvent); break; case "identify": const { traits } = payload; const identifyEvent: any = { event: "identify", + ...pageVariables, ...traits, ...ids, }; - dataLayer.push(identifyEvent); + pushToDataLayer(identifyEvent); break; } dataLayer.push(function () { diff --git a/libs/jitsu-js/src/destination-plugins/index.ts b/libs/jitsu-js/src/destination-plugins/index.ts index 46aa4a27c..dad9b9f49 100644 --- a/libs/jitsu-js/src/destination-plugins/index.ts +++ b/libs/jitsu-js/src/destination-plugins/index.ts @@ -3,10 +3,11 @@ import { tagPlugin } from "./tag"; import { logrocketPlugin } from "./logrocket"; import { gtmPlugin } from "./gtm"; import { ga4Plugin } from "./ga4"; +import type { JitsuOptions } from "../jitsu"; export type InternalPlugin = { id: string; - handle(config: T, payload: AnalyticsClientEvent): Promise; + handle(config: T & { debug?: boolean }, payload: AnalyticsClientEvent): Promise; }; export type CommonDestinationCredentials = { diff --git a/libs/jitsu-js/src/index.ts b/libs/jitsu-js/src/index.ts index 54689e93a..9de60c005 100644 --- a/libs/jitsu-js/src/index.ts +++ b/libs/jitsu-js/src/index.ts @@ -152,7 +152,20 @@ function createUnderlyingAnalyticsInstance( } as AnalyticsInterface; } -export function jitsuAnalytics(opts: JitsuOptions): AnalyticsInterface { +/** + * Fix common mistakes in jitsu configuration + * @param opts + */ +function fixOptions(opts: JitsuOptions): JitsuOptions { + return { + ...opts, + host: + opts.host.indexOf("https://") !== 0 && opts.host.indexOf("http://") !== 0 ? `https://${opts.host}` : opts.host, + }; +} + +export function jitsuAnalytics(_opts: JitsuOptions): AnalyticsInterface { + const opts = fixOptions(_opts); const inBrowser = isInBrowser(); const rt = opts.runtime || (inBrowser ? windowRuntime(opts) : emptyRuntime(opts)); return createUnderlyingAnalyticsInstance(opts, rt); diff --git a/webapps/console/lib/firebase-client.tsx b/webapps/console/lib/firebase-client.tsx index 0f5006e20..f96f35e80 100644 --- a/webapps/console/lib/firebase-client.tsx +++ b/webapps/console/lib/firebase-client.tsx @@ -3,6 +3,7 @@ import { initializeApp } from "firebase/app"; import * as auth from "firebase/auth"; import { AppConfig, ContextApiResponse } from "./schema"; import { getLog, randomId, requireDefined, rpc } from "juava"; +import { useJitsu } from "@jitsu/jitsu-react"; type FirebaseClientSettings = Record; export type FirebaseProviderInstance = @@ -114,6 +115,7 @@ export async function firebaseSignOut() { export function useFirebaseSession(): FirebaseSession { const config = useFirebaseConfig(); + const { analytics } = useJitsu(); if (!config.enabled) { throw new Error(`Firebase is not enabled, exiting`); @@ -129,7 +131,9 @@ export function useFirebaseSession(): FirebaseSession { } else { user = await a.signInWithPopup(a.getAuth(), new auth.GoogleAuthProvider()); } - await getUserFromFirebase(a.getAuth().currentUser!); + const firebaseUser = await getUserFromFirebase(a.getAuth().currentUser!); + await analytics.identify(firebaseUser.internalId, { email: firebaseUser.email, name: firebaseUser.name }); + await analytics.track("login"); } catch (e) { log.atError().withCause(e).log(`Can't sign in with ${type}`); throw e; diff --git a/webapps/console/lib/store/index.tsx b/webapps/console/lib/store/index.tsx index 9189ad18b..09f3b14b8 100644 --- a/webapps/console/lib/store/index.tsx +++ b/webapps/console/lib/store/index.tsx @@ -110,7 +110,7 @@ async function initialDataLoad( getLog().atInfo().log("@@@@@@@@@@@@@@@@@@@ Loaders", loaders); await Promise.all(loaders); } catch (e) { - getLog().atError().log("@@@@@@@@@@@@@@@@@@@Failed to load initial data", e); + getLog().atError().log("@@@@@@@@@@@@@@@@@@@ Failed to load initial data", e); throw e; } diff --git a/webapps/console/pages/_app.tsx b/webapps/console/pages/_app.tsx index 7e472b80a..2bfea004f 100644 --- a/webapps/console/pages/_app.tsx +++ b/webapps/console/pages/_app.tsx @@ -1,4 +1,4 @@ -import { getLog, LogLevel, rpc, setGlobalLogLevel } from "juava"; +import { getLog, isTruish, LogLevel, rpc, setGlobalLogLevel } from "juava"; import { AppProps } from "next/app"; import "../styles/globals.css"; import { useRouter } from "next/router"; @@ -318,7 +318,7 @@ function AppLoader({ children, pageProps }: PropsWithChildren) { trackingHost ? { //debug: data?.logLevel === "debug", - debug: false, + debug: isTruish(process.env.NEXT_PUBLIC_TELEMETRY_DEBUG), host: trackingHost, } : { disabled: true } diff --git a/webapps/console/pages/admin/events-debug.tsx b/webapps/console/pages/admin/events-debug.tsx new file mode 100644 index 000000000..1fcab25d1 --- /dev/null +++ b/webapps/console/pages/admin/events-debug.tsx @@ -0,0 +1,48 @@ +import { ReactNode, useState } from "react"; +import { Button } from "antd"; +import { feedbackError } from "../../lib/ui"; +import { useJitsu } from "@jitsu/jitsu-react"; + +const SendEventButton: React.FC<{ children: ReactNode; onClick: () => Promise }> = ({ children, onClick }) => { + const [loading, setLoading] = useState(false); + return ( + + ); +}; + +export default function TrackingEventsDebugger() { + const { analytics } = useJitsu(); + return ( +

    + { + await analytics.track("sign_up"); + }} + > + Sign Up + + { + await analytics.track("login"); + }} + > + Login + +
    + ); +} diff --git a/webapps/console/pages/api/fb-auth/create-user.ts b/webapps/console/pages/api/fb-auth/create-user.ts index 53e525303..fdedeeae7 100644 --- a/webapps/console/pages/api/fb-auth/create-user.ts +++ b/webapps/console/pages/api/fb-auth/create-user.ts @@ -18,8 +18,11 @@ export const api: Api = { req, }); await linkFirebaseUser(user.externalId, dbUser.id); + } else { + throw new Error( + `Firebase user already has internalId (${user.internalId}), this endpoint should not be called` + ); } - return {}; }, }, }; diff --git a/webapps/console/pages/api/init-user.ts b/webapps/console/pages/api/init-user.ts index 2762ce70b..d82da2a5d 100644 --- a/webapps/console/pages/api/init-user.ts +++ b/webapps/console/pages/api/init-user.ts @@ -77,15 +77,35 @@ export default createRoute() }); if (!workspaceAccess) { getServerLog().atInfo().log(`User ${user.internalId} has no access to any workspace. Creating a new one for him`); - const dbUser = await db.prisma().userProfile.findFirst({ where: { id: user.internalId } }); + let dbUser = await db.prisma().userProfile.findFirst({ where: { id: user.internalId } }); if (!dbUser) { + //This could happen by two reasons + //Firebase: internalId is a custom claim, a property of a user. So we're using, another database for main firebase instance + //in fact, our architecture does not allow to use a firebase with many postgres DBs + //Self-hosted: seems like the situation is the same as with firebase + + //we'll try to remedy a situation, but it's not going to work for all cases getServerLog().atInfo().log(`User ${user.internalId} has no profile in db. Creating a new one`); if (process.env.DISABLE_SIGNUP === "true" || process.env.DISABLE_SIGNUP === "1") { throw new ApiError("Sign up is disabled", { code: "signup-disabled" }); } - //incorrect state, current session has internalId but no user in db. Fix it by creating a new user + if (!user.loginProvider && !user.externalId) { + //double check so we won't pull first of all users from DB + throw new ApiError(`Inconsistent state, loginProvider or externalId is empty in users JWT`); + } + dbUser = await db + .prisma() + .userProfile.findFirst({ where: { loginProvider: user.loginProvider, externalId: user.externalId } }); + if (dbUser) { + //theoretically we can change custom claim (internalId) in firebase instead of throwing + throw new ApiError( + `There's another user with given external id (${user.loginProvider}/${user.externalId}, but different internal id - ${dbUser.id}. Please, delete this user. Passed user id: ${user.internalId}` + ); + } + const newUser = await db.prisma().userProfile.create({ data: { + id: user.internalId, name: user.name, email: user.email, loginProvider: user.loginProvider, diff --git a/webapps/console/prisma/schema.prisma b/webapps/console/prisma/schema.prisma index 2d78864af..42c8759fc 100644 --- a/webapps/console/prisma/schema.prisma +++ b/webapps/console/prisma/schema.prisma @@ -60,6 +60,9 @@ model UserProfile { userPreferences UserPreferences[] workspaceUserProperties WorkspaceUserProperties[] password UserPassword? + + @@index(externalId) + @@unique([loginProvider, externalId]) } model UserPassword { @@ -89,6 +92,7 @@ model Workspace { featuresEnabled String[] @default([]) @@unique(slug) + @@index(slug) @@index(updatedAt(sort: Desc)) } From 35564475b2dc11be6098ab5228e2aeff089cb485 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 22 Apr 2024 19:50:45 +0400 Subject: [PATCH 0710/1353] npm: up canary base version to 1.9.2 after 1.9.1 release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 98bcc3433..6407e2f25 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "lint": "turbo run lint --", "release": "pnpm build && pnpm test && monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/functions --filter ./libs/jitsu-js --filter ./libs/jitsu-react --npm-tag latest --git-tag 'jitsu-js-libs-v{version}' --push-tag", "release:build-scripts": "pnpm build --filter ./cli/build-scripts && monorel --filter ./cli/build-scripts --npm-tag latest --version 0.0.4-dev.{rev}.{time} --publish --git-tag 'jitsu-build-scripts-v{version}'", - "release:canary": "monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/functions --filter ./libs/jitsu-js --filter ./libs/jitsu-react --version '1.9.0-canary.{rev}.{time}' --npm-tag canary --git-tag 'jitsu-js-libs-canary-v{version}' --push-tag" + "release:canary": "monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/functions --filter ./libs/jitsu-js --filter ./libs/jitsu-react --version '1.9.2-canary.{rev}.{time}' --npm-tag canary --git-tag 'jitsu-js-libs-canary-v{version}' --push-tag" }, "devDependencies": { "@playwright/test": "1.39.0", From 09d42c7df5ea9fd030cafbbe4baf281535e43a4d Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Mon, 22 Apr 2024 12:47:10 -0400 Subject: [PATCH 0711/1353] fix: removed debug logging --- libs/jitsu-js/src/analytics-plugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/jitsu-js/src/analytics-plugin.ts b/libs/jitsu-js/src/analytics-plugin.ts index 1a505b48c..418969fd5 100644 --- a/libs/jitsu-js/src/analytics-plugin.ts +++ b/libs/jitsu-js/src/analytics-plugin.ts @@ -426,7 +426,7 @@ async function processDestinations( if (plugin) { for (const event of newEvents) { try { - promises.push(plugin.handle({ ...credentials, debug: true }, event)); + promises.push(plugin.handle({ ...credentials, debug }, event)); } catch (e) { console.warn( `[JITSU] Error processing event with internal plugin '${destination.deviceOptions.name}': ${e?.message}`, From 64c8ada0233a84cac432b438fbcbbca499b8233d Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 23 Apr 2024 16:02:36 +0400 Subject: [PATCH 0712/1353] jitsu-js: better filtering of incorrect values of '__user_traits' cookie --- libs/jitsu-js/src/analytics-plugin.ts | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/jitsu-js/src/analytics-plugin.ts b/libs/jitsu-js/src/analytics-plugin.ts index 418969fd5..ec8d77afd 100644 --- a/libs/jitsu-js/src/analytics-plugin.ts +++ b/libs/jitsu-js/src/analytics-plugin.ts @@ -71,14 +71,14 @@ function restoreTraits(storage: PersistentStorage) { if (typeof val === "string") { val = safeCall(() => JSON.parse(val), {}); } - if (typeof val !== "object" || val === null) { + if (typeof val !== "object" || val === null || Array.isArray(val)) { val = {}; } let groupVal = storage.getItem("__group_traits"); if (typeof groupVal === "string") { groupVal = safeCall(() => JSON.parse(groupVal), {}); } - if (typeof groupVal !== "object" || groupVal === null) { + if (typeof groupVal !== "object" || groupVal === null || Array.isArray(groupVal)) { groupVal = {}; } return { diff --git a/package.json b/package.json index 6407e2f25..b4be2727b 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "lint": "turbo run lint --", "release": "pnpm build && pnpm test && monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/functions --filter ./libs/jitsu-js --filter ./libs/jitsu-react --npm-tag latest --git-tag 'jitsu-js-libs-v{version}' --push-tag", "release:build-scripts": "pnpm build --filter ./cli/build-scripts && monorel --filter ./cli/build-scripts --npm-tag latest --version 0.0.4-dev.{rev}.{time} --publish --git-tag 'jitsu-build-scripts-v{version}'", - "release:canary": "monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/functions --filter ./libs/jitsu-js --filter ./libs/jitsu-react --version '1.9.2-canary.{rev}.{time}' --npm-tag canary --git-tag 'jitsu-js-libs-canary-v{version}' --push-tag" + "release:canary": "monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/functions --filter ./libs/jitsu-js --filter ./libs/jitsu-react --version '1.9.3-canary.{rev}.{time}' --npm-tag canary --git-tag 'jitsu-js-libs-canary-v{version}' --push-tag" }, "devDependencies": { "@playwright/test": "1.39.0", From 62174bf2c62bc31a28fb37b120bfb8cd64bcc420 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 24 Apr 2024 15:55:10 +0400 Subject: [PATCH 0713/1353] rotor: added timeouts for persistent store, total UDF execution timeout, adjust fetch timeout --- .../src/functions/lib/mongodb.ts | 5 +- .../core-functions/src/functions/lib/store.ts | 137 +++++++++--------- .../src/functions/udf_wrapper.ts | 27 +++- libs/juava/src/index.ts | 1 + libs/juava/src/number.ts | 23 +++ services/rotor/src/lib/functions-chain.ts | 6 +- services/rotor/src/lib/rotor.ts | 51 +------ 7 files changed, 133 insertions(+), 117 deletions(-) create mode 100644 libs/juava/src/number.ts diff --git a/libs/core-functions/src/functions/lib/mongodb.ts b/libs/core-functions/src/functions/lib/mongodb.ts index fb9e1cc95..26cfd149b 100644 --- a/libs/core-functions/src/functions/lib/mongodb.ts +++ b/libs/core-functions/src/functions/lib/mongodb.ts @@ -1,4 +1,4 @@ -import { getLog, getSingleton, requireDefined } from "juava"; +import { getLog, getSingleton, parseNumber, requireDefined } from "juava"; import { MongoClient, ObjectId } from "mongodb"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import { AnonymousEventsStore } from "@jitsu/protocols/functions"; @@ -14,12 +14,13 @@ export const mongodb = getSingleton("mongodb", createClient, { }); async function createClient() { + const mongoTimeout = parseNumber(process.env.MONGODB_TIMEOUT_MS, 1000); const mongodbURL = requireDefined(process.env.MONGODB_URL, "env MONGODB_URL is not defined"); log.atInfo().log(`Connecting to MongoDB server...`); // Create a new MongoClient - const client = new MongoClient(mongodbURL, { compressors: ["zstd"], maxPoolSize: 32 }); + const client = new MongoClient(mongodbURL, { compressors: ["zstd"], maxPoolSize: 32, socketTimeoutMS: mongoTimeout }); // Connect the client to the server (optional starting in v4.7) await client.connect(); // Establish and verify connection diff --git a/libs/core-functions/src/functions/lib/store.ts b/libs/core-functions/src/functions/lib/store.ts index 30e983945..22d2060c7 100644 --- a/libs/core-functions/src/functions/lib/store.ts +++ b/libs/core-functions/src/functions/lib/store.ts @@ -1,8 +1,9 @@ -import { SetOpts, Store, TTLStore } from "@jitsu/protocols/functions"; +import { SetOpts, TTLStore } from "@jitsu/protocols/functions"; import type { Redis } from "ioredis"; import parse from "parse-duration"; -import { MongoClient, ReadPreference, Collection, ClientSession } from "mongodb"; +import { MongoClient, ReadPreference, Collection } from "mongodb"; import { getLog } from "juava"; +import { RetryError } from "@jitsu/functions-lib"; export const defaultTTL = 60 * 60 * 24 * 31; // 31 days export const maxAllowedTTL = 2147483647; // max allowed value for ttl in redis (68years) @@ -112,81 +113,87 @@ export const createMongoStore = ( } } + function storeErr(err: any, text: string) { + if ((err.message ?? "").includes("timed out")) { + return new RetryError(text + ". Timed out."); + } + return new RetryError(text); + } + return { get: async (key: string) => { - const res = - getFromLocalCache(key) || - (await ensureCollection() - .then(c => c.findOne({ _id: key }, readOptions)) - .catch(e => { - log.atError().withCause(e).log(`Error getting key ${key} from mongo store ${namespace}`); - })); - return res ? res.value : undefined; + try { + const res = + getFromLocalCache(key) || (await ensureCollection().then(c => c.findOne({ _id: key }, readOptions))); + return res ? res.value : undefined; + } catch (err: any) { + throw storeErr(err, `Error getting key ${key} from mongo store ${namespace}`); + } }, getWithTTL: async (key: string) => { - const res = - getFromLocalCache(key) || - (await ensureCollection() - .then(c => c.findOne({ _id: key }, readOptions)) - .catch(e => { - log.atError().withCause(e).log(`Error getting key ${key} from mongo store ${namespace}`); - })); - if (!res) { - return undefined; + try { + const res = + getFromLocalCache(key) || (await ensureCollection().then(c => c.findOne({ _id: key }, readOptions))); + if (!res) { + return undefined; + } + const ttl = res.expireAt ? Math.max(Math.floor((res.expireAt.getTime() - new Date().getTime()) / 1000), 0) : -1; + return { value: res.value, ttl }; + } catch (err: any) { + throw storeErr(err, `Error getting key ${key} from mongo store ${namespace}`); } - const ttl = res.expireAt ? Math.max(Math.floor((res.expireAt.getTime() - new Date().getTime()) / 1000), 0) : -1; - return { value: res.value, ttl }; }, set: async (key: string, obj: any, opts?: SetOpts) => { - const colObj: any = { value: obj }; - const ttl = getTtlSec(opts); - if (ttl >= 0) { - const expireAt = new Date(); - expireAt.setSeconds(expireAt.getSeconds() + ttl); - colObj.expireAt = expireAt; - } + try { + const colObj: any = { value: obj }; + const ttl = getTtlSec(opts); + if (ttl >= 0) { + const expireAt = new Date(); + expireAt.setSeconds(expireAt.getSeconds() + ttl); + colObj.expireAt = expireAt; + } - await ensureCollection() - .then(c => - c.replaceOne({ _id: key }, colObj, { - upsert: true, - ...writeOptions, - }) - ) - .then(() => { - if (useLocalCache) { - localCache[key] = colObj; - } - }) - .catch(e => { - log.atError().withCause(e).log(`Error setting key ${key} from mongo store ${namespace}`); - }); + await ensureCollection() + .then(c => + c.replaceOne({ _id: key }, colObj, { + upsert: true, + ...writeOptions, + }) + ) + .then(() => { + if (useLocalCache) { + localCache[key] = colObj; + } + }); + } catch (err: any) { + throw storeErr(err, `Error setting key ${key} in mongo store ${namespace}`); + } }, del: async (key: string) => { - await ensureCollection() - .then(c => c.deleteOne({ _id: key }, writeOptions)) - .then(() => { - if (useLocalCache) { - delete localCache[key]; - } - }) - .catch(e => { - log.atError().withCause(e).log(`Error deleting key ${key} from mongo store ${namespace}`); - }); + try { + await ensureCollection() + .then(c => c.deleteOne({ _id: key }, writeOptions)) + .then(() => { + if (useLocalCache) { + delete localCache[key]; + } + }); + } catch (err: any) { + throw storeErr(err, `Error deleting key ${key} from mongo store ${namespace}`); + } }, ttl: async (key: string) => { - const res = - getFromLocalCache(key) || - (await ensureCollection() - .then(c => c.findOne({ _id: key }, readOptions)) - .catch(e => { - log.atError().withCause(e).log(`Error getting key ${key} from mongo store ${namespace}`); - })); - return res - ? res.expireAt - ? Math.max(Math.floor((res.expireAt.getTime() - new Date().getTime()) / 1000), 0) - : -1 - : -2; + try { + const res = + getFromLocalCache(key) || (await ensureCollection().then(c => c.findOne({ _id: key }, readOptions))); + return res + ? res.expireAt + ? Math.max(Math.floor((res.expireAt.getTime() - new Date().getTime()) / 1000), 0) + : -1 + : -2; + } catch (err: any) { + throw storeErr(err, `Error getting key ${key} from mongo store ${namespace}`); + } }, }; }; diff --git a/libs/core-functions/src/functions/udf_wrapper.ts b/libs/core-functions/src/functions/udf_wrapper.ts index 52b2acb1d..4e12fcea1 100644 --- a/libs/core-functions/src/functions/udf_wrapper.ts +++ b/libs/core-functions/src/functions/udf_wrapper.ts @@ -1,4 +1,4 @@ -import { getLog, LogLevel, sanitize, stopwatch } from "juava"; +import { getLog, LogLevel, parseNumber, sanitize, stopwatch } from "juava"; import { Isolate, ExternalCopy, Reference, Module, Context } from "isolated-vm"; import { EventContext, FuncReturn, Store, TTLStore, FetchOpts } from "@jitsu/protocols/functions"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; @@ -17,6 +17,7 @@ import { functionsLibCode, chainWrapperCode } from "./lib/udf-wrapper-code"; import { parseUserAgent } from "./lib/ua"; import { RetryError } from "@jitsu/functions-lib"; import { JitsuFunctionWrapper } from "./lib"; +import { clearTimeout } from "node:timers"; const log = getLog("udf-wrapper"); @@ -51,7 +52,7 @@ export const UDFWrapper = ( let context: Context; let refs: Reference[] = []; try { - isolate = new Isolate({ memoryLimit: 128 }); + isolate = new Isolate({ memoryLimit: 64 }); context = isolate.createContextSync(); const jail = context.global; @@ -204,6 +205,12 @@ function wrap(connectionId: string, isolate: Isolate, context: Context, wrapper: } const eventCopy = new ExternalCopy(event); const ctxCopy = new ExternalCopy(ctx); + const udfTimeoutMs = parseNumber(process.env.UDF_TIMEOUT_MS, 5000); + let isTimeout = false; + const timer = setTimeout(() => { + isTimeout = true; + isolate.dispose(); + }, udfTimeoutMs); try { const res = await ref.apply( undefined, @@ -230,7 +237,15 @@ function wrap(connectionId: string, isolate: Isolate, context: Context, wrapper: } catch (e: any) { //console.error(e); if (isolate.isDisposed) { - throw new Error("Isolate is disposed"); + if (isTimeout) { + throw new RetryError(`Function execution took longer than ${udfTimeoutMs}ms. Isolate is disposed`, { + drop: true, + }); + } else { + throw new RetryError(`Function execution stopped probably due to high memory usage. Isolate is disposed.`, { + drop: true, + }); + } } const m = e.message; if (m.startsWith("{")) { @@ -238,6 +253,8 @@ function wrap(connectionId: string, isolate: Isolate, context: Context, wrapper: } //log.atInfo().log(`ERROR name: ${e.name} message: ${e.message} json: ${e.stack}`); throw e; + } finally { + clearTimeout(timer); } }; return { @@ -246,7 +263,9 @@ function wrap(connectionId: string, isolate: Isolate, context: Context, wrapper: try { if (isolate) { context.release(); - isolate.dispose(); + if (!isolate.isDisposed) { + isolate.dispose(); + } log.atInfo().log(`[${connectionId}] isolate closed.`); } } catch (e) { diff --git a/libs/juava/src/index.ts b/libs/juava/src/index.ts index 15682616a..b19519e6f 100644 --- a/libs/juava/src/index.ts +++ b/libs/juava/src/index.ts @@ -11,3 +11,4 @@ export * from "./singleton"; export * from "./cache"; export * from "./sql-params"; export * from "./boolean"; +export * from "./number"; diff --git a/libs/juava/src/number.ts b/libs/juava/src/number.ts new file mode 100644 index 000000000..60a6e22f8 --- /dev/null +++ b/libs/juava/src/number.ts @@ -0,0 +1,23 @@ +export function parseNumber(val: string | undefined, defaultValue?: T): T | number { + if (val) { + const n = parseFloat(val); + if (!Number.isFinite(n)) { + return defaultValue as T | number; + } + return n; + } else { + return defaultValue as T | number; + } +} + +export function parseRequiredNumber(val: string | undefined, error?: string): number { + if (val) { + const n = parseFloat(val); + if (!Number.isFinite(n)) { + throw new Error(error || "Object is not a finite number"); + } + return n; + } else { + throw new Error(error || "Object is not defined"); + } +} diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index 665a0f867..471db1502 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -208,9 +208,9 @@ export function buildFunctionChain( const udfPipelineFunc = (chainCtx: FunctionChainContext, funcCtx: FunctionContext): JitsuFunctionWrapper => { return async (event: AnyEvent, ctx: EventContext) => { try { - return cached.wrapper.userFunction(event, ctx); + return await cached.wrapper.userFunction(event, ctx); } catch (e: any) { - if (e?.message === "Isolate is disposed") { + if ((e?.message ?? "").includes("Isolate is disposed")) { log.atError().log(`UDF for con:${connection.id} VM was disposed. Reloading`); const wrapper = UDFWrapper( connection.id, @@ -219,7 +219,7 @@ export function buildFunctionChain( udfFuncs.map(f => ({ id: f.id, name: f.name, code: f.code })) ); udfCache.set(connection.id, { wrapper, hash }); - return cached.wrapper.userFunction(event, ctx); + return wrapper.userFunction(event, ctx); } else { throw e; } diff --git a/services/rotor/src/lib/rotor.ts b/services/rotor/src/lib/rotor.ts index 252b28ee4..431ae5c1b 100644 --- a/services/rotor/src/lib/rotor.ts +++ b/services/rotor/src/lib/rotor.ts @@ -1,8 +1,7 @@ -import { getLog, requireDefined } from "juava"; +import { getLog, requireDefined, parseNumber } from "juava"; import { connectToKafka, deatLetterTopic, KafkaCredentials, retryTopic } from "./kafka-config"; import Prometheus from "prom-client"; import PQueue from "p-queue"; -const concurrency = process.env.CONCURRENCY ? parseInt(process.env.CONCURRENCY) : 10; import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; dayjs.extend(utc); @@ -23,6 +22,9 @@ const ORIGINAL_TOPIC_HEADER = "original_topic"; const FUNCTION_ID_HEADER = "function_id"; export const CONNECTION_IDS_HEADER = "connection_ids"; +const concurrency = parseNumber(process.env.CONCURRENCY, 10); +const fetchTimeoutMs = parseNumber(process.env.FETCH_TIMEOUT_MS, 1000); + export type KafkaRotorConfig = { credentials: KafkaCredentials; consumerGroupId: string; @@ -35,7 +37,8 @@ export type KafkaRotorConfig = { runFuncs: FuncChainFilter, headers?, retriesEnabled?: boolean, - retries?: number + retries?: number, + fetchTimeoutMs?: number ) => Promise; }; @@ -145,7 +148,8 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { [CONNECTION_IDS_HEADER]: connectionId, }, true, - retries + retries, + fetchTimeoutMs ) .then(() => messagesProcessed.inc({ topic, partition })) .catch(async e => { @@ -229,45 +233,6 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { await onSizeLessThan(concurrency); queue.add(async () => onMessage(message, topic, partition)); }, - // eachBatch: async ({ - // batch, - // resolveOffset, - // heartbeat, - // isRunning, - // isStale, - // commitOffsetsIfNecessary, - // uncommittedOffsets, - // }) => { - // const topic = batch.topic; - // const partition = batch.partition; - // const messages = batch.messages; - // const size = batch.messages.length; - // const batchId = `${topic}-${partition}-${messages[0].offset}-${messages[size - 1].offset}`; - // log.atInfo().log(`Processing batch ${batchId} of ${size} messages`); - // const start = dayjs().utc(); - // for (const message of messages) { - // if (isStale()) { - // log.atInfo().log(`Batch ${batchId} is stale. Stopping processing.`); - // break; - // } - // if (!isRunning()) { - // log.atInfo().log(`Batch ${batchId} is not running. Stopping processing.`); - // break; - // } - // //make sure that queue has no more entities than concurrency limit (running tasks not included) - // await onSizeLessThan(concurrency); - // await queue.add(async () => onMessage(message, topic, partition)); - // resolveOffset(message.offset); - // } - // await commitOffsetsIfNecessary(); - // const end = dayjs().utc(); - // log - // .atInfo() - // .log( - // `Processed batch ${batchId} of ${size} messages in ${end.diff(start, "millisecond")}ms`, - // JSON.stringify(uncommittedOffsets()) - // ); - // }, }); return metrics; From f9ddf79f8502165939f654300d4dbe4e8e7462f8 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 24 Apr 2024 17:14:39 +0400 Subject: [PATCH 0714/1353] package.json remove strict pnpm version --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index b4be2727b..514fc5cc6 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,6 @@ "npm": ">=1000", "node": "18.x" }, - "packageManager": "pnpm@8.2.0", "workspaces": [ "examples/*", "e2e", From 27bb6f88290f5a5690bf464e2274da55b814f556 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 24 Apr 2024 20:09:01 +0400 Subject: [PATCH 0715/1353] rotor: increase FETCH timeout --- libs/core-functions/src/functions/udf_wrapper.ts | 2 +- services/rotor/src/lib/rotor.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/core-functions/src/functions/udf_wrapper.ts b/libs/core-functions/src/functions/udf_wrapper.ts index 4e12fcea1..3c88abe80 100644 --- a/libs/core-functions/src/functions/udf_wrapper.ts +++ b/libs/core-functions/src/functions/udf_wrapper.ts @@ -52,7 +52,7 @@ export const UDFWrapper = ( let context: Context; let refs: Reference[] = []; try { - isolate = new Isolate({ memoryLimit: 64 }); + isolate = new Isolate({ memoryLimit: 128 }); context = isolate.createContextSync(); const jail = context.global; diff --git a/services/rotor/src/lib/rotor.ts b/services/rotor/src/lib/rotor.ts index 431ae5c1b..520a598aa 100644 --- a/services/rotor/src/lib/rotor.ts +++ b/services/rotor/src/lib/rotor.ts @@ -23,7 +23,7 @@ const FUNCTION_ID_HEADER = "function_id"; export const CONNECTION_IDS_HEADER = "connection_ids"; const concurrency = parseNumber(process.env.CONCURRENCY, 10); -const fetchTimeoutMs = parseNumber(process.env.FETCH_TIMEOUT_MS, 1000); +const fetchTimeoutMs = parseNumber(process.env.FETCH_TIMEOUT_MS, 2000); export type KafkaRotorConfig = { credentials: KafkaCredentials; From 3ffd9839376890875be3b84ce718b72eb5533894 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 25 Apr 2024 12:20:03 +0400 Subject: [PATCH 0716/1353] rotor: fix for reloading of disposed isolates --- .../core-functions/src/functions/lib/index.ts | 6 +---- .../src/functions/udf_wrapper.ts | 12 ++++++++- services/rotor/src/lib/functions-chain.ts | 25 ++++++++++++------- 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/libs/core-functions/src/functions/lib/index.ts b/libs/core-functions/src/functions/lib/index.ts index 4c3317772..5152527e7 100644 --- a/libs/core-functions/src/functions/lib/index.ts +++ b/libs/core-functions/src/functions/lib/index.ts @@ -321,15 +321,11 @@ export const makeFetch = event: extra?.event || {}, } : undefined; - const controller = new AbortController(); - setTimeout(() => { - controller.abort(); - }, fetchTimeoutMs); let internalInit: RequestInit = { ...init, keepalive: true, - signal: controller.signal, + signal: AbortSignal.timeout(fetchTimeoutMs), }; let fetchResult: any = undefined; try { diff --git a/libs/core-functions/src/functions/udf_wrapper.ts b/libs/core-functions/src/functions/udf_wrapper.ts index 3c88abe80..c61a10db9 100644 --- a/libs/core-functions/src/functions/udf_wrapper.ts +++ b/libs/core-functions/src/functions/udf_wrapper.ts @@ -31,6 +31,7 @@ export type logType = { export type UDFWrapperResult = { userFunction: JitsuFunctionWrapper; + isDisposed: () => boolean; close: () => void; }; @@ -52,7 +53,7 @@ export const UDFWrapper = ( let context: Context; let refs: Reference[] = []; try { - isolate = new Isolate({ memoryLimit: 128 }); + isolate = new Isolate({ memoryLimit: 64 }); context = isolate.createContextSync(); const jail = context.global; @@ -172,6 +173,9 @@ export const UDFWrapper = ( userFunction: () => { throw new Error(`Cannot compile function: ${e}`); }, + isDisposed: () => { + return false; + }, close: () => { try { if (isolate) { @@ -259,6 +263,12 @@ function wrap(connectionId: string, isolate: Isolate, context: Context, wrapper: }; return { userFunction, + isDisposed: () => { + if (isolate) { + return isolate.isDisposed; + } + return true; + }, close: () => { try { if (isolate) { diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index 471db1502..0700261e4 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -211,15 +211,22 @@ export function buildFunctionChain( return await cached.wrapper.userFunction(event, ctx); } catch (e: any) { if ((e?.message ?? "").includes("Isolate is disposed")) { - log.atError().log(`UDF for con:${connection.id} VM was disposed. Reloading`); - const wrapper = UDFWrapper( - connection.id, - chainCtx, - funcCtx, - udfFuncs.map(f => ({ id: f.id, name: f.name, code: f.code })) - ); - udfCache.set(connection.id, { wrapper, hash }); - return wrapper.userFunction(event, ctx); + // due to async nature other 'thread' could already replace this isolate. So check it + if (cached.wrapper.isDisposed()) { + log.atError().log(`UDF for con:${connection.id} VM was disposed. Reloading`); + const wrapper = UDFWrapper( + connection.id, + chainCtx, + funcCtx, + udfFuncs.map(f => ({ id: f.id, name: f.name, code: f.code })) + ); + cached = { wrapper, hash }; + udfCache.set(connection.id, cached); + return wrapper.userFunction(event, ctx); + } else { + // we have alive isolate now. try again + return await cached.wrapper.userFunction(event, ctx); + } } else { throw e; } From 8923f6e93bfbd952b6e1150b9b9e819fef1d0f62 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 25 Apr 2024 12:30:44 +0400 Subject: [PATCH 0717/1353] fix @types/node deps --- examples/react-app/package.json | 2 +- libs/functions/package.json | 2 +- libs/jitsu-js/package.json | 2 +- libs/jitsu-react/package.json | 2 +- libs/juava/package.json | 2 +- pnpm-lock.yaml | 529 ++++++++++++++++++-------------- services/rotor/package.json | 2 +- webapps/ee-api/package.json | 2 +- 8 files changed, 300 insertions(+), 243 deletions(-) diff --git a/examples/react-app/package.json b/examples/react-app/package.json index f2728d914..296cba268 100644 --- a/examples/react-app/package.json +++ b/examples/react-app/package.json @@ -4,7 +4,7 @@ "private": true, "dependencies": { "@jitsu/jitsu-react": "workspace:*", - "@types/node": "^16.18.3", + "@types/node": "^18.15.3", "lodash": "^4.17.21", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/libs/functions/package.json b/libs/functions/package.json index 3dc7b458f..9ebc6590c 100644 --- a/libs/functions/package.json +++ b/libs/functions/package.json @@ -19,7 +19,7 @@ "rollup": "^4.1.4", "@rollup/plugin-typescript": "^11.1.5", "@types/jest": "^29.1.1", - "@types/node": "^18.11.10", + "@types/node": "^18.15.3", "jest": "^29.1.2", "ts-jest": "29.0.5" }, diff --git a/libs/jitsu-js/package.json b/libs/jitsu-js/package.json index 61312621b..0792a9dad 100644 --- a/libs/jitsu-js/package.json +++ b/libs/jitsu-js/package.json @@ -31,7 +31,7 @@ "@segment/analytics-next": "^1.46.0", "@types/chalk": "^2.2.0", "@types/jest": "^29.2.0", - "@types/node": "^16.11.7", + "@types/node": "^18.15.3", "chalk": "^4.1.2", "cookie-parser": "^1.4.6", "ejs": "^3.1.8", diff --git a/libs/jitsu-react/package.json b/libs/jitsu-react/package.json index bda1c7c68..f27fccd36 100644 --- a/libs/jitsu-react/package.json +++ b/libs/jitsu-react/package.json @@ -34,7 +34,7 @@ "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^14.4.3", "@types/jest": "^29.2.3", - "@types/node": "^18.11.9", + "@types/node": "^18.15.3", "microbundle-crl": "^0.13.11", "typescript": "^5.3.3", "@babel/plugin-transform-regenerator": "^7.22.10" diff --git a/libs/juava/package.json b/libs/juava/package.json index ec6c41e9d..9d75b8007 100644 --- a/libs/juava/package.json +++ b/libs/juava/package.json @@ -17,7 +17,7 @@ }, "devDependencies": { "@types/jest": "^29.1.1", - "@types/node": "^18.11.10", + "@types/node": "^18.15.3", "jest": "^29.1.2", "ts-jest": "29.0.5" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2256afdbe..02a37ea53 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,7 +21,7 @@ importers: version: 2.8.7 ts-node: specifier: ~10.8.2 - version: 10.8.2(@types/node@18.15.11)(typescript@5.3.3) + version: 10.8.2(@types/node@20.10.8)(typescript@5.3.3) turbo: specifier: ~1.2.16 version: 1.2.16 @@ -233,7 +233,7 @@ importers: version: 5.3.2 jest: specifier: ^29.3.1 - version: 29.5.0(@types/node@18.15.11)(ts-node@10.8.2) + version: 29.5.0(@types/node@20.10.8)(ts-node@10.8.2) json5: specifier: ^2.1.0 version: 2.2.3 @@ -259,8 +259,8 @@ importers: specifier: workspace:* version: link:../../libs/jitsu-react '@types/node': - specifier: ^16.18.3 - version: 16.18.23 + specifier: ^18.15.3 + version: 18.15.11 lodash: specifier: ^4.17.21 version: 4.17.21 @@ -397,7 +397,7 @@ importers: specifier: ^29.1.1 version: 29.5.5 '@types/node': - specifier: ^18.11.10 + specifier: ^18.15.3 version: 18.15.11 jest: specifier: ^29.1.2 @@ -449,8 +449,8 @@ importers: specifier: ^29.2.0 version: 29.5.0 '@types/node': - specifier: ^16.11.7 - version: 16.18.23 + specifier: ^18.15.3 + version: 18.15.11 chalk: specifier: ^4.1.2 version: 4.1.2 @@ -465,7 +465,7 @@ importers: version: 4.18.2 jest: specifier: ^29.2.2 - version: 29.5.0(@types/node@16.18.23)(ts-node@10.8.2) + version: 29.5.0(@types/node@18.15.11)(ts-node@10.8.2) jsondiffpatch: specifier: workspace:* version: link:../jsondiffpatch @@ -519,7 +519,7 @@ importers: specifier: ^29.2.3 version: 29.5.0 '@types/node': - specifier: ^18.11.9 + specifier: ^18.15.3 version: 18.15.11 microbundle-crl: specifier: ^0.13.11 @@ -550,7 +550,7 @@ importers: version: 9.1.0(eslint@8.55.0) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) + version: 29.7.0(@types/node@20.10.8)(ts-node@10.8.2) ts-jest: specifier: ^29.1.1 version: 29.1.1(@babel/core@7.21.4)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.3.3) @@ -574,7 +574,7 @@ importers: specifier: ^29.1.1 version: 29.5.0 '@types/node': - specifier: ^18.11.10 + specifier: ^18.15.3 version: 18.15.11 jest: specifier: ^29.1.2 @@ -725,8 +725,8 @@ importers: specifier: ^1.2.2 version: 1.2.2 '@types/node': - specifier: 16.11.6 - version: 16.11.6 + specifier: ^18.15.3 + version: 18.15.11 '@types/pg': specifier: ^8.6.5 version: 8.6.6 @@ -756,7 +756,7 @@ importers: version: 6.0.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@16.11.6)(ts-node@10.9.1) + version: 29.7.0(@types/node@18.15.11)(ts-node@10.9.1) lodash: specifier: ^4.17.21 version: 4.17.21 @@ -777,10 +777,10 @@ importers: version: 9.4.2(typescript@5.3.3)(webpack@5.78.0) ts-node: specifier: ~10.9.1 - version: 10.9.1(@types/node@16.11.6)(typescript@5.3.3) + version: 10.9.1(@types/node@18.15.11)(typescript@5.3.3) ts-node-dev: specifier: ^2.0.0 - version: 2.0.0(@types/node@16.11.6)(typescript@5.3.3) + version: 2.0.0(@types/node@18.15.11)(typescript@5.3.3) typescript: specifier: ^5.3.3 version: 5.3.3 @@ -1121,8 +1121,8 @@ importers: specifier: ^0.2.10 version: 0.2.10 '@types/node': - specifier: 18.11.12 - version: 18.11.12 + specifier: ^18.15.3 + version: 18.15.11 '@types/react': specifier: 18.0.28 version: 18.0.28 @@ -1210,7 +1210,7 @@ importers: version: 4.0.2(webpack@5.88.2) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@18.11.12)(typescript@5.3.3) + version: 10.9.2(@types/node@18.15.11)(typescript@5.3.3) typescript: specifier: ^5.3.3 version: 5.3.3 @@ -4192,7 +4192,7 @@ packages: engines: {node: ^8.13.0 || >=10.10.0} dependencies: '@grpc/proto-loader': 0.7.10 - '@types/node': 18.15.11 + '@types/node': 20.10.8 dev: false /@grpc/grpc-js@1.9.3: @@ -4200,7 +4200,7 @@ packages: engines: {node: ^8.13.0 || >=10.10.0} dependencies: '@grpc/proto-loader': 0.7.10 - '@types/node': 18.15.11 + '@types/node': 20.10.8 /@grpc/proto-loader@0.7.10: resolution: {integrity: sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==} @@ -4302,7 +4302,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 18.15.11 + '@types/node': 20.10.8 chalk: 4.1.2 jest-message-util: 27.5.1 jest-util: 27.5.1 @@ -4314,7 +4314,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@jest/types': 28.1.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 chalk: 4.1.2 jest-message-util: 28.1.3 jest-util: 28.1.3 @@ -4325,7 +4325,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -4337,7 +4337,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -4357,7 +4357,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.15.11 + '@types/node': 20.10.8 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.8.1 @@ -4402,14 +4402,14 @@ packages: '@jest/test-result': 28.1.3 '@jest/transform': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.8.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 28.1.3 - jest-config: 28.1.3(@types/node@18.15.11)(ts-node@10.8.2) + jest-config: 28.1.3(@types/node@20.10.8)(ts-node@10.8.2) jest-haste-map: 28.1.3 jest-message-util: 28.1.3 jest-regex-util: 28.0.2 @@ -4445,14 +4445,14 @@ packages: '@jest/test-result': 29.5.0 '@jest/transform': 29.5.0 '@jest/types': 29.6.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.8.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.5.0 - jest-config: 29.5.0(@types/node@18.15.11)(ts-node@10.8.2) + jest-config: 29.5.0(@types/node@20.10.8)(ts-node@10.8.2) jest-haste-map: 29.5.0 jest-message-util: 29.7.0 jest-regex-util: 29.4.3 @@ -4488,14 +4488,14 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.8.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) + jest-config: 29.7.0(@types/node@20.10.8)(ts-node@10.8.2) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -4531,14 +4531,14 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.8.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.15.11)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@20.10.8)(ts-node@10.9.1) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -4574,14 +4574,14 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.8.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.15.11)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@20.10.8)(ts-node@10.9.2) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -4608,7 +4608,7 @@ packages: dependencies: '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.15.11 + '@types/node': 20.10.8 jest-mock: 27.5.1 dev: false @@ -4618,7 +4618,7 @@ packages: dependencies: '@jest/fake-timers': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 jest-mock: 28.1.3 dev: true @@ -4628,7 +4628,7 @@ packages: dependencies: '@jest/fake-timers': 29.5.0 '@jest/types': 29.6.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 jest-mock: 29.7.0 dev: true @@ -4638,7 +4638,7 @@ packages: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 jest-mock: 29.7.0 /@jest/expect-utils@28.1.3: @@ -4689,7 +4689,7 @@ packages: dependencies: '@jest/types': 27.5.1 '@sinonjs/fake-timers': 8.1.0 - '@types/node': 18.15.11 + '@types/node': 20.10.8 jest-message-util: 27.5.1 jest-mock: 27.5.1 jest-util: 27.5.1 @@ -4701,7 +4701,7 @@ packages: dependencies: '@jest/types': 28.1.3 '@sinonjs/fake-timers': 9.1.2 - '@types/node': 18.15.11 + '@types/node': 20.10.8 jest-message-util: 28.1.3 jest-mock: 28.1.3 jest-util: 28.1.3 @@ -4713,7 +4713,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.0.2 - '@types/node': 18.15.11 + '@types/node': 20.10.8 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -4725,7 +4725,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.0.2 - '@types/node': 18.15.11 + '@types/node': 20.10.8 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -4787,7 +4787,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.15.11 + '@types/node': 20.10.8 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -4826,7 +4826,7 @@ packages: '@jest/transform': 28.1.3 '@jest/types': 28.1.3 '@jridgewell/trace-mapping': 0.3.18 - '@types/node': 18.15.11 + '@types/node': 20.10.8 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -4864,7 +4864,7 @@ packages: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.18 - '@types/node': 18.15.11 + '@types/node': 20.10.8 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -4901,7 +4901,7 @@ packages: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.18 - '@types/node': 18.15.11 + '@types/node': 20.10.8 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -5133,7 +5133,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.15.11 + '@types/node': 20.10.8 '@types/yargs': 16.0.5 chalk: 4.1.2 dev: false @@ -5145,7 +5145,7 @@ packages: '@jest/schemas': 28.1.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.15.11 + '@types/node': 20.10.8 '@types/yargs': 17.0.24 chalk: 4.1.2 @@ -5156,7 +5156,7 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.15.11 + '@types/node': 20.10.8 '@types/yargs': 17.0.24 chalk: 4.1.2 dev: true @@ -5168,7 +5168,7 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.15.11 + '@types/node': 20.10.8 '@types/yargs': 17.0.24 chalk: 4.1.2 @@ -8710,12 +8710,12 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 18.15.11 + '@types/node': 20.10.8 /@types/bonjour@3.5.10: resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} dependencies: - '@types/node': 18.15.11 + '@types/node': 20.10.8 dev: false /@types/chalk@2.2.0: @@ -8728,7 +8728,7 @@ packages: /@types/cli-progress@3.11.0: resolution: {integrity: sha512-XhXhBv1R/q2ahF3BM7qT5HLzJNlIL0wbcGyZVjqOTqAybAnsLisd7gy1UCyIqpL+5Iv6XhlSyzjLCnI2sIdbCg==} dependencies: - '@types/node': 18.15.11 + '@types/node': 20.10.8 dev: true /@types/commander@2.12.2: @@ -8742,13 +8742,13 @@ packages: resolution: {integrity: sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==} dependencies: '@types/express-serve-static-core': 4.17.33 - '@types/node': 18.15.11 + '@types/node': 20.10.8 dev: false /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 18.15.11 + '@types/node': 20.10.8 /@types/cookie@0.5.1: resolution: {integrity: sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==} @@ -8757,7 +8757,7 @@ packages: /@types/cross-spawn@6.0.2: resolution: {integrity: sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==} dependencies: - '@types/node': 18.15.11 + '@types/node': 20.10.8 dev: true /@types/crypto-js@4.1.1: @@ -8819,7 +8819,7 @@ packages: /@types/docker-modem@3.0.2: resolution: {integrity: sha512-qC7prjoEYR2QEe6SmCVfB1x3rfcQtUr1n4x89+3e0wSTMQ/KYCyf+/RAA9n2tllkkNc6//JMUZePdFRiGIWfaQ==} dependencies: - '@types/node': 18.15.11 + '@types/node': 20.10.8 '@types/ssh2': 1.11.11 dev: true @@ -8827,7 +8827,7 @@ packages: resolution: {integrity: sha512-ZAX2VrkTjwjk1808T8m6vMr+CFXSLiDD+tkEkLThI+v83AfzlYQZEWfZKwFyk1PWopSXkdDunmIhrF7sxt+zWg==} dependencies: '@types/docker-modem': 3.0.2 - '@types/node': 18.15.11 + '@types/node': 20.10.8 dev: true /@types/eslint-scope@3.7.4: @@ -8857,7 +8857,7 @@ packages: /@types/express-serve-static-core@4.17.33: resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} dependencies: - '@types/node': 18.15.11 + '@types/node': 20.10.8 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 @@ -8883,19 +8883,19 @@ packages: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 18.15.11 + '@types/node': 20.10.8 dev: true /@types/glob@8.1.0: resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 18.15.11 + '@types/node': 20.10.8 /@types/graceful-fs@4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: - '@types/node': 18.15.11 + '@types/node': 20.10.8 /@types/html-minifier-terser@6.1.0: resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} @@ -8904,7 +8904,7 @@ packages: /@types/http-proxy@1.17.10: resolution: {integrity: sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g==} dependencies: - '@types/node': 18.15.11 + '@types/node': 20.10.8 dev: false /@types/inquirer@9.0.3: @@ -8968,7 +8968,7 @@ packages: /@types/jsonwebtoken@9.0.3: resolution: {integrity: sha512-b0jGiOgHtZ2jqdPgPnP6WLCXZk1T8p06A/vPGzUvxpFGgKMbjXJDjC5m52ErqBnIuWZFgGoIJyRdeG5AyreJjA==} dependencies: - '@types/node': 18.15.11 + '@types/node': 20.10.8 /@types/linkify-it@3.0.2: resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==} @@ -9027,7 +9027,7 @@ packages: /@types/node-fetch@2.6.11: resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} dependencies: - '@types/node': 18.15.11 + '@types/node': 20.10.8 form-data: 4.0.0 dev: false @@ -9038,16 +9038,6 @@ packages: /@types/node@15.14.9: resolution: {integrity: sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==} - /@types/node@16.11.6: - resolution: {integrity: sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==} - dev: true - - /@types/node@16.18.23: - resolution: {integrity: sha512-XAMpaw1s1+6zM+jn2tmw8MyaRDIJfXxqmIQIS0HfoGYPuf7dUWeiUKopwq13KFX9lEp1+THGtlaaYx39Nxr58g==} - - /@types/node@18.11.12: - resolution: {integrity: sha512-FgD3NtTAKvyMmD44T07zz2fEf+OKwutgBCEVM8GcvMGVGaDktiLNTDvPwC/LUe3PinMW+X6CuLOF2Ui1mAlSXg==} - /@types/node@18.15.11: resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} @@ -9055,12 +9045,11 @@ packages: resolution: {integrity: sha512-f8nQs3cLxbAFc00vEU59yf9UyGUftkPaLGfvbVOIDdx2i1b8epBqj2aNGyP19fiyXWvlmZ7qC1XLjAzw/OKIeA==} dependencies: undici-types: 5.26.5 - dev: true /@types/nodemailer@6.4.7: resolution: {integrity: sha512-f5qCBGAn/f0qtRcd4SEn88c8Fp3Swct1731X4ryPKqS61/A3LmmzN8zaEz7hneJvpjFbUUgY7lru/B/7ODTazg==} dependencies: - '@types/node': 18.15.11 + '@types/node': 20.10.8 dev: true /@types/normalize-package-data@2.4.1: @@ -9072,7 +9061,7 @@ packages: /@types/pg-cursor@2.7.2: resolution: {integrity: sha512-m3xT8bVFCvx98LuzbvXyuCdT/Hjdd/v8ml4jL4K1QF70Y8clOfCFdgoaEB1FWdcSwcpoFYZTJQaMD9/GQ27efQ==} dependencies: - '@types/node': 18.15.11 + '@types/node': 20.10.8 '@types/pg': 8.6.6 dev: false @@ -9097,7 +9086,7 @@ packages: /@types/pg@8.6.6: resolution: {integrity: sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==} dependencies: - '@types/node': 18.15.11 + '@types/node': 20.10.8 pg-protocol: 1.6.0 pg-types: 2.2.0 @@ -9131,19 +9120,19 @@ packages: /@types/readdir-glob@1.1.1: resolution: {integrity: sha512-ImM6TmoF8bgOwvehGviEj3tRdRBbQujr1N+0ypaln/GWjaerOB26jb93vsRHmdMtvVQZQebOlqt2HROark87mQ==} dependencies: - '@types/node': 18.15.11 + '@types/node': 20.10.8 dev: true /@types/resolve@0.0.8: resolution: {integrity: sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==} dependencies: - '@types/node': 18.15.11 + '@types/node': 20.10.8 dev: true /@types/resolve@1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: - '@types/node': 18.15.11 + '@types/node': 20.10.8 dev: false /@types/resolve@1.20.2: @@ -9159,7 +9148,7 @@ packages: requiresBuild: true dependencies: '@types/glob': 8.1.0 - '@types/node': 18.15.11 + '@types/node': 20.10.8 dev: false optional: true @@ -9179,24 +9168,24 @@ packages: resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} dependencies: '@types/mime': 3.0.1 - '@types/node': 18.15.11 + '@types/node': 20.10.8 /@types/sockjs@0.3.33: resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} dependencies: - '@types/node': 18.15.11 + '@types/node': 20.10.8 dev: false /@types/ssh2-streams@0.1.9: resolution: {integrity: sha512-I2J9jKqfmvXLR5GomDiCoHrEJ58hAOmFrekfFqmCFd+A6gaEStvWnPykoWUwld1PNg4G5ag1LwdA+Lz1doRJqg==} dependencies: - '@types/node': 18.15.11 + '@types/node': 20.10.8 dev: true /@types/ssh2@0.5.52: resolution: {integrity: sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==} dependencies: - '@types/node': 18.15.11 + '@types/node': 20.10.8 '@types/ssh2-streams': 0.1.9 dev: true @@ -9227,7 +9216,7 @@ packages: /@types/through@0.0.31: resolution: {integrity: sha512-LpKpmb7FGevYgXnBXYs6HWnmiFyVG07Pt1cnbgM1IhEacITTiUaBXXvOR3Y50ksaJWGSfhbEvQFivQEFGCC55w==} dependencies: - '@types/node': 18.15.11 + '@types/node': 20.10.8 dev: true /@types/trusted-types@2.0.3: @@ -9238,7 +9227,7 @@ packages: resolution: {integrity: sha512-4UqPv+2567NhMQuMLdKAyK4yzrfCqwaTt6bLhHEs8PFcxbHILsrxaY63n4wgE/BRLDWDQeI+WcTmkXKExh9hQg==} dependencies: '@types/expect': 1.20.4 - '@types/node': 18.15.11 + '@types/node': 20.10.8 /@types/web@0.0.69: resolution: {integrity: sha512-0CqMxeJ+ETljejsVQ5U6gV75C9zz9nmCBXHYqdfnVmWp54VfoJSxUgeO6NI+ezgBl0JQsSiZCs2pkCCT9ERhbA==} @@ -9251,7 +9240,7 @@ packages: /@types/webpack@5.28.1(webpack-cli@5.0.1): resolution: {integrity: sha512-qw1MqGZclCoBrpiSe/hokSgQM/su8Ocpl3L/YHE0L6moyaypg4+5F7Uzq7NgaPKPxUxUbQ4fLPLpDWdR27bCZw==} dependencies: - '@types/node': 18.15.11 + '@types/node': 20.10.8 tapable: 2.2.1 webpack: 5.88.2(webpack-cli@5.0.1) transitivePeerDependencies: @@ -9283,7 +9272,7 @@ packages: /@types/ws@8.5.4: resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} dependencies: - '@types/node': 18.15.11 + '@types/node': 20.10.8 dev: false /@types/yargs-parser@21.0.0: @@ -12100,7 +12089,7 @@ packages: readable-stream: 3.6.2 dev: true - /create-jest@29.7.0(@types/node@16.11.6)(ts-node@10.9.1): + /create-jest@29.7.0(@types/node@18.15.11)(ts-node@10.8.2): resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -12109,7 +12098,7 @@ packages: chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@16.11.6)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -12119,7 +12108,7 @@ packages: - ts-node dev: true - /create-jest@29.7.0(@types/node@16.18.23)(ts-node@10.8.2): + /create-jest@29.7.0(@types/node@18.15.11)(ts-node@10.9.1): resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -12128,7 +12117,7 @@ packages: chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@16.18.23)(ts-node@10.8.2) + jest-config: 29.7.0(@types/node@18.15.11)(ts-node@10.9.1) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -12138,7 +12127,7 @@ packages: - ts-node dev: true - /create-jest@29.7.0(@types/node@18.15.11)(ts-node@10.8.2): + /create-jest@29.7.0(@types/node@18.15.11)(ts-node@10.9.2): resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -12147,7 +12136,7 @@ packages: chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) + jest-config: 29.7.0(@types/node@18.15.11)(ts-node@10.9.2) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -12155,9 +12144,8 @@ packages: - babel-plugin-macros - supports-color - ts-node - dev: true - /create-jest@29.7.0(@types/node@18.15.11)(ts-node@10.9.2): + /create-jest@29.7.0(@types/node@20.10.8)(ts-node@10.8.2): resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -12166,7 +12154,7 @@ packages: chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.15.11)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@20.10.8)(ts-node@10.8.2) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -12174,6 +12162,7 @@ packages: - babel-plugin-macros - supports-color - ts-node + dev: true /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -14842,7 +14831,7 @@ packages: '@fastify/busboy': 1.2.1 '@firebase/database-compat': 0.3.4 '@firebase/database-types': 0.10.4 - '@types/node': 18.15.11 + '@types/node': 20.10.8 jsonwebtoken: 9.0.2 jwks-rsa: 3.0.1 node-forge: 1.3.1 @@ -16738,7 +16727,7 @@ packages: '@jest/environment': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.15.11 + '@types/node': 20.10.8 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -16766,7 +16755,7 @@ packages: '@jest/expect': 28.1.3 '@jest/test-result': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -16793,7 +16782,7 @@ packages: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.1 @@ -16871,7 +16860,7 @@ packages: - ts-node dev: true - /jest-cli@29.7.0(@types/node@16.11.6)(ts-node@10.9.1): + /jest-cli@29.7.0(@types/node@18.15.11)(ts-node@10.8.2): resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -16881,14 +16870,14 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.7.0(ts-node@10.9.1) + '@jest/core': 29.7.0(ts-node@10.8.2) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@16.11.6)(ts-node@10.9.1) + create-jest: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@16.11.6)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -16899,7 +16888,7 @@ packages: - ts-node dev: true - /jest-cli@29.7.0(@types/node@16.18.23)(ts-node@10.8.2): + /jest-cli@29.7.0(@types/node@18.15.11)(ts-node@10.9.1): resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -16909,14 +16898,14 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.7.0(ts-node@10.8.2) + '@jest/core': 29.7.0(ts-node@10.9.1) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@16.18.23)(ts-node@10.8.2) + create-jest: 29.7.0(@types/node@18.15.11)(ts-node@10.9.1) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@16.18.23)(ts-node@10.8.2) + jest-config: 29.7.0(@types/node@18.15.11)(ts-node@10.9.1) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -16927,7 +16916,7 @@ packages: - ts-node dev: true - /jest-cli@29.7.0(@types/node@18.15.11)(ts-node@10.8.2): + /jest-cli@29.7.0(@types/node@18.15.11)(ts-node@10.9.2): resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -16937,14 +16926,14 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.7.0(ts-node@10.8.2) + '@jest/core': 29.7.0(ts-node@10.9.2) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) + create-jest: 29.7.0(@types/node@18.15.11)(ts-node@10.9.2) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) + jest-config: 29.7.0(@types/node@18.15.11)(ts-node@10.9.2) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -16953,9 +16942,8 @@ packages: - babel-plugin-macros - supports-color - ts-node - dev: true - /jest-cli@29.7.0(@types/node@18.15.11)(ts-node@10.9.2): + /jest-cli@29.7.0(@types/node@20.10.8)(ts-node@10.8.2): resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -16965,14 +16953,14 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/core': 29.7.0(ts-node@10.8.2) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.15.11)(ts-node@10.9.2) + create-jest: 29.7.0(@types/node@20.10.8)(ts-node@10.8.2) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@18.15.11)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@20.10.8)(ts-node@10.8.2) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -16981,6 +16969,7 @@ packages: - babel-plugin-macros - supports-color - ts-node + dev: true /jest-config@27.5.1(ts-node@10.8.2): resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} @@ -17015,7 +17004,7 @@ packages: pretty-format: 27.5.1 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.8.2(@types/node@18.15.11)(typescript@5.3.3) + ts-node: 10.8.2(@types/node@20.10.8)(typescript@5.3.3) transitivePeerDependencies: - bufferutil - canvas @@ -17063,7 +17052,47 @@ packages: - supports-color dev: true - /jest-config@29.5.0(@types/node@18.15.11)(ts-node@10.8.2): + /jest-config@28.1.3(@types/node@20.10.8)(ts-node@10.8.2): + resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.21.4 + '@jest/test-sequencer': 28.1.3 + '@jest/types': 28.1.3 + '@types/node': 20.10.8 + babel-jest: 28.1.3(@babel/core@7.21.4) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 28.1.3 + jest-environment-node: 28.1.3 + jest-get-type: 28.0.2 + jest-regex-util: 28.0.2 + jest-resolve: 28.1.3 + jest-runner: 28.1.3 + jest-util: 28.1.3 + jest-validate: 28.1.3 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 28.1.3 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.8.2(@types/node@18.15.11)(typescript@5.3.3) + transitivePeerDependencies: + - supports-color + dev: true + + /jest-config@29.5.0(@types/node@20.10.8)(ts-node@10.8.2): resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -17078,7 +17107,7 @@ packages: '@babel/core': 7.21.4 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 babel-jest: 29.7.0(@babel/core@7.21.4) chalk: 4.1.2 ci-info: 3.8.0 @@ -17098,13 +17127,13 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.8.2(@types/node@18.15.11)(typescript@5.3.3) + ts-node: 10.8.2(@types/node@20.10.8)(typescript@5.3.3) transitivePeerDependencies: - babel-plugin-macros - supports-color dev: true - /jest-config@29.7.0(@types/node@16.11.6)(ts-node@10.9.1): + /jest-config@29.7.0(@types/node@18.15.11)(ts-node@10.8.2): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -17119,7 +17148,7 @@ packages: '@babel/core': 7.21.4 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 16.11.6 + '@types/node': 18.15.11 babel-jest: 29.7.0(@babel/core@7.21.4) chalk: 4.1.2 ci-info: 3.8.0 @@ -17139,13 +17168,13 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1(@types/node@16.11.6)(typescript@5.3.3) + ts-node: 10.8.2(@types/node@20.10.8)(typescript@5.3.3) transitivePeerDependencies: - babel-plugin-macros - supports-color dev: true - /jest-config@29.7.0(@types/node@16.18.23)(ts-node@10.8.2): + /jest-config@29.7.0(@types/node@18.15.11)(ts-node@10.9.1): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -17160,7 +17189,7 @@ packages: '@babel/core': 7.21.4 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 16.18.23 + '@types/node': 18.15.11 babel-jest: 29.7.0(@babel/core@7.21.4) chalk: 4.1.2 ci-info: 3.8.0 @@ -17180,13 +17209,13 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.8.2(@types/node@18.15.11)(typescript@5.3.3) + ts-node: 10.9.1(@types/node@18.15.11)(typescript@5.3.3) transitivePeerDependencies: - babel-plugin-macros - supports-color dev: true - /jest-config@29.7.0(@types/node@18.15.11)(ts-node@10.8.2): + /jest-config@29.7.0(@types/node@18.15.11)(ts-node@10.9.2): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -17221,13 +17250,53 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.8.2(@types/node@18.15.11)(typescript@5.3.3) + ts-node: 10.9.2(@types/node@18.15.11)(typescript@5.3.3) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + /jest-config@29.7.0(@types/node@20.10.8)(ts-node@10.8.2): + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.21.4 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.10.8 + babel-jest: 29.7.0(@babel/core@7.21.4) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.8.2(@types/node@20.10.8)(typescript@5.3.3) transitivePeerDependencies: - babel-plugin-macros - supports-color dev: true - /jest-config@29.7.0(@types/node@18.15.11)(ts-node@10.9.1): + /jest-config@29.7.0(@types/node@20.10.8)(ts-node@10.9.1): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -17242,7 +17311,7 @@ packages: '@babel/core': 7.21.4 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 babel-jest: 29.7.0(@babel/core@7.21.4) chalk: 4.1.2 ci-info: 3.8.0 @@ -17262,13 +17331,13 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1(@types/node@16.11.6)(typescript@5.3.3) + ts-node: 10.9.1(@types/node@18.15.11)(typescript@5.3.3) transitivePeerDependencies: - babel-plugin-macros - supports-color dev: true - /jest-config@29.7.0(@types/node@18.15.11)(ts-node@10.9.2): + /jest-config@29.7.0(@types/node@20.10.8)(ts-node@10.9.2): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -17283,7 +17352,7 @@ packages: '@babel/core': 7.21.4 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 babel-jest: 29.7.0(@babel/core@7.21.4) chalk: 4.1.2 ci-info: 3.8.0 @@ -17396,7 +17465,7 @@ packages: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.15.11 + '@types/node': 20.10.8 jest-mock: 27.5.1 jest-util: 27.5.1 jsdom: 16.7.0 @@ -17414,7 +17483,7 @@ packages: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.15.11 + '@types/node': 20.10.8 jest-mock: 27.5.1 jest-util: 27.5.1 dev: false @@ -17426,7 +17495,7 @@ packages: '@jest/environment': 28.1.3 '@jest/fake-timers': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 jest-mock: 28.1.3 jest-util: 28.1.3 dev: true @@ -17438,7 +17507,7 @@ packages: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -17462,7 +17531,7 @@ packages: dependencies: '@jest/types': 27.5.1 '@types/graceful-fs': 4.1.6 - '@types/node': 18.15.11 + '@types/node': 20.10.8 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -17482,7 +17551,7 @@ packages: dependencies: '@jest/types': 28.1.3 '@types/graceful-fs': 4.1.6 - '@types/node': 18.15.11 + '@types/node': 20.10.8 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -17501,7 +17570,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.6 - '@types/node': 18.15.11 + '@types/node': 20.10.8 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -17520,7 +17589,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.6 - '@types/node': 18.15.11 + '@types/node': 20.10.8 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -17540,7 +17609,7 @@ packages: '@jest/source-map': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.15.11 + '@types/node': 20.10.8 chalk: 4.1.2 co: 4.6.0 expect: 27.5.1 @@ -17657,7 +17726,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 18.15.11 + '@types/node': 20.10.8 dev: false /jest-mock@28.1.3: @@ -17665,7 +17734,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@jest/types': 28.1.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 dev: true /jest-mock@29.5.0: @@ -17673,7 +17742,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 jest-util: 29.7.0 dev: true @@ -17682,7 +17751,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 jest-util: 29.7.0 /jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): @@ -17859,7 +17928,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.15.11 + '@types/node': 20.10.8 chalk: 4.1.2 emittery: 0.8.1 graceful-fs: 4.2.11 @@ -17891,7 +17960,7 @@ packages: '@jest/test-result': 28.1.3 '@jest/transform': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 chalk: 4.1.2 emittery: 0.10.2 graceful-fs: 4.2.11 @@ -17920,7 +17989,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -17949,7 +18018,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -18039,7 +18108,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 chalk: 4.1.2 cjs-module-lexer: 1.2.2 collect-v8-coverage: 1.0.1 @@ -18069,7 +18138,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 chalk: 4.1.2 cjs-module-lexer: 1.2.2 collect-v8-coverage: 1.0.1 @@ -18091,7 +18160,7 @@ packages: resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@types/node': 18.15.11 + '@types/node': 20.10.8 graceful-fs: 4.2.11 dev: false @@ -18219,7 +18288,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 18.15.11 + '@types/node': 20.10.8 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -18231,7 +18300,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@jest/types': 28.1.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -18242,7 +18311,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -18254,7 +18323,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -18329,7 +18398,7 @@ packages: dependencies: '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.15.11 + '@types/node': 20.10.8 ansi-escapes: 4.3.2 chalk: 4.1.2 jest-util: 27.5.1 @@ -18342,7 +18411,7 @@ packages: dependencies: '@jest/test-result': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.10.2 @@ -18355,7 +18424,7 @@ packages: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -18369,7 +18438,7 @@ packages: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.15.11 + '@types/node': 20.10.8 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -18388,7 +18457,7 @@ packages: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.15.11 + '@types/node': 20.10.8 merge-stream: 2.0.0 supports-color: 7.2.0 dev: false @@ -18397,7 +18466,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.15.11 + '@types/node': 20.10.8 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -18405,7 +18474,7 @@ packages: resolution: {integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - '@types/node': 18.15.11 + '@types/node': 20.10.8 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -18413,7 +18482,7 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 18.15.11 + '@types/node': 20.10.8 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -18459,7 +18528,7 @@ packages: - ts-node dev: true - /jest@29.5.0(@types/node@16.18.23)(ts-node@10.8.2): + /jest@29.5.0(@types/node@18.15.11)(ts-node@10.8.2): resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -18472,7 +18541,7 @@ packages: '@jest/core': 29.5.0(ts-node@10.8.2) '@jest/types': 29.5.0 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@16.18.23)(ts-node@10.8.2) + jest-cli: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -18480,7 +18549,7 @@ packages: - ts-node dev: true - /jest@29.5.0(@types/node@18.15.11)(ts-node@10.8.2): + /jest@29.5.0(@types/node@20.10.8)(ts-node@10.8.2): resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -18493,7 +18562,7 @@ packages: '@jest/core': 29.5.0(ts-node@10.8.2) '@jest/types': 29.5.0 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) + jest-cli: 29.7.0(@types/node@20.10.8)(ts-node@10.8.2) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -18501,7 +18570,7 @@ packages: - ts-node dev: true - /jest@29.7.0(@types/node@16.11.6)(ts-node@10.9.1): + /jest@29.7.0(@types/node@18.15.11)(ts-node@10.8.2): resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -18511,10 +18580,10 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.7.0(ts-node@10.9.1) + '@jest/core': 29.7.0(ts-node@10.8.2) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@16.11.6)(ts-node@10.9.1) + jest-cli: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -18522,7 +18591,7 @@ packages: - ts-node dev: true - /jest@29.7.0(@types/node@18.15.11)(ts-node@10.8.2): + /jest@29.7.0(@types/node@18.15.11)(ts-node@10.9.1): resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -18532,10 +18601,10 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.7.0(ts-node@10.8.2) + '@jest/core': 29.7.0(ts-node@10.9.1) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) + jest-cli: 29.7.0(@types/node@18.15.11)(ts-node@10.9.1) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -18564,6 +18633,27 @@ packages: - ts-node dev: true + /jest@29.7.0(@types/node@20.10.8)(ts-node@10.8.2): + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.7.0(ts-node@10.8.2) + '@jest/types': 29.6.3 + import-local: 3.1.0 + jest-cli: 29.7.0(@types/node@20.10.8)(ts-node@10.8.2) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + /jiti@1.18.2: resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==} hasBin: true @@ -21819,7 +21909,7 @@ packages: dependencies: lilconfig: 2.1.0 postcss: 8.4.31 - ts-node: 10.8.2(@types/node@18.15.11)(typescript@5.3.3) + ts-node: 10.8.2(@types/node@20.10.8)(typescript@5.3.3) yaml: 1.10.2 dev: true @@ -22875,7 +22965,7 @@ packages: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 18.15.11 + '@types/node': 20.10.8 long: 5.2.1 dev: false optional: true @@ -22895,7 +22985,7 @@ packages: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 18.15.11 + '@types/node': 20.10.8 long: 5.2.1 dev: false @@ -22914,7 +23004,7 @@ packages: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 18.15.11 + '@types/node': 20.10.8 long: 5.2.1 /proxy-addr@2.0.7: @@ -24398,7 +24488,7 @@ packages: hasBin: true dependencies: '@types/estree': 1.0.1 - '@types/node': 18.15.11 + '@types/node': 20.10.8 acorn: 7.4.1 dev: true @@ -25362,7 +25452,7 @@ packages: resolution: {integrity: sha512-OUA32uhNoSoM6wOodyFbV+3IBCoO140uzdXmBArQ0S88D4EbH91xl2v+Ml1sKalcFKUBadHLeHfU/p9AbsOfGw==} engines: {node: '>=12.*'} dependencies: - '@types/node': 18.15.11 + '@types/node': 20.10.8 qs: 6.11.1 /strnum@1.0.5: @@ -26030,7 +26120,7 @@ packages: '@babel/core': 7.21.4 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.5.0(@types/node@18.15.11)(ts-node@10.8.2) + jest: 29.5.0(@types/node@20.10.8)(ts-node@10.8.2) jest-util: 29.5.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -26099,7 +26189,7 @@ packages: '@jest/types': 29.6.3 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@16.11.6)(ts-node@10.9.1) + jest: 29.7.0(@types/node@18.15.11)(ts-node@10.9.1) jest-util: 29.5.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -26153,7 +26243,7 @@ packages: code-block-writer: 11.0.3 dev: true - /ts-node-dev@2.0.0(@types/node@16.11.6)(typescript@5.3.3): + /ts-node-dev@2.0.0(@types/node@18.15.11)(typescript@5.3.3): resolution: {integrity: sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==} engines: {node: '>=0.8.0'} hasBin: true @@ -26172,7 +26262,7 @@ packages: rimraf: 2.7.1 source-map-support: 0.5.21 tree-kill: 1.2.2 - ts-node: 10.9.2(@types/node@16.11.6)(typescript@5.3.3) + ts-node: 10.9.2(@types/node@18.15.11)(typescript@5.3.3) tsconfig: 7.0.0 typescript: 5.3.3 transitivePeerDependencies: @@ -26211,39 +26301,8 @@ packages: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - /ts-node@10.9.1(@types/node@14.18.33)(typescript@4.9.5): - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.3 - '@types/node': 14.18.33 - acorn: 8.8.2 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 4.9.5 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - dev: true - - /ts-node@10.9.1(@types/node@16.11.6)(typescript@5.3.3): - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + /ts-node@10.8.2(@types/node@20.10.8)(typescript@5.3.3): + resolution: {integrity: sha512-LYdGnoGddf1D6v8REPtIH+5iq/gTDuZqv2/UJUU7tKjuEU8xVZorBM+buCGNjj+pGEud+sOoM4CX3/YzINpENA==} hasBin: true peerDependencies: '@swc/core': '>=1.2.50' @@ -26261,7 +26320,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 16.11.6 + '@types/node': 20.10.8 acorn: 8.8.2 acorn-walk: 8.2.0 arg: 4.1.3 @@ -26271,10 +26330,9 @@ packages: typescript: 5.3.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - dev: true - /ts-node@10.9.2(@types/node@16.11.6)(typescript@5.3.3): - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + /ts-node@10.9.1(@types/node@14.18.33)(typescript@4.9.5): + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: '@swc/core': '>=1.2.50' @@ -26292,20 +26350,20 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 16.11.6 + '@types/node': 14.18.33 acorn: 8.8.2 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.3.3 + typescript: 4.9.5 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true - /ts-node@10.9.2(@types/node@18.11.12)(typescript@5.3.3): - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + /ts-node@10.9.1(@types/node@18.15.11)(typescript@5.3.3): + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: '@swc/core': '>=1.2.50' @@ -26323,7 +26381,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 18.11.12 + '@types/node': 18.15.11 acorn: 8.8.2 acorn-walk: 8.2.0 arg: 4.1.3 @@ -26677,7 +26735,6 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - dev: true /undici@5.23.0: resolution: {integrity: sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==} @@ -28028,7 +28085,7 @@ packages: resolution: {integrity: sha512-CKYrptAvjMhxQTuC7J42UXdmgKc73piuZHNGg0dya6qYZzPmaH31fXxuFv7B9QGAWX8tBmFlDJo9aXne7bmx3g==} requiresBuild: true dependencies: - '@types/node': 18.15.11 + '@types/node': 20.10.8 node-addon-api: 2.0.2 prebuild-install: 5.3.6 dev: false diff --git a/services/rotor/package.json b/services/rotor/package.json index 4cca39777..a799afaac 100644 --- a/services/rotor/package.json +++ b/services/rotor/package.json @@ -63,7 +63,7 @@ "@types/jest": "^29.5.11", "@types/lodash": "^4.14.200", "@types/minimist": "^1.2.2", - "@types/node": "16.11.6", + "@types/node": "^18.15.3", "@types/pg": "^8.6.5", "@types/web": "0.0.69", "@types/webpack": "^5.28.0", diff --git a/webapps/ee-api/package.json b/webapps/ee-api/package.json index 974397def..1f79d3a1f 100644 --- a/webapps/ee-api/package.json +++ b/webapps/ee-api/package.json @@ -11,7 +11,7 @@ "dependencies": { "@aws-sdk/client-s3": "^3.418.0", "@clickhouse/client": "^0.2.10", - "@types/node": "18.11.12", + "@types/node": "^18.15.3", "@types/react": "18.0.28", "@types/react-dom": "18.0.11", "crypto-js": "^4.1.1", From e31b16ea882dc0e1918991d7bc277b7710c8f588 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 26 Apr 2024 12:45:58 +0400 Subject: [PATCH 0718/1353] console: event-log-trim workaround --- libs/core-functions/src/functions/lib/index.ts | 2 +- webapps/console/pages/api/admin/events-log-trim.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/core-functions/src/functions/lib/index.ts b/libs/core-functions/src/functions/lib/index.ts index 5152527e7..0c05cbce2 100644 --- a/libs/core-functions/src/functions/lib/index.ts +++ b/libs/core-functions/src/functions/lib/index.ts @@ -331,7 +331,7 @@ export const makeFetch = try { fetchResult = await fetch(url, internalInit); } catch (err: any) { - if (err.name === "AbortError") { + if (err.name === "TimeoutError") { err = newError(`Fetch request exceeded timeout ${fetchTimeoutMs}ms and was aborted`, err); } if (logEnabled) { diff --git a/webapps/console/pages/api/admin/events-log-trim.ts b/webapps/console/pages/api/admin/events-log-trim.ts index 7edcfccac..fa4848cc1 100644 --- a/webapps/console/pages/api/admin/events-log-trim.ts +++ b/webapps/console/pages/api/admin/events-log-trim.ts @@ -23,7 +23,7 @@ export default createRoute() timestamp, row_number() OVER (PARTITION BY actorId, type ORDER BY timestamp desc) rn from ${metricsSchema}.events_log - where xor(level = 'error', {withoutErrors:UInt8})) rows + where timestamp > now() - interval 1 day and xor(level = 'error', {withoutErrors:UInt8})) rows where rn = {eventsLogSize:UInt32}`; const deleteQuery: string = `delete from ${metricsSchema}.events_log From 1103c5bbf0fa3d6542f735a3bb3d3a2ca3906746 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 26 Apr 2024 13:10:02 +0400 Subject: [PATCH 0719/1353] console: event-log-trim workaround --- webapps/console/pages/api/admin/events-log-trim.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/webapps/console/pages/api/admin/events-log-trim.ts b/webapps/console/pages/api/admin/events-log-trim.ts index fa4848cc1..d355f506f 100644 --- a/webapps/console/pages/api/admin/events-log-trim.ts +++ b/webapps/console/pages/api/admin/events-log-trim.ts @@ -71,6 +71,7 @@ export default createRoute() timestamp: timestamp, }, clickhouse_settings: { + wait_end_of_query: 0, enable_lightweight_delete: 1, }, }); From f5793b8971d5d3007bbb1c57f90a3e1e869e0856 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 26 Apr 2024 13:24:06 +0400 Subject: [PATCH 0720/1353] console: event-log-trim workaround --- .../pages/api/admin/events-log-trim.ts | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/webapps/console/pages/api/admin/events-log-trim.ts b/webapps/console/pages/api/admin/events-log-trim.ts index d355f506f..0448595cf 100644 --- a/webapps/console/pages/api/admin/events-log-trim.ts +++ b/webapps/console/pages/api/admin/events-log-trim.ts @@ -38,18 +38,24 @@ export default createRoute() const result: any[] = []; for (const trimErrors of [false, true]) { const sw = stopwatch(); - const chResult = (await ( - await clickhouse.query({ - query: statQuery, - query_params: { - eventsLogSize: eventsLogSize, - withoutErrors: !trimErrors, - }, - clickhouse_settings: { - wait_end_of_query: 1, - }, - }) - ).json()) as any; + let chResult: any = {}; + try { + chResult = (await ( + await clickhouse.query({ + query: statQuery, + query_params: { + eventsLogSize: eventsLogSize, + withoutErrors: !trimErrors, + }, + clickhouse_settings: { + wait_end_of_query: 1, + }, + }) + ).json()) as any; + } catch (e) { + log.atError().withCause(e).log(`Failed to load events log stats. (trim errors: ${trimErrors})`); + throw e; + } log .atInfo() .log( @@ -106,5 +112,5 @@ export default createRoute() }) .toNextApiHandler(); export const config = { - maxDuration: 300, //5 mins + maxDuration: 600, //10 mins }; From e2198579667c8dab34034db59225430c059f56de Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 26 Apr 2024 18:53:32 +0400 Subject: [PATCH 0721/1353] console: event-log-trim optimization --- .../pages/api/admin/events-log-trim.ts | 140 +++++++++++------- 1 file changed, 85 insertions(+), 55 deletions(-) diff --git a/webapps/console/pages/api/admin/events-log-trim.ts b/webapps/console/pages/api/admin/events-log-trim.ts index 0448595cf..8f7ce1e3f 100644 --- a/webapps/console/pages/api/admin/events-log-trim.ts +++ b/webapps/console/pages/api/admin/events-log-trim.ts @@ -17,85 +17,114 @@ export default createRoute() process.env.CLICKHOUSE_METRICS_SCHEMA || process.env.CLICKHOUSE_DATABASE || "newjitsu_metrics"; const clickhouseCluster = process.env.CLICKHOUSE_CLUSTER || "jitsu_cluster"; const eventsLogSize = process.env.EVENTS_LOG_SIZE ? parseInt(process.env.EVENTS_LOG_SIZE) : 200000; - const statQuery: string = `select actorId, type, timestamp - from (select actorId, - type, - timestamp, - row_number() OVER (PARTITION BY actorId, type ORDER BY timestamp desc) rn - from ${metricsSchema}.events_log - where timestamp > now() - interval 1 day and xor(level = 'error', {withoutErrors:UInt8})) rows - where rn = {eventsLogSize:UInt32}`; + // trim logs to eventsLogSize only after exceeding threshold + const thresholdSize = Math.floor(eventsLogSize * 1.25); + const actorsQuery: string = `select actorId, type, count(*) from ${metricsSchema}.events_log + group by actorId, type + having count(*) > ${thresholdSize}`; + const statQuery: string = `select timestamp + from ${metricsSchema}.events_log + where actorId = {actorId:String} and type = {type:String} and xor(level = 'error', {withoutErrors:UInt8}) + order by timestamp desc LIMIT 1 OFFSET ${eventsLogSize}`; const deleteQuery: string = `delete from ${metricsSchema}.events_log where actorId = {actorId:String} and - type = {type :String} + type = {type:String} and xor(level = 'error', {withoutErrors:UInt8}) and timestamp < {timestamp :DateTime64};`; const dropPartitionQuery: string = `alter table ${metricsSchema}.events_log on cluster ${clickhouseCluster} drop partition {partition:String}`; const result: any[] = []; + const sw = stopwatch(); + let actorsResult: any = {}; + try { + actorsResult = (await ( + await clickhouse.query({ + query: actorsQuery, + clickhouse_settings: { + wait_end_of_query: 1, + }, + }) + ).json()) as any; + } catch (e) { + log.atError().withCause(e).log(`Failed to load events log actors.`); + throw e; + } for (const trimErrors of [false, true]) { - const sw = stopwatch(); - let chResult: any = {}; - try { - chResult = (await ( - await clickhouse.query({ - query: statQuery, - query_params: { - eventsLogSize: eventsLogSize, - withoutErrors: !trimErrors, - }, - clickhouse_settings: { - wait_end_of_query: 1, - }, - }) - ).json()) as any; - } catch (e) { - log.atError().withCause(e).log(`Failed to load events log stats. (trim errors: ${trimErrors})`); - throw e; - } log .atInfo() - .log( - `Trimming ${trimErrors ? "error level" : "non-error levels"} for ${ - chResult.data.length - } actors. (Loaded in ${sw.elapsedPretty()})` - ); - for (const row of chResult.data) { + .log(`Trimming ${trimErrors ? "error level" : "non-error levels"} for ${actorsResult.data.length} actors.`); + const len = actorsResult.data.length; + let i = 0; + for (const row of actorsResult.data) { + i++; const actorId = row.actorId; const type = row.type; - const timestamp = row.timestamp; + let timestamp: any = undefined; try { - const cr = await clickhouse.command({ - query: deleteQuery, - query_params: { - actorId: actorId, - type: type, - withoutErrors: !trimErrors, - timestamp: timestamp, - }, - clickhouse_settings: { - wait_end_of_query: 0, - enable_lightweight_delete: 1, - }, - }); - result.push({ ...row, trimErrors }); - log - .atInfo() - .log(`Trimmed ${trimErrors ? "error level" : "non-error levels"} for ${actorId} ${type} ${timestamp}`); + const tsResult = (await ( + await clickhouse.query({ + query: statQuery, + query_params: { + actorId: actorId, + type: type, + withoutErrors: !trimErrors, + }, + clickhouse_settings: { + wait_end_of_query: 1, + }, + }) + ).json()) as any; + if (tsResult.data && tsResult.data.length > 0) { + timestamp = tsResult.data[0].timestamp; + } } catch (e: any) { - result.push({ ...row, errors: trimErrors, error: e.message }); log .atError() .withCause(e) + .log(`${i} of ${len}. Failed to trim timestamp for ${actorId} ${type}. (trim errors: ${trimErrors})`); + result.push({ ...row, errors: trimErrors, error: e.message }); + } + if (timestamp) { + const sw = stopwatch(); + log + .atInfo() .log( - `Failed to trim ${trimErrors ? "error level" : "non-error levels"} for ${actorId} ${type} ${timestamp}` + `${i} of ${len}. Trimming ${ + trimErrors ? "error level" : "non-error levels" + } for ${actorId} ${type} ${timestamp}` ); + try { + const cr = await clickhouse.command({ + query: deleteQuery, + query_params: { + actorId: actorId, + type: type, + withoutErrors: !trimErrors, + timestamp: timestamp, + }, + clickhouse_settings: { + wait_end_of_query: 0, + enable_lightweight_delete: 1, + }, + }); + result.push({ ...row, timestamp, trimErrors }); + log.atInfo().log(`Done at ${sw.elapsedPretty()}`); + } catch (e: any) { + result.push({ ...row, timestamp, errors: trimErrors, error: e.message }); + log + .atError() + .withCause(e) + .log( + `Failed to trim ${trimErrors ? "error level" : "non-error levels"} for ${actorId} ${type} ${timestamp}` + ); + } } } } + log.atInfo().log(`Trimmed ${result.length} logs in ${sw.elapsedPretty()}`); const oldPartition = dayjs().subtract(2, "month").format("YYYYMM"); try { await clickhouse.command({ @@ -108,9 +137,10 @@ export default createRoute() } catch (e: any) { log.atError().withCause(e).log(`Failed to delete partition ${oldPartition}`); } + log.atInfo().log(`Completed in ${sw.elapsedPretty()}`); res.json(result); }) .toNextApiHandler(); export const config = { - maxDuration: 600, //10 mins + maxDuration: 300, //10 mins }; From 6de876caa8c6b08da411dd0e16602b33e6781f51 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Sat, 27 Apr 2024 13:49:17 +0400 Subject: [PATCH 0722/1353] console: added Schema Freeze option --- .../ConnectionEditorPage.tsx | 26 +++++++++++++++++++ webapps/console/lib/schema/destinations.tsx | 1 + 2 files changed, 27 insertions(+) diff --git a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx index 239807f0d..d6494513a 100644 --- a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx +++ b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx @@ -563,6 +563,32 @@ function ConnectionEditor({ ), }); } + if (hasZodFields(connectionOptionsZodType, "schemaFreeze") && existingLink) { + configItems.push({ + group: "Advanced", + documentation: ( + <> + By default, Jitsu automatically creates table columns for any new properties in events. If your table is + already in desired state and you want to control further table schema changes you can enable{" "} + Schema Freeze +
    + With Schema Freeze enabled Jitsu will no longer apply changes to table schema, but incoming data for + any properties that dont have corresponding columns will be stored in _unmapped_data in JSON + format. + + ), + name: "Schema Freeze", + component: ( + { + updateOptions({ schemaFreeze: sf }); + }} + /> + ), + }); + } if (hasZodFields(connectionOptionsZodType, "events")) { configItems.push({ documentation: ( diff --git a/webapps/console/lib/schema/destinations.tsx b/webapps/console/lib/schema/destinations.tsx index eb00909e8..dab4729a0 100644 --- a/webapps/console/lib/schema/destinations.tsx +++ b/webapps/console/lib/schema/destinations.tsx @@ -139,6 +139,7 @@ export const BaseBulkerConnectionOptions = z dataLayout: z .enum(["segment", "jitsu-legacy", "segment-single-table", "passthrough"]) .default("segment-single-table"), + schemaFreeze: z.boolean().default(false), }) .merge(BatchModeOptions) .merge(FunctionsConnectionOptions); From 37247ab08ad117d6a3ff0e46462d0b692d954edb Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 2 May 2024 16:41:27 +0400 Subject: [PATCH 0723/1353] ee-api: fix sync quotas query --- webapps/ee-api/pages/api/quotas/sync.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/ee-api/pages/api/quotas/sync.ts b/webapps/ee-api/pages/api/quotas/sync.ts index ca7c3d403..e2e1b735e 100644 --- a/webapps/ee-api/pages/api/quotas/sync.ts +++ b/webapps/ee-api/pages/api/quotas/sync.ts @@ -34,7 +34,7 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse max(started_at) as "lastSync" from newjitsu.source_task task join newjitsu."ConfigurationObjectLink" sync on task.sync_id = sync."id" - where task.status = 'SUCCESS' OR task.status = 'PARTIAL' and "workspaceId" = :workspaceId + where (task.status = 'SUCCESS' OR task.status = 'PARTIAL') and "workspaceId" = :workspaceId and started_at > now() - interval '24 hour' and deleted = false group by "workspaceId";`, From 250a24faa0216ec225f2e251ae4ec12ae77913c6 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 2 May 2024 17:56:48 +0400 Subject: [PATCH 0724/1353] rotor: mixpanel-destination, amplitude-destination: pass page or screen names as event --- cli/build-scripts/src/commands/docker.ts | 2 +- .../src/functions/amplitude-destination.ts | 15 ++++++++++++--- .../src/functions/intercom-destination.ts | 2 ++ libs/core-functions/src/functions/lib/index.ts | 10 ++++++++++ .../src/functions/mixpanel-destination.ts | 3 ++- .../ConnectionEditorPage/ConnectionEditorPage.tsx | 4 ++-- 6 files changed, 29 insertions(+), 7 deletions(-) diff --git a/cli/build-scripts/src/commands/docker.ts b/cli/build-scripts/src/commands/docker.ts index b82d52603..2e400ac55 100644 --- a/cli/build-scripts/src/commands/docker.ts +++ b/cli/build-scripts/src/commands/docker.ts @@ -138,7 +138,7 @@ export async function docker(dir: string | undefined, args: DockerArgs): Promise console.log(`Pushing git tag ${gitTag}...`); await git.addTag(gitTag); try { - await git.pushTags(); + await git.pushTags([gitTag]); } catch (e: any) { throw new Error(`Failed to push git tag ${gitTag}: ${e.message}`); } diff --git a/libs/core-functions/src/functions/amplitude-destination.ts b/libs/core-functions/src/functions/amplitude-destination.ts index a7a85343a..9f55e200b 100644 --- a/libs/core-functions/src/functions/amplitude-destination.ts +++ b/libs/core-functions/src/functions/amplitude-destination.ts @@ -3,7 +3,7 @@ import { RetryError } from "@jitsu/functions-lib"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import { randomUUID } from "crypto"; import { AmplitudeDestinationConfig } from "../meta"; -import { eventTimeSafeMs } from "./lib"; +import { eventTimeSafeMs, getPageOrScreenProps } from "./lib"; const AmplitudeDestination: JitsuFunction = async ( event, @@ -95,15 +95,24 @@ const AmplitudeDestination: JitsuFunction & { jsonFetch: JsonFetcher; @@ -351,6 +352,7 @@ const IntercomDestination: JitsuFunction, true> = { url: true, }; +// returns page name or screen name as part of properties object +export function getPageOrScreenProps(event: AnalyticsServerEvent) { + if ((event.type === "page" || event.type === "screen") && event.name) { + return { + [event.type + "_name"]: event.name, + }; + } + return {}; +} + export function getEventCustomProperties( event: AnalyticsServerEvent, opts?: { exclude?: (obj: Record) => void } diff --git a/libs/core-functions/src/functions/mixpanel-destination.ts b/libs/core-functions/src/functions/mixpanel-destination.ts index 0a386a166..b5f4bfbec 100644 --- a/libs/core-functions/src/functions/mixpanel-destination.ts +++ b/libs/core-functions/src/functions/mixpanel-destination.ts @@ -3,7 +3,7 @@ import { HTTPError, RetryError } from "@jitsu/functions-lib"; import type { AnalyticsServerEvent, Geo } from "@jitsu/protocols/analytics"; import { hash } from "juava"; import { MixpanelCredentials } from "../meta"; -import { eventTimeSafeMs, MetricsMeta } from "./lib"; +import { eventTimeSafeMs, getPageOrScreenProps, MetricsMeta } from "./lib"; import { randomUUID } from "crypto"; import zlib from "zlib"; @@ -138,6 +138,7 @@ function trackEvent( ...utmFromCampaign(analyticsContext.campaign || {}), ...(analyticsContext.page || {}), ...traits, + ...getPageOrScreenProps(event), ...(event.properties || {}), ...(groupId ? { [groupKey]: groupId } : {}), userAgent: analyticsContext.userAgent, diff --git a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx index d6494513a..55a521afa 100644 --- a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx +++ b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx @@ -573,8 +573,8 @@ function ConnectionEditor({ Schema Freeze
    With Schema Freeze enabled Jitsu will no longer apply changes to table schema, but incoming data for - any properties that dont have corresponding columns will be stored in _unmapped_data in JSON - format. + any properties that don't have corresponding columns will be stored in _unmapped_data column in + JSON format. ), name: "Schema Freeze", From 70fdf6a5000640ba46732331f65bea46e165e153 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 2 May 2024 18:10:14 +0400 Subject: [PATCH 0725/1353] fix for pushing git tags --- cli/build-scripts/src/commands/docker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/build-scripts/src/commands/docker.ts b/cli/build-scripts/src/commands/docker.ts index 2e400ac55..b116fbcbc 100644 --- a/cli/build-scripts/src/commands/docker.ts +++ b/cli/build-scripts/src/commands/docker.ts @@ -138,7 +138,7 @@ export async function docker(dir: string | undefined, args: DockerArgs): Promise console.log(`Pushing git tag ${gitTag}...`); await git.addTag(gitTag); try { - await git.pushTags([gitTag]); + await git.pushTags("origin", [gitTag]); } catch (e: any) { throw new Error(`Failed to push git tag ${gitTag}: ${e.message}`); } From 0301a9587a470088f14183f8795336b5e85fde8a Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 8 May 2024 19:02:50 +0400 Subject: [PATCH 0726/1353] Support for throttle workspace feature --- .../components/DataView/EventsBrowser.tsx | 25 ++++++++++++++++--- .../pages/api/admin/export/[name]/index.ts | 10 ++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/webapps/console/components/DataView/EventsBrowser.tsx b/webapps/console/components/DataView/EventsBrowser.tsx index b254f3d1f..90f227a2f 100644 --- a/webapps/console/components/DataView/EventsBrowser.tsx +++ b/webapps/console/components/DataView/EventsBrowser.tsx @@ -12,7 +12,13 @@ import { WLink } from "../Workspace/WLink"; import { DestinationTitle } from "../../pages/[workspaceId]/destinations"; import ExternalLink from "../Icons/ExternalLink"; import { AnalyticsContext, AnalyticsServerEvent, Geo as aGeo } from "@jitsu/protocols/analytics"; -import Icon, { GlobalOutlined, LinkOutlined, QuestionCircleOutlined, UserOutlined } from "@ant-design/icons"; +import Icon, { + GlobalOutlined, + LinkOutlined, + QuestionCircleOutlined, + UserOutlined, + WarningOutlined, +} from "@ant-design/icons"; import { get, getConfigApi, useEventsLogApi } from "../../lib/useApi"; import { FunctionTitle } from "../../pages/[workspaceId]/functions"; import { DestinationConfig, FunctionConfig, ServiceConfig, StreamConfig } from "../../lib/schema"; @@ -1018,7 +1024,7 @@ export const Geo: React.FC<{ geo?: aGeo }> = ({ geo }) => { if (geo?.country?.code) { const flag = countries[geo.country.code]?.flag; if (!flag) { - return ; + return <>; } return ( = ({ geo }) => { ); } - return ; + return <>; }; type IncomingEvent = { @@ -1206,6 +1212,19 @@ const IncomingEventsTable = ({ loadEvents, loading, streamType, entityType, acto ellipsis: true, key: "summary", render: (d: IncomingEvent) => { + if (d.status == "SKIPPED" || d.status == "FAILED") { + return ( +
    + } + className={"whitespace-nowrap"} + > + {d.error} + +
    + ); + } return (
    diff --git a/webapps/console/pages/api/admin/export/[name]/index.ts b/webapps/console/pages/api/admin/export/[name]/index.ts index ee5000530..1546c6c51 100644 --- a/webapps/console/pages/api/admin/export/[name]/index.ts +++ b/webapps/console/pages/api/admin/export/[name]/index.ts @@ -247,6 +247,15 @@ const exports: Export[] = [ if (needComma) { writer.write(","); } + let throttlePercent: number | undefined = undefined; + const throttleOpts = (obj.workspace.featuresEnabled ?? []).find(f => f.startsWith("throttle")); + if (throttleOpts) { + //remove all non-numeric + const m = throttleOpts.match(/(\d+)/); + if (m && m.length > 1) { + throttlePercent = Math.min(100, parseInt(m[1])); + } + } writer.write( JSON.stringify({ __debug: { @@ -269,6 +278,7 @@ const exports: Export[] = [ workspaceId: obj.workspace.id, }, backupEnabled: !(obj.workspace.featuresEnabled || []).includes("nobackup"), + throttle: throttlePercent, destinations: obj.toLinks .filter(l => !l.deleted && l.type === "push" && !l.to.deleted) .map(l => ({ From 6ddde4fbda0a27d84ebe62cf092a4ac5beb391e0 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Wed, 8 May 2024 18:49:58 -0400 Subject: [PATCH 0727/1353] fix #1103: mask eval() call for tag destination --- libs/jitsu-js/src/destination-plugins/tag.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/libs/jitsu-js/src/destination-plugins/tag.ts b/libs/jitsu-js/src/destination-plugins/tag.ts index 1a2d3c6b5..c0786aff3 100644 --- a/libs/jitsu-js/src/destination-plugins/tag.ts +++ b/libs/jitsu-js/src/destination-plugins/tag.ts @@ -56,6 +56,13 @@ function insertTags(code, event: AnalyticsClientEvent, opts: { debug?: boolean } } } +//This weird code is used to mask eval() usage. +//Although the code can be executed in the browser, some server side bundlers (like Vercel) fails +//the build if a direct reference to eval() is found. +let al = "al"; +let ev = "ve".split("").reverse().join(""); +const execF = globalThis[ev + al]; + function execJs(code: string, event: any) { const varName = `jitsu_event_${randomId()}`; window[varName] = event; @@ -64,7 +71,7 @@ function execJs(code: string, event: any) { ${code} })()`; try { - eval(iif); + execF(iif); } catch (e) { console.error(`[JITSU] Error executing JS code: ${e.message}. Code: `, iif); } finally { From c51ca6fc0adb5eff55bd61e1dd97f489ca25a850 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 13 May 2024 19:02:07 +0400 Subject: [PATCH 0728/1353] console: source logs: respect vercel max response size --- .../FunctionsDebugger/FunctionsDebugger.tsx | 2 +- .../console/pages/[workspaceId]/syncs/logs.tsx | 2 +- .../pages/api/[workspaceId]/sources/logs.ts | 18 +++++++++++------- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx b/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx index ed72b522a..9bf87df3e 100644 --- a/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx +++ b/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx @@ -221,7 +221,7 @@ export const FunctionsDebugger: React.FC = props => { { level: "info", type: "log", - message: `Further processing will be SKIPPED. Function returned: ${JSON.stringify(result)}`, + message: `Further processing will be SKIPPED. Function returned: ${JSON.stringify(res.result)}`, timestamp: new Date(), }, ]); diff --git a/webapps/console/pages/[workspaceId]/syncs/logs.tsx b/webapps/console/pages/[workspaceId]/syncs/logs.tsx index 7bfdb2284..800a9dd3c 100644 --- a/webapps/console/pages/[workspaceId]/syncs/logs.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/logs.tsx @@ -63,7 +63,7 @@ function TaskLogs() { useEffect(() => { if (data) { - setDisplayText(data); + setDisplayText(data.split("\n").reverse().join("\n")); } }, [data]); diff --git a/webapps/console/pages/api/[workspaceId]/sources/logs.ts b/webapps/console/pages/api/[workspaceId]/sources/logs.ts index 274144116..58610530a 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/logs.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/logs.ts @@ -8,6 +8,7 @@ dayjs.extend(utc); import { getServerLog } from "../../../../lib/server/log"; const log = getServerLog("sync-logs"); +const maxResponseSize = 4500000; export default createRoute() .GET({ @@ -34,22 +35,25 @@ export default createRoute() }); } try { - let lines = 0; + let writtenBytes = 0; db.prisma().$queryRaw; await db.pgHelper().streamQuery( `select tl.* from newjitsu.task_log tl join newjitsu."ConfigurationObjectLink" link on tl.sync_id = link.id where task_id = :task_id and link."workspaceId" = :workspace_id - order by timestamp`, + order by timestamp desc`, { task_id: query.taskId, workspace_id: workspaceId }, r => { - lines++; - res.write( - `${dayjs(r.timestamp).utc().format("YYYY-MM-DD HH:mm:ss.SSS")} ${r.level} [${r.logger}] ${r.message}\n` - ); + const line = `${dayjs(r.timestamp).utc().format("YYYY-MM-DD HH:mm:ss.SSS")} ${r.level} [${r.logger}] ${ + r.message + }\n`; + if (writtenBytes + line.length < maxResponseSize) { + res.write(line); + writtenBytes += line.length; + } } ); - if (lines === 0) { + if (writtenBytes === 0) { const task = await db.prisma().source_task.findFirst({ where: { task_id: query.taskId } }); if (!task || task.status === "RUNNING") { res.write("The task is starting..."); From 91173f37ec4c0a155699eec605f2e8d5d3e108bc Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 14 May 2024 15:41:29 +0400 Subject: [PATCH 0729/1353] console: added Attio connector --- webapps/console/pages/api/sources/index.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/webapps/console/pages/api/sources/index.ts b/webapps/console/pages/api/sources/index.ts index 831c642da..836a066be 100644 --- a/webapps/console/pages/api/sources/index.ts +++ b/webapps/console/pages/api/sources/index.ts @@ -60,9 +60,25 @@ const JitsuMongoDBSource: SourceType = { updatedAt: new Date(), }; +const JitsuAttioSource: SourceType = { + id: "jitsu-attio-source", + logoSvg: ``, + versions: `/api/sources/versions?type=airbyte&package=jitsucom%2Fsource-attio`, + packageId: "jitsucom/source-attio", + packageType: "airbyte", + meta: { + name: "Attio", + license: "MIT", + connectorSubtype: "api", + }, + createdAt: new Date(), + updatedAt: new Date(), +}; + export const jitsuSources: Record = { "jitsucom/source-firebase": JitsuFirebaseSource, "jitsucom/source-mongodb": JitsuMongoDBSource, + "jitsucom/source-attio": JitsuAttioSource, }; export const popularConnectors: string[] = [ From e675a8cbe6166ff3991361c1c21c7738a1836ef4 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 15 May 2024 10:51:39 +0400 Subject: [PATCH 0730/1353] console: fix for 'Failed to load catalog' error description --- .../components/GlobalError/GlobalError.tsx | 27 +++++++++++++++++++ .../SyncEditorPage/SyncEditorPage.tsx | 5 ++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/webapps/console/components/GlobalError/GlobalError.tsx b/webapps/console/components/GlobalError/GlobalError.tsx index ff9312786..ce4852262 100644 --- a/webapps/console/components/GlobalError/GlobalError.tsx +++ b/webapps/console/components/GlobalError/GlobalError.tsx @@ -100,6 +100,33 @@ function maxLen(str: string, maxLen = 200) { return str.length <= maxLen - 2 ? str : str.substring(0, maxLen) + "..."; } +export function SimpleErrorCard(props: { error?: any; title?: string }) { + const title = props.title || (props.error ? maxLen(getErrorMessage(props.error), 60) : "Error"); + const description = ( + <> + {getErrorMessage(props.error) || + `We encountered an error processing your request. Please try refreshing the page, or logging + out and back in. If the problem persists, please contact support.`} + + ); + return ( +
    +
    +
    + + {title} +
    +
    +
    +
    {description}
    +
    +
    + ); +} + export function ErrorCard(props: { error?: any; title?: string; hideActions?: boolean; children?: ReactNode }) { const title = props.title || (props.error ? maxLen(getErrorMessage(props.error), 60) : "Error"); const description = ( diff --git a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx index 678ec8d24..05c3ae6a4 100644 --- a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx +++ b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx @@ -18,7 +18,7 @@ import hash from "stable-hash"; import { DestinationTitle } from "../../pages/[workspaceId]/destinations"; import { ServiceTitle } from "../../pages/[workspaceId]/services"; import { SwitchComponent } from "../ConnectionEditorPage/ConnectionEditorPage"; -import { ErrorCard } from "../GlobalError/GlobalError"; +import { SimpleErrorCard } from "../GlobalError/GlobalError"; import { LabelEllipsis } from "../LabelEllipsis/LabelEllipsis"; import { createDisplayName } from "../../lib/zod"; import xor from "lodash/xor"; @@ -699,9 +699,8 @@ function SyncEditor({ key: "streams", component: (
    -
    From e8749c9265a8d2fe08a1f8198c1f4b97d4ce87fc Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 16 May 2024 19:38:15 +0400 Subject: [PATCH 0731/1353] EventsBrowser.tsx : workaround for incorrect user ids --- webapps/console/components/DataView/EventsBrowser.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webapps/console/components/DataView/EventsBrowser.tsx b/webapps/console/components/DataView/EventsBrowser.tsx index 90f227a2f..bdb757cf5 100644 --- a/webapps/console/components/DataView/EventsBrowser.tsx +++ b/webapps/console/components/DataView/EventsBrowser.tsx @@ -1245,7 +1245,7 @@ const IncomingEventsTable = ({ loadEvents, loading, streamType, entityType, acto {d.userId && !d.email && ( } className={"whitespace-nowrap"}> - {d.userId} + {d.userId.toString()} )} @@ -1259,7 +1259,7 @@ const IncomingEventsTable = ({ loadEvents, loading, streamType, entityType, acto {!d.userId && d.anonymousId && ( } className={"whitespace-nowrap"}> - {d.anonymousId} + {d.anonymousId.toString()} )} From 77733e9311425dbb59a3cbfdd95095b0ab33a72d Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 17 May 2024 12:04:11 +0400 Subject: [PATCH 0732/1353] mixpanel sync: don't send empty payload --- webapps/console/lib/server/syncs/mixpanel.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/webapps/console/lib/server/syncs/mixpanel.ts b/webapps/console/lib/server/syncs/mixpanel.ts index 6b8f7ebe3..babcd7c64 100644 --- a/webapps/console/lib/server/syncs/mixpanel.ts +++ b/webapps/console/lib/server/syncs/mixpanel.ts @@ -204,8 +204,10 @@ export const mixpanelFacebookAdsSync: SyncFunction 0) { + await log.info(`Sending ${mixpanelMessages.length} rows to mixpanel`); + await sendMixpanelMessage(destination, mixpanelMessages); + } if (!nextPageUrl) { break; } From 6a6422d3983572b7eaa980e32c8abdb58c19c00d Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 23 May 2024 13:38:10 +0400 Subject: [PATCH 0733/1353] mongodb: retry creating clients in 5 min after failed attempts bulker-destination.ts: jitsuLegacy add geo, ua, client ids info. fixes --- .../__tests__/datalayout-jitsu-legacy.test.ts | 11 ++- .../src/functions/bulker-destination.ts | 88 ++++++++++++++----- .../src/functions/lib/mongodb.ts | 1 + .../src/functions/udf_wrapper.ts | 1 + services/rotor/src/lib/maxmind.ts | 2 + types/protocols/analytics.d.ts | 2 + 6 files changed, 81 insertions(+), 24 deletions(-) diff --git a/libs/core-functions/__tests__/datalayout-jitsu-legacy.test.ts b/libs/core-functions/__tests__/datalayout-jitsu-legacy.test.ts index a425668d5..bb5c66cf8 100644 --- a/libs/core-functions/__tests__/datalayout-jitsu-legacy.test.ts +++ b/libs/core-functions/__tests__/datalayout-jitsu-legacy.test.ts @@ -1,6 +1,7 @@ -import { jitsuLegacy, MappedEvent, segmentLayout } from "../src/functions/bulker-destination"; +import { BulkerDestinationConfig, jitsuLegacy, MappedEvent, segmentLayout } from "../src/functions/bulker-destination"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import type { Event as JitsuLegacyEvent } from "@jitsu/sdk-js"; +import { FullContext } from "@jitsu/protocols/functions"; const identify: AnalyticsServerEvent = { writeKey: "writeKey", @@ -66,6 +67,7 @@ const legacyIdentifyExpected: Omit & { loca src: "jitsu", url: "https://localhost:3088/basic.html?utm_source=source&utm_medium=medium&utm_campaign=campaign", user: { + anonymous_id: "6638caf0-d2c2-4bc0-aecf-8b290b559a37", id: "userId2", email: "john.doe2@gmail.com", case_name: "basic-identify", @@ -81,6 +83,7 @@ const legacyIdentifyExpected: Omit & { loca name: "campaign", source: "source", }, + screen_resolution: "1280x720", vp_size: "1280x720", }; @@ -154,6 +157,7 @@ const legacyPageExpected = { src: "jitsu", url: "https://localhost:3088/basic.html?utm_source=source&utm_medium=medium&utm_campaign=campaign", user: { + anonymous_id: "6638caf0-d2c2-4bc0-aecf-8b290b559a37", id: "userId2", email: "john.doe3@gmail.com", case_name: "identify-without-user-id", @@ -169,12 +173,13 @@ const legacyPageExpected = { name: "campaign", source: "source", }, + screen_resolution: "1280x720", vp_size: "1280x720", }; test("legacy event", () => { - const identifyLegacyResult = jitsuLegacy(identify).event; - const pageLegacyResult = jitsuLegacy(page).event; + const identifyLegacyResult = jitsuLegacy(identify, {} as FullContext).event; + const pageLegacyResult = jitsuLegacy(page, {} as FullContext).event; console.log(JSON.stringify(identifyLegacyResult, null, 2)); expect(identifyLegacyResult).toStrictEqual(legacyIdentifyExpected); diff --git a/libs/core-functions/src/functions/bulker-destination.ts b/libs/core-functions/src/functions/bulker-destination.ts index 780960ddd..8f645e176 100644 --- a/libs/core-functions/src/functions/bulker-destination.ts +++ b/libs/core-functions/src/functions/bulker-destination.ts @@ -1,4 +1,4 @@ -import { JitsuFunction } from "@jitsu/protocols/functions"; +import { FullContext, JitsuFunction, UserAgent } from "@jitsu/protocols/functions"; import { HTTPError, RetryError } from "@jitsu/functions-lib"; import { AnalyticsServerEvent, DataLayoutType } from "@jitsu/protocols/analytics"; @@ -11,7 +11,10 @@ export type MappedEvent = { event: any; table: string; }; -export type DataLayoutImpl = (event: AnalyticsServerEvent) => MappedEvent[] | MappedEvent; +export type DataLayoutImpl = ( + event: AnalyticsServerEvent, + ctx: FullContext +) => MappedEvent[] | MappedEvent; function anonymizeIp(ip: string | undefined) { if (!ip) { @@ -51,52 +54,95 @@ export function removeUndefined(param: any): any { } } -export function jitsuLegacy(event: AnalyticsServerEvent): MappedEvent { +export function jitsuLegacy(event: AnalyticsServerEvent, ctx: FullContext): MappedEvent { let url: URL | undefined = undefined; - const urlStr = event.context.page?.url || event.properties?.url; + const analyticsContext = event.context || {}; + const urlStr = analyticsContext.page?.url || event.properties?.url; try { if (urlStr) { url = new URL(urlStr as string); } } catch (e) {} - + const geo = analyticsContext.geo || {}; + const ua: UserAgent = ctx.ua || ({} as UserAgent); const flat = removeUndefined( toSnakeCase({ - anon_ip: event.context?.ip ? anonymizeIp(event.context?.ip) : undefined, + anon_ip: analyticsContext.ip ? anonymizeIp(analyticsContext.ip) : undefined, api_key: event.writeKey || "", click_id: {}, - doc_encoding: event.context?.page?.encoding || event.properties?.encoding, + doc_encoding: analyticsContext.page?.encoding || event.properties?.encoding, doc_host: url?.hostname, doc_path: url?.pathname, doc_search: url?.search, eventn_ctx_event_id: event.messageId, event_type: event.event || event.type, - local_tz_offset: event.context?.page?.timezoneOffset || event.properties?.timezoneOffset, - page_title: event.context?.page?.title, - referer: event.context?.page?.referrer, - screen_resolution: event.context?.page?.screenResolution, - source_ip: event.context?.ip, + local_tz_offset: analyticsContext.page?.timezoneOffset || event.properties?.timezoneOffset, + page_title: analyticsContext.page?.title, + referer: analyticsContext.page?.referrer, + screen_resolution: + Math.max(analyticsContext.screen?.width || 0) + "x" + Math.max(analyticsContext.screen?.height || 0), + source_ip: analyticsContext.ip, src: "jitsu", url: (urlStr || "") as string, user: { id: event.userId, - email: (event.context?.traits?.email || event.traits?.email || undefined) as string | undefined, - name: (event.context?.traits?.name || event.traits?.name || undefined) as string | undefined, + anonymous_id: event.anonymousId, + email: (analyticsContext.traits?.email || event.traits?.email || undefined) as string | undefined, + name: (analyticsContext.traits?.name || event.traits?.name || undefined) as string | undefined, ...omit( { - ...(event.context?.traits || {}), + ...(analyticsContext.traits || {}), ...(event.traits || {}), }, ["email", "name"] ), }, - user_agent: event.context.userAgent, - user_language: event.context?.locale, + location: + Object.keys(geo).length > 0 + ? { + city: geo.city?.name, + continent: geo.continent?.code, + country: geo.country?.code, + country_name: geo.country?.name, + latitude: geo.location?.latitude, + longitude: geo.location?.longitude, + region: geo.region?.code, + zip: geo.postalCode?.code, + timezone: geo.location?.timezone, + autonomous_system_number: geo.provider?.as?.num, + autonomous_system_organization: geo.provider?.as?.name, + isp: geo.provider?.isp, + domain: geo.provider?.domain, + } + : undefined, + ids: + Object.keys(analyticsContext.clientIds || {}).length > 0 + ? { + ga: analyticsContext.clientIds?.ga4?.clientId, + fbp: analyticsContext.clientIds?.fbp, + fbc: analyticsContext.clientIds?.fbc, + } + : undefined, + parsed_ua: + Object.keys(ua).length > 0 + ? { + os_family: ua.os?.name, + os_version: ua.os?.version, + ua_family: ua.browser?.name, + ua_version: ua.browser?.version, + device_brand: ua.device?.vendor, + device_type: ua.device?.type, + device_model: ua.device?.model, + bot: ua.bot, + } + : undefined, + user_agent: analyticsContext.userAgent, + user_language: analyticsContext.locale, utc_time: event.timestamp, _timestamp: event.timestamp, - utm: event.context?.campaign, + utm: analyticsContext.campaign, vp_size: - Math.max(event.context?.screen?.innerWidth || 0) + "x" + Math.max(event.context?.screen?.innerHeight || 0), + Math.max(analyticsContext.screen?.innerWidth || 0) + "x" + Math.max(analyticsContext.screen?.innerHeight || 0), ...(event.type === "track" ? event.properties : {}), }) ); @@ -267,7 +313,7 @@ export function plural(s: string) { export const dataLayouts: Record> = { segment: event => segmentLayout(event, false), "segment-single-table": event => segmentLayout(event, true), - "jitsu-legacy": event => jitsuLegacy(event), + "jitsu-legacy": jitsuLegacy, passthrough: event => ({ event: omit(event, TableNameParameter), table: event[TableNameParameter] ?? "events" }), }; @@ -302,7 +348,7 @@ const BulkerDestination: JitsuFunction("mongodb", createClient, { + errorTtlSec: 5, cleanupFunc: async (client: MongoClient) => { await client.close(); }, diff --git a/libs/core-functions/src/functions/udf_wrapper.ts b/libs/core-functions/src/functions/udf_wrapper.ts index c61a10db9..2876bebd7 100644 --- a/libs/core-functions/src/functions/udf_wrapper.ts +++ b/libs/core-functions/src/functions/udf_wrapper.ts @@ -333,6 +333,7 @@ export async function UDFTestRun({ geo: { country: { code: "US", + name: "United States", isEU: false, }, city: { diff --git a/services/rotor/src/lib/maxmind.ts b/services/rotor/src/lib/maxmind.ts index cc6447b16..dbb717c12 100644 --- a/services/rotor/src/lib/maxmind.ts +++ b/services/rotor/src/lib/maxmind.ts @@ -107,6 +107,7 @@ export async function initMaxMindClient(licenseKey: string): Promise Date: Sat, 25 May 2024 11:59:34 +0400 Subject: [PATCH 0734/1353] mongodb: retry creating clients in 5 min after failed attempts. fix --- libs/juava/src/singleton.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/libs/juava/src/singleton.ts b/libs/juava/src/singleton.ts index 565b79256..9f535183a 100644 --- a/libs/juava/src/singleton.ts +++ b/libs/juava/src/singleton.ts @@ -124,7 +124,6 @@ export function getSingleton( }; return result; } else if (cachedValue && !cachedValue.success) { - cachedValue.debounceCleanup(); throw newError( `${globalName} failed during initialization: ${getErrorMessage(cachedValue.error)}`, cachedValue.error From 71dff85ab99211eb3f50520f7485c063c41a3c53 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 27 May 2024 11:52:22 +0400 Subject: [PATCH 0735/1353] rotor: hide all UDF logs behind debug level --- libs/core-functions/src/functions/lib/index.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/core-functions/src/functions/lib/index.ts b/libs/core-functions/src/functions/lib/index.ts index c387629a5..40a9e399e 100644 --- a/libs/core-functions/src/functions/lib/index.ts +++ b/libs/core-functions/src/functions/lib/index.ts @@ -257,7 +257,7 @@ export const makeLog = (connectionId: string, eventsStore: EventsStore) => ({ }, warn: (ctx: FunctionContext, message: any, ...args: any[]) => { const fid = ctx.function.id; - log.atWarn().log(`[CON:${connectionId}]: [f:${fid}][WARN]: ${message}`, ...args); + log.atDebug().log(`[CON:${connectionId}]: [f:${fid}][WARN]: ${message}`, ...args); eventsStore.log(connectionId, "warn", { type: "log-warn", functionId: fid, @@ -279,7 +279,7 @@ export const makeLog = (connectionId: string, eventsStore: EventsStore) => ({ args, }, }); - const l = log.atError(); + const l = log.atDebug(); if (args?.length > 0) { const last = args[args.length - 1]; if (last.stack) { @@ -291,7 +291,7 @@ export const makeLog = (connectionId: string, eventsStore: EventsStore) => ({ }, info: (ctx: FunctionContext, message: any, ...args: any[]) => { const fid = ctx.function.id; - log.atInfo().log(`[CON:${connectionId}]: [f:${fid}][INFO]: ${message}`, ...args); + log.atDebug().log(`[CON:${connectionId}]: [f:${fid}][INFO]: ${message}`, ...args); eventsStore.log(connectionId, "info", { type: "log-info", functionId: fid, From 616566f7a1f660b46f9bd48c9057b2847291496a Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 27 May 2024 12:19:04 +0400 Subject: [PATCH 0736/1353] rotor: logging optimization --- .../core-functions/src/functions/lib/index.ts | 39 ++++++++++--------- libs/juava/src/log.ts | 11 ++++-- services/rotor/src/lib/message-handler.ts | 8 ++-- 3 files changed, 31 insertions(+), 27 deletions(-) diff --git a/libs/core-functions/src/functions/lib/index.ts b/libs/core-functions/src/functions/lib/index.ts index 40a9e399e..9bae6d29f 100644 --- a/libs/core-functions/src/functions/lib/index.ts +++ b/libs/core-functions/src/functions/lib/index.ts @@ -243,7 +243,7 @@ export const makeLog = (connectionId: string, eventsStore: EventsStore) => ({ debug: (ctx: FunctionContext, message: any, ...args: any[]) => { if (ctx.function.debugTill && ctx.function.debugTill > new Date()) { const fid = ctx.function.id; - log.atDebug().log(`[CON:${connectionId}]: [f:${fid}][DEBUG]: ${message}`, ...args); + log.inDebug(l => l.log(`[CON:${connectionId}]: [f:${fid}][DEBUG]: ${message}`, ...args)); eventsStore.log(connectionId, "debug", { type: "log-debug", functionId: fid, @@ -257,7 +257,7 @@ export const makeLog = (connectionId: string, eventsStore: EventsStore) => ({ }, warn: (ctx: FunctionContext, message: any, ...args: any[]) => { const fid = ctx.function.id; - log.atDebug().log(`[CON:${connectionId}]: [f:${fid}][WARN]: ${message}`, ...args); + log.inDebug(l => l.log(`[CON:${connectionId}]: [f:${fid}][WARN]: ${message}`, ...args)); eventsStore.log(connectionId, "warn", { type: "log-warn", functionId: fid, @@ -279,19 +279,20 @@ export const makeLog = (connectionId: string, eventsStore: EventsStore) => ({ args, }, }); - const l = log.atDebug(); - if (args?.length > 0) { - const last = args[args.length - 1]; - if (last.stack) { - l.withCause(last); - args = args.slice(0, args.length - 1); + log.inDebug(l => { + if (args?.length > 0) { + const last = args[args.length - 1]; + if (last.stack) { + l.withCause(last); + args = args.slice(0, args.length - 1); + } } - } - l.log(`[CON:${connectionId}]: [f:${fid}][ERROR]: ${message}`, ...args); + l.log(`[CON:${connectionId}]: [f:${fid}][ERROR]: ${message}`, ...args); + }); }, info: (ctx: FunctionContext, message: any, ...args: any[]) => { const fid = ctx.function.id; - log.atDebug().log(`[CON:${connectionId}]: [f:${fid}][INFO]: ${message}`, ...args); + log.inDebug(l => l.log(`[CON:${connectionId}]: [f:${fid}][INFO]: ${message}`, ...args)); eventsStore.log(connectionId, "info", { type: "log-info", functionId: fid, @@ -349,13 +350,13 @@ export const makeFetch = if (logToRedis) { eventsStore.log(connectionId, logLevel, { ...baseInfo, error: getErrorMessage(err), elapsedMs: elapsedMs }); } - log - .atDebug() - .log( + log.inDebug(l => + l.log( `[CON:${connectionId}]: [f:${id}][ERROR][FETCH]: ${url} Error: ${getErrorMessage( err )} ElapsedMs: ${elapsedMs}` - ); + ) + ); } throw err; } @@ -375,11 +376,11 @@ export const makeFetch = }); } if (fetchResult.status >= 300) { - log - .atDebug() - .log( + log.inDebug(l => + l.log( `[CON:${connectionId}]: [f:${id}][ERROR][FETCH]: ${url} Status: ${fetchResult.status} Response: ${respText} ElapsedMs: ${elapsedMs}` - ); + ) + ); } } diff --git a/libs/juava/src/log.ts b/libs/juava/src/log.ts index 1c16e7233..52323c016 100644 --- a/libs/juava/src/log.ts +++ b/libs/juava/src/log.ts @@ -36,21 +36,23 @@ export function setServerJsonFormat(enableJson: boolean) { export function getLog(_opts?: LoggerOpts | string): LogFactory { const opts = typeof _opts === "string" ? { component: _opts } : _opts || {}; const { level, component = getComponent() } = opts; + const minSeverity = levelSeverities[level || globalLogLevel || "info"]; return { atDebug(): LogMessageBuilder { - const minSeverity = levelSeverities[level || globalLogLevel || "info"]; return minSeverity <= levelSeverities.debug ? logMessageBuilder(component, "debug") : noopLogMessageBuilder; }, + inDebug(cb: (l: LogMessageBuilder) => void) { + if (minSeverity <= levelSeverities.debug) { + cb(logMessageBuilder(component, "debug")); + } + }, atError(): LogMessageBuilder { - const minSeverity = levelSeverities[level || globalLogLevel || "info"]; return minSeverity <= levelSeverities.error ? logMessageBuilder(component, "error") : noopLogMessageBuilder; }, atInfo(): LogMessageBuilder { - const minSeverity = levelSeverities[level || globalLogLevel || "info"]; return minSeverity <= levelSeverities.info ? logMessageBuilder(component, "info") : noopLogMessageBuilder; }, atWarn(): LogMessageBuilder { - const minSeverity = levelSeverities[level || globalLogLevel || "info"]; return minSeverity <= levelSeverities.warn ? logMessageBuilder(component, "warn") : noopLogMessageBuilder; }, at(level: string): LogMessageBuilder { @@ -179,6 +181,7 @@ export type LogFactory = { atWarn(): LogMessageBuilder; atError(): LogMessageBuilder; atDebug(): LogMessageBuilder; + inDebug(cb: (l: LogMessageBuilder) => void): void; at(level: string): any; }; diff --git a/services/rotor/src/lib/message-handler.ts b/services/rotor/src/lib/message-handler.ts index ab42a91be..106d185cd 100644 --- a/services/rotor/src/lib/message-handler.ts +++ b/services/rotor/src/lib/message-handler.ts @@ -60,11 +60,11 @@ export async function rotorMessageHandler( headers && headers[CONNECTION_IDS_HEADER] ? headers[CONNECTION_IDS_HEADER].toString() : message.connectionId; const connection = requireDefined(connStore.getObject(connectionId), `Unknown connection: ${connectionId}`); - log - .atDebug() - .log( + log.inDebug(l => + l.log( `Processing ${message.type} Message ID: ${message.messageId} for: ${connection.id} (${connection.streamId} → ${connection.destinationId}(${connection.type}))` - ); + ) + ); const event = message.httpPayload as AnalyticsServerEvent; if (!event.context) { From 54987a504940f8536bbfba93b5e9233996089aef Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 29 May 2024 11:35:11 +0400 Subject: [PATCH 0737/1353] console: Sync Tasks UI: fix Edit Sync link --- webapps/console/pages/[workspaceId]/syncs/tasks.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx index d7894a29e..0500d0a13 100644 --- a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx @@ -429,7 +429,7 @@ function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap, re const items: ButtonProps[] = [ { icon: , - href: `/syncs/edit?id=${task.task_id}`, + href: `/syncs/edit?id=${task.sync_id}`, label: "Edit Sync", }, { From 061101bd90ac693d44b6d7c6bc0c95f8bff43dc3 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 29 May 2024 14:57:25 +0400 Subject: [PATCH 0738/1353] console: sync: don't pass state for Full Refresh streams --- webapps/console/lib/server/sync.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/webapps/console/lib/server/sync.ts b/webapps/console/lib/server/sync.ts index 4d4a11893..5f4b9796f 100644 --- a/webapps/console/lib/server/sync.ts +++ b/webapps/console/lib/server/sync.ts @@ -507,6 +507,7 @@ export async function scheduleSync({ //v2 multi-stream states stateObj = stateRows .filter(r => r.stream !== "_LEGACY_STATE" && r.stream != "_GLOBAL_STATE") + .filter(r => ((sync.data as any).streams || {})[r.stream]?.sync_mode !== "full_refresh") .map(r => { const descr = r.stream.split("."); let namespace: string | undefined = undefined; From 1a6b67f5bc21ee356d35e33f4e8b46b3ab713843 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 30 May 2024 12:55:43 +0400 Subject: [PATCH 0739/1353] rotor: ga4-destination: dont require client id when app instance id is present --- libs/core-functions/src/functions/ga4-destination.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libs/core-functions/src/functions/ga4-destination.ts b/libs/core-functions/src/functions/ga4-destination.ts index 6a373e0d0..0c3aba0f7 100644 --- a/libs/core-functions/src/functions/ga4-destination.ts +++ b/libs/core-functions/src/functions/ga4-destination.ts @@ -309,12 +309,12 @@ const Ga4Destination: JitsuFunction = asyn let gaRequest: Ga4Request | undefined = undefined; try { const clientId = getClientId(event); - if (!clientId) { - ctx.log.info(`Ga4: no client_id found for event ID: ${event.messageId}`); - return; - } const sessionId = getSessionId(event, ctx.props.measurementId); const firebaseAppInstanceId = getFirebaseAppInstanceId(event); + if (!clientId && !firebaseAppInstanceId) { + ctx.log.info(`Ga4: no client_id or app instance id found for event ID: ${event.messageId}`); + return; + } const userProperties = getUserProperties(event); const events: Ga4Event[] = []; From b27fdced1049a4f414e5f55a8d45f9da0304d878 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 30 May 2024 13:59:57 +0400 Subject: [PATCH 0740/1353] rotor: ga4-destination: dont require client id when app instance id is present --- libs/core-functions/src/functions/ga4-destination.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/core-functions/src/functions/ga4-destination.ts b/libs/core-functions/src/functions/ga4-destination.ts index 0c3aba0f7..ce9010085 100644 --- a/libs/core-functions/src/functions/ga4-destination.ts +++ b/libs/core-functions/src/functions/ga4-destination.ts @@ -133,8 +133,8 @@ function getUserProperties(event: AnalyticsServerEvent): Record { return userProperties; } -function getClientId(event: AnalyticsServerEvent): string | null | undefined { - return event.context?.clientIds?.ga4?.clientId || event.anonymousId; +function getClientId(event: AnalyticsServerEvent): string | undefined { + return event.context?.clientIds?.ga4?.clientId || event.anonymousId || undefined; } function getFirebaseAppInstanceId(event: AnalyticsServerEvent): string | undefined { From 040d879ff115550d434e51cfee6b54220a0f8dd1 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 30 May 2024 14:26:04 +0400 Subject: [PATCH 0741/1353] console: events-log-init: support one time auth token console: events-log-init: support creating replicated tables on clickhouse clusters --- docker-start-console.sh | 3 +- .../pages/api/admin/events-log-init.ts | 56 +++++++++++++------ 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/docker-start-console.sh b/docker-start-console.sh index b3b8f0fde..69702d0f0 100755 --- a/docker-start-console.sh +++ b/docker-start-console.sh @@ -2,12 +2,13 @@ cancel_healthcheck="0" inited="0" +export CONSOLE_INIT_TOKEN=$RANDOM$RANDOM$RANDOM$RANDOM export my_pid=$$ init() { if [ "$inited" = "0" ]; then inited="1" - curl --silent --output nul --show-error -H "Authorization: Bearer service-admin-account:$CONSOLE_RAW_AUTH_TOKENS" http://$(hostname -f):3000/api/admin/events-log-init + curl --silent --output nul --show-error http://$(hostname -f):3000/api/admin/events-log-init?token=$CONSOLE_INIT_TOKEN fi } diff --git a/webapps/console/pages/api/admin/events-log-init.ts b/webapps/console/pages/api/admin/events-log-init.ts index c781f2a02..ee7b4a9eb 100644 --- a/webapps/console/pages/api/admin/events-log-init.ts +++ b/webapps/console/pages/api/admin/events-log-init.ts @@ -1,20 +1,38 @@ -import { createRoute, verifyAdmin } from "../../../lib/api"; -import { getLog } from "juava"; +import { createRoute, getUser, verifyAdmin } from "../../../lib/api"; +import { checkRawToken, getLog } from "juava"; import { clickhouse } from "../../../lib/server/clickhouse"; +import { z } from "zod"; export const log = getLog("events-log-trim"); export default createRoute() .GET({ - auth: true, + query: z.object({ + token: z.string().optional(), + }), }) - .handler(async ({ res, user }) => { - await verifyAdmin(user); + .handler(async ({ req, res, query, user }) => { + let initTokenUsed = false; + if (process.env.CONSOLE_INIT_TOKEN && query.token) { + if (checkRawToken(process.env.CONSOLE_INIT_TOKEN, query.token)) { + process.env.CONSOLE_INIT_TOKEN = undefined; + initTokenUsed = true; + } + } + if (!initTokenUsed) { + const user = await getUser(res, req); + if (!user) { + res.status(401).send({ error: "Authorization Required" }); + return; + } + await verifyAdmin(user); + } log.atInfo().log(`Init events log`); const metricsSchema = process.env.CLICKHOUSE_METRICS_SCHEMA || process.env.CLICKHOUSE_DATABASE || "newjitsu_metrics"; - const createDbQuery: string = `create database IF NOT EXISTS ${metricsSchema} ---ON CLUSTER jitsu_cluster`; + const metricsCluster = process.env.CLICKHOUSE_METRICS_CLUSTER; + const onCluster = metricsCluster ? ` ON CLUSTER ${metricsCluster}` : ""; + const createDbQuery: string = `create database IF NOT EXISTS ${metricsSchema}${onCluster}`; try { await clickhouse.command({ query: createDbQuery, @@ -24,17 +42,19 @@ export default createRoute() log.atError().withCause(e).log(`Failed to create ${metricsSchema} database.`); throw new Error(`Failed to create ${metricsSchema} database.`); } - const createTableQuery: string = `create table IF NOT EXISTS ${metricsSchema}.events_log ---ON CLUSTER jitsu_cluster - ( - timestamp DateTime64(3), - actorId LowCardinality(String), - type LowCardinality(String), - level LowCardinality(String), - message String - ) - engine = MergeTree() - --engine = ReplicatedMergeTree('/clickhouse/tables/{shard}/newjitsu_metrics/events_log3', '{replica}') + const createTableQuery: string = `create table IF NOT EXISTS ${metricsSchema}.events_log ${onCluster} + ( + timestamp DateTime64(3), + actorId LowCardinality(String), + type LowCardinality(String), + level LowCardinality(String), + message String + ) + engine = ${ + metricsCluster + ? "ReplicatedMergeTree('/clickhouse/tables/{shard}/" + metricsSchema + "/events_log', '{replica}')" + : "MergeTree()" + } PARTITION BY toYYYYMM(timestamp) ORDER BY (actorId, type, timestamp)`; From 0e6ae523c777c7c4ea30301cf204ef8159ef3204 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 30 May 2024 17:40:28 +0400 Subject: [PATCH 0742/1353] jitsu-js: plugin build script src --- libs/jitsu-js/src/destination-plugins/ga4.ts | 5 ++- libs/jitsu-js/src/destination-plugins/gtm.ts | 4 +-- .../src/destination-plugins/logrocket.ts | 4 ++- libs/jitsu-js/src/script-loader.ts | 31 +++++++++++++++++-- 4 files changed, 35 insertions(+), 9 deletions(-) diff --git a/libs/jitsu-js/src/destination-plugins/ga4.ts b/libs/jitsu-js/src/destination-plugins/ga4.ts index cebac5868..34191fe8f 100644 --- a/libs/jitsu-js/src/destination-plugins/ga4.ts +++ b/libs/jitsu-js/src/destination-plugins/ga4.ts @@ -2,7 +2,7 @@ import { loadScript } from "../script-loader"; import { AnalyticsClientEvent } from "@jitsu/protocols/analytics"; import { applyFilters, CommonDestinationCredentials, InternalPlugin } from "./index"; -const defaultScriptSrc = "https://www.googletagmanager.com/gtag/js"; +const defaultScriptSrc = "googletagmanager.com/gtag/js"; export type Ga4DestinationCredentials = { debug?: boolean; @@ -94,7 +94,6 @@ async function initGa4IfNeeded(config: Ga4DestinationCredentials, payload: Analy // to work with both GA4 and GTM const tagId = config.measurementIds; - const scriptSrc = `${defaultScriptSrc}?id=${tagId}${dlParam}`; window[dlName] = window[dlName] || []; const gtag = function () { @@ -112,7 +111,7 @@ async function initGa4IfNeeded(config: Ga4DestinationCredentials, payload: Analy } ); - loadScript(scriptSrc) + loadScript(defaultScriptSrc, { query: `id=${tagId}${dlParam}`, www: true }) .then(() => { setGa4State("loaded"); }) diff --git a/libs/jitsu-js/src/destination-plugins/gtm.ts b/libs/jitsu-js/src/destination-plugins/gtm.ts index 79d7aa2dd..35723d157 100644 --- a/libs/jitsu-js/src/destination-plugins/gtm.ts +++ b/libs/jitsu-js/src/destination-plugins/gtm.ts @@ -129,8 +129,8 @@ async function initGtmIfNeeded(config: GtmDestinationCredentials, payload: Analy event: "gtm.js", }); const dl = l != "dataLayer" ? "&l=" + l : ""; - const scriptSrc = "https://www.googletagmanager.com/gtm.js?id=" + i + dl; - loadScript(scriptSrc) + const scriptSrc = "googletagmanager.com/gtm"; + loadScript(scriptSrc, { www: true, js: true, query: "id=" + i + dl }) .then(() => { setGtmState("loaded"); }) diff --git a/libs/jitsu-js/src/destination-plugins/logrocket.ts b/libs/jitsu-js/src/destination-plugins/logrocket.ts index 9288f691d..ea865e836 100644 --- a/libs/jitsu-js/src/destination-plugins/logrocket.ts +++ b/libs/jitsu-js/src/destination-plugins/logrocket.ts @@ -6,6 +6,8 @@ export type LogRocketDestinationCredentials = { appId: string; } & CommonDestinationCredentials; +const cdn = "cdn.lr-ingest.io/"; + export const logrocketPlugin: InternalPlugin = { id: "logrocket", async handle(config, payload: AnalyticsClientEvent) { @@ -63,7 +65,7 @@ async function initLogrocketIfNeeded(appId: string) { return; } setLogRocketState("loading"); - loadScript(`https://cdn.lr-ingest.io/LogRocket.min.js`, { crossOrigin: "anonymous" }) + loadScript(`${cdn}LogRocket`, { min: true, attributes: { crossOrigin: "anonymous" } }) .then(() => { if (window["LogRocket"]) { try { diff --git a/libs/jitsu-js/src/script-loader.ts b/libs/jitsu-js/src/script-loader.ts index 43be0e220..70a1a1ce2 100644 --- a/libs/jitsu-js/src/script-loader.ts +++ b/libs/jitsu-js/src/script-loader.ts @@ -3,7 +3,32 @@ function findScript(src: string): HTMLScriptElement | undefined { return scripts.find(s => s.src === src); } -export function loadScript(src: string, attributes?: Record): Promise { +export type ScriptOptions = { + attributes?: Record; + www?: boolean; + js?: boolean; + min?: boolean; + query?: string; +}; + +function buildScriptSrc(src: string, options?: ScriptOptions): string { + let result = src; + if (!result.startsWith("http")) { + result = `https://${options?.www ? "www." : ""}${result}`; + } + if (options?.min) { + result = result + ".min.js"; + } else if (options?.js) { + result = result + ".js"; + } + + if (options?.query) { + result += "?" + options.query; + } + return result; +} + +export function loadScript(src: string, options?: ScriptOptions): Promise { const found = findScript(src); if (found !== undefined) { @@ -25,11 +50,11 @@ export function loadScript(src: string, attributes?: Record): Pr const script = window.document.createElement("script"); script.type = "text/javascript"; - script.src = src; + script.src = buildScriptSrc(src, options); script.async = true; script.setAttribute("status", "loading"); - for (const [k, v] of Object.entries(attributes ?? {})) { + for (const [k, v] of Object.entries(options?.attributes ?? {})) { script.setAttribute(k, v); } From c0726321162cfc488b4e16f992e39348258bde6e Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 31 May 2024 11:32:56 +0400 Subject: [PATCH 0743/1353] fixed analytics.reset() (#1106) * fixed analytics.reset() Co-authored-by: Vladimir Klimontovich --- .../__tests__/playwright/cases/reset.html | 31 +++++++++++++ .../__tests__/playwright/integration.test.ts | 35 ++++++++++++++ libs/jitsu-js/src/analytics-plugin.ts | 46 +++++++++++++++---- libs/jitsu-js/src/index.ts | 30 +++++++++++- libs/jitsu-js/src/jitsu.ts | 1 + 5 files changed, 132 insertions(+), 11 deletions(-) create mode 100644 libs/jitsu-js/__tests__/playwright/cases/reset.html diff --git a/libs/jitsu-js/__tests__/playwright/cases/reset.html b/libs/jitsu-js/__tests__/playwright/cases/reset.html new file mode 100644 index 000000000..8437c480c --- /dev/null +++ b/libs/jitsu-js/__tests__/playwright/cases/reset.html @@ -0,0 +1,31 @@ + + + + + + + + Tracking page + + + + + +

    Test

    + + diff --git a/libs/jitsu-js/__tests__/playwright/integration.test.ts b/libs/jitsu-js/__tests__/playwright/integration.test.ts index f45c95cdb..02fca591c 100644 --- a/libs/jitsu-js/__tests__/playwright/integration.test.ts +++ b/libs/jitsu-js/__tests__/playwright/integration.test.ts @@ -244,6 +244,41 @@ test("url-bug", async ({ browser }) => { expect(pagePath).toEqual("/"); }); +test("reset", async ({ browser }) => { + clearRequestLog(); + const browserContext = await browser.newContext(); + const { page, uncaughtErrors } = await createLoggingPage(browserContext); + const [pageResult] = await Promise.all([page.goto(`${server.baseUrl}/reset.html`)]); + await page.waitForFunction(() => window["jitsu"] !== undefined, undefined, { + timeout: 1000, + polling: 100, + }); + expect(pageResult.status()).toBe(200); + //wait for some time since the server has an artificial latency of 30ms + await new Promise(resolve => setTimeout(resolve, 1000)); + expect(uncaughtErrors.length).toEqual(0); + expect(requestLog.length).toBe(3); + console.log( + `📝 Request log size of ${requestLog.length}`, + requestLog.map(x => describeEvent(x.type, x.body)) + ); + const [identifyEvent, firstTrack, secondTrack] = requestLog; + expect(firstTrack.body.anonymousId).toEqual("john-doe-id-1"); + + const cookies = await browserContext.cookies(); + // all cookies should be cleared by .reset() + // but new cookie for new anonymousId should be set + expect(cookies.length).toBe(1); + expect(cookies[0].name).toEqual("__eventn_id"); + const newAnonymousId = cookies[0].value; + console.log(`🍪Cookies`, cookies); + + expect(secondTrack.body.anonymousId).not.toBeNull(); + expect(secondTrack.body.anonymousId).toBeDefined(); + expect(secondTrack.body.anonymousId).toEqual(newAnonymousId); + expect(secondTrack.body.anonymousId).not.toEqual("john-doe-id-1"); +}); + test("basic", async ({ browser }) => { clearRequestLog(); const browserContext = await browser.newContext(); diff --git a/libs/jitsu-js/src/analytics-plugin.ts b/libs/jitsu-js/src/analytics-plugin.ts index ec8d77afd..e7fea97b3 100644 --- a/libs/jitsu-js/src/analytics-plugin.ts +++ b/libs/jitsu-js/src/analytics-plugin.ts @@ -123,8 +123,15 @@ function getGa4Ids(runtime: RuntimeFacade) { } } -function removeCookie(name: string) { - document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:01 GMT;"; +function removeCookie(name: string, { domain, secure }: { domain: string; secure: boolean }) { + document.cookie = + name + + "=;domain=" + + domain + + ";path=/" + + ";expires=Thu, 01 Jan 1970 00:00:01 GMT;SameSite=" + + (secure ? "None" : "Lax") + + (secure ? ";secure" : ""); } function setCookie(name: string, val: string, { domain, secure }: { domain: string; secure: boolean }) { @@ -169,7 +176,18 @@ const cookieStorage: StorageFactory = (cookieDomain, key2cookie) => { return parse(result); }, removeItem(key: string) { - removeCookie(key2cookie[key] || key); + removeCookie(key2cookie[key] || key, { + domain: cookieDomain, + secure: window.location.protocol === "https:", + }); + }, + reset() { + for (const v of Object.values(key2cookie)) { + removeCookie(v, { + domain: cookieDomain, + secure: window.location.protocol === "https:", + }); + } }, }; }; @@ -244,6 +262,9 @@ export const emptyRuntime = (config: JitsuOptions): RuntimeFacade => ({ store(): PersistentStorage { const storage = {}; return { + reset(): void { + Object.keys(storage).forEach(key => delete storage[key]); + }, setItem(key: string, val: any) { if (config.debug) { console.log(`[JITSU EMPTY RUNTIME] Set storage item ${key}=${JSON.stringify(val)}`); @@ -610,17 +631,20 @@ async function send( jitsuConfig.debug ? JSON.stringify(responseJson.destinations, null, 2) : undefined ); } else { - if (jitsuConfig.debug) { - console.log(`[JITSU] Processing device destinations: `, JSON.stringify(responseJson.destinations, null, 2)); + //double protection, ingest should not return destinations in s2s mode + if (isInBrowser()) { + if (jitsuConfig.debug) { + console.log(`[JITSU] Processing device destinations: `, JSON.stringify(responseJson.destinations, null, 2)); + } + return processDestinations(responseJson.destinations, method, adjustedPayload, !!jitsuConfig.debug, instance); } - return processDestinations(responseJson.destinations, method, adjustedPayload, !!jitsuConfig.debug, instance); } } return adjustedPayload; } export type JitsuPluginConfig = JitsuOptions & { - storageWrapper?: (persistentStorage: PersistentStorage) => PersistentStorage & { reset: () => void }; + storageWrapper?: (persistentStorage: PersistentStorage) => PersistentStorage; }; const jitsuAnalyticsPlugin = (pluginConfig: JitsuPluginConfig = {}): AnalyticsPlugin => { const instanceConfig = { @@ -672,9 +696,11 @@ const jitsuAnalyticsPlugin = (pluginConfig: JitsuPluginConfig = {}): AnalyticsPl return send("identify", payload, config, instance, storage); }, reset: args => { - //clear storage cache - if (pluginConfig.storageWrapper) { - pluginConfig.storageWrapper(args.instance.storage).reset(); + const { config, instance } = args; + const storage = pluginConfig.storageWrapper ? pluginConfig.storageWrapper(instance.storage) : instance.storage; + storage?.reset(); + if (config.debug) { + console.log("[JITSU DEBUG] Resetting Jitsu plugin storage"); } }, methods: { diff --git a/libs/jitsu-js/src/index.ts b/libs/jitsu-js/src/index.ts index 9de60c005..ed2b98dff 100644 --- a/libs/jitsu-js/src/index.ts +++ b/libs/jitsu-js/src/index.ts @@ -64,9 +64,9 @@ function createUnderlyingAnalyticsInstance( }, reset() { for (const key of [...Object.keys(storageCache)]) { - storage.removeItem(key); delete storageCache[key]; } + storage.reset(); }, removeItem(key: string) { if (opts.debug) { @@ -133,6 +133,17 @@ function createUnderlyingAnalyticsInstance( } (analytics as any).setAnonymousId(id); }, + async reset() { + if (opts.debug) { + console.log("[JITSU DEBUG] Called reset(). Storage state", JSON.stringify(analytics.user())); + } + storage.reset(); + await analytics.reset(); + this.setAnonymousId(uuid()); + if (opts.debug) { + console.log("[JITSU DEBUG] User state after reset", JSON.stringify(analytics.user())); + } + }, async group( groupId?: ID, traits?: JSONObject | null, @@ -194,5 +205,22 @@ export function jitsuAnalytics(_opts: JitsuOptions): AnalyticsInterface { // } } +function uuid() { + var u = "", + m = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx", + i = 0, + rb = (Math.random() * 0xffffffff) | 0; + + while (i++ < 36) { + var c = m[i - 1], + r = rb & 0xf, + v = c == "x" ? r : (r & 0x3) | 0x8; + + u += c == "-" || c == "4" ? c : v.toString(16); + rb = i % 8 == 0 ? (Math.random() * 0xffffffff) | 0 : rb >> 4; + } + return u; +} + export * from "./jitsu"; export * from "./analytics-plugin"; diff --git a/libs/jitsu-js/src/jitsu.ts b/libs/jitsu-js/src/jitsu.ts index 4565c4c54..1c72121f9 100644 --- a/libs/jitsu-js/src/jitsu.ts +++ b/libs/jitsu-js/src/jitsu.ts @@ -56,6 +56,7 @@ type PersistentStorage = { getItem: (key: string, options?: any) => any; setItem: (key: string, value: any, options?: any) => void; removeItem: (key: string, options?: any) => void; + reset: () => void; }; type RuntimeFacade = { From 1a4907dff18d711bf38e8803ced38354d5356a5c Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 31 May 2024 15:18:43 +0400 Subject: [PATCH 0744/1353] rotor: hubspot-destination: send custom properties + option to automatically create custom properties. rotor: ga4-destination: fix sending data for Firebase Apps measurements --- .../src/functions/ga4-destination.ts | 23 ++++- .../src/functions/hubspot-destination.ts | 94 +++++++++++++++---- libs/core-functions/src/meta.ts | 12 ++- 3 files changed, 102 insertions(+), 27 deletions(-) diff --git a/libs/core-functions/src/functions/ga4-destination.ts b/libs/core-functions/src/functions/ga4-destination.ts index ce9010085..0c9d88000 100644 --- a/libs/core-functions/src/functions/ga4-destination.ts +++ b/libs/core-functions/src/functions/ga4-destination.ts @@ -311,10 +311,25 @@ const Ga4Destination: JitsuFunction = asyn const clientId = getClientId(event); const sessionId = getSessionId(event, ctx.props.measurementId); const firebaseAppInstanceId = getFirebaseAppInstanceId(event); - if (!clientId && !firebaseAppInstanceId) { - ctx.log.info(`Ga4: no client_id or app instance id found for event ID: ${event.messageId}`); - return; + const measurementId = ctx.props.measurementId || ""; + let query = `api_secret=${ctx.props.apiSecret}`; + if (measurementId.match(/^\d:\d+:\w+:\w+$/)) { + if (!firebaseAppInstanceId) { + ctx.log.info(`Ga4: no app instance id found for event ID: ${event.messageId}`); + return; + } + query += `&firebase_app_id=${measurementId}`; + } else { + if (!clientId) { + ctx.log.info(`Ga4: no client_id found for event ID: ${event.messageId}`); + return; + } + if (!measurementId.match(/^G-\w+$/)) { + ctx.log.warn(`Ga4: measurement_id is not in the correct format: ${measurementId}`); + } + query += `&measurement_id=${measurementId}`; } + const userProperties = getUserProperties(event); const events: Ga4Event[] = []; @@ -334,7 +349,7 @@ const Ga4Destination: JitsuFunction = asyn } const debug = ""; //const debug = ctx.props.validationMode ? "/debug" : ""; - const url = `https://www.google-analytics.com${debug}/mp/collect?measurement_id=${ctx.props.measurementId}&api_secret=${ctx.props.apiSecret}`; + const url = `https://www.google-analytics.com${debug}/mp/collect?${query}`; gaRequest = { app_instance_id: firebaseAppInstanceId, diff --git a/libs/core-functions/src/functions/hubspot-destination.ts b/libs/core-functions/src/functions/hubspot-destination.ts index 711056d8c..28f2e638c 100644 --- a/libs/core-functions/src/functions/hubspot-destination.ts +++ b/libs/core-functions/src/functions/hubspot-destination.ts @@ -11,6 +11,7 @@ import { FilterGroup } from "@hubspot/api-client/lib/codegen/crm/contacts/models import omit from "lodash/omit"; import assert from "node:assert"; import { BehavioralEventHttpCompletionRequest } from "@hubspot/api-client/lib/codegen/events/send/models/BehavioralEventHttpCompletionRequest"; +import { idToSnakeCaseFast } from "./lib/strings"; const JITSU_USER_ID_PROPERTY = "jitsu_user_id"; @@ -62,12 +63,41 @@ class HubspotHelper { } } - async upsertHubspotCompany(c: { - companyId: string; - name: string; - customProps?: Record; - doNotUpdate?: boolean; - }): Promise { + async removeUnknownProperties( + customProps: Record, + opts: PropertyOptions = {} + ): Promise> { + const remoteProps = await this.client.crm.properties.coreApi.getAll(opts.objectType || "contacts"); + return Object.fromEntries( + Object.entries(customProps) + .map(([k, v]) => [idToSnakeCaseFast(k), v]) + .filter(([key]) => remoteProps.results.some(rp => rp.name === key)) + ); + } + + async ensurePropertiesExist( + customProps: Record, + opts: PropertyOptions = {} + ): Promise> { + const remoteProps = await this.client.crm.properties.coreApi.getAll(opts.objectType || "contacts"); + customProps = Object.fromEntries(Object.entries(customProps).map(([k, v]) => [idToSnakeCaseFast(k), v])); + const notExistis = Object.keys(customProps).filter(p => !remoteProps.results.some(rp => rp.name === p)); + for (const propertyName of notExistis) { + this.log.info(`Property '${propertyName}' does not exist. Creating...`); + await this.createProperty(propertyName, opts); + } + return customProps; + } + + async upsertHubspotCompany( + cred: HubspotCredentials, + c: { + companyId: string; + name: string; + customProps?: Record; + doNotUpdate?: boolean; + } + ): Promise { const filterGroup: FilterGroup = { filters: [ { @@ -84,11 +114,25 @@ class HubspotHelper { properties: [], sorts: [], }); - + let customProps = c.customProps; + if (customProps && Object.keys(customProps).length > 0) { + if (cred.autoCreateCustomProperties) { + customProps = await this.ensurePropertiesExist(customProps, { + objectType: "company", + group: "companyinformation", + }); + } else { + customProps = await this.removeUnknownProperties(customProps, { + objectType: "company", + group: "companyinformation", + }); + } + } const companyProperties = { properties: { name: c.name, [JITSU_GROUP_ID_PROPERTY]: c.companyId, + ...customProps, }, }; @@ -109,22 +153,32 @@ class HubspotHelper { } } - async upsertHubspotContact(u: { - userId: string; - name?: string; - email: string; - customProps?: Record; - }): Promise { + async upsertHubspotContact( + cred: HubspotCredentials, + u: { + userId: string; + name?: string; + email: string; + customProps?: Record; + } + ): Promise { const existingContactId = await this.getContactByJitsuId(u.userId, u.email); - const [fistName, lastName] = splitName(u.name); - + let customProps = u.customProps; + if (customProps && Object.keys(customProps).length > 0) { + if (cred.autoCreateCustomProperties) { + customProps = await this.ensurePropertiesExist(customProps, { objectType: "contacts" }); + } else { + customProps = await this.removeUnknownProperties(customProps, { objectType: "contacts" }); + } + } const contactProperties = { properties: { email: u.email, firstname: fistName, lastname: lastName, [JITSU_USER_ID_PROPERTY]: u.userId, + ...customProps, } as { [key: string]: string }, }; @@ -201,14 +255,14 @@ const HubspotDestination: JitsuFunction" + - "Admin > Data Streams > choose your stream > Measurement ID" + "The measurement ID associated with a stream.
    For Web: found in the Google Analytics UI under: " + + "Admin > Data Streams > choose your stream > Measurement ID
    For Apps: the Firebase App ID, found in the Firebase console under: Project Settings > General > Your Apps > App ID" ), events: z.string().optional().default("").describe(eventsParamDescription), //validationMode: z.boolean().default(false).optional(), @@ -272,7 +272,13 @@ export const HubspotCredentials = z.object({ sendPageViewEvents: z .boolean() .optional() - .describe("If on, Jitsu will send page view events to hubspot (only events with a known email). Please note"), + .describe("When enabled, Jitsu will send page view events to hubspot (only events with a known email)"), + autoCreateCustomProperties: z + .boolean() + .optional() + .describe( + "When enabled, Jitsu will automatically create HubSpot custom properties for Contacts and Companies to capture every new trait. Otherwise, only known properties are sent." + ), }); export type HubspotCredentials = z.infer; From f52e00a68f0a49cbe221a0d2462a6ec1580527c2 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 31 May 2024 15:55:48 +0400 Subject: [PATCH 0745/1353] support CLICKHOUSE_CLUSTER env --- webapps/console/pages/api/admin/events-log-init.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/pages/api/admin/events-log-init.ts b/webapps/console/pages/api/admin/events-log-init.ts index ee7b4a9eb..2125683b5 100644 --- a/webapps/console/pages/api/admin/events-log-init.ts +++ b/webapps/console/pages/api/admin/events-log-init.ts @@ -30,7 +30,7 @@ export default createRoute() log.atInfo().log(`Init events log`); const metricsSchema = process.env.CLICKHOUSE_METRICS_SCHEMA || process.env.CLICKHOUSE_DATABASE || "newjitsu_metrics"; - const metricsCluster = process.env.CLICKHOUSE_METRICS_CLUSTER; + const metricsCluster = process.env.CLICKHOUSE_METRICS_CLUSTER || process.env.CLICKHOUSE_CLUSTER; const onCluster = metricsCluster ? ` ON CLUSTER ${metricsCluster}` : ""; const createDbQuery: string = `create database IF NOT EXISTS ${metricsSchema}${onCluster}`; try { From 404e37476dc763a8a804e7c8c02788589d41f2b3 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 31 May 2024 16:20:49 +0400 Subject: [PATCH 0746/1353] fix --- docker-start-console.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docker-start-console.sh b/docker-start-console.sh index 69702d0f0..293ecf766 100755 --- a/docker-start-console.sh +++ b/docker-start-console.sh @@ -6,9 +6,10 @@ export CONSOLE_INIT_TOKEN=$RANDOM$RANDOM$RANDOM$RANDOM export my_pid=$$ init() { - if [ "$inited" = "0" ]; then + if [ $inited = "0" ]; then + echo "Initializing console..." inited="1" - curl --silent --output nul --show-error http://$(hostname -f):3000/api/admin/events-log-init?token=$CONSOLE_INIT_TOKEN + curl --silent --show-error http://$(hostname -f):3000/api/admin/events-log-init?token=$CONSOLE_INIT_TOKEN fi } From cd6b6e1fe6abf2f38f09eead9fba92fd68586144 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 31 May 2024 16:32:12 +0400 Subject: [PATCH 0747/1353] fix --- docker-start-console.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docker-start-console.sh b/docker-start-console.sh index 293ecf766..734c567f9 100755 --- a/docker-start-console.sh +++ b/docker-start-console.sh @@ -6,7 +6,7 @@ export CONSOLE_INIT_TOKEN=$RANDOM$RANDOM$RANDOM$RANDOM export my_pid=$$ init() { - if [ $inited = "0" ]; then + if [ "$inited" = "0" ]; then echo "Initializing console..." inited="1" curl --silent --show-error http://$(hostname -f):3000/api/admin/events-log-init?token=$CONSOLE_INIT_TOKEN @@ -36,7 +36,6 @@ wait_for_service() { fi sleep $interval done - init exit 0 } @@ -58,7 +57,8 @@ healthcheck() { if [ -f healthcheck-result ]; then cat healthcheck-result fi - echo "" + echo "Running init..." + init else if [ "$http_code" = "000" ]; then echo "❌ ❌ ❌ HEALTHCHECK FAILED $healthcheck_url is not available" From 24b7b58aa08bb5ab397f594c4c80c7f4655043d2 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 31 May 2024 16:44:41 +0400 Subject: [PATCH 0748/1353] fix --- docker-start-console.sh | 3 ++- webapps/console/pages/api/admin/events-log-init.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docker-start-console.sh b/docker-start-console.sh index 734c567f9..58632e365 100755 --- a/docker-start-console.sh +++ b/docker-start-console.sh @@ -10,6 +10,7 @@ init() { echo "Initializing console..." inited="1" curl --silent --show-error http://$(hostname -f):3000/api/admin/events-log-init?token=$CONSOLE_INIT_TOKEN + echo "" fi } @@ -57,7 +58,7 @@ healthcheck() { if [ -f healthcheck-result ]; then cat healthcheck-result fi - echo "Running init..." + echo "" init else if [ "$http_code" = "000" ]; then diff --git a/webapps/console/pages/api/admin/events-log-init.ts b/webapps/console/pages/api/admin/events-log-init.ts index 2125683b5..eab6bda12 100644 --- a/webapps/console/pages/api/admin/events-log-init.ts +++ b/webapps/console/pages/api/admin/events-log-init.ts @@ -3,7 +3,7 @@ import { checkRawToken, getLog } from "juava"; import { clickhouse } from "../../../lib/server/clickhouse"; import { z } from "zod"; -export const log = getLog("events-log-trim"); +export const log = getLog("events-log-init"); export default createRoute() .GET({ From 9fe6371e749b0503f0fff59f0de5a7d96370a037 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 4 Jun 2024 10:27:50 +0400 Subject: [PATCH 0749/1353] remove duplicate of cname check --- package.json | 2 +- .../pages/api/[workspaceId]/domain-check.ts | 14 +------------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 514fc5cc6..d3dd045a9 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "lint": "turbo run lint --", "release": "pnpm build && pnpm test && monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/functions --filter ./libs/jitsu-js --filter ./libs/jitsu-react --npm-tag latest --git-tag 'jitsu-js-libs-v{version}' --push-tag", "release:build-scripts": "pnpm build --filter ./cli/build-scripts && monorel --filter ./cli/build-scripts --npm-tag latest --version 0.0.4-dev.{rev}.{time} --publish --git-tag 'jitsu-build-scripts-v{version}'", - "release:canary": "monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/functions --filter ./libs/jitsu-js --filter ./libs/jitsu-react --version '1.9.3-canary.{rev}.{time}' --npm-tag canary --git-tag 'jitsu-js-libs-canary-v{version}' --push-tag" + "release:canary": "monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/functions --filter ./libs/jitsu-js --filter ./libs/jitsu-react --version '1.9.5-canary.{rev}.{time}' --npm-tag canary --git-tag 'jitsu-js-libs-canary-v{version}' --push-tag" }, "devDependencies": { "@playwright/test": "1.39.0", diff --git a/webapps/console/pages/api/[workspaceId]/domain-check.ts b/webapps/console/pages/api/[workspaceId]/domain-check.ts index 1a8505a31..f2ca46976 100644 --- a/webapps/console/pages/api/[workspaceId]/domain-check.ts +++ b/webapps/console/pages/api/[workspaceId]/domain-check.ts @@ -1,13 +1,7 @@ import { getServerLog } from "../../../lib/server/log"; import { z } from "zod"; -import { - customDomainCnames, - isDomainAvailable, - resolveCname, - checkCname, - checkOrAddToIngress, -} from "../../../lib/server/custom-domains"; +import { customDomainCnames, isDomainAvailable, checkOrAddToIngress } from "../../../lib/server/custom-domains"; import { DomainCheckResponse } from "../../../lib/shared/domain-check-response"; import { createRoute, verifyAccess } from "../../../lib/api"; @@ -36,12 +30,6 @@ export default createRoute() ); return { ok: false, reason: "used_by_other_workspace" }; } - const cname = await resolveCname(domain); - const cnameValid = await checkCname(cname); - if (!cnameValid) { - log.atWarn().log(`Domain ${domain} is not valid`); - return { ok: false, reason: "requires_cname_configuration", cnameValue: customDomainCnames[0] }; - } try { const ingressStatus = await checkOrAddToIngress(domain); log.atInfo().log(`Ingress status for ${domain}: ${JSON.stringify(ingressStatus)}`); From 51caa2f643bfb7fc3eab5c907cc56a641e24b5d4 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 6 Jun 2024 09:13:20 +0400 Subject: [PATCH 0750/1353] Allow function names started with numbers --- libs/core-functions/src/functions/udf_wrapper.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/core-functions/src/functions/udf_wrapper.ts b/libs/core-functions/src/functions/udf_wrapper.ts index 2876bebd7..db0818e3f 100644 --- a/libs/core-functions/src/functions/udf_wrapper.ts +++ b/libs/core-functions/src/functions/udf_wrapper.ts @@ -121,7 +121,7 @@ export const UDFWrapper = ( const sw = stopwatch(); const f = functions[i]; log.atDebug().log(`[CON:${connectionId}]: [f:${f.id}] Compiling UDF function '${f.name}'`); - const moduleName = sanitize(f.name, "_") + "_" + f.id; + const moduleName = "f_" + sanitize(f.name, "_") + "_" + f.id; const udf = isolate.compileModuleSync(f.code, { filename: moduleName + ".js" }); udf.instantiateSync(context, (specifier: string) => { if (specifier === "@jitsu/functions-lib") { From bc40983f78239af9216419accd85ac2f51197c43 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 7 Jun 2024 11:58:16 +0400 Subject: [PATCH 0751/1353] rotor: upgrade isolate-vm to 5.0.0 docker images: node upgrade to 22 --- all.Dockerfile | 2 +- cli/build-scripts/package.json | 2 +- cli/jitsu-cli/package.json | 6 +- libs/core-functions/package.json | 2 +- pnpm-lock.yaml | 969 ++++++++++++++----------------- services/rotor/dist_package.json | 2 +- services/rotor/package.json | 10 +- 7 files changed, 453 insertions(+), 540 deletions(-) diff --git a/all.Dockerfile b/all.Dockerfile index 72e0dc394..96eba9629 100644 --- a/all.Dockerfile +++ b/all.Dockerfile @@ -2,7 +2,7 @@ # Build & push it with # docker buildx build --platform linux/amd64 . -f console.Dockerfile --push -t jitsucom/console:latest -FROM node:21-slim as base +FROM node:22-slim as base WORKDIR /app RUN apt-get update -y diff --git a/cli/build-scripts/package.json b/cli/build-scripts/package.json index 13a34ec6d..a0676c6ba 100644 --- a/cli/build-scripts/package.json +++ b/cli/build-scripts/package.json @@ -30,7 +30,7 @@ "@babel/preset-env": "^7.23.2", "@babel/preset-typescript": "^7.23.2", "babel-loader": "^9.1.3", - "webpack": "^5.88.2", + "webpack": "^5.91.0", "juava": "workspace:*" } } diff --git a/cli/jitsu-cli/package.json b/cli/jitsu-cli/package.json index 6a993a7b1..c8d1d1dc8 100644 --- a/cli/jitsu-cli/package.json +++ b/cli/jitsu-cli/package.json @@ -23,7 +23,7 @@ }, "dependencies": { "figlet": "^1.6.0", - "isolated-vm": "4.7.2", + "isolated-vm": "5.0.0", "jest-cli": "^29.7.0", "tslib": "^2.6.2" }, @@ -44,7 +44,7 @@ "@types/jest": "^29.5.5", "@types/lodash": "^4.14.198", "@types/node": "^18.15.3", - "@types/webpack": "^5.28.2", + "@types/webpack": "^5.28.5", "@webpack-cli/generators": "^3.0.7", "babel-loader": "^9.1.3", "chalk": "^5.3.0", @@ -66,7 +66,7 @@ "ts-loader": "^9.4.4", "ts-node": "^10.9.2", "typescript": "^5.3.3", - "webpack": "^5.88.2", + "webpack": "^5.91.0", "webpack-cli": "^5.1.4" } } diff --git a/libs/core-functions/package.json b/libs/core-functions/package.json index ba539fa07..3d8dfa147 100644 --- a/libs/core-functions/package.json +++ b/libs/core-functions/package.json @@ -40,7 +40,7 @@ "dayjs": "^1.11.10", "google-ads-api": "^14.2.0", "ioredis": "^5.3.2", - "isolated-vm": "4.7.2", + "isolated-vm": "5.0.0", "juava": "workspace:*", "lodash": "^4.17.21", "mongodb": "^6.5.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 02a37ea53..e8628c7b6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,5 +1,9 @@ lockfileVersion: '6.0' +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + importers: .: @@ -67,7 +71,7 @@ importers: version: 7.5.6 babel-loader: specifier: ^9.1.3 - version: 9.1.3(@babel/core@7.21.4)(webpack@5.88.2) + version: 9.1.3(@babel/core@7.21.4)(webpack@5.91.0) commander: specifier: ^11.0.0 version: 11.0.0 @@ -75,8 +79,8 @@ importers: specifier: workspace:* version: link:../../libs/juava webpack: - specifier: ^5.88.2 - version: 5.88.2(webpack-cli@5.0.1) + specifier: ^5.91.0 + version: 5.91.0(webpack-cli@5.1.4) cli/jitsu-cli: dependencies: @@ -84,8 +88,8 @@ importers: specifier: ^1.6.0 version: 1.6.0 isolated-vm: - specifier: 4.7.2 - version: 4.7.2 + specifier: 5.0.0 + version: 5.0.0 jest-cli: specifier: ^29.7.0 version: 29.7.0(@types/node@18.15.11)(ts-node@10.9.2) @@ -142,14 +146,14 @@ importers: specifier: ^18.15.3 version: 18.15.11 '@types/webpack': - specifier: ^5.28.2 - version: 5.28.2(webpack-cli@5.1.4) + specifier: ^5.28.5 + version: 5.28.5(webpack-cli@5.1.4) '@webpack-cli/generators': specifier: ^3.0.7 - version: 3.0.7(mem-fs-editor@9.7.0)(mem-fs@2.3.0)(prettier@2.8.7)(webpack-cli@5.1.4)(webpack@5.88.2) + version: 3.0.7(mem-fs-editor@9.7.0)(mem-fs@2.3.0)(prettier@2.8.7)(webpack-cli@5.1.4)(webpack@5.91.0) babel-loader: specifier: ^9.1.3 - version: 9.1.3(@babel/core@7.21.4)(webpack@5.88.2) + version: 9.1.3(@babel/core@7.21.4)(webpack@5.91.0) chalk: specifier: ^5.3.0 version: 5.3.0 @@ -185,7 +189,7 @@ importers: version: 3.3.2 node-loader: specifier: ^2.0.0 - version: 2.0.0(webpack@5.88.2) + version: 2.0.0(webpack@5.91.0) prismjs: specifier: ^1.29.0 version: 1.29.0 @@ -197,10 +201,10 @@ importers: version: 7.5.4 ts-jest: specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.21.4)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.3.3) + version: 29.1.1(@babel/core@7.21.4)(jest@29.7.0)(typescript@5.3.3) ts-loader: specifier: ^9.4.4 - version: 9.4.4(typescript@5.3.3)(webpack@5.88.2) + version: 9.4.4(typescript@5.3.3)(webpack@5.91.0) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@18.15.11)(typescript@5.3.3) @@ -208,11 +212,11 @@ importers: specifier: ^5.3.3 version: 5.3.3 webpack: - specifier: ^5.88.2 - version: 5.88.2(webpack-cli@5.1.4) + specifier: ^5.91.0 + version: 5.91.0(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 - version: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.88.2) + version: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.91.0) e2e: devDependencies: @@ -320,8 +324,8 @@ importers: specifier: ^5.3.2 version: 5.3.2 isolated-vm: - specifier: 4.7.2 - version: 4.7.2 + specifier: 5.0.0 + version: 5.0.0 juava: specifier: workspace:* version: link:../juava @@ -477,7 +481,7 @@ importers: version: 1.3.1 raw-loader: specifier: ^4.0.2 - version: 4.0.2(webpack@5.88.2) + version: 4.0.2(webpack@5.91.0) rollup: specifier: ^3.2.5 version: 3.20.2 @@ -553,7 +557,7 @@ importers: version: 29.7.0(@types/node@20.10.8)(ts-node@10.8.2) ts-jest: specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.21.4)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.3.3) + version: 29.1.1(@babel/core@7.21.4)(jest@29.7.0)(typescript@5.3.3) tslib: specifier: ^2.6.2 version: 2.6.2 @@ -734,20 +738,20 @@ importers: specifier: 0.0.69 version: 0.0.69 '@types/webpack': - specifier: ^5.28.0 - version: 5.28.1(webpack-cli@5.0.1) + specifier: ^5.28.5 + version: 5.28.5(webpack-cli@5.1.4) '@webpack-cli/generators': - specifier: ^3.0.0 - version: 3.0.1(mem-fs-editor@9.7.0)(mem-fs@2.3.0)(prettier@2.8.7)(webpack-cli@5.0.1)(webpack@5.78.0) + specifier: ^3.0.7 + version: 3.0.7(mem-fs-editor@9.7.0)(mem-fs@2.3.0)(prettier@2.8.7)(webpack-cli@5.1.4)(webpack@5.91.0) babel-loader: specifier: ^9.1.3 - version: 9.1.3(@babel/core@7.21.4)(webpack@5.78.0) + version: 9.1.3(@babel/core@7.21.4)(webpack@5.91.0) clean-webpack-plugin: specifier: ^4.0.0 - version: 4.0.0(webpack@5.78.0) + version: 4.0.0(webpack@5.91.0) copy-webpack-plugin: - specifier: ^11.0.0 - version: 11.0.0(webpack@5.78.0) + specifier: ^12.0.2 + version: 12.0.2(webpack@5.91.0) declaration-bundler-webpack-plugin: specifier: ^1.0.3 version: 1.0.3 @@ -762,7 +766,7 @@ importers: version: 4.17.21 node-loader: specifier: ^2.0.0 - version: 2.0.0(webpack@5.78.0) + version: 2.0.0(webpack@5.91.0) nodemon: specifier: ^2.0.20 version: 2.0.20 @@ -774,7 +778,7 @@ importers: version: 29.1.1(@babel/core@7.21.4)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.3.3) ts-loader: specifier: ^9.4.2 - version: 9.4.2(typescript@5.3.3)(webpack@5.78.0) + version: 9.4.2(typescript@5.3.3)(webpack@5.91.0) ts-node: specifier: ~10.9.1 version: 10.9.1(@types/node@18.15.11)(typescript@5.3.3) @@ -785,11 +789,11 @@ importers: specifier: ^5.3.3 version: 5.3.3 webpack: - specifier: ^5.75.0 - version: 5.78.0(webpack-cli@5.0.1) + specifier: ^5.91.0 + version: 5.91.0(webpack-cli@5.1.4) webpack-cli: - specifier: ^5.0.0 - version: 5.0.1(@webpack-cli/generators@3.0.1)(webpack@5.78.0) + specifier: ^5.1.4 + version: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.91.0) types/protocols: {} @@ -866,7 +870,7 @@ importers: version: 5.10.0(@rjsf/utils@5.10.0) '@sentry/nextjs': specifier: ^7.70.0 - version: 7.70.0(next@13.5.6)(react@18.2.0)(webpack@5.88.2) + version: 7.70.0(next@13.5.6)(react@18.2.0)(webpack@5.91.0) '@tanstack/react-query': specifier: ^4.2.1 version: 4.29.1(react-dom@18.2.0)(react@18.2.0) @@ -1083,7 +1087,7 @@ importers: version: 4.1.3 less-loader: specifier: ^10.2.0 - version: 10.2.0(less@4.1.3)(webpack@5.88.2) + version: 10.2.0(less@4.1.3)(webpack@5.91.0) minimist: specifier: ^1.2.7 version: 1.2.8 @@ -1095,7 +1099,7 @@ importers: version: 8.4.30 raw-loader: specifier: ^4.0.2 - version: 4.0.2(webpack@5.88.2) + version: 4.0.2(webpack@5.91.0) tailwindcss: specifier: ^3.0.24 version: 3.3.1(postcss@8.4.30)(ts-node@10.8.2) @@ -1207,7 +1211,7 @@ importers: version: 10.0.1 raw-loader: specifier: ^4.0.2 - version: 4.0.2(webpack@5.88.2) + version: 4.0.2(webpack@5.91.0) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@18.15.11)(typescript@5.3.3) @@ -4257,6 +4261,7 @@ packages: minimatch: 3.1.2 transitivePeerDependencies: - supports-color + dev: false /@humanwhocodes/gitignore-to-minimatch@1.0.2: resolution: {integrity: sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==} @@ -5214,6 +5219,12 @@ packages: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: @@ -5791,7 +5802,7 @@ packages: playwright: 1.39.0 dev: true - /@pmmmwh/react-refresh-webpack-plugin@0.5.10(react-refresh@0.11.0)(webpack-dev-server@4.13.2)(webpack@5.88.2): + /@pmmmwh/react-refresh-webpack-plugin@0.5.10(react-refresh@0.11.0)(webpack-dev-server@4.13.2)(webpack@5.91.0): resolution: {integrity: sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==} engines: {node: '>= 10.13'} peerDependencies: @@ -5827,8 +5838,8 @@ packages: react-refresh: 0.11.0 schema-utils: 3.3.0 source-map: 0.7.4 - webpack: 5.88.2(webpack-cli@5.0.1) - webpack-dev-server: 4.13.2(webpack@5.88.2) + webpack: 5.91.0(webpack-cli@5.1.4) + webpack-dev-server: 4.13.2(webpack@5.91.0) dev: false /@prisma/client@4.12.0(prisma@5.7.1): @@ -6758,7 +6769,7 @@ packages: tslib: 2.6.2 dev: false - /@sentry/nextjs@7.70.0(next@13.5.6)(react@18.2.0)(webpack@5.88.2): + /@sentry/nextjs@7.70.0(next@13.5.6)(react@18.2.0)(webpack@5.91.0): resolution: {integrity: sha512-Mpto8+LY4ZohRUOy1KJIM6r0oAJ+vo/lVAYXtO3L1rgSIcKD422XqBvJAQIQhQjru1/FpWVdOd2BKl+gD1emFw==} engines: {node: '>=8'} peerDependencies: @@ -6784,7 +6795,7 @@ packages: rollup: 2.78.0 stacktrace-parser: 0.1.10 tslib: 2.6.2 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.91.0(webpack-cli@5.1.4) transitivePeerDependencies: - encoding - supports-color @@ -6873,6 +6884,11 @@ packages: /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + /@sindresorhus/merge-streams@2.3.0: + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + dev: true + /@sinonjs/commons@1.8.6: resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} dependencies: @@ -8834,23 +8850,23 @@ packages: resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} dependencies: '@types/eslint': 8.37.0 - '@types/estree': 1.0.1 + '@types/estree': 1.0.5 /@types/eslint@8.37.0: resolution: {integrity: sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==} dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 /@types/estree@0.0.39: resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} - /@types/estree@0.0.51: - resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} - /@types/estree@1.0.1: resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + /@types/expect@1.20.4: resolution: {integrity: sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==} @@ -9237,25 +9253,12 @@ packages: resolution: {integrity: sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==} dev: false - /@types/webpack@5.28.1(webpack-cli@5.0.1): - resolution: {integrity: sha512-qw1MqGZclCoBrpiSe/hokSgQM/su8Ocpl3L/YHE0L6moyaypg4+5F7Uzq7NgaPKPxUxUbQ4fLPLpDWdR27bCZw==} + /@types/webpack@5.28.5(webpack-cli@5.1.4): + resolution: {integrity: sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==} dependencies: '@types/node': 20.10.8 tapable: 2.2.1 - webpack: 5.88.2(webpack-cli@5.0.1) - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - webpack-cli - dev: true - - /@types/webpack@5.28.2(webpack-cli@5.1.4): - resolution: {integrity: sha512-7tcxyrIOd7WGimZIcWU6pDsNh2edGGnwYExOvd3l/nMvuxqwVPrFXnnTbYCnplqV9BJoU7Mo2mfFtiH8CNFvYw==} - dependencies: - '@types/node': 18.15.11 - tapable: 2.2.1 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.91.0(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -9397,6 +9400,7 @@ packages: typescript: 5.3.3 transitivePeerDependencies: - supports-color + dev: false /@typescript-eslint/parser@5.58.0(eslint@8.55.0)(typescript@5.3.3): resolution: {integrity: sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==} @@ -9780,42 +9784,20 @@ packages: ts-morph: 12.0.0 dev: true - /@webassemblyjs/ast@1.11.1: - resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==} - dependencies: - '@webassemblyjs/helper-numbers': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - - /@webassemblyjs/ast@1.11.6: - resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + /@webassemblyjs/ast@1.12.1: + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} dependencies: '@webassemblyjs/helper-numbers': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - /@webassemblyjs/floating-point-hex-parser@1.11.1: - resolution: {integrity: sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==} - /@webassemblyjs/floating-point-hex-parser@1.11.6: resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - /@webassemblyjs/helper-api-error@1.11.1: - resolution: {integrity: sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==} - /@webassemblyjs/helper-api-error@1.11.6: resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - /@webassemblyjs/helper-buffer@1.11.1: - resolution: {integrity: sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==} - - /@webassemblyjs/helper-buffer@1.11.6: - resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} - - /@webassemblyjs/helper-numbers@1.11.1: - resolution: {integrity: sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==} - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.11.1 - '@webassemblyjs/helper-api-error': 1.11.1 - '@xtuc/long': 4.2.2 + /@webassemblyjs/helper-buffer@1.12.1: + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} /@webassemblyjs/helper-numbers@1.11.6: resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} @@ -9824,189 +9806,86 @@ packages: '@webassemblyjs/helper-api-error': 1.11.6 '@xtuc/long': 4.2.2 - /@webassemblyjs/helper-wasm-bytecode@1.11.1: - resolution: {integrity: sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==} - /@webassemblyjs/helper-wasm-bytecode@1.11.6: resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - /@webassemblyjs/helper-wasm-section@1.11.1: - resolution: {integrity: sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==} + /@webassemblyjs/helper-wasm-section@1.12.1: + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-buffer': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - '@webassemblyjs/wasm-gen': 1.11.1 - - /@webassemblyjs/helper-wasm-section@1.11.6: - resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - - /@webassemblyjs/ieee754@1.11.1: - resolution: {integrity: sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==} - dependencies: - '@xtuc/ieee754': 1.2.0 + '@webassemblyjs/wasm-gen': 1.12.1 /@webassemblyjs/ieee754@1.11.6: resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} dependencies: '@xtuc/ieee754': 1.2.0 - /@webassemblyjs/leb128@1.11.1: - resolution: {integrity: sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==} - dependencies: - '@xtuc/long': 4.2.2 - /@webassemblyjs/leb128@1.11.6: resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} dependencies: '@xtuc/long': 4.2.2 - /@webassemblyjs/utf8@1.11.1: - resolution: {integrity: sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==} - /@webassemblyjs/utf8@1.11.6: resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - /@webassemblyjs/wasm-edit@1.11.1: - resolution: {integrity: sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==} - dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-buffer': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - '@webassemblyjs/helper-wasm-section': 1.11.1 - '@webassemblyjs/wasm-gen': 1.11.1 - '@webassemblyjs/wasm-opt': 1.11.1 - '@webassemblyjs/wasm-parser': 1.11.1 - '@webassemblyjs/wast-printer': 1.11.1 - - /@webassemblyjs/wasm-edit@1.11.6: - resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + /@webassemblyjs/wasm-edit@1.12.1: + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/helper-wasm-section': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-opt': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - '@webassemblyjs/wast-printer': 1.11.6 - - /@webassemblyjs/wasm-gen@1.11.1: - resolution: {integrity: sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==} - dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - '@webassemblyjs/ieee754': 1.11.1 - '@webassemblyjs/leb128': 1.11.1 - '@webassemblyjs/utf8': 1.11.1 + '@webassemblyjs/helper-wasm-section': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-opt': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/wast-printer': 1.12.1 - /@webassemblyjs/wasm-gen@1.11.6: - resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + /@webassemblyjs/wasm-gen@1.12.1: + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} dependencies: - '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - /@webassemblyjs/wasm-opt@1.11.1: - resolution: {integrity: sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==} + /@webassemblyjs/wasm-opt@1.12.1: + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-buffer': 1.11.1 - '@webassemblyjs/wasm-gen': 1.11.1 - '@webassemblyjs/wasm-parser': 1.11.1 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 - /@webassemblyjs/wasm-opt@1.11.6: - resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + /@webassemblyjs/wasm-parser@1.12.1: + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - - /@webassemblyjs/wasm-parser@1.11.1: - resolution: {integrity: sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==} - dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-api-error': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - '@webassemblyjs/ieee754': 1.11.1 - '@webassemblyjs/leb128': 1.11.1 - '@webassemblyjs/utf8': 1.11.1 - - /@webassemblyjs/wasm-parser@1.11.6: - resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} - dependencies: - '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-api-error': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - /@webassemblyjs/wast-printer@1.11.1: - resolution: {integrity: sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==} - dependencies: - '@webassemblyjs/ast': 1.11.1 - '@xtuc/long': 4.2.2 - - /@webassemblyjs/wast-printer@1.11.6: - resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + /@webassemblyjs/wast-printer@1.12.1: + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} dependencies: - '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 - /@webpack-cli/configtest@2.0.1(webpack-cli@5.0.1)(webpack@5.78.0): - resolution: {integrity: sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - dependencies: - webpack: 5.78.0(webpack-cli@5.0.1) - webpack-cli: 5.0.1(@webpack-cli/generators@3.0.1)(webpack@5.78.0) - - /@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.88.2): + /@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.91.0): resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} engines: {node: '>=14.15.0'} peerDependencies: webpack: 5.x.x webpack-cli: 5.x.x dependencies: - webpack: 5.88.2(webpack-cli@5.1.4) - webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.88.2) - dev: true - - /@webpack-cli/generators@3.0.1(mem-fs-editor@9.7.0)(mem-fs@2.3.0)(prettier@2.8.7)(webpack-cli@5.0.1)(webpack@5.78.0): - resolution: {integrity: sha512-kgtqwN13udxC2wV2LfEmJQ/yGz6+j8cgy17jE9ybyHrmT0PJcwjSpsvj1fDWYUb7brSOB4B03s1mEPjZTRfwCQ==} - engines: {node: '>=14.15.0'} - peerDependencies: - prettier: '*' - webpack: 5.x.x - webpack-cli: 5.x.x - peerDependenciesMeta: - prettier: - optional: true - dependencies: - prettier: 2.8.7 - webpack: 5.78.0(webpack-cli@5.0.1) - webpack-cli: 5.0.1(@webpack-cli/generators@3.0.1)(webpack@5.78.0) - yeoman-environment: 3.15.1(mem-fs-editor@9.7.0)(mem-fs@2.3.0) - yeoman-generator: 5.8.0(mem-fs@2.3.0)(yeoman-environment@3.15.1) - transitivePeerDependencies: - - bluebird - - encoding - - mem-fs - - mem-fs-editor - - supports-color + webpack: 5.91.0(webpack-cli@5.1.4) + webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.91.0) - /@webpack-cli/generators@3.0.7(mem-fs-editor@9.7.0)(mem-fs@2.3.0)(prettier@2.8.7)(webpack-cli@5.1.4)(webpack@5.88.2): + /@webpack-cli/generators@3.0.7(mem-fs-editor@9.7.0)(mem-fs@2.3.0)(prettier@2.8.7)(webpack-cli@5.1.4)(webpack@5.91.0): resolution: {integrity: sha512-H4dlEX8CzO5EHBYYZQop9x4w6lG9FenSF/1spLRlvRAULDgTs0VfmwOuwp03tTLml9jpMsouuVw6vEN8KpwE/w==} engines: {node: '>=14.15.0'} peerDependencies: @@ -10018,8 +9897,8 @@ packages: optional: true dependencies: prettier: 2.8.7 - webpack: 5.88.2(webpack-cli@5.1.4) - webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.88.2) + webpack: 5.91.0(webpack-cli@5.1.4) + webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.91.0) yeoman-environment: 3.15.1(mem-fs-editor@9.7.0)(mem-fs@2.3.0) yeoman-generator: 5.8.0(mem-fs@2.3.0)(yeoman-environment@3.15.1) transitivePeerDependencies: @@ -10028,44 +9907,18 @@ packages: - mem-fs - mem-fs-editor - supports-color - dev: true - /@webpack-cli/info@2.0.1(webpack-cli@5.0.1)(webpack@5.78.0): - resolution: {integrity: sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - dependencies: - webpack: 5.78.0(webpack-cli@5.0.1) - webpack-cli: 5.0.1(@webpack-cli/generators@3.0.1)(webpack@5.78.0) - - /@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.88.2): + /@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.91.0): resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} engines: {node: '>=14.15.0'} peerDependencies: webpack: 5.x.x webpack-cli: 5.x.x dependencies: - webpack: 5.88.2(webpack-cli@5.1.4) - webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.88.2) - dev: true + webpack: 5.91.0(webpack-cli@5.1.4) + webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.91.0) - /@webpack-cli/serve@2.0.1(webpack-cli@5.0.1)(webpack@5.78.0): - resolution: {integrity: sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - webpack-dev-server: '*' - peerDependenciesMeta: - webpack-dev-server: - optional: true - dependencies: - webpack: 5.78.0(webpack-cli@5.0.1) - webpack-cli: 5.0.1(@webpack-cli/generators@3.0.1)(webpack@5.78.0) - - /@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.88.2): + /@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.91.0): resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} engines: {node: '>=14.15.0'} peerDependencies: @@ -10076,9 +9929,8 @@ packages: webpack-dev-server: optional: true dependencies: - webpack: 5.88.2(webpack-cli@5.1.4) - webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.88.2) - dev: true + webpack: 5.91.0(webpack-cli@5.1.4) + webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.91.0) /@xobotyi/scrollbar-width@1.9.5: resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} @@ -10118,19 +9970,12 @@ packages: acorn-walk: 7.2.0 dev: false - /acorn-import-assertions@1.8.0(acorn@8.8.2): - resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==} - peerDependencies: - acorn: ^8 - dependencies: - acorn: 8.8.2 - - /acorn-import-assertions@1.9.0(acorn@8.8.2): + /acorn-import-assertions@1.9.0(acorn@8.11.3): resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} peerDependencies: acorn: ^8 dependencies: - acorn: 8.8.2 + acorn: 8.11.3 /acorn-jsx@5.3.2(acorn@8.11.3): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -10478,6 +10323,7 @@ packages: /are-we-there-yet@3.0.1: resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. dependencies: delegates: 1.0.0 readable-stream: 3.6.2 @@ -10785,7 +10631,7 @@ packages: transitivePeerDependencies: - supports-color - /babel-loader@8.3.0(@babel/core@7.21.4)(webpack@5.88.2): + /babel-loader@8.3.0(@babel/core@7.21.4)(webpack@5.91.0): resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} engines: {node: '>= 8.9'} peerDependencies: @@ -10797,23 +10643,10 @@ packages: loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.91.0(webpack-cli@5.1.4) dev: false - /babel-loader@9.1.3(@babel/core@7.21.4)(webpack@5.78.0): - resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} - engines: {node: '>= 14.15.0'} - peerDependencies: - '@babel/core': ^7.12.0 - webpack: '>=5' - dependencies: - '@babel/core': 7.21.4 - find-cache-dir: 4.0.0 - schema-utils: 4.0.0 - webpack: 5.78.0(webpack-cli@5.0.1) - dev: true - - /babel-loader@9.1.3(@babel/core@7.21.4)(webpack@5.88.2): + /babel-loader@9.1.3(@babel/core@7.21.4)(webpack@5.91.0): resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -10823,7 +10656,7 @@ packages: '@babel/core': 7.21.4 find-cache-dir: 4.0.0 schema-utils: 4.0.0 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.91.0(webpack-cli@5.1.4) dev: true /babel-plugin-istanbul@6.1.1: @@ -11617,14 +11450,14 @@ packages: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} - /clean-webpack-plugin@4.0.0(webpack@5.78.0): + /clean-webpack-plugin@4.0.0(webpack@5.91.0): resolution: {integrity: sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==} engines: {node: '>=10.0.0'} peerDependencies: webpack: '>=4.0.0 <6.0.0' dependencies: del: 4.1.1 - webpack: 5.78.0(webpack-cli@5.0.1) + webpack: 5.91.0(webpack-cli@5.1.4) dev: true /cli-boxes@3.0.0: @@ -11804,7 +11637,6 @@ packages: /commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} - dev: true /commander@11.0.0: resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} @@ -11837,10 +11669,6 @@ packages: engines: {node: '>= 12'} dev: false - /commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - /common-ancestor-path@1.0.1: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} @@ -11992,19 +11820,19 @@ packages: dependencies: toggle-selection: 1.0.6 - /copy-webpack-plugin@11.0.0(webpack@5.78.0): - resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} - engines: {node: '>= 14.15.0'} + /copy-webpack-plugin@12.0.2(webpack@5.91.0): + resolution: {integrity: sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==} + engines: {node: '>= 18.12.0'} peerDependencies: webpack: ^5.1.0 dependencies: - fast-glob: 3.2.12 + fast-glob: 3.3.2 glob-parent: 6.0.2 - globby: 13.1.4 + globby: 14.0.1 normalize-path: 3.0.0 - schema-utils: 4.0.0 - serialize-javascript: 6.0.1 - webpack: 5.78.0(webpack-cli@5.0.1) + schema-utils: 4.2.0 + serialize-javascript: 6.0.2 + webpack: 5.91.0(webpack-cli@5.1.4) dev: true /core-js-compat@3.32.2: @@ -12249,7 +12077,7 @@ packages: hyphenate-style-name: 1.0.4 dev: false - /css-loader@6.7.3(webpack@5.88.2): + /css-loader@6.7.3(webpack@5.91.0): resolution: {integrity: sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -12263,10 +12091,10 @@ packages: postcss-modules-values: 4.0.0(postcss@8.4.31) postcss-value-parser: 4.2.0 semver: 7.5.4 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.91.0(webpack-cli@5.1.4) dev: false - /css-minimizer-webpack-plugin@3.4.1(webpack@5.88.2): + /css-minimizer-webpack-plugin@3.4.1(webpack@5.91.0): resolution: {integrity: sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -12291,7 +12119,7 @@ packages: schema-utils: 4.0.0 serialize-javascript: 6.0.1 source-map: 0.6.1 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.91.0(webpack-cli@5.1.4) dev: false /css-modules-loader-core@1.1.0: @@ -13234,6 +13062,7 @@ packages: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 + dev: true /enhanced-resolve@5.13.0: resolution: {integrity: sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==} @@ -13249,6 +13078,14 @@ packages: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 + dev: true + + /enhanced-resolve@5.17.0: + resolution: {integrity: sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 /ent@2.2.0: resolution: {integrity: sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==} @@ -13360,9 +13197,6 @@ packages: isarray: 2.0.5 stop-iteration-iterator: 1.0.0 - /es-module-lexer@0.9.3: - resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} - /es-module-lexer@1.2.1: resolution: {integrity: sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==} @@ -13700,7 +13534,7 @@ packages: eslint: 8.24.0 eslint-import-resolver-node: 0.3.7 eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.24.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.29.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.24.0) eslint-plugin-jsx-a11y: 6.7.1(eslint@8.24.0) eslint-plugin-react: 7.32.2(eslint@8.24.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.24.0) @@ -13738,7 +13572,7 @@ packages: confusing-browser-globals: 1.0.11 eslint: 8.55.0 eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.55.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.29.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint@8.55.0) eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.58.0)(eslint@8.55.0)(jest@27.5.1)(typescript@5.3.3) eslint-plugin-jsx-a11y: 6.7.1(eslint@8.55.0) eslint-plugin-react: 7.32.2(eslint@8.55.0) @@ -13779,6 +13613,7 @@ packages: tsconfig-paths: 3.14.2 transitivePeerDependencies: - supports-color + dev: false /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.24.0): resolution: {integrity: sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==} @@ -13791,7 +13626,7 @@ packages: enhanced-resolve: 5.15.0 eslint: 8.24.0 eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.24.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.29.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.24.0) get-tsconfig: 4.5.0 globby: 13.1.4 is-core-module: 2.12.0 @@ -13832,6 +13667,7 @@ packages: eslint-import-resolver-typescript: 2.7.1(eslint-plugin-import@2.27.5)(eslint@8.29.0) transitivePeerDependencies: - supports-color + dev: false /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.24.0): resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} @@ -13863,6 +13699,35 @@ packages: - supports-color dev: true + /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint@8.55.0): + resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 5.58.0(eslint@8.55.0)(typescript@5.3.3) + debug: 3.2.7(supports-color@5.5.0) + eslint: 8.55.0 + eslint-import-resolver-node: 0.3.7 + transitivePeerDependencies: + - supports-color + dev: false + /eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.55.0): resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} engines: {node: '>=12.0.0'} @@ -13909,6 +13774,73 @@ packages: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color + dev: false + + /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.24.0): + resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 5.58.0(eslint@8.24.0)(typescript@5.3.3) + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 + array.prototype.flatmap: 1.3.1 + debug: 3.2.7(supports-color@5.5.0) + doctrine: 2.1.0 + eslint: 8.24.0 + eslint-import-resolver-node: 0.3.7 + eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.24.0) + has: 1.0.3 + is-core-module: 2.12.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.values: 1.1.6 + resolve: 1.22.2 + semver: 6.3.1 + tsconfig-paths: 3.14.2 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.58.0)(eslint@8.55.0): + resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 5.58.0(eslint@8.55.0)(typescript@5.3.3) + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 + array.prototype.flatmap: 1.3.1 + debug: 3.2.7(supports-color@5.5.0) + doctrine: 2.1.0 + eslint: 8.55.0 + eslint-import-resolver-node: 0.3.7 + eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint@8.55.0) + has: 1.0.3 + is-core-module: 2.12.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.values: 1.1.6 + resolve: 1.22.2 + semver: 6.3.1 + tsconfig-paths: 3.14.2 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: false /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.58.0)(eslint@8.55.0)(jest@27.5.1)(typescript@5.3.3): resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} @@ -14177,6 +14109,7 @@ packages: dependencies: eslint: 8.29.0 eslint-visitor-keys: 2.1.0 + dev: false /eslint-visitor-keys@2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} @@ -14190,7 +14123,7 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /eslint-webpack-plugin@3.2.0(eslint@8.55.0)(webpack@5.88.2): + /eslint-webpack-plugin@3.2.0(eslint@8.55.0)(webpack@5.91.0): resolution: {integrity: sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -14203,7 +14136,7 @@ packages: micromatch: 4.0.5 normalize-path: 3.0.0 schema-utils: 4.0.0 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.91.0(webpack-cli@5.1.4) dev: false /eslint@8.24.0: @@ -14300,6 +14233,7 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color + dev: false /eslint@8.55.0: resolution: {integrity: sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==} @@ -14593,6 +14527,17 @@ packages: merge2: 1.4.1 micromatch: 4.0.5 + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -14719,7 +14664,7 @@ packages: dependencies: flat-cache: 3.0.4 - /file-loader@6.2.0(webpack@5.88.2): + /file-loader@6.2.0(webpack@5.91.0): resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -14727,7 +14672,7 @@ packages: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.91.0(webpack-cli@5.1.4) dev: false /file-uri-to-path@1.0.0: @@ -14924,7 +14869,7 @@ packages: dependencies: is-callable: 1.2.7 - /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.55.0)(typescript@5.3.3)(webpack@5.88.2): + /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.55.0)(typescript@5.3.3)(webpack@5.91.0): resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} engines: {node: '>=10', yarn: '>=1.0.0'} peerDependencies: @@ -14953,7 +14898,7 @@ packages: semver: 7.5.4 tapable: 1.1.3 typescript: 5.3.3 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.91.0(webpack-cli@5.1.4) dev: false /form-data@2.5.1: @@ -15404,6 +15349,18 @@ packages: slash: 4.0.0 dev: true + /globby@14.0.1: + resolution: {integrity: sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==} + engines: {node: '>=18'} + dependencies: + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.2 + ignore: 5.2.4 + path-type: 5.0.0 + slash: 5.1.0 + unicorn-magic: 0.1.0 + dev: true + /globby@6.1.0: resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} engines: {node: '>=0.10.0'} @@ -15815,7 +15772,7 @@ packages: uglify-js: 3.17.4 dev: false - /html-webpack-plugin@5.5.0(webpack@5.88.2): + /html-webpack-plugin@5.5.0(webpack@5.91.0): resolution: {integrity: sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==} engines: {node: '>=10.13.0'} peerDependencies: @@ -15826,7 +15783,7 @@ packages: lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.91.0(webpack-cli@5.1.4) dev: false /htmlencode@0.0.4: @@ -16616,9 +16573,9 @@ packages: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} - /isolated-vm@4.7.2: - resolution: {integrity: sha512-JVEs5gzWObzZK5+OlBplCdYSpokMcdhLSs/xWYYxmYWVfOOFF4oZJsYh7E/FmfX8e7gMioXMpMMeEyX1afuKrg==} - engines: {node: '>=16.0.0'} + /isolated-vm@5.0.0: + resolution: {integrity: sha512-rIMTrIUuwOZ57wK1V3/dmgyXMc1oX4YbGgALAiAH59xHrWoEwOtCQjjvuPZGZwllkMgYlOoNk6hW0+Mg04gJEw==} + engines: {node: '>=18.0.0'} requiresBuild: true dependencies: prebuild-install: 7.1.1 @@ -19043,7 +19000,7 @@ packages: readable-stream: 2.3.8 dev: true - /less-loader@10.2.0(less@4.1.3)(webpack@5.88.2): + /less-loader@10.2.0(less@4.1.3)(webpack@5.91.0): resolution: {integrity: sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -19052,7 +19009,7 @@ packages: dependencies: klona: 2.0.6 less: 4.1.3 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.91.0(webpack-cli@5.1.4) dev: true /less@4.1.3: @@ -19707,14 +19664,14 @@ packages: engines: {node: '>=4'} dev: true - /mini-css-extract-plugin@2.7.5(webpack@5.88.2): + /mini-css-extract-plugin@2.7.5(webpack@5.91.0): resolution: {integrity: sha512-9HaR++0mlgom81s95vvNjxkg52n2b5s//3ZTI1EtzFb98awsLSivs2LMsVqnQ3ay0PVhqWcGNyDaTE961FOcjQ==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 dependencies: schema-utils: 4.0.0 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.91.0(webpack-cli@5.1.4) dev: false /minimalistic-assert@1.0.1: @@ -20609,24 +20566,14 @@ packages: /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - /node-loader@2.0.0(webpack@5.78.0): + /node-loader@2.0.0(webpack@5.91.0): resolution: {integrity: sha512-I5VN34NO4/5UYJaUBtkrODPWxbobrE4hgDqPrjB25yPkonFhCmZ146vTH+Zg417E9Iwoh1l/MbRs1apc5J295Q==} engines: {node: '>= 10.13.0'} peerDependencies: webpack: ^5.0.0 dependencies: loader-utils: 2.0.4 - webpack: 5.78.0(webpack-cli@5.0.1) - dev: true - - /node-loader@2.0.0(webpack@5.88.2): - resolution: {integrity: sha512-I5VN34NO4/5UYJaUBtkrODPWxbobrE4hgDqPrjB25yPkonFhCmZ146vTH+Zg417E9Iwoh1l/MbRs1apc5J295Q==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^5.0.0 - dependencies: - loader-utils: 2.0.4 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.91.0(webpack-cli@5.1.4) dev: true /node-postgres@0.6.2: @@ -21309,6 +21256,11 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + /path-type@5.0.0: + resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} + engines: {node: '>=12'} + dev: true + /pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} dev: true @@ -21913,7 +21865,7 @@ packages: yaml: 1.10.2 dev: true - /postcss-loader@6.2.1(postcss@8.4.30)(webpack@5.88.2): + /postcss-loader@6.2.1(postcss@8.4.30)(webpack@5.91.0): resolution: {integrity: sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -21924,7 +21876,7 @@ packages: klona: 2.0.6 postcss: 8.4.30 semver: 7.5.4 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.91.0(webpack-cli@5.1.4) dev: false /postcss-logical@5.0.4(postcss@8.4.30): @@ -23121,7 +23073,7 @@ packages: iconv-lite: 0.4.24 unpipe: 1.0.0 - /raw-loader@4.0.2(webpack@5.88.2): + /raw-loader@4.0.2(webpack@5.91.0): resolution: {integrity: sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -23129,7 +23081,7 @@ packages: dependencies: loader-utils: 2.0.4 schema-utils: 3.1.1 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.91.0(webpack-cli@5.1.4) dev: true /rc-align@4.0.15(react-dom@18.2.0)(react@18.2.0): @@ -23684,7 +23636,7 @@ packages: pure-color: 1.3.0 dev: false - /react-dev-utils@12.0.1(eslint@8.55.0)(typescript@5.3.3)(webpack@5.88.2): + /react-dev-utils@12.0.1(eslint@8.55.0)(typescript@5.3.3)(webpack@5.91.0): resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} engines: {node: '>=14'} peerDependencies: @@ -23703,7 +23655,7 @@ packages: escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.55.0)(typescript@5.3.3)(webpack@5.88.2) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.55.0)(typescript@5.3.3)(webpack@5.91.0) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -23719,7 +23671,7 @@ packages: strip-ansi: 6.0.1 text-table: 0.2.0 typescript: 5.3.3 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.91.0(webpack-cli@5.1.4) transitivePeerDependencies: - eslint - supports-color @@ -23830,54 +23782,54 @@ packages: optional: true dependencies: '@babel/core': 7.21.4 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(webpack-dev-server@4.13.2)(webpack@5.88.2) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(webpack-dev-server@4.13.2)(webpack@5.91.0) '@svgr/webpack': 5.5.0 babel-jest: 27.5.1(@babel/core@7.21.4) - babel-loader: 8.3.0(@babel/core@7.21.4)(webpack@5.88.2) + babel-loader: 8.3.0(@babel/core@7.21.4)(webpack@5.91.0) babel-plugin-named-asset-import: 0.3.8(@babel/core@7.21.4) babel-preset-react-app: 10.0.1 bfj: 7.0.2 browserslist: 4.21.10 camelcase: 6.3.0 case-sensitive-paths-webpack-plugin: 2.4.0 - css-loader: 6.7.3(webpack@5.88.2) - css-minimizer-webpack-plugin: 3.4.1(webpack@5.88.2) + css-loader: 6.7.3(webpack@5.91.0) + css-minimizer-webpack-plugin: 3.4.1(webpack@5.91.0) dotenv: 10.0.0 dotenv-expand: 5.1.0 eslint: 8.55.0 eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.55.0)(jest@27.5.1)(typescript@5.3.3) - eslint-webpack-plugin: 3.2.0(eslint@8.55.0)(webpack@5.88.2) - file-loader: 6.2.0(webpack@5.88.2) + eslint-webpack-plugin: 3.2.0(eslint@8.55.0)(webpack@5.91.0) + file-loader: 6.2.0(webpack@5.91.0) fs-extra: 10.1.0 - html-webpack-plugin: 5.5.0(webpack@5.88.2) + html-webpack-plugin: 5.5.0(webpack@5.91.0) identity-obj-proxy: 3.0.0 jest: 27.5.1(ts-node@10.8.2) jest-resolve: 27.5.1 jest-watch-typeahead: 1.1.0(jest@27.5.1) - mini-css-extract-plugin: 2.7.5(webpack@5.88.2) + mini-css-extract-plugin: 2.7.5(webpack@5.91.0) postcss: 8.4.30 postcss-flexbugs-fixes: 5.0.2(postcss@8.4.30) - postcss-loader: 6.2.1(postcss@8.4.30)(webpack@5.88.2) + postcss-loader: 6.2.1(postcss@8.4.30)(webpack@5.91.0) postcss-normalize: 10.0.1(browserslist@4.21.10)(postcss@8.4.30) postcss-preset-env: 7.8.3(postcss@8.4.30) prompts: 2.4.2 react: 18.2.0 react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@8.55.0)(typescript@5.3.3)(webpack@5.88.2) + react-dev-utils: 12.0.1(eslint@8.55.0)(typescript@5.3.3)(webpack@5.91.0) react-refresh: 0.11.0 resolve: 1.22.2 resolve-url-loader: 4.0.0 - sass-loader: 12.6.0(webpack@5.88.2) + sass-loader: 12.6.0(webpack@5.91.0) semver: 7.5.4 - source-map-loader: 3.0.2(webpack@5.88.2) - style-loader: 3.3.2(webpack@5.88.2) + source-map-loader: 3.0.2(webpack@5.91.0) + style-loader: 3.3.2(webpack@5.91.0) tailwindcss: 3.3.1(postcss@8.4.30)(ts-node@10.8.2) - terser-webpack-plugin: 5.3.7(webpack@5.88.2) + terser-webpack-plugin: 5.3.7(webpack@5.91.0) typescript: 5.3.3 - webpack: 5.88.2(webpack-cli@5.0.1) - webpack-dev-server: 4.13.2(webpack@5.88.2) - webpack-manifest-plugin: 4.1.1(webpack@5.88.2) - workbox-webpack-plugin: 6.5.4(webpack@5.88.2) + webpack: 5.91.0(webpack-cli@5.1.4) + webpack-dev-server: 4.13.2(webpack@5.91.0) + webpack-manifest-plugin: 4.1.1(webpack@5.91.0) + workbox-webpack-plugin: 6.5.4(webpack@5.91.0) optionalDependencies: fsevents: 2.3.2 transitivePeerDependencies: @@ -24606,7 +24558,7 @@ packages: resolution: {integrity: sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==} dev: false - /sass-loader@12.6.0(webpack@5.88.2): + /sass-loader@12.6.0(webpack@5.91.0): resolution: {integrity: sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -24627,7 +24579,7 @@ packages: dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.91.0(webpack-cli@5.1.4) dev: false /sax@1.2.4: @@ -24677,12 +24629,13 @@ packages: '@types/json-schema': 7.0.11 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) + dev: true /schema-utils@3.3.0: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/json-schema': 7.0.11 + '@types/json-schema': 7.0.15 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) @@ -24695,6 +24648,16 @@ packages: ajv-formats: 2.1.1(ajv@8.12.0) ajv-keywords: 5.1.0(ajv@8.12.0) + /schema-utils@4.2.0: + resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} + engines: {node: '>= 12.13.0'} + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + ajv-keywords: 5.1.0(ajv@8.12.0) + dev: true + /scoped-regex@2.1.0: resolution: {integrity: sha512-g3WxHrqSWCZHGHlSrF51VXFdjImhwvH8ZO/pryFH56Qi0cDsZfylQa/t0jCzVQFNbNvM00HfHjkDPEuarKDSWQ==} engines: {node: '>=8'} @@ -24778,6 +24741,12 @@ packages: dependencies: randombytes: 2.1.0 + /serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + dependencies: + randombytes: 2.1.0 + dev: true + /serve-index@1.9.1: resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} engines: {node: '>= 0.8.0'} @@ -24932,6 +24901,11 @@ packages: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} engines: {node: '>=12'} + /slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + dev: true + /slick@1.12.2: resolution: {integrity: sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==} dev: false @@ -24997,7 +24971,7 @@ packages: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} - /source-map-loader@3.0.2(webpack@5.88.2): + /source-map-loader@3.0.2(webpack@5.91.0): resolution: {integrity: sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -25006,7 +24980,7 @@ packages: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.0.2 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.91.0(webpack-cli@5.1.4) dev: false /source-map-support@0.5.13: @@ -25469,13 +25443,13 @@ packages: resolution: {integrity: sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==} dev: true - /style-loader@3.3.2(webpack@5.88.2): + /style-loader@3.3.2(webpack@5.91.0): resolution: {integrity: sha512-RHs/vcrKdQK8wZliteNK4NKzxvLBzpuHMqYmUVWeKa6MkaIQ97ZTOS0b+zapZhy6GcrgWnvWYCMHRirC3FsUmw==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 dependencies: - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.91.0(webpack-cli@5.1.4) dev: false /styled-jsx@5.1.1(@babel/core@7.21.4)(react@18.2.0): @@ -25802,8 +25776,8 @@ packages: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - /terser-webpack-plugin@5.3.7(webpack@5.78.0): - resolution: {integrity: sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==} + /terser-webpack-plugin@5.3.10(webpack@5.91.0): + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -25818,14 +25792,14 @@ packages: uglify-js: optional: true dependencies: - '@jridgewell/trace-mapping': 0.3.18 + '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.1 - terser: 5.19.4 - webpack: 5.78.0(webpack-cli@5.0.1) + terser: 5.31.1 + webpack: 5.91.0(webpack-cli@5.1.4) - /terser-webpack-plugin@5.3.7(webpack@5.88.2): + /terser-webpack-plugin@5.3.7(webpack@5.91.0): resolution: {integrity: sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -25846,7 +25820,8 @@ packages: schema-utils: 3.3.0 serialize-javascript: 6.0.1 terser: 5.19.4 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.91.0(webpack-cli@5.1.4) + dev: false /terser@4.8.1: resolution: {integrity: sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==} @@ -25880,6 +25855,16 @@ packages: commander: 2.20.3 source-map-support: 0.5.21 + /terser@5.31.1: + resolution: {integrity: sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.3 + acorn: 8.11.3 + commander: 2.20.3 + source-map-support: 0.5.21 + /test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} @@ -26199,7 +26184,41 @@ packages: yargs-parser: 21.1.1 dev: true - /ts-loader@9.4.2(typescript@5.3.3)(webpack@5.78.0): + /ts-jest@29.1.1(@babel/core@7.21.4)(jest@29.7.0)(typescript@5.3.3): + resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@babel/core': 7.21.4 + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@18.15.11)(ts-node@10.9.2) + jest-util: 29.5.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.5.4 + typescript: 5.3.3 + yargs-parser: 21.1.1 + dev: true + + /ts-loader@9.4.2(typescript@5.3.3)(webpack@5.91.0): resolution: {integrity: sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==} engines: {node: '>=12.0.0'} peerDependencies: @@ -26211,10 +26230,10 @@ packages: micromatch: 4.0.5 semver: 7.5.4 typescript: 5.3.3 - webpack: 5.78.0(webpack-cli@5.0.1) + webpack: 5.91.0(webpack-cli@5.1.4) dev: true - /ts-loader@9.4.4(typescript@5.3.3)(webpack@5.88.2): + /ts-loader@9.4.4(typescript@5.3.3)(webpack@5.91.0): resolution: {integrity: sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==} engines: {node: '>=12.0.0'} peerDependencies: @@ -26226,7 +26245,7 @@ packages: micromatch: 4.0.5 semver: 7.5.4 typescript: 5.3.3 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.91.0(webpack-cli@5.1.4) dev: true /ts-morph@12.0.0: @@ -26351,7 +26370,7 @@ packages: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 '@types/node': 14.18.33 - acorn: 8.8.2 + acorn: 8.11.3 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 @@ -26770,6 +26789,11 @@ packages: resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} engines: {node: '>=4'} + /unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + dev: true + /uniq@1.0.1: resolution: {integrity: sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==} dev: true @@ -27132,6 +27156,14 @@ packages: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 + dev: false + + /watchpack@2.4.1: + resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 /wbuf@1.7.3: resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} @@ -27192,40 +27224,7 @@ packages: engines: {node: '>=12'} dev: false - /webpack-cli@5.0.1(@webpack-cli/generators@3.0.1)(webpack@5.78.0): - resolution: {integrity: sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A==} - engines: {node: '>=14.15.0'} - hasBin: true - peerDependencies: - '@webpack-cli/generators': '*' - webpack: 5.x.x - webpack-bundle-analyzer: '*' - webpack-dev-server: '*' - peerDependenciesMeta: - '@webpack-cli/generators': - optional: true - webpack-bundle-analyzer: - optional: true - webpack-dev-server: - optional: true - dependencies: - '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.0.1(webpack-cli@5.0.1)(webpack@5.78.0) - '@webpack-cli/generators': 3.0.1(mem-fs-editor@9.7.0)(mem-fs@2.3.0)(prettier@2.8.7)(webpack-cli@5.0.1)(webpack@5.78.0) - '@webpack-cli/info': 2.0.1(webpack-cli@5.0.1)(webpack@5.78.0) - '@webpack-cli/serve': 2.0.1(webpack-cli@5.0.1)(webpack@5.78.0) - colorette: 2.0.20 - commander: 9.5.0 - cross-spawn: 7.0.3 - envinfo: 7.8.1 - fastest-levenshtein: 1.0.16 - import-local: 3.1.0 - interpret: 3.1.1 - rechoir: 0.8.0 - webpack: 5.78.0(webpack-cli@5.0.1) - webpack-merge: 5.8.0 - - /webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.88.2): + /webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.91.0): resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} engines: {node: '>=14.15.0'} hasBin: true @@ -27243,10 +27242,10 @@ packages: optional: true dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.88.2) - '@webpack-cli/generators': 3.0.7(mem-fs-editor@9.7.0)(mem-fs@2.3.0)(prettier@2.8.7)(webpack-cli@5.1.4)(webpack@5.88.2) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.88.2) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.88.2) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.91.0) + '@webpack-cli/generators': 3.0.7(mem-fs-editor@9.7.0)(mem-fs@2.3.0)(prettier@2.8.7)(webpack-cli@5.1.4)(webpack@5.91.0) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.91.0) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.91.0) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.3 @@ -27255,11 +27254,10 @@ packages: import-local: 3.1.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.88.2(webpack-cli@5.1.4) + webpack: 5.91.0(webpack-cli@5.1.4) webpack-merge: 5.8.0 - dev: true - /webpack-dev-middleware@5.3.3(webpack@5.88.2): + /webpack-dev-middleware@5.3.3(webpack@5.91.0): resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -27270,10 +27268,10 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.0.0 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.91.0(webpack-cli@5.1.4) dev: false - /webpack-dev-server@4.13.2(webpack@5.88.2): + /webpack-dev-server@4.13.2(webpack@5.91.0): resolution: {integrity: sha512-5i6TrGBRxG4vnfDpB6qSQGfnB6skGBXNL5/542w2uRGLimX6qeE5BQMLrzIC3JYV/xlGOv+s+hTleI9AZKUQNw==} engines: {node: '>= 12.13.0'} hasBin: true @@ -27314,8 +27312,8 @@ packages: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.88.2(webpack-cli@5.0.1) - webpack-dev-middleware: 5.3.3(webpack@5.88.2) + webpack: 5.91.0(webpack-cli@5.1.4) + webpack-dev-middleware: 5.3.3(webpack@5.91.0) ws: 8.13.0 transitivePeerDependencies: - bufferutil @@ -27324,14 +27322,14 @@ packages: - utf-8-validate dev: false - /webpack-manifest-plugin@4.1.1(webpack@5.88.2): + /webpack-manifest-plugin@4.1.1(webpack@5.91.0): resolution: {integrity: sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==} engines: {node: '>=12.22.0'} peerDependencies: webpack: ^4.44.2 || ^5.47.0 dependencies: tapable: 2.2.1 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.91.0(webpack-cli@5.1.4) webpack-sources: 2.3.1 dev: false @@ -27361,88 +27359,8 @@ packages: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - /webpack@5.78.0(webpack-cli@5.0.1): - resolution: {integrity: sha512-gT5DP72KInmE/3azEaQrISjTvLYlSM0j1Ezhht/KLVkrqtv10JoP/RXhwmX/frrutOPuSq3o5Vq0ehR/4Vmd1g==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - dependencies: - '@types/eslint-scope': 3.7.4 - '@types/estree': 0.0.51 - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/wasm-edit': 1.11.1 - '@webassemblyjs/wasm-parser': 1.11.1 - acorn: 8.8.2 - acorn-import-assertions: 1.8.0(acorn@8.8.2) - browserslist: 4.21.5 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.12.0 - es-module-lexer: 0.9.3 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.1.1 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.7(webpack@5.78.0) - watchpack: 2.4.0 - webpack-cli: 5.0.1(@webpack-cli/generators@3.0.1)(webpack@5.78.0) - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - /webpack@5.88.2(webpack-cli@5.0.1): - resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - dependencies: - '@types/eslint-scope': 3.7.4 - '@types/estree': 1.0.1 - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/wasm-edit': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.8.2 - acorn-import-assertions: 1.9.0(acorn@8.8.2) - browserslist: 4.21.10 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.15.0 - es-module-lexer: 1.2.1 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.7(webpack@5.88.2) - watchpack: 2.4.0 - webpack-cli: 5.0.1(@webpack-cli/generators@3.0.1)(webpack@5.78.0) - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - /webpack@5.88.2(webpack-cli@5.1.4): - resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} + /webpack@5.91.0(webpack-cli@5.1.4): + resolution: {integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -27452,15 +27370,15 @@ packages: optional: true dependencies: '@types/eslint-scope': 3.7.4 - '@types/estree': 1.0.1 - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/wasm-edit': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.8.2 - acorn-import-assertions: 1.9.0(acorn@8.8.2) + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.11.3 + acorn-import-assertions: 1.9.0(acorn@8.11.3) browserslist: 4.21.10 chrome-trace-event: 1.0.3 - enhanced-resolve: 5.15.0 + enhanced-resolve: 5.17.0 es-module-lexer: 1.2.1 eslint-scope: 5.1.1 events: 3.3.0 @@ -27472,15 +27390,14 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.7(webpack@5.88.2) - watchpack: 2.4.0 - webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.88.2) + terser-webpack-plugin: 5.3.10(webpack@5.91.0) + watchpack: 2.4.1 + webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.91.0) webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - dev: true /websocket-driver@0.7.4: resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} @@ -27751,7 +27668,7 @@ packages: resolution: {integrity: sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA==} dev: false - /workbox-webpack-plugin@6.5.4(webpack@5.88.2): + /workbox-webpack-plugin@6.5.4(webpack@5.91.0): resolution: {integrity: sha512-LmWm/zoaahe0EGmMTrSLUi+BjyR3cdGEfU3fS6PN1zKFYbqAKuQ+Oy/27e4VSXsyIwAw8+QDfk1XHNGtZu9nQg==} engines: {node: '>=10.0.0'} peerDependencies: @@ -27760,7 +27677,7 @@ packages: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 - webpack: 5.88.2(webpack-cli@5.0.1) + webpack: 5.91.0(webpack-cli@5.1.4) webpack-sources: 1.4.3 workbox-build: 6.5.4 transitivePeerDependencies: @@ -28089,7 +28006,3 @@ packages: node-addon-api: 2.0.2 prebuild-install: 5.3.6 dev: false - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false diff --git a/services/rotor/dist_package.json b/services/rotor/dist_package.json index e6ac9fc2c..7b7cc78c3 100644 --- a/services/rotor/dist_package.json +++ b/services/rotor/dist_package.json @@ -2,7 +2,7 @@ "name": "rotor", "version": "0.0.0", "dependencies": { - "isolated-vm": "4.6.0", + "isolated-vm": "5.0.0", "@sensejs/kafkajs-zstd-support": "^0.11.0", "@mongodb-js/zstd": "^1.2.0" } diff --git a/services/rotor/package.json b/services/rotor/package.json index a799afaac..b29e36a61 100644 --- a/services/rotor/package.json +++ b/services/rotor/package.json @@ -66,12 +66,12 @@ "@types/node": "^18.15.3", "@types/pg": "^8.6.5", "@types/web": "0.0.69", - "@types/webpack": "^5.28.0", + "@types/webpack": "^5.28.5", "@types/express": "^4.17.13", - "@webpack-cli/generators": "^3.0.0", + "@webpack-cli/generators": "^3.0.7", "babel-loader": "^9.1.3", "clean-webpack-plugin": "^4.0.0", - "copy-webpack-plugin": "^11.0.0", + "copy-webpack-plugin": "^12.0.2", "declaration-bundler-webpack-plugin": "^1.0.3", "dotenv-cli": "^6.0.0", "jest": "^29.7.0", @@ -86,7 +86,7 @@ "ts-node": "~10.9.1", "ts-node-dev": "^2.0.0", "typescript": "^5.3.3", - "webpack": "^5.75.0", - "webpack-cli": "^5.0.0" + "webpack": "^5.91.0", + "webpack-cli": "^5.1.4" } } From c8da4183cf8fde06a0dda48830849121a498831a Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 7 Jun 2024 16:25:56 +0400 Subject: [PATCH 0752/1353] remove misleading advice about Authorized JavaScript Domains and localhost --- webapps/console/pages/[workspaceId]/streams.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/webapps/console/pages/[workspaceId]/streams.tsx b/webapps/console/pages/[workspaceId]/streams.tsx index f46a98d3e..68335363d 100644 --- a/webapps/console/pages/[workspaceId]/streams.tsx +++ b/webapps/console/pages/[workspaceId]/streams.tsx @@ -545,8 +545,7 @@ const StreamsList: React.FC<{}> = () => { If this setting is not empty, JavaScript code from the specified domains will be able to post data to {noun}. Separate multiple domains by comma. Leave the field empty to allow any domain. If you want to allow top level domains, and all subdomains, use wildcard as in{" "} - *.mywebsite.com,mywebsite.com,localhost. It makes sense to add localhost, at least - for dev environments. + *.mywebsite.com,mywebsite.com,localhost. ), }, From 86263dce7734a08b5f3a16adfdd79444ff5cea7e Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 7 Jun 2024 16:39:22 +0400 Subject: [PATCH 0753/1353] dirty workaround for not be able to clear authorizedJavaScriptDomains --- webapps/console/lib/schema/config-objects.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/webapps/console/lib/schema/config-objects.ts b/webapps/console/lib/schema/config-objects.ts index 0af24ddcf..60c3d448f 100644 --- a/webapps/console/lib/schema/config-objects.ts +++ b/webapps/console/lib/schema/config-objects.ts @@ -102,7 +102,7 @@ const configObjectTypes: Record = { stream: { schema: StreamConfig, merge(original: any, patch: Partial): any { - return { + const merged = { ...original, ...patch, privateKeys: patch.privateKeys @@ -112,6 +112,11 @@ const configObjectTypes: Record = { ? hashKeys(patch.publicKeys, original.publicKeys || []) : original.publicKeys || [], }; + // TODO: dirty workaround for not be able to clear authorizedJavaScriptDomains + if (!patch.authorizedJavaScriptDomains) { + delete merged.authorizedJavaScriptDomains; + } + return merged; }, inputFilter: async obj => { From 6260f37f23d76cf36ee13a61bc933fd65c4cd120 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 10 Jun 2024 19:39:35 +0400 Subject: [PATCH 0754/1353] Streams: hide authorizedJavaScriptDomains option --- webapps/console/pages/[workspaceId]/streams.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/webapps/console/pages/[workspaceId]/streams.tsx b/webapps/console/pages/[workspaceId]/streams.tsx index 68335363d..08d935cdc 100644 --- a/webapps/console/pages/[workspaceId]/streams.tsx +++ b/webapps/console/pages/[workspaceId]/streams.tsx @@ -539,13 +539,14 @@ const StreamsList: React.FC<{}> = () => { ), }, authorizedJavaScriptDomains: { + hidden: true, displayName: "Authorized JavaScript Domains", documentation: ( <> - If this setting is not empty, JavaScript code from the specified domains will be able to post data to + If this setting is not empty, JavaScript code from the specified domains only will be able to post data to {noun}. Separate multiple domains by comma. Leave the field empty to allow any domain. If you want to allow top level domains, and all subdomains, use wildcard as in{" "} - *.mywebsite.com,mywebsite.com,localhost. + *.mywebsite.com,mywebsite.com,localhost ), }, From daa926a4ac6c63800375e7a6710d999d13a98b8f Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 10 Jun 2024 19:42:17 +0400 Subject: [PATCH 0755/1353] Properly detect URL changes on SPA sites with canonical URL --- libs/jitsu-js/src/analytics-plugin.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/libs/jitsu-js/src/analytics-plugin.ts b/libs/jitsu-js/src/analytics-plugin.ts index e7fea97b3..f1087eade 100644 --- a/libs/jitsu-js/src/analytics-plugin.ts +++ b/libs/jitsu-js/src/analytics-plugin.ts @@ -334,6 +334,19 @@ function fixPath(path: string): string { return path; } +const hashRegex = /#.*$/; + +/** + * for compatibility with path produced by analytics.js + * @param url + */ +function urlPath(url) { + const regex = /(http[s]?:\/\/)?([^\/\s]+\/)(.*)/g; + const matches = regex.exec(url); + const pathMatch = matches && matches[3] ? matches[3].split("?")[0].replace(hashRegex, "") : ""; + return "/" + pathMatch; +} + function adjustPayload( payload: any, config: JitsuOptions, @@ -346,8 +359,9 @@ function adjustPayload( const query = parsedUrl ? parseQuery(parsedUrl.search) : {}; const properties = payload.properties || {}; - if (properties.path) { - properties.path = fixPath(properties.path); + if (payload.type === "page") { + properties.url = url.replace(hashRegex, ""); + properties.path = fixPath(urlPath(url)); } const customContext = payload.properties?.context || {}; From 0abc86eeea8c70e546f2bbdd281992823a727b07 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 10 Jun 2024 19:54:41 +0400 Subject: [PATCH 0756/1353] fix --- libs/jitsu-js/src/analytics-plugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/jitsu-js/src/analytics-plugin.ts b/libs/jitsu-js/src/analytics-plugin.ts index f1087eade..bebf8d217 100644 --- a/libs/jitsu-js/src/analytics-plugin.ts +++ b/libs/jitsu-js/src/analytics-plugin.ts @@ -359,7 +359,7 @@ function adjustPayload( const query = parsedUrl ? parseQuery(parsedUrl.search) : {}; const properties = payload.properties || {}; - if (payload.type === "page") { + if (payload.type === "page" && url) { properties.url = url.replace(hashRegex, ""); properties.path = fixPath(urlPath(url)); } From 1492c181d95be449f4fa5bb58618ca8074be24bf Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 10 Jun 2024 20:07:57 +0400 Subject: [PATCH 0757/1353] skip "url-bug" test since jitsu-js no longer relies on canonical URL --- libs/jitsu-js/__tests__/playwright/integration.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/jitsu-js/__tests__/playwright/integration.test.ts b/libs/jitsu-js/__tests__/playwright/integration.test.ts index 02fca591c..6bc11b81b 100644 --- a/libs/jitsu-js/__tests__/playwright/integration.test.ts +++ b/libs/jitsu-js/__tests__/playwright/integration.test.ts @@ -214,8 +214,8 @@ test("jitsu-queue-callbacks", async ({ browser }) => { expect(requestLog.length).toBe(3); }); -test("url-bug", async ({ browser }) => { - clearRequestLog(); +// Skip this test because jitsu-js no longer relies on canonical URL +test.skip("url-bug", async ({ browser, context }) => { //tests a bug in getanalytics.io where the url without slash provided by // causes incorrect page path const browserContext = await browser.newContext(); From 9c495ed403a85a2a60cd907704decf1a122a5ffa Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 11 Jun 2024 11:16:25 +0400 Subject: [PATCH 0758/1353] Fix: not changing URL on SPA with canonical URL (#1107) * Properly detect URL changes on SPA sites with canonical URL --- .../__tests__/playwright/integration.test.ts | 4 ++-- libs/jitsu-js/src/analytics-plugin.ts | 18 ++++++++++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/libs/jitsu-js/__tests__/playwright/integration.test.ts b/libs/jitsu-js/__tests__/playwright/integration.test.ts index 02fca591c..6bc11b81b 100644 --- a/libs/jitsu-js/__tests__/playwright/integration.test.ts +++ b/libs/jitsu-js/__tests__/playwright/integration.test.ts @@ -214,8 +214,8 @@ test("jitsu-queue-callbacks", async ({ browser }) => { expect(requestLog.length).toBe(3); }); -test("url-bug", async ({ browser }) => { - clearRequestLog(); +// Skip this test because jitsu-js no longer relies on canonical URL +test.skip("url-bug", async ({ browser, context }) => { //tests a bug in getanalytics.io where the url without slash provided by // causes incorrect page path const browserContext = await browser.newContext(); diff --git a/libs/jitsu-js/src/analytics-plugin.ts b/libs/jitsu-js/src/analytics-plugin.ts index e7fea97b3..bebf8d217 100644 --- a/libs/jitsu-js/src/analytics-plugin.ts +++ b/libs/jitsu-js/src/analytics-plugin.ts @@ -334,6 +334,19 @@ function fixPath(path: string): string { return path; } +const hashRegex = /#.*$/; + +/** + * for compatibility with path produced by analytics.js + * @param url + */ +function urlPath(url) { + const regex = /(http[s]?:\/\/)?([^\/\s]+\/)(.*)/g; + const matches = regex.exec(url); + const pathMatch = matches && matches[3] ? matches[3].split("?")[0].replace(hashRegex, "") : ""; + return "/" + pathMatch; +} + function adjustPayload( payload: any, config: JitsuOptions, @@ -346,8 +359,9 @@ function adjustPayload( const query = parsedUrl ? parseQuery(parsedUrl.search) : {}; const properties = payload.properties || {}; - if (properties.path) { - properties.path = fixPath(properties.path); + if (payload.type === "page" && url) { + properties.url = url.replace(hashRegex, ""); + properties.path = fixPath(urlPath(url)); } const customContext = payload.properties?.context || {}; From c00ddba3f3a112d241c188d5e24012cdc2dc6972 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 11 Jun 2024 12:12:11 +0400 Subject: [PATCH 0759/1353] ga4-destination: fill user_properties from traits --- .../src/functions/ga4-destination.ts | 31 +++++++++---------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/libs/core-functions/src/functions/ga4-destination.ts b/libs/core-functions/src/functions/ga4-destination.ts index 0c9d88000..1f90a619e 100644 --- a/libs/core-functions/src/functions/ga4-destination.ts +++ b/libs/core-functions/src/functions/ga4-destination.ts @@ -120,16 +120,16 @@ function getUserProperties(event: AnalyticsServerEvent): Record { // if (prop.value == undefined) delete userProperties[key]; // } - // for (const [key, value] of Object.entries(event.context?.traits || {})) { - // if ( - // !ReservedUserProperties.includes(key) && - // !key.startsWith("google_") && - // !key.startsWith("ga_") && - // !key.startsWith("firebase_") - // ) { - // userProperties[key] = { value }; - // } - // } + for (const [key, value] of Object.entries((event.type == "identify" ? event.traits : event.context?.traits) || {})) { + if ( + !ReservedUserProperties.includes(key) && + !key.startsWith("google_") && + !key.startsWith("ga_") && + !key.startsWith("firebase_") + ) { + userProperties[key] = { value }; + } + } return userProperties; } @@ -146,19 +146,16 @@ function getSessionId(event: AnalyticsServerEvent, measurementId: string): strin } function pageViewEvent(event: AnalyticsServerEvent): Ga4Event { - const customProperties = { + const pageProperties = { ...(event.context?.page || {}), - ...(event.traits || {}), - ...(event.context?.traits || {}), ...(event.properties || {}), - userAgent: event.context?.userAgent, }; return { name: "page_view", params: { - page_location: customProperties.url || "", - page_referrer: customProperties.referrer || "", - page_title: customProperties.title || "", + page_location: pageProperties.url || "", + page_referrer: pageProperties.referrer || "", + page_title: pageProperties.title || "", engagement_time_msec: 1, }, }; From 3c64495d97550fa12d589c7c0e543b80f348895d Mon Sep 17 00:00:00 2001 From: Hendrik Heil Date: Tue, 11 Jun 2024 13:28:15 +0200 Subject: [PATCH 0760/1353] refactor: switch plugin export to named export --- libs/jitsu-js/src/analytics-plugin.ts | 4 +--- libs/jitsu-js/src/index.ts | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/libs/jitsu-js/src/analytics-plugin.ts b/libs/jitsu-js/src/analytics-plugin.ts index bebf8d217..838c4df96 100644 --- a/libs/jitsu-js/src/analytics-plugin.ts +++ b/libs/jitsu-js/src/analytics-plugin.ts @@ -660,7 +660,7 @@ async function send( export type JitsuPluginConfig = JitsuOptions & { storageWrapper?: (persistentStorage: PersistentStorage) => PersistentStorage; }; -const jitsuAnalyticsPlugin = (pluginConfig: JitsuPluginConfig = {}): AnalyticsPlugin => { +export const jitsuAnalyticsPlugin = (pluginConfig: JitsuPluginConfig = {}): AnalyticsPlugin => { const instanceConfig = { ...defaultConfig, ...pluginConfig, @@ -775,5 +775,3 @@ function hash(str: string, seed: number = 0): number { return 4294967296 * (2097151 & h2) + (h1 >>> 0); } - -export default jitsuAnalyticsPlugin; diff --git a/libs/jitsu-js/src/index.ts b/libs/jitsu-js/src/index.ts index ed2b98dff..b0dd17633 100644 --- a/libs/jitsu-js/src/index.ts +++ b/libs/jitsu-js/src/index.ts @@ -1,6 +1,6 @@ import Analytics from "analytics"; import { AnalyticsInterface, JitsuOptions, PersistentStorage, RuntimeFacade } from "./jitsu"; -import jitsuAnalyticsPlugin, { emptyRuntime, isInBrowser, windowRuntime } from "./analytics-plugin"; +import { jitsuAnalyticsPlugin, emptyRuntime, isInBrowser, windowRuntime } from "./analytics-plugin"; import { Callback, DispatchedEvent, ID, JSONObject, Options } from "@jitsu/protocols/analytics"; export default function parse(input) { From eb5d099d2fa496711d68eb9b0111dc5d4fbf19bf Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 11 Jun 2024 19:22:55 +0400 Subject: [PATCH 0761/1353] jitsu-cli: build: check for typescript errors before compiling functions --- cli/jitsu-cli/package.json | 7 +- cli/jitsu-cli/src/commands/build.ts | 69 ++++- cli/jitsu-cli/webpack.config.js | 1 + pnpm-lock.yaml | 431 +++++++++++++++++----------- 4 files changed, 341 insertions(+), 167 deletions(-) diff --git a/cli/jitsu-cli/package.json b/cli/jitsu-cli/package.json index c8d1d1dc8..142968e87 100644 --- a/cli/jitsu-cli/package.json +++ b/cli/jitsu-cli/package.json @@ -13,7 +13,7 @@ "clean": "rm -rf ./dist", "compile": "tsc -p . ", "build": "pnpm compile && webpack", - "run": "node dist/main.js", + "run": "pnpm build && node dist/main.js", "login": "pnpm build && node dist/main.js login", "init child": "pnpm build && node dist/main.js init", "build child": "pnpm build && node dist/main.js build", @@ -23,9 +23,9 @@ }, "dependencies": { "figlet": "^1.6.0", - "isolated-vm": "5.0.0", "jest-cli": "^29.7.0", - "tslib": "^2.6.2" + "tslib": "^2.6.2", + "typescript": "^5.4.5" }, "devDependencies": { "@babel/preset-env": "^7.23.2", @@ -65,7 +65,6 @@ "ts-jest": "^29.1.1", "ts-loader": "^9.4.4", "ts-node": "^10.9.2", - "typescript": "^5.3.3", "webpack": "^5.91.0", "webpack-cli": "^5.1.4" } diff --git a/cli/jitsu-cli/src/commands/build.ts b/cli/jitsu-cli/src/commands/build.ts index 5e6750548..655d92a12 100644 --- a/cli/jitsu-cli/src/commands/build.ts +++ b/cli/jitsu-cli/src/commands/build.ts @@ -1,5 +1,5 @@ import path from "path"; -import { mkdirSync, readdirSync, writeFileSync } from "fs"; +import { mkdirSync, readdirSync, writeFileSync, existsSync } from "fs"; import typescript from "@rollup/plugin-typescript"; import resolve from "@rollup/plugin-node-resolve"; import commonjs from "@rollup/plugin-commonjs"; @@ -9,11 +9,17 @@ import { exec } from "child_process"; import { loadPackageJson } from "./shared"; import { b, green, red } from "../lib/chalk-code-highlight"; import { CompiledFunction, getFunctionFromFilePath } from "../lib/compiled-function"; +import * as ts from "typescript"; export async function build({ dir }: { dir?: string }) { const { packageJson, projectDir } = await loadPackageJson(dir || process.cwd()); console.log(`Building ${b(packageJson.name)} project`); + const errors = checkTypescript(projectDir); + if (errors) { + console.error(`Found ${errors.length} errors in functions files. Exiting`); + process.exit(1); + } //list files in src directory const functionsDir = path.resolve(projectDir, "src/functions"); @@ -93,3 +99,64 @@ const run = async cmd => { child.stderr?.pipe(process.stderr); return new Promise(resolve => child.on("close", resolve)); }; + +function checkTypescript(projectDir: string): string[] | void { + const tsconfigPath = path.resolve(projectDir, "tsconfig.json"); + if (!existsSync(tsconfigPath)) { + console.info(`No ${b("tsconfig.json")} file found in ${b(projectDir)}. Assuming JavaScript project`); + return; + } + console.log(`Checking TypeScript files in ${b(projectDir)}`); + let compilerOptions: ts.CompilerOptions = {}; + let filenames: string[] = []; + const tsconfig = ts.readConfigFile(tsconfigPath, ts.sys.readFile); + tsconfig.config.compilerOptions = { + ...tsconfig.config.compilerOptions, + typeRoots: [path.resolve(projectDir, "node_modules", "@types")], + checkJs: true, + allowJs: true, + noEmit: true, + esModuleInterop: typeof compilerOptions.esModuleInterop !== "undefined" ? compilerOptions.esModuleInterop : true, + moduleResolution: + typeof compilerOptions.moduleResolution !== "undefined" ? compilerOptions.moduleResolution : "node", + target: "esnext", + module: "esnext", + }; + const parsed = ts.parseJsonConfigFileContent(tsconfig.config, ts.sys, path.dirname(tsconfigPath)); + filenames = parsed.fileNames; + compilerOptions = parsed.options; + + //console.log(`Filenames ${JSON.stringify(filenames)}`); + + let program = ts.createProgram(filenames, compilerOptions); + let emitResult = program.emit(); + let allDiagnostics = ts.getPreEmitDiagnostics(program).concat(emitResult.diagnostics); + const errors: string[] = []; + allDiagnostics.forEach(diagnostic => { + let logF = console.log; + switch (diagnostic.category) { + case ts.DiagnosticCategory.Error: + logF = (...args) => { + console.error(...args); + errors.push(args.join(" ")); + }; + break; + case ts.DiagnosticCategory.Warning: + logF = console.warn; + break; + case ts.DiagnosticCategory.Message: + case ts.DiagnosticCategory.Suggestion: + logF = console.info; + } + if (diagnostic.file) { + let { line, character } = ts.getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start!); + let message = ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n"); + logF(`${diagnostic.file.fileName} (${line + 1},${character + 1}): ${message}`); + } else { + logF(ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n")); + } + }); + if (errors.length > 0) { + return errors; + } +} diff --git a/cli/jitsu-cli/webpack.config.js b/cli/jitsu-cli/webpack.config.js index 45644b749..f6ab839a1 100644 --- a/cli/jitsu-cli/webpack.config.js +++ b/cli/jitsu-cli/webpack.config.js @@ -8,6 +8,7 @@ const config = { figlet: "require('figlet')", "@swc/core": "require('@swc/core')", "@swc/wasm": "require('@swc/wasm')", + typescript: "require('typescript')", //"isolated-vm": "require('isolated-vm')", "jest-cli": "require('jest-cli')", "../../package.json": "require('../package.json')", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e8628c7b6..17cef963d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,7 +25,7 @@ importers: version: 2.8.7 ts-node: specifier: ~10.8.2 - version: 10.8.2(@types/node@20.10.8)(typescript@5.3.3) + version: 10.8.2(@types/node@20.14.2)(typescript@5.3.3) turbo: specifier: ~1.2.16 version: 1.2.16 @@ -87,15 +87,15 @@ importers: figlet: specifier: ^1.6.0 version: 1.6.0 - isolated-vm: - specifier: 5.0.0 - version: 5.0.0 jest-cli: specifier: ^29.7.0 version: 29.7.0(@types/node@18.15.11)(ts-node@10.9.2) tslib: specifier: ^2.6.2 version: 2.6.2 + typescript: + specifier: ^5.4.5 + version: 5.4.5 devDependencies: '@babel/preset-env': specifier: ^7.23.2 @@ -123,7 +123,7 @@ importers: version: 0.4.3(rollup@3.29.1) '@rollup/plugin-typescript': specifier: ^11.1.3 - version: 11.1.3(rollup@3.29.1)(tslib@2.6.2)(typescript@5.3.3) + version: 11.1.3(rollup@3.29.1)(tslib@2.6.2)(typescript@5.4.5) '@types/chalk': specifier: ^2.2.0 version: 2.2.0 @@ -201,16 +201,13 @@ importers: version: 7.5.4 ts-jest: specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.21.4)(jest@29.7.0)(typescript@5.3.3) + version: 29.1.1(@babel/core@7.21.4)(jest@29.7.0)(typescript@5.4.5) ts-loader: specifier: ^9.4.4 - version: 9.4.4(typescript@5.3.3)(webpack@5.91.0) + version: 9.4.4(typescript@5.4.5)(webpack@5.91.0) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@18.15.11)(typescript@5.3.3) - typescript: - specifier: ^5.3.3 - version: 5.3.3 + version: 10.9.2(@types/node@18.15.11)(typescript@5.4.5) webpack: specifier: ^5.91.0 version: 5.91.0(webpack-cli@5.1.4) @@ -237,7 +234,7 @@ importers: version: 5.3.2 jest: specifier: ^29.3.1 - version: 29.5.0(@types/node@20.10.8)(ts-node@10.8.2) + version: 29.5.0(@types/node@20.14.2)(ts-node@10.8.2) json5: specifier: ^2.1.0 version: 2.2.3 @@ -252,7 +249,7 @@ importers: version: 9.4.0 ts-jest: specifier: 29.0.5 - version: 29.0.5(@babel/core@7.21.4)(jest@29.5.0)(typescript@5.3.3) + version: 29.0.5(@babel/core@7.21.4)(jest@29.5.0)(typescript@5.4.5) tslib: specifier: ^2.4.0 version: 2.5.0 @@ -383,7 +380,7 @@ importers: version: 3.3.1 ts-jest: specifier: 29.0.5 - version: 29.0.5(@babel/core@7.21.4)(jest@29.5.0)(typescript@5.3.3) + version: 29.0.5(@babel/core@7.21.4)(jest@29.5.0)(typescript@5.4.5) libs/functions: dependencies: @@ -396,7 +393,7 @@ importers: devDependencies: '@rollup/plugin-typescript': specifier: ^11.1.5 - version: 11.1.5(rollup@4.1.4)(tslib@2.6.2)(typescript@5.3.3) + version: 11.1.5(rollup@4.1.4)(tslib@2.6.2)(typescript@5.4.5) '@types/jest': specifier: ^29.1.1 version: 29.5.5 @@ -411,7 +408,7 @@ importers: version: 4.1.4 ts-jest: specifier: 29.0.5 - version: 29.0.5(@babel/core@7.21.4)(jest@29.7.0)(typescript@5.3.3) + version: 29.0.5(@babel/core@7.21.4)(jest@29.7.0)(typescript@5.4.5) libs/jitsu-js: dependencies: @@ -554,7 +551,7 @@ importers: version: 9.1.0(eslint@8.55.0) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.10.8)(ts-node@10.8.2) + version: 29.7.0(@types/node@20.14.2)(ts-node@10.8.2) ts-jest: specifier: ^29.1.1 version: 29.1.1(@babel/core@7.21.4)(jest@29.7.0)(typescript@5.3.3) @@ -585,7 +582,7 @@ importers: version: 29.5.0(@types/node@18.15.11)(ts-node@10.8.2) ts-jest: specifier: 29.0.5 - version: 29.0.5(@babel/core@7.21.4)(jest@29.5.0)(typescript@5.3.3) + version: 29.0.5(@babel/core@7.21.4)(jest@29.5.0)(typescript@5.4.5) services/rotor: dependencies: @@ -4196,7 +4193,7 @@ packages: engines: {node: ^8.13.0 || >=10.10.0} dependencies: '@grpc/proto-loader': 0.7.10 - '@types/node': 20.10.8 + '@types/node': 20.14.2 dev: false /@grpc/grpc-js@1.9.3: @@ -4204,7 +4201,7 @@ packages: engines: {node: ^8.13.0 || >=10.10.0} dependencies: '@grpc/proto-loader': 0.7.10 - '@types/node': 20.10.8 + '@types/node': 20.14.2 /@grpc/proto-loader@0.7.10: resolution: {integrity: sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==} @@ -4307,7 +4304,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 20.10.8 + '@types/node': 20.14.2 chalk: 4.1.2 jest-message-util: 27.5.1 jest-util: 27.5.1 @@ -4319,7 +4316,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@jest/types': 28.1.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 chalk: 4.1.2 jest-message-util: 28.1.3 jest-util: 28.1.3 @@ -4330,7 +4327,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -4342,7 +4339,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -4362,7 +4359,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.10.8 + '@types/node': 20.14.2 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.8.1 @@ -4407,14 +4404,14 @@ packages: '@jest/test-result': 28.1.3 '@jest/transform': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.8.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 28.1.3 - jest-config: 28.1.3(@types/node@20.10.8)(ts-node@10.8.2) + jest-config: 28.1.3(@types/node@20.14.2)(ts-node@10.8.2) jest-haste-map: 28.1.3 jest-message-util: 28.1.3 jest-regex-util: 28.0.2 @@ -4450,14 +4447,14 @@ packages: '@jest/test-result': 29.5.0 '@jest/transform': 29.5.0 '@jest/types': 29.6.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.8.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.5.0 - jest-config: 29.5.0(@types/node@20.10.8)(ts-node@10.8.2) + jest-config: 29.5.0(@types/node@20.14.2)(ts-node@10.8.2) jest-haste-map: 29.5.0 jest-message-util: 29.7.0 jest-regex-util: 29.4.3 @@ -4493,14 +4490,14 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.8.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.10.8)(ts-node@10.8.2) + jest-config: 29.7.0(@types/node@20.14.2)(ts-node@10.8.2) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -4536,14 +4533,14 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.8.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.10.8)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@20.14.2)(ts-node@10.9.1) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -4579,14 +4576,14 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.8.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.10.8)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@20.14.2)(ts-node@10.9.2) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -4613,7 +4610,7 @@ packages: dependencies: '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.10.8 + '@types/node': 20.14.2 jest-mock: 27.5.1 dev: false @@ -4623,7 +4620,7 @@ packages: dependencies: '@jest/fake-timers': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 jest-mock: 28.1.3 dev: true @@ -4633,7 +4630,7 @@ packages: dependencies: '@jest/fake-timers': 29.5.0 '@jest/types': 29.6.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 jest-mock: 29.7.0 dev: true @@ -4643,7 +4640,7 @@ packages: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 jest-mock: 29.7.0 /@jest/expect-utils@28.1.3: @@ -4694,7 +4691,7 @@ packages: dependencies: '@jest/types': 27.5.1 '@sinonjs/fake-timers': 8.1.0 - '@types/node': 20.10.8 + '@types/node': 20.14.2 jest-message-util: 27.5.1 jest-mock: 27.5.1 jest-util: 27.5.1 @@ -4706,7 +4703,7 @@ packages: dependencies: '@jest/types': 28.1.3 '@sinonjs/fake-timers': 9.1.2 - '@types/node': 20.10.8 + '@types/node': 20.14.2 jest-message-util: 28.1.3 jest-mock: 28.1.3 jest-util: 28.1.3 @@ -4718,7 +4715,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.0.2 - '@types/node': 20.10.8 + '@types/node': 20.14.2 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -4730,7 +4727,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.0.2 - '@types/node': 20.10.8 + '@types/node': 20.14.2 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -4792,7 +4789,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.10.8 + '@types/node': 20.14.2 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -4831,7 +4828,7 @@ packages: '@jest/transform': 28.1.3 '@jest/types': 28.1.3 '@jridgewell/trace-mapping': 0.3.18 - '@types/node': 20.10.8 + '@types/node': 20.14.2 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -4869,7 +4866,7 @@ packages: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.18 - '@types/node': 20.10.8 + '@types/node': 20.14.2 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -4906,7 +4903,7 @@ packages: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.18 - '@types/node': 20.10.8 + '@types/node': 20.14.2 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -5138,7 +5135,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 20.10.8 + '@types/node': 20.14.2 '@types/yargs': 16.0.5 chalk: 4.1.2 dev: false @@ -5150,7 +5147,7 @@ packages: '@jest/schemas': 28.1.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 20.10.8 + '@types/node': 20.14.2 '@types/yargs': 17.0.24 chalk: 4.1.2 @@ -5161,7 +5158,7 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 20.10.8 + '@types/node': 20.14.2 '@types/yargs': 17.0.24 chalk: 4.1.2 dev: true @@ -5173,7 +5170,7 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 20.10.8 + '@types/node': 20.14.2 '@types/yargs': 17.0.24 chalk: 4.1.2 @@ -6374,7 +6371,7 @@ packages: terser: 5.19.4 dev: true - /@rollup/plugin-typescript@11.1.3(rollup@3.29.1)(tslib@2.6.2)(typescript@5.3.3): + /@rollup/plugin-typescript@11.1.3(rollup@3.29.1)(tslib@2.6.2)(typescript@5.4.5): resolution: {integrity: sha512-8o6cNgN44kQBcpsUJTbTXMTtb87oR1O0zgP3Dxm71hrNgparap3VujgofEilTYJo+ivf2ke6uy3/E5QEaiRlDA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -6391,10 +6388,10 @@ packages: resolve: 1.22.2 rollup: 3.29.1 tslib: 2.6.2 - typescript: 5.3.3 + typescript: 5.4.5 dev: true - /@rollup/plugin-typescript@11.1.5(rollup@4.1.4)(tslib@2.6.2)(typescript@5.3.3): + /@rollup/plugin-typescript@11.1.5(rollup@4.1.4)(tslib@2.6.2)(typescript@5.4.5): resolution: {integrity: sha512-rnMHrGBB0IUEv69Q8/JGRD/n4/n6b3nfpufUu26axhUcboUzv/twfZU8fIBbTOphRAe0v8EyxzeDpKXqGHfyDA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -6411,7 +6408,7 @@ packages: resolve: 1.22.2 rollup: 4.1.4 tslib: 2.6.2 - typescript: 5.3.3 + typescript: 5.4.5 dev: true /@rollup/plugin-typescript@9.0.2(rollup@3.20.2)(tslib@2.5.0)(typescript@5.3.3): @@ -8726,12 +8723,12 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 20.10.8 + '@types/node': 20.14.2 /@types/bonjour@3.5.10: resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} dependencies: - '@types/node': 20.10.8 + '@types/node': 20.14.2 dev: false /@types/chalk@2.2.0: @@ -8744,7 +8741,7 @@ packages: /@types/cli-progress@3.11.0: resolution: {integrity: sha512-XhXhBv1R/q2ahF3BM7qT5HLzJNlIL0wbcGyZVjqOTqAybAnsLisd7gy1UCyIqpL+5Iv6XhlSyzjLCnI2sIdbCg==} dependencies: - '@types/node': 20.10.8 + '@types/node': 20.14.2 dev: true /@types/commander@2.12.2: @@ -8758,13 +8755,13 @@ packages: resolution: {integrity: sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==} dependencies: '@types/express-serve-static-core': 4.17.33 - '@types/node': 20.10.8 + '@types/node': 20.14.2 dev: false /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 20.10.8 + '@types/node': 20.14.2 /@types/cookie@0.5.1: resolution: {integrity: sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==} @@ -8773,7 +8770,7 @@ packages: /@types/cross-spawn@6.0.2: resolution: {integrity: sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==} dependencies: - '@types/node': 20.10.8 + '@types/node': 20.14.2 dev: true /@types/crypto-js@4.1.1: @@ -8835,7 +8832,7 @@ packages: /@types/docker-modem@3.0.2: resolution: {integrity: sha512-qC7prjoEYR2QEe6SmCVfB1x3rfcQtUr1n4x89+3e0wSTMQ/KYCyf+/RAA9n2tllkkNc6//JMUZePdFRiGIWfaQ==} dependencies: - '@types/node': 20.10.8 + '@types/node': 20.14.2 '@types/ssh2': 1.11.11 dev: true @@ -8843,7 +8840,7 @@ packages: resolution: {integrity: sha512-ZAX2VrkTjwjk1808T8m6vMr+CFXSLiDD+tkEkLThI+v83AfzlYQZEWfZKwFyk1PWopSXkdDunmIhrF7sxt+zWg==} dependencies: '@types/docker-modem': 3.0.2 - '@types/node': 20.10.8 + '@types/node': 20.14.2 dev: true /@types/eslint-scope@3.7.4: @@ -8873,7 +8870,7 @@ packages: /@types/express-serve-static-core@4.17.33: resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} dependencies: - '@types/node': 20.10.8 + '@types/node': 20.14.2 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 @@ -8899,19 +8896,19 @@ packages: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.10.8 + '@types/node': 20.14.2 dev: true /@types/glob@8.1.0: resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.10.8 + '@types/node': 20.14.2 /@types/graceful-fs@4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: - '@types/node': 20.10.8 + '@types/node': 20.14.2 /@types/html-minifier-terser@6.1.0: resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} @@ -8920,7 +8917,7 @@ packages: /@types/http-proxy@1.17.10: resolution: {integrity: sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g==} dependencies: - '@types/node': 20.10.8 + '@types/node': 20.14.2 dev: false /@types/inquirer@9.0.3: @@ -8984,7 +8981,7 @@ packages: /@types/jsonwebtoken@9.0.3: resolution: {integrity: sha512-b0jGiOgHtZ2jqdPgPnP6WLCXZk1T8p06A/vPGzUvxpFGgKMbjXJDjC5m52ErqBnIuWZFgGoIJyRdeG5AyreJjA==} dependencies: - '@types/node': 20.10.8 + '@types/node': 20.14.2 /@types/linkify-it@3.0.2: resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==} @@ -9043,7 +9040,7 @@ packages: /@types/node-fetch@2.6.11: resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} dependencies: - '@types/node': 20.10.8 + '@types/node': 20.14.2 form-data: 4.0.0 dev: false @@ -9061,11 +9058,17 @@ packages: resolution: {integrity: sha512-f8nQs3cLxbAFc00vEU59yf9UyGUftkPaLGfvbVOIDdx2i1b8epBqj2aNGyP19fiyXWvlmZ7qC1XLjAzw/OKIeA==} dependencies: undici-types: 5.26.5 + dev: true + + /@types/node@20.14.2: + resolution: {integrity: sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==} + dependencies: + undici-types: 5.26.5 /@types/nodemailer@6.4.7: resolution: {integrity: sha512-f5qCBGAn/f0qtRcd4SEn88c8Fp3Swct1731X4ryPKqS61/A3LmmzN8zaEz7hneJvpjFbUUgY7lru/B/7ODTazg==} dependencies: - '@types/node': 20.10.8 + '@types/node': 20.14.2 dev: true /@types/normalize-package-data@2.4.1: @@ -9077,7 +9080,7 @@ packages: /@types/pg-cursor@2.7.2: resolution: {integrity: sha512-m3xT8bVFCvx98LuzbvXyuCdT/Hjdd/v8ml4jL4K1QF70Y8clOfCFdgoaEB1FWdcSwcpoFYZTJQaMD9/GQ27efQ==} dependencies: - '@types/node': 20.10.8 + '@types/node': 20.14.2 '@types/pg': 8.6.6 dev: false @@ -9102,7 +9105,7 @@ packages: /@types/pg@8.6.6: resolution: {integrity: sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==} dependencies: - '@types/node': 20.10.8 + '@types/node': 20.14.2 pg-protocol: 1.6.0 pg-types: 2.2.0 @@ -9136,19 +9139,19 @@ packages: /@types/readdir-glob@1.1.1: resolution: {integrity: sha512-ImM6TmoF8bgOwvehGviEj3tRdRBbQujr1N+0ypaln/GWjaerOB26jb93vsRHmdMtvVQZQebOlqt2HROark87mQ==} dependencies: - '@types/node': 20.10.8 + '@types/node': 20.14.2 dev: true /@types/resolve@0.0.8: resolution: {integrity: sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==} dependencies: - '@types/node': 20.10.8 + '@types/node': 20.14.2 dev: true /@types/resolve@1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: - '@types/node': 20.10.8 + '@types/node': 20.14.2 dev: false /@types/resolve@1.20.2: @@ -9164,7 +9167,7 @@ packages: requiresBuild: true dependencies: '@types/glob': 8.1.0 - '@types/node': 20.10.8 + '@types/node': 20.14.2 dev: false optional: true @@ -9184,24 +9187,24 @@ packages: resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} dependencies: '@types/mime': 3.0.1 - '@types/node': 20.10.8 + '@types/node': 20.14.2 /@types/sockjs@0.3.33: resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} dependencies: - '@types/node': 20.10.8 + '@types/node': 20.14.2 dev: false /@types/ssh2-streams@0.1.9: resolution: {integrity: sha512-I2J9jKqfmvXLR5GomDiCoHrEJ58hAOmFrekfFqmCFd+A6gaEStvWnPykoWUwld1PNg4G5ag1LwdA+Lz1doRJqg==} dependencies: - '@types/node': 20.10.8 + '@types/node': 20.14.2 dev: true /@types/ssh2@0.5.52: resolution: {integrity: sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==} dependencies: - '@types/node': 20.10.8 + '@types/node': 20.14.2 '@types/ssh2-streams': 0.1.9 dev: true @@ -9232,7 +9235,7 @@ packages: /@types/through@0.0.31: resolution: {integrity: sha512-LpKpmb7FGevYgXnBXYs6HWnmiFyVG07Pt1cnbgM1IhEacITTiUaBXXvOR3Y50ksaJWGSfhbEvQFivQEFGCC55w==} dependencies: - '@types/node': 20.10.8 + '@types/node': 20.14.2 dev: true /@types/trusted-types@2.0.3: @@ -9243,7 +9246,7 @@ packages: resolution: {integrity: sha512-4UqPv+2567NhMQuMLdKAyK4yzrfCqwaTt6bLhHEs8PFcxbHILsrxaY63n4wgE/BRLDWDQeI+WcTmkXKExh9hQg==} dependencies: '@types/expect': 1.20.4 - '@types/node': 20.10.8 + '@types/node': 20.14.2 /@types/web@0.0.69: resolution: {integrity: sha512-0CqMxeJ+ETljejsVQ5U6gV75C9zz9nmCBXHYqdfnVmWp54VfoJSxUgeO6NI+ezgBl0JQsSiZCs2pkCCT9ERhbA==} @@ -9256,7 +9259,7 @@ packages: /@types/webpack@5.28.5(webpack-cli@5.1.4): resolution: {integrity: sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==} dependencies: - '@types/node': 20.10.8 + '@types/node': 20.14.2 tapable: 2.2.1 webpack: 5.91.0(webpack-cli@5.1.4) transitivePeerDependencies: @@ -9275,7 +9278,7 @@ packages: /@types/ws@8.5.4: resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} dependencies: - '@types/node': 20.10.8 + '@types/node': 20.14.2 dev: false /@types/yargs-parser@21.0.0: @@ -11973,7 +11976,7 @@ packages: - supports-color - ts-node - /create-jest@29.7.0(@types/node@20.10.8)(ts-node@10.8.2): + /create-jest@29.7.0(@types/node@20.14.2)(ts-node@10.8.2): resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -11982,7 +11985,7 @@ packages: chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.10.8)(ts-node@10.8.2) + jest-config: 29.7.0(@types/node@20.14.2)(ts-node@10.8.2) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -14776,7 +14779,7 @@ packages: '@fastify/busboy': 1.2.1 '@firebase/database-compat': 0.3.4 '@firebase/database-types': 0.10.4 - '@types/node': 20.10.8 + '@types/node': 20.14.2 jsonwebtoken: 9.0.2 jwks-rsa: 3.0.1 node-forge: 1.3.1 @@ -16684,7 +16687,7 @@ packages: '@jest/environment': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.10.8 + '@types/node': 20.14.2 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -16712,7 +16715,7 @@ packages: '@jest/expect': 28.1.3 '@jest/test-result': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -16739,7 +16742,7 @@ packages: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.1 @@ -16900,7 +16903,7 @@ packages: - supports-color - ts-node - /jest-cli@29.7.0(@types/node@20.10.8)(ts-node@10.8.2): + /jest-cli@29.7.0(@types/node@20.14.2)(ts-node@10.8.2): resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -16914,10 +16917,10 @@ packages: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.10.8)(ts-node@10.8.2) + create-jest: 29.7.0(@types/node@20.14.2)(ts-node@10.8.2) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.10.8)(ts-node@10.8.2) + jest-config: 29.7.0(@types/node@20.14.2)(ts-node@10.8.2) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -16961,7 +16964,7 @@ packages: pretty-format: 27.5.1 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.8.2(@types/node@20.10.8)(typescript@5.3.3) + ts-node: 10.8.2(@types/node@20.14.2)(typescript@5.3.3) transitivePeerDependencies: - bufferutil - canvas @@ -17009,7 +17012,7 @@ packages: - supports-color dev: true - /jest-config@28.1.3(@types/node@20.10.8)(ts-node@10.8.2): + /jest-config@28.1.3(@types/node@20.14.2)(ts-node@10.8.2): resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} peerDependencies: @@ -17024,7 +17027,7 @@ packages: '@babel/core': 7.21.4 '@jest/test-sequencer': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 babel-jest: 28.1.3(@babel/core@7.21.4) chalk: 4.1.2 ci-info: 3.8.0 @@ -17049,7 +17052,7 @@ packages: - supports-color dev: true - /jest-config@29.5.0(@types/node@20.10.8)(ts-node@10.8.2): + /jest-config@29.5.0(@types/node@20.14.2)(ts-node@10.8.2): resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -17064,7 +17067,7 @@ packages: '@babel/core': 7.21.4 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 babel-jest: 29.7.0(@babel/core@7.21.4) chalk: 4.1.2 ci-info: 3.8.0 @@ -17084,7 +17087,7 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.8.2(@types/node@20.10.8)(typescript@5.3.3) + ts-node: 10.8.2(@types/node@20.14.2)(typescript@5.3.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -17125,7 +17128,7 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.8.2(@types/node@20.10.8)(typescript@5.3.3) + ts-node: 10.8.2(@types/node@20.14.2)(typescript@5.3.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -17207,12 +17210,12 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.2(@types/node@18.15.11)(typescript@5.3.3) + ts-node: 10.9.2(@types/node@18.15.11)(typescript@5.4.5) transitivePeerDependencies: - babel-plugin-macros - supports-color - /jest-config@29.7.0(@types/node@20.10.8)(ts-node@10.8.2): + /jest-config@29.7.0(@types/node@20.14.2)(ts-node@10.8.2): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -17227,7 +17230,7 @@ packages: '@babel/core': 7.21.4 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 babel-jest: 29.7.0(@babel/core@7.21.4) chalk: 4.1.2 ci-info: 3.8.0 @@ -17247,13 +17250,13 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.8.2(@types/node@20.10.8)(typescript@5.3.3) + ts-node: 10.8.2(@types/node@20.14.2)(typescript@5.3.3) transitivePeerDependencies: - babel-plugin-macros - supports-color dev: true - /jest-config@29.7.0(@types/node@20.10.8)(ts-node@10.9.1): + /jest-config@29.7.0(@types/node@20.14.2)(ts-node@10.9.1): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -17268,7 +17271,7 @@ packages: '@babel/core': 7.21.4 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 babel-jest: 29.7.0(@babel/core@7.21.4) chalk: 4.1.2 ci-info: 3.8.0 @@ -17294,7 +17297,7 @@ packages: - supports-color dev: true - /jest-config@29.7.0(@types/node@20.10.8)(ts-node@10.9.2): + /jest-config@29.7.0(@types/node@20.14.2)(ts-node@10.9.2): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -17309,7 +17312,7 @@ packages: '@babel/core': 7.21.4 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 babel-jest: 29.7.0(@babel/core@7.21.4) chalk: 4.1.2 ci-info: 3.8.0 @@ -17329,7 +17332,7 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.2(@types/node@18.15.11)(typescript@5.3.3) + ts-node: 10.9.2(@types/node@18.15.11)(typescript@5.4.5) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -17422,7 +17425,7 @@ packages: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.10.8 + '@types/node': 20.14.2 jest-mock: 27.5.1 jest-util: 27.5.1 jsdom: 16.7.0 @@ -17440,7 +17443,7 @@ packages: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.10.8 + '@types/node': 20.14.2 jest-mock: 27.5.1 jest-util: 27.5.1 dev: false @@ -17452,7 +17455,7 @@ packages: '@jest/environment': 28.1.3 '@jest/fake-timers': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 jest-mock: 28.1.3 jest-util: 28.1.3 dev: true @@ -17464,7 +17467,7 @@ packages: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -17488,7 +17491,7 @@ packages: dependencies: '@jest/types': 27.5.1 '@types/graceful-fs': 4.1.6 - '@types/node': 20.10.8 + '@types/node': 20.14.2 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -17508,7 +17511,7 @@ packages: dependencies: '@jest/types': 28.1.3 '@types/graceful-fs': 4.1.6 - '@types/node': 20.10.8 + '@types/node': 20.14.2 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -17527,7 +17530,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.6 - '@types/node': 20.10.8 + '@types/node': 20.14.2 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -17546,7 +17549,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.6 - '@types/node': 20.10.8 + '@types/node': 20.14.2 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -17566,7 +17569,7 @@ packages: '@jest/source-map': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.10.8 + '@types/node': 20.14.2 chalk: 4.1.2 co: 4.6.0 expect: 27.5.1 @@ -17683,7 +17686,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 20.10.8 + '@types/node': 20.14.2 dev: false /jest-mock@28.1.3: @@ -17691,7 +17694,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@jest/types': 28.1.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 dev: true /jest-mock@29.5.0: @@ -17699,7 +17702,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 jest-util: 29.7.0 dev: true @@ -17708,7 +17711,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 jest-util: 29.7.0 /jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): @@ -17885,7 +17888,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.10.8 + '@types/node': 20.14.2 chalk: 4.1.2 emittery: 0.8.1 graceful-fs: 4.2.11 @@ -17917,7 +17920,7 @@ packages: '@jest/test-result': 28.1.3 '@jest/transform': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 chalk: 4.1.2 emittery: 0.10.2 graceful-fs: 4.2.11 @@ -17946,7 +17949,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -17975,7 +17978,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -18065,7 +18068,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 chalk: 4.1.2 cjs-module-lexer: 1.2.2 collect-v8-coverage: 1.0.1 @@ -18095,7 +18098,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 chalk: 4.1.2 cjs-module-lexer: 1.2.2 collect-v8-coverage: 1.0.1 @@ -18117,7 +18120,7 @@ packages: resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@types/node': 20.10.8 + '@types/node': 20.14.2 graceful-fs: 4.2.11 dev: false @@ -18245,7 +18248,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 20.10.8 + '@types/node': 20.14.2 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -18257,7 +18260,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@jest/types': 28.1.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -18268,7 +18271,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -18280,7 +18283,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -18355,7 +18358,7 @@ packages: dependencies: '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.10.8 + '@types/node': 20.14.2 ansi-escapes: 4.3.2 chalk: 4.1.2 jest-util: 27.5.1 @@ -18368,7 +18371,7 @@ packages: dependencies: '@jest/test-result': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.10.2 @@ -18381,7 +18384,7 @@ packages: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -18395,7 +18398,7 @@ packages: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -18414,7 +18417,7 @@ packages: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.10.8 + '@types/node': 20.14.2 merge-stream: 2.0.0 supports-color: 7.2.0 dev: false @@ -18423,7 +18426,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.10.8 + '@types/node': 20.14.2 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -18431,7 +18434,7 @@ packages: resolution: {integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - '@types/node': 20.10.8 + '@types/node': 20.14.2 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -18439,7 +18442,7 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 20.10.8 + '@types/node': 20.14.2 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -18506,7 +18509,7 @@ packages: - ts-node dev: true - /jest@29.5.0(@types/node@20.10.8)(ts-node@10.8.2): + /jest@29.5.0(@types/node@20.14.2)(ts-node@10.8.2): resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -18519,7 +18522,7 @@ packages: '@jest/core': 29.5.0(ts-node@10.8.2) '@jest/types': 29.5.0 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.10.8)(ts-node@10.8.2) + jest-cli: 29.7.0(@types/node@20.14.2)(ts-node@10.8.2) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -18590,7 +18593,7 @@ packages: - ts-node dev: true - /jest@29.7.0(@types/node@20.10.8)(ts-node@10.8.2): + /jest@29.7.0(@types/node@20.14.2)(ts-node@10.8.2): resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -18603,7 +18606,7 @@ packages: '@jest/core': 29.7.0(ts-node@10.8.2) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.10.8)(ts-node@10.8.2) + jest-cli: 29.7.0(@types/node@20.14.2)(ts-node@10.8.2) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -21861,7 +21864,7 @@ packages: dependencies: lilconfig: 2.1.0 postcss: 8.4.31 - ts-node: 10.8.2(@types/node@20.10.8)(typescript@5.3.3) + ts-node: 10.8.2(@types/node@20.14.2)(typescript@5.3.3) yaml: 1.10.2 dev: true @@ -22917,7 +22920,7 @@ packages: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 20.10.8 + '@types/node': 20.14.2 long: 5.2.1 dev: false optional: true @@ -22937,7 +22940,7 @@ packages: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 20.10.8 + '@types/node': 20.14.2 long: 5.2.1 dev: false @@ -22956,7 +22959,7 @@ packages: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 20.10.8 + '@types/node': 20.14.2 long: 5.2.1 /proxy-addr@2.0.7: @@ -24440,7 +24443,7 @@ packages: hasBin: true dependencies: '@types/estree': 1.0.1 - '@types/node': 20.10.8 + '@types/node': 20.14.2 acorn: 7.4.1 dev: true @@ -25426,7 +25429,7 @@ packages: resolution: {integrity: sha512-OUA32uhNoSoM6wOodyFbV+3IBCoO140uzdXmBArQ0S88D4EbH91xl2v+Ml1sKalcFKUBadHLeHfU/p9AbsOfGw==} engines: {node: '>=12.*'} dependencies: - '@types/node': 20.10.8 + '@types/node': 20.14.2 qs: 6.11.1 /strnum@1.0.5: @@ -26105,7 +26108,7 @@ packages: '@babel/core': 7.21.4 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.5.0(@types/node@20.10.8)(ts-node@10.8.2) + jest: 29.5.0(@types/node@18.15.11)(ts-node@10.8.2) jest-util: 29.5.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -26115,7 +26118,41 @@ packages: yargs-parser: 21.1.1 dev: true - /ts-jest@29.0.5(@babel/core@7.21.4)(jest@29.7.0)(typescript@5.3.3): + /ts-jest@29.0.5(@babel/core@7.21.4)(jest@29.5.0)(typescript@5.4.5): + resolution: {integrity: sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@babel/core': 7.21.4 + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.5.0(@types/node@20.14.2)(ts-node@10.8.2) + jest-util: 29.5.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.5.4 + typescript: 5.4.5 + yargs-parser: 21.1.1 + dev: true + + /ts-jest@29.0.5(@babel/core@7.21.4)(jest@29.7.0)(typescript@5.4.5): resolution: {integrity: sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -26145,7 +26182,7 @@ packages: lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.5.4 - typescript: 5.3.3 + typescript: 5.4.5 yargs-parser: 21.1.1 dev: true @@ -26208,7 +26245,7 @@ packages: '@babel/core': 7.21.4 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.15.11)(ts-node@10.9.2) + jest: 29.7.0(@types/node@20.14.2)(ts-node@10.8.2) jest-util: 29.5.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -26218,6 +26255,40 @@ packages: yargs-parser: 21.1.1 dev: true + /ts-jest@29.1.1(@babel/core@7.21.4)(jest@29.7.0)(typescript@5.4.5): + resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@babel/core': 7.21.4 + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@18.15.11)(ts-node@10.9.2) + jest-util: 29.5.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.5.4 + typescript: 5.4.5 + yargs-parser: 21.1.1 + dev: true + /ts-loader@9.4.2(typescript@5.3.3)(webpack@5.91.0): resolution: {integrity: sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==} engines: {node: '>=12.0.0'} @@ -26233,7 +26304,7 @@ packages: webpack: 5.91.0(webpack-cli@5.1.4) dev: true - /ts-loader@9.4.4(typescript@5.3.3)(webpack@5.91.0): + /ts-loader@9.4.4(typescript@5.4.5)(webpack@5.91.0): resolution: {integrity: sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==} engines: {node: '>=12.0.0'} peerDependencies: @@ -26244,7 +26315,7 @@ packages: enhanced-resolve: 5.13.0 micromatch: 4.0.5 semver: 7.5.4 - typescript: 5.3.3 + typescript: 5.4.5 webpack: 5.91.0(webpack-cli@5.1.4) dev: true @@ -26320,7 +26391,7 @@ packages: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - /ts-node@10.8.2(@types/node@20.10.8)(typescript@5.3.3): + /ts-node@10.8.2(@types/node@20.14.2)(typescript@5.3.3): resolution: {integrity: sha512-LYdGnoGddf1D6v8REPtIH+5iq/gTDuZqv2/UJUU7tKjuEU8xVZorBM+buCGNjj+pGEud+sOoM4CX3/YzINpENA==} hasBin: true peerDependencies: @@ -26339,7 +26410,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 20.10.8 + '@types/node': 20.14.2 acorn: 8.8.2 acorn-walk: 8.2.0 arg: 4.1.3 @@ -26370,7 +26441,7 @@ packages: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 '@types/node': 14.18.33 - acorn: 8.11.3 + acorn: 8.8.2 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 @@ -26441,6 +26512,37 @@ packages: typescript: 5.3.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + dev: true + + /ts-node@10.9.2(@types/node@18.15.11)(typescript@5.4.5): + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + '@types/node': 18.15.11 + acorn: 8.8.2 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.4.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 /ts-toolbelt@6.15.5: resolution: {integrity: sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==} @@ -26714,6 +26816,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + /typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true + /ua-parser-js@0.7.35: resolution: {integrity: sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==} dev: false @@ -28002,7 +28109,7 @@ packages: resolution: {integrity: sha512-CKYrptAvjMhxQTuC7J42UXdmgKc73piuZHNGg0dya6qYZzPmaH31fXxuFv7B9QGAWX8tBmFlDJo9aXne7bmx3g==} requiresBuild: true dependencies: - '@types/node': 20.10.8 + '@types/node': 20.14.2 node-addon-api: 2.0.2 prebuild-install: 5.3.6 dev: false From ab639252bf0d3c687e4b7a1dd037bc5905b1a8de Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 11 Jun 2024 22:31:05 +0400 Subject: [PATCH 0762/1353] jitsu-js: fix build --- libs/jitsu-js/src/jitsu.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/libs/jitsu-js/src/jitsu.ts b/libs/jitsu-js/src/jitsu.ts index 1c72121f9..77cc07588 100644 --- a/libs/jitsu-js/src/jitsu.ts +++ b/libs/jitsu-js/src/jitsu.ts @@ -1,5 +1,4 @@ import type { AnalyticsInterface } from "@jitsu/protocols/analytics"; -import type { AnalyticsPlugin } from "analytics"; type JitsuOptions = { /** @@ -84,6 +83,4 @@ type RuntimeFacade = { export declare function jitsuAnalytics(opts: JitsuOptions): AnalyticsInterface; -export declare const jitsuAnalyticsPlugin: AnalyticsPlugin; - export { AnalyticsInterface, JitsuOptions, PersistentStorage, RuntimeFacade }; From c33cf905c2a4f7cda1329682d82e7d64e55e32fb Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 17 Jun 2024 10:55:07 +0400 Subject: [PATCH 0763/1353] canary version up --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d3dd045a9..7e4406371 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "lint": "turbo run lint --", "release": "pnpm build && pnpm test && monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/functions --filter ./libs/jitsu-js --filter ./libs/jitsu-react --npm-tag latest --git-tag 'jitsu-js-libs-v{version}' --push-tag", "release:build-scripts": "pnpm build --filter ./cli/build-scripts && monorel --filter ./cli/build-scripts --npm-tag latest --version 0.0.4-dev.{rev}.{time} --publish --git-tag 'jitsu-build-scripts-v{version}'", - "release:canary": "monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/functions --filter ./libs/jitsu-js --filter ./libs/jitsu-react --version '1.9.5-canary.{rev}.{time}' --npm-tag canary --git-tag 'jitsu-js-libs-canary-v{version}' --push-tag" + "release:canary": "monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/functions --filter ./libs/jitsu-js --filter ./libs/jitsu-react --version '1.9.6-canary.{rev}.{time}' --npm-tag canary --git-tag 'jitsu-js-libs-canary-v{version}' --push-tag" }, "devDependencies": { "@playwright/test": "1.39.0", From 64b1bcc1ada2b764940221303eb618a8891c182d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Denis=20Rold=C3=A1n?= Date: Fri, 21 Jun 2024 09:31:58 +0200 Subject: [PATCH 0764/1353] feat(destination/fb): Optionally send phone field (#1110) --- .../src/functions/facebook-conversions.ts | 17 ++++++++++++----- libs/core-functions/src/meta.ts | 7 +++++++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/libs/core-functions/src/functions/facebook-conversions.ts b/libs/core-functions/src/functions/facebook-conversions.ts index 252a6078c..22382b04d 100644 --- a/libs/core-functions/src/functions/facebook-conversions.ts +++ b/libs/core-functions/src/functions/facebook-conversions.ts @@ -19,6 +19,12 @@ function sanitizeEmail(em: string) { return em.trim().toLowerCase(); } +function sanitizePhone(ph: string) { + let sanitizedPhone = ph.replace(/[^\d]/g, ""); + sanitizedPhone = sanitizedPhone.replace(/^0+/, ""); + return sanitizedPhone; +} + function tryParse(responseText: string) { try { return JSON.parse(responseText); @@ -39,11 +45,9 @@ const FacebookConversionsApi: JitsuFunction { - if (event.type === "track" || event.type === "page" || event.type === "screen") { + if (["track", "page", "screen"].includes(event.type)) { const filter = createFilter(ctx.props.events || ""); - if (!filter(event.type, event.event)) { - return; - } + if (!filter(event.type, event.event)) return; const fbEvent = { event_name: event.type === "track" ? event.event : event.type, @@ -53,7 +57,10 @@ const FacebookConversionsApi: JitsuFunction !!e)), client_ip_address: event.context.ip, client_user_agent: event.context.userAgent, diff --git a/libs/core-functions/src/meta.ts b/libs/core-functions/src/meta.ts index ba9d0d85a..042ef8016 100644 --- a/libs/core-functions/src/meta.ts +++ b/libs/core-functions/src/meta.ts @@ -12,6 +12,13 @@ export const FacebookConversionApiCredentials = z.object({ .default("website") .describe("Action Source"), events: z.string().optional().default("").describe(eventsParamDescription), + phoneFieldName: z + .string() + .optional() + .default("") + .describe( + "Name of the field in the event user traits that contains the phone number. Expected format could be E.164 or international format. If empty, phone number hash will not be sent." + ), }); export const FacebookConversionApiCredentialsUi = { From 5985337229ac9640ce8196f4dc97706f3f5f0501 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 24 Jun 2024 12:05:13 +0400 Subject: [PATCH 0765/1353] console: Change default primary keys for Clickhouse connections --- webapps/console/lib/schema/destinations.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/webapps/console/lib/schema/destinations.tsx b/webapps/console/lib/schema/destinations.tsx index dab4729a0..d4469840f 100644 --- a/webapps/console/lib/schema/destinations.tsx +++ b/webapps/console/lib/schema/destinations.tsx @@ -366,7 +366,11 @@ export const coreDestinations: DestinationType[] = [ id: "clickhouse", usesBulker: true, icon: , - connectionOptions: BaseBulkerConnectionOptions.describe( + connectionOptions: BaseBulkerConnectionOptions.merge( + z.object({ + primaryKey: z.string().default("timestamp,message_id"), + }) + ).describe( JSON.stringify({ limitations: { streamModeLocked: From 64f1c61c8568b90ecea7e34c8cebbbee2598ad96 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 25 Jun 2024 15:43:44 +0400 Subject: [PATCH 0766/1353] rotor: mongodb: up server selection timeout --- libs/core-functions/src/functions/lib/mongodb.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libs/core-functions/src/functions/lib/mongodb.ts b/libs/core-functions/src/functions/lib/mongodb.ts index a4feb8395..892d1ab44 100644 --- a/libs/core-functions/src/functions/lib/mongodb.ts +++ b/libs/core-functions/src/functions/lib/mongodb.ts @@ -21,7 +21,12 @@ async function createClient() { log.atInfo().log(`Connecting to MongoDB server...`); // Create a new MongoClient - const client = new MongoClient(mongodbURL, { compressors: ["zstd"], maxPoolSize: 32, socketTimeoutMS: mongoTimeout }); + const client = new MongoClient(mongodbURL, { + compressors: ["zstd"], + serverSelectionTimeoutMS: 60000, + maxPoolSize: 32, + socketTimeoutMS: mongoTimeout, + }); // Connect the client to the server (optional starting in v4.7) await client.connect(); // Establish and verify connection From aa64b1745a1dcd360e0d6dd0c4ba2b7eec2a5ec3 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 25 Jun 2024 16:43:07 +0400 Subject: [PATCH 0767/1353] rotor: up isolate vm and mongo --- libs/core-functions/package.json | 4 ++-- pnpm-lock.yaml | 22 +++++++++++----------- services/rotor/dist_package.json | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/libs/core-functions/package.json b/libs/core-functions/package.json index 3d8dfa147..342612202 100644 --- a/libs/core-functions/package.json +++ b/libs/core-functions/package.json @@ -40,10 +40,10 @@ "dayjs": "^1.11.10", "google-ads-api": "^14.2.0", "ioredis": "^5.3.2", - "isolated-vm": "5.0.0", + "isolated-vm": "5.0.1", "juava": "workspace:*", "lodash": "^4.17.21", - "mongodb": "^6.5.0", + "mongodb": "^6.7.0", "node-cache": "^5.1.2", "parse-duration": "^1.1.0", "posthog-node": "^2.4.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 17cef963d..68cd29310 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -321,8 +321,8 @@ importers: specifier: ^5.3.2 version: 5.3.2 isolated-vm: - specifier: 5.0.0 - version: 5.0.0 + specifier: 5.0.1 + version: 5.0.1 juava: specifier: workspace:* version: link:../juava @@ -330,8 +330,8 @@ importers: specifier: ^4.17.21 version: 4.17.21 mongodb: - specifier: ^6.5.0 - version: 6.5.0(@mongodb-js/zstd@1.2.0) + specifier: ^6.7.0 + version: 6.7.0(@mongodb-js/zstd@1.2.0) node-cache: specifier: ^5.1.2 version: 5.1.2 @@ -11098,8 +11098,8 @@ packages: dependencies: node-int64: 0.4.0 - /bson@6.5.0: - resolution: {integrity: sha512-DXf1BTAS8vKyR90BO4x5v3rKVarmkdkzwOrnYDFdjAY694ILNDkmA3uRh1xXJEl+C1DAh8XCvAQ+Gh3kzubtpg==} + /bson@6.7.0: + resolution: {integrity: sha512-w2IquM5mYzYZv6rs3uN2DZTOBe2a0zXLj53TGDqwF4l6Sz/XsISrisXOJihArF9+BZ6Cq/GjVht7Sjfmri7ytQ==} engines: {node: '>=16.20.1'} dev: false @@ -16576,8 +16576,8 @@ packages: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} - /isolated-vm@5.0.0: - resolution: {integrity: sha512-rIMTrIUuwOZ57wK1V3/dmgyXMc1oX4YbGgALAiAH59xHrWoEwOtCQjjvuPZGZwllkMgYlOoNk6hW0+Mg04gJEw==} + /isolated-vm@5.0.1: + resolution: {integrity: sha512-hs7+ff59Z2zDvavfcjuot/r1gm6Bmpt+GoZxmVfxUmXaX5scOvUq/Rnme+mUtSh5lW41hH8gAuvk/yTJDYO8Fg==} engines: {node: '>=18.0.0'} requiresBuild: true dependencies: @@ -20210,8 +20210,8 @@ packages: whatwg-url: 13.0.0 dev: false - /mongodb@6.5.0(@mongodb-js/zstd@1.2.0): - resolution: {integrity: sha512-Fozq68InT+JKABGLqctgtb8P56pRrJFkbhW0ux+x1mdHeyinor8oNzJqwLjV/t5X5nJGfTlluxfyMnOXNggIUA==} + /mongodb@6.7.0(@mongodb-js/zstd@1.2.0): + resolution: {integrity: sha512-TMKyHdtMcO0fYBNORiYdmM25ijsHs+Njs963r4Tro4OQZzqYigAzYQouwWRg4OIaiLRUEGUh/1UAcH5lxdSLIA==} engines: {node: '>=16.20.1'} peerDependencies: '@aws-sdk/credential-providers': ^3.188.0 @@ -20239,7 +20239,7 @@ packages: dependencies: '@mongodb-js/saslprep': 1.1.5 '@mongodb-js/zstd': 1.2.0 - bson: 6.5.0 + bson: 6.7.0 mongodb-connection-string-url: 3.0.0 dev: false diff --git a/services/rotor/dist_package.json b/services/rotor/dist_package.json index 7b7cc78c3..872b29c5e 100644 --- a/services/rotor/dist_package.json +++ b/services/rotor/dist_package.json @@ -2,7 +2,7 @@ "name": "rotor", "version": "0.0.0", "dependencies": { - "isolated-vm": "5.0.0", + "isolated-vm": "5.0.1", "@sensejs/kafkajs-zstd-support": "^0.11.0", "@mongodb-js/zstd": "^1.2.0" } From 8eb54e2f6b24b16206dea937c614b3c4848eb357 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 25 Jun 2024 18:53:20 +0400 Subject: [PATCH 0768/1353] rotor: support of loading maxmind db from 3rd-party urls tweak mongodb params --- .../src/functions/lib/mongodb.ts | 3 +- services/rotor/src/index.ts | 2 +- services/rotor/src/lib/maxmind.ts | 33 +++++++++++-------- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/libs/core-functions/src/functions/lib/mongodb.ts b/libs/core-functions/src/functions/lib/mongodb.ts index 892d1ab44..85b30c845 100644 --- a/libs/core-functions/src/functions/lib/mongodb.ts +++ b/libs/core-functions/src/functions/lib/mongodb.ts @@ -24,7 +24,8 @@ async function createClient() { const client = new MongoClient(mongodbURL, { compressors: ["zstd"], serverSelectionTimeoutMS: 60000, - maxPoolSize: 32, + maxPoolSize: 64, + connectTimeoutMS: 60000, socketTimeoutMS: mongoTimeout, }); // Connect the client to the server (optional starting in v4.7) diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index c9c275d68..377348df9 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -77,7 +77,7 @@ async function main() { process.exit(1); } - geoResolver = await initMaxMindClient(process.env.MAXMIND_LICENSE_KEY || ""); + geoResolver = await initMaxMindClient(process.env.MAXMIND_LICENSE_KEY || process.env.MAXMIND_URL || ""); metricsServer = initMetricsServer(); } catch (e) { log.atError().withCause(e).log("Failed to start"); diff --git a/services/rotor/src/lib/maxmind.ts b/services/rotor/src/lib/maxmind.ts index dbb717c12..11fc67a72 100644 --- a/services/rotor/src/lib/maxmind.ts +++ b/services/rotor/src/lib/maxmind.ts @@ -13,8 +13,13 @@ type PaidEdition = "GeoIP2-City" | "GeoIP2-Country" | "GeoIP2-ISP" | "GeoIP2-Dom type FreeEditions = "GeoLite2-City" | "GeoLite2-Country" | "GeoLite2-ASN"; type Edition = PaidEdition | FreeEditions | "NotRequired" | ""; -const officialUrl = (licenseKey: string, edition: Edition) => - `https://download.maxmind.com/app/geoip_download?license_key=${licenseKey}&edition_id=${edition}&suffix=tar.gz`; +const composeURL = (licenseKeyOrURL: string, edition: Edition) => { + if (licenseKeyOrURL.startsWith("http")) { + return licenseKeyOrURL + (licenseKeyOrURL.endsWith("/") ? "" : "/") + edition + ".tar.gz"; + } else { + return `https://download.maxmind.com/app/geoip_download?license_key=${licenseKeyOrURL}&edition_id=${edition}&suffix=tar.gz`; + } +}; const geoIpCache = new NodeCache({ stdTTL: 60 * 5, checkperiod: 60, useClones: false }); @@ -34,9 +39,9 @@ async function test() { log.atInfo().log(`IP 209.142.68.29:`, JSON.stringify(await maxMindClient.resolve("209.142.68.29"), null, 2)); } -export async function initMaxMindClient(licenseKey: string): Promise { - if (!licenseKey) { - log.atError().log("licenseKey is not provided. GeoIP resolution will not work."); +export async function initMaxMindClient(licenseKeyOrURL: string): Promise { + if (!licenseKeyOrURL) { + log.atError().log("licenseKeyOrURL is not provided. GeoIP resolution will not work."); return DummyResolver; } let cityReader: ReaderModel | undefined; @@ -46,16 +51,16 @@ export async function initMaxMindClient(licenseKey: string): Promise { try { - const b = await loadFromURL(officialUrl(licenseKey, edition)); + const b = await loadFromURL(composeURL(licenseKeyOrURL, edition)); const reader = Reader.openBuffer(b); log.atInfo().log(`Successfully downloaded ${edition} edition`); return { reader, edition }; @@ -214,7 +219,7 @@ async function downloadOfficial( .atError() .log(`Failed to download ${edition} edition: ${e.message}. Trying to download free ${freeEdition} edition`); try { - const b = await loadFromURL(officialUrl(licenseKey, freeEdition)); + const b = await loadFromURL(composeURL(licenseKeyOrURL, freeEdition)); const reader = Reader.openBuffer(b); log.atInfo().log(`Successfully downloaded free ${freeEdition} edition`); return { reader, edition: freeEdition }; From eb5a093fc47ae2bc2e65d17ba8e786b6923cb040 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 25 Jun 2024 22:42:36 +0400 Subject: [PATCH 0769/1353] console: up google-ads-api version --- libs/core-functions/package.json | 2 +- pnpm-lock.yaml | 214 +++++++++++++++++++++++++++++-- webapps/console/package.json | 2 +- 3 files changed, 202 insertions(+), 16 deletions(-) diff --git a/libs/core-functions/package.json b/libs/core-functions/package.json index 342612202..b1b9d593d 100644 --- a/libs/core-functions/package.json +++ b/libs/core-functions/package.json @@ -38,7 +38,7 @@ "@mongodb-js/zstd": "^1.2.0", "agentkeepalive": "4.3.0", "dayjs": "^1.11.10", - "google-ads-api": "^14.2.0", + "google-ads-api": "^16.0.0-rest-beta3", "ioredis": "^5.3.2", "isolated-vm": "5.0.1", "juava": "workspace:*", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 68cd29310..fea6a8794 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -315,8 +315,8 @@ importers: specifier: ^1.11.10 version: 1.11.10 google-ads-api: - specifier: ^14.2.0 - version: 14.2.0 + specifier: ^16.0.0-rest-beta3 + version: 16.0.0-rest-beta3 ioredis: specifier: ^5.3.2 version: 5.3.2 @@ -908,8 +908,8 @@ importers: specifier: ^11.11.0 version: 11.11.0 google-ads-api: - specifier: ^14.2.0 - version: 14.2.0 + specifier: ^16.0.0-rest-beta3 + version: 16.0.0-rest-beta3 googleapis: specifier: ^126.0.1 version: 126.0.1 @@ -4188,6 +4188,14 @@ packages: dev: false optional: true + /@grpc/grpc-js@1.10.10: + resolution: {integrity: sha512-HPa/K5NX6ahMoeBv15njAc/sfF4/jmiXLar9UlC2UfHFKZzsCVLc3wbe7+7qua7w9VPh2/L6EBxyAV7/E8Wftg==} + engines: {node: '>=12.10.0'} + dependencies: + '@grpc/proto-loader': 0.7.13 + '@js-sdsl/ordered-map': 4.4.2 + dev: false + /@grpc/grpc-js@1.8.13: resolution: {integrity: sha512-iY3jsdfbc0ARoCLFvbvUB8optgyb0r1XLPb142u+QtgBcKJYkCIFt3Fd/881KqjLYWjsBJF57N3b8Eop9NDfUA==} engines: {node: ^8.13.0 || >=10.10.0} @@ -4213,6 +4221,17 @@ packages: protobufjs: 7.2.5 yargs: 17.7.2 + /@grpc/proto-loader@0.7.13: + resolution: {integrity: sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==} + engines: {node: '>=6'} + hasBin: true + dependencies: + lodash.camelcase: 4.3.0 + long: 5.2.1 + protobufjs: 7.3.2 + yargs: 17.7.2 + dev: false + /@hubspot/api-client@11.1.0: resolution: {integrity: sha512-HUkvUJKKvKhED0RZfpjnTX+b5+RNRlFfAllT7ozLP7gEoT5fp5aT148mnBdNZTr1UPfScBdDQa42ixHjgkIlNQ==} dependencies: @@ -5228,6 +5247,10 @@ packages: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 + /@js-sdsl/ordered-map@4.4.2: + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + dev: false + /@jsdoc/salty@0.2.5: resolution: {integrity: sha512-TfRP53RqunNe2HBobVBJ0VLhK1HbfvBYeTC1ahnN64PWvyYyGebmMiPkuwvD9fpw2ZbkoPb8Q7mwy0aR8Z9rvw==} engines: {node: '>=v12.0.0'} @@ -8731,6 +8754,10 @@ packages: '@types/node': 20.14.2 dev: false + /@types/caseless@0.12.5: + resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} + dev: false + /@types/chalk@2.2.0: resolution: {integrity: sha512-1zzPV9FDe1I/WHhRkf9SNgqtRJWZqrBWgu7JGveuHmmyR9CnAPCie2N/x+iHrgnpYBIcCJWHBoMRv2TRWktsvw==} deprecated: This is a stub types definition for chalk (https://github.com/chalk/chalk). chalk provides its own type definitions, so you don't need @types/chalk installed! @@ -9142,6 +9169,15 @@ packages: '@types/node': 20.14.2 dev: true + /@types/request@2.48.12: + resolution: {integrity: sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==} + dependencies: + '@types/caseless': 0.12.5 + '@types/node': 20.14.2 + '@types/tough-cookie': 4.0.5 + form-data: 2.5.1 + dev: false + /@types/resolve@0.0.8: resolution: {integrity: sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==} dependencies: @@ -9238,6 +9274,10 @@ packages: '@types/node': 20.14.2 dev: true + /@types/tough-cookie@4.0.5: + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + dev: false + /@types/trusted-types@2.0.3: resolution: {integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==} dev: false @@ -11429,6 +11469,10 @@ packages: resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} engines: {node: '>=8'} + /circ-json@1.0.4: + resolution: {integrity: sha512-/2NljkKlOCvNgs8jsIlJcCFhUfF6C1JJKM8PdJQ6HqIrqhJBouMcWFdeDJLNLZAadeTj0K9FMziH74hpEtAr1g==} + dev: false + /cjs-module-lexer@1.2.2: resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} @@ -15126,6 +15170,20 @@ packages: - supports-color dev: false + /gaxios@6.6.0: + resolution: {integrity: sha512-bpOZVQV5gthH/jVCSuYuokRo2bTKOcuBiVWpjmTn6C5Agl5zclGfTljuGsQZxwwDBkli+YhZhP4TdlqTnhOezQ==} + engines: {node: '>=14'} + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.1 + is-stream: 2.0.1 + node-fetch: 2.7.0 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /gcp-metadata@4.3.1: resolution: {integrity: sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==} engines: {node: '>=10'} @@ -15161,6 +15219,17 @@ packages: - supports-color dev: false + /gcp-metadata@6.1.0: + resolution: {integrity: sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==} + engines: {node: '>=14'} + dependencies: + gaxios: 6.6.0 + json-bigint: 1.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /generic-names@2.0.1: resolution: {integrity: sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ==} dependencies: @@ -15379,23 +15448,29 @@ packages: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} dev: true - /google-ads-api@14.2.0: - resolution: {integrity: sha512-WPFAS0bqybDmuI70YQPV6kqih8klrAUDOe1KOxIpQgYGUn1u8u7yGGkWwemPFa/owFi3ZTV0VN2wG68pU3B/bQ==} + /google-ads-api@16.0.0-rest-beta3: + resolution: {integrity: sha512-0XdXmlycfoWxTOg/Sr2djdUepNYojvx+MHJXKT0TKRyhH5a2V/lGqtht1H3QktOpjIGFuAdcXSHB46AIxZg+9g==} dependencies: '@isaacs/ttlcache': 1.4.1 - google-ads-node: 12.0.2 + axios: 1.6.7 + circ-json: 1.0.4 + google-ads-node: 13.0.0 google-auth-library: 7.14.1 - google-gax: 4.0.3 + google-gax: 4.3.7 long: 4.0.0 + map-obj: 4.3.0 + stream-json: 1.8.0 transitivePeerDependencies: + - debug - encoding - supports-color dev: false - /google-ads-node@12.0.2: - resolution: {integrity: sha512-vCVLFckkTo7TJnpHYKLELoaH4gDs3Kv/eye/TtndC3vxKAEIGZJtSoBW7RKx9S00iv5Ld5osgOUBTdIRMFGwVw==} + /google-ads-node@13.0.0: + resolution: {integrity: sha512-A8g+58gJrSQqN88OTlg3Y3x7JTMUT62ZMUMtfznEs3RKKNQFnz8cv077031NVpmgS1eSXbcdYTDtaCGkhWSv2g==} dependencies: - google-gax: 4.0.3 + google-gax: 4.3.7 + lru-cache: 10.2.2 transitivePeerDependencies: - encoding - supports-color @@ -15455,6 +15530,21 @@ packages: - supports-color dev: false + /google-auth-library@9.11.0: + resolution: {integrity: sha512-epX3ww/mNnhl6tL45EQ/oixsY8JLEgUFoT4A5E/5iAR4esld9Kqv6IJGk7EmGuOgDvaarwF95hU2+v7Irql9lw==} + engines: {node: '>=14'} + dependencies: + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + gaxios: 6.6.0 + gcp-metadata: 6.1.0 + gtoken: 7.0.1 + jws: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /google-gax@3.6.0: resolution: {integrity: sha512-2fyb61vWxUonHiArRNJQmE4tx5oY1ni8VPo08fzII409vDSCWG7apDX4qNOQ2GXXT82gLBn3d3P1Dydh7pWjyw==} engines: {node: '>=12'} @@ -15502,6 +15592,27 @@ packages: - supports-color dev: false + /google-gax@4.3.7: + resolution: {integrity: sha512-3bnD8RASQyaxOYTdWLgwpQco/aytTxFavoI/UN5QN5txDLp8QRrBHNtCUJ5+Ago+551GD92jG8jJduwvmaneUw==} + engines: {node: '>=14'} + dependencies: + '@grpc/grpc-js': 1.10.10 + '@grpc/proto-loader': 0.7.13 + '@types/long': 4.0.2 + abort-controller: 3.0.0 + duplexify: 4.1.2 + google-auth-library: 9.11.0 + node-fetch: 2.7.0 + object-hash: 3.0.0 + proto3-json-serializer: 2.0.2 + protobufjs: 7.3.2 + retry-request: 7.0.2 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /google-p12-pem@3.1.4: resolution: {integrity: sha512-HHuHmkLgwjdmVRngf5+gSmpkyaRI6QmOg77J8tkNBHhNEI62sGHyw4/+UkgyZEI7h84NbWprXDJ+sa3xOYFvTg==} engines: {node: '>=10'} @@ -15594,7 +15705,7 @@ packages: resolution: {integrity: sha512-KcFVtoP1CVFtQu0aSk3AyAt2og66PFhZAlkUOuWKwzMLoulHXG5W5wE5xAnHb+yl3/wEFoqGW7/cDGMU8igDZQ==} engines: {node: '>=14.0.0'} dependencies: - gaxios: 6.0.4 + gaxios: 6.6.0 jws: 4.0.0 transitivePeerDependencies: - encoding @@ -19269,6 +19380,11 @@ packages: tslib: 2.6.2 dev: false + /lru-cache@10.2.2: + resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} + engines: {node: 14 || >=16.14} + dev: false + /lru-cache@4.0.2: resolution: {integrity: sha512-uQw9OqphAGiZhkuPlpFGmdTU2tEuhxTourM/19qGJrxBPHAr/f8BT1a0i/lOclESnGatdJG/UCkP9kZB/Lh1iw==} dependencies: @@ -19411,6 +19527,11 @@ packages: dependencies: tmpl: 1.0.5 + /map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: false + /markdown-it-anchor@8.6.7(@types/markdown-it@12.2.3)(markdown-it@12.3.2): resolution: {integrity: sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==} requiresBuild: true @@ -22883,6 +23004,13 @@ packages: protobufjs: 7.2.5 dev: false + /proto3-json-serializer@2.0.2: + resolution: {integrity: sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==} + engines: {node: '>=14.0.0'} + dependencies: + protobufjs: 7.3.2 + dev: false + /protobufjs-cli@1.1.1(protobufjs@7.2.3): resolution: {integrity: sha512-VPWMgIcRNyQwWUv8OLPyGQ/0lQY/QTQAVN5fh+XzfDwsVw1FZ2L3DM/bcBf8WPiRz2tNpaov9lPZfNcmNo6LXA==} engines: {node: '>=12.0.0'} @@ -22962,6 +23090,25 @@ packages: '@types/node': 20.14.2 long: 5.2.1 + /protobufjs@7.3.2: + resolution: {integrity: sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 20.14.2 + long: 5.2.1 + dev: false + /proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -24291,6 +24438,18 @@ packages: - supports-color dev: false + /retry-request@7.0.2: + resolution: {integrity: sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==} + engines: {node: '>=14'} + dependencies: + '@types/request': 2.48.12 + extend: 3.0.2 + teeny-request: 9.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} @@ -25204,13 +25363,22 @@ packages: resolution: {integrity: sha512-TpRTztFjiq/B5wn84oKK0YHHtprgrC8pLOUkqVU+MN+2DgdBMaEIeSyGeAn2n+7mT9zrfJyhM33Yw4j/rRV2Bg==} dev: false + /stream-chain@2.2.5: + resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} + dev: false + /stream-events@1.0.5: resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==} requiresBuild: true dependencies: stubs: 3.0.0 dev: false - optional: true + + /stream-json@1.8.0: + resolution: {integrity: sha512-HZfXngYHUAr1exT4fxlbc1IOce1RYxp2ldeaf97LYCOPSoOqY/1Psp7iGvpb+6JIOgkra9zDYnPX01hGAHzEPw==} + dependencies: + stream-chain: 2.2.5 + dev: false /stream-shift@1.0.1: resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} @@ -25440,7 +25608,6 @@ packages: resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} requiresBuild: true dev: false - optional: true /style-inject@0.3.0: resolution: {integrity: sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==} @@ -25757,6 +25924,20 @@ packages: dev: false optional: true + /teeny-request@9.0.0: + resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==} + engines: {node: '>=14'} + dependencies: + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + node-fetch: 2.7.0 + stream-events: 1.0.5 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /temp-dir@2.0.0: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} engines: {node: '>=8'} @@ -27089,6 +27270,11 @@ packages: hasBin: true dev: false + /uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + dev: false + /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} diff --git a/webapps/console/package.json b/webapps/console/package.json index bc998e039..507ffce2c 100644 --- a/webapps/console/package.json +++ b/webapps/console/package.json @@ -60,7 +60,7 @@ "facebook-nodejs-business-sdk": "^19.0.0", "firebase": "^10.4.0", "firebase-admin": "^11.11.0", - "google-ads-api": "^14.2.0", + "google-ads-api": "^16.0.0-rest-beta3", "googleapis": "^126.0.1", "highlight.js": "^11.6.0", "ioredis": "^5.3.2", From 4d0e03ab7ff4be56a7cb7653e4440113bb8060e7 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 26 Jun 2024 09:53:25 +0400 Subject: [PATCH 0770/1353] mongodb-destination: don't exit process on connection errors to 3rd-party servers --- libs/core-functions/src/functions/mongodb-destination.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/core-functions/src/functions/mongodb-destination.ts b/libs/core-functions/src/functions/mongodb-destination.ts index ed47ee2c7..38c5fa883 100644 --- a/libs/core-functions/src/functions/mongodb-destination.ts +++ b/libs/core-functions/src/functions/mongodb-destination.ts @@ -46,6 +46,7 @@ const MongodbDestination: JitsuFunction client.close(), } From b595ca1d57ab00ba87e22d1843712042980bce45 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 2 Jul 2024 15:50:34 +0400 Subject: [PATCH 0771/1353] console: SyncEditor don't allow to save Sync w/o loaded catalog --- webapps/console/components/SyncEditorPage/SyncEditorPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx index 05c3ae6a4..5027859e1 100644 --- a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx +++ b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx @@ -791,7 +791,7 @@ function SyncEditor({ type="primary" size="large" loading={loading} - disabled={loading || disableSync} + disabled={loading || disableSync || typeof syncOptions !== "object" || loadingCatalog} onClick={async () => { setLoading(true); try { From 0fc8ca9cdba2fa96ee7d24cc27b2681f1e777067 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 2 Jul 2024 17:34:49 +0400 Subject: [PATCH 0772/1353] console: SyncEditor fix for updating Sync settings after connector version change --- webapps/console/components/SyncEditorPage/SyncEditorPage.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx index 5027859e1..d1b7f14db 100644 --- a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx +++ b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx @@ -318,6 +318,8 @@ function SyncEditor({ } if (xor(Object.keys(streams), Object.keys(currentStreams)).length > 0) { updateOptions({ streams, storageKey }); + } else { + updateOptions({ storageKey }); } }, [syncOptions?.streams, updateOptions] From 63ddb6e582451253b1afac87cb2493322a349a9b Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 3 Jul 2024 12:03:49 +0400 Subject: [PATCH 0773/1353] ee-api: provision-db: enable loadAsJson --- webapps/ee-api/pages/api/provision-db.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/webapps/ee-api/pages/api/provision-db.ts b/webapps/ee-api/pages/api/provision-db.ts index 5bd8abde5..f3cb7c342 100644 --- a/webapps/ee-api/pages/api/provision-db.ts +++ b/webapps/ee-api/pages/api/provision-db.ts @@ -114,6 +114,7 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse return res.status(200).json({ ...credentials, protocol: "clickhouse-secure", + loadAsJson: true, hosts: chHosts, }); } @@ -127,6 +128,7 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse return { ...dbCredentials, protocol: "clickhouse-secure", + loadAsJson: true, hosts: chHosts, }; }; From 08623a5e127c5ff251e968ede33170e3cfaf3ef6 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 3 Jul 2024 12:16:42 +0400 Subject: [PATCH 0774/1353] ee-api: fix package name so turbo can see that package --- webapps/ee-api/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/ee-api/package.json b/webapps/ee-api/package.json index 1f79d3a1f..b2bda82c5 100644 --- a/webapps/ee-api/package.json +++ b/webapps/ee-api/package.json @@ -1,5 +1,5 @@ { - "name": "@jitsu-ee/api", + "name": "@jitsu-ee/ee-api", "version": "0.0.0", "private": true, "scripts": { From 4a7471370632a1681e33ee66e7602dfcd569a396 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 3 Jul 2024 17:34:21 +0400 Subject: [PATCH 0775/1353] console: pass destination config to syncctl read endpoint --- webapps/console/lib/server/sync.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/webapps/console/lib/server/sync.ts b/webapps/console/lib/server/sync.ts index 5f4b9796f..959ebdae5 100644 --- a/webapps/console/lib/server/sync.ts +++ b/webapps/console/lib/server/sync.ts @@ -578,7 +578,7 @@ export async function scheduleSync({ if (!catalog) { return { ok: false, - error: `Catalog not found. Please run Refresh Catalog in Sync settings`, + error: `Source catalog not found or outdated. Please run Refresh Catalog in Sync settings`, }; } const configuredCatalog = selectStreamsFromCatalog(catalog, (sync.data as any).streams); @@ -601,6 +601,7 @@ export async function scheduleSync({ config: await tryManageOauthCreds({ ...serviceConfig, id: sync.fromId }), catalog: configuredCatalog, ...(stateObj ? { state: stateObj } : {}), + destinationConfig, }, }); if (!res.ok) { From 7657ce34c03ca55fd303475fdad0567bd61a2ae7 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 3 Jul 2024 18:43:40 +0400 Subject: [PATCH 0776/1353] rotor: isolate-vm tmp memory increase --- .../src/functions/udf_wrapper.ts | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/libs/core-functions/src/functions/udf_wrapper.ts b/libs/core-functions/src/functions/udf_wrapper.ts index db0818e3f..65babbdfe 100644 --- a/libs/core-functions/src/functions/udf_wrapper.ts +++ b/libs/core-functions/src/functions/udf_wrapper.ts @@ -53,7 +53,7 @@ export const UDFWrapper = ( let context: Context; let refs: Reference[] = []; try { - isolate = new Isolate({ memoryLimit: 64 }); + isolate = new Isolate({ memoryLimit: 128 }); context = isolate.createContextSync(); const jail = context.global; @@ -242,13 +242,19 @@ function wrap(connectionId: string, isolate: Isolate, context: Context, wrapper: //console.error(e); if (isolate.isDisposed) { if (isTimeout) { - throw new RetryError(`Function execution took longer than ${udfTimeoutMs}ms. Isolate is disposed`, { - drop: true, - }); + throw new RetryError( + `[${connectionId}] Function execution took longer than ${udfTimeoutMs}ms. Isolate is disposed`, + { + drop: true, + } + ); } else { - throw new RetryError(`Function execution stopped probably due to high memory usage. Isolate is disposed.`, { - drop: true, - }); + throw new RetryError( + `[${connectionId}] Function execution stopped probably due to high memory usage. Isolate is disposed.`, + { + drop: true, + } + ); } } const m = e.message; From 7c9ba017941075a05e5e6aa8740924e6416798a5 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 3 Jul 2024 18:47:42 +0400 Subject: [PATCH 0777/1353] rotor: isolate-vm tmp memory increase --- all.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/all.Dockerfile b/all.Dockerfile index 96eba9629..a7c97fe82 100644 --- a/all.Dockerfile +++ b/all.Dockerfile @@ -6,7 +6,7 @@ FROM node:22-slim as base WORKDIR /app RUN apt-get update -y -RUN apt-get install nano curl bash netcat-traditional procps jq -y +RUN apt-get install curl bash -y FROM base as builder From 2bc641495e996fb40a55394149011dd0b5856202 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 3 Jul 2024 18:49:34 +0400 Subject: [PATCH 0778/1353] rotor: isolate-vm tmp memory increase --- all.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/all.Dockerfile b/all.Dockerfile index a7c97fe82..c2d59716c 100644 --- a/all.Dockerfile +++ b/all.Dockerfile @@ -6,7 +6,7 @@ FROM node:22-slim as base WORKDIR /app RUN apt-get update -y -RUN apt-get install curl bash -y +RUN apt-get install bash -y FROM base as builder From d10f7b1983c05fa997abffca863d7b9ea500e5f9 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 3 Jul 2024 21:56:19 +0400 Subject: [PATCH 0779/1353] rotor: bring back utility packages to docker image --- all.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/all.Dockerfile b/all.Dockerfile index c2d59716c..96eba9629 100644 --- a/all.Dockerfile +++ b/all.Dockerfile @@ -6,7 +6,7 @@ FROM node:22-slim as base WORKDIR /app RUN apt-get update -y -RUN apt-get install bash -y +RUN apt-get install nano curl bash netcat-traditional procps jq -y FROM base as builder From 201bef2a16b54d7830b9a238a3e52ed834548248 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 4 Jul 2024 11:57:20 +0400 Subject: [PATCH 0780/1353] rotor: tmp workaround --- libs/core-functions/src/functions/lib/index.ts | 4 ++-- services/rotor/src/lib/functions-chain.ts | 2 +- services/rotor/src/lib/message-handler.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libs/core-functions/src/functions/lib/index.ts b/libs/core-functions/src/functions/lib/index.ts index 9bae6d29f..8fd020901 100644 --- a/libs/core-functions/src/functions/lib/index.ts +++ b/libs/core-functions/src/functions/lib/index.ts @@ -306,7 +306,7 @@ export const makeLog = (connectionId: string, eventsStore: EventsStore) => ({ }); export const makeFetch = - (connectionId: string, eventsStore: EventsStore, logLevel: "info" | "debug", fetchTimeoutMs: number = 5000) => + (connectionId: string, eventsStore: EventsStore, logLevel: "info" | "debug", fetchTimeoutMs: number = 2000) => async ( url: string, init?: FetchOpts, @@ -336,7 +336,7 @@ export const makeFetch = let internalInit: RequestInit = { ...init, keepalive: true, - signal: AbortSignal.timeout(fetchTimeoutMs), + signal: AbortSignal.timeout(connectionId === "clke5lrfm0000ii0gahryc37d-wbyo-5jyq-KIMXwt" ? 500 : fetchTimeoutMs), }; let fetchResult: any = undefined; try { diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index 0700261e4..87b2b564a 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -104,7 +104,7 @@ export function buildFunctionChain( funcStore: EntityStore, rotorContext: MessageHandlerContext, anonymousEventsStore: AnonymousEventsStore, - fetchTimeoutMs: number = 5000 + fetchTimeoutMs: number = 2000 ): FuncChain { let mainFunction; const connectionData = connection.options as any; diff --git a/services/rotor/src/lib/message-handler.ts b/services/rotor/src/lib/message-handler.ts index 106d185cd..a56625c89 100644 --- a/services/rotor/src/lib/message-handler.ts +++ b/services/rotor/src/lib/message-handler.ts @@ -47,7 +47,7 @@ export async function rotorMessageHandler( headers?, retriesEnabled: boolean = true, retries: number = 0, - fetchTimeoutMs: number = 5000 + fetchTimeoutMs: number = 2000 ) { if (!_message) { return; From f5f8685ea4f058ac9830ecd621fae9d14611da6f Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 4 Jul 2024 11:58:58 +0400 Subject: [PATCH 0781/1353] rotor: revert: bring back utility packages to docker image --- all.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/all.Dockerfile b/all.Dockerfile index 96eba9629..c2d59716c 100644 --- a/all.Dockerfile +++ b/all.Dockerfile @@ -6,7 +6,7 @@ FROM node:22-slim as base WORKDIR /app RUN apt-get update -y -RUN apt-get install nano curl bash netcat-traditional procps jq -y +RUN apt-get install bash -y FROM base as builder From b55415995fd261d80ec9bb118fbdc4f779a9e4d8 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 4 Jul 2024 12:57:01 +0400 Subject: [PATCH 0782/1353] rotor: simple throttle implementation --- .../core-functions/src/functions/lib/index.ts | 24 ++++++--- libs/juava/src/index.ts | 1 + libs/juava/src/throttle.ts | 54 +++++++++++++++++++ 3 files changed, 73 insertions(+), 6 deletions(-) create mode 100644 libs/juava/src/throttle.ts diff --git a/libs/core-functions/src/functions/lib/index.ts b/libs/core-functions/src/functions/lib/index.ts index 8fd020901..7474e5c52 100644 --- a/libs/core-functions/src/functions/lib/index.ts +++ b/libs/core-functions/src/functions/lib/index.ts @@ -19,7 +19,7 @@ import { Metrics, TTLStore, } from "@jitsu/protocols/functions"; -import { getErrorMessage, getLog, LogLevel, newError, stopwatch } from "juava"; +import { getErrorMessage, getLog, getThrottle, LogLevel, newError, noThrottle, stopwatch } from "juava"; const log = getLog("functions-context"); @@ -314,6 +314,7 @@ export const makeFetch = ): Promise => { //capture execution time const sw = stopwatch(); + const throttle = connectionId === "clke5lrfm0000ii0gahryc37d-wbyo-5jyq-KIMXwt" ? getThrottle(10000) : noThrottle(); const ctx = extra?.ctx?.function; const id = ctx?.id || "unknown"; const type = ctx?.type || "unknown"; @@ -333,17 +334,28 @@ export const makeFetch = } : undefined; - let internalInit: RequestInit = { - ...init, - keepalive: true, - signal: AbortSignal.timeout(connectionId === "clke5lrfm0000ii0gahryc37d-wbyo-5jyq-KIMXwt" ? 500 : fetchTimeoutMs), - }; let fetchResult: any = undefined; try { + const throttleValue = throttle.throttle(); + if (throttleValue > 0 && Math.random() < throttleValue) { + const e = new Error(`Fetch request throttled because of timeout rate: ${throttleValue}`); + e.name = "ThrottleError"; + throw e; + } + const internalInit: RequestInit = { + ...init, + keepalive: true, + signal: AbortSignal.timeout(fetchTimeoutMs), + }; fetchResult = await fetch(url, internalInit); + throttle.success(); } catch (err: any) { if (err.name === "TimeoutError") { + throttle.fail(); err = newError(`Fetch request exceeded timeout ${fetchTimeoutMs}ms and was aborted`, err); + } else if (err.name !== "ThrottleError") { + // we throttle only timeout errors. all other cases considered as success here + throttle.success(); } if (logEnabled) { const elapsedMs = sw.elapsedMs(); diff --git a/libs/juava/src/index.ts b/libs/juava/src/index.ts index b19519e6f..1e40ffb68 100644 --- a/libs/juava/src/index.ts +++ b/libs/juava/src/index.ts @@ -12,3 +12,4 @@ export * from "./cache"; export * from "./sql-params"; export * from "./boolean"; export * from "./number"; +export * from "./throttle"; diff --git a/libs/juava/src/throttle.ts b/libs/juava/src/throttle.ts new file mode 100644 index 000000000..bb4672bfa --- /dev/null +++ b/libs/juava/src/throttle.ts @@ -0,0 +1,54 @@ +export interface Throttle { + throttle(): number; + fail: () => void; + success: () => void; +} + +export function noThrottle(): Throttle { + return { + throttle: () => 0, + fail: () => {}, + success: () => {}, + }; +} + +export function getThrottle(calculatePeriodMs: number): Throttle { + let previousThrottle = 0; + let previousThrottleTime = Date.now(); + let currentThrottle = 0; + let fails = 0; + let successes = 0; + + function recalculateThrottle() { + const now = Date.now(); + if (now - previousThrottleTime < calculatePeriodMs) { + return; + } + previousThrottleTime = now; + previousThrottle = currentThrottle; + const total = fails + successes; + if (total < 2) { + currentThrottle = 0; + return; + } + const l = Math.min(10, total); + const throttle = Math.max(fails / (successes + fails), (l - 1) / l); + + previousThrottle = currentThrottle; + currentThrottle = throttle; + } + + return { + fail: () => { + fails++; + recalculateThrottle(); + }, + success: () => { + successes++; + recalculateThrottle(); + }, + throttle: () => { + return (previousThrottle + currentThrottle) / 2; + }, + }; +} From 77d77aab4b795690bf9ecd39057a141621d47ec8 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 4 Jul 2024 13:07:12 +0400 Subject: [PATCH 0783/1353] rotor: simple throttle implementation --- libs/core-functions/src/functions/lib/index.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/libs/core-functions/src/functions/lib/index.ts b/libs/core-functions/src/functions/lib/index.ts index 7474e5c52..ffef02574 100644 --- a/libs/core-functions/src/functions/lib/index.ts +++ b/libs/core-functions/src/functions/lib/index.ts @@ -305,16 +305,21 @@ export const makeLog = (connectionId: string, eventsStore: EventsStore) => ({ }, }); -export const makeFetch = - (connectionId: string, eventsStore: EventsStore, logLevel: "info" | "debug", fetchTimeoutMs: number = 2000) => - async ( +export const makeFetch = ( + connectionId: string, + eventsStore: EventsStore, + logLevel: "info" | "debug", + fetchTimeoutMs: number = 2000 +) => { + const throttle = connectionId === "clke5lrfm0000ii0gahryc37d-wbyo-5jyq-KIMXwt" ? getThrottle(10000) : noThrottle(); + + return async ( url: string, init?: FetchOpts, extra?: { log?: boolean; ctx?: FunctionContext; event?: AnyEvent } ): Promise => { //capture execution time const sw = stopwatch(); - const throttle = connectionId === "clke5lrfm0000ii0gahryc37d-wbyo-5jyq-KIMXwt" ? getThrottle(10000) : noThrottle(); const ctx = extra?.ctx?.function; const id = ctx?.id || "unknown"; const type = ctx?.type || "unknown"; @@ -398,6 +403,7 @@ export const makeFetch = return fetchResult; }; +}; function hideSensitiveHeaders(headers: Record): Record { const result: Record = {}; From 2b60b18f86f82c1fef4c62f2c6cde784a7ea1113 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 4 Jul 2024 13:21:11 +0400 Subject: [PATCH 0784/1353] rotor: simple throttle implementation --- libs/juava/src/throttle.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/libs/juava/src/throttle.ts b/libs/juava/src/throttle.ts index bb4672bfa..668791b62 100644 --- a/libs/juava/src/throttle.ts +++ b/libs/juava/src/throttle.ts @@ -32,10 +32,7 @@ export function getThrottle(calculatePeriodMs: number): Throttle { return; } const l = Math.min(10, total); - const throttle = Math.max(fails / (successes + fails), (l - 1) / l); - - previousThrottle = currentThrottle; - currentThrottle = throttle; + currentThrottle = Math.min(fails / total, (l - 1) / l); } return { From a1c08c088b6568374b92e6f25c52d60f975b8df6 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 4 Jul 2024 15:28:28 +0400 Subject: [PATCH 0785/1353] rotor: simple throttle implementation --- libs/juava/src/throttle.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/juava/src/throttle.ts b/libs/juava/src/throttle.ts index 668791b62..a9be063e8 100644 --- a/libs/juava/src/throttle.ts +++ b/libs/juava/src/throttle.ts @@ -31,7 +31,7 @@ export function getThrottle(calculatePeriodMs: number): Throttle { currentThrottle = 0; return; } - const l = Math.min(10, total); + const l = Math.min(20, total); currentThrottle = Math.min(fails / total, (l - 1) / l); } From f3c0d73ba4b2c72a8c17937fab21a6ee13a1fcb2 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 4 Jul 2024 16:22:21 +0400 Subject: [PATCH 0786/1353] rotor: simple throttle implementation --- libs/core-functions/src/functions/lib/index.ts | 2 +- libs/juava/src/throttle.ts | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/libs/core-functions/src/functions/lib/index.ts b/libs/core-functions/src/functions/lib/index.ts index ffef02574..ac64ed332 100644 --- a/libs/core-functions/src/functions/lib/index.ts +++ b/libs/core-functions/src/functions/lib/index.ts @@ -311,7 +311,7 @@ export const makeFetch = ( logLevel: "info" | "debug", fetchTimeoutMs: number = 2000 ) => { - const throttle = connectionId === "clke5lrfm0000ii0gahryc37d-wbyo-5jyq-KIMXwt" ? getThrottle(10000) : noThrottle(); + const throttle = connectionId === "clke5lrfm0000ii0gahryc37d-wbyo-5jyq-KIMXwt" ? getThrottle(5000) : noThrottle(); return async ( url: string, diff --git a/libs/juava/src/throttle.ts b/libs/juava/src/throttle.ts index a9be063e8..cfe5a3729 100644 --- a/libs/juava/src/throttle.ts +++ b/libs/juava/src/throttle.ts @@ -13,26 +13,26 @@ export function noThrottle(): Throttle { } export function getThrottle(calculatePeriodMs: number): Throttle { - let previousThrottle = 0; let previousThrottleTime = Date.now(); let currentThrottle = 0; let fails = 0; let successes = 0; function recalculateThrottle() { + const total = fails + successes; + if (total < 10) { + return; + } const now = Date.now(); if (now - previousThrottleTime < calculatePeriodMs) { return; } previousThrottleTime = now; - previousThrottle = currentThrottle; - const total = fails + successes; - if (total < 2) { - currentThrottle = 0; - return; - } - const l = Math.min(20, total); + + const l = Math.min(100, total); currentThrottle = Math.min(fails / total, (l - 1) / l); + fails = 0; + successes = 0; } return { @@ -45,7 +45,7 @@ export function getThrottle(calculatePeriodMs: number): Throttle { recalculateThrottle(); }, throttle: () => { - return (previousThrottle + currentThrottle) / 2; + return currentThrottle; }, }; } From ecfca5247d6c9fddd3fba53e0336339f816cb524 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 4 Jul 2024 16:38:38 +0400 Subject: [PATCH 0787/1353] rotor: simple throttle implementation --- libs/juava/src/throttle.ts | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/libs/juava/src/throttle.ts b/libs/juava/src/throttle.ts index cfe5a3729..2616d496f 100644 --- a/libs/juava/src/throttle.ts +++ b/libs/juava/src/throttle.ts @@ -20,19 +20,15 @@ export function getThrottle(calculatePeriodMs: number): Throttle { function recalculateThrottle() { const total = fails + successes; - if (total < 10) { - return; - } const now = Date.now(); - if (now - previousThrottleTime < calculatePeriodMs) { - return; - } - previousThrottleTime = now; + if (total > 100 || (total >= 10 && now - previousThrottleTime > calculatePeriodMs)) { + previousThrottleTime = now; - const l = Math.min(100, total); - currentThrottle = Math.min(fails / total, (l - 1) / l); - fails = 0; - successes = 0; + const l = Math.min(100, total); + currentThrottle = Math.min(fails / total, (l - 1) / l); + fails = 0; + successes = 0; + } } return { From fee8a950b47008ec9ebaa380082a5119ed4fc94f Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 4 Jul 2024 16:40:43 +0400 Subject: [PATCH 0788/1353] rotor: simple throttle implementation --- libs/core-functions/src/functions/lib/index.ts | 4 ++-- libs/juava/src/throttle.ts | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/libs/core-functions/src/functions/lib/index.ts b/libs/core-functions/src/functions/lib/index.ts index ac64ed332..4a68fe068 100644 --- a/libs/core-functions/src/functions/lib/index.ts +++ b/libs/core-functions/src/functions/lib/index.ts @@ -19,7 +19,7 @@ import { Metrics, TTLStore, } from "@jitsu/protocols/functions"; -import { getErrorMessage, getLog, getThrottle, LogLevel, newError, noThrottle, stopwatch } from "juava"; +import { alwaysThrottle, getErrorMessage, getLog, getThrottle, LogLevel, newError, noThrottle, stopwatch } from "juava"; const log = getLog("functions-context"); @@ -311,7 +311,7 @@ export const makeFetch = ( logLevel: "info" | "debug", fetchTimeoutMs: number = 2000 ) => { - const throttle = connectionId === "clke5lrfm0000ii0gahryc37d-wbyo-5jyq-KIMXwt" ? getThrottle(5000) : noThrottle(); + const throttle = connectionId === "clke5lrfm0000ii0gahryc37d-wbyo-5jyq-KIMXwt" ? alwaysThrottle() : noThrottle(); return async ( url: string, diff --git a/libs/juava/src/throttle.ts b/libs/juava/src/throttle.ts index 2616d496f..4b3caa7c9 100644 --- a/libs/juava/src/throttle.ts +++ b/libs/juava/src/throttle.ts @@ -12,6 +12,14 @@ export function noThrottle(): Throttle { }; } +export function alwaysThrottle(): Throttle { + return { + throttle: () => 1, + fail: () => {}, + success: () => {}, + }; +} + export function getThrottle(calculatePeriodMs: number): Throttle { let previousThrottleTime = Date.now(); let currentThrottle = 0; From 60c884666ad986e117567db3eb8addb688cdc234 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 4 Jul 2024 17:23:09 +0400 Subject: [PATCH 0789/1353] rotor: simple throttle implementation --- libs/core-functions/src/functions/lib/index.ts | 2 +- libs/core-functions/src/functions/lib/mongodb.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/core-functions/src/functions/lib/index.ts b/libs/core-functions/src/functions/lib/index.ts index 4a68fe068..ace846dfc 100644 --- a/libs/core-functions/src/functions/lib/index.ts +++ b/libs/core-functions/src/functions/lib/index.ts @@ -311,7 +311,7 @@ export const makeFetch = ( logLevel: "info" | "debug", fetchTimeoutMs: number = 2000 ) => { - const throttle = connectionId === "clke5lrfm0000ii0gahryc37d-wbyo-5jyq-KIMXwt" ? alwaysThrottle() : noThrottle(); + const throttle = connectionId === "clke5lrfm0000ii0gahryc37d-wbyo-5jyq-KIMXwt" ? getThrottle(5000) : noThrottle(); return async ( url: string, diff --git a/libs/core-functions/src/functions/lib/mongodb.ts b/libs/core-functions/src/functions/lib/mongodb.ts index 85b30c845..5e20c3de2 100644 --- a/libs/core-functions/src/functions/lib/mongodb.ts +++ b/libs/core-functions/src/functions/lib/mongodb.ts @@ -24,7 +24,7 @@ async function createClient() { const client = new MongoClient(mongodbURL, { compressors: ["zstd"], serverSelectionTimeoutMS: 60000, - maxPoolSize: 64, + maxPoolSize: 32, connectTimeoutMS: 60000, socketTimeoutMS: mongoTimeout, }); From 5a624e77fcc5d099307b3ce99327f7451f7f12e3 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Sat, 6 Jul 2024 13:41:54 +0400 Subject: [PATCH 0790/1353] all.Dockerfile: change node image --- all.Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/all.Dockerfile b/all.Dockerfile index c2d59716c..78948c64a 100644 --- a/all.Dockerfile +++ b/all.Dockerfile @@ -2,11 +2,11 @@ # Build & push it with # docker buildx build --platform linux/amd64 . -f console.Dockerfile --push -t jitsucom/console:latest -FROM node:22-slim as base +FROM node:22-bookworm-slim as base WORKDIR /app RUN apt-get update -y -RUN apt-get install bash -y +RUN apt-get install nano curl bash netcat-traditional procps jq -y FROM base as builder From 69747e3d628ce2efabcf87e71ac85629153fba60 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Sat, 6 Jul 2024 13:47:04 +0400 Subject: [PATCH 0791/1353] all.Dockerfile: change node image --- all.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/all.Dockerfile b/all.Dockerfile index 78948c64a..bcfd32918 100644 --- a/all.Dockerfile +++ b/all.Dockerfile @@ -2,7 +2,7 @@ # Build & push it with # docker buildx build --platform linux/amd64 . -f console.Dockerfile --push -t jitsucom/console:latest -FROM node:22-bookworm-slim as base +FROM node:22-bookworm as base WORKDIR /app RUN apt-get update -y From 58fac376480df18fe7dccadff8714abc1bc4f737 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 9 Jul 2024 14:32:59 +0400 Subject: [PATCH 0792/1353] rotor: shorten error text before putting it into Kafka Header --- libs/core-functions/src/functions/webhook-destination.ts | 8 ++++++-- services/rotor/src/lib/rotor.ts | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/libs/core-functions/src/functions/webhook-destination.ts b/libs/core-functions/src/functions/webhook-destination.ts index 1bf047e23..30a4b9683 100644 --- a/libs/core-functions/src/functions/webhook-destination.ts +++ b/libs/core-functions/src/functions/webhook-destination.ts @@ -18,9 +18,13 @@ const WebhookDestination: JitsuFunction Date: Thu, 11 Jul 2024 14:32:22 +0400 Subject: [PATCH 0793/1353] console: Syncs UI: show stats of running syncs --- webapps/console/lib/server/sync.ts | 81 +++++++++++++++++++ .../pages/[workspaceId]/syncs/index.tsx | 64 +++++++-------- .../pages/[workspaceId]/syncs/tasks.tsx | 60 +++++++++----- 3 files changed, 152 insertions(+), 53 deletions(-) diff --git a/webapps/console/lib/server/sync.ts b/webapps/console/lib/server/sync.ts index 959ebdae5..8fa731788 100644 --- a/webapps/console/lib/server/sync.ts +++ b/webapps/console/lib/server/sync.ts @@ -594,6 +594,7 @@ export async function scheduleSync({ version: serviceConfig.version, taskId, syncId: sync.id, + fullSync: fullSync ? "true" : "false", startedBy: trigger === "manual" ? (user ? user.internalId : "manual") : "scheduled", tableNamePrefix: sync.data?.["tableNamePrefix"] ?? "", }, @@ -708,3 +709,83 @@ export async function syncWithScheduler(baseUrl: string) { } getServerLog().atInfo().log("Sync with GoogleCloudScheduler took", sw.elapsedPretty()); } + +// export async function syncWithK8SCronJob(baseUrl: string) { +// const sw = stopwatch(); +// const allSyncs = await db.prisma().configurationObjectLink.findMany({ +// where: { type: "sync", deleted: false }, +// }); +// const syncs = allSyncs.filter(sync => !!(sync.data as any).schedule); +// const syncsById = syncs.reduce((acc, sync) => { +// acc[sync.id] = sync; +// return acc; +// }, {} as Record); +// +// const client = new CloudSchedulerClient({ +// credentials: googleSchedulerKey, +// projectId: googleSchedulerProjectId, +// }); +// const iterable = client.listJobsAsync({ +// parent: googleSchedulerParent, +// }); +// const jobsById: Record = {}; +// for await (const response of iterable) { +// jobsById[(response.name ?? "").replace(`${googleSchedulerParent}/jobs/`, "")] = response; +// } +// +// const syncsIds = Object.keys(syncsById); +// const jobsIds = Object.keys(jobsById); +// const idsToCreate = difference(syncsIds, jobsIds); +// const idsToDelete = difference(jobsIds, syncsIds); +// const idsToUpdate = difference(syncsIds, idsToCreate); +// log +// .atInfo() +// .log( +// `GoogleCloudScheduler sync: ${idsToCreate.length} to create, ${idsToDelete.length} to delete, ${idsToUpdate.length} to update` +// ); +// for (const id of idsToCreate) { +// const sync = syncsById[id]; +// const schedule = (sync.data as any).schedule; +// const job: IJob = { +// name: `${googleSchedulerParent}/jobs/${id}`, +// schedule: schedule, +// timeZone: (sync.data as any).timezone ?? "Etc/UTC", +// httpTarget: { +// uri: `${baseUrl}/api/${sync.workspaceId}/sources/run?syncId=${sync.id}`, +// headers: { +// Authorization: `Bearer ${process.env.SYNCCTL_AUTH_KEY}`, +// }, +// httpMethod: "GET", +// }, +// }; +// log.atInfo().log(`Creating job ${job.name}`); +// await client.createJob({ +// parent: googleSchedulerParent, +// job: job, +// }); +// } +// for (const id of idsToDelete) { +// const job = jobsById[id]; +// log.atInfo().log(`Deleting job ${job.name}`); +// await client.deleteJob({ +// name: job.name ?? "", +// }); +// } +// for (const id of idsToUpdate) { +// const sync = syncsById[id]; +// const schedule = (sync.data as any).schedule; +// const job = jobsById[id]; +// const syncTimezone = (sync.data as any).timezone ?? "Etc/UTC"; +// if (job.schedule !== schedule || job.timeZone !== syncTimezone) { +// log.atInfo().log(`Updating job ${job.name}`); +// await client.updateJob({ +// job: { +// ...job, +// schedule: schedule, +// timeZone: syncTimezone, +// }, +// }); +// } +// } +// getServerLog().atInfo().log("Sync with GoogleCloudScheduler took", sw.elapsedPretty()); +// } diff --git a/webapps/console/pages/[workspaceId]/syncs/index.tsx b/webapps/console/pages/[workspaceId]/syncs/index.tsx index 3d39fd3d0..66737486a 100644 --- a/webapps/console/pages/[workspaceId]/syncs/index.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/index.tsx @@ -26,9 +26,8 @@ import { XCircle, } from "lucide-react"; import { PlusOutlined } from "@ant-design/icons"; -import { WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; +import { JitsuButton, WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; import { ErrorCard } from "../../../components/GlobalError/GlobalError"; -import { Spinner } from "../../../components/GlobalLoader/GlobalLoader"; import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; import relativeTime from "dayjs/plugin/relativeTime"; @@ -126,31 +125,33 @@ function SyncsTable({ links, services, destinations }: RemoteEntitiesProps) { const workspace = useWorkspace(); const router = useRouter(); const [loading, setLoading] = React.useState(false); + const [tasksLoading, setTasksLoading] = React.useState(true); + const [sorting, setSorting] = useQueryStringState("sorting", { defaultValue: { columns: [] }, ...jsonSerializationBase64, }); - const [tasks, setTasks] = useState<{ loading: boolean; data?: any; error?: any }>({ loading: true }); - + const [tasks, setTasks] = useState<{ data?: any; error?: any }>({ data: {} }); const [runPressed, setRunPressed] = useState(undefined); + const [refresh, setRefresh] = useState(0); const reloadStore = useStoreReload(); const [apiDocs, setShowAPIDocs] = useQueryStringState("schedule"); //useEffect update tasksData every 10 seconds useEffect(() => { - const fetchTasks = async () => { + (async () => { try { + setTasksLoading(true); const data = await rpc(`/api/${workspace.id}/sources/tasks`, { body: links.map(l => l.id) }); - setTasks({ loading: false, data }); + setTasks({ data }); } catch (e) { - setTasks({ loading: false, data: {}, error: e }); + setTasks({ data: {}, error: e }); + } finally { + setTasksLoading(false); } - }; - fetchTasks(); - const interval = setInterval(fetchTasks, 10000); - return () => clearInterval(interval); - }, [links, workspace.id]); + })(); + }, [links, workspace.id, refresh]); const deleteSync = async (link: Omit) => { if (await confirmOp("Are you sure you want to unlink this service from this destination?")) { @@ -215,36 +216,35 @@ function SyncsTable({ links, services, destinations }: RemoteEntitiesProps) { }, }, { - title:
    Last Status
    , - className: "text-right", + title: ( +
    + Last Status + 0 && "animate-spin"}`} />} + type="link" + size="small" + rootClassName={"top-0.5"} + onClick={() => { + setRefresh(refresh + 1); + }} + > +
    + ), + className: "text-right whitespace-nowrap", width: "4%", render: (text, link) => { if (tasks.error) { - return
    error obtaining status
    ; - } - if (tasks.loading) { - return ( -
    - -
    - ); + return
    error
    ; } const t = tasks.data.tasks?.[link.id]; - if (!t?.status) { - return NO RUNS; - } - return ( -
    - -
    - ); + return ; }, }, { title:
    Updated (UTC)
    , width: "12%", render: (text, link) => { - if (tasks.error || tasks.loading) { + if (tasks.error) { return undefined; } const t = tasks.data.tasks?.[link.id]; @@ -286,7 +286,7 @@ function SyncsTable({ links, services, destinations }: RemoteEntitiesProps) { setRunPressed(link.id); try { const data = await rpc(`/api/${workspace.id}/sources/tasks`, { body: links.map(l => l.id) }); - setTasks({ loading: false, data }); + setTasks({ data }); if (data.tasks?.[link.id]?.status === "RUNNING") { toTasks(); return; diff --git a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx index 0500d0a13..23af8dc6e 100644 --- a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx @@ -33,6 +33,7 @@ import { feedbackError, feedbackSuccess, useKeyboard } from "../../../lib/ui"; import hash from "object-hash"; import { useConfigObjectLinks, useConfigObjectList } from "../../../lib/store"; import { ButtonLabel } from "../../../components/ButtonLabel/ButtonLabel"; +import { Spinner } from "../../../components/GlobalLoader/GlobalLoader"; dayjs.extend(utc); dayjs.extend(relativeTime); @@ -77,11 +78,31 @@ type TasksTableProps = { refreshCb?: () => void; }; -function TaskStatus0({ task }: { task: TasksDbModel & TaskStats }) { - const router = useRouter(); - const workspace = useWorkspace(); +function TaskStatus0({ task, loading }: { task: TasksDbModel & TaskStats; loading?: boolean }) { + if (loading) { + return ( + + ); + } + if (!task.status) { + return ( + + ); + } - const SyncStatus: React.FC> = props => { + const SyncStatus: React.FC> = props => { const [showPopover, setShowPopover] = useState(false); const handleOpenChange = (newOpen: boolean) => { setShowPopover(newOpen); @@ -133,6 +154,8 @@ function TaskStatus0({ task }: { task: TasksDbModel & TaskStats }) { ) : props.status === "PARTIAL" ? ( + ) : props.status === "RUNNING" ? ( + ) : ( ); @@ -164,7 +187,7 @@ function TaskStatus0({ task }: { task: TasksDbModel & TaskStats }) { return ( - SUCCESS + SUCCESS show stats @@ -196,24 +219,15 @@ function TaskStatus0({ task }: { task: TasksDbModel & TaskStats }) { ); case "RUNNING": return ( -
    { - router.push(`/${workspace.slug || workspace.id}/syncs/logs?taskId=${task.task_id}&syncId=${task.sync_id}`); - }} - > + RUNNING - show logs -
    + show stats + ); default: - return ( - - {task.status} - - ); + return {task.status}; } } @@ -237,6 +251,10 @@ function TaskStatusResultTable({ stats }: { stats: any[] }) { return SUCCESS; } else if (record.status === "PARTIAL") { return PARTIAL; + } else if (record.status === "PENDING") { + return PENDING; + } else if (record.status === "RUNNING") { + return RUNNING; } else { return {record.status}; } @@ -268,7 +286,7 @@ function TaskStatusResultTable({ stats }: { stats: any[] }) { dataSource={stats} pagination={false} expandable={{ - rowExpandable: record => record.status !== "SUCCESS", + rowExpandable: record => record.status === "FAILED" || record.status === "PARTIAL", expandedRowRender: record => { return
    {record.error}
    ; }, @@ -280,7 +298,7 @@ function TaskStatusResultTable({ stats }: { stats: any[] }) { export function processTaskStatus(task: TasksDbModel): TasksDbModel & TaskStats { let stats: any = undefined; try { - stats = JSON.parse(task.description || "{}"); + stats = JSON.parse(task?.description || "{}"); } catch (e) {} //sum des values const taskStats: TaskStats = { @@ -388,7 +406,7 @@ function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap, re render: (text, task) => { if (task.status === "SUCCESS") { return
    {task.successStreams}
    ; - } else if (task.status === "PARTIAL") { + } else if ((task.status === "PARTIAL" || task.status === "RUNNING") && task.totalStreams) { return (
    {task.successStreams} / {task.totalStreams} From d5b5f83efd40ce1cafe4da18f57853655ede060b Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 11 Jul 2024 14:34:24 +0400 Subject: [PATCH 0794/1353] console: Syncs UI: show stats of running syncs --- webapps/console/pages/[workspaceId]/syncs/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/pages/[workspaceId]/syncs/index.tsx b/webapps/console/pages/[workspaceId]/syncs/index.tsx index 66737486a..46cd4dee7 100644 --- a/webapps/console/pages/[workspaceId]/syncs/index.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/index.tsx @@ -4,7 +4,7 @@ import { get } from "../../../lib/useApi"; import { DestinationConfig, ServiceConfig } from "../../../lib/schema"; import { ConfigurationObjectLinkDbModel } from "../../../prisma/schema"; import { z } from "zod"; -import { Table, Tag, Tooltip } from "antd"; +import { Table, Tooltip } from "antd"; import { confirmOp, feedbackError, feedbackSuccess } from "../../../lib/ui"; import React, { useEffect, useState } from "react"; import Link from "next/link"; From fb9de03a56137de4736fb7e16c5f35d964b8d216 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 11 Jul 2024 14:39:12 +0400 Subject: [PATCH 0795/1353] console: Syncs UI: show stats of running syncs --- webapps/console/pages/[workspaceId]/syncs/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/pages/[workspaceId]/syncs/index.tsx b/webapps/console/pages/[workspaceId]/syncs/index.tsx index 46cd4dee7..75d6fc6ff 100644 --- a/webapps/console/pages/[workspaceId]/syncs/index.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/index.tsx @@ -340,7 +340,7 @@ function SyncsTable({ links, services, destinations }: RemoteEntitiesProps) { setRunPressed(link.id); try { const data = await rpc(`/api/${workspace.id}/sources/tasks`, { body: links.map(l => l.id) }); - setTasks({ loading: false, data }); + setTasks({ data }); if (data.tasks?.[link.id]?.status === "RUNNING") { toTasks(); return; From cb6db73f3286d3e040a2bc23fea1748ec0d6ced5 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 11 Jul 2024 15:47:14 +0400 Subject: [PATCH 0796/1353] console: Syncs UI: improved logs coloring --- webapps/console/pages/[workspaceId]/syncs/logs.tsx | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/webapps/console/pages/[workspaceId]/syncs/logs.tsx b/webapps/console/pages/[workspaceId]/syncs/logs.tsx index 800a9dd3c..1278b4851 100644 --- a/webapps/console/pages/[workspaceId]/syncs/logs.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/logs.tsx @@ -21,6 +21,20 @@ function colorLogs(data: string): ReactNode { {line + "\n"} ); + } else if (line.includes("[jitsu]")) { + return ( + + $1') + .replace(/'([\w_]+)'/, "'$1'") + "\n", + }} + > + + ); } else { return ( Date: Fri, 12 Jul 2024 11:40:21 +0400 Subject: [PATCH 0797/1353] console: Syncs UI: mark tasks skipped scheduling due to quota as SKIPPED --- webapps/console/lib/server/sync.ts | 2 +- .../console/pages/[workspaceId]/syncs/tasks.tsx | 15 ++++++++++++++- .../pages/api/[workspaceId]/sources/tasks.ts | 10 +++++----- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/webapps/console/lib/server/sync.ts b/webapps/console/lib/server/sync.ts index 8fa731788..78c9d90a8 100644 --- a/webapps/console/lib/server/sync.ts +++ b/webapps/console/lib/server/sync.ts @@ -127,7 +127,7 @@ export async function checkQuota(opts: { await createOrUpdateTask({ taskId, syncId: opts.syncId, - status: "FAILED", + status: "SKIPPED", description: `Quota exceeded: ${quotaCheckResult.error}`, }); await dbLog({ diff --git a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx index 23af8dc6e..bcc3c4366 100644 --- a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx @@ -102,7 +102,9 @@ function TaskStatus0({ task, loading }: { task: TasksDbModel & TaskStats; loadin ); } - const SyncStatus: React.FC> = props => { + const SyncStatus: React.FC< + PropsWithChildren<{ status: "PARTIAL" | "FAILED" | "SUCCESS" | "RUNNING" | "SKIPPED" }> + > = props => { const [showPopover, setShowPopover] = useState(false); const handleOpenChange = (newOpen: boolean) => { setShowPopover(newOpen); @@ -156,6 +158,8 @@ function TaskStatus0({ task, loading }: { task: TasksDbModel & TaskStats; loadin ) : props.status === "RUNNING" ? ( + ) : props.status === "SKIPPED" ? ( + ) : ( ); @@ -208,6 +212,15 @@ function TaskStatus0({ task, loading }: { task: TasksDbModel & TaskStats; loadin show stats ); + case "SKIPPED": + return ( + + + SKIPPED + + show reason + + ); case "FAILED": return ( diff --git a/webapps/console/pages/api/[workspaceId]/sources/tasks.ts b/webapps/console/pages/api/[workspaceId]/sources/tasks.ts index d684f4687..410df4893 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/tasks.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/tasks.ts @@ -61,11 +61,11 @@ export default createRoute() //get latest source_tasks from db for provided sync ids grouped by sync id const rows = await db.pgPool().query( `select distinct sync_id as sync_id, - last_value(task_id) over ( partition by sync_id order by started_at RANGE BETWEEN unbounded preceding and unbounded following) as task_id, - last_value(status) over ( partition by sync_id order by started_at RANGE BETWEEN unbounded preceding and unbounded following) as status, - last_value(description) over ( partition by sync_id order by started_at RANGE BETWEEN unbounded preceding and unbounded following) as description, - last_value(started_at) over ( partition by sync_id order by started_at RANGE BETWEEN unbounded preceding and unbounded following) as started_at, - last_value(updated_at) over ( partition by sync_id order by started_at RANGE BETWEEN unbounded preceding and unbounded following) as updated_at + last_value(task_id) over ( partition by sync_id order by case when status = 'SKIPPED' then '2020-01-01' else started_at end RANGE BETWEEN unbounded preceding and unbounded following) as task_id, + last_value(status) over ( partition by sync_id order by case when status = 'SKIPPED' then '2020-01-01' else started_at end RANGE BETWEEN unbounded preceding and unbounded following) as status, + last_value(description) over ( partition by sync_id order by case when status = 'SKIPPED' then '2020-01-01' else started_at end RANGE BETWEEN unbounded preceding and unbounded following) as description, + last_value(started_at) over ( partition by sync_id order by case when status = 'SKIPPED' then '2020-01-01' else started_at end RANGE BETWEEN unbounded preceding and unbounded following) as started_at, + last_value(updated_at) over ( partition by sync_id order by case when status = 'SKIPPED' then '2020-01-01' else started_at end RANGE BETWEEN unbounded preceding and unbounded following) as updated_at from newjitsu.source_task where sync_id = ANY($1::text[])`, [body] ); From 9086d8e195f4eab052fc288be91bc56c962ff315 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 12 Jul 2024 11:57:37 +0400 Subject: [PATCH 0798/1353] console: Syncs: don't run scheduled syncs on free plan --- webapps/console/lib/server/sync.ts | 4 +++- webapps/ee-api/pages/api/quotas/sync.ts | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/webapps/console/lib/server/sync.ts b/webapps/console/lib/server/sync.ts index 78c9d90a8..bac4adf42 100644 --- a/webapps/console/lib/server/sync.ts +++ b/webapps/console/lib/server/sync.ts @@ -98,6 +98,7 @@ async function createOrUpdateTask({ export async function checkQuota(opts: { user?: SessionUser; + trigger: "manual" | "scheduled"; workspaceId: string; syncId: string; package: string; @@ -114,7 +115,7 @@ export async function checkQuota(opts: { } const quotaCheckResult = await rpc(quotaCheck, { method: "POST", - query: { workspaceId: opts.workspaceId }, //db is created, so the slug won't be really used + query: { workspaceId: opts.workspaceId, trigger }, //db is created, so the slug won't be really used headers: { "Content-Type": "application/json", Authorization: `Bearer ${eeAuthToken}`, @@ -468,6 +469,7 @@ export async function scheduleSync({ if (isEEAvailable()) { const checkResult = await checkQuota({ user, + trigger, workspaceId, syncId: sync.id, package: (service.config as any).package, diff --git a/webapps/ee-api/pages/api/quotas/sync.ts b/webapps/ee-api/pages/api/quotas/sync.ts index e2e1b735e..450feb79f 100644 --- a/webapps/ee-api/pages/api/quotas/sync.ts +++ b/webapps/ee-api/pages/api/quotas/sync.ts @@ -16,6 +16,7 @@ export const freePlanLimitations = { const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { const claims = requireDefined(await auth(req, res), `Auth is required`); const workspaceId = requireDefined(req.query.workspaceId as string, "workspaceId GET param is required"); + const trigger = req.query.trigger as string; assertTrue(claims.type === "admin" || claims.workspaceId === workspaceId, "Invalid auth claims"); const subscription = await getOrCreateCurrentSubscription(workspaceId, () => { throw new Error( @@ -25,6 +26,12 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse if (subscription.subscriptionStatus.planId !== "free" || subscription.noRestrictions) { return { ok: true }; } else { + if (subscription.subscriptionStatus.planId === "free" && trigger === "scheduled") { + return { + ok: false, + error: `Scheduled syncs are not supported for free plan. Please upgrade your plan to enable scheduled syncs.`, + }; + } const res = await query( pg, ` From 948ddc81a817725b448c3b53b88c35e9567cd868 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 12 Jul 2024 12:06:13 +0400 Subject: [PATCH 0799/1353] console: Syncs: don't run scheduled syncs on free plan --- webapps/console/lib/server/sync.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/lib/server/sync.ts b/webapps/console/lib/server/sync.ts index bac4adf42..24a7feba8 100644 --- a/webapps/console/lib/server/sync.ts +++ b/webapps/console/lib/server/sync.ts @@ -115,7 +115,7 @@ export async function checkQuota(opts: { } const quotaCheckResult = await rpc(quotaCheck, { method: "POST", - query: { workspaceId: opts.workspaceId, trigger }, //db is created, so the slug won't be really used + query: { workspaceId: opts.workspaceId, opts.trigger }, //db is created, so the slug won't be really used headers: { "Content-Type": "application/json", Authorization: `Bearer ${eeAuthToken}`, From 383a974d540bc5daa02b880be9a6495619531580 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 12 Jul 2024 12:16:01 +0400 Subject: [PATCH 0800/1353] console: Syncs: don't run scheduled syncs on free plan --- webapps/console/lib/server/sync.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/lib/server/sync.ts b/webapps/console/lib/server/sync.ts index 24a7feba8..64e0385b7 100644 --- a/webapps/console/lib/server/sync.ts +++ b/webapps/console/lib/server/sync.ts @@ -115,7 +115,7 @@ export async function checkQuota(opts: { } const quotaCheckResult = await rpc(quotaCheck, { method: "POST", - query: { workspaceId: opts.workspaceId, opts.trigger }, //db is created, so the slug won't be really used + query: { workspaceId: opts.workspaceId, trigger: opts.trigger }, //db is created, so the slug won't be really used headers: { "Content-Type": "application/json", Authorization: `Bearer ${eeAuthToken}`, From 01a1d2ad36c14194c3884d5633e3201ecdc3bfd3 Mon Sep 17 00:00:00 2001 From: Rodrigo Soares <55877037+rodfsoares@users.noreply.github.com> Date: Fri, 12 Jul 2024 11:04:58 +0100 Subject: [PATCH 0801/1353] chore: use localhost in Console health check (#1113) --- docker-start-console.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docker-start-console.sh b/docker-start-console.sh index 58632e365..f8653a30f 100755 --- a/docker-start-console.sh +++ b/docker-start-console.sh @@ -9,7 +9,7 @@ init() { if [ "$inited" = "0" ]; then echo "Initializing console..." inited="1" - curl --silent --show-error http://$(hostname -f):3000/api/admin/events-log-init?token=$CONSOLE_INIT_TOKEN + curl --silent --show-error http://localhost:3000/api/admin/events-log-init?token=$CONSOLE_INIT_TOKEN echo "" fi } @@ -42,8 +42,8 @@ wait_for_service() { healthcheck() { pid=$1 - echo "Waiting for $(hostname -f):3000 to be up..." - service_down=$(wait_for_service $(hostname -f):3000 1 10) + echo "Waiting for localhost:3000 to be up..." + service_down=$(wait_for_service localhost:3000 1 10) if [ "$service_down" = "1" ]; then echo "❌ ❌ ❌ HEALTHCHECK FAILED - $healthcheck_url is not UP" kill -9 $pid @@ -51,7 +51,7 @@ healthcheck() { if [ "$cancel_healthcheck" = "0" ]; then echo "Running healthcheck..." - healthcheck_url="http://$(hostname -f):3000/api/healthcheck" + healthcheck_url="http://localhost:3000/api/healthcheck" http_code=$(curl -s $healthcheck_url -o healthcheck-result -w '%{http_code}') if [ "$http_code" = "200" ]; then echo "⚡️⚡️⚡️ HEALTHCHECK PASSED - $http_code from $healthcheck_url. Details:" From bcff78c08e07ee605649bd690da978c1ef06c97b Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 12 Jul 2024 17:04:56 +0400 Subject: [PATCH 0802/1353] console: introduce Workspace shard option --- .../pages/api/admin/export/[name]/index.ts | 25 ++++++++++++------- .../console/pages/api/workspace/slug-check.ts | 2 +- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/webapps/console/pages/api/admin/export/[name]/index.ts b/webapps/console/pages/api/admin/export/[name]/index.ts index 1546c6c51..b8fbd2280 100644 --- a/webapps/console/pages/api/admin/export/[name]/index.ts +++ b/webapps/console/pages/api/admin/export/[name]/index.ts @@ -7,6 +7,7 @@ import { createJwt, getEeConnection, isEEAvailable } from "../../../../../lib/se import omit from "lodash/omit"; import { NextApiRequest } from "next"; import hash from "object-hash"; +import { WorkspaceDbModel } from "../../../../../prisma/schema"; interface Writer { write(data: string): void; @@ -247,15 +248,8 @@ const exports: Export[] = [ if (needComma) { writer.write(","); } - let throttlePercent: number | undefined = undefined; - const throttleOpts = (obj.workspace.featuresEnabled ?? []).find(f => f.startsWith("throttle")); - if (throttleOpts) { - //remove all non-numeric - const m = throttleOpts.match(/(\d+)/); - if (m && m.length > 1) { - throttlePercent = Math.min(100, parseInt(m[1])); - } - } + const throttlePercent = getNumericOption("throttle", obj.workspace); + const shardNumber = getNumericOption("shard", obj.workspace); writer.write( JSON.stringify({ __debug: { @@ -279,6 +273,7 @@ const exports: Export[] = [ }, backupEnabled: !(obj.workspace.featuresEnabled || []).includes("nobackup"), throttle: throttlePercent, + shard: shardNumber, destinations: obj.toLinks .filter(l => !l.deleted && l.type === "push" && !l.to.deleted) .map(l => ({ @@ -339,6 +334,18 @@ export function notModified(ifModifiedSince: Date | undefined, lastModified: Dat return ifModifiedSince.getTime() >= lastModifiedCopy.getTime(); } +function getNumericOption(name: string, workspace: z.infer, defaultValue?: number) { + const opt = (workspace.featuresEnabled ?? []).find(f => f.startsWith(name)); + if (opt) { + //remove all non-numeric + const m = opt.match(/(\d+)/); + if (m && m.length > 1) { + return Math.min(100, parseInt(m[1])); + } + } + return defaultValue; +} + export default createRoute() .OPTIONS({ auth: true, diff --git a/webapps/console/pages/api/workspace/slug-check.ts b/webapps/console/pages/api/workspace/slug-check.ts index af304871a..3b608aaf6 100644 --- a/webapps/console/pages/api/workspace/slug-check.ts +++ b/webapps/console/pages/api/workspace/slug-check.ts @@ -53,7 +53,7 @@ const api: Api = { POST: { auth: true, types: { - body: WorkspaceDbModel.omit({ id: true, deleted: true }), + body: WorkspaceDbModel.omit({ id: true, deleted: true, featuresEnabled: true }), }, handle: async ({ user, body }) => { const newWorkspace = await db.prisma().workspace.create({ data: body }); From 6ff44fae269123e88e45c69438ceb433a9f5dccd Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 12 Jul 2024 17:53:19 +0400 Subject: [PATCH 0803/1353] console: sync schedule: proper check for deleted entities --- webapps/console/lib/server/sync.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/webapps/console/lib/server/sync.ts b/webapps/console/lib/server/sync.ts index 64e0385b7..89e4b09e3 100644 --- a/webapps/console/lib/server/sync.ts +++ b/webapps/console/lib/server/sync.ts @@ -635,7 +635,13 @@ export async function syncWithScheduler(baseUrl: string) { const googleSchedulerParent = `projects/${googleSchedulerProjectId}/locations/${googleSchedulerLocation}`; const allSyncs = await db.prisma().configurationObjectLink.findMany({ - where: { type: "sync", deleted: false }, + where: { + type: "sync", + deleted: false, + workspace: { deleted: false }, + from: { deleted: false }, + to: { deleted: false }, + }, }); const syncs = allSyncs.filter(sync => !!(sync.data as any).schedule); const syncsById = syncs.reduce((acc, sync) => { From 4f192dfec05ac41d6a7cf85a86b285c01b1a4149 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 12 Jul 2024 19:09:49 +0400 Subject: [PATCH 0804/1353] console: don't exclude cancelled subscription from overage report --- webapps/ee-api/pages/api/report/overage.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/webapps/ee-api/pages/api/report/overage.ts b/webapps/ee-api/pages/api/report/overage.ts index 3dadc4dc0..6ee6792ec 100644 --- a/webapps/ee-api/pages/api/report/overage.ts +++ b/webapps/ee-api/pages/api/report/overage.ts @@ -114,17 +114,17 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse const subscription = subscriptionCache[subscriptionId] || (subscriptionCache[subscriptionId] = await stripe.subscriptions.retrieve(subscriptionId)); - if (subscription.status === "canceled") { - log - .atWarn() - .log( - `Subscription ${stripeLink("subscriptions", subscription.id)} is canceled. Skipping invoice ${stripeLink( - "invoices", - invoice.id - )}` - ); - continue; - } + // if (subscription.status === "canceled") { + // log + // .atWarn() + // .log( + // `Subscription ${stripeLink("subscriptions", subscription.id)} is canceled. Skipping invoice ${stripeLink( + // "invoices", + // invoice.id + // )}` + // ); + // continue; + // } const plan = availableProducts.find(p => p.id === product); if (!plan) { log.atWarn().log(`No plan found for ${product} from invoice ${stripeLink("invoices", invoice.id)}`); From 985c1dff0ed859f61850555ba9f009ff17128800 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 15 Jul 2024 18:55:00 +0400 Subject: [PATCH 0805/1353] fix consolebuild.sh --- consolebuild.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/consolebuild.sh b/consolebuild.sh index 6e08cad55..44706b093 100755 --- a/consolebuild.sh +++ b/consolebuild.sh @@ -1,3 +1,3 @@ #!/usr/bin/env bash -docker buildx build --platform linux/amd64 . -f console.Dockerfile --push -t jitsucom/console:latest \ No newline at end of file +docker buildx build --platform linux/amd64 . -f all.Dockerfile --target console --push -t jitsucom/console:latest \ No newline at end of file From 3e1315b236abbd0bfb7eb6087b8359f71c5d2884 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 16 Jul 2024 18:10:54 +0400 Subject: [PATCH 0806/1353] rotor: maxmind: support loading from s3 bucket docker-start-console.sh: pass HOSTNAME as :: to allow for ipv6 --- docker-start-console.sh | 2 +- pnpm-lock.yaml | 1072 +++++++++++++++++++++++++++++ services/rotor/package.json | 1 + services/rotor/src/index.ts | 6 +- services/rotor/src/lib/maxmind.ts | 69 +- 5 files changed, 1135 insertions(+), 15 deletions(-) diff --git a/docker-start-console.sh b/docker-start-console.sh index f8653a30f..4b663c187 100755 --- a/docker-start-console.sh +++ b/docker-start-console.sh @@ -79,7 +79,7 @@ healthcheck() { start_console() { cd /app/webapps/console - HOSTNAME=0.0.0.0 node server.js & echo $! > /app/console.pid + HOSTNAME="::" node server.js & echo $! > /app/console.pid return $? } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fea6a8794..a8f95367f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -589,6 +589,9 @@ importers: '@amplitude/ua-parser-js': specifier: ^0.7.33 version: 0.7.33 + '@aws-sdk/client-s3': + specifier: ^3.614.0 + version: 3.614.0 '@clickhouse/client': specifier: ^0.2.10 version: 0.2.10 @@ -1356,6 +1359,15 @@ packages: tslib: 1.14.1 dev: false + /@aws-crypto/crc32@5.2.0: + resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} + engines: {node: '>=16.0.0'} + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.609.0 + tslib: 2.6.2 + dev: false + /@aws-crypto/crc32c@3.0.0: resolution: {integrity: sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==} dependencies: @@ -1364,6 +1376,14 @@ packages: tslib: 1.14.1 dev: false + /@aws-crypto/crc32c@5.2.0: + resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==} + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.609.0 + tslib: 2.6.2 + dev: false + /@aws-crypto/ie11-detection@3.0.0: resolution: {integrity: sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==} dependencies: @@ -1382,6 +1402,17 @@ packages: tslib: 1.14.1 dev: false + /@aws-crypto/sha1-browser@5.2.0: + resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==} + dependencies: + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-locate-window': 3.310.0 + '@smithy/util-utf8': 2.0.0 + tslib: 2.6.2 + dev: false + /@aws-crypto/sha256-browser@3.0.0: resolution: {integrity: sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==} dependencies: @@ -1395,6 +1426,18 @@ packages: tslib: 1.14.1 dev: false + /@aws-crypto/sha256-browser@5.2.0: + resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} + dependencies: + '@aws-crypto/sha256-js': 5.2.0 + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-locate-window': 3.310.0 + '@smithy/util-utf8': 2.0.0 + tslib: 2.6.2 + dev: false + /@aws-crypto/sha256-js@3.0.0: resolution: {integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==} dependencies: @@ -1403,12 +1446,27 @@ packages: tslib: 1.14.1 dev: false + /@aws-crypto/sha256-js@5.2.0: + resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} + engines: {node: '>=16.0.0'} + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.609.0 + tslib: 2.6.2 + dev: false + /@aws-crypto/supports-web-crypto@3.0.0: resolution: {integrity: sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==} dependencies: tslib: 1.14.1 dev: false + /@aws-crypto/supports-web-crypto@5.2.0: + resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} + dependencies: + tslib: 2.6.2 + dev: false + /@aws-crypto/util@3.0.0: resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==} dependencies: @@ -1417,6 +1475,14 @@ packages: tslib: 1.14.1 dev: false + /@aws-crypto/util@5.2.0: + resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/util-utf8': 2.0.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/client-s3@3.418.0: resolution: {integrity: sha512-VdDM9xS84t8W1B2/QJTK6mYVCnf7Hovg8Aum9NHm+bD7F0Ni2NTLVjm8+qq9STi4YSeXAy3Pe+FBUP9Wthw7Iw==} engines: {node: '>=14.0.0'} @@ -1480,6 +1546,122 @@ packages: - aws-crt dev: false + /@aws-sdk/client-s3@3.614.0: + resolution: {integrity: sha512-9BlhfeBegvyjOqHtcr9kvrT80wiy7EVUiqYyTFiiDv/hJIcG88XHQCZdLU7658XBkQ7aFrr5b8rF2HRD1oroxw==} + engines: {node: '>=16.0.0'} + dependencies: + '@aws-crypto/sha1-browser': 5.2.0 + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sso-oidc': 3.614.0(@aws-sdk/client-sts@3.614.0) + '@aws-sdk/client-sts': 3.614.0 + '@aws-sdk/core': 3.614.0 + '@aws-sdk/credential-provider-node': 3.614.0(@aws-sdk/client-sso-oidc@3.614.0)(@aws-sdk/client-sts@3.614.0) + '@aws-sdk/middleware-bucket-endpoint': 3.614.0 + '@aws-sdk/middleware-expect-continue': 3.609.0 + '@aws-sdk/middleware-flexible-checksums': 3.614.0 + '@aws-sdk/middleware-host-header': 3.609.0 + '@aws-sdk/middleware-location-constraint': 3.609.0 + '@aws-sdk/middleware-logger': 3.609.0 + '@aws-sdk/middleware-recursion-detection': 3.609.0 + '@aws-sdk/middleware-sdk-s3': 3.614.0 + '@aws-sdk/middleware-signing': 3.609.0 + '@aws-sdk/middleware-ssec': 3.609.0 + '@aws-sdk/middleware-user-agent': 3.614.0 + '@aws-sdk/region-config-resolver': 3.614.0 + '@aws-sdk/signature-v4-multi-region': 3.614.0 + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-endpoints': 3.614.0 + '@aws-sdk/util-user-agent-browser': 3.609.0 + '@aws-sdk/util-user-agent-node': 3.614.0 + '@aws-sdk/xml-builder': 3.609.0 + '@smithy/config-resolver': 3.0.5 + '@smithy/core': 2.2.7 + '@smithy/eventstream-serde-browser': 3.0.4 + '@smithy/eventstream-serde-config-resolver': 3.0.3 + '@smithy/eventstream-serde-node': 3.0.4 + '@smithy/fetch-http-handler': 3.2.2 + '@smithy/hash-blob-browser': 3.1.2 + '@smithy/hash-node': 3.0.3 + '@smithy/hash-stream-node': 3.1.2 + '@smithy/invalid-dependency': 3.0.3 + '@smithy/md5-js': 3.0.3 + '@smithy/middleware-content-length': 3.0.4 + '@smithy/middleware-endpoint': 3.0.5 + '@smithy/middleware-retry': 3.0.10 + '@smithy/middleware-serde': 3.0.3 + '@smithy/middleware-stack': 3.0.3 + '@smithy/node-config-provider': 3.1.4 + '@smithy/node-http-handler': 3.1.3 + '@smithy/protocol-http': 4.0.4 + '@smithy/smithy-client': 3.1.8 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.10 + '@smithy/util-defaults-mode-node': 3.0.10 + '@smithy/util-endpoints': 2.0.5 + '@smithy/util-retry': 3.0.3 + '@smithy/util-stream': 3.1.0 + '@smithy/util-utf8': 3.0.0 + '@smithy/util-waiter': 3.1.2 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-sso-oidc@3.614.0(@aws-sdk/client-sts@3.614.0): + resolution: {integrity: sha512-BI1NWcpppbHg/28zbUg54dZeckork8BItZIcjls12vxasy+p3iEzrJVG60jcbUTTsk3Qc1tyxNfrdcVqx0y7Ww==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.614.0 + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sts': 3.614.0 + '@aws-sdk/core': 3.614.0 + '@aws-sdk/credential-provider-node': 3.614.0(@aws-sdk/client-sso-oidc@3.614.0)(@aws-sdk/client-sts@3.614.0) + '@aws-sdk/middleware-host-header': 3.609.0 + '@aws-sdk/middleware-logger': 3.609.0 + '@aws-sdk/middleware-recursion-detection': 3.609.0 + '@aws-sdk/middleware-user-agent': 3.614.0 + '@aws-sdk/region-config-resolver': 3.614.0 + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-endpoints': 3.614.0 + '@aws-sdk/util-user-agent-browser': 3.609.0 + '@aws-sdk/util-user-agent-node': 3.614.0 + '@smithy/config-resolver': 3.0.5 + '@smithy/core': 2.2.7 + '@smithy/fetch-http-handler': 3.2.2 + '@smithy/hash-node': 3.0.3 + '@smithy/invalid-dependency': 3.0.3 + '@smithy/middleware-content-length': 3.0.4 + '@smithy/middleware-endpoint': 3.0.5 + '@smithy/middleware-retry': 3.0.10 + '@smithy/middleware-serde': 3.0.3 + '@smithy/middleware-stack': 3.0.3 + '@smithy/node-config-provider': 3.1.4 + '@smithy/node-http-handler': 3.1.3 + '@smithy/protocol-http': 4.0.4 + '@smithy/smithy-client': 3.1.8 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.10 + '@smithy/util-defaults-mode-node': 3.0.10 + '@smithy/util-endpoints': 2.0.5 + '@smithy/util-middleware': 3.0.3 + '@smithy/util-retry': 3.0.3 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + /@aws-sdk/client-sso@3.418.0: resolution: {integrity: sha512-fakz3YeSW/kCAOJ5w4ObrrQBxsYO8sU8i6WHLv6iWAsYZKAws2Mqa8g89P61+GitSH4z9waksdLouS6ep78/5A==} engines: {node: '>=14.0.0'} @@ -1522,6 +1704,52 @@ packages: - aws-crt dev: false + /@aws-sdk/client-sso@3.614.0: + resolution: {integrity: sha512-p5pyYaxRzBttjBkqfc8i3K7DzBdTg3ECdVgBo6INIUxfvDy0J8QUE8vNtCgvFIkq+uPw/8M+Eo4zzln7anuO0Q==} + engines: {node: '>=16.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.614.0 + '@aws-sdk/middleware-host-header': 3.609.0 + '@aws-sdk/middleware-logger': 3.609.0 + '@aws-sdk/middleware-recursion-detection': 3.609.0 + '@aws-sdk/middleware-user-agent': 3.614.0 + '@aws-sdk/region-config-resolver': 3.614.0 + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-endpoints': 3.614.0 + '@aws-sdk/util-user-agent-browser': 3.609.0 + '@aws-sdk/util-user-agent-node': 3.614.0 + '@smithy/config-resolver': 3.0.5 + '@smithy/core': 2.2.7 + '@smithy/fetch-http-handler': 3.2.2 + '@smithy/hash-node': 3.0.3 + '@smithy/invalid-dependency': 3.0.3 + '@smithy/middleware-content-length': 3.0.4 + '@smithy/middleware-endpoint': 3.0.5 + '@smithy/middleware-retry': 3.0.10 + '@smithy/middleware-serde': 3.0.3 + '@smithy/middleware-stack': 3.0.3 + '@smithy/node-config-provider': 3.1.4 + '@smithy/node-http-handler': 3.1.3 + '@smithy/protocol-http': 4.0.4 + '@smithy/smithy-client': 3.1.8 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.10 + '@smithy/util-defaults-mode-node': 3.0.10 + '@smithy/util-endpoints': 2.0.5 + '@smithy/util-middleware': 3.0.3 + '@smithy/util-retry': 3.0.3 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + /@aws-sdk/client-sts@3.418.0: resolution: {integrity: sha512-L0n0Hw+Pm+BhXTN1bYZ0y4JAMArYgazdHf1nUSlEHndgZicCCuQtlMLxfo3i/IbtWi0dzfZcZ9d/MdAM8p4Jyw==} engines: {node: '>=14.0.0'} @@ -1568,6 +1796,67 @@ packages: - aws-crt dev: false + /@aws-sdk/client-sts@3.614.0: + resolution: {integrity: sha512-i6QmaVA1KHHYNnI2VYQy/sc31rLm4+jSp8b/YbQpFnD0w3aXsrEEHHlxek45uSkHb4Nrj1omFBVy/xp1WVYx2Q==} + engines: {node: '>=16.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sso-oidc': 3.614.0(@aws-sdk/client-sts@3.614.0) + '@aws-sdk/core': 3.614.0 + '@aws-sdk/credential-provider-node': 3.614.0(@aws-sdk/client-sso-oidc@3.614.0)(@aws-sdk/client-sts@3.614.0) + '@aws-sdk/middleware-host-header': 3.609.0 + '@aws-sdk/middleware-logger': 3.609.0 + '@aws-sdk/middleware-recursion-detection': 3.609.0 + '@aws-sdk/middleware-user-agent': 3.614.0 + '@aws-sdk/region-config-resolver': 3.614.0 + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-endpoints': 3.614.0 + '@aws-sdk/util-user-agent-browser': 3.609.0 + '@aws-sdk/util-user-agent-node': 3.614.0 + '@smithy/config-resolver': 3.0.5 + '@smithy/core': 2.2.7 + '@smithy/fetch-http-handler': 3.2.2 + '@smithy/hash-node': 3.0.3 + '@smithy/invalid-dependency': 3.0.3 + '@smithy/middleware-content-length': 3.0.4 + '@smithy/middleware-endpoint': 3.0.5 + '@smithy/middleware-retry': 3.0.10 + '@smithy/middleware-serde': 3.0.3 + '@smithy/middleware-stack': 3.0.3 + '@smithy/node-config-provider': 3.1.4 + '@smithy/node-http-handler': 3.1.3 + '@smithy/protocol-http': 4.0.4 + '@smithy/smithy-client': 3.1.8 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.10 + '@smithy/util-defaults-mode-node': 3.0.10 + '@smithy/util-endpoints': 2.0.5 + '@smithy/util-middleware': 3.0.3 + '@smithy/util-retry': 3.0.3 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/core@3.614.0: + resolution: {integrity: sha512-BUuS5/1YkgmKc4J0bg83XEtMyDHVyqG2QDzfmhYe8gbOIZabUl1FlrFVwhCAthtrrI6MPGTQcERB4BtJKUSplw==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/core': 2.2.7 + '@smithy/protocol-http': 4.0.4 + '@smithy/signature-v4': 3.1.2 + '@smithy/smithy-client': 3.1.8 + '@smithy/types': 3.3.0 + fast-xml-parser: 4.2.5 + tslib: 2.6.2 + dev: false + /@aws-sdk/credential-provider-env@3.418.0: resolution: {integrity: sha512-e74sS+x63EZUBO+HaI8zor886YdtmULzwKdctsZp5/37Xho1CVUNtEC+fYa69nigBD9afoiH33I4JggaHgrekQ==} engines: {node: '>=14.0.0'} @@ -1578,6 +1867,31 @@ packages: tslib: 2.6.2 dev: false + /@aws-sdk/credential-provider-env@3.609.0: + resolution: {integrity: sha512-v69ZCWcec2iuV9vLVJMa6fAb5xwkzN4jYIT8yjo2c4Ia/j976Q+TPf35Pnz5My48Xr94EFcaBazrWedF+kwfuQ==} + engines: {node: '>=16.0.0'} + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/property-provider': 3.1.3 + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/credential-provider-http@3.614.0: + resolution: {integrity: sha512-YIEjlNUKb3Vo/iTnGAPdsiDC3FUUnNoex2OwU8LmR7AkYZiWdB8nx99DfgkkY+OFMUpw7nKD2PCOtuFONelfGA==} + engines: {node: '>=16.0.0'} + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/fetch-http-handler': 3.2.2 + '@smithy/node-http-handler': 3.1.3 + '@smithy/property-provider': 3.1.3 + '@smithy/protocol-http': 4.0.4 + '@smithy/smithy-client': 3.1.8 + '@smithy/types': 3.3.0 + '@smithy/util-stream': 3.1.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/credential-provider-ini@3.418.0: resolution: {integrity: sha512-LTAeKKV85unlSqGNIeqEZ4N9gufaSoH+670n5YTUEk564zHCkUQW0PJomzLF5jKBco6Yfzv6rPBTukd+x9XWqw==} engines: {node: '>=14.0.0'} @@ -1596,6 +1910,29 @@ packages: - aws-crt dev: false + /@aws-sdk/credential-provider-ini@3.614.0(@aws-sdk/client-sso-oidc@3.614.0)(@aws-sdk/client-sts@3.614.0): + resolution: {integrity: sha512-KfLuLFGwlvFSZ2MuzYwWGPb1y5TeiwX5okIDe0aQ1h10oD3924FXbN+mabOnUHQ8EFcGAtCaWbrC86mI7ktC6A==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.614.0 + dependencies: + '@aws-sdk/client-sts': 3.614.0 + '@aws-sdk/credential-provider-env': 3.609.0 + '@aws-sdk/credential-provider-http': 3.614.0 + '@aws-sdk/credential-provider-process': 3.614.0 + '@aws-sdk/credential-provider-sso': 3.614.0(@aws-sdk/client-sso-oidc@3.614.0) + '@aws-sdk/credential-provider-web-identity': 3.609.0(@aws-sdk/client-sts@3.614.0) + '@aws-sdk/types': 3.609.0 + '@smithy/credential-provider-imds': 3.1.4 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.4 + '@smithy/types': 3.3.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + dev: false + /@aws-sdk/credential-provider-node@3.418.0: resolution: {integrity: sha512-VveTjtSC6m8YXj3fQDkMKEZuHv+CR2Z4u/NAN51Fi4xOtIWUtOBj5rfZ8HmBYoBjRF0DtRlPXuMiNnXAzTctfQ==} engines: {node: '>=14.0.0'} @@ -1615,6 +1952,28 @@ packages: - aws-crt dev: false + /@aws-sdk/credential-provider-node@3.614.0(@aws-sdk/client-sso-oidc@3.614.0)(@aws-sdk/client-sts@3.614.0): + resolution: {integrity: sha512-4J6gPEuFZP0mkWq5E//oMS1vrmMM88iNNcv7TEljYnsc6JTAlKejCyFwx6CN+nkIhmIZsl06SXIhBemzBdBPfg==} + engines: {node: '>=16.0.0'} + dependencies: + '@aws-sdk/credential-provider-env': 3.609.0 + '@aws-sdk/credential-provider-http': 3.614.0 + '@aws-sdk/credential-provider-ini': 3.614.0(@aws-sdk/client-sso-oidc@3.614.0)(@aws-sdk/client-sts@3.614.0) + '@aws-sdk/credential-provider-process': 3.614.0 + '@aws-sdk/credential-provider-sso': 3.614.0(@aws-sdk/client-sso-oidc@3.614.0) + '@aws-sdk/credential-provider-web-identity': 3.609.0(@aws-sdk/client-sts@3.614.0) + '@aws-sdk/types': 3.609.0 + '@smithy/credential-provider-imds': 3.1.4 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.4 + '@smithy/types': 3.3.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - '@aws-sdk/client-sts' + - aws-crt + dev: false + /@aws-sdk/credential-provider-process@3.418.0: resolution: {integrity: sha512-xPbdm2WKz1oH6pTkrJoUmr3OLuqvvcPYTQX0IIlc31tmDwDWPQjXGGFD/vwZGIZIkKaFpFxVMgAzfFScxox7dw==} engines: {node: '>=14.0.0'} @@ -1626,6 +1985,17 @@ packages: tslib: 2.6.2 dev: false + /@aws-sdk/credential-provider-process@3.614.0: + resolution: {integrity: sha512-Q0SI0sTRwi8iNODLs5+bbv8vgz8Qy2QdxbCHnPk/6Cx6LMf7i3dqmWquFbspqFRd8QiqxStrblwxrUYZi09tkA==} + engines: {node: '>=16.0.0'} + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.4 + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/credential-provider-sso@3.418.0: resolution: {integrity: sha512-tUF5Hg/HfaU5t+E7IuvohYlodSIlBXa28xAJPPFxhKrUnvP6AIoW6JLazOtCIQjQgJYEUILV29XX+ojUuITcaw==} engines: {node: '>=14.0.0'} @@ -1641,6 +2011,22 @@ packages: - aws-crt dev: false + /@aws-sdk/credential-provider-sso@3.614.0(@aws-sdk/client-sso-oidc@3.614.0): + resolution: {integrity: sha512-55+gp0JY4451cWI1qXmVMFM0GQaBKiQpXv2P0xmd9P3qLDyeFUSEW8XPh0d2lb1ICr6x4s47ynXVdGCIv2mXMg==} + engines: {node: '>=16.0.0'} + dependencies: + '@aws-sdk/client-sso': 3.614.0 + '@aws-sdk/token-providers': 3.614.0(@aws-sdk/client-sso-oidc@3.614.0) + '@aws-sdk/types': 3.609.0 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.4 + '@smithy/types': 3.3.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + dev: false + /@aws-sdk/credential-provider-web-identity@3.418.0: resolution: {integrity: sha512-do7ang565n9p3dS1JdsQY01rUfRx8vkxQqz5M8OlcEHBNiCdi2PvSjNwcBdrv/FKkyIxZb0TImOfBSt40hVdxQ==} engines: {node: '>=14.0.0'} @@ -1651,6 +2037,19 @@ packages: tslib: 2.6.2 dev: false + /@aws-sdk/credential-provider-web-identity@3.609.0(@aws-sdk/client-sts@3.614.0): + resolution: {integrity: sha512-U+PG8NhlYYF45zbr1km3ROtBMYqyyj/oK8NRp++UHHeuavgrP+4wJ4wQnlEaKvJBjevfo3+dlIBcaeQ7NYejWg==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.609.0 + dependencies: + '@aws-sdk/client-sts': 3.614.0 + '@aws-sdk/types': 3.609.0 + '@smithy/property-provider': 3.1.3 + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/middleware-bucket-endpoint@3.418.0: resolution: {integrity: sha512-gj/mj1UfbKkGbQ1N4YUvjTTp8BVs5fO1QAL2AjFJ+jfJOToLReX72aNEkm7sPGbHML0TqOY4cQbJuWYy+zdD5g==} engines: {node: '>=14.0.0'} @@ -1664,6 +2063,19 @@ packages: tslib: 2.6.2 dev: false + /@aws-sdk/middleware-bucket-endpoint@3.614.0: + resolution: {integrity: sha512-TqEY8KcZeZ0LIxXaqG9RSSNnDHvD8RAFP4Xenwsxqnyad0Yn7LgCoFwRByelJ0t54ROYL1/ETJleWE4U4TOXdg==} + engines: {node: '>=16.0.0'} + dependencies: + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-arn-parser': 3.568.0 + '@smithy/node-config-provider': 3.1.4 + '@smithy/protocol-http': 4.0.4 + '@smithy/types': 3.3.0 + '@smithy/util-config-provider': 3.0.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/middleware-expect-continue@3.418.0: resolution: {integrity: sha512-6x4rcIj685EmqDLQkbWoCur3Dg5DRClHMen6nHXmD3CR5Xyt3z1Gk/+jmZICxyJo9c6M4AeZht8o95BopkmYAQ==} engines: {node: '>=14.0.0'} @@ -1674,6 +2086,16 @@ packages: tslib: 2.6.2 dev: false + /@aws-sdk/middleware-expect-continue@3.609.0: + resolution: {integrity: sha512-+zeg//mSer4JZRxOB/4mUOMUJyuYPwATnIC5moBB8P8Xe+mJaVRFy8qlCtzYNj2TycnlsBPzTK0j7P1yvDh97w==} + engines: {node: '>=16.0.0'} + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/protocol-http': 4.0.4 + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/middleware-flexible-checksums@3.418.0: resolution: {integrity: sha512-3O203dqS2JU5P1TAAbo7p1qplXQh59pevw9nqzPVb3EG8B+mSucVf2kKmF7kGHqKSk+nK/mB/4XGSsZBzGt6Wg==} engines: {node: '>=14.0.0'} @@ -1688,6 +2110,20 @@ packages: tslib: 2.6.2 dev: false + /@aws-sdk/middleware-flexible-checksums@3.614.0: + resolution: {integrity: sha512-ZLpxVXMboDeMT7p2Kdp5m1uLVKOktkZoMgLvvbe3zbrU4Ji5IU5xVE0aa4X7H28BtuODCs6SLESnPs19bhMKlA==} + engines: {node: '>=16.0.0'} + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@aws-crypto/crc32c': 5.2.0 + '@aws-sdk/types': 3.609.0 + '@smithy/is-array-buffer': 3.0.0 + '@smithy/protocol-http': 4.0.4 + '@smithy/types': 3.3.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/middleware-host-header@3.418.0: resolution: {integrity: sha512-LrMTdzalkPw/1ujLCKPLwCGvPMCmT4P+vOZQRbSEVZPnlZk+Aj++aL/RaHou0jL4kJH3zl8iQepriBt4a7UvXQ==} engines: {node: '>=14.0.0'} @@ -1698,6 +2134,16 @@ packages: tslib: 2.6.2 dev: false + /@aws-sdk/middleware-host-header@3.609.0: + resolution: {integrity: sha512-iTKfo158lc4jLDfYeZmYMIBHsn8m6zX+XB6birCSNZ/rrlzAkPbGE43CNdKfvjyWdqgLMRXF+B+OcZRvqhMXPQ==} + engines: {node: '>=16.0.0'} + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/protocol-http': 4.0.4 + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/middleware-location-constraint@3.418.0: resolution: {integrity: sha512-cc8M3VEaESHJhDsDV8tTpt2QYUprDWhvAVVSlcL43cTdZ54Quc0W+toDiaVOUlwrAZz2Y7g5NDj22ibJGFbOvw==} engines: {node: '>=14.0.0'} @@ -1707,6 +2153,15 @@ packages: tslib: 2.6.2 dev: false + /@aws-sdk/middleware-location-constraint@3.609.0: + resolution: {integrity: sha512-xzsdoTkszGVqGVPjUmgoP7TORiByLueMHieI1fhQL888WPdqctwAx3ES6d/bA9Q/i8jnc6hs+Fjhy8UvBTkE9A==} + engines: {node: '>=16.0.0'} + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/middleware-logger@3.418.0: resolution: {integrity: sha512-StKGmyPVfoO/wdNTtKemYwoJsqIl4l7oqarQY7VSf2Mp3mqaa+njLViHsQbirYpyqpgUEusOnuTlH5utxJ1NsQ==} engines: {node: '>=14.0.0'} @@ -1716,6 +2171,15 @@ packages: tslib: 2.6.2 dev: false + /@aws-sdk/middleware-logger@3.609.0: + resolution: {integrity: sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==} + engines: {node: '>=16.0.0'} + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/middleware-recursion-detection@3.418.0: resolution: {integrity: sha512-kKFrIQglBLUFPbHSDy1+bbe3Na2Kd70JSUC3QLMbUHmqipXN8KeXRfAj7vTv97zXl0WzG0buV++WcNwOm1rFjg==} engines: {node: '>=14.0.0'} @@ -1726,6 +2190,16 @@ packages: tslib: 2.6.2 dev: false + /@aws-sdk/middleware-recursion-detection@3.609.0: + resolution: {integrity: sha512-6sewsYB7/o/nbUfA99Aa/LokM+a/u4Wpm/X2o0RxOsDtSB795ObebLJe2BxY5UssbGaWkn7LswyfvrdZNXNj1w==} + engines: {node: '>=16.0.0'} + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/protocol-http': 4.0.4 + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/middleware-sdk-s3@3.418.0: resolution: {integrity: sha512-rei32LF45SyqL3NlWDjEOfMwAca9A5F4QgUyXJqvASc43oWC1tJnLIhiCxNh8qkWAiRyRzFpcanTeqyaRSsZpA==} engines: {node: '>=14.0.0'} @@ -1738,6 +2212,21 @@ packages: tslib: 2.6.2 dev: false + /@aws-sdk/middleware-sdk-s3@3.614.0: + resolution: {integrity: sha512-9fJTaiuuOfFV4FqmUEhPYzrtv7JOfYpB7q65oG3uayVH4ngWHIJkjnnX79zRhNZKdPGta+XIsnZzjEghg82ngA==} + engines: {node: '>=16.0.0'} + dependencies: + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-arn-parser': 3.568.0 + '@smithy/node-config-provider': 3.1.4 + '@smithy/protocol-http': 4.0.4 + '@smithy/signature-v4': 3.1.2 + '@smithy/smithy-client': 3.1.8 + '@smithy/types': 3.3.0 + '@smithy/util-config-provider': 3.0.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/middleware-sdk-sts@3.418.0: resolution: {integrity: sha512-cW8ijrCTP+mgihvcq4+TbhAcE/we5lFl4ydRqvTdtcSnYQAVQADg47rnTScQiFsPFEB3NKq7BGeyTJF9MKolPA==} engines: {node: '>=14.0.0'} @@ -1761,6 +2250,19 @@ packages: tslib: 2.6.2 dev: false + /@aws-sdk/middleware-signing@3.609.0: + resolution: {integrity: sha512-2w3dBLjQVKIajYzokO4hduq8/0hSMUYHHmIo1Kdl+MSY8uwRBt12bLL6pyreobTcRMxizvn2ph/CQ9I1ST/WGQ==} + engines: {node: '>=16.0.0'} + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/property-provider': 3.1.3 + '@smithy/protocol-http': 4.0.4 + '@smithy/signature-v4': 3.1.2 + '@smithy/types': 3.3.0 + '@smithy/util-middleware': 3.0.3 + tslib: 2.6.2 + dev: false + /@aws-sdk/middleware-ssec@3.418.0: resolution: {integrity: sha512-J7K+5h6aP7IYMlu/NwHEIjb0+WDu1eFvO8TCPo6j1H9xYRi8B/6h+6pa9Rk9IgRUzFnrdlDu9FazG8Tp0KKLyg==} engines: {node: '>=14.0.0'} @@ -1770,6 +2272,15 @@ packages: tslib: 2.6.2 dev: false + /@aws-sdk/middleware-ssec@3.609.0: + resolution: {integrity: sha512-GZSD1s7+JswWOTamVap79QiDaIV7byJFssBW68GYjyRS5EBjNfwA/8s+6uE6g39R3ojyTbYOmvcANoZEhSULXg==} + engines: {node: '>=16.0.0'} + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/middleware-user-agent@3.418.0: resolution: {integrity: sha512-Jdcztg9Tal9SEAL0dKRrnpKrm6LFlWmAhvuwv0dQ7bNTJxIxyEFbpqdgy7mpQHsLVZgq1Aad/7gT/72c9igyZw==} engines: {node: '>=14.0.0'} @@ -1781,6 +2292,17 @@ packages: tslib: 2.6.2 dev: false + /@aws-sdk/middleware-user-agent@3.614.0: + resolution: {integrity: sha512-xUxh0UPQiMTG6E31Yvu6zVYlikrIcFDKljM11CaatInzvZubGTGiX0DjpqRlfGzUNsuPc/zNrKwRP2+wypgqIw==} + engines: {node: '>=16.0.0'} + dependencies: + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-endpoints': 3.614.0 + '@smithy/protocol-http': 4.0.4 + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/region-config-resolver@3.418.0: resolution: {integrity: sha512-lJRZ/9TjZU6yLz+mAwxJkcJZ6BmyYoIJVo1p5+BN//EFdEmC8/c0c9gXMRzfISV/mqWSttdtccpAyN4/goHTYA==} engines: {node: '>=14.0.0'} @@ -1792,6 +2314,18 @@ packages: tslib: 2.6.2 dev: false + /@aws-sdk/region-config-resolver@3.614.0: + resolution: {integrity: sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==} + engines: {node: '>=16.0.0'} + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/node-config-provider': 3.1.4 + '@smithy/types': 3.3.0 + '@smithy/util-config-provider': 3.0.0 + '@smithy/util-middleware': 3.0.3 + tslib: 2.6.2 + dev: false + /@aws-sdk/signature-v4-multi-region@3.418.0: resolution: {integrity: sha512-LeVYMZeUQUURFqDf4yZxTEv016g64hi0LqYBjU0mjwd8aPc0k6hckwvshezc80jCNbuLyjNfQclvlg3iFliItQ==} engines: {node: '>=14.0.0'} @@ -1803,6 +2337,18 @@ packages: tslib: 2.6.2 dev: false + /@aws-sdk/signature-v4-multi-region@3.614.0: + resolution: {integrity: sha512-6mW3ONW4oLzxrePznYhz7sNT9ji9Am9ufLeV722tbOVS5lArBOZ6E1oPz0uYBhisUPznWKhcLRMggt7vIJWMng==} + engines: {node: '>=16.0.0'} + dependencies: + '@aws-sdk/middleware-sdk-s3': 3.614.0 + '@aws-sdk/types': 3.609.0 + '@smithy/protocol-http': 4.0.4 + '@smithy/signature-v4': 3.1.2 + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/token-providers@3.418.0: resolution: {integrity: sha512-9P7Q0VN0hEzTngy3Sz5eya2qEOEf0Q8qf1vB3um0gE6ID6EVAdz/nc/DztfN32MFxk8FeVBrCP5vWdoOzmd72g==} engines: {node: '>=14.0.0'} @@ -1846,6 +2392,20 @@ packages: - aws-crt dev: false + /@aws-sdk/token-providers@3.614.0(@aws-sdk/client-sso-oidc@3.614.0): + resolution: {integrity: sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sso-oidc': ^3.614.0 + dependencies: + '@aws-sdk/client-sso-oidc': 3.614.0(@aws-sdk/client-sts@3.614.0) + '@aws-sdk/types': 3.609.0 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.4 + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/types@3.418.0: resolution: {integrity: sha512-y4PQSH+ulfFLY0+FYkaK4qbIaQI9IJNMO2xsxukW6/aNoApNymN1D2FSi2la8Qbp/iPjNDKsG8suNPm9NtsWXQ==} engines: {node: '>=14.0.0'} @@ -1854,6 +2414,14 @@ packages: tslib: 2.6.2 dev: false + /@aws-sdk/types@3.609.0: + resolution: {integrity: sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/util-arn-parser@3.310.0: resolution: {integrity: sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA==} engines: {node: '>=14.0.0'} @@ -1861,6 +2429,13 @@ packages: tslib: 2.6.2 dev: false + /@aws-sdk/util-arn-parser@3.568.0: + resolution: {integrity: sha512-XUKJWWo+KOB7fbnPP0+g/o5Ulku/X53t7i/h+sPHr5xxYTJJ9CYnbToo95mzxe7xWvkLrsNtJ8L+MnNn9INs2w==} + engines: {node: '>=16.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + /@aws-sdk/util-endpoints@3.418.0: resolution: {integrity: sha512-sYSDwRTl7yE7LhHkPzemGzmIXFVHSsi3AQ1KeNEk84eBqxMHHcCc2kqklaBk2roXWe50QDgRMy1ikZUxvtzNHQ==} engines: {node: '>=14.0.0'} @@ -1869,6 +2444,16 @@ packages: tslib: 2.6.2 dev: false + /@aws-sdk/util-endpoints@3.614.0: + resolution: {integrity: sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw==} + engines: {node: '>=16.0.0'} + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/types': 3.3.0 + '@smithy/util-endpoints': 2.0.5 + tslib: 2.6.2 + dev: false + /@aws-sdk/util-locate-window@3.310.0: resolution: {integrity: sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==} engines: {node: '>=14.0.0'} @@ -1885,6 +2470,15 @@ packages: tslib: 2.6.2 dev: false + /@aws-sdk/util-user-agent-browser@3.609.0: + resolution: {integrity: sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==} + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/types': 3.3.0 + bowser: 2.11.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/util-user-agent-node@3.418.0: resolution: {integrity: sha512-BXMskXFtg+dmzSCgmnWOffokxIbPr1lFqa1D9kvM3l3IFRiFGx2IyDg+8MAhq11aPDLvoa/BDuQ0Yqma5izOhg==} engines: {node: '>=14.0.0'} @@ -1900,6 +2494,21 @@ packages: tslib: 2.6.2 dev: false + /@aws-sdk/util-user-agent-node@3.614.0: + resolution: {integrity: sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==} + engines: {node: '>=16.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/node-config-provider': 3.1.4 + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/util-utf8-browser@3.259.0: resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} dependencies: @@ -1913,6 +2522,14 @@ packages: tslib: 2.6.2 dev: false + /@aws-sdk/xml-builder@3.609.0: + resolution: {integrity: sha512-l9XxNcA4HX98rwCC2/KoiWcmEiRfZe4G+mYwDbCFT87JIMj6GBhLDkAzr/W8KAaA2IDr8Vc6J8fZPgVulxxfMA==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@babel/code-frame@7.21.4: resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} engines: {node: '>=6.9.0'} @@ -6944,6 +7561,14 @@ packages: tslib: 2.6.2 dev: false + /@smithy/abort-controller@3.1.1: + resolution: {integrity: sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@smithy/chunked-blob-reader-native@2.0.0: resolution: {integrity: sha512-HM8V2Rp1y8+1343tkZUKZllFhEQPNmpNdgFAncbTsxkZ18/gqjk23XXv3qGyXWp412f3o43ZZ1UZHVcHrpRnCQ==} dependencies: @@ -6951,12 +7576,25 @@ packages: tslib: 2.6.2 dev: false + /@smithy/chunked-blob-reader-native@3.0.0: + resolution: {integrity: sha512-VDkpCYW+peSuM4zJip5WDfqvg2Mo/e8yxOv3VF1m11y7B8KKMKVFtmZWDe36Fvk8rGuWrPZHHXZ7rR7uM5yWyg==} + dependencies: + '@smithy/util-base64': 3.0.0 + tslib: 2.6.2 + dev: false + /@smithy/chunked-blob-reader@2.0.0: resolution: {integrity: sha512-k+J4GHJsMSAIQPChGBrjEmGS+WbPonCXesoqP9fynIqjn7rdOThdH8FAeCmokP9mxTYKQAKoHCLPzNlm6gh7Wg==} dependencies: tslib: 2.6.2 dev: false + /@smithy/chunked-blob-reader@3.0.0: + resolution: {integrity: sha512-sbnURCwjF0gSToGlsBiAmd1lRCmSn72nu9axfJu5lIx6RUEgHu6GwTMbqCdhQSi0Pumcm5vFxsi9XWXb2mTaoA==} + dependencies: + tslib: 2.6.2 + dev: false + /@smithy/config-resolver@2.0.10: resolution: {integrity: sha512-MwToDsCltHjumkCuRn883qoNeJUawc2b8sX9caSn5vLz6J5crU1IklklNxWCaMO2z2nDL91Po4b/aI1eHv5PfA==} engines: {node: '>=14.0.0'} @@ -6968,6 +7606,31 @@ packages: tslib: 2.6.2 dev: false + /@smithy/config-resolver@3.0.5: + resolution: {integrity: sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/node-config-provider': 3.1.4 + '@smithy/types': 3.3.0 + '@smithy/util-config-provider': 3.0.0 + '@smithy/util-middleware': 3.0.3 + tslib: 2.6.2 + dev: false + + /@smithy/core@2.2.7: + resolution: {integrity: sha512-Wwd9QWKaYdR+n/oIqJbuwSr9lHuv7sa1e3Zu4wIToZl0sS7xapTYYqQtXP1hKKtIWz0jl8AhvOfNwkfT5jjV0w==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/middleware-endpoint': 3.0.5 + '@smithy/middleware-retry': 3.0.10 + '@smithy/middleware-serde': 3.0.3 + '@smithy/protocol-http': 4.0.4 + '@smithy/smithy-client': 3.1.8 + '@smithy/types': 3.3.0 + '@smithy/util-middleware': 3.0.3 + tslib: 2.6.2 + dev: false + /@smithy/credential-provider-imds@2.0.12: resolution: {integrity: sha512-S3lUNe+2fEFwKcmiQniXGPXt69vaHvQCw8kYQOBL4OvJsgwfpkIYDZdroHbTshYi0M6WaKL26Mw+hvgma6dZqA==} engines: {node: '>=14.0.0'} @@ -6979,6 +7642,17 @@ packages: tslib: 2.6.2 dev: false + /@smithy/credential-provider-imds@3.1.4: + resolution: {integrity: sha512-NKyH01m97Xa5xf3pB2QOF3lnuE8RIK0hTVNU5zvZAwZU8uspYO4DHQVlK+Y5gwSrujTfHvbfd1D9UFJAc0iYKQ==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/node-config-provider': 3.1.4 + '@smithy/property-provider': 3.1.3 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + tslib: 2.6.2 + dev: false + /@smithy/eventstream-codec@2.0.9: resolution: {integrity: sha512-sy0pcbKnawt1iu+qCoSFbs/h9PAaUgvlJEO3lqkE1HFFj4p5RgL98vH+9CyDoj6YY82cG5XsorFmcLqQJHTOYw==} dependencies: @@ -6988,6 +7662,15 @@ packages: tslib: 2.6.2 dev: false + /@smithy/eventstream-codec@3.1.2: + resolution: {integrity: sha512-0mBcu49JWt4MXhrhRAlxASNy0IjDRFU+aWNDRal9OtUJvJNiwDuyKMUONSOjLjSCeGwZaE0wOErdqULer8r7yw==} + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@smithy/types': 3.3.0 + '@smithy/util-hex-encoding': 3.0.0 + tslib: 2.6.2 + dev: false + /@smithy/eventstream-serde-browser@2.0.9: resolution: {integrity: sha512-g70enHZau2hGj1Uxedrn8AAjH9E7RnpHdwkuPKapagah53ztbwI7xaNeA5SLD4MjSjdrjathyQBCQKIzwXrR1g==} engines: {node: '>=14.0.0'} @@ -6997,6 +7680,15 @@ packages: tslib: 2.6.2 dev: false + /@smithy/eventstream-serde-browser@3.0.4: + resolution: {integrity: sha512-Eo4anLZX6ltGJTZ5yJMc80gZPYYwBn44g0h7oFq6et+TYr5dUsTpIcDbz2evsOKIZhZ7zBoFWHtBXQ4QQeb5xA==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/eventstream-serde-universal': 3.0.4 + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@smithy/eventstream-serde-config-resolver@2.0.9: resolution: {integrity: sha512-+15GzIMtdSuRPyuCeGZ7gzgD94Ejv6eM1vKcqvipdzS+i36KTZ2A9aZsJk+gDw//OCD1EMx9SqpV6bUvMS4PWg==} engines: {node: '>=14.0.0'} @@ -7005,6 +7697,14 @@ packages: tslib: 2.6.2 dev: false + /@smithy/eventstream-serde-config-resolver@3.0.3: + resolution: {integrity: sha512-NVTYjOuYpGfrN/VbRQgn31x73KDLfCXCsFdad8DiIc3IcdxL+dYA9zEQPyOP7Fy2QL8CPy2WE4WCUD+ZsLNfaQ==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@smithy/eventstream-serde-node@2.0.9: resolution: {integrity: sha512-UEJcvN2WXXEjkewtFkj1S2HSZLbyCgzUnfoFPrTuKy4+xRfakO5dNx6ws2h1pvb8Vc7mTuBL+Webl1R5mnVsXA==} engines: {node: '>=14.0.0'} @@ -7014,6 +7714,15 @@ packages: tslib: 2.6.2 dev: false + /@smithy/eventstream-serde-node@3.0.4: + resolution: {integrity: sha512-mjlG0OzGAYuUpdUpflfb9zyLrBGgmQmrobNT8b42ZTsGv/J03+t24uhhtVEKG/b2jFtPIHF74Bq+VUtbzEKOKg==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/eventstream-serde-universal': 3.0.4 + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@smithy/eventstream-serde-universal@2.0.9: resolution: {integrity: sha512-dAHQEYlK/1tjjieBE7jjXwpLQFgKdkvC4HSQf+/Jj4t34XbUmXWHbw92/EuLp9+vjNB/JQPvkwpMtN31jxIDeg==} engines: {node: '>=14.0.0'} @@ -7023,6 +7732,15 @@ packages: tslib: 2.6.2 dev: false + /@smithy/eventstream-serde-universal@3.0.4: + resolution: {integrity: sha512-Od9dv8zh3PgOD7Vj4T3HSuox16n0VG8jJIM2gvKASL6aCtcS8CfHZDWe1Ik3ZXW6xBouU+45Q5wgoliWDZiJ0A==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/eventstream-codec': 3.1.2 + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@smithy/fetch-http-handler@2.1.5: resolution: {integrity: sha512-BIeCHGfr5JCGN+EMTwZK74ELvjPXOIrI7OLM5OhZJJ6AmZyRv2S9ANJk18AtLwht0TsSm+8WoXIEp8LuxNgUyA==} dependencies: @@ -7033,6 +7751,16 @@ packages: tslib: 2.6.2 dev: false + /@smithy/fetch-http-handler@3.2.2: + resolution: {integrity: sha512-3LaWlBZObyGrOOd7e5MlacnAKEwFBmAeiW/TOj2eR9475Vnq30uS2510+tnKbxrGjROfNdOhQqGo5j3sqLT6bA==} + dependencies: + '@smithy/protocol-http': 4.0.4 + '@smithy/querystring-builder': 3.0.3 + '@smithy/types': 3.3.0 + '@smithy/util-base64': 3.0.0 + tslib: 2.6.2 + dev: false + /@smithy/hash-blob-browser@2.0.9: resolution: {integrity: sha512-JNWOV1ci9vIg4U82klNr07bZXsA6OCumqHugpvZdvvn6cNGwTa4rvpS5FpPcqKeh3Rdg1rr4h8g+X6zyOamnZw==} dependencies: @@ -7042,6 +7770,15 @@ packages: tslib: 2.6.2 dev: false + /@smithy/hash-blob-browser@3.1.2: + resolution: {integrity: sha512-hAbfqN2UbISltakCC2TP0kx4LqXBttEv2MqSPE98gVuDFMf05lU+TpC41QtqGP3Ff5A3GwZMPfKnEy0VmEUpmg==} + dependencies: + '@smithy/chunked-blob-reader': 3.0.0 + '@smithy/chunked-blob-reader-native': 3.0.0 + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@smithy/hash-node@2.0.9: resolution: {integrity: sha512-XP3yWd5wyCtiVmsY5Nuq/FUwyCEQ6YG7DsvRh7ThldNukGpCzyFdP8eivZJVjn4Fx7oYrrOnVoYZ0WEgpW1AvQ==} engines: {node: '>=14.0.0'} @@ -7052,6 +7789,16 @@ packages: tslib: 2.6.2 dev: false + /@smithy/hash-node@3.0.3: + resolution: {integrity: sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/types': 3.3.0 + '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.2 + dev: false + /@smithy/hash-stream-node@2.0.9: resolution: {integrity: sha512-3nrkMpiOrhsJvJS6K4OkP0qvA3U5r8PpseXULeGd1ZD1EbfcZ30Lvl72FGaaHskwWZyTPR4czr1d/RwLRCVHNA==} engines: {node: '>=14.0.0'} @@ -7061,6 +7808,15 @@ packages: tslib: 2.6.2 dev: false + /@smithy/hash-stream-node@3.1.2: + resolution: {integrity: sha512-PBgDMeEdDzi6JxKwbfBtwQG9eT9cVwsf0dZzLXoJF4sHKHs5HEo/3lJWpn6jibfJwT34I1EBXpBnZE8AxAft6g==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/types': 3.3.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.2 + dev: false + /@smithy/invalid-dependency@2.0.9: resolution: {integrity: sha512-RuJqhYf8nViK96IIO9JbTtjDUuFItVfuuJhWw2yk7fv67yltQ7fZD6IQ2OsHHluoVmstnQJuCg5raXJR696Ubw==} dependencies: @@ -7068,6 +7824,13 @@ packages: tslib: 2.6.2 dev: false + /@smithy/invalid-dependency@3.0.3: + resolution: {integrity: sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==} + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@smithy/is-array-buffer@2.0.0: resolution: {integrity: sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==} engines: {node: '>=14.0.0'} @@ -7075,6 +7838,13 @@ packages: tslib: 2.6.2 dev: false + /@smithy/is-array-buffer@3.0.0: + resolution: {integrity: sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==} + engines: {node: '>=16.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + /@smithy/md5-js@2.0.9: resolution: {integrity: sha512-ALHGoTZDgBXBbjCpQzVy6hpa6Rdr6e2jyEw51d6CQOUpHkUnFH7G96UWhVwUnkP0xozPCvmWy+3+j2QUX+oK9w==} dependencies: @@ -7083,6 +7853,14 @@ packages: tslib: 2.6.2 dev: false + /@smithy/md5-js@3.0.3: + resolution: {integrity: sha512-O/SAkGVwpWmelpj/8yDtsaVe6sINHLB1q8YE/+ZQbDxIw3SRLbTZuRaI10K12sVoENdnHqzPp5i3/H+BcZ3m3Q==} + dependencies: + '@smithy/types': 3.3.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.2 + dev: false + /@smithy/middleware-content-length@2.0.11: resolution: {integrity: sha512-Malj4voNTL4+a5ZL3a6+Ij7JTUMTa2R7c3ZIBzMxN5OUUgAspU7uFi1Q97f4B0afVh2joQBAWH5IQJUG25nl8g==} engines: {node: '>=14.0.0'} @@ -7092,6 +7870,15 @@ packages: tslib: 2.6.2 dev: false + /@smithy/middleware-content-length@3.0.4: + resolution: {integrity: sha512-wySGje/KfhsnF8YSh9hP16pZcl3C+X6zRsvSfItQGvCyte92LliilU3SD0nR7kTlxnAJwxY8vE/k4Eoezj847Q==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/protocol-http': 4.0.4 + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@smithy/middleware-endpoint@2.0.9: resolution: {integrity: sha512-72/o8R6AAO4+nyTI6h4z6PYGTSA4dr1M7tZz29U8DEUHuh1YkhC77js0P6RyF9G0wDLuYqxb+Yh0crI5WG2pJg==} engines: {node: '>=14.0.0'} @@ -7103,6 +7890,19 @@ packages: tslib: 2.6.2 dev: false + /@smithy/middleware-endpoint@3.0.5: + resolution: {integrity: sha512-V4acqqrh5tDxUEGVTOgf2lYMZqPQsoGntCrjrJZEeBzEzDry2d2vcI1QCXhGltXPPY+BMc6eksZMguA9fIY8vA==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/middleware-serde': 3.0.3 + '@smithy/node-config-provider': 3.1.4 + '@smithy/shared-ini-file-loader': 3.1.4 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + '@smithy/util-middleware': 3.0.3 + tslib: 2.6.2 + dev: false + /@smithy/middleware-retry@2.0.12: resolution: {integrity: sha512-YQ/ufXX4/d9/+Jf1QQ4J+CVeupC7BW52qldBTvRV33PDX9vxndlAwkFwzBcmnUFC3Hjf1//HW6I77EItcjNSCA==} engines: {node: '>=14.0.0'} @@ -7117,6 +7917,21 @@ packages: uuid: 8.3.2 dev: false + /@smithy/middleware-retry@3.0.10: + resolution: {integrity: sha512-+6ibpv6jpkTNJS6yErQSEjbxCWf1/jMeUSlpSlUiTYf73LGR9riSRlIrL1+JEW0eEpb6MelQ04BIc38aj8GtxQ==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/node-config-provider': 3.1.4 + '@smithy/protocol-http': 4.0.4 + '@smithy/service-error-classification': 3.0.3 + '@smithy/smithy-client': 3.1.8 + '@smithy/types': 3.3.0 + '@smithy/util-middleware': 3.0.3 + '@smithy/util-retry': 3.0.3 + tslib: 2.6.2 + uuid: 9.0.1 + dev: false + /@smithy/middleware-serde@2.0.9: resolution: {integrity: sha512-GVbauxrr6WmtCaesakktg3t5LR/yDbajpC7KkWc8rtCpddMI4ShAVO5Q6DqwX8MDFi4CLaY8H7eTGcxhl3jbLg==} engines: {node: '>=14.0.0'} @@ -7125,6 +7940,14 @@ packages: tslib: 2.6.2 dev: false + /@smithy/middleware-serde@3.0.3: + resolution: {integrity: sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@smithy/middleware-stack@2.0.3: resolution: {integrity: sha512-AlhPmbwpkC4lQBVaVHXczmjFvsAhDHhrakqLt038qFLotnJcvDLhmMzAtu23alBeOSkKxkTQq0LsAt2N0WpAbw==} engines: {node: '>=14.0.0'} @@ -7133,6 +7956,14 @@ packages: tslib: 2.6.2 dev: false + /@smithy/middleware-stack@3.0.3: + resolution: {integrity: sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@smithy/node-config-provider@2.0.12: resolution: {integrity: sha512-df9y9ywv+JmS40Y60ZqJ4jfZiTCmyHQffwzIqjBjLJLJl0imf9F6DWBd+jiEWHvlohR+sFhyY+KL/qzKgnAq1A==} engines: {node: '>=14.0.0'} @@ -7143,6 +7974,16 @@ packages: tslib: 2.6.2 dev: false + /@smithy/node-config-provider@3.1.4: + resolution: {integrity: sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.4 + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@smithy/node-http-handler@2.1.5: resolution: {integrity: sha512-52uF+BrZaFiBh+NT/bADiVDCQO91T+OwDRsuaAeWZC1mlCXFjAPPQdxeQohtuYOe9m7mPP/xIMNiqbe8jvndHA==} engines: {node: '>=14.0.0'} @@ -7154,6 +7995,17 @@ packages: tslib: 2.6.2 dev: false + /@smithy/node-http-handler@3.1.3: + resolution: {integrity: sha512-UiKZm8KHb/JeOPzHZtRUfyaRDO1KPKPpsd7iplhiwVGOeVdkiVJ5bVe7+NhWREMOKomrDIDdSZyglvMothLg0Q==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/abort-controller': 3.1.1 + '@smithy/protocol-http': 4.0.4 + '@smithy/querystring-builder': 3.0.3 + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@smithy/property-provider@2.0.10: resolution: {integrity: sha512-YMBVfh0ZMmJtbsUn+WfSwR32iRljZPdRN0Tn2GAcdJ+ejX8WrBXD7Z0jIkQDrQZr8fEuuv5x8WxMIj+qVbsPQw==} engines: {node: '>=14.0.0'} @@ -7162,6 +8014,14 @@ packages: tslib: 2.6.2 dev: false + /@smithy/property-provider@3.1.3: + resolution: {integrity: sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@smithy/protocol-http@3.0.5: resolution: {integrity: sha512-3t3fxj+ip4EPHRC2fQ0JimMxR/qCQ1LSQJjZZVZFgROnFLYWPDgUZqpoi7chr+EzatxJVXF/Rtoi5yLHOWCoZQ==} engines: {node: '>=14.0.0'} @@ -7170,6 +8030,14 @@ packages: tslib: 2.6.2 dev: false + /@smithy/protocol-http@4.0.4: + resolution: {integrity: sha512-fAA2O4EFyNRyYdFLVIv5xMMeRb+3fRKc/Rt2flh5k831vLvUmNFXcydeg7V3UeEhGURJI4c1asmGJBjvmF6j8Q==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@smithy/querystring-builder@2.0.9: resolution: {integrity: sha512-Yt6CPF4j3j1cuwod/DRflbuXxBFjJm7gAjy6W1RE21Rz5/kfGFqiZBXWmmXwGtnnhiLThYwoHK4S6/TQtnx0Fg==} engines: {node: '>=14.0.0'} @@ -7179,6 +8047,15 @@ packages: tslib: 2.6.2 dev: false + /@smithy/querystring-builder@3.0.3: + resolution: {integrity: sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/types': 3.3.0 + '@smithy/util-uri-escape': 3.0.0 + tslib: 2.6.2 + dev: false + /@smithy/querystring-parser@2.0.9: resolution: {integrity: sha512-U6z4N743s4vrcxPW8p8+reLV0PjMCYEyb1/wtMVvv3VnbJ74gshdI8SR1sBnEh95cF8TxonmX5IxY25tS9qGfg==} engines: {node: '>=14.0.0'} @@ -7187,6 +8064,14 @@ packages: tslib: 2.6.2 dev: false + /@smithy/querystring-parser@3.0.3: + resolution: {integrity: sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@smithy/service-error-classification@2.0.2: resolution: {integrity: sha512-GTUd2j63gKy7A+ggvSdn2hc4sejG7LWfE+ZMF17vzWoNyqERWbRP7HTPS0d0Lwg1p6OQCAzvNigSrEIWVFt6iA==} engines: {node: '>=14.0.0'} @@ -7194,6 +8079,13 @@ packages: '@smithy/types': 2.3.3 dev: false + /@smithy/service-error-classification@3.0.3: + resolution: {integrity: sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/types': 3.3.0 + dev: false + /@smithy/shared-ini-file-loader@2.0.11: resolution: {integrity: sha512-Sf0u5C5px6eykXi6jImDTp+edvG3REtPjXnFWU/J+b7S2wkXwUqFXqBL5DdM4zC1F+M8u57ZT7NRqDwMOw7/Tw==} engines: {node: '>=14.0.0'} @@ -7202,6 +8094,14 @@ packages: tslib: 2.6.2 dev: false + /@smithy/shared-ini-file-loader@3.1.4: + resolution: {integrity: sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@smithy/signature-v4@2.0.9: resolution: {integrity: sha512-RkHP0joSI1j2EI+mU55sOi33/aMMkKdL9ZY+SWrPxsiCe1oyzzuy79Tpn8X7uT+t0ilNmQlwPpkP/jUy940pEA==} engines: {node: '>=14.0.0'} @@ -7216,6 +8116,19 @@ packages: tslib: 2.6.2 dev: false + /@smithy/signature-v4@3.1.2: + resolution: {integrity: sha512-3BcPylEsYtD0esM4Hoyml/+s7WP2LFhcM3J2AGdcL2vx9O60TtfpDOL72gjb4lU8NeRPeKAwR77YNyyGvMbuEA==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/is-array-buffer': 3.0.0 + '@smithy/types': 3.3.0 + '@smithy/util-hex-encoding': 3.0.0 + '@smithy/util-middleware': 3.0.3 + '@smithy/util-uri-escape': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.2 + dev: false + /@smithy/smithy-client@2.1.7: resolution: {integrity: sha512-r6T/oiBQ8vCbGqObH4/h0YqD0jFB1hAS9KFRmuTfaNJueu/L2hjmjqFjv3PV5lkbNHTgUYraSv4cFQ1naxiELQ==} engines: {node: '>=14.0.0'} @@ -7226,6 +8139,18 @@ packages: tslib: 2.6.2 dev: false + /@smithy/smithy-client@3.1.8: + resolution: {integrity: sha512-nUNGCa0NgvtD0eM45732EBp1H9JQITChMBegGtPRhJD00v3hiFF6tibiOihcYwP5mbp9Kui+sOCl86rDT/Ew2w==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/middleware-endpoint': 3.0.5 + '@smithy/middleware-stack': 3.0.3 + '@smithy/protocol-http': 4.0.4 + '@smithy/types': 3.3.0 + '@smithy/util-stream': 3.1.0 + tslib: 2.6.2 + dev: false + /@smithy/types@2.3.3: resolution: {integrity: sha512-zTdIPR9PvFVNRdIKMQu4M5oyTaycIbUqLheQqaOi9rTWPkgjGO2wDBxMA1rBHQB81aqAEv+DbSS4jfKyQMnXRA==} engines: {node: '>=14.0.0'} @@ -7233,6 +8158,13 @@ packages: tslib: 2.6.2 dev: false + /@smithy/types@3.3.0: + resolution: {integrity: sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==} + engines: {node: '>=16.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + /@smithy/url-parser@2.0.9: resolution: {integrity: sha512-NBnJ0NiY8z6E82Xd5VYUFQfKwK/wA/+QkKmpYUYP+cpH3aCzE6g2gvixd9vQKYjsIdRfNPCf+SFAozt8ljozOw==} dependencies: @@ -7241,6 +8173,14 @@ packages: tslib: 2.6.2 dev: false + /@smithy/url-parser@3.0.3: + resolution: {integrity: sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==} + dependencies: + '@smithy/querystring-parser': 3.0.3 + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@smithy/util-base64@2.0.0: resolution: {integrity: sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==} engines: {node: '>=14.0.0'} @@ -7249,12 +8189,27 @@ packages: tslib: 2.6.2 dev: false + /@smithy/util-base64@3.0.0: + resolution: {integrity: sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.2 + dev: false + /@smithy/util-body-length-browser@2.0.0: resolution: {integrity: sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==} dependencies: tslib: 2.6.2 dev: false + /@smithy/util-body-length-browser@3.0.0: + resolution: {integrity: sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==} + dependencies: + tslib: 2.6.2 + dev: false + /@smithy/util-body-length-node@2.1.0: resolution: {integrity: sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==} engines: {node: '>=14.0.0'} @@ -7262,6 +8217,13 @@ packages: tslib: 2.6.2 dev: false + /@smithy/util-body-length-node@3.0.0: + resolution: {integrity: sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==} + engines: {node: '>=16.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + /@smithy/util-buffer-from@2.0.0: resolution: {integrity: sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==} engines: {node: '>=14.0.0'} @@ -7270,6 +8232,14 @@ packages: tslib: 2.6.2 dev: false + /@smithy/util-buffer-from@3.0.0: + resolution: {integrity: sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/is-array-buffer': 3.0.0 + tslib: 2.6.2 + dev: false + /@smithy/util-config-provider@2.0.0: resolution: {integrity: sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==} engines: {node: '>=14.0.0'} @@ -7277,6 +8247,13 @@ packages: tslib: 2.6.2 dev: false + /@smithy/util-config-provider@3.0.0: + resolution: {integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==} + engines: {node: '>=16.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + /@smithy/util-defaults-mode-browser@2.0.11: resolution: {integrity: sha512-0syV1Mz/mCQ7CG/MHKQfH+w86xq59jpD0EOXv5oe0WBXLmq2lWPpVHl2Y6+jQ+/9fYzyZ5NF+NC/WEIuiv690A==} engines: {node: '>= 10.0.0'} @@ -7288,6 +8265,17 @@ packages: tslib: 2.6.2 dev: false + /@smithy/util-defaults-mode-browser@3.0.10: + resolution: {integrity: sha512-WgaNxh33md2zvlD+1TSceVmM7DIy7qYMtuhOat+HYoTntsg0QTbNvoB/5DRxEwSpN84zKf9O34yqzRRtxJZgFg==} + engines: {node: '>= 10.0.0'} + dependencies: + '@smithy/property-provider': 3.1.3 + '@smithy/smithy-client': 3.1.8 + '@smithy/types': 3.3.0 + bowser: 2.11.0 + tslib: 2.6.2 + dev: false + /@smithy/util-defaults-mode-node@2.0.13: resolution: {integrity: sha512-6BtCHYdw5Z8r6KpW8tRCc3yURgvcQwfIEeHhR70BeSOfx8T/TXPPjb8A+K45+KASspa3fzrsSxeIwB0sAeMoHA==} engines: {node: '>= 10.0.0'} @@ -7301,6 +8289,28 @@ packages: tslib: 2.6.2 dev: false + /@smithy/util-defaults-mode-node@3.0.10: + resolution: {integrity: sha512-3x/pcNIFyaAEQqXc3qnQsCFLlTz/Mwsfl9ciEPU56/Dk/g1kTFjkzyLbUNJaeOo5HT01VrpJBKrBuN94qbPm9A==} + engines: {node: '>= 10.0.0'} + dependencies: + '@smithy/config-resolver': 3.0.5 + '@smithy/credential-provider-imds': 3.1.4 + '@smithy/node-config-provider': 3.1.4 + '@smithy/property-provider': 3.1.3 + '@smithy/smithy-client': 3.1.8 + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + + /@smithy/util-endpoints@2.0.5: + resolution: {integrity: sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/node-config-provider': 3.1.4 + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@smithy/util-hex-encoding@2.0.0: resolution: {integrity: sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==} engines: {node: '>=14.0.0'} @@ -7308,6 +8318,13 @@ packages: tslib: 2.6.2 dev: false + /@smithy/util-hex-encoding@3.0.0: + resolution: {integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==} + engines: {node: '>=16.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + /@smithy/util-middleware@2.0.2: resolution: {integrity: sha512-UGPZM+Ja/vke5pc/S8G0LNiHpVirtjppsXO+GK9m9wbzRGzPJTfnZA/gERUUN/AfxEy/8SL7U1kd7u4t2X8K1w==} engines: {node: '>=14.0.0'} @@ -7316,6 +8333,14 @@ packages: tslib: 2.6.2 dev: false + /@smithy/util-middleware@3.0.3: + resolution: {integrity: sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@smithy/util-retry@2.0.2: resolution: {integrity: sha512-ovWiayUB38moZcLhSFFfUgB2IMb7R1JfojU20qSahjxAgfOZvDWme3eOYUMtAVnouZ9kYJiFgHLy27qRH4NeeA==} engines: {node: '>= 14.0.0'} @@ -7325,6 +8350,15 @@ packages: tslib: 2.6.2 dev: false + /@smithy/util-retry@3.0.3: + resolution: {integrity: sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/service-error-classification': 3.0.3 + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@smithy/util-stream@2.0.12: resolution: {integrity: sha512-FOCpRLaj6gvSyUC5mJAACT+sPMPmp9sD1o+hVbUH/QxwZfulypA3ZIFdAg/59/IY0d/1Q4CTztsiHEB5LgjN4g==} engines: {node: '>=14.0.0'} @@ -7339,6 +8373,20 @@ packages: tslib: 2.6.2 dev: false + /@smithy/util-stream@3.1.0: + resolution: {integrity: sha512-QEMvyv58QIptWA8cpQPbHagJOAlrbCt3ueB9EShwdFfVMYAviXdVtksszQQq+o+dv5dalUMWUbUHUDSJgkF9xg==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/fetch-http-handler': 3.2.2 + '@smithy/node-http-handler': 3.1.3 + '@smithy/types': 3.3.0 + '@smithy/util-base64': 3.0.0 + '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-hex-encoding': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.2 + dev: false + /@smithy/util-uri-escape@2.0.0: resolution: {integrity: sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==} engines: {node: '>=14.0.0'} @@ -7346,6 +8394,13 @@ packages: tslib: 2.6.2 dev: false + /@smithy/util-uri-escape@3.0.0: + resolution: {integrity: sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==} + engines: {node: '>=16.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + /@smithy/util-utf8@2.0.0: resolution: {integrity: sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==} engines: {node: '>=14.0.0'} @@ -7354,6 +8409,14 @@ packages: tslib: 2.6.2 dev: false + /@smithy/util-utf8@3.0.0: + resolution: {integrity: sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/util-buffer-from': 3.0.0 + tslib: 2.6.2 + dev: false + /@smithy/util-waiter@2.0.9: resolution: {integrity: sha512-Hy9Cs0FtIacC1aVFk98bm/7CYqim9fnHAPRnV/SB2mj02ExYs/9Dn5SrNQmtTBTLCn65KqYnNVBNS8GuGpZOOw==} engines: {node: '>=14.0.0'} @@ -7363,6 +8426,15 @@ packages: tslib: 2.6.2 dev: false + /@smithy/util-waiter@3.1.2: + resolution: {integrity: sha512-4pP0EV3iTsexDx+8PPGAKCQpd/6hsQBaQhqWzU4hqKPHN5epPsxKbvUTIiYIHTxaKt6/kEaqPBpu/ufvfbrRzw==} + engines: {node: '>=16.0.0'} + dependencies: + '@smithy/abort-controller': 3.1.1 + '@smithy/types': 3.3.0 + tslib: 2.6.2 + dev: false + /@stdlib/array-float32@0.0.6: resolution: {integrity: sha512-QgKT5UaE92Rv7cxfn7wBKZAlwFFHPla8eXsMFsTGt5BiL4yUy36lwinPUh4hzybZ11rw1vifS3VAPuk6JP413Q==} engines: {node: '>=0.10.0', npm: '>2.7.0'} diff --git a/services/rotor/package.json b/services/rotor/package.json index b29e36a61..99dad1716 100644 --- a/services/rotor/package.json +++ b/services/rotor/package.json @@ -24,6 +24,7 @@ "@maxmind/geoip2-node": "4.2.0", "@sensejs/kafkajs-zstd-support": "^0.11.0", "@types/pg-cursor": "^2.7.2", + "@aws-sdk/client-s3": "^3.614.0", "dayjs": "^1.11.10", "express": "^4.18.2", "glob": "^8.0.3", diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index 377348df9..f5e78a389 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -77,7 +77,11 @@ async function main() { process.exit(1); } - geoResolver = await initMaxMindClient(process.env.MAXMIND_LICENSE_KEY || process.env.MAXMIND_URL || ""); + geoResolver = await initMaxMindClient({ + licenseKey: process.env.MAXMIND_LICENSE_KEY, + url: process.env.MAXMIND_URL, + s3Bucket: process.env.MAXMIND_S3_BUCKET, + }); metricsServer = initMetricsServer(); } catch (e) { log.atError().withCause(e).log("Failed to start"); diff --git a/services/rotor/src/lib/maxmind.ts b/services/rotor/src/lib/maxmind.ts index 11fc67a72..be9618f80 100644 --- a/services/rotor/src/lib/maxmind.ts +++ b/services/rotor/src/lib/maxmind.ts @@ -3,7 +3,8 @@ import * as zlib from "zlib"; import * as tar from "tar"; import { Geo } from "@jitsu/protocols/analytics"; import NodeCache from "node-cache"; -import { getLog } from "juava"; +import { getLog, requireDefined } from "juava"; +import { S3Client, GetObjectCommand } from "@aws-sdk/client-s3"; export const log = getLog("maxmind"); @@ -13,6 +14,8 @@ type PaidEdition = "GeoIP2-City" | "GeoIP2-Country" | "GeoIP2-ISP" | "GeoIP2-Dom type FreeEditions = "GeoLite2-City" | "GeoLite2-Country" | "GeoLite2-ASN"; type Edition = PaidEdition | FreeEditions | "NotRequired" | ""; +type LoadFunction = (edition: Edition) => Promise; + const composeURL = (licenseKeyOrURL: string, edition: Edition) => { if (licenseKeyOrURL.startsWith("http")) { return licenseKeyOrURL + (licenseKeyOrURL.endsWith("/") ? "" : "/") + edition + ".tar.gz"; @@ -34,16 +37,38 @@ const DummyResolver: GeoResolver = { }; async function test() { - const maxMindClient = await initMaxMindClient(process.env.MAXMIND_LICENSE_KEY || ""); + const maxMindClient = await initMaxMindClient({ + licenseKey: process.env.MAXMIND_LICENSE_KEY || "", + }); log.atInfo().log(`IP 209.142.68.29:`, JSON.stringify(await maxMindClient.resolve("209.142.68.29"), null, 2)); } -export async function initMaxMindClient(licenseKeyOrURL: string): Promise { - if (!licenseKeyOrURL) { - log.atError().log("licenseKeyOrURL is not provided. GeoIP resolution will not work."); +export async function initMaxMindClient(opts: { + licenseKey?: string; + url?: string; + s3Bucket?: string; +}): Promise { + const { licenseKey, s3Bucket, url } = opts; + if (!licenseKey && !url && !s3Bucket) { + log.atError().log("licenseKey, url or s3Bucket must be provided. GeoIP resolution will not work."); return DummyResolver; } + let loadFunc: LoadFunction; + let s3client: S3Client = undefined as any as S3Client; + if (s3Bucket) { + s3client = new S3Client({ + region: requireDefined(process.env.S3_REGION, "S3_REGION is not provided"), + credentials: { + accessKeyId: requireDefined(process.env.S3_ACCESS_KEY_ID, "S3_ACCESS_KEY_ID is not provided"), + secretAccessKey: requireDefined(process.env.S3_SECRET_ACCESS_KEY, "S3_SECRET_ACCESS_KEY is not provided"), + }, + }); + loadFunc = (edition: Edition) => loadFromS3(s3client, s3Bucket, edition); + } else { + loadFunc = (edition: Edition) => loadFromURL(composeURL(licenseKey || url || "", edition)); + } + let cityReader: ReaderModel | undefined; let countryReader: ReaderModel | undefined; let ispReader: ReaderModel | undefined; @@ -51,16 +76,16 @@ export async function initMaxMindClient(licenseKeyOrURL: string): Promise { + try { + const command = new GetObjectCommand({ Bucket: bucket, Key: edition + ".tar.gz" }); + const response = await client.send(command); + if (response.Body) { + return await untar(Buffer.from(await response.Body.transformToByteArray())); + } else { + throw new Error(`no response body`); + } + } catch (e: any) { + throw new Error(`Failed to download ${edition} edition from S3 bucket: ${bucket}: ${e.message}`); + } +} + async function download( - licenseKeyOrURL: string, + loadFunction: LoadFunction, edition: Edition ): Promise<{ reader?: ReaderModel; edition: Edition }> { try { - const b = await loadFromURL(composeURL(licenseKeyOrURL, edition)); + const b = await loadFunction(edition); const reader = Reader.openBuffer(b); log.atInfo().log(`Successfully downloaded ${edition} edition`); return { reader, edition }; @@ -219,7 +262,7 @@ async function download( .atError() .log(`Failed to download ${edition} edition: ${e.message}. Trying to download free ${freeEdition} edition`); try { - const b = await loadFromURL(composeURL(licenseKeyOrURL, freeEdition)); + const b = await loadFunction(freeEdition); const reader = Reader.openBuffer(b); log.atInfo().log(`Successfully downloaded free ${freeEdition} edition`); return { reader, edition: freeEdition }; From 9156b6abf173cbd860406adefe6014c909d15070 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 19 Jul 2024 13:43:17 +0400 Subject: [PATCH 0807/1353] console: API: better checks for object ownerships --- .../FunctionsDebugger/FunctionsDebugger.tsx | 1 - webapps/console/lib/server/sync.ts | 22 +++++++++++++-- .../pages/api/[workspaceId]/config/link.ts | 8 ++++-- .../pages/api/[workspaceId]/function/run.ts | 6 ++-- .../pages/api/[workspaceId]/sources/check.ts | 10 ++++++- .../api/[workspaceId]/sources/discover.ts | 9 +++++- .../pages/api/[workspaceId]/sources/tasks.ts | 28 +++++++++++++++++-- 7 files changed, 72 insertions(+), 12 deletions(-) diff --git a/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx b/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx index 9bf87df3e..3b656e525 100644 --- a/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx +++ b/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx @@ -187,7 +187,6 @@ export const FunctionsDebugger: React.FC = props => { event: JSON.parse(event), config: JSON.parse(config), store, - workspaceId: workspace.id, userAgent: navigator.userAgent, }; } catch (e) { diff --git a/webapps/console/lib/server/sync.ts b/webapps/console/lib/server/sync.ts index 89e4b09e3..c5d7fb14d 100644 --- a/webapps/console/lib/server/sync.ts +++ b/webapps/console/lib/server/sync.ts @@ -72,11 +72,13 @@ async function createOrUpdateTask({ taskId, syncId, status, + startedBy, description, }: { taskId: string; syncId: string; status: string; + startedBy: string; description: string; }) { const taskData = { @@ -85,6 +87,7 @@ async function createOrUpdateTask({ status, started_at: new Date(), updated_at: new Date(), + started_by: startedBy, description, package: "jitsu", version: "0.0.1", @@ -103,6 +106,7 @@ export async function checkQuota(opts: { syncId: string; package: string; version: string; + startedBy: string; }): Promise { try { const quotaCheck = `${getEeConnection().host}api/quotas/sync`; @@ -129,6 +133,7 @@ export async function checkQuota(opts: { taskId, syncId: opts.syncId, status: "SKIPPED", + startedBy: opts.startedBy, description: `Quota exceeded: ${quotaCheckResult.error}`, }); await dbLog({ @@ -192,6 +197,9 @@ export async function getSyncById(syncId: string, workspaceId: string): Promise< workspaceId: workspaceId, deleted: false, type: "sync", + workspace: { deleted: false }, + from: { deleted: false, workspaceId: workspaceId }, + to: { deleted: false, workspaceId: workspaceId }, }, include: { from: true, @@ -309,16 +317,19 @@ async function runSyncSynchronously({ destinationConfig, destinationType, sourceConfig, + startedBy, }: { syncId: string; taskId: string; destinationType: DestinationType; destinationConfig: DestinationConfig; sourceConfig: ServiceConfig; + startedBy: string; }) { await createOrUpdateTask({ taskId, syncId, + startedBy, status: "RUNNING", description: "Started", }); @@ -327,6 +338,7 @@ async function runSyncSynchronously({ await createOrUpdateTask({ taskId, syncId, + startedBy, status: "FAILED", description: `Sync function not found for package ${sourceConfig.package}`, }); @@ -364,6 +376,7 @@ async function runSyncSynchronously({ await createOrUpdateTask({ taskId, syncId, + startedBy, status: "SUCCESS", description: "Succesfully finished", }); @@ -400,9 +413,11 @@ export async function scheduleSync({ process.env.SYNCCTL_URL, `env SYNCCTL_URL is not set. Sync Controller is required to run sources` ); + const startedBy = JSON.stringify( + trigger === "manual" ? (user ? { trigger: "manual", ...user } : { trigger: "manual" }) : { trigger: "scheduled" } + ); const authHeaders: any = {}; if (syncAuthKey) { - trigger = "scheduled"; authHeaders["Authorization"] = `Bearer ${syncAuthKey}`; } try { @@ -474,6 +489,7 @@ export async function scheduleSync({ syncId: sync.id, package: (service.config as any).package, version: (service.config as any).version, + startedBy, }); if (checkResult) { return checkResult; @@ -542,6 +558,7 @@ export async function scheduleSync({ destinationConfig, destinationType, sourceConfig: serviceConfig, + startedBy, }); const time = Date.now() - started; await dbLog({ @@ -559,6 +576,7 @@ export async function scheduleSync({ taskId, syncId: sync.id, status: "FAILED", + startedBy, description: `Error running sync: ${syncError}`, }); await dbLog({ @@ -597,7 +615,7 @@ export async function scheduleSync({ taskId, syncId: sync.id, fullSync: fullSync ? "true" : "false", - startedBy: trigger === "manual" ? (user ? user.internalId : "manual") : "scheduled", + startedBy, tableNamePrefix: sync.data?.["tableNamePrefix"] ?? "", }, body: { diff --git a/webapps/console/pages/api/[workspaceId]/config/link.ts b/webapps/console/pages/api/[workspaceId]/config/link.ts index b33aa4ce0..2c9900be1 100644 --- a/webapps/console/pages/api/[workspaceId]/config/link.ts +++ b/webapps/console/pages/api/[workspaceId]/config/link.ts @@ -46,7 +46,9 @@ export const api: Api = { where: { workspaceId: workspaceId, toId, fromId, deleted: false }, }) : id - ? await db.prisma().configurationObjectLink.findFirst({ where: { id, deleted: false } }) + ? await db + .prisma() + .configurationObjectLink.findFirst({ where: { workspaceId: workspaceId, id, deleted: false } }) : undefined; if (!id && existingLink) { @@ -71,8 +73,8 @@ export const api: Api = { let createdOrUpdated; if (existingLink) { createdOrUpdated = await db.prisma().configurationObjectLink.update({ - where: { id: existingLink.id }, - data: { data, deleted: false }, + where: { id: existingLink.id, workspaceId }, + data: { data, deleted: false, workspaceId }, }); //try to do asynchronously for edit syncWithScheduler(getAppEndpoint(req).baseUrl); diff --git a/webapps/console/pages/api/[workspaceId]/function/run.ts b/webapps/console/pages/api/[workspaceId]/function/run.ts index 9b592cc9a..10249f2f4 100644 --- a/webapps/console/pages/api/[workspaceId]/function/run.ts +++ b/webapps/console/pages/api/[workspaceId]/function/run.ts @@ -41,7 +41,6 @@ export const api: Api = { event: z.any(), config: z.any(), store: z.any(), - workspaceId: z.string(), userAgent: z.string().optional(), }), result: resultType, @@ -63,7 +62,10 @@ export const api: Api = { const res = await rpc(rotorURL + "/udfrun", { method: "POST", - body: body, + body: { + ...body, + workspaceId, + }, headers, }); return resultType.parse(res); diff --git a/webapps/console/pages/api/[workspaceId]/sources/check.ts b/webapps/console/pages/api/[workspaceId]/sources/check.ts index 5030b0f3c..001c6d90b 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/check.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/check.ts @@ -40,7 +40,15 @@ export default createRoute() if (syncAuthKey) { authHeaders["Authorization"] = `Bearer ${syncAuthKey}`; } - const config = await tryManageOauthCreds(body as ServiceConfig); + const serviceConfig = body as ServiceConfig; + const existingService = await db.prisma().configurationObject.findFirst({ + where: { id: serviceConfig.id }, + }); + if (existingService && existingService.workspaceId !== workspaceId) { + return { ok: false, error: "invalid service id" }; + } + + const config = await tryManageOauthCreds(serviceConfig); try { const checkRes = await rpc(syncURL + "/check", { diff --git a/webapps/console/pages/api/[workspaceId]/sources/discover.ts b/webapps/console/pages/api/[workspaceId]/sources/discover.ts index 2b959f1ac..528e75529 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/discover.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/discover.ts @@ -61,10 +61,17 @@ export default createRoute() return discoverDbRes; } } + const serviceConfig = body as ServiceConfig; + const existingService = await db.prisma().configurationObject.findFirst({ + where: { id: serviceConfig.id }, + }); + if (existingService && existingService.workspaceId !== workspaceId) { + return { ok: false, error: "invalid service id" }; + } const discoverQueryRes = await rpc(syncURL + "/discover", { method: "POST", body: { - config: await tryManageOauthCreds(body as ServiceConfig), + config: await tryManageOauthCreds(serviceConfig), }, headers: { "Content-Type": "application/json", diff --git a/webapps/console/pages/api/[workspaceId]/sources/tasks.ts b/webapps/console/pages/api/[workspaceId]/sources/tasks.ts index 410df4893..ea92764a9 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/tasks.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/tasks.ts @@ -57,6 +57,17 @@ export default createRoute() .handler(async ({ user, query, body }) => { const { workspaceId } = query; await verifyAccess(user, workspaceId); + const syncs = await db.prisma().configurationObjectLink.findMany({ + where: { + id: { + in: body, + }, + workspaceId: workspaceId, + deleted: false, + type: "sync", + }, + }); + const syncsId = syncs.map(s => s.id); try { //get latest source_tasks from db for provided sync ids grouped by sync id const rows = await db.pgPool().query( @@ -67,7 +78,7 @@ export default createRoute() last_value(started_at) over ( partition by sync_id order by case when status = 'SKIPPED' then '2020-01-01' else started_at end RANGE BETWEEN unbounded preceding and unbounded following) as started_at, last_value(updated_at) over ( partition by sync_id order by case when status = 'SKIPPED' then '2020-01-01' else started_at end RANGE BETWEEN unbounded preceding and unbounded following) as updated_at from newjitsu.source_task where sync_id = ANY($1::text[])`, - [body] + [syncsId] ); const tasksRecord = rows.rows.reduce((acc, r) => { acc[r.sync_id] = { @@ -103,7 +114,20 @@ from newjitsu.source_task where sync_id = ANY($1::text[])`, .handler(async ({ user, query, req, res }) => { const { workspaceId } = query; await verifyAccess(user, workspaceId); - + const sync = await db.prisma().configurationObjectLink.findFirst({ + where: { + id: query.syncId, + workspaceId: workspaceId, + deleted: false, + type: "sync", + }, + }); + if (!sync) { + return { + ok: false, + error: `Sync ${query.syncId} not found`, + }; + } try { let i = 1; let sql: string = From 4b1c245d8f7a88f04aef40e5a91268d0e86c7c1f Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 19 Jul 2024 13:44:06 +0400 Subject: [PATCH 0808/1353] console: syncs: support for cancelling of running tasks --- .../pages/[workspaceId]/syncs/tasks.tsx | 113 ++++++++++++------ .../pages/api/[workspaceId]/sources/cancel.ts | 65 ++++++++++ 2 files changed, 139 insertions(+), 39 deletions(-) create mode 100644 webapps/console/pages/api/[workspaceId]/sources/cancel.ts diff --git a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx index bcc3c4366..14804b07c 100644 --- a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx @@ -3,7 +3,7 @@ import { useWorkspace } from "../../../lib/context"; import { useApi } from "../../../lib/useApi"; import { source_taskDbModel } from "../../../prisma/schema"; import { z } from "zod"; -import { Button, DatePicker, notification, Popover, Select, Table, Tag } from "antd"; +import { DatePicker, notification, Popover, Select, Table, Tag } from "antd"; import React, { PropsWithChildren, useCallback, useEffect, useMemo, useState } from "react"; import { useQueryStringState } from "../../../lib/useQueryStringState"; import { ColumnType } from "antd/es/table/interface"; @@ -32,8 +32,8 @@ import { rpc } from "juava"; import { feedbackError, feedbackSuccess, useKeyboard } from "../../../lib/ui"; import hash from "object-hash"; import { useConfigObjectLinks, useConfigObjectList } from "../../../lib/store"; -import { ButtonLabel } from "../../../components/ButtonLabel/ButtonLabel"; import { Spinner } from "../../../components/GlobalLoader/GlobalLoader"; +import { MdOutlineCancel } from "react-icons/md"; dayjs.extend(utc); dayjs.extend(relativeTime); @@ -103,7 +103,7 @@ function TaskStatus0({ task, loading }: { task: TasksDbModel & TaskStats; loadin } const SyncStatus: React.FC< - PropsWithChildren<{ status: "PARTIAL" | "FAILED" | "SUCCESS" | "RUNNING" | "SKIPPED" }> + PropsWithChildren<{ status: "PARTIAL" | "CANCELLED" | "FAILED" | "SUCCESS" | "RUNNING" | "SKIPPED" }> > = props => { const [showPopover, setShowPopover] = useState(false); const handleOpenChange = (newOpen: boolean) => { @@ -160,6 +160,8 @@ function TaskStatus0({ task, loading }: { task: TasksDbModel & TaskStats; loadin ) : props.status === "SKIPPED" ? ( + ) : props.status === "CANCELLED" ? ( + ) : ( ); @@ -212,6 +214,15 @@ function TaskStatus0({ task, loading }: { task: TasksDbModel & TaskStats; loadin show stats ); + case "CANCELLED": + return ( + + + CANCELLED + + show stats + + ); case "SKIPPED": return ( @@ -264,6 +275,8 @@ function TaskStatusResultTable({ stats }: { stats: any[] }) { return SUCCESS; } else if (record.status === "PARTIAL") { return PARTIAL; + } else if (record.status === "CANCELLED") { + return CANCELLED; } else if (record.status === "PENDING") { return PENDING; } else if (record.status === "RUNNING") { @@ -349,7 +362,34 @@ export function processTaskStatus(task: TasksDbModel): TasksDbModel & TaskStats function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap, refreshCb }: TasksTableProps) { const workspace = useWorkspace(); - + const cancelTask = async (taskId: string, syncId: string, pkg: string) => { + try { + const cancelStatus = await rpc( + `/api/${workspace.id}/sources/cancel?taskId=${taskId}&syncId=${syncId}&package=${pkg}` + ); + if (cancelStatus?.error) { + displayTaskRunError(workspace, cancelStatus); + } + } catch (e) { + feedbackError("Failed to cancel sync", { error: e, placement: "top" }); + } finally { + refreshCb && refreshCb(); + } + }; + const rerun = async (syncId: string) => { + try { + const runStatus = await rpc(`/api/${workspace.id}/sources/run?syncId=${syncId}`); + if (runStatus?.error) { + displayTaskRunError(workspace, runStatus); + } else { + feedbackSuccess("Sync started"); + } + } catch (e) { + feedbackError("Failed to run sync", { error: e, placement: "top" }); + } finally { + refreshCb && refreshCb(); + } + }; const tasksMapped = useMemo(() => { return tasks.map(task => { return { @@ -419,7 +459,10 @@ function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap, re render: (text, task) => { if (task.status === "SUCCESS") { return
    {task.successStreams}
    ; - } else if ((task.status === "PARTIAL" || task.status === "RUNNING") && task.totalStreams) { + } else if ( + (task.status === "PARTIAL" || task.status === "RUNNING" || task.status === "CANCELLED") && + task.totalStreams + ) { return (
    {task.successStreams} / {task.totalStreams} @@ -458,17 +501,38 @@ function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap, re key: "actions", render: (text, task, index) => { const items: ButtonProps[] = [ - { - icon: , - href: `/syncs/edit?id=${task.sync_id}`, - label: "Edit Sync", - }, { icon: , href: `/syncs/logs?taskId=${task.task_id}&syncId=${task.sync_id}`, label: "Show Logs", }, + { + icon: , + href: `/syncs/edit?id=${task.sync_id}`, + label: "Edit Sync", + collapsed: true, + }, ]; + if (task.status === "RUNNING") { + items.push({ + icon: , + onClick: async () => { + await cancelTask(task.task_id, task.sync_id, task.package); + }, + danger: true, + label: "Cancel", + collapsed: true, + }); + } else { + items.push({ + icon: , + onClick: async () => { + await rerun(task.sync_id); + }, + label: "Re-run", + collapsed: true, + }); + } return ; }, }, @@ -489,32 +553,6 @@ function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap, re ); } -const ReRunButton: React.FC<{ syncId: string; updateStatus: () => void }> = props => { - const [loading, setLoading] = useState(false); - const workspace = useWorkspace(); - const rerun = async () => { - try { - setLoading(true); - const runStatus = await rpc(`/api/${workspace.id}/sources/run?syncId=${props.syncId}`); - if (runStatus?.error) { - displayTaskRunError(workspace, runStatus); - } else { - feedbackSuccess("Sync started"); - } - } catch (e) { - feedbackError("Failed to run sync", { error: e, placement: "top" }); - } finally { - setLoading(false); - props.updateStatus(); - } - }; - return ( - - ); -}; - export type TasksViewState = { dates?: DatesRange; syncId?: string; @@ -713,9 +751,6 @@ function Tasks() {
    - {state.syncId && state.syncId !== "all" && ( - setRefresh(refresh + 1)} /> - )} 0 && "animate-spin"}`} />} type="link" diff --git a/webapps/console/pages/api/[workspaceId]/sources/cancel.ts b/webapps/console/pages/api/[workspaceId]/sources/cancel.ts new file mode 100644 index 000000000..c62a70121 --- /dev/null +++ b/webapps/console/pages/api/[workspaceId]/sources/cancel.ts @@ -0,0 +1,65 @@ +import { z } from "zod"; +import { createRoute, verifyAccess } from "../../../../lib/api"; +import { requireDefined, rpc } from "juava"; +import { getServerLog } from "../../../../lib/server/log"; +import { syncError } from "../../../../lib/server/sync"; +import { db } from "../../../../lib/server/db"; + +const log = getServerLog("sync-spec"); + +export default createRoute() + .GET({ + auth: true, + query: z.object({ + workspaceId: z.string(), + syncId: z.string(), + taskId: z.string(), + package: z.string(), + }), + result: z.any(), + }) + .handler(async ({ user, query }) => { + const { workspaceId } = query; + await verifyAccess(user, workspaceId); + const syncURL = requireDefined( + process.env.SYNCCTL_URL, + `env SYNCCTL_URL is not set. Sync Controller is required to run sources` + ); + const syncAuthKey = process.env.SYNCCTL_AUTH_KEY ?? ""; + const authHeaders: any = {}; + if (syncAuthKey) { + authHeaders["Authorization"] = `Bearer ${syncAuthKey}`; + } + + const existingLink = await db + .prisma() + .configurationObjectLink.findFirst({ where: { workspaceId: workspaceId, id: query.syncId, deleted: false } }); + if (!existingLink) { + return { ok: false, error: `sync with id ${query.syncId} not found in the workspace` }; + } + + try { + const res = await rpc(syncURL + "/cancel", { + method: "GET", + headers: { + "Content-Type": "application/json", + ...authHeaders, + }, + query, + }); + if (!res.ok) { + return { ok: false, error: res.error ?? "unknown error" }; + } else { + return { ok: false, pending: true, startedAt: res.startedAt }; + } + } catch (e: any) { + return syncError( + log, + `Error cancelling sync job`, + e, + false, + `syncId: ${query.syncId} taskId: ${query.taskId} package: ${query.package}` + ); + } + }) + .toNextApiHandler(); From 5d5318a7fb30be9b7d149b1ef2657b0635ac0eb1 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 19 Jul 2024 19:40:36 +0400 Subject: [PATCH 0809/1353] console: upgrade monaco dependency --- pnpm-lock.yaml | 26 +++++++++---------- webapps/console/package.json | 4 +-- .../pages/api/[workspaceId]/config/link.ts | 2 +- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a8f95367f..096eee9d5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -845,8 +845,8 @@ importers: specifier: ^5.15.3 version: 5.15.3(react@18.2.0) '@monaco-editor/react': - specifier: 4.5.0 - version: 4.5.0(monaco-editor@0.37.1)(react-dom@18.2.0)(react@18.2.0) + specifier: ^4.6.0 + version: 4.6.0(monaco-editor@0.50.0)(react-dom@18.2.0)(react@18.2.0) '@nangohq/frontend': specifier: ^0.21.11 version: 0.21.11 @@ -950,8 +950,8 @@ importers: specifier: ^2.0.8 version: 2.0.8(mjml@4.14.1)(react-dom@18.2.0)(react@18.2.0) monaco-editor: - specifier: 0.37.1 - version: 0.37.1 + specifier: ^0.50.0 + version: 0.50.0 next: specifier: ^13.5.6 version: 13.5.6(@babel/core@7.21.4)(react-dom@18.2.0)(react@18.2.0) @@ -5951,24 +5951,24 @@ packages: maxmind: 4.3.18 dev: false - /@monaco-editor/loader@1.3.3(monaco-editor@0.37.1): - resolution: {integrity: sha512-6KKF4CTzcJiS8BJwtxtfyYt9shBiEv32ateQ9T4UVogwn4HM/uPo9iJd2Dmbkpz8CM6Y0PDUpjnZzCwC+eYo2Q==} + /@monaco-editor/loader@1.4.0(monaco-editor@0.50.0): + resolution: {integrity: sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==} peerDependencies: monaco-editor: '>= 0.21.0 < 1' dependencies: - monaco-editor: 0.37.1 + monaco-editor: 0.50.0 state-local: 1.0.7 dev: false - /@monaco-editor/react@4.5.0(monaco-editor@0.37.1)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-VJMkp5Fe1+w8pLEq8tZPHZKu8zDXQIA1FtiDTSNccg1D3wg1YIZaH2es2Qpvop1k62g3c/YySRb3bnGXu2XwYQ==} + /@monaco-editor/react@4.6.0(monaco-editor@0.50.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==} peerDependencies: monaco-editor: '>= 0.25.0 < 1' react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@monaco-editor/loader': 1.3.3(monaco-editor@0.37.1) - monaco-editor: 0.37.1 + '@monaco-editor/loader': 1.4.0(monaco-editor@0.50.0) + monaco-editor: 0.50.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -21392,8 +21392,8 @@ packages: resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} dev: false - /monaco-editor@0.37.1: - resolution: {integrity: sha512-jLXEEYSbqMkT/FuJLBZAVWGuhIb4JNwHE9kPTorAVmsdZ4UzHAfgWxLsVtD7pLRFaOwYPhNG9nUCpmFL1t/dIg==} + /monaco-editor@0.50.0: + resolution: {integrity: sha512-8CclLCmrRRh+sul7C08BmPBP3P8wVWfBHomsTcndxg5NRCEPfu/mc2AGU8k37ajjDVXcXFc12ORAMUkmk+lkFA==} dev: false /mongodb-connection-string-url@3.0.0: diff --git a/webapps/console/package.json b/webapps/console/package.json index 507ffce2c..c739a12ba 100644 --- a/webapps/console/package.json +++ b/webapps/console/package.json @@ -38,7 +38,7 @@ "@jitsu/js": "workspace:*", "@jitsu/protocols": "workspace:*", "@loadable/component": "^5.15.3", - "@monaco-editor/react": "4.5.0", + "@monaco-editor/react": "^4.6.0", "@nangohq/frontend": "^0.21.11", "@prisma/client": "^4.12.0", "@prisma/extension-read-replicas": "^0.3.0", @@ -73,7 +73,7 @@ "lucide-react": "^0.263.1", "mjml": "^4.13.0", "mjml-react": "^2.0.8", - "monaco-editor": "0.37.1", + "monaco-editor": "^0.50.0", "next": "^13.5.6", "next-auth": "^4.23.2", "node-fetch-commonjs": "^3.2.4", diff --git a/webapps/console/pages/api/[workspaceId]/config/link.ts b/webapps/console/pages/api/[workspaceId]/config/link.ts index 2c9900be1..50efb4ff4 100644 --- a/webapps/console/pages/api/[workspaceId]/config/link.ts +++ b/webapps/console/pages/api/[workspaceId]/config/link.ts @@ -73,7 +73,7 @@ export const api: Api = { let createdOrUpdated; if (existingLink) { createdOrUpdated = await db.prisma().configurationObjectLink.update({ - where: { id: existingLink.id, workspaceId }, + where: { id: existingLink.id }, data: { data, deleted: false, workspaceId }, }); //try to do asynchronously for edit From c94dcb3bb9cad9b6d2060e3d49adb980a1ca7c1a Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 22 Jul 2024 11:09:27 +0400 Subject: [PATCH 0810/1353] console: switch back to airbyte version of MongoDB source --- webapps/console/pages/api/sources/index.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/webapps/console/pages/api/sources/index.ts b/webapps/console/pages/api/sources/index.ts index 836a066be..a5418b9d6 100644 --- a/webapps/console/pages/api/sources/index.ts +++ b/webapps/console/pages/api/sources/index.ts @@ -52,7 +52,7 @@ const JitsuMongoDBSource: SourceType = { packageId: "jitsucom/source-mongodb", packageType: "airbyte", meta: { - name: "MongoDB", + name: "MongoDB (alternative version)", license: "MIT", connectorSubtype: "database", }, @@ -77,7 +77,7 @@ const JitsuAttioSource: SourceType = { export const jitsuSources: Record = { "jitsucom/source-firebase": JitsuFirebaseSource, - "jitsucom/source-mongodb": JitsuMongoDBSource, + // "jitsucom/source-mongodb": JitsuMongoDBSource, "jitsucom/source-attio": JitsuAttioSource, }; @@ -118,7 +118,6 @@ export default createRoute() const sources: Partial[] = (await db.prisma().connectorPackage.findMany()) .filter( c => - c.packageId !== "airbyte/source-mongodb-v2" && !c.packageId.endsWith("-secure") && !c.packageId.endsWith("source-e2e-test-cloud") && !c.packageId.endsWith("source-e2e-test") From f7e15c48e19794660dafb2e137ad44e87e2b468c Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 22 Jul 2024 11:17:48 +0400 Subject: [PATCH 0811/1353] console: switch back to airbyte version of MongoDB source --- webapps/console/pages/api/sources/index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/webapps/console/pages/api/sources/index.ts b/webapps/console/pages/api/sources/index.ts index a5418b9d6..1a5836297 100644 --- a/webapps/console/pages/api/sources/index.ts +++ b/webapps/console/pages/api/sources/index.ts @@ -51,8 +51,9 @@ const JitsuMongoDBSource: SourceType = { versions: `/api/sources/versions?type=airbyte&package=jitsucom%2Fsource-mongodb`, packageId: "jitsucom/source-mongodb", packageType: "airbyte", + sortIndex: -1000, meta: { - name: "MongoDB (alternative version)", + name: "MongoDb (alternative version)", license: "MIT", connectorSubtype: "database", }, @@ -77,13 +78,12 @@ const JitsuAttioSource: SourceType = { export const jitsuSources: Record = { "jitsucom/source-firebase": JitsuFirebaseSource, - // "jitsucom/source-mongodb": JitsuMongoDBSource, + "jitsucom/source-mongodb": JitsuMongoDBSource, "jitsucom/source-attio": JitsuAttioSource, }; export const popularConnectors: string[] = [ "jitsucom/source-firebase", - "jitsucom/source-mongodb", "airbyte/source-stripe", "airbyte/source-google-ads", "airbyte/source-facebook-marketing", @@ -156,7 +156,7 @@ export default createRoute() })), ...sources, ] - .map(s => ({ ...s, sortIndex: sortIndexes[s.packageId!] })) + .map(s => ({ ...s, sortIndex: sortIndexes[s.packageId!] || s.sortIndex })) .sort((a, b) => { const res = (b.sortIndex || 0) - (a.sortIndex || 0); return res === 0 ? (a?.meta?.name || a?.packageId!).localeCompare(b?.meta?.name || b?.packageId!) : res; From d33384b725c0f20aa5c1ebd1bb31561bb28d54e1 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 22 Jul 2024 11:36:36 +0400 Subject: [PATCH 0812/1353] console: escape HTML in sources logs --- webapps/console/pages/[workspaceId]/syncs/logs.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/webapps/console/pages/[workspaceId]/syncs/logs.tsx b/webapps/console/pages/[workspaceId]/syncs/logs.tsx index 1278b4851..3739096a4 100644 --- a/webapps/console/pages/[workspaceId]/syncs/logs.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/logs.tsx @@ -6,9 +6,11 @@ import { JitsuButton } from "../../../components/JitsuButton/JitsuButton"; import { ChevronLeft, FileDown, RefreshCw } from "lucide-react"; import { useQuery } from "@tanstack/react-query"; import { LoadingAnimation } from "../../../components/GlobalLoader/GlobalLoader"; +import escape from "lodash/escape"; function colorLogs(data: string): ReactNode { return data.split("\n").map((line, i) => { + line = escape(line); if (line.includes(" ERROR [")) { return ( From cb6e51b6503ba6c1f55f37c7d791ff44a0c71010 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 22 Jul 2024 17:31:22 +0400 Subject: [PATCH 0813/1353] console: fixed startedBy format --- webapps/console/lib/server/sync.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/webapps/console/lib/server/sync.ts b/webapps/console/lib/server/sync.ts index c5d7fb14d..09c9de155 100644 --- a/webapps/console/lib/server/sync.ts +++ b/webapps/console/lib/server/sync.ts @@ -78,7 +78,7 @@ async function createOrUpdateTask({ taskId: string; syncId: string; status: string; - startedBy: string; + startedBy: any; description: string; }) { const taskData = { @@ -106,7 +106,7 @@ export async function checkQuota(opts: { syncId: string; package: string; version: string; - startedBy: string; + startedBy: any; }): Promise { try { const quotaCheck = `${getEeConnection().host}api/quotas/sync`; @@ -324,7 +324,7 @@ async function runSyncSynchronously({ destinationType: DestinationType; destinationConfig: DestinationConfig; sourceConfig: ServiceConfig; - startedBy: string; + startedBy: any; }) { await createOrUpdateTask({ taskId, @@ -413,9 +413,8 @@ export async function scheduleSync({ process.env.SYNCCTL_URL, `env SYNCCTL_URL is not set. Sync Controller is required to run sources` ); - const startedBy = JSON.stringify( - trigger === "manual" ? (user ? { trigger: "manual", ...user } : { trigger: "manual" }) : { trigger: "scheduled" } - ); + const startedBy = + trigger === "manual" ? (user ? { trigger: "manual", ...user } : { trigger: "manual" }) : { trigger: "scheduled" }; const authHeaders: any = {}; if (syncAuthKey) { authHeaders["Authorization"] = `Bearer ${syncAuthKey}`; @@ -615,7 +614,7 @@ export async function scheduleSync({ taskId, syncId: sync.id, fullSync: fullSync ? "true" : "false", - startedBy, + startedBy: JSON.stringify(startedBy), tableNamePrefix: sync.data?.["tableNamePrefix"] ?? "", }, body: { From ca2db3f170e8eee3ce6f192a3124765e928a454f Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 22 Jul 2024 17:51:18 +0400 Subject: [PATCH 0814/1353] console: syncs: task log show relative dates and who started the task --- .../pages/[workspaceId]/syncs/index.tsx | 10 ++-- .../pages/[workspaceId]/syncs/tasks.tsx | 55 +++++++++++++++++-- 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/webapps/console/pages/[workspaceId]/syncs/index.tsx b/webapps/console/pages/[workspaceId]/syncs/index.tsx index 75d6fc6ff..b7fe5ff85 100644 --- a/webapps/console/pages/[workspaceId]/syncs/index.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/index.tsx @@ -249,10 +249,12 @@ function SyncsTable({ links, services, destinations }: RemoteEntitiesProps) { } const t = tasks.data.tasks?.[link.id]; return ( -
    -
    {t ? formatDateOnly(t.updated_at) : ""}
    -
    {t ? formatTime(t.updated_at) : ""}
    -
    + t && ( +
    + {`${dayjs(t.updated_at).fromNow(true)} ago`} +
    {t ? formatDate(t.updated_at) : ""}
    +
    + ) ); }, }, diff --git a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx index 14804b07c..c7c1605bb 100644 --- a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx @@ -3,7 +3,7 @@ import { useWorkspace } from "../../../lib/context"; import { useApi } from "../../../lib/useApi"; import { source_taskDbModel } from "../../../prisma/schema"; import { z } from "zod"; -import { DatePicker, notification, Popover, Select, Table, Tag } from "antd"; +import { DatePicker, notification, Popover, Select, Table, Tag, Tooltip } from "antd"; import React, { PropsWithChildren, useCallback, useEffect, useMemo, useState } from "react"; import { useQueryStringState } from "../../../lib/useQueryStringState"; import { ColumnType } from "antd/es/table/interface"; @@ -16,17 +16,19 @@ import { arrayToMap } from "../../../lib/shared/arrays"; import { JitsuButton, WJitsuButton } from "../../../components/JitsuButton/JitsuButton"; import { AlertCircle, + CalendarIcon, CheckCircle2, ChevronLeft, Edit3, ListMinusIcon, PlayCircle, RefreshCw, + UserIcon, XCircle, } from "lucide-react"; import { FaExternalLinkAlt, FaRegPlayCircle } from "react-icons/fa"; import { useRouter } from "next/router"; -import { displayTaskRunError, formatDateOnly, formatTime, SyncTitle } from "./index"; +import { displayTaskRunError, formatDate, SyncTitle } from "./index"; import { ButtonGroup, ButtonProps } from "../../../components/ButtonGroup/ButtonGroup"; import { rpc } from "juava"; import { feedbackError, feedbackSuccess, useKeyboard } from "../../../lib/ui"; @@ -399,15 +401,34 @@ function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap, re }); }, [tasks]); const columns: ColumnType<(typeof tasksMapped)[number]>[] = [ + { + title: <>, + key: "started_by", + render: (text, t) => { + const sb = (t.started_by || {}) as any; + const trigger = sb.trigger; + const icon = + trigger === "manual" ? ( + + + + ) : ( + + + + ); + return icon; + }, + }, { title:
    Started (UTC)
    , key: "started_at", width: "12%", render: (text, t) => { return ( -
    -
    {t ? formatDateOnly(t.started_at) : ""}
    -
    {t ? formatTime(t.started_at) : ""}
    +
    + {`${dayjs(t.started_at).fromNow(true)} ago`} +
    {t ? formatDate(t.started_at) : ""}
    ); }, @@ -704,6 +725,22 @@ function Tasks() {
    ), }, + { + value: "SKIPPED", + label: ( +
    + SKIPPED +
    + ), + }, + { + value: "CANCELLED", + label: ( +
    + CANCELLED +
    + ), + }, { value: "SUCCESS", label: ( @@ -712,6 +749,14 @@ function Tasks() {
    ), }, + { + value: "PARTIAL", + label: ( +
    + PARTIAL +
    + ), + }, { value: "RUNNING", label: ( From c1882f1cbab225fe58b45f22d4cb344428844a3d Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 25 Jul 2024 14:25:09 +0400 Subject: [PATCH 0815/1353] mixpanel-destination: disable MP assuming User's IP from s2s requests w/o context.ip --- .../src/functions/mixpanel-destination.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/libs/core-functions/src/functions/mixpanel-destination.ts b/libs/core-functions/src/functions/mixpanel-destination.ts index b5f4bfbec..518edc66f 100644 --- a/libs/core-functions/src/functions/mixpanel-destination.ts +++ b/libs/core-functions/src/functions/mixpanel-destination.ts @@ -279,9 +279,11 @@ function setProfileMessage(ctx: FullContext, distinctId: string, event: Analytic }; } + const ip = analyticsContext.ip; + const engageUrl = `https://api.mixpanel.com/engage?verbose=1${ip ? "" : "&ip=0"}`; const reqs: MixpanelRequest[] = [ { - url: "https://api.mixpanel.com/engage?verbose=1#profile-set", + url: engageUrl + "#profile-set", headers: { "Content-type": "application/json", Accept: "text-plain", @@ -291,7 +293,7 @@ function setProfileMessage(ctx: FullContext, distinctId: string, event: Analytic { $token: opts.projectToken, $distinct_id: distinctId, - $ip: analyticsContext.ip, + $ip: ip, $set: { ...geoParams(analyticsContext.geo), ...traits, @@ -310,7 +312,7 @@ function setProfileMessage(ctx: FullContext, distinctId: string, event: Analytic ...extractUtmParams(event.properties || {}, "initial_"), }; reqs.push({ - url: "https://api.mixpanel.com/engage?verbose=1#profile-set-once", + url: engageUrl + "#profile-set-once", headers: { "Content-type": "application/json", Accept: "text-plain", @@ -320,7 +322,7 @@ function setProfileMessage(ctx: FullContext, distinctId: string, event: Analytic { $token: opts.projectToken, $distinct_id: distinctId, - $ip: analyticsContext.ip, + $ip: ip, $set_once: { ...utm, $initial_referrer: page?.referrer, @@ -335,11 +337,11 @@ function setProfileMessage(ctx: FullContext, distinctId: string, event: Analytic const unionPayload: any = { $token: opts.projectToken, $distinct_id: distinctId, - $ip: analyticsContext.ip, + $ip: ip, $union: { [groupKey]: [groupId] }, }; reqs.push({ - url: "https://api.mixpanel.com/engage?verbose=1#profile-union", + url: engageUrl + "#profile-union", eventType: "profile-union", headers: { "Content-type": "application/json", From e0ac89c7c628c0de0c3f8ebc8d5a790822d925aa Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 25 Jul 2024 16:56:32 +0400 Subject: [PATCH 0816/1353] @jitsu/protocols allow for custom clientIds in AnalyticsContext --- types/protocols/analytics.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/types/protocols/analytics.d.ts b/types/protocols/analytics.d.ts index 530c8fdb8..d1be9da4f 100644 --- a/types/protocols/analytics.d.ts +++ b/types/protocols/analytics.d.ts @@ -231,6 +231,7 @@ interface AnalyticsContext { //see https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/customer-information-parameters fbc?: string; fbp?: string; + [key: string]: any; }; geo?: Geo; From 4c12de4dd1d748a91aa70595d2b0209f12578228 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 25 Jul 2024 17:00:38 +0400 Subject: [PATCH 0817/1353] bump canary version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7e4406371..133e7a5d3 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "lint": "turbo run lint --", "release": "pnpm build && pnpm test && monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/functions --filter ./libs/jitsu-js --filter ./libs/jitsu-react --npm-tag latest --git-tag 'jitsu-js-libs-v{version}' --push-tag", "release:build-scripts": "pnpm build --filter ./cli/build-scripts && monorel --filter ./cli/build-scripts --npm-tag latest --version 0.0.4-dev.{rev}.{time} --publish --git-tag 'jitsu-build-scripts-v{version}'", - "release:canary": "monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/functions --filter ./libs/jitsu-js --filter ./libs/jitsu-react --version '1.9.6-canary.{rev}.{time}' --npm-tag canary --git-tag 'jitsu-js-libs-canary-v{version}' --push-tag" + "release:canary": "monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/functions --filter ./libs/jitsu-js --filter ./libs/jitsu-react --version '1.9.7-canary.{rev}.{time}' --npm-tag canary --git-tag 'jitsu-js-libs-canary-v{version}' --push-tag" }, "devDependencies": { "@playwright/test": "1.39.0", From 9b99c91452f271057b524c63439066bd2bcdb8a5 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 25 Jul 2024 19:52:09 +0400 Subject: [PATCH 0818/1353] #1114 Remove functions Config tab --- .../FunctionsDebugger/FunctionsDebugger.tsx | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx b/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx index 3b656e525..13e5e4dc2 100644 --- a/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx +++ b/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx @@ -4,7 +4,7 @@ import { Badge, Button, Descriptions, Drawer, Dropdown, Input, MenuProps, Select import { PlayCircleOutlined } from "@ant-design/icons"; import { CodeEditor } from "../CodeEditor/CodeEditor"; import styles from "./FunctionsDebugger.module.css"; -import { Check, Pencil, Settings, X } from "lucide-react"; +import { Check, Pencil, X } from "lucide-react"; import { getConfigApi, useEventsLogApi } from "../../lib/useApi"; import { EventsLogRecord } from "../../lib/server/events-log"; import { useWorkspace } from "../../lib/context"; @@ -138,7 +138,7 @@ export const FunctionsDebugger: React.FC = props => { const workspace = useWorkspace(); const [showLogs, setShowLogs] = useState(false); - const [showConfig, setShowConfig] = useState(false); + // const [showConfig, setShowConfig] = useState(false); const [showEvents, setShowEvents] = useState(false); const [event, setEvent] = useState(JSON.stringify(examplePageEvent(), undefined, 2)); const [obj, setObj] = useState>({ @@ -276,14 +276,14 @@ export const FunctionsDebugger: React.FC = props => { - + {/* setShowConfig(!showConfig)}*/} + {/* icon={}*/} + {/*>*/} + {/* Config*/} + {/**/}
    )} -
    -
    Config
    - -
    + {/*
    */} + {/*
    Config
    */} + {/* */} + {/*
    */}
    From 8fb84465d8195cda1be489e37fc82d2fd7978c50 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Mon, 29 Jul 2024 14:29:09 +0300 Subject: [PATCH 0819/1353] fix(ui): connections diagram on main screen wasn't displaying connector -> logo part correctly; also remove useless logging --- .../ConnectionsDiagram/ConnectionsDiagram.tsx | 10 +++++++--- webapps/console/pages/_app.tsx | 1 - 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx b/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx index 28b024b2f..75506900f 100644 --- a/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx +++ b/webapps/console/components/ConnectionsDiagram/ConnectionsDiagram.tsx @@ -1,6 +1,6 @@ import React, { ReactNode, RefObject, useEffect } from "react"; import { branding } from "../../lib/branding"; -import { requireDefined } from "juava"; +import { getLog, requireDefined } from "juava"; import Link from "next/link"; import { useAppConfig, useWorkspace } from "../../lib/context"; import { ArrowRight, ExternalLink, Inbox } from "lucide-react"; @@ -129,6 +129,7 @@ export const ConnectionsDiagram: React.FC = ({ }); useEffect(() => { + getLog().atInfo().log(`Rendering connections diagram with ${connections.length} connections`); if (canvasRef.current == null || logoRef.current == null) { return; } @@ -156,7 +157,7 @@ export const ConnectionsDiagram: React.FC = ({ }); } }); - + getLog().atDebug().log(`Rendering ${connectorsRef.current.length} connectors`, connectorsRef.current); connectorsRef.current .map(r => r.current) .filter(r => !!r) @@ -168,11 +169,14 @@ export const ConnectionsDiagram: React.FC = ({ mouseOverSrc === source.id || (!!mouseOverDst && !!connections.find(c => c.from === source.id && c.to === mouseOverDst)); if (connections.find(c => c.from === source.id)) { + getLog().atInfo().log(`Adding connector from ${source.id} to logo (select=${selected})`); newLines.push({ from: { top: rel.top + bounds.height / 2, left: rel.left + bounds.width }, to: { left: logoPosition.left, top: logoPosition.top + logoBounds.height / 2 }, selected, }); + } else { + getLog().atWarn().log(`Source ${source.id} has no connections`); } }); dstRefs.current @@ -240,7 +244,7 @@ export const ConnectionsDiagram: React.FC = ({ srcRefs.current = sources.map((_, i) => srcRefs.current[i] ?? React.createRef()); dstRefs.current = destinations.map((_, i) => dstRefs.current[i] ?? React.createRef()); - connectorsRef.current = destinations.map((_, i) => connectorsRef.current[i] ?? React.createRef()); + connectorsRef.current = connectorSources.map((_, i) => connectorsRef.current[i] ?? React.createRef()); const connectorSection = appConfig.syncs.enabled && ( diff --git a/webapps/console/pages/_app.tsx b/webapps/console/pages/_app.tsx index 2bfea004f..fef144281 100644 --- a/webapps/console/pages/_app.tsx +++ b/webapps/console/pages/_app.tsx @@ -348,7 +348,6 @@ const StoreLoader: React.FC< }> > = ({ workspaceIdOrSlug, children }) => { const configObjectsUpdater = useConfigObjectsUpdater(workspaceIdOrSlug); - console.log("configObjectsUpdater", configObjectsUpdater); if (configObjectsUpdater.error) { log .atError() From 07f6f5f9ecb7542d09969b1816b8b5b63edfb679 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Mon, 29 Jul 2024 17:03:31 +0300 Subject: [PATCH 0820/1353] feat(ui/admin): added sync stat to admin tables --- .../JsonAsTable/JsonAsTable.module.css | 3 ++ .../components/JsonAsTable/JsonAsTable.tsx | 2 + .../console/pages/admin/overage-billing.tsx | 11 ++++ webapps/console/pages/admin/workspaces.tsx | 18 ++++++- webapps/ee-api/pages/api/report/overage.ts | 50 +++++++++--------- .../ee-api/pages/api/report/workspace-stat.ts | 51 ++++++++++++++++--- 6 files changed, 101 insertions(+), 34 deletions(-) create mode 100644 webapps/console/components/JsonAsTable/JsonAsTable.module.css diff --git a/webapps/console/components/JsonAsTable/JsonAsTable.module.css b/webapps/console/components/JsonAsTable/JsonAsTable.module.css new file mode 100644 index 000000000..bfa717d73 --- /dev/null +++ b/webapps/console/components/JsonAsTable/JsonAsTable.module.css @@ -0,0 +1,3 @@ +.jsonTable :global td { + vertical-align: top; +} diff --git a/webapps/console/components/JsonAsTable/JsonAsTable.tsx b/webapps/console/components/JsonAsTable/JsonAsTable.tsx index a76f93354..3b8dd9f7a 100644 --- a/webapps/console/components/JsonAsTable/JsonAsTable.tsx +++ b/webapps/console/components/JsonAsTable/JsonAsTable.tsx @@ -4,6 +4,7 @@ import { ExternalLink } from "lucide-react"; import { Table } from "antd"; import hash from "stable-hash"; import { ReactNode } from "react"; +import styles from "./JsonAsTable.module.css"; function makeNiceName(key: string) { return key @@ -83,6 +84,7 @@ export const JsonAsTable: React.FC<{ rows: any[]; columnOptions: Record ({ key: hash(r), ...r }))} pagination={{ pageSize: 1000 }} diff --git a/webapps/console/pages/admin/overage-billing.tsx b/webapps/console/pages/admin/overage-billing.tsx index adcddab5a..9b2cb164a 100644 --- a/webapps/console/pages/admin/overage-billing.tsx +++ b/webapps/console/pages/admin/overage-billing.tsx @@ -77,6 +77,16 @@ const View = ({ data, workspaces }) => { return {name}; }, }, + monthlyActiveSyncs: { + type: "custom", + render: (val, row) => { + return ( +
    row.monthlyActiveSyncs ? "font-bold text-error" : ""}> + {row.monthlyActiveSyncs} / {row.monthlyActiveSyncsLimit}{" "} +
    + ); + }, + }, stripeCustomerId: { type: "custom", render: (customerId, { subscriptionId }) => { @@ -89,6 +99,7 @@ const View = ({ data, workspaces }) => { ); }, }, + monthlyActiveSyncsLimit: { omit: true }, subscriptionId: { omit: true }, start: dateFormat, roundedPeriod: { omit: true }, diff --git a/webapps/console/pages/admin/workspaces.tsx b/webapps/console/pages/admin/workspaces.tsx index 9666a571e..39ac17fe2 100644 --- a/webapps/console/pages/admin/workspaces.tsx +++ b/webapps/console/pages/admin/workspaces.tsx @@ -65,6 +65,20 @@ const View = ({ data }) => { users: { omit: true }, events: { type: "number" }, workspaceSlug: { omit: true }, + domains: { + type: "custom", + render: val => { + return ( +
    + {(val || []).map(d => ( + + {d} + + ))} +
    + ); + }, + }, workspaceName: { type: "link", href: (val, row) => `/${row.workspaceSlug}` }, billing: { type: "custom", @@ -72,7 +86,7 @@ const View = ({ data }) => { if (val?.planId === "enterprise") { return ( -
    +
    ENTERPRISE
    @@ -81,7 +95,7 @@ const View = ({ data }) => { return (
    -
    +
    PAYING
    diff --git a/webapps/ee-api/pages/api/report/overage.ts b/webapps/ee-api/pages/api/report/overage.ts index 6ee6792ec..3fa4f0faf 100644 --- a/webapps/ee-api/pages/api/report/overage.ts +++ b/webapps/ee-api/pages/api/report/overage.ts @@ -2,7 +2,7 @@ import type { NextApiRequest, NextApiResponse } from "next"; import { assertTrue, getLog } from "juava"; import { withErrorHandler } from "../../../lib/error-handler"; import { auth } from "../../../lib/auth"; -import { store } from "../../../lib/services"; +import { pg, store } from "../../../lib/services"; import { getAvailableProducts, getInvoiceEndDate, @@ -14,7 +14,7 @@ import { } from "../../../lib/stripe"; import Stripe from "stripe"; import pick from "lodash/pick"; -import { buildWorkspaceReport } from "./workspace-stat"; +import { buildWorkspaceReport, query } from "./workspace-stat"; import { getServerLog } from "../../../lib/log"; import dayjs from "dayjs"; @@ -26,6 +26,21 @@ function toUTC(date: Date | string) { return new Date(dateObj.getTime() - timezoneOffset * 60000); } +async function getSyncsStat(periodStart: Date, periodEnd: Date, workspaceId: string): Promise<{ activeSyncs: number }> { + const res = await query( + pg, + `select + count(distinct sync."fromId" || sync."toId") as "activeSyncs" + from newjitsu.source_task task + join newjitsu."ConfigurationObjectLink" sync on task.sync_id = sync."id" + where + (task.status = 'SUCCESS' OR task.status = 'PARTIAL') and deleted = false + and "workspaceId" = :workspaceId and started_at >= :periodStart and started_at < :periodEnd`, + { periodStart, periodEnd, workspaceId } + ); + return res[0] as any; +} + const msPerHour = 1000 * 60 * 60; const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { const claims = await auth(req, res); @@ -111,33 +126,12 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse log.atWarn().log(`No subscription found for invoice ${stripeLink("invoices", invoice.id)}, skipping`); continue; } - const subscription = - subscriptionCache[subscriptionId] || - (subscriptionCache[subscriptionId] = await stripe.subscriptions.retrieve(subscriptionId)); - // if (subscription.status === "canceled") { - // log - // .atWarn() - // .log( - // `Subscription ${stripeLink("subscriptions", subscription.id)} is canceled. Skipping invoice ${stripeLink( - // "invoices", - // invoice.id - // )}` - // ); - // continue; - // } const plan = availableProducts.find(p => p.id === product); if (!plan) { log.atWarn().log(`No plan found for ${product} from invoice ${stripeLink("invoices", invoice.id)}`); continue; } - // log - // .atInfo() - // .log( - // `Processing invoice ${invoice.id} for [${new Date(start).toISOString()}, ${new Date( - // end - // ).toISOString()}] workspace ${workspaceId}, plan ${plan.id}` - // ); - const { overagePricePer100k, destinationEvensPerMonth } = JSON.parse(plan.metadata.plan_data); + const { overagePricePer100k, destinationEvensPerMonth, dailyActiveSyncs } = JSON.parse(plan.metadata.plan_data); const overagePricePerEvent = overagePricePer100k / 100_000; const startTimestamp = dayjs(start).utc().startOf("day").toDate().getTime(); const endTimestamp = dayjs(end).utc().startOf("day").add(-1, "millisecond").toDate().getTime(); @@ -157,7 +151,11 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse (Math.max(0, projectedEvents - destinationEvensPerMonth) / 100_000) * overagePricePer100k * (1 - discountPercentage / 100); - + getLog().atDebug().log(`Getting sync stat for ${start} - ${end} for workspace ${workspaceId}`); + let syncStatTimer = Date.now(); + const syncStat = await getSyncsStat(start, end, workspaceId); + syncStatTimer = Date.now() - syncStatTimer; + getLog().atDebug().log(`Got sync stat for ${workspaceId} in ${syncStatTimer}ms`); result.push({ month: start.toLocaleString("en-US", { month: "long", year: "numeric" }), baseInvoiceId: invoice.id, @@ -165,6 +163,8 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse stripeCustomerId, subscriptionId, start, + monthlyActiveSyncs: syncStat.activeSyncs, + monthlyActiveSyncsLimit: dailyActiveSyncs, end, roundedPeriod: { start: dayjs(startTimestamp).utc().toISOString(), diff --git a/webapps/ee-api/pages/api/report/workspace-stat.ts b/webapps/ee-api/pages/api/report/workspace-stat.ts index 9ca9cb548..5840ee6dd 100644 --- a/webapps/ee-api/pages/api/report/workspace-stat.ts +++ b/webapps/ee-api/pages/api/report/workspace-stat.ts @@ -22,6 +22,7 @@ export type WorkspaceReportRow = { period: ISODate; workspaceId: string; events: number; + syncs: number; }; export type ReportParams = { @@ -45,12 +46,25 @@ function isoDateTOClickhouse(date: ISODate): string { return date.replace("T", " ").replace("Z", "").split(".")[0]; } -async function getClickhousePart({ - granularity, - start, - end, - workspaceId, -}: ReportParams): Promise { +async function getSyncs() { + return await query( + pg, + `select + "workspaceId", + date_trunc('day', started_at) as period, + + count(distinct sync."fromId" || sync."toId") as "activeSyncs" + from newjitsu.source_task task + join newjitsu."ConfigurationObjectLink" sync on task.sync_id = sync."id" + where (task.status = 'SUCCESS' OR task.status = 'PARTIAL') + and started_at > now() - interval '120 days' + and deleted = false + group by "workspaceId", period + order by period desc , "workspaceId";` + ); +} + +async function getEventsReport({ granularity, start, end, workspaceId }: ReportParams): Promise { const timer = Date.now(); const metricsSchema = process.env.CLICKHOUSE_METRICS_SCHEMA || process.env.CLICKHOUSE_DATABASE || "newjitsu_metrics"; const query = `select @@ -124,7 +138,30 @@ export async function buildWorkspaceReport( granularity: "day", workspaceId: string | undefined ): Promise { - return (await getClickhousePart({ start, end, granularity, workspaceId })).map(s => ({ ...s, src: "ch" })); + const [eventsReport, syncs] = await Promise.all([ + getEventsReport({ start, end, granularity, workspaceId }), + getSyncs(), + ]); + const report = new Map(); + eventsReport.forEach(row => + report.set(row.workspaceId + "_" + row.period, { + workspaceId: row.workspaceId, + period: row.period, + events: 0, + syncs: 0, + }) + ); + syncs.forEach(row => + report.set(row.workspaceId + "_" + row.period.toISOString(), { + workspaceId: row.workspaceId, + period: row.period.toISOString(), + events: 0, + syncs: 0, + }) + ); + eventsReport.forEach(row => (report.get(row.workspaceId + "_" + row.period)!.events = row.events)); + syncs.forEach(row => (report.get(row.workspaceId + "_" + row.period.toISOString())!.syncs = row.activeSyncs)); + return [...report.values()]; } async function extend(reportResult: WorkspaceReportRow[]): Promise { From f3c1ce15ac36ee3d1ff692d0df78e087e6d1295b Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Mon, 29 Jul 2024 18:11:05 +0300 Subject: [PATCH 0821/1353] feat(billing): end-point to fix stripe customer id collision across multiple workpaces; code change that prevents the collision happening in the future --- webapps/ee-api/lib/stripe.ts | 44 +++++++++++++++---- .../api/billing/rotate-stripe-customer.ts | 20 +++++++++ 2 files changed, 56 insertions(+), 8 deletions(-) create mode 100644 webapps/ee-api/pages/api/billing/rotate-stripe-customer.ts diff --git a/webapps/ee-api/lib/stripe.ts b/webapps/ee-api/lib/stripe.ts index ee32e3e68..b6d965052 100644 --- a/webapps/ee-api/lib/stripe.ts +++ b/webapps/ee-api/lib/stripe.ts @@ -2,6 +2,7 @@ import Stripe from "stripe"; import { store } from "./services"; import { assertDefined, assertTrue, getLog, requireDefined } from "juava"; import { omit } from "lodash"; +import assert from "assert"; export const stripe = new Stripe(process.env.STRIPE_SECRET_KEY as string, { apiVersion: "2022-11-15", @@ -38,6 +39,40 @@ export type StripeDataTableEntry = { }; }; +/** + * This function assigns a new stripe customer id to a workspace. We had a bug + * that assigned duplicate stripe customer ids to workspaces. This function fixes it + * + * It could be called as /api/billing/rotate-stripe-customer?workspaceId=...&dryRun=true + */ +export async function rotateStripeCustomer(workspaceId: string, dryRun: boolean): Promise { + const stripeOptions: StripeDataTableEntry = await store.getTable(stripeDataTable).get(workspaceId); + if (!stripeOptions) { + getLog().atInfo().log(`No stripe customer found for workspace ${workspaceId}`); + return; + } + const stripeCustomerId = stripeOptions.stripeCustomerId; + const customerObj = (await stripe.customers.retrieve(stripeCustomerId)) as Stripe.Customer; + assert(customerObj); + const email = customerObj.email; + assert(email); + getLog().atInfo().log(`Customer ${stripeCustomerId} found for workspace ${workspaceId}`, customerObj); + const createParams = { + email: email, + name: customerObj.name || email, + }; + getLog().atInfo().log(`Original customer ${stripeCustomerId}`, JSON.stringify(customerObj, null, 2)); + getLog().atInfo().log(`Creating new customer with params`, JSON.stringify(createParams, null, 2)); + + if (dryRun) { + getLog().atInfo().log("Dry run, skipping customer creation"); + } else { + const newCustomer = await stripe.customers.create(createParams); + getLog().atInfo().log(`New customer created: ${newCustomer.id}`, JSON.stringify(newCustomer, null, 2)); + await store.getTable(stripeDataTable).put(workspaceId, { stripeCustomerId: newCustomer.id }); + } +} + export async function getOrCreateCurrentSubscription( workspaceId: string, userEmail: () => string, @@ -51,14 +86,7 @@ export async function getOrCreateCurrentSubscription( let stripeOptions: StripeDataTableEntry = await store.getTable(stripeDataTable).get(workspaceId); if (!stripeOptions) { const email = userEmail(); - const existingCustomers = await stripe.customers.list({ email }); - getLog() - .atInfo() - .log( - `${workspaceId} doesn't have a linked stripe customer. Found ${existingCustomers.data.length} customers with email ${email}` - ); - const newCustomer = - existingCustomers.data.length > 0 ? existingCustomers.data[0] : await stripe.customers.create({ email }); + const newCustomer = await stripe.customers.create({ email }); await store.getTable(stripeDataTable).put(workspaceId, { stripeCustomerId: newCustomer.id }); stripeOptions = { stripeCustomerId: newCustomer.id }; } diff --git a/webapps/ee-api/pages/api/billing/rotate-stripe-customer.ts b/webapps/ee-api/pages/api/billing/rotate-stripe-customer.ts new file mode 100644 index 000000000..a095e52e3 --- /dev/null +++ b/webapps/ee-api/pages/api/billing/rotate-stripe-customer.ts @@ -0,0 +1,20 @@ +import { NextApiRequest, NextApiResponse } from "next"; +import { ErrorResponse } from "./plans"; +import assert from "assert"; +import { auth } from "../../../lib/auth"; +import { rotateStripeCustomer } from "../../../lib/stripe"; +import { withErrorHandler } from "../../../lib/error-handler"; + +const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { + const workspaceId = req.query.workspaceId as string | undefined; + const dryRun = req.query.dryRun === "true" || req.query.dryRun === "1"; + assert(workspaceId, "workspaceId is required"); + const claims = await auth(req, res); + if (!claims || claims.type !== "admin") { + return; + } + await rotateStripeCustomer(workspaceId, dryRun); + res.status(200).json({ ok: true }); +}; + +export default withErrorHandler(handler); From 13f7da0963544ada9e97d15e758f18f2871c5b00 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 30 Jul 2024 16:35:03 +0400 Subject: [PATCH 0822/1353] jitsu-js: support idEndpoint config option to create server cookie for Jitsu ID console: use idEndpoint --- libs/jitsu-js/src/analytics-plugin.ts | 23 +++++++++++++- libs/jitsu-js/src/jitsu.ts | 7 +++++ webapps/console/pages/_app.tsx | 1 + webapps/console/pages/api/id.ts | 44 +++++++++++++++++++++++++++ 4 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 webapps/console/pages/api/id.ts diff --git a/libs/jitsu-js/src/analytics-plugin.ts b/libs/jitsu-js/src/analytics-plugin.ts index 838c4df96..a9c41217c 100644 --- a/libs/jitsu-js/src/analytics-plugin.ts +++ b/libs/jitsu-js/src/analytics-plugin.ts @@ -25,6 +25,7 @@ const defaultConfig: Required = { runtime: undefined, fetchTimeoutMs: undefined, s2s: undefined, + idEndpoint: undefined, }; export const parseQuery = (qs?: string): Record => { @@ -669,7 +670,7 @@ export const jitsuAnalyticsPlugin = (pluginConfig: JitsuPluginConfig = {}): Anal name: "jitsu", config: instanceConfig, - initialize: args => { + initialize: async args => { const { config } = args; if (config.debug) { console.debug("[JITSU DEBUG] Initializing Jitsu plugin with config: ", JSON.stringify(config, null, 2)); @@ -678,6 +679,26 @@ export const jitsuAnalyticsPlugin = (pluginConfig: JitsuPluginConfig = {}): Anal throw new Error("Please specify host variable in jitsu plugin initialization, or set echoEvents to true"); } validateWriteKey(config.writeKey); + + if (config.idEndpoint) { + if (!isInBrowser()) { + console.error(`[JITSU] 'idEndpoint' option can be used only in browser environment`); + return; + } + try { + const fetch = config.fetch || globalThis.fetch; + const controller = new AbortController(); + setTimeout(() => controller.abort(), 1000); + const res = await fetch(config.idEndpoint, { credentials: "include", signal: controller.signal }); + if (!res.ok) { + console.error(`[JITSU] Can't fetch idEndpoint: ${res.status} - ${res.statusText}`); + } else if (config.debug) { + console.log(`[JITSU DEBUG] Fetch idEndpoint: ${res.status}`); + } + } catch (e) { + console.error(`[JITSU] Can't fetch idEndpoint: ${e.message}`); + } + } }, page: args => { const { payload, config, instance } = args; diff --git a/libs/jitsu-js/src/jitsu.ts b/libs/jitsu-js/src/jitsu.ts index 77cc07588..fa9176fba 100644 --- a/libs/jitsu-js/src/jitsu.ts +++ b/libs/jitsu-js/src/jitsu.ts @@ -49,6 +49,13 @@ type JitsuOptions = { * Timeout for fetch requests. Default value: 5000 */ fetchTimeoutMs?: number; + + /** + * Endpoint that makes sure that Jitsu anonymousId cookie is set as server (httpOnly) cookie. + * Endpoint must be hosted on the same domain as the site where Jitsu code is installed. + * Required to overcome Safari ITP restrictions. + */ + idEndpoint?: string; }; type PersistentStorage = { diff --git a/webapps/console/pages/_app.tsx b/webapps/console/pages/_app.tsx index fef144281..be7008d5a 100644 --- a/webapps/console/pages/_app.tsx +++ b/webapps/console/pages/_app.tsx @@ -319,6 +319,7 @@ function AppLoader({ children, pageProps }: PropsWithChildren) { ? { //debug: data?.logLevel === "debug", debug: isTruish(process.env.NEXT_PUBLIC_TELEMETRY_DEBUG), + idEndpoint: "/api/id", host: trackingHost, } : { disabled: true } diff --git a/webapps/console/pages/api/id.ts b/webapps/console/pages/api/id.ts new file mode 100644 index 000000000..77790a749 --- /dev/null +++ b/webapps/console/pages/api/id.ts @@ -0,0 +1,44 @@ +import type { NextApiRequest, NextApiResponse } from "next"; +import { randomUUID } from "crypto"; + +const USER_COOKIE = "__eventn_uid"; +const ANON_COOKIE = "__eventn_id"; + +function getDomain(request: NextApiRequest) { + const domain = request.headers.host?.toString() ?? ""; + if (domain.startsWith("localhost")) return "localhost"; + return domain; +} + +function renewCookies( + request: NextApiRequest, + response: NextApiResponse, + browserName: string, + serverName: string, + generateNew: boolean = false +) { + let cookie = request.cookies[browserName] || request.cookies[serverName]; + if (!cookie) { + if (!generateNew) return; + cookie = randomUUID(); + } + const secure = request.headers["x-forwarded-proto"] === "https"; + const maxAge = 31_536_000; // 1 year in seconds + const domain = getDomain(request); + response.setHeader("Set-Cookie", [ + ...((response.getHeader("Set-Cookie") as string[]) ?? []), + `${browserName}=${cookie}; Max-Age=${maxAge}; Domain=${domain}; Path=/; SameSite=${secure ? "None" : "Lax"};${ + secure ? " Secure;" : "" + }`, + `${serverName}=${cookie}; Max-Age=${maxAge}; Domain=${domain}; Path=/; SameSite=${secure ? "None" : "Lax"};${ + secure ? " Secure;" : "" + } httpOnly=true;`, + ]); + return cookie; +} + +export default async function handler(request: NextApiRequest, response: NextApiResponse) { + renewCookies(request, response, ANON_COOKIE, `${ANON_COOKIE}_srvr`, true); + renewCookies(request, response, USER_COOKIE, `${USER_COOKIE}_srvr`); + response.send("OK"); +} From c379f68860eac63104c85939472bf9833361b1f6 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 30 Jul 2024 16:51:52 +0400 Subject: [PATCH 0823/1353] console: idEndpoint: fix cookie host logic --- webapps/console/pages/api/id.ts | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/webapps/console/pages/api/id.ts b/webapps/console/pages/api/id.ts index 77790a749..6f2f0542d 100644 --- a/webapps/console/pages/api/id.ts +++ b/webapps/console/pages/api/id.ts @@ -1,13 +1,36 @@ import type { NextApiRequest, NextApiResponse } from "next"; import { randomUUID } from "crypto"; +const publicSuffixes = + "ac,com.ac,edu.ac,gov.ac,net.ac,mil.ac,org.ac,ad,nom.ad,ae,co.ae,net.ae,org.ae,sch.ae,ac.ae,gov.ae,mil.ae,aero,af,gov.af,com.af,org.af,net.af,edu.af,ag,com.ag,org.ag,net.ag,co.ag,nom.ag,ai,off.ai,com.ai,net.ai,org.ai,al,com.al,edu.al,gov.al,mil.al,net.al,org.al,am,co.am,com.am,commune.am,net.am,org.am,ao,ed.ao,gv.ao,og.ao,co.ao,pb.ao,it.ao,aq,ar,bet.ar,com.ar,coop.ar,edu.ar,gob.ar,gov.ar,int.ar,mil.ar,musica.ar,mutual.ar,net.ar,org.ar,senasa.ar,tur.ar,arpa,e164.arpa,in-addr.arpa,ip6.arpa,iris.arpa,uri.arpa,urn.arpa,as,gov.as,asia,at,ac.at,co.at,gv.at,or.at,sth.ac.at,au,com.au,net.au,org.au,edu.au,gov.au,asn.au,id.au,act.au,nsw.au,nt.au,qld.au,sa.au,tas.au,vic.au,wa.au,aw,com.aw,ax,az,com.az,net.az,int.az,gov.az,org.az,edu.az,info.az,pp.az,mil.az,name.az,pro.az,biz.az,ba,com.ba,edu.ba,gov.ba,mil.ba,net.ba,org.ba,bb,biz.bb,co.bb,com.bb,edu.bb,gov.bb,info.bb,net.bb,org.bb,store.bb,tv.bb,bd,be,ac.be,bf,gov.bf,bg,a.bg,b.bg,c.bg,d.bg,e.bg,f.bg,g.bg,h.bg,i.bg,j.bg,k.bg,l.bg,m.bg,n.bg,o.bg,p.bg,q.bg,r.bg,s.bg,t.bg,u.bg,v.bg,w.bg,x.bg,y.bg,z.bg,0.bg,1.bg,2.bg,3.bg,4.bg,5.bg,6.bg,7.bg,8.bg,9.bg,bh,com.bh,edu.bh,net.bh,org.bh,gov.bh,bi,co.bi,com.bi,edu.bi,or.bi,org.bi,biz,bj,africa.bj,agro.bj,architectes.bj,assur.bj,avocats.bj,co.bj,com.bj,eco.bj,econo.bj,edu.bj,info.bj,loisirs.bj,money.bj,net.bj,org.bj,ote.bj,resto.bj,restaurant.bj,tourism.bj,univ.bj,bm,com.bm,edu.bm,gov.bm,net.bm,org.bm,bn,com.bn,edu.bn,gov.bn,net.bn,org.bn,bo,com.bo,edu.bo,gob.bo,int.bo,org.bo,net.bo,mil.bo,tv.bo,web.bo,br,9guacu.br,abc.br,adm.br,adv.br,agr.br,aju.br,am.br,anani.br,aparecida.br,app.br,arq.br,art.br,ato.br,b.br,barueri.br,belem.br,bhz.br,bib.br,bio.br,blog.br,bmd.br,boavista.br,bsb.br,campinagrande.br,campinas.br,caxias.br,cim.br,cng.br,cnt.br,com.br,contagem.br,coop.br,coz.br,cri.br,cuiaba.br,curitiba.br,def.br,des.br,det.br,dev.br,ecn.br,eco.br,edu.br,emp.br,enf.br,eng.br,esp.br,etc.br,eti.br,far.br,feira.br,flog.br,floripa.br,fm.br,fnd.br,fortal.br,fot.br,foz.br,fst.br,g12.br,geo.br,ggf.br,goiania.br,gov.br,gru.br,imb.br,ind.br,inf.br,jab.br,jampa.br,jdf.br,joinville.br,jor.br,jus.br,leg.br,lel.br,log.br,londrina.br,macapa.br,maceio.br,manaus.br,maringa.br,mat.br,med.br,mil.br,morena.br,mp.br,mus.br,natal.br,net.br,niteroi.br,nom.br,not.br,ntr.br,odo.br,ong.br,org.br,osasco.br,palmas.br,poa.br,ppg.br,pro.br,psc.br,psi.br,pvh.br,qsl.br,radio.br,rec.br,recife.br,rep.br,ribeirao.br,rio.br,riobranco.br,riopreto.br,salvador.br,sampa.br,santamaria.br,santoandre.br,saobernardo.br,saogonca.br,seg.br,sjc.br,slg.br,slz.br,sorocaba.br,srv.br,taxi.br,tc.br,tec.br,teo.br,the.br,tmp.br,trd.br,tur.br,tv.br,udi.br,vet.br,vix.br,vlog.br,wiki.br,zlg.br,bs,com.bs,net.bs,org.bs,edu.bs,gov.bs,bt,com.bt,edu.bt,gov.bt,net.bt,org.bt,bv,bw,co.bw,org.bw,by,gov.by,mil.by,com.by,of.by,bz,com.bz,net.bz,org.bz,edu.bz,gov.bz,ca,ab.ca,bc.ca,mb.ca,nb.ca,nf.ca,nl.ca,ns.ca,nt.ca,nu.ca,on.ca,pe.ca,qc.ca,sk.ca,yk.ca,gc.ca,cat,cc,cd,gov.cd,cf,cg,ch,ci,org.ci,or.ci,com.ci,co.ci,edu.ci,ed.ci,ac.ci,net.ci,go.ci,asso.ci,aéroport.ci,int.ci,presse.ci,md.ci,gouv.ci,ck,cl,co.cl,gob.cl,gov.cl,mil.cl,cm,co.cm,com.cm,gov.cm,net.cm,cn,ac.cn,com.cn,edu.cn,gov.cn,net.cn,org.cn,mil.cn,co,arts.co,com.co,edu.co,firm.co,gov.co,info.co,int.co,mil.co,net.co,nom.co,org.co,rec.co,web.co,com,coop,cr,ac.cr,co.cr,ed.cr,fi.cr,go.cr,or.cr,sa.cr,cu,com.cu,edu.cu,org.cu,net.cu,gov.cu,inf.cu,cv,com.cv,edu.cv,int.cv,nome.cv,org.cv,cw,com.cw,edu.cw,net.cw,org.cw,cx,gov.cx,cy,ac.cy,biz.cy,com.cy,ekloges.cy,gov.cy,ltd.cy,mil.cy,net.cy,org.cy,press.cy,pro.cy,tm.cy,cz,de,dj,dk,dm,com.dm,net.dm,org.dm,edu.dm,gov.dm,do,art.do,com.do,edu.do,gob.do,gov.do,mil.do,net.do,org.do,sld.do,web.do,dz,art.dz,asso.dz,com.dz,edu.dz,gov.dz,org.dz,net.dz,pol.dz,soc.dz,tm.dz,ec,com.ec,info.ec,net.ec,fin.ec,k12.ec,med.ec,pro.ec,org.ec,edu.ec,gov.ec,gob.ec,mil.ec,edu,ee,edu.ee,gov.ee,riik.ee,lib.ee,med.ee,com.ee,pri.ee,aip.ee,org.ee,fie.ee,eg,com.eg,edu.eg,eun.eg,gov.eg,mil.eg,name.eg,net.eg,org.eg,sci.eg,er,es,com.es,nom.es,org.es,gob.es,edu.es,et,com.et,gov.et,org.et,edu.et,biz.et,name.et,info.et,net.et,eu,fi,aland.fi,fj,ac.fj,biz.fj,com.fj,gov.fj,info.fj,mil.fj,name.fj,net.fj,org.fj,pro.fj,fk,com.fm,edu.fm,net.fm,org.fm,fm,fo,fr,asso.fr,com.fr,gouv.fr,nom.fr,prd.fr,tm.fr,aeroport.fr,avocat.fr,avoues.fr,cci.fr,chambagri.fr,chirurgiens-dentistes.fr,experts-comptables.fr,geometre-expert.fr,greta.fr,huissier-justice.fr,medecin.fr,notaires.fr,pharmacien.fr,port.fr,veterinaire.fr,ga,gb,edu.gd,gov.gd,gd,ge,com.ge,edu.ge,gov.ge,org.ge,mil.ge,net.ge,pvt.ge,gf,gg,co.gg,net.gg,org.gg,gh,com.gh,edu.gh,gov.gh,org.gh,mil.gh,gi,com.gi,ltd.gi,gov.gi,mod.gi,edu.gi,org.gi,gl,co.gl,com.gl,edu.gl,net.gl,org.gl,gm,gn,ac.gn,com.gn,edu.gn,gov.gn,org.gn,net.gn,gov,gp,com.gp,net.gp,mobi.gp,edu.gp,org.gp,asso.gp,gq,gr,com.gr,edu.gr,net.gr,org.gr,gov.gr,gs,gt,com.gt,edu.gt,gob.gt,ind.gt,mil.gt,net.gt,org.gt,gu,com.gu,edu.gu,gov.gu,guam.gu,info.gu,net.gu,org.gu,web.gu,gw,gy,co.gy,com.gy,edu.gy,gov.gy,net.gy,org.gy,hk,com.hk,edu.hk,gov.hk,idv.hk,net.hk,org.hk,hm,hn,com.hn,edu.hn,org.hn,net.hn,mil.hn,gob.hn,hr,iz.hr,from.hr,name.hr,com.hr,ht,com.ht,shop.ht,firm.ht,info.ht,adult.ht,net.ht,pro.ht,org.ht,med.ht,art.ht,coop.ht,pol.ht,asso.ht,edu.ht,rel.ht,gouv.ht,perso.ht,hu,co.hu,info.hu,org.hu,priv.hu,sport.hu,tm.hu,2000.hu,agrar.hu,bolt.hu,casino.hu,city.hu,erotica.hu,erotika.hu,film.hu,forum.hu,games.hu,hotel.hu,ingatlan.hu,jogasz.hu,konyvelo.hu,lakas.hu,media.hu,news.hu,reklam.hu,sex.hu,shop.hu,suli.hu,szex.hu,tozsde.hu,utazas.hu,video.hu,id,ac.id,biz.id,co.id,desa.id,go.id,mil.id,my.id,net.id,or.id,ponpes.id,sch.id,web.id,ie,gov.ie,il,ac.il,co.il,gov.il,idf.il,k12.il,muni.il,net.il,org.il,im,ac.im,co.im,com.im,ltd.co.im,net.im,org.im,plc.co.im,tt.im,tv.im,in,5g.in,6g.in,ac.in,ai.in,am.in,bihar.in,biz.in,business.in,ca.in,cn.in,co.in,com.in,coop.in,cs.in,delhi.in,dr.in,edu.in,er.in,firm.in,gen.in,gov.in,gujarat.in,ind.in,info.in,int.in,internet.in,io.in,me.in,mil.in,net.in,nic.in,org.in,pg.in,post.in,pro.in,res.in,travel.in,tv.in,uk.in,up.in,us.in,info,int,eu.int,io,com.io,iq,gov.iq,edu.iq,mil.iq,com.iq,org.iq,net.iq,ir,ac.ir,co.ir,gov.ir,id.ir,net.ir,org.ir,sch.ir,is,net.is,com.is,edu.is,gov.is,org.is,int.is,it,gov.it,edu.it,je,co.je,net.je,org.je,jm,jo,com.jo,org.jo,net.jo,edu.jo,sch.jo,gov.jo,mil.jo,name.jo,jobs,jp,ac.jp,ad.jp,co.jp,ed.jp,go.jp,gr.jp,lg.jp,ne.jp,or.jp,ke,ac.ke,co.ke,go.ke,info.ke,me.ke,mobi.ke,ne.ke,or.ke,sc.ke,kg,org.kg,net.kg,com.kg,edu.kg,gov.kg,mil.kg,kh,ki,edu.ki,biz.ki,net.ki,org.ki,gov.ki,info.ki,com.ki,km,org.km,nom.km,gov.km,prd.km,tm.km,edu.km,mil.km,ass.km,com.km,kn,net.kn,org.kn,edu.kn,gov.kn,kp,com.kp,edu.kp,gov.kp,org.kp,rep.kp,tra.kp,kr,ac.kr,co.kr,es.kr,go.kr,hs.kr,kg.kr,mil.kr,ms.kr,ne.kr,or.kr,pe.kr,re.kr,sc.kr,kw,com.kw,edu.kw,emb.kw,gov.kw,ind.kw,net.kw,org.kw,ky,com.ky,edu.ky,net.ky,org.ky,kz,org.kz,edu.kz,net.kz,gov.kz,mil.kz,com.kz,la,int.la,net.la,info.la,edu.la,gov.la,per.la,com.la,org.la,lb,com.lb,edu.lb,gov.lb,net.lb,org.lb,lc,com.lc,net.lc,co.lc,org.lc,edu.lc,gov.lc,li,lk,gov.lk,sch.lk,net.lk,int.lk,com.lk,org.lk,edu.lk,ngo.lk,soc.lk,web.lk,ltd.lk,assn.lk,grp.lk,hotel.lk,ac.lk,lr,com.lr,edu.lr,gov.lr,org.lr,net.lr,ls,ac.ls,biz.ls,co.ls,edu.ls,gov.ls,info.ls,net.ls,org.ls,sc.ls,lt,gov.lt,lu,lv,com.lv,edu.lv,gov.lv,org.lv,mil.lv,id.lv,net.lv,asn.lv,conf.lv,ly,com.ly,net.ly,gov.ly,plc.ly,edu.ly,sch.ly,med.ly,org.ly,id.ly,ma,co.ma,net.ma,gov.ma,org.ma,ac.ma,press.ma,mc,tm.mc,asso.mc,md,me,co.me,net.me,org.me,edu.me,ac.me,gov.me,its.me,priv.me,mg,org.mg,nom.mg,gov.mg,prd.mg,tm.mg,edu.mg,mil.mg,com.mg,co.mg,mh,mil,mk,com.mk,org.mk,net.mk,edu.mk,gov.mk,inf.mk,name.mk,ml,com.ml,edu.ml,gouv.ml,gov.ml,net.ml,org.ml,presse.ml,mm,mn,gov.mn,edu.mn,org.mn,mo,com.mo,net.mo,org.mo,edu.mo,gov.mo,mobi,mp,mq,mr,gov.mr,ms,com.ms,edu.ms,gov.ms,net.ms,org.ms,mt,com.mt,edu.mt,net.mt,org.mt,mu,com.mu,net.mu,org.mu,gov.mu,ac.mu,co.mu,or.mu,museum,mv,aero.mv,biz.mv,com.mv,coop.mv,edu.mv,gov.mv,info.mv,int.mv,mil.mv,museum.mv,name.mv,net.mv,org.mv,pro.mv,mw,ac.mw,biz.mw,co.mw,com.mw,coop.mw,edu.mw,gov.mw,int.mw,museum.mw,net.mw,org.mw,mx,com.mx,org.mx,gob.mx,edu.mx,net.mx,my,biz.my,com.my,edu.my,gov.my,mil.my,name.my,net.my,org.my,mz,ac.mz,adv.mz,co.mz,edu.mz,gov.mz,mil.mz,net.mz,org.mz,na,info.na,pro.na,name.na,school.na,or.na,dr.na,us.na,mx.na,ca.na,in.na,cc.na,tv.na,ws.na,mobi.na,co.na,com.na,org.na,name,nc,asso.nc,nom.nc,ne,net,nf,com.nf,net.nf,per.nf,rec.nf,web.nf,arts.nf,firm.nf,info.nf,other.nf,store.nf,ng,com.ng,edu.ng,gov.ng,i.ng,mil.ng,mobi.ng,name.ng,net.ng,org.ng,sch.ng,ni,ac.ni,biz.ni,co.ni,com.ni,edu.ni,gob.ni,in.ni,info.ni,int.ni,mil.ni,net.ni,nom.ni,org.ni,web.ni,nl,no,fhs.no,vgs.no,fylkesbibl.no,folkebibl.no,museum.no,idrett.no,priv.no,mil.no,stat.no,dep.no,kommune.no,herad.no,np,nr,biz.nr,info.nr,gov.nr,edu.nr,org.nr,net.nr,com.nr,nu,nz,ac.nz,co.nz,cri.nz,geek.nz,gen.nz,govt.nz,health.nz,iwi.nz,kiwi.nz,maori.nz,mil.nz,māori.nz,net.nz,org.nz,parliament.nz,school.nz,om,co.om,com.om,edu.om,gov.om,med.om,museum.om,net.om,org.om,pro.om,onion,org,pa,ac.pa,gob.pa,com.pa,org.pa,sld.pa,edu.pa,net.pa,ing.pa,abo.pa,med.pa,nom.pa,pe,edu.pe,gob.pe,nom.pe,mil.pe,org.pe,com.pe,net.pe,pf,com.pf,org.pf,edu.pf,pg,ph,com.ph,net.ph,org.ph,gov.ph,edu.ph,ngo.ph,mil.ph,i.ph,pk,com.pk,net.pk,edu.pk,org.pk,fam.pk,biz.pk,web.pk,gov.pk,gob.pk,gok.pk,gon.pk,gop.pk,gos.pk,info.pk,pl,com.pl,net.pl,org.pl,aid.pl,agro.pl,atm.pl,auto.pl,biz.pl,edu.pl,gmina.pl,gsm.pl,info.pl,mail.pl,miasta.pl,media.pl,mil.pl,nieruchomosci.pl,nom.pl,pc.pl,powiat.pl,priv.pl,realestate.pl,rel.pl,sex.pl,shop.pl,sklep.pl,sos.pl,szkola.pl,targi.pl,tm.pl,tourism.pl,travel.pl,turystyka.pl,pm,pn,gov.pn,co.pn,org.pn,edu.pn,net.pn,post,pr,com.pr,net.pr,org.pr,gov.pr,edu.pr,isla.pr,pro.pr,biz.pr,info.pr,name.pr,est.pr,prof.pr,ac.pr,pro,aaa.pro,aca.pro,acct.pro,avocat.pro,bar.pro,cpa.pro,eng.pro,jur.pro,law.pro,med.pro,recht.pro,ps,edu.ps,gov.ps,sec.ps,plo.ps,com.ps,org.ps,net.ps,pt,net.pt,gov.pt,org.pt,edu.pt,int.pt,publ.pt,com.pt,nome.pt,pw,co.pw,ne.pw,or.pw,ed.pw,go.pw,belau.pw,py,com.py,coop.py,edu.py,gov.py,mil.py,net.py,org.py,qa,com.qa,edu.qa,gov.qa,mil.qa,name.qa,net.qa,org.qa,sch.qa,re,asso.re,com.re,nom.re,ro,arts.ro,com.ro,firm.ro,info.ro,nom.ro,nt.ro,org.ro,rec.ro,store.ro,tm.ro,www.ro,rs,ac.rs,co.rs,edu.rs,gov.rs,in.rs,org.rs,ru,rw,ac.rw,co.rw,coop.rw,gov.rw,mil.rw,net.rw,org.rw,sa,com.sa,net.sa,org.sa,gov.sa,med.sa,pub.sa,edu.sa,sch.sa,sb,com.sb,edu.sb,gov.sb,net.sb,org.sb,sc,com.sc,gov.sc,net.sc,org.sc,edu.sc,sd,com.sd,net.sd,org.sd,edu.sd,med.sd,tv.sd,gov.sd,info.sd,se,a.se,ac.se,b.se,bd.se,brand.se,c.se,d.se,e.se,f.se,fh.se,fhsk.se,fhv.se,g.se,h.se,i.se,k.se,komforb.se,kommunalforbund.se,komvux.se,l.se,lanbib.se,m.se,n.se,naturbruksgymn.se,o.se,org.se,p.se,parti.se,pp.se,press.se,r.se,s.se,t.se,tm.se,u.se,w.se,x.se,y.se,z.se,sg,com.sg,net.sg,org.sg,gov.sg,edu.sg,per.sg,sh,com.sh,net.sh,gov.sh,org.sh,mil.sh,si,sj,sk,sl,com.sl,net.sl,edu.sl,gov.sl,org.sl,sm,sn,art.sn,com.sn,edu.sn,gouv.sn,org.sn,perso.sn,univ.sn,so,com.so,edu.so,gov.so,me.so,net.so,org.so,sr,ss,biz.ss,com.ss,edu.ss,gov.ss,me.ss,net.ss,org.ss,sch.ss,st,co.st,com.st,consulado.st,edu.st,embaixada.st,mil.st,net.st,org.st,principe.st,saotome.st,store.st,su,sv,com.sv,edu.sv,gob.sv,org.sv,red.sv,sx,gov.sx,sy,edu.sy,gov.sy,net.sy,mil.sy,com.sy,org.sy,sz,co.sz,ac.sz,org.sz,tc,td,tel,tf,tg,th,ac.th,co.th,go.th,in.th,mi.th,net.th,or.th,tj,ac.tj,biz.tj,co.tj,com.tj,edu.tj,go.tj,gov.tj,int.tj,mil.tj,name.tj,net.tj,nic.tj,org.tj,test.tj,web.tj,tk,tl,gov.tl,tm,com.tm,co.tm,org.tm,net.tm,nom.tm,gov.tm,mil.tm,edu.tm,tn,com.tn,ens.tn,fin.tn,gov.tn,ind.tn,info.tn,intl.tn,mincom.tn,nat.tn,net.tn,org.tn,perso.tn,tourism.tn,to,com.to,gov.to,net.to,org.to,edu.to,mil.to,tr,av.tr,bbs.tr,bel.tr,biz.tr,com.tr,dr.tr,edu.tr,gen.tr,gov.tr,info.tr,mil.tr,k12.tr,kep.tr,name.tr,net.tr,org.tr,pol.tr,tel.tr,tsk.tr,tv.tr,web.tr,nc.tr,tt,co.tt,com.tt,org.tt,net.tt,biz.tt,info.tt,pro.tt,int.tt,coop.tt,jobs.tt,mobi.tt,travel.tt,museum.tt,aero.tt,name.tt,gov.tt,edu.tt,tv,tw,edu.tw,gov.tw,mil.tw,com.tw,net.tw,org.tw,idv.tw,game.tw,ebiz.tw,club.tw,tz,ac.tz,co.tz,go.tz,hotel.tz,info.tz,me.tz,mil.tz,mobi.tz,ne.tz,or.tz,sc.tz,tv.tz,ua,com.ua,edu.ua,gov.ua,in.ua,net.ua,org.ua,ug,co.ug,or.ug,ac.ug,sc.ug,go.ug,ne.ug,com.ug,org.ug,uk,ac.uk,co.uk,gov.uk,ltd.uk,me.uk,net.uk,nhs.uk,org.uk,plc.uk,police.uk,us,dni.us,fed.us,isa.us,kids.us,nsn.us,ak.us,al.us,ar.us,as.us,az.us,ca.us,co.us,ct.us,dc.us,de.us,fl.us,ga.us,gu.us,hi.us,ia.us,id.us,il.us,in.us,ks.us,ky.us,la.us,ma.us,md.us,me.us,mi.us,mn.us,mo.us,ms.us,mt.us,nc.us,nd.us,ne.us,nh.us,nj.us,nm.us,nv.us,ny.us,oh.us,ok.us,or.us,pa.us,pr.us,ri.us,sc.us,sd.us,tn.us,tx.us,ut.us,vi.us,vt.us,va.us,wa.us,wi.us,wv.us,wy.us,uy,com.uy,edu.uy,gub.uy,mil.uy,net.uy,org.uy,uz,co.uz,com.uz,net.uz,org.uz,va,vc,com.vc,net.vc,org.vc,gov.vc,mil.vc,edu.vc,ve,arts.ve,bib.ve,co.ve,com.ve,e12.ve,edu.ve,firm.ve,gob.ve,gov.ve,info.ve,int.ve,mil.ve,net.ve,nom.ve,org.ve,rar.ve,rec.ve,store.ve,tec.ve,web.ve,vg,vi,co.vi,com.vi,k12.vi,net.vi,org.vi,vn,ac.vn,ai.vn,biz.vn,com.vn,edu.vn,gov.vn,health.vn,id.vn,info.vn,int.vn,io.vn,name.vn,net.vn,org.vn,pro.vn,vu,com.vu,edu.vu,net.vu,org.vu,wf,ws,com.ws,net.ws,org.ws,gov.ws,edu.ws,yt,ye,com.ye,edu.ye,gov.ye,net.ye,mil.ye,org.ye,ac.za,agric.za,alt.za,co.za,edu.za,gov.za,grondar.za,law.za,mil.za,net.za,ngo.za,nic.za,nis.za,nom.za,org.za,school.za,tm.za,web.za,zm,ac.zm,biz.zm,co.zm,com.zm,edu.zm,gov.zm,info.zm,mil.zm,net.zm,org.zm,sch.zm,zw,ac.zw,co.zw,gov.zw,mil.zw,org.zw".split( + "," + ); +const publicSuffixesMap: Record = {}; +publicSuffixes.forEach(tld => { + publicSuffixesMap[tld] = true; +}); + const USER_COOKIE = "__eventn_uid"; const ANON_COOKIE = "__eventn_id"; function getDomain(request: NextApiRequest) { const domain = request.headers.host?.toString() ?? ""; - if (domain.startsWith("localhost")) return "localhost"; - return domain; + return getTopLevelDomain(domain); +} + +export function getTopLevelDomain(hostname: string) { + const [domain] = hostname.split(":"); + const parts = domain.split("."); + if (parts[parts.length - 1] === "localhost" || parts.length < 2) { + return parts[parts.length - 1]; + } else { + const d = parts[parts.length - 2] + "." + parts[parts.length - 1]; + if (parts.length > 2 && publicSuffixesMap[d]) { + return parts[parts.length - 3] + "." + d; + } else { + return d; + } + } } function renewCookies( From 17b595a1527b7605c83cf82fc6d14c83263998c8 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 30 Jul 2024 17:19:06 +0400 Subject: [PATCH 0824/1353] console: idEndpoint: forbid caching --- webapps/console/pages/api/id.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/webapps/console/pages/api/id.ts b/webapps/console/pages/api/id.ts index 6f2f0542d..00ca587d0 100644 --- a/webapps/console/pages/api/id.ts +++ b/webapps/console/pages/api/id.ts @@ -46,7 +46,7 @@ function renewCookies( cookie = randomUUID(); } const secure = request.headers["x-forwarded-proto"] === "https"; - const maxAge = 31_536_000; // 1 year in seconds + const maxAge = 31_536_000 * 5; // 5 years in seconds const domain = getDomain(request); response.setHeader("Set-Cookie", [ ...((response.getHeader("Set-Cookie") as string[]) ?? []), @@ -63,5 +63,6 @@ function renewCookies( export default async function handler(request: NextApiRequest, response: NextApiResponse) { renewCookies(request, response, ANON_COOKIE, `${ANON_COOKIE}_srvr`, true); renewCookies(request, response, USER_COOKIE, `${USER_COOKIE}_srvr`); + response.setHeader("Cache-Control", "must-revalidate,no-cache,no-store"); response.send("OK"); } From 19ad8f9c4d6e79e35324c00a6f3c7843515254cd Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 30 Jul 2024 17:48:54 +0400 Subject: [PATCH 0825/1353] jitsu-js: pass cookieDomain setting to idEndpoint --- libs/jitsu-js/src/analytics-plugin.ts | 6 +++++- webapps/console/pages/api/id.ts | 31 ++++++--------------------- 2 files changed, 11 insertions(+), 26 deletions(-) diff --git a/libs/jitsu-js/src/analytics-plugin.ts b/libs/jitsu-js/src/analytics-plugin.ts index a9c41217c..ee01fed8c 100644 --- a/libs/jitsu-js/src/analytics-plugin.ts +++ b/libs/jitsu-js/src/analytics-plugin.ts @@ -689,7 +689,11 @@ export const jitsuAnalyticsPlugin = (pluginConfig: JitsuPluginConfig = {}): Anal const fetch = config.fetch || globalThis.fetch; const controller = new AbortController(); setTimeout(() => controller.abort(), 1000); - const res = await fetch(config.idEndpoint, { credentials: "include", signal: controller.signal }); + const domain = config.cookieDomain || getTopLevelDomain(window.location.hostname); + const res = await fetch(config.idEndpoint + "?domain=" + encodeURIComponent(domain), { + credentials: "include", + signal: controller.signal, + }); if (!res.ok) { console.error(`[JITSU] Can't fetch idEndpoint: ${res.status} - ${res.statusText}`); } else if (config.debug) { diff --git a/webapps/console/pages/api/id.ts b/webapps/console/pages/api/id.ts index 00ca587d0..6b656c9ef 100644 --- a/webapps/console/pages/api/id.ts +++ b/webapps/console/pages/api/id.ts @@ -1,36 +1,17 @@ import type { NextApiRequest, NextApiResponse } from "next"; import { randomUUID } from "crypto"; -const publicSuffixes = - "ac,com.ac,edu.ac,gov.ac,net.ac,mil.ac,org.ac,ad,nom.ad,ae,co.ae,net.ae,org.ae,sch.ae,ac.ae,gov.ae,mil.ae,aero,af,gov.af,com.af,org.af,net.af,edu.af,ag,com.ag,org.ag,net.ag,co.ag,nom.ag,ai,off.ai,com.ai,net.ai,org.ai,al,com.al,edu.al,gov.al,mil.al,net.al,org.al,am,co.am,com.am,commune.am,net.am,org.am,ao,ed.ao,gv.ao,og.ao,co.ao,pb.ao,it.ao,aq,ar,bet.ar,com.ar,coop.ar,edu.ar,gob.ar,gov.ar,int.ar,mil.ar,musica.ar,mutual.ar,net.ar,org.ar,senasa.ar,tur.ar,arpa,e164.arpa,in-addr.arpa,ip6.arpa,iris.arpa,uri.arpa,urn.arpa,as,gov.as,asia,at,ac.at,co.at,gv.at,or.at,sth.ac.at,au,com.au,net.au,org.au,edu.au,gov.au,asn.au,id.au,act.au,nsw.au,nt.au,qld.au,sa.au,tas.au,vic.au,wa.au,aw,com.aw,ax,az,com.az,net.az,int.az,gov.az,org.az,edu.az,info.az,pp.az,mil.az,name.az,pro.az,biz.az,ba,com.ba,edu.ba,gov.ba,mil.ba,net.ba,org.ba,bb,biz.bb,co.bb,com.bb,edu.bb,gov.bb,info.bb,net.bb,org.bb,store.bb,tv.bb,bd,be,ac.be,bf,gov.bf,bg,a.bg,b.bg,c.bg,d.bg,e.bg,f.bg,g.bg,h.bg,i.bg,j.bg,k.bg,l.bg,m.bg,n.bg,o.bg,p.bg,q.bg,r.bg,s.bg,t.bg,u.bg,v.bg,w.bg,x.bg,y.bg,z.bg,0.bg,1.bg,2.bg,3.bg,4.bg,5.bg,6.bg,7.bg,8.bg,9.bg,bh,com.bh,edu.bh,net.bh,org.bh,gov.bh,bi,co.bi,com.bi,edu.bi,or.bi,org.bi,biz,bj,africa.bj,agro.bj,architectes.bj,assur.bj,avocats.bj,co.bj,com.bj,eco.bj,econo.bj,edu.bj,info.bj,loisirs.bj,money.bj,net.bj,org.bj,ote.bj,resto.bj,restaurant.bj,tourism.bj,univ.bj,bm,com.bm,edu.bm,gov.bm,net.bm,org.bm,bn,com.bn,edu.bn,gov.bn,net.bn,org.bn,bo,com.bo,edu.bo,gob.bo,int.bo,org.bo,net.bo,mil.bo,tv.bo,web.bo,br,9guacu.br,abc.br,adm.br,adv.br,agr.br,aju.br,am.br,anani.br,aparecida.br,app.br,arq.br,art.br,ato.br,b.br,barueri.br,belem.br,bhz.br,bib.br,bio.br,blog.br,bmd.br,boavista.br,bsb.br,campinagrande.br,campinas.br,caxias.br,cim.br,cng.br,cnt.br,com.br,contagem.br,coop.br,coz.br,cri.br,cuiaba.br,curitiba.br,def.br,des.br,det.br,dev.br,ecn.br,eco.br,edu.br,emp.br,enf.br,eng.br,esp.br,etc.br,eti.br,far.br,feira.br,flog.br,floripa.br,fm.br,fnd.br,fortal.br,fot.br,foz.br,fst.br,g12.br,geo.br,ggf.br,goiania.br,gov.br,gru.br,imb.br,ind.br,inf.br,jab.br,jampa.br,jdf.br,joinville.br,jor.br,jus.br,leg.br,lel.br,log.br,londrina.br,macapa.br,maceio.br,manaus.br,maringa.br,mat.br,med.br,mil.br,morena.br,mp.br,mus.br,natal.br,net.br,niteroi.br,nom.br,not.br,ntr.br,odo.br,ong.br,org.br,osasco.br,palmas.br,poa.br,ppg.br,pro.br,psc.br,psi.br,pvh.br,qsl.br,radio.br,rec.br,recife.br,rep.br,ribeirao.br,rio.br,riobranco.br,riopreto.br,salvador.br,sampa.br,santamaria.br,santoandre.br,saobernardo.br,saogonca.br,seg.br,sjc.br,slg.br,slz.br,sorocaba.br,srv.br,taxi.br,tc.br,tec.br,teo.br,the.br,tmp.br,trd.br,tur.br,tv.br,udi.br,vet.br,vix.br,vlog.br,wiki.br,zlg.br,bs,com.bs,net.bs,org.bs,edu.bs,gov.bs,bt,com.bt,edu.bt,gov.bt,net.bt,org.bt,bv,bw,co.bw,org.bw,by,gov.by,mil.by,com.by,of.by,bz,com.bz,net.bz,org.bz,edu.bz,gov.bz,ca,ab.ca,bc.ca,mb.ca,nb.ca,nf.ca,nl.ca,ns.ca,nt.ca,nu.ca,on.ca,pe.ca,qc.ca,sk.ca,yk.ca,gc.ca,cat,cc,cd,gov.cd,cf,cg,ch,ci,org.ci,or.ci,com.ci,co.ci,edu.ci,ed.ci,ac.ci,net.ci,go.ci,asso.ci,aéroport.ci,int.ci,presse.ci,md.ci,gouv.ci,ck,cl,co.cl,gob.cl,gov.cl,mil.cl,cm,co.cm,com.cm,gov.cm,net.cm,cn,ac.cn,com.cn,edu.cn,gov.cn,net.cn,org.cn,mil.cn,co,arts.co,com.co,edu.co,firm.co,gov.co,info.co,int.co,mil.co,net.co,nom.co,org.co,rec.co,web.co,com,coop,cr,ac.cr,co.cr,ed.cr,fi.cr,go.cr,or.cr,sa.cr,cu,com.cu,edu.cu,org.cu,net.cu,gov.cu,inf.cu,cv,com.cv,edu.cv,int.cv,nome.cv,org.cv,cw,com.cw,edu.cw,net.cw,org.cw,cx,gov.cx,cy,ac.cy,biz.cy,com.cy,ekloges.cy,gov.cy,ltd.cy,mil.cy,net.cy,org.cy,press.cy,pro.cy,tm.cy,cz,de,dj,dk,dm,com.dm,net.dm,org.dm,edu.dm,gov.dm,do,art.do,com.do,edu.do,gob.do,gov.do,mil.do,net.do,org.do,sld.do,web.do,dz,art.dz,asso.dz,com.dz,edu.dz,gov.dz,org.dz,net.dz,pol.dz,soc.dz,tm.dz,ec,com.ec,info.ec,net.ec,fin.ec,k12.ec,med.ec,pro.ec,org.ec,edu.ec,gov.ec,gob.ec,mil.ec,edu,ee,edu.ee,gov.ee,riik.ee,lib.ee,med.ee,com.ee,pri.ee,aip.ee,org.ee,fie.ee,eg,com.eg,edu.eg,eun.eg,gov.eg,mil.eg,name.eg,net.eg,org.eg,sci.eg,er,es,com.es,nom.es,org.es,gob.es,edu.es,et,com.et,gov.et,org.et,edu.et,biz.et,name.et,info.et,net.et,eu,fi,aland.fi,fj,ac.fj,biz.fj,com.fj,gov.fj,info.fj,mil.fj,name.fj,net.fj,org.fj,pro.fj,fk,com.fm,edu.fm,net.fm,org.fm,fm,fo,fr,asso.fr,com.fr,gouv.fr,nom.fr,prd.fr,tm.fr,aeroport.fr,avocat.fr,avoues.fr,cci.fr,chambagri.fr,chirurgiens-dentistes.fr,experts-comptables.fr,geometre-expert.fr,greta.fr,huissier-justice.fr,medecin.fr,notaires.fr,pharmacien.fr,port.fr,veterinaire.fr,ga,gb,edu.gd,gov.gd,gd,ge,com.ge,edu.ge,gov.ge,org.ge,mil.ge,net.ge,pvt.ge,gf,gg,co.gg,net.gg,org.gg,gh,com.gh,edu.gh,gov.gh,org.gh,mil.gh,gi,com.gi,ltd.gi,gov.gi,mod.gi,edu.gi,org.gi,gl,co.gl,com.gl,edu.gl,net.gl,org.gl,gm,gn,ac.gn,com.gn,edu.gn,gov.gn,org.gn,net.gn,gov,gp,com.gp,net.gp,mobi.gp,edu.gp,org.gp,asso.gp,gq,gr,com.gr,edu.gr,net.gr,org.gr,gov.gr,gs,gt,com.gt,edu.gt,gob.gt,ind.gt,mil.gt,net.gt,org.gt,gu,com.gu,edu.gu,gov.gu,guam.gu,info.gu,net.gu,org.gu,web.gu,gw,gy,co.gy,com.gy,edu.gy,gov.gy,net.gy,org.gy,hk,com.hk,edu.hk,gov.hk,idv.hk,net.hk,org.hk,hm,hn,com.hn,edu.hn,org.hn,net.hn,mil.hn,gob.hn,hr,iz.hr,from.hr,name.hr,com.hr,ht,com.ht,shop.ht,firm.ht,info.ht,adult.ht,net.ht,pro.ht,org.ht,med.ht,art.ht,coop.ht,pol.ht,asso.ht,edu.ht,rel.ht,gouv.ht,perso.ht,hu,co.hu,info.hu,org.hu,priv.hu,sport.hu,tm.hu,2000.hu,agrar.hu,bolt.hu,casino.hu,city.hu,erotica.hu,erotika.hu,film.hu,forum.hu,games.hu,hotel.hu,ingatlan.hu,jogasz.hu,konyvelo.hu,lakas.hu,media.hu,news.hu,reklam.hu,sex.hu,shop.hu,suli.hu,szex.hu,tozsde.hu,utazas.hu,video.hu,id,ac.id,biz.id,co.id,desa.id,go.id,mil.id,my.id,net.id,or.id,ponpes.id,sch.id,web.id,ie,gov.ie,il,ac.il,co.il,gov.il,idf.il,k12.il,muni.il,net.il,org.il,im,ac.im,co.im,com.im,ltd.co.im,net.im,org.im,plc.co.im,tt.im,tv.im,in,5g.in,6g.in,ac.in,ai.in,am.in,bihar.in,biz.in,business.in,ca.in,cn.in,co.in,com.in,coop.in,cs.in,delhi.in,dr.in,edu.in,er.in,firm.in,gen.in,gov.in,gujarat.in,ind.in,info.in,int.in,internet.in,io.in,me.in,mil.in,net.in,nic.in,org.in,pg.in,post.in,pro.in,res.in,travel.in,tv.in,uk.in,up.in,us.in,info,int,eu.int,io,com.io,iq,gov.iq,edu.iq,mil.iq,com.iq,org.iq,net.iq,ir,ac.ir,co.ir,gov.ir,id.ir,net.ir,org.ir,sch.ir,is,net.is,com.is,edu.is,gov.is,org.is,int.is,it,gov.it,edu.it,je,co.je,net.je,org.je,jm,jo,com.jo,org.jo,net.jo,edu.jo,sch.jo,gov.jo,mil.jo,name.jo,jobs,jp,ac.jp,ad.jp,co.jp,ed.jp,go.jp,gr.jp,lg.jp,ne.jp,or.jp,ke,ac.ke,co.ke,go.ke,info.ke,me.ke,mobi.ke,ne.ke,or.ke,sc.ke,kg,org.kg,net.kg,com.kg,edu.kg,gov.kg,mil.kg,kh,ki,edu.ki,biz.ki,net.ki,org.ki,gov.ki,info.ki,com.ki,km,org.km,nom.km,gov.km,prd.km,tm.km,edu.km,mil.km,ass.km,com.km,kn,net.kn,org.kn,edu.kn,gov.kn,kp,com.kp,edu.kp,gov.kp,org.kp,rep.kp,tra.kp,kr,ac.kr,co.kr,es.kr,go.kr,hs.kr,kg.kr,mil.kr,ms.kr,ne.kr,or.kr,pe.kr,re.kr,sc.kr,kw,com.kw,edu.kw,emb.kw,gov.kw,ind.kw,net.kw,org.kw,ky,com.ky,edu.ky,net.ky,org.ky,kz,org.kz,edu.kz,net.kz,gov.kz,mil.kz,com.kz,la,int.la,net.la,info.la,edu.la,gov.la,per.la,com.la,org.la,lb,com.lb,edu.lb,gov.lb,net.lb,org.lb,lc,com.lc,net.lc,co.lc,org.lc,edu.lc,gov.lc,li,lk,gov.lk,sch.lk,net.lk,int.lk,com.lk,org.lk,edu.lk,ngo.lk,soc.lk,web.lk,ltd.lk,assn.lk,grp.lk,hotel.lk,ac.lk,lr,com.lr,edu.lr,gov.lr,org.lr,net.lr,ls,ac.ls,biz.ls,co.ls,edu.ls,gov.ls,info.ls,net.ls,org.ls,sc.ls,lt,gov.lt,lu,lv,com.lv,edu.lv,gov.lv,org.lv,mil.lv,id.lv,net.lv,asn.lv,conf.lv,ly,com.ly,net.ly,gov.ly,plc.ly,edu.ly,sch.ly,med.ly,org.ly,id.ly,ma,co.ma,net.ma,gov.ma,org.ma,ac.ma,press.ma,mc,tm.mc,asso.mc,md,me,co.me,net.me,org.me,edu.me,ac.me,gov.me,its.me,priv.me,mg,org.mg,nom.mg,gov.mg,prd.mg,tm.mg,edu.mg,mil.mg,com.mg,co.mg,mh,mil,mk,com.mk,org.mk,net.mk,edu.mk,gov.mk,inf.mk,name.mk,ml,com.ml,edu.ml,gouv.ml,gov.ml,net.ml,org.ml,presse.ml,mm,mn,gov.mn,edu.mn,org.mn,mo,com.mo,net.mo,org.mo,edu.mo,gov.mo,mobi,mp,mq,mr,gov.mr,ms,com.ms,edu.ms,gov.ms,net.ms,org.ms,mt,com.mt,edu.mt,net.mt,org.mt,mu,com.mu,net.mu,org.mu,gov.mu,ac.mu,co.mu,or.mu,museum,mv,aero.mv,biz.mv,com.mv,coop.mv,edu.mv,gov.mv,info.mv,int.mv,mil.mv,museum.mv,name.mv,net.mv,org.mv,pro.mv,mw,ac.mw,biz.mw,co.mw,com.mw,coop.mw,edu.mw,gov.mw,int.mw,museum.mw,net.mw,org.mw,mx,com.mx,org.mx,gob.mx,edu.mx,net.mx,my,biz.my,com.my,edu.my,gov.my,mil.my,name.my,net.my,org.my,mz,ac.mz,adv.mz,co.mz,edu.mz,gov.mz,mil.mz,net.mz,org.mz,na,info.na,pro.na,name.na,school.na,or.na,dr.na,us.na,mx.na,ca.na,in.na,cc.na,tv.na,ws.na,mobi.na,co.na,com.na,org.na,name,nc,asso.nc,nom.nc,ne,net,nf,com.nf,net.nf,per.nf,rec.nf,web.nf,arts.nf,firm.nf,info.nf,other.nf,store.nf,ng,com.ng,edu.ng,gov.ng,i.ng,mil.ng,mobi.ng,name.ng,net.ng,org.ng,sch.ng,ni,ac.ni,biz.ni,co.ni,com.ni,edu.ni,gob.ni,in.ni,info.ni,int.ni,mil.ni,net.ni,nom.ni,org.ni,web.ni,nl,no,fhs.no,vgs.no,fylkesbibl.no,folkebibl.no,museum.no,idrett.no,priv.no,mil.no,stat.no,dep.no,kommune.no,herad.no,np,nr,biz.nr,info.nr,gov.nr,edu.nr,org.nr,net.nr,com.nr,nu,nz,ac.nz,co.nz,cri.nz,geek.nz,gen.nz,govt.nz,health.nz,iwi.nz,kiwi.nz,maori.nz,mil.nz,māori.nz,net.nz,org.nz,parliament.nz,school.nz,om,co.om,com.om,edu.om,gov.om,med.om,museum.om,net.om,org.om,pro.om,onion,org,pa,ac.pa,gob.pa,com.pa,org.pa,sld.pa,edu.pa,net.pa,ing.pa,abo.pa,med.pa,nom.pa,pe,edu.pe,gob.pe,nom.pe,mil.pe,org.pe,com.pe,net.pe,pf,com.pf,org.pf,edu.pf,pg,ph,com.ph,net.ph,org.ph,gov.ph,edu.ph,ngo.ph,mil.ph,i.ph,pk,com.pk,net.pk,edu.pk,org.pk,fam.pk,biz.pk,web.pk,gov.pk,gob.pk,gok.pk,gon.pk,gop.pk,gos.pk,info.pk,pl,com.pl,net.pl,org.pl,aid.pl,agro.pl,atm.pl,auto.pl,biz.pl,edu.pl,gmina.pl,gsm.pl,info.pl,mail.pl,miasta.pl,media.pl,mil.pl,nieruchomosci.pl,nom.pl,pc.pl,powiat.pl,priv.pl,realestate.pl,rel.pl,sex.pl,shop.pl,sklep.pl,sos.pl,szkola.pl,targi.pl,tm.pl,tourism.pl,travel.pl,turystyka.pl,pm,pn,gov.pn,co.pn,org.pn,edu.pn,net.pn,post,pr,com.pr,net.pr,org.pr,gov.pr,edu.pr,isla.pr,pro.pr,biz.pr,info.pr,name.pr,est.pr,prof.pr,ac.pr,pro,aaa.pro,aca.pro,acct.pro,avocat.pro,bar.pro,cpa.pro,eng.pro,jur.pro,law.pro,med.pro,recht.pro,ps,edu.ps,gov.ps,sec.ps,plo.ps,com.ps,org.ps,net.ps,pt,net.pt,gov.pt,org.pt,edu.pt,int.pt,publ.pt,com.pt,nome.pt,pw,co.pw,ne.pw,or.pw,ed.pw,go.pw,belau.pw,py,com.py,coop.py,edu.py,gov.py,mil.py,net.py,org.py,qa,com.qa,edu.qa,gov.qa,mil.qa,name.qa,net.qa,org.qa,sch.qa,re,asso.re,com.re,nom.re,ro,arts.ro,com.ro,firm.ro,info.ro,nom.ro,nt.ro,org.ro,rec.ro,store.ro,tm.ro,www.ro,rs,ac.rs,co.rs,edu.rs,gov.rs,in.rs,org.rs,ru,rw,ac.rw,co.rw,coop.rw,gov.rw,mil.rw,net.rw,org.rw,sa,com.sa,net.sa,org.sa,gov.sa,med.sa,pub.sa,edu.sa,sch.sa,sb,com.sb,edu.sb,gov.sb,net.sb,org.sb,sc,com.sc,gov.sc,net.sc,org.sc,edu.sc,sd,com.sd,net.sd,org.sd,edu.sd,med.sd,tv.sd,gov.sd,info.sd,se,a.se,ac.se,b.se,bd.se,brand.se,c.se,d.se,e.se,f.se,fh.se,fhsk.se,fhv.se,g.se,h.se,i.se,k.se,komforb.se,kommunalforbund.se,komvux.se,l.se,lanbib.se,m.se,n.se,naturbruksgymn.se,o.se,org.se,p.se,parti.se,pp.se,press.se,r.se,s.se,t.se,tm.se,u.se,w.se,x.se,y.se,z.se,sg,com.sg,net.sg,org.sg,gov.sg,edu.sg,per.sg,sh,com.sh,net.sh,gov.sh,org.sh,mil.sh,si,sj,sk,sl,com.sl,net.sl,edu.sl,gov.sl,org.sl,sm,sn,art.sn,com.sn,edu.sn,gouv.sn,org.sn,perso.sn,univ.sn,so,com.so,edu.so,gov.so,me.so,net.so,org.so,sr,ss,biz.ss,com.ss,edu.ss,gov.ss,me.ss,net.ss,org.ss,sch.ss,st,co.st,com.st,consulado.st,edu.st,embaixada.st,mil.st,net.st,org.st,principe.st,saotome.st,store.st,su,sv,com.sv,edu.sv,gob.sv,org.sv,red.sv,sx,gov.sx,sy,edu.sy,gov.sy,net.sy,mil.sy,com.sy,org.sy,sz,co.sz,ac.sz,org.sz,tc,td,tel,tf,tg,th,ac.th,co.th,go.th,in.th,mi.th,net.th,or.th,tj,ac.tj,biz.tj,co.tj,com.tj,edu.tj,go.tj,gov.tj,int.tj,mil.tj,name.tj,net.tj,nic.tj,org.tj,test.tj,web.tj,tk,tl,gov.tl,tm,com.tm,co.tm,org.tm,net.tm,nom.tm,gov.tm,mil.tm,edu.tm,tn,com.tn,ens.tn,fin.tn,gov.tn,ind.tn,info.tn,intl.tn,mincom.tn,nat.tn,net.tn,org.tn,perso.tn,tourism.tn,to,com.to,gov.to,net.to,org.to,edu.to,mil.to,tr,av.tr,bbs.tr,bel.tr,biz.tr,com.tr,dr.tr,edu.tr,gen.tr,gov.tr,info.tr,mil.tr,k12.tr,kep.tr,name.tr,net.tr,org.tr,pol.tr,tel.tr,tsk.tr,tv.tr,web.tr,nc.tr,tt,co.tt,com.tt,org.tt,net.tt,biz.tt,info.tt,pro.tt,int.tt,coop.tt,jobs.tt,mobi.tt,travel.tt,museum.tt,aero.tt,name.tt,gov.tt,edu.tt,tv,tw,edu.tw,gov.tw,mil.tw,com.tw,net.tw,org.tw,idv.tw,game.tw,ebiz.tw,club.tw,tz,ac.tz,co.tz,go.tz,hotel.tz,info.tz,me.tz,mil.tz,mobi.tz,ne.tz,or.tz,sc.tz,tv.tz,ua,com.ua,edu.ua,gov.ua,in.ua,net.ua,org.ua,ug,co.ug,or.ug,ac.ug,sc.ug,go.ug,ne.ug,com.ug,org.ug,uk,ac.uk,co.uk,gov.uk,ltd.uk,me.uk,net.uk,nhs.uk,org.uk,plc.uk,police.uk,us,dni.us,fed.us,isa.us,kids.us,nsn.us,ak.us,al.us,ar.us,as.us,az.us,ca.us,co.us,ct.us,dc.us,de.us,fl.us,ga.us,gu.us,hi.us,ia.us,id.us,il.us,in.us,ks.us,ky.us,la.us,ma.us,md.us,me.us,mi.us,mn.us,mo.us,ms.us,mt.us,nc.us,nd.us,ne.us,nh.us,nj.us,nm.us,nv.us,ny.us,oh.us,ok.us,or.us,pa.us,pr.us,ri.us,sc.us,sd.us,tn.us,tx.us,ut.us,vi.us,vt.us,va.us,wa.us,wi.us,wv.us,wy.us,uy,com.uy,edu.uy,gub.uy,mil.uy,net.uy,org.uy,uz,co.uz,com.uz,net.uz,org.uz,va,vc,com.vc,net.vc,org.vc,gov.vc,mil.vc,edu.vc,ve,arts.ve,bib.ve,co.ve,com.ve,e12.ve,edu.ve,firm.ve,gob.ve,gov.ve,info.ve,int.ve,mil.ve,net.ve,nom.ve,org.ve,rar.ve,rec.ve,store.ve,tec.ve,web.ve,vg,vi,co.vi,com.vi,k12.vi,net.vi,org.vi,vn,ac.vn,ai.vn,biz.vn,com.vn,edu.vn,gov.vn,health.vn,id.vn,info.vn,int.vn,io.vn,name.vn,net.vn,org.vn,pro.vn,vu,com.vu,edu.vu,net.vu,org.vu,wf,ws,com.ws,net.ws,org.ws,gov.ws,edu.ws,yt,ye,com.ye,edu.ye,gov.ye,net.ye,mil.ye,org.ye,ac.za,agric.za,alt.za,co.za,edu.za,gov.za,grondar.za,law.za,mil.za,net.za,ngo.za,nic.za,nis.za,nom.za,org.za,school.za,tm.za,web.za,zm,ac.zm,biz.zm,co.zm,com.zm,edu.zm,gov.zm,info.zm,mil.zm,net.zm,org.zm,sch.zm,zw,ac.zw,co.zw,gov.zw,mil.zw,org.zw".split( - "," - ); -const publicSuffixesMap: Record = {}; -publicSuffixes.forEach(tld => { - publicSuffixesMap[tld] = true; -}); - const USER_COOKIE = "__eventn_uid"; const ANON_COOKIE = "__eventn_id"; function getDomain(request: NextApiRequest) { - const domain = request.headers.host?.toString() ?? ""; - return getTopLevelDomain(domain); -} - -export function getTopLevelDomain(hostname: string) { - const [domain] = hostname.split(":"); - const parts = domain.split("."); - if (parts[parts.length - 1] === "localhost" || parts.length < 2) { - return parts[parts.length - 1]; - } else { - const d = parts[parts.length - 2] + "." + parts[parts.length - 1]; - if (parts.length > 2 && publicSuffixesMap[d]) { - return parts[parts.length - 3] + "." + d; - } else { - return d; - } + let domain = request.query.domain; + if (domain) { + return domain; } + domain = request.headers.host?.toString() ?? ""; + if (domain.startsWith("localhost")) return "localhost"; + return domain; } function renewCookies( From 10d6fb3e3004b84245a5d698a404aca851c026d0 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 31 Jul 2024 13:34:52 +0400 Subject: [PATCH 0826/1353] upgrade next.js to 14.2.5 (#1115) upgrade typescript, react, antd,... fixes --- cli/build-scripts/package.json | 4 +- cli/jitsu-cli/package.json | 4 +- e2e/package.json | 2 +- examples/react-app/package.json | 13 +- libs/core-functions/package.json | 2 +- libs/functions/package.json | 2 +- libs/jitsu-js/package.json | 2 +- libs/jitsu-react/package.json | 2 +- libs/jsondiffpatch/package.json | 4 +- libs/juava/package.json | 2 +- package.json | 4 +- pnpm-lock.yaml | 21867 +++++++--------- services/rotor/package.json | 30 +- services/rotor/src/lib/rotor.ts | 2 +- services/rotor/tsconfig.json | 4 +- .../components/Billing/BillingManager.tsx | 2 +- .../components/ButtonGroup/ButtonGroup.tsx | 6 +- .../components/ButtonLabel/ButtonLabel.tsx | 10 +- .../ConfigObjectEditor/ConfigEditor.tsx | 2 +- .../components/JitsuButton/JitsuButton.tsx | 1 - .../PageLayout/WorkspacePageLayout.tsx | 2 +- webapps/console/next.config.js | 7 +- webapps/console/package.json | 31 +- webapps/console/pages/[workspaceId]/index.tsx | 2 +- .../pages/[workspaceId]/settings/index.tsx | 4 +- webapps/ee-api/package.json | 18 +- 26 files changed, 9653 insertions(+), 12376 deletions(-) diff --git a/cli/build-scripts/package.json b/cli/build-scripts/package.json index a0676c6ba..a94d5a8f7 100644 --- a/cli/build-scripts/package.json +++ b/cli/build-scripts/package.json @@ -21,11 +21,11 @@ "semver": "^7.5.4", "simple-git": "^3.22.0", "string-width": "^7.0.0", - "tslib": "^2.6.2" + "tslib": "^2.6.3" }, "devDependencies": { "commander": "^11.0.0", - "@types/node": "^20.10.8", + "@types/node": "^18.15.3", "@types/semver": "^7.5.6", "@babel/preset-env": "^7.23.2", "@babel/preset-typescript": "^7.23.2", diff --git a/cli/jitsu-cli/package.json b/cli/jitsu-cli/package.json index 142968e87..58cea0b08 100644 --- a/cli/jitsu-cli/package.json +++ b/cli/jitsu-cli/package.json @@ -24,8 +24,8 @@ "dependencies": { "figlet": "^1.6.0", "jest-cli": "^29.7.0", - "tslib": "^2.6.2", - "typescript": "^5.4.5" + "tslib": "^2.6.3", + "typescript": "^5.5.4" }, "devDependencies": { "@babel/preset-env": "^7.23.2", diff --git a/e2e/package.json b/e2e/package.json index ce6ca277a..181b1fd8f 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -23,6 +23,6 @@ "node-postgres": "^0.6.2", "testcontainers": "^9.0.0", "ts-jest": "29.0.5", - "tslib": "^2.4.0" + "tslib": "^2.6.3" } } diff --git a/examples/react-app/package.json b/examples/react-app/package.json index 296cba268..161cdcf94 100644 --- a/examples/react-app/package.json +++ b/examples/react-app/package.json @@ -6,9 +6,10 @@ "@jitsu/jitsu-react": "workspace:*", "@types/node": "^18.15.3", "lodash": "^4.17.21", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-router-dom": "^6.4.3", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router": "^6.25.1", + "react-router-dom": "^6.25.1", "react-scripts": "^5.0.1", "web-vitals": "^2.1.4" }, @@ -29,9 +30,9 @@ ] }, "devDependencies": { - "typescript": "^5.3.3", - "@types/react-dom": "18.0.11", - "@types/react": "18.0.28", + "typescript": "^5.5.4", + "@types/react-dom": "^18.3.0", + "@types/react": "^18.3.3", "@types/lodash": "^4.14.185", "tailwindcss": "^3.0.24" } diff --git a/libs/core-functions/package.json b/libs/core-functions/package.json index b1b9d593d..bc9e377e2 100644 --- a/libs/core-functions/package.json +++ b/libs/core-functions/package.json @@ -47,7 +47,7 @@ "node-cache": "^5.1.2", "parse-duration": "^1.1.0", "posthog-node": "^2.4.0", - "tslib": "^2.4.0", + "tslib": "^2.6.3", "zod": "3.21.4" } } diff --git a/libs/functions/package.json b/libs/functions/package.json index 9ebc6590c..11cf70506 100644 --- a/libs/functions/package.json +++ b/libs/functions/package.json @@ -25,6 +25,6 @@ }, "dependencies": { "lodash": "^4.17.21", - "tslib": "^2.4.0" + "tslib": "^2.6.3" } } diff --git a/libs/jitsu-js/package.json b/libs/jitsu-js/package.json index 0792a9dad..b29af8ecb 100644 --- a/libs/jitsu-js/package.json +++ b/libs/jitsu-js/package.json @@ -42,7 +42,7 @@ "raw-loader": "^4.0.2", "rollup": "^3.2.5", "ts-jest": "29.0.5", - "typescript": "^5.3.3", + "typescript": "^5.5.4", "jsondiffpatch": "workspace:*" }, "dependencies": { diff --git a/libs/jitsu-react/package.json b/libs/jitsu-react/package.json index f27fccd36..05189c4a3 100644 --- a/libs/jitsu-react/package.json +++ b/libs/jitsu-react/package.json @@ -36,7 +36,7 @@ "@types/jest": "^29.2.3", "@types/node": "^18.15.3", "microbundle-crl": "^0.13.11", - "typescript": "^5.3.3", + "typescript": "^5.5.4", "@babel/plugin-transform-regenerator": "^7.22.10" }, "files": [ diff --git a/libs/jsondiffpatch/package.json b/libs/jsondiffpatch/package.json index dea74be0d..2f3f0f25c 100644 --- a/libs/jsondiffpatch/package.json +++ b/libs/jsondiffpatch/package.json @@ -39,8 +39,8 @@ "eslint-config-prettier": "^9.1.0", "jest": "^29.7.0", "ts-jest": "^29.1.1", - "tslib": "^2.6.2", - "typescript": "~5.3.2" + "tslib": "^2.6.3", + "typescript": "^5.5.4" }, "license": "MIT", "engines": { diff --git a/libs/juava/package.json b/libs/juava/package.json index 9d75b8007..2685dca6c 100644 --- a/libs/juava/package.json +++ b/libs/juava/package.json @@ -23,6 +23,6 @@ }, "dependencies": { "lodash": "^4.17.21", - "tslib": "^2.4.0" + "tslib": "^2.6.3" } } diff --git a/package.json b/package.json index 133e7a5d3..ae8378a98 100644 --- a/package.json +++ b/package.json @@ -35,9 +35,9 @@ "husky": "^8.0.3", "monorel": "0.4.2", "prettier": "^2.8.7", - "ts-node": "~10.8.2", + "ts-node": "^10.9.2", "turbo": "~1.2.16", - "typescript": "^5.3.3", + "typescript": "^5.5.4", "vercel": "^32.3.1" }, "engines": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 096eee9d5..e899f9227 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,19 +22,19 @@ importers: version: 0.4.2 prettier: specifier: ^2.8.7 - version: 2.8.7 + version: 2.8.8 ts-node: - specifier: ~10.8.2 - version: 10.8.2(@types/node@20.14.2)(typescript@5.3.3) + specifier: ^10.9.2 + version: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) turbo: specifier: ~1.2.16 version: 1.2.16 typescript: - specifier: ^5.3.3 - version: 5.3.3 + specifier: ^5.5.4 + version: 5.5.4 vercel: specifier: ^32.3.1 - version: 32.3.1 + version: 32.7.2 cli/build-scripts: dependencies: @@ -46,63 +46,63 @@ importers: version: 2.0.20 semver: specifier: ^7.5.4 - version: 7.5.4 + version: 7.6.3 simple-git: specifier: ^3.22.0 - version: 3.22.0 + version: 3.25.0 string-width: specifier: ^7.0.0 - version: 7.0.0 + version: 7.2.0 tslib: - specifier: ^2.6.2 - version: 2.6.2 + specifier: ^2.6.3 + version: 2.6.3 devDependencies: '@babel/preset-env': specifier: ^7.23.2 - version: 7.23.2(@babel/core@7.21.4) + version: 7.25.2(@babel/core@7.25.2) '@babel/preset-typescript': specifier: ^7.23.2 - version: 7.23.2(@babel/core@7.21.4) + version: 7.24.7(@babel/core@7.25.2) '@types/node': - specifier: ^20.10.8 - version: 20.10.8 + specifier: ^18.15.3 + version: 18.19.42 '@types/semver': specifier: ^7.5.6 - version: 7.5.6 + version: 7.5.8 babel-loader: specifier: ^9.1.3 - version: 9.1.3(@babel/core@7.21.4)(webpack@5.91.0) + version: 9.1.3(@babel/core@7.25.2)(webpack@5.93.0) commander: specifier: ^11.0.0 - version: 11.0.0 + version: 11.1.0 juava: specifier: workspace:* version: link:../../libs/juava webpack: specifier: ^5.91.0 - version: 5.91.0(webpack-cli@5.1.4) + version: 5.93.0(webpack-cli@5.1.4) cli/jitsu-cli: dependencies: figlet: specifier: ^1.6.0 - version: 1.6.0 + version: 1.7.0 jest-cli: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.15.11)(ts-node@10.9.2) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) tslib: - specifier: ^2.6.2 - version: 2.6.2 + specifier: ^2.6.3 + version: 2.6.3 typescript: - specifier: ^5.4.5 - version: 5.4.5 + specifier: ^5.5.4 + version: 5.5.4 devDependencies: '@babel/preset-env': specifier: ^7.23.2 - version: 7.23.2(@babel/core@7.21.4) + version: 7.25.2(@babel/core@7.25.2) '@babel/preset-typescript': specifier: ^7.23.2 - version: 7.23.2(@babel/core@7.21.4) + version: 7.24.7(@babel/core@7.25.2) '@jitsu/functions-lib': specifier: workspace:* version: link:../../libs/functions @@ -111,19 +111,19 @@ importers: version: link:../../types/protocols '@rollup/plugin-commonjs': specifier: ^25.0.4 - version: 25.0.4(rollup@3.29.1) + version: 25.0.8(rollup@3.29.4) '@rollup/plugin-json': specifier: ^6.0.0 - version: 6.0.0(rollup@3.29.1) + version: 6.1.0(rollup@3.29.4) '@rollup/plugin-node-resolve': specifier: ^15.2.1 - version: 15.2.1(rollup@3.29.1) + version: 15.2.3(rollup@3.29.4) '@rollup/plugin-terser': specifier: ^0.4.3 - version: 0.4.3(rollup@3.29.1) + version: 0.4.4(rollup@3.29.4) '@rollup/plugin-typescript': specifier: ^11.1.3 - version: 11.1.3(rollup@3.29.1)(tslib@2.6.2)(typescript@5.4.5) + version: 11.1.6(rollup@3.29.4)(tslib@2.6.3)(typescript@5.5.4) '@types/chalk': specifier: ^2.2.0 version: 2.2.0 @@ -132,34 +132,34 @@ importers: version: 2.12.2 '@types/express': specifier: ^4.17.17 - version: 4.17.17 + version: 4.17.21 '@types/inquirer': specifier: ^9.0.3 - version: 9.0.3 + version: 9.0.7 '@types/jest': specifier: ^29.5.5 - version: 29.5.5 + version: 29.5.12 '@types/lodash': specifier: ^4.14.198 - version: 4.14.198 + version: 4.17.7 '@types/node': specifier: ^18.15.3 - version: 18.15.11 + version: 18.19.42 '@types/webpack': specifier: ^5.28.5 version: 5.28.5(webpack-cli@5.1.4) '@webpack-cli/generators': specifier: ^3.0.7 - version: 3.0.7(mem-fs-editor@9.7.0)(mem-fs@2.3.0)(prettier@2.8.7)(webpack-cli@5.1.4)(webpack@5.91.0) + version: 3.0.7(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0) babel-loader: specifier: ^9.1.3 - version: 9.1.3(@babel/core@7.21.4)(webpack@5.91.0) + version: 9.1.3(@babel/core@7.25.2)(webpack@5.93.0) chalk: specifier: ^5.3.0 version: 5.3.0 commander: specifier: ^11.0.0 - version: 11.0.0 + version: 11.1.0 cross-fetch: specifier: ^4.0.0 version: 4.0.0 @@ -171,10 +171,10 @@ importers: version: 1.8.1 inquirer: specifier: ^9.2.11 - version: 9.2.11 + version: 9.3.6 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.15.11)(ts-node@10.9.2) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) json5: specifier: ^2.2.3 version: 2.2.3 @@ -189,52 +189,52 @@ importers: version: 3.3.2 node-loader: specifier: ^2.0.0 - version: 2.0.0(webpack@5.91.0) + version: 2.0.0(webpack@5.93.0) prismjs: specifier: ^1.29.0 version: 1.29.0 rollup: specifier: ^3.29.1 - version: 3.29.1 + version: 3.29.4 semver: specifier: ^7.5.4 - version: 7.5.4 + version: 7.6.3 ts-jest: specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.21.4)(jest@29.7.0)(typescript@5.4.5) + version: 29.2.3(@babel/core@7.25.2)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.5.4) ts-loader: specifier: ^9.4.4 - version: 9.4.4(typescript@5.4.5)(webpack@5.91.0) + version: 9.5.1(typescript@5.5.4)(webpack@5.93.0) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@18.15.11)(typescript@5.4.5) + version: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) webpack: specifier: ^5.91.0 - version: 5.91.0(webpack-cli@5.1.4) + version: 5.93.0(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 - version: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.91.0) + version: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) e2e: devDependencies: '@jest/globals': specifier: ^29.3.1 - version: 29.5.0 + version: 29.7.0 '@jitsu-internal/console': specifier: workspace:* version: link:../webapps/console '@types/jest': specifier: ^29.1.1 - version: 29.5.0 + version: 29.5.12 find-free-port: specifier: ^2.0.0 version: 2.0.0 ioredis: specifier: ^5.3.2 - version: 5.3.2 + version: 5.4.1 jest: specifier: ^29.3.1 - version: 29.5.0(@types/node@20.14.2)(ts-node@10.8.2) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) json5: specifier: ^2.1.0 version: 2.2.3 @@ -246,13 +246,13 @@ importers: version: 0.6.2 testcontainers: specifier: ^9.0.0 - version: 9.4.0 + version: 9.12.0 ts-jest: specifier: 29.0.5 - version: 29.0.5(@babel/core@7.21.4)(jest@29.5.0)(typescript@5.4.5) + version: 29.0.5(@babel/core@7.25.2)(jest@29.7.0)(typescript@5.5.4) tslib: - specifier: ^2.4.0 - version: 2.5.0 + specifier: ^2.6.3 + version: 2.6.3 examples/react-app: dependencies: @@ -261,41 +261,44 @@ importers: version: link:../../libs/jitsu-react '@types/node': specifier: ^18.15.3 - version: 18.15.11 + version: 18.19.42 lodash: specifier: ^4.17.21 version: 4.17.21 react: - specifier: ^18.2.0 - version: 18.2.0 + specifier: ^18.3.1 + version: 18.3.1 react-dom: - specifier: ^18.2.0 - version: 18.2.0(react@18.2.0) + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + react-router: + specifier: ^6.25.1 + version: 6.25.1(react@18.3.1) react-router-dom: - specifier: ^6.4.3 - version: 6.10.0(react-dom@18.2.0)(react@18.2.0) + specifier: ^6.25.1 + version: 6.25.1(react-dom@18.3.1)(react@18.3.1) react-scripts: specifier: ^5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.55.0)(react@18.2.0)(ts-node@10.8.2)(typescript@5.3.3) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0)(react@18.3.1)(ts-node@10.9.2)(typescript@5.5.4) web-vitals: specifier: ^2.1.4 version: 2.1.4 devDependencies: '@types/lodash': specifier: ^4.14.185 - version: 4.14.192 + version: 4.17.7 '@types/react': - specifier: 18.0.28 - version: 18.0.28 + specifier: ^18.3.3 + version: 18.3.3 '@types/react-dom': - specifier: 18.0.11 - version: 18.0.11 + specifier: ^18.3.0 + version: 18.3.0 tailwindcss: specifier: ^3.0.24 - version: 3.3.1(postcss@8.4.31)(ts-node@10.8.2) + version: 3.4.7(ts-node@10.9.2) typescript: - specifier: ^5.3.3 - version: 5.3.3 + specifier: ^5.5.4 + version: 5.5.4 libs/core-functions: dependencies: @@ -313,13 +316,13 @@ importers: version: 4.3.0 dayjs: specifier: ^1.11.10 - version: 1.11.10 + version: 1.11.12 google-ads-api: specifier: ^16.0.0-rest-beta3 version: 16.0.0-rest-beta3 ioredis: specifier: ^5.3.2 - version: 5.3.2 + version: 5.4.1 isolated-vm: specifier: 5.0.1 version: 5.0.1 @@ -331,7 +334,7 @@ importers: version: 4.17.21 mongodb: specifier: ^6.7.0 - version: 6.7.0(@mongodb-js/zstd@1.2.0) + version: 6.8.0(@mongodb-js/zstd@1.2.0) node-cache: specifier: ^5.1.2 version: 5.1.2 @@ -342,8 +345,8 @@ importers: specifier: ^2.4.0 version: 2.6.0 tslib: - specifier: ^2.4.0 - version: 2.5.0 + specifier: ^2.6.3 + version: 2.6.3 zod: specifier: 3.21.4 version: 3.21.4 @@ -359,28 +362,28 @@ importers: version: 3.1.5 '@types/jest': specifier: ^29.1.1 - version: 29.5.0 + version: 29.5.12 '@types/lodash': specifier: ^4.14.185 - version: 4.14.192 + version: 4.17.7 '@types/node': specifier: ^18.15.3 - version: 18.15.11 + version: 18.19.42 express: specifier: ^4.18.2 - version: 4.18.2 + version: 4.19.2 jest: specifier: ^29.5.0 - version: 29.5.0(@types/node@18.15.11)(ts-node@10.8.2) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) json5: specifier: ^2.1.0 version: 2.2.3 node-fetch-commonjs: specifier: ^3.2.4 - version: 3.3.1 + version: 3.3.2 ts-jest: specifier: 29.0.5 - version: 29.0.5(@babel/core@7.21.4)(jest@29.5.0)(typescript@5.4.5) + version: 29.0.5(@babel/core@7.25.2)(jest@29.7.0)(typescript@5.5.4) libs/functions: dependencies: @@ -388,33 +391,33 @@ importers: specifier: ^4.17.21 version: 4.17.21 tslib: - specifier: ^2.4.0 - version: 2.6.2 + specifier: ^2.6.3 + version: 2.6.3 devDependencies: '@rollup/plugin-typescript': specifier: ^11.1.5 - version: 11.1.5(rollup@4.1.4)(tslib@2.6.2)(typescript@5.4.5) + version: 11.1.6(rollup@4.19.1)(tslib@2.6.3)(typescript@5.5.4) '@types/jest': specifier: ^29.1.1 - version: 29.5.5 + version: 29.5.12 '@types/node': specifier: ^18.15.3 - version: 18.15.11 + version: 18.19.42 jest: specifier: ^29.1.2 - version: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) rollup: specifier: ^4.1.4 - version: 4.1.4 + version: 4.19.1 ts-jest: specifier: 29.0.5 - version: 29.0.5(@babel/core@7.21.4)(jest@29.7.0)(typescript@5.4.5) + version: 29.0.5(@babel/core@7.25.2)(jest@29.7.0)(typescript@5.5.4) libs/jitsu-js: dependencies: analytics: specifier: 0.8.9 - version: 0.8.9(@types/dlv@1.1.2) + version: 0.8.9(@types/dlv@1.1.4) devDependencies: '@jitsu/protocols': specifier: workspace:* @@ -424,34 +427,34 @@ importers: version: 1.39.0 '@rollup/plugin-commonjs': specifier: ^23.0.2 - version: 23.0.7(rollup@3.20.2) + version: 23.0.7(rollup@3.29.4) '@rollup/plugin-json': specifier: ^5.0.1 - version: 5.0.2(rollup@3.20.2) + version: 5.0.2(rollup@3.29.4) '@rollup/plugin-multi-entry': specifier: ^6.0.0 - version: 6.0.0(rollup@3.20.2) + version: 6.0.1(rollup@3.29.4) '@rollup/plugin-node-resolve': specifier: ^15.0.1 - version: 15.0.2(rollup@3.20.2) + version: 15.2.3(rollup@3.29.4) '@rollup/plugin-replace': specifier: ^5.0.1 - version: 5.0.2(rollup@3.20.2) + version: 5.0.7(rollup@3.29.4) '@rollup/plugin-terser': specifier: ^0.1.0 - version: 0.1.0(rollup@3.20.2) + version: 0.1.0(rollup@3.29.4) '@segment/analytics-next': specifier: ^1.46.0 - version: 1.51.3 + version: 1.72.1 '@types/chalk': specifier: ^2.2.0 version: 2.2.0 '@types/jest': specifier: ^29.2.0 - version: 29.5.0 + version: 29.5.12 '@types/node': specifier: ^18.15.3 - version: 18.15.11 + version: 18.19.42 chalk: specifier: ^4.1.2 version: 4.1.2 @@ -460,34 +463,34 @@ importers: version: 1.4.6 ejs: specifier: ^3.1.8 - version: 3.1.9 + version: 3.1.10 express: specifier: ^4.18.2 - version: 4.18.2 + version: 4.19.2 jest: specifier: ^29.2.2 - version: 29.5.0(@types/node@18.15.11)(ts-node@10.8.2) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) jsondiffpatch: specifier: workspace:* version: link:../jsondiffpatch node-fetch-commonjs: specifier: ^3.2.4 - version: 3.2.4 + version: 3.3.2 node-forge: specifier: ^1.3.1 version: 1.3.1 raw-loader: specifier: ^4.0.2 - version: 4.0.2(webpack@5.91.0) + version: 4.0.2(webpack@5.93.0) rollup: specifier: ^3.2.5 - version: 3.20.2 + version: 3.29.4 ts-jest: specifier: 29.0.5 - version: 29.0.5(@babel/core@7.21.4)(jest@29.5.0)(typescript@5.3.3) + version: 29.0.5(@babel/core@7.25.2)(jest@29.7.0)(typescript@5.5.4) typescript: - specifier: ^5.3.3 - version: 5.3.3 + specifier: ^5.5.4 + version: 5.5.4 libs/jitsu-react: dependencies: @@ -496,32 +499,32 @@ importers: version: link:../jitsu-js '@types/react': specifier: 15.x || 16.x || 17.x || 18.x - version: 18.0.28 + version: 18.3.3 react: specifier: 15.x || 16.x || 17.x || 18.x - version: 18.2.0 + version: 18.3.1 react-router-dom: specifier: 5.x || 6.x - version: 6.10.0(react-dom@18.2.0)(react@18.2.0) + version: 6.25.1(react-dom@18.3.1)(react@18.3.1) devDependencies: '@babel/plugin-transform-regenerator': specifier: ^7.22.10 - version: 7.22.10(@babel/core@7.21.4) + version: 7.24.7(@babel/core@7.25.2) '@testing-library/jest-dom': specifier: ^6.1.3 - version: 6.1.3(@types/jest@29.5.0) + version: 6.4.8 '@testing-library/react': specifier: ^13.4.0 - version: 13.4.0(react-dom@18.2.0)(react@18.2.0) + version: 13.4.0(react-dom@18.3.1)(react@18.3.1) '@testing-library/user-event': specifier: ^14.4.3 - version: 14.4.3(@testing-library/dom@9.2.0) + version: 14.5.2(@testing-library/dom@10.4.0) '@types/jest': specifier: ^29.2.3 - version: 29.5.0 + version: 29.5.12 '@types/node': specifier: ^18.15.3 - version: 18.15.11 + version: 18.19.42 microbundle-crl: specifier: ^0.13.11 version: 0.13.11 @@ -529,38 +532,38 @@ importers: specifier: ^9.6.0 version: 9.6.0 typescript: - specifier: ^5.3.3 - version: 5.3.3 + specifier: ^5.5.4 + version: 5.5.4 libs/jsondiffpatch: devDependencies: '@types/jest': specifier: ^29.5.10 - version: 29.5.11 + version: 29.5.12 '@typescript-eslint/eslint-plugin': specifier: ^6.13.1 - version: 6.13.1(@typescript-eslint/parser@6.13.1)(eslint@8.55.0)(typescript@5.3.3) + version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/parser': specifier: ^6.13.1 - version: 6.13.1(eslint@8.55.0)(typescript@5.3.3) + version: 6.21.0(eslint@8.57.0)(typescript@5.5.4) eslint: specifier: ^8.55.0 - version: 8.55.0 + version: 8.57.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.55.0) + version: 9.1.0(eslint@8.57.0) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.14.2)(ts-node@10.8.2) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) ts-jest: specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.21.4)(jest@29.7.0)(typescript@5.3.3) + version: 29.2.3(@babel/core@7.25.2)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.5.4) tslib: - specifier: ^2.6.2 - version: 2.6.2 + specifier: ^2.6.3 + version: 2.6.3 typescript: - specifier: ~5.3.2 - version: 5.3.3 + specifier: ^5.5.4 + version: 5.5.4 libs/juava: dependencies: @@ -568,21 +571,21 @@ importers: specifier: ^4.17.21 version: 4.17.21 tslib: - specifier: ^2.4.0 - version: 2.5.0 + specifier: ^2.6.3 + version: 2.6.3 devDependencies: '@types/jest': specifier: ^29.1.1 - version: 29.5.0 + version: 29.5.12 '@types/node': specifier: ^18.15.3 - version: 18.15.11 + version: 18.19.42 jest: specifier: ^29.1.2 - version: 29.5.0(@types/node@18.15.11)(ts-node@10.8.2) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) ts-jest: specifier: 29.0.5 - version: 29.0.5(@babel/core@7.21.4)(jest@29.5.0)(typescript@5.4.5) + version: 29.0.5(@babel/core@7.25.2)(jest@29.7.0)(typescript@5.5.4) services/rotor: dependencies: @@ -591,7 +594,7 @@ importers: version: 0.7.33 '@aws-sdk/client-s3': specifier: ^3.614.0 - version: 3.614.0 + version: 3.621.0 '@clickhouse/client': specifier: ^0.2.10 version: 0.2.10 @@ -612,16 +615,16 @@ importers: version: 2.7.2 dayjs: specifier: ^1.11.10 - version: 1.11.10 + version: 1.11.12 express: specifier: ^4.18.2 - version: 4.18.2 + version: 4.19.2 glob: specifier: ^8.0.3 version: 8.1.0 ioredis: specifier: ^5.3.2 - version: 5.3.2 + version: 5.4.1 json-grab: specifier: 0.1.0-alpha.2 version: 0.1.0-alpha.2 @@ -648,7 +651,7 @@ importers: version: 5.1.2 node-fetch-commonjs: specifier: ^3.3.1 - version: 3.3.1 + version: 3.3.2 object-hash: specifier: ^3.0.0 version: 3.0.0 @@ -657,32 +660,32 @@ importers: version: 6.6.2 pg: specifier: ^8.11.3 - version: 8.11.3 + version: 8.11.6 pg-cursor: specifier: ~2.10.1 - version: 2.10.1(pg@8.11.3) + version: 2.10.6(pg@8.11.6) prom-client: specifier: ^14.2.0 version: 14.2.0 semver: specifier: ^7.5.4 - version: 7.5.4 + version: 7.6.3 tar: specifier: ^6.2.0 - version: 6.2.0 + version: 6.2.1 tslib: - specifier: ^2.4.0 - version: 2.5.0 + specifier: ^2.6.3 + version: 2.6.3 devDependencies: '@babel/preset-env': - specifier: ^7.23.2 - version: 7.23.2(@babel/core@7.21.4) + specifier: ^7.25.2 + version: 7.25.2(@babel/core@7.25.2) '@babel/preset-react': - specifier: ^7.22.15 - version: 7.22.15(@babel/core@7.21.4) + specifier: ^7.24.7 + version: 7.24.7(@babel/core@7.25.2) '@babel/preset-typescript': - specifier: ^7.23.2 - version: 7.23.2(@babel/core@7.21.4) + specifier: ^7.24.7 + version: 7.24.7(@babel/core@7.25.2) '@jest/globals': specifier: ^29.7.0 version: 29.7.0 @@ -694,46 +697,46 @@ importers: version: link:../../types/protocols '@rollup/plugin-babel': specifier: ^6.0.4 - version: 6.0.4(@babel/core@7.21.4)(rollup@3.20.2) + version: 6.0.4(@babel/core@7.25.2)(rollup@4.19.1) '@rollup/plugin-commonjs': - specifier: ^23.0.2 - version: 23.0.7(rollup@3.20.2) + specifier: ^26.0.1 + version: 26.0.1(rollup@4.19.1) '@rollup/plugin-json': - specifier: ^5.0.1 - version: 5.0.2(rollup@3.20.2) + specifier: ^6.1.0 + version: 6.1.0(rollup@4.19.1) '@rollup/plugin-multi-entry': - specifier: ^6.0.0 - version: 6.0.0(rollup@3.20.2) + specifier: ^6.0.1 + version: 6.0.1(rollup@4.19.1) '@rollup/plugin-node-resolve': - specifier: ^15.0.1 - version: 15.0.2(rollup@3.20.2) + specifier: ^15.2.3 + version: 15.2.3(rollup@4.19.1) '@rollup/plugin-terser': - specifier: ^0.1.0 - version: 0.1.0(rollup@3.20.2) + specifier: ^0.4.4 + version: 0.4.4(rollup@4.19.1) '@rollup/plugin-typescript': - specifier: ^9.0.2 - version: 9.0.2(rollup@3.20.2)(tslib@2.5.0)(typescript@5.3.3) + specifier: ^11.1.6 + version: 11.1.6(rollup@4.19.1)(tslib@2.6.3)(typescript@5.5.4) '@types/express': specifier: ^4.17.13 - version: 4.17.17 + version: 4.17.21 '@types/glob': specifier: ^8.0.0 version: 8.1.0 '@types/jest': specifier: ^29.5.11 - version: 29.5.11 + version: 29.5.12 '@types/lodash': specifier: ^4.14.200 - version: 4.14.200 + version: 4.17.7 '@types/minimist': specifier: ^1.2.2 - version: 1.2.2 + version: 1.2.5 '@types/node': specifier: ^18.15.3 - version: 18.15.11 + version: 18.19.42 '@types/pg': specifier: ^8.6.5 - version: 8.6.6 + version: 8.11.6 '@types/web': specifier: 0.0.69 version: 0.0.69 @@ -742,16 +745,16 @@ importers: version: 5.28.5(webpack-cli@5.1.4) '@webpack-cli/generators': specifier: ^3.0.7 - version: 3.0.7(mem-fs-editor@9.7.0)(mem-fs@2.3.0)(prettier@2.8.7)(webpack-cli@5.1.4)(webpack@5.91.0) + version: 3.0.7(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0) babel-loader: specifier: ^9.1.3 - version: 9.1.3(@babel/core@7.21.4)(webpack@5.91.0) + version: 9.1.3(@babel/core@7.25.2)(webpack@5.93.0) clean-webpack-plugin: specifier: ^4.0.0 - version: 4.0.0(webpack@5.91.0) + version: 4.0.0(webpack@5.93.0) copy-webpack-plugin: specifier: ^12.0.2 - version: 12.0.2(webpack@5.91.0) + version: 12.0.2(webpack@5.93.0) declaration-bundler-webpack-plugin: specifier: ^1.0.3 version: 1.0.3 @@ -760,40 +763,40 @@ importers: version: 6.0.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.15.11)(ts-node@10.9.1) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) lodash: specifier: ^4.17.21 version: 4.17.21 node-loader: specifier: ^2.0.0 - version: 2.0.0(webpack@5.91.0) + version: 2.0.0(webpack@5.93.0) nodemon: specifier: ^2.0.20 - version: 2.0.20 + version: 2.0.22 rollup: - specifier: ^3.2.5 - version: 3.20.2 + specifier: ^4.19.1 + version: 4.19.1 ts-jest: - specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.21.4)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.3.3) + specifier: ^29.2.3 + version: 29.2.3(@babel/core@7.25.2)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.5.4) ts-loader: specifier: ^9.4.2 - version: 9.4.2(typescript@5.3.3)(webpack@5.91.0) + version: 9.5.1(typescript@5.5.4)(webpack@5.93.0) ts-node: - specifier: ~10.9.1 - version: 10.9.1(@types/node@18.15.11)(typescript@5.3.3) + specifier: ^10.9.2 + version: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) ts-node-dev: specifier: ^2.0.0 - version: 2.0.0(@types/node@18.15.11)(typescript@5.3.3) + version: 2.0.0(@types/node@18.19.42)(typescript@5.5.4) typescript: - specifier: ^5.3.3 - version: 5.3.3 + specifier: ^5.5.4 + version: 5.5.4 webpack: - specifier: ^5.91.0 - version: 5.91.0(webpack-cli@5.1.4) + specifier: ^5.93.0 + version: 5.93.0(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 - version: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.91.0) + version: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) types/protocols: {} @@ -801,22 +804,22 @@ importers: dependencies: '@ant-design/cssinjs': specifier: ^1.5.6 - version: 1.8.1(react-dom@18.2.0)(react@18.2.0) + version: 1.21.0(react-dom@18.3.1)(react@18.3.1) '@clickhouse/client': specifier: ^0.2.10 version: 0.2.10 '@dnd-kit/core': specifier: ^6.0.8 - version: 6.0.8(react-dom@18.2.0)(react@18.2.0) + version: 6.1.0(react-dom@18.3.1)(react@18.3.1) '@dnd-kit/modifiers': specifier: ^6.0.1 - version: 6.0.1(@dnd-kit/core@6.0.8)(react@18.2.0) + version: 6.0.1(@dnd-kit/core@6.1.0)(react@18.3.1) '@dnd-kit/sortable': specifier: ^7.0.2 - version: 7.0.2(@dnd-kit/core@6.0.8)(react@18.2.0) + version: 7.0.2(@dnd-kit/core@6.1.0)(react@18.3.1) '@dnd-kit/utilities': specifier: ^3.2.1 - version: 3.2.1(react@18.2.0) + version: 3.2.2(react@18.3.1) '@fontsource/inter': specifier: ^4.5.13 version: 4.5.15 @@ -825,7 +828,7 @@ importers: version: 4.5.10 '@google-cloud/scheduler': specifier: ^4.0.0 - version: 4.0.0 + version: 4.3.0 '@jitsu/core-functions': specifier: workspace:* version: link:../../libs/core-functions @@ -843,40 +846,37 @@ importers: version: link:../../types/protocols '@loadable/component': specifier: ^5.15.3 - version: 5.15.3(react@18.2.0) + version: 5.16.4(react@18.3.1) '@monaco-editor/react': specifier: ^4.6.0 - version: 4.6.0(monaco-editor@0.50.0)(react-dom@18.2.0)(react@18.2.0) + version: 4.6.0(monaco-editor@0.50.0)(react-dom@18.3.1)(react@18.3.1) '@nangohq/frontend': specifier: ^0.21.11 - version: 0.21.11 + version: 0.21.17 '@prisma/client': - specifier: ^4.12.0 - version: 4.12.0(prisma@5.7.1) - '@prisma/extension-read-replicas': - specifier: ^0.3.0 - version: 0.3.0(@prisma/client@4.12.0) + specifier: ^5.17.0 + version: 5.17.0(prisma@5.17.0) '@rjsf/antd': - specifier: 5.10.0 - version: 5.10.0(@ant-design/icons@5.0.1)(@rjsf/core@5.10.0)(@rjsf/utils@5.10.0)(antd@5.4.2)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) + specifier: ^5.19.4 + version: 5.19.4(@ant-design/icons@5.4.0)(@rjsf/core@5.10.0)(@rjsf/utils@5.10.0)(antd@5.19.4)(dayjs@1.11.12)(react-dom@18.3.1)(react@18.3.1) '@rjsf/core': specifier: 5.10.0 - version: 5.10.0(@rjsf/utils@5.10.0)(react@18.2.0) + version: 5.10.0(@rjsf/utils@5.10.0)(react@18.3.1) '@rjsf/utils': specifier: 5.10.0 - version: 5.10.0(react@18.2.0) + version: 5.10.0(react@18.3.1) '@rjsf/validator-ajv6': specifier: 5.10.0 version: 5.10.0(@rjsf/utils@5.10.0) '@sentry/nextjs': specifier: ^7.70.0 - version: 7.70.0(next@13.5.6)(react@18.2.0)(webpack@5.91.0) + version: 7.118.0(next@14.2.5)(react@18.3.1)(webpack@5.93.0) '@tanstack/react-query': specifier: ^4.2.1 - version: 4.29.1(react-dom@18.2.0)(react@18.2.0) + version: 4.36.1(react-dom@18.3.1)(react@18.3.1) '@types/cookie': specifier: ^0.5.1 - version: 0.5.1 + version: 0.5.4 '@types/pg-promise': specifier: ^5.4.3 version: 5.4.3 @@ -888,10 +888,10 @@ importers: version: 8.12.0 chart.js: specifier: ^4.4.1 - version: 4.4.1 + version: 4.4.3 classnames: specifier: ^2.3.1 - version: 2.3.2 + version: 2.5.1 cookie: specifier: ^0.5.0 version: 0.5.0 @@ -900,16 +900,16 @@ importers: version: 2.1.8 dayjs: specifier: ^1.11.10 - version: 1.11.10 + version: 1.11.12 facebook-nodejs-business-sdk: specifier: ^19.0.0 - version: 19.0.0 + version: 19.0.3 firebase: specifier: ^10.4.0 - version: 10.4.0 + version: 10.12.4 firebase-admin: specifier: ^11.11.0 - version: 11.11.0 + version: 11.11.1 google-ads-api: specifier: ^16.0.0-rest-beta3 version: 16.0.0-rest-beta3 @@ -918,10 +918,10 @@ importers: version: 126.0.1 highlight.js: specifier: ^11.6.0 - version: 11.7.0 + version: 11.10.0 ioredis: specifier: ^5.3.2 - version: 5.3.2 + version: 5.4.1 js-yaml: specifier: ^4.1.0 version: 4.1.0 @@ -942,61 +942,61 @@ importers: version: 4.17.21 lucide-react: specifier: ^0.263.1 - version: 0.263.1(react@18.2.0) + version: 0.263.1(react@18.3.1) mjml: specifier: ^4.13.0 - version: 4.14.1 + version: 4.15.3 mjml-react: specifier: ^2.0.8 - version: 2.0.8(mjml@4.14.1)(react-dom@18.2.0)(react@18.2.0) + version: 2.0.8(mjml@4.15.3)(react-dom@18.3.1)(react@18.3.1) monaco-editor: specifier: ^0.50.0 version: 0.50.0 next: - specifier: ^13.5.6 - version: 13.5.6(@babel/core@7.21.4)(react-dom@18.2.0)(react@18.2.0) + specifier: ^14.2.5 + version: 14.2.5(@babel/core@7.25.2)(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1) next-auth: specifier: ^4.23.2 - version: 4.23.2(next@13.5.6)(nodemailer@6.9.1)(react-dom@18.2.0)(react@18.2.0) + version: 4.24.7(next@14.2.5)(nodemailer@6.9.14)(react-dom@18.3.1)(react@18.3.1) node-fetch-commonjs: specifier: ^3.2.4 - version: 3.2.4 + version: 3.3.2 node-sql-parser: specifier: ^4.6.5 - version: 4.6.6 + version: 4.18.0 nodemailer: specifier: ^6.8.0 - version: 6.9.1 + version: 6.9.14 object-hash: specifier: ^3.0.0 version: 3.0.0 pg: specifier: ~8.11.3 - version: 8.11.3 + version: 8.11.6 pg-cursor: specifier: ~2.10.1 - version: 2.10.1(pg@8.11.3) + version: 2.10.6(pg@8.11.6) prisma: - specifier: ^5.7.1 - version: 5.7.1 + specifier: ^5.17.0 + version: 5.17.0 react: - specifier: ^18.2.0 - version: 18.2.0 + specifier: ^18.3.1 + version: 18.3.1 react-dom: - specifier: ^18.2.0 - version: 18.2.0(react@18.2.0) + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) react-icons: specifier: ^4.10.1 - version: 4.10.1(react@18.2.0) + version: 4.12.0(react@18.3.1) react-json-view: specifier: ^1.19.1 - version: 1.21.3(@types/react@18.0.28)(react-dom@18.2.0)(react@18.2.0) + version: 1.21.3(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) react-use: specifier: ^17.4.0 - version: 17.4.0(react-dom@18.2.0)(react@18.2.0) + version: 17.5.1(react-dom@18.3.1)(react@18.3.1) recharts: specifier: ^2.10.4 - version: 2.10.4(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0) + version: 2.12.7(react-dom@18.3.1)(react@18.3.1) stable-hash: specifier: 0.0.3 version: 0.0.3 @@ -1005,10 +1005,10 @@ importers: version: 1.1.0 timezones-list: specifier: ^3.0.2 - version: 3.0.2 + version: 3.0.3 tslib: - specifier: ^2.4.0 - version: 2.5.0 + specifier: ^2.6.3 + version: 2.6.3 zod: specifier: 3.21.4 version: 3.21.4 @@ -1017,56 +1017,56 @@ importers: version: 3.21.4(zod@3.21.4) devDependencies: '@ant-design/icons': - specifier: ^5.0.1 - version: 5.0.1(react-dom@18.2.0)(react@18.2.0) + specifier: ^5.4.0 + version: 5.4.0(react-dom@18.3.1)(react@18.3.1) '@tailwindcss/typography': specifier: ^0.5.7 - version: 0.5.9(tailwindcss@3.3.1) + version: 0.5.13(tailwindcss@3.4.7) '@testing-library/jest-dom': specifier: ^6.1.3 - version: 6.1.3(jest@28.1.3) + version: 6.4.8 '@testing-library/react': specifier: ^13.1.1 - version: 13.4.0(react-dom@18.2.0)(react@18.2.0) + version: 13.4.0(react-dom@18.3.1)(react@18.3.1) '@types/cli-progress': specifier: ^3.11.0 - version: 3.11.0 + version: 3.11.6 '@types/firebase': specifier: ^3.2.1 version: 3.2.1 '@types/js-yaml': specifier: ^4.0.5 - version: 4.0.5 + version: 4.0.9 '@types/lodash': specifier: ^4.14.185 - version: 4.14.192 + version: 4.17.7 '@types/node': specifier: ^18.15.3 - version: 18.15.11 + version: 18.19.42 '@types/nodemailer': specifier: ^6.4.6 - version: 6.4.7 + version: 6.4.15 '@types/pg': specifier: ^8.6.5 - version: 8.6.6 + version: 8.11.6 '@types/pg-query-stream': specifier: ^3.4.0 - version: 3.4.0(pg@8.11.3) + version: 3.4.0(pg@8.11.6) '@types/react': - specifier: 18.0.28 - version: 18.0.28 + specifier: 18.3.3 + version: 18.3.3 '@types/react-dom': - specifier: 18.0.11 - version: 18.0.11 + specifier: 18.3.0 + version: 18.3.0 ansi-to-html: specifier: ^0.7.2 version: 0.7.2 antd: - specifier: ^5.2.1 - version: 5.4.2(react-dom@18.2.0)(react@18.2.0) + specifier: ^5.19.4 + version: 5.19.4(react-dom@18.3.1)(react@18.3.1) autoprefixer: specifier: ^10.4.5 - version: 10.4.14(postcss@8.4.30) + version: 10.4.19(postcss@8.4.40) dotenv-cli: specifier: ^6.0.0 version: 6.0.0 @@ -1074,20 +1074,20 @@ importers: specifier: 8.24.0 version: 8.24.0 eslint-config-next: - specifier: ^13.3.0 - version: 13.3.0(eslint@8.24.0)(typescript@5.3.3) + specifier: ^14.2.5 + version: 14.2.5(eslint@8.24.0)(typescript@5.5.4) eslint-plugin-unused-imports: specifier: ^2.0.0 version: 2.0.0(eslint@8.24.0) jest: specifier: ^28.0.0 - version: 28.1.3(@types/node@18.15.11)(ts-node@10.8.2) + version: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2) less: specifier: ^4.1.2 - version: 4.1.3 + version: 4.2.0 less-loader: specifier: ^10.2.0 - version: 10.2.0(less@4.1.3)(webpack@5.91.0) + version: 10.2.0(less@4.2.0)(webpack@5.93.0) minimist: specifier: ^1.2.7 version: 1.2.8 @@ -1096,58 +1096,58 @@ importers: version: 10.0.1 postcss: specifier: ^8.4.30 - version: 8.4.30 + version: 8.4.40 raw-loader: specifier: ^4.0.2 - version: 4.0.2(webpack@5.91.0) + version: 4.0.2(webpack@5.93.0) tailwindcss: specifier: ^3.0.24 - version: 3.3.1(postcss@8.4.30)(ts-node@10.8.2) + version: 3.4.7(ts-node@10.9.2) ts-node: - specifier: ~10.8.1 - version: 10.8.2(@types/node@18.15.11)(typescript@5.3.3) + specifier: ^10.9.2 + version: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) type-fest: specifier: ^3.5.7 - version: 3.8.0 + version: 3.13.1 typescript: - specifier: ^5.3.3 - version: 5.3.3 + specifier: ^5.5.4 + version: 5.5.4 zod-prisma: - specifier: 0.5.4 - version: 0.5.4(prisma@5.7.1)(zod@3.21.4) + specifier: ^0.5.4 + version: 0.5.4(prisma@5.17.0)(zod@3.21.4) webapps/ee-api: dependencies: '@aws-sdk/client-s3': specifier: ^3.418.0 - version: 3.418.0 + version: 3.621.0 '@clickhouse/client': specifier: ^0.2.10 version: 0.2.10 '@types/node': specifier: ^18.15.3 - version: 18.15.11 + version: 18.19.42 '@types/react': - specifier: 18.0.28 - version: 18.0.28 + specifier: 18.3.3 + version: 18.3.3 '@types/react-dom': - specifier: 18.0.11 - version: 18.0.11 + specifier: 18.3.0 + version: 18.3.0 crypto-js: specifier: ^4.1.1 - version: 4.1.1 + version: 4.2.0 dayjs: specifier: ^1.11.10 - version: 1.11.10 + version: 1.11.12 eslint: specifier: 8.29.0 version: 8.29.0 eslint-config-next: - specifier: 13.0.0 - version: 13.0.0(eslint@8.29.0)(typescript@5.3.3) + specifier: 14.2.5 + version: 14.2.5(eslint@8.29.0)(typescript@5.5.4) firebase-admin: specifier: ^11.11.0 - version: 11.11.0 + version: 11.11.1 intercom-client: specifier: ^4.0.0 version: 4.0.0 @@ -1167,78 +1167,78 @@ importers: specifier: ^4.17.21 version: 4.17.21 next: - specifier: ^13.5.6 - version: 13.5.6(@babel/core@7.21.4)(react-dom@18.2.0)(react@18.2.0) + specifier: ^14.2.5 + version: 14.2.5(@babel/core@7.25.2)(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1) node-fetch-commonjs: specifier: ^3.2.4 - version: 3.2.4 + version: 3.3.2 pg: specifier: ^8.11.3 - version: 8.11.3 + version: 8.11.6 react: - specifier: 18.2.0 - version: 18.2.0 + specifier: 18.3.1 + version: 18.3.1 react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) + specifier: 18.3.1 + version: 18.3.1(react@18.3.1) stripe: specifier: ^11.15.0 version: 11.18.0 tslib: - specifier: ^2.4.0 - version: 2.5.0 + specifier: ^2.6.3 + version: 2.6.3 devDependencies: '@types/crypto-js': specifier: ^4.1.1 - version: 4.1.1 + version: 4.2.2 '@types/jsonwebtoken': specifier: ^9.0.3 - version: 9.0.3 + version: 9.0.6 '@types/lodash': specifier: ^4.14.185 - version: 4.14.192 + version: 4.17.7 '@types/pg': specifier: ^8.6.5 - version: 8.6.6 + version: 8.11.6 '@types/stripe': specifier: ^8.0.417 version: 8.0.417 dotenv: specifier: ^16.3.1 - version: 16.3.1 + version: 16.4.5 next-transpile-modules: specifier: ^10.0.1 version: 10.0.1 raw-loader: specifier: ^4.0.2 - version: 4.0.2(webpack@5.91.0) + version: 4.0.2(webpack@5.93.0) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@18.15.11)(typescript@5.3.3) + version: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) typescript: - specifier: ^5.3.3 - version: 5.3.3 + specifier: ^5.5.4 + version: 5.5.4 packages: - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - - /@adobe/css-tools@4.3.1: - resolution: {integrity: sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==} + /@adobe/css-tools@4.4.0: + resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} dev: true + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + /@amplitude/ua-parser-js@0.7.33: resolution: {integrity: sha512-wKEtVR4vXuPT9cVEIJkYWnlF++Gx3BdLatPBM+SZ1ztVIvnhdGBZR/mn9x/PzyrMcRlZmyi6L56I2J3doVBnjA==} dev: false - /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 /@analytics/cookie-utils@0.2.12: resolution: {integrity: sha512-2h/yuIu3kmu+ZJlKmlT6GoRvUEY2k1BbQBezEv5kGhnn9KpmzPz715Y3GmM2i+m7Y0QmBdVUoA260dQZkofs2A==} @@ -1246,12 +1246,12 @@ packages: '@analytics/global-storage-utils': 0.1.7 dev: false - /@analytics/core@0.12.7(@types/dlv@1.1.2): - resolution: {integrity: sha512-etmIPCoxWLoUZ/o1o2zvIk4cdVHa8I1xUQtTuLA+YXQ4SsFbm75ZoMXJBqWrNSENpqCJgoL6hizl5uTbkNN+1Q==} + /@analytics/core@0.12.15(@types/dlv@1.1.4): + resolution: {integrity: sha512-Y+zxTNIbONXKxeEUOtcXs4b3uuiGjF5sy1zHl8ZNkIBwrOpTM8ZGNhi0xGL8ZhaQLGbi03BrT6DaoNNG3sBQOg==} dependencies: '@analytics/global-storage-utils': 0.1.7 '@analytics/type-utils': 0.6.2 - analytics-utils: 1.0.12(@types/dlv@1.1.2) + analytics-utils: 1.0.12(@types/dlv@1.1.4) transitivePeerDependencies: - '@types/dlv' dev: false @@ -1288,56 +1288,68 @@ packages: resolution: {integrity: sha512-TD+xbmsBLyYy/IxFimW/YL/9L2IEnM7/EoV9Aeh56U64Ify8o27HJcKjo38XY9Tcn0uOq1AX3thkKgvtWvwFQg==} dev: false - /@ant-design/colors@7.0.0: - resolution: {integrity: sha512-iVm/9PfGCbC0dSMBrz7oiEXZaaGH7ceU40OJEfKmyuzR9R5CRimJYPlRiFtMQGQcbNMea/ePcoIebi4ASGYXtg==} + /@ant-design/colors@7.1.0: + resolution: {integrity: sha512-MMoDGWn1y9LdQJQSHiCC20x3uZ3CwQnv9QMz6pCmJOrqdgM9YxsoVVY0wtrdXbmfSgnV0KNk6zi09NAhMR2jvg==} + dependencies: + '@ctrl/tinycolor': 3.6.1 + + /@ant-design/cssinjs-utils@1.0.3(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-BrztZZKuoYcJK8uEH40ylBemf/Mu/QPiDos56g2bv6eUoniQkgQHOCOvA3+pncoFO1TaS8xcUCIqGzDA0I+ZVQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - '@ctrl/tinycolor': 3.6.0 + '@ant-design/cssinjs': 1.21.0(react-dom@18.3.1)(react@18.3.1) + '@babel/runtime': 7.25.0 + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /@ant-design/cssinjs@1.8.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-pOQJV9H9viB6qB9u7hkpKEOIQGx4dd8zjpwzF1v8YNwjffbZTlyUNQYln56gwpFF7SFskpYpnSfgoqTK4sFE/Q==} + /@ant-design/cssinjs@1.21.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-gIilraPl+9EoKdYxnupxjHB/Q6IHNRjEXszKbDxZdsgv4sAZ9pjkCq8yanDWNvyfjp4leir2OVAJm0vxwKK8YA==} peerDependencies: react: '>=16.0.0' react-dom: '>=16.0.0' dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 '@emotion/hash': 0.8.0 '@emotion/unitless': 0.7.5 - classnames: 2.3.2 - csstype: 3.1.2 - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - stylis: 4.1.3 - - /@ant-design/icons-svg@4.2.1: - resolution: {integrity: sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==} - - /@ant-design/icons@5.0.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-ZyF4ksXCcdtwA/1PLlnFLcF/q8/MhwxXhKHh4oCHDA4Ip+ZzAHoICtyp4wZWfiCVDP0yuz3HsjyvuldHFb3wjA==} + classnames: 2.5.1 + csstype: 3.1.3 + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + stylis: 4.3.2 + + /@ant-design/icons-svg@4.4.2: + resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==} + + /@ant-design/icons@5.4.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-QZbWC5xQYexCI5q4/fehSEkchJr5UGtvAJweT743qKUQQGs9IH2DehNLP49DJ3Ii9m9CijD2HN6fNy3WKhIFdA==} engines: {node: '>=8'} peerDependencies: react: '>=16.0.0' react-dom: '>=16.0.0' dependencies: - '@ant-design/colors': 7.0.0 - '@ant-design/icons-svg': 4.2.1 - '@babel/runtime': 7.21.0 - classnames: 2.3.2 - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@ant-design/colors': 7.1.0 + '@ant-design/icons-svg': 4.4.2 + '@babel/runtime': 7.25.0 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /@ant-design/react-slick@1.0.0(react@18.2.0): - resolution: {integrity: sha512-OKxZsn8TAf8fYxP79rDXgLs9zvKMTslK6dJ4iLhDXOujUqC5zJPBRszyrcEHXcMPOm1Sgk40JgyF3yiL/Swd7w==} + /@ant-design/react-slick@1.1.2(react@18.3.1): + resolution: {integrity: sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==} peerDependencies: react: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - classnames: 2.3.2 + '@babel/runtime': 7.25.0 + classnames: 2.5.1 json2mq: 0.2.0 - react: 18.2.0 + react: 18.3.1 resize-observer-polyfill: 1.5.1 - throttle-debounce: 5.0.0 + throttle-debounce: 5.0.2 /@apideck/better-ajv-errors@0.3.6(ajv@8.12.0): resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} @@ -1351,29 +1363,13 @@ packages: leven: 3.1.0 dev: false - /@aws-crypto/crc32@3.0.0: - resolution: {integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==} - dependencies: - '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.418.0 - tslib: 1.14.1 - dev: false - /@aws-crypto/crc32@5.2.0: resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} engines: {node: '>=16.0.0'} dependencies: '@aws-crypto/util': 5.2.0 '@aws-sdk/types': 3.609.0 - tslib: 2.6.2 - dev: false - - /@aws-crypto/crc32c@3.0.0: - resolution: {integrity: sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==} - dependencies: - '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.418.0 - tslib: 1.14.1 + tslib: 2.6.3 dev: false /@aws-crypto/crc32c@5.2.0: @@ -1381,25 +1377,7 @@ packages: dependencies: '@aws-crypto/util': 5.2.0 '@aws-sdk/types': 3.609.0 - tslib: 2.6.2 - dev: false - - /@aws-crypto/ie11-detection@3.0.0: - resolution: {integrity: sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==} - dependencies: - tslib: 1.14.1 - dev: false - - /@aws-crypto/sha1-browser@3.0.0: - resolution: {integrity: sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw==} - dependencies: - '@aws-crypto/ie11-detection': 3.0.0 - '@aws-crypto/supports-web-crypto': 3.0.0 - '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.418.0 - '@aws-sdk/util-locate-window': 3.310.0 - '@aws-sdk/util-utf8-browser': 3.259.0 - tslib: 1.14.1 + tslib: 2.6.3 dev: false /@aws-crypto/sha1-browser@5.2.0: @@ -1408,22 +1386,9 @@ packages: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 '@aws-sdk/types': 3.609.0 - '@aws-sdk/util-locate-window': 3.310.0 - '@smithy/util-utf8': 2.0.0 - tslib: 2.6.2 - dev: false - - /@aws-crypto/sha256-browser@3.0.0: - resolution: {integrity: sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==} - dependencies: - '@aws-crypto/ie11-detection': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-crypto/supports-web-crypto': 3.0.0 - '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.418.0 - '@aws-sdk/util-locate-window': 3.310.0 - '@aws-sdk/util-utf8-browser': 3.259.0 - tslib: 1.14.1 + '@aws-sdk/util-locate-window': 3.568.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.6.3 dev: false /@aws-crypto/sha256-browser@5.2.0: @@ -1433,17 +1398,9 @@ packages: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 '@aws-sdk/types': 3.609.0 - '@aws-sdk/util-locate-window': 3.310.0 - '@smithy/util-utf8': 2.0.0 - tslib: 2.6.2 - dev: false - - /@aws-crypto/sha256-js@3.0.0: - resolution: {integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==} - dependencies: - '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.418.0 - tslib: 1.14.1 + '@aws-sdk/util-locate-window': 3.568.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.6.3 dev: false /@aws-crypto/sha256-js@5.2.0: @@ -1452,705 +1409,403 @@ packages: dependencies: '@aws-crypto/util': 5.2.0 '@aws-sdk/types': 3.609.0 - tslib: 2.6.2 - dev: false - - /@aws-crypto/supports-web-crypto@3.0.0: - resolution: {integrity: sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==} - dependencies: - tslib: 1.14.1 + tslib: 2.6.3 dev: false /@aws-crypto/supports-web-crypto@5.2.0: resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} dependencies: - tslib: 2.6.2 - dev: false - - /@aws-crypto/util@3.0.0: - resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==} - dependencies: - '@aws-sdk/types': 3.418.0 - '@aws-sdk/util-utf8-browser': 3.259.0 - tslib: 1.14.1 + tslib: 2.6.3 dev: false /@aws-crypto/util@5.2.0: resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} dependencies: '@aws-sdk/types': 3.609.0 - '@smithy/util-utf8': 2.0.0 - tslib: 2.6.2 - dev: false - - /@aws-sdk/client-s3@3.418.0: - resolution: {integrity: sha512-VdDM9xS84t8W1B2/QJTK6mYVCnf7Hovg8Aum9NHm+bD7F0Ni2NTLVjm8+qq9STi4YSeXAy3Pe+FBUP9Wthw7Iw==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-crypto/sha1-browser': 3.0.0 - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.418.0 - '@aws-sdk/credential-provider-node': 3.418.0 - '@aws-sdk/middleware-bucket-endpoint': 3.418.0 - '@aws-sdk/middleware-expect-continue': 3.418.0 - '@aws-sdk/middleware-flexible-checksums': 3.418.0 - '@aws-sdk/middleware-host-header': 3.418.0 - '@aws-sdk/middleware-location-constraint': 3.418.0 - '@aws-sdk/middleware-logger': 3.418.0 - '@aws-sdk/middleware-recursion-detection': 3.418.0 - '@aws-sdk/middleware-sdk-s3': 3.418.0 - '@aws-sdk/middleware-signing': 3.418.0 - '@aws-sdk/middleware-ssec': 3.418.0 - '@aws-sdk/middleware-user-agent': 3.418.0 - '@aws-sdk/region-config-resolver': 3.418.0 - '@aws-sdk/signature-v4-multi-region': 3.418.0 - '@aws-sdk/types': 3.418.0 - '@aws-sdk/util-endpoints': 3.418.0 - '@aws-sdk/util-user-agent-browser': 3.418.0 - '@aws-sdk/util-user-agent-node': 3.418.0 - '@aws-sdk/xml-builder': 3.310.0 - '@smithy/config-resolver': 2.0.10 - '@smithy/eventstream-serde-browser': 2.0.9 - '@smithy/eventstream-serde-config-resolver': 2.0.9 - '@smithy/eventstream-serde-node': 2.0.9 - '@smithy/fetch-http-handler': 2.1.5 - '@smithy/hash-blob-browser': 2.0.9 - '@smithy/hash-node': 2.0.9 - '@smithy/hash-stream-node': 2.0.9 - '@smithy/invalid-dependency': 2.0.9 - '@smithy/md5-js': 2.0.9 - '@smithy/middleware-content-length': 2.0.11 - '@smithy/middleware-endpoint': 2.0.9 - '@smithy/middleware-retry': 2.0.12 - '@smithy/middleware-serde': 2.0.9 - '@smithy/middleware-stack': 2.0.3 - '@smithy/node-config-provider': 2.0.12 - '@smithy/node-http-handler': 2.1.5 - '@smithy/protocol-http': 3.0.5 - '@smithy/smithy-client': 2.1.7 - '@smithy/types': 2.3.3 - '@smithy/url-parser': 2.0.9 - '@smithy/util-base64': 2.0.0 - '@smithy/util-body-length-browser': 2.0.0 - '@smithy/util-body-length-node': 2.1.0 - '@smithy/util-defaults-mode-browser': 2.0.11 - '@smithy/util-defaults-mode-node': 2.0.13 - '@smithy/util-retry': 2.0.2 - '@smithy/util-stream': 2.0.12 - '@smithy/util-utf8': 2.0.0 - '@smithy/util-waiter': 2.0.9 - fast-xml-parser: 4.2.5 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt + '@smithy/util-utf8': 2.3.0 + tslib: 2.6.3 dev: false - /@aws-sdk/client-s3@3.614.0: - resolution: {integrity: sha512-9BlhfeBegvyjOqHtcr9kvrT80wiy7EVUiqYyTFiiDv/hJIcG88XHQCZdLU7658XBkQ7aFrr5b8rF2HRD1oroxw==} + /@aws-sdk/client-s3@3.621.0: + resolution: {integrity: sha512-YhGkd2HQTM4HCYJIAVWvfbUMpOF7XUr1W/e2LN3CFP0WTF4zcCJKesJ2iNHrExqC0Ek1+qarMxiXBK95itfjYQ==} engines: {node: '>=16.0.0'} dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.614.0(@aws-sdk/client-sts@3.614.0) - '@aws-sdk/client-sts': 3.614.0 - '@aws-sdk/core': 3.614.0 - '@aws-sdk/credential-provider-node': 3.614.0(@aws-sdk/client-sso-oidc@3.614.0)(@aws-sdk/client-sts@3.614.0) - '@aws-sdk/middleware-bucket-endpoint': 3.614.0 - '@aws-sdk/middleware-expect-continue': 3.609.0 - '@aws-sdk/middleware-flexible-checksums': 3.614.0 - '@aws-sdk/middleware-host-header': 3.609.0 + '@aws-sdk/client-sso-oidc': 3.621.0(@aws-sdk/client-sts@3.621.0) + '@aws-sdk/client-sts': 3.621.0 + '@aws-sdk/core': 3.621.0 + '@aws-sdk/credential-provider-node': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0)(@aws-sdk/client-sts@3.621.0) + '@aws-sdk/middleware-bucket-endpoint': 3.620.0 + '@aws-sdk/middleware-expect-continue': 3.620.0 + '@aws-sdk/middleware-flexible-checksums': 3.620.0 + '@aws-sdk/middleware-host-header': 3.620.0 '@aws-sdk/middleware-location-constraint': 3.609.0 '@aws-sdk/middleware-logger': 3.609.0 - '@aws-sdk/middleware-recursion-detection': 3.609.0 - '@aws-sdk/middleware-sdk-s3': 3.614.0 - '@aws-sdk/middleware-signing': 3.609.0 + '@aws-sdk/middleware-recursion-detection': 3.620.0 + '@aws-sdk/middleware-sdk-s3': 3.621.0 + '@aws-sdk/middleware-signing': 3.620.0 '@aws-sdk/middleware-ssec': 3.609.0 - '@aws-sdk/middleware-user-agent': 3.614.0 + '@aws-sdk/middleware-user-agent': 3.620.0 '@aws-sdk/region-config-resolver': 3.614.0 - '@aws-sdk/signature-v4-multi-region': 3.614.0 + '@aws-sdk/signature-v4-multi-region': 3.621.0 '@aws-sdk/types': 3.609.0 '@aws-sdk/util-endpoints': 3.614.0 '@aws-sdk/util-user-agent-browser': 3.609.0 '@aws-sdk/util-user-agent-node': 3.614.0 '@aws-sdk/xml-builder': 3.609.0 '@smithy/config-resolver': 3.0.5 - '@smithy/core': 2.2.7 - '@smithy/eventstream-serde-browser': 3.0.4 + '@smithy/core': 2.3.1 + '@smithy/eventstream-serde-browser': 3.0.5 '@smithy/eventstream-serde-config-resolver': 3.0.3 '@smithy/eventstream-serde-node': 3.0.4 - '@smithy/fetch-http-handler': 3.2.2 + '@smithy/fetch-http-handler': 3.2.4 '@smithy/hash-blob-browser': 3.1.2 '@smithy/hash-node': 3.0.3 '@smithy/hash-stream-node': 3.1.2 '@smithy/invalid-dependency': 3.0.3 '@smithy/md5-js': 3.0.3 - '@smithy/middleware-content-length': 3.0.4 - '@smithy/middleware-endpoint': 3.0.5 - '@smithy/middleware-retry': 3.0.10 + '@smithy/middleware-content-length': 3.0.5 + '@smithy/middleware-endpoint': 3.1.0 + '@smithy/middleware-retry': 3.0.13 '@smithy/middleware-serde': 3.0.3 '@smithy/middleware-stack': 3.0.3 '@smithy/node-config-provider': 3.1.4 - '@smithy/node-http-handler': 3.1.3 - '@smithy/protocol-http': 4.0.4 - '@smithy/smithy-client': 3.1.8 + '@smithy/node-http-handler': 3.1.4 + '@smithy/protocol-http': 4.1.0 + '@smithy/smithy-client': 3.1.11 '@smithy/types': 3.3.0 '@smithy/url-parser': 3.0.3 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.10 - '@smithy/util-defaults-mode-node': 3.0.10 + '@smithy/util-defaults-mode-browser': 3.0.13 + '@smithy/util-defaults-mode-node': 3.0.13 '@smithy/util-endpoints': 2.0.5 '@smithy/util-retry': 3.0.3 - '@smithy/util-stream': 3.1.0 + '@smithy/util-stream': 3.1.3 '@smithy/util-utf8': 3.0.0 '@smithy/util-waiter': 3.1.2 - tslib: 2.6.2 + tslib: 2.6.3 transitivePeerDependencies: - aws-crt dev: false - /@aws-sdk/client-sso-oidc@3.614.0(@aws-sdk/client-sts@3.614.0): - resolution: {integrity: sha512-BI1NWcpppbHg/28zbUg54dZeckork8BItZIcjls12vxasy+p3iEzrJVG60jcbUTTsk3Qc1tyxNfrdcVqx0y7Ww==} + /@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0): + resolution: {integrity: sha512-mMjk3mFUwV2Y68POf1BQMTF+F6qxt5tPu6daEUCNGC9Cenk3h2YXQQoS4/eSyYzuBiYk3vx49VgleRvdvkg8rg==} engines: {node: '>=16.0.0'} peerDependencies: - '@aws-sdk/client-sts': ^3.614.0 + '@aws-sdk/client-sts': ^3.621.0 dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sts': 3.614.0 - '@aws-sdk/core': 3.614.0 - '@aws-sdk/credential-provider-node': 3.614.0(@aws-sdk/client-sso-oidc@3.614.0)(@aws-sdk/client-sts@3.614.0) - '@aws-sdk/middleware-host-header': 3.609.0 + '@aws-sdk/client-sts': 3.621.0 + '@aws-sdk/core': 3.621.0 + '@aws-sdk/credential-provider-node': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0)(@aws-sdk/client-sts@3.621.0) + '@aws-sdk/middleware-host-header': 3.620.0 '@aws-sdk/middleware-logger': 3.609.0 - '@aws-sdk/middleware-recursion-detection': 3.609.0 - '@aws-sdk/middleware-user-agent': 3.614.0 + '@aws-sdk/middleware-recursion-detection': 3.620.0 + '@aws-sdk/middleware-user-agent': 3.620.0 '@aws-sdk/region-config-resolver': 3.614.0 '@aws-sdk/types': 3.609.0 '@aws-sdk/util-endpoints': 3.614.0 '@aws-sdk/util-user-agent-browser': 3.609.0 '@aws-sdk/util-user-agent-node': 3.614.0 '@smithy/config-resolver': 3.0.5 - '@smithy/core': 2.2.7 - '@smithy/fetch-http-handler': 3.2.2 + '@smithy/core': 2.3.1 + '@smithy/fetch-http-handler': 3.2.4 '@smithy/hash-node': 3.0.3 '@smithy/invalid-dependency': 3.0.3 - '@smithy/middleware-content-length': 3.0.4 - '@smithy/middleware-endpoint': 3.0.5 - '@smithy/middleware-retry': 3.0.10 + '@smithy/middleware-content-length': 3.0.5 + '@smithy/middleware-endpoint': 3.1.0 + '@smithy/middleware-retry': 3.0.13 '@smithy/middleware-serde': 3.0.3 '@smithy/middleware-stack': 3.0.3 '@smithy/node-config-provider': 3.1.4 - '@smithy/node-http-handler': 3.1.3 - '@smithy/protocol-http': 4.0.4 - '@smithy/smithy-client': 3.1.8 + '@smithy/node-http-handler': 3.1.4 + '@smithy/protocol-http': 4.1.0 + '@smithy/smithy-client': 3.1.11 '@smithy/types': 3.3.0 '@smithy/url-parser': 3.0.3 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.10 - '@smithy/util-defaults-mode-node': 3.0.10 + '@smithy/util-defaults-mode-browser': 3.0.13 + '@smithy/util-defaults-mode-node': 3.0.13 '@smithy/util-endpoints': 2.0.5 '@smithy/util-middleware': 3.0.3 '@smithy/util-retry': 3.0.3 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt - dev: false - - /@aws-sdk/client-sso@3.418.0: - resolution: {integrity: sha512-fakz3YeSW/kCAOJ5w4ObrrQBxsYO8sU8i6WHLv6iWAsYZKAws2Mqa8g89P61+GitSH4z9waksdLouS6ep78/5A==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/middleware-host-header': 3.418.0 - '@aws-sdk/middleware-logger': 3.418.0 - '@aws-sdk/middleware-recursion-detection': 3.418.0 - '@aws-sdk/middleware-user-agent': 3.418.0 - '@aws-sdk/region-config-resolver': 3.418.0 - '@aws-sdk/types': 3.418.0 - '@aws-sdk/util-endpoints': 3.418.0 - '@aws-sdk/util-user-agent-browser': 3.418.0 - '@aws-sdk/util-user-agent-node': 3.418.0 - '@smithy/config-resolver': 2.0.10 - '@smithy/fetch-http-handler': 2.1.5 - '@smithy/hash-node': 2.0.9 - '@smithy/invalid-dependency': 2.0.9 - '@smithy/middleware-content-length': 2.0.11 - '@smithy/middleware-endpoint': 2.0.9 - '@smithy/middleware-retry': 2.0.12 - '@smithy/middleware-serde': 2.0.9 - '@smithy/middleware-stack': 2.0.3 - '@smithy/node-config-provider': 2.0.12 - '@smithy/node-http-handler': 2.1.5 - '@smithy/protocol-http': 3.0.5 - '@smithy/smithy-client': 2.1.7 - '@smithy/types': 2.3.3 - '@smithy/url-parser': 2.0.9 - '@smithy/util-base64': 2.0.0 - '@smithy/util-body-length-browser': 2.0.0 - '@smithy/util-body-length-node': 2.1.0 - '@smithy/util-defaults-mode-browser': 2.0.11 - '@smithy/util-defaults-mode-node': 2.0.13 - '@smithy/util-retry': 2.0.2 - '@smithy/util-utf8': 2.0.0 - tslib: 2.6.2 + tslib: 2.6.3 transitivePeerDependencies: - aws-crt dev: false - /@aws-sdk/client-sso@3.614.0: - resolution: {integrity: sha512-p5pyYaxRzBttjBkqfc8i3K7DzBdTg3ECdVgBo6INIUxfvDy0J8QUE8vNtCgvFIkq+uPw/8M+Eo4zzln7anuO0Q==} + /@aws-sdk/client-sso@3.621.0: + resolution: {integrity: sha512-xpKfikN4u0BaUYZA9FGUMkkDmfoIP0Q03+A86WjqDWhcOoqNA1DkHsE4kZ+r064ifkPUfcNuUvlkVTEoBZoFjA==} engines: {node: '>=16.0.0'} dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.614.0 - '@aws-sdk/middleware-host-header': 3.609.0 + '@aws-sdk/core': 3.621.0 + '@aws-sdk/middleware-host-header': 3.620.0 '@aws-sdk/middleware-logger': 3.609.0 - '@aws-sdk/middleware-recursion-detection': 3.609.0 - '@aws-sdk/middleware-user-agent': 3.614.0 + '@aws-sdk/middleware-recursion-detection': 3.620.0 + '@aws-sdk/middleware-user-agent': 3.620.0 '@aws-sdk/region-config-resolver': 3.614.0 '@aws-sdk/types': 3.609.0 '@aws-sdk/util-endpoints': 3.614.0 '@aws-sdk/util-user-agent-browser': 3.609.0 '@aws-sdk/util-user-agent-node': 3.614.0 '@smithy/config-resolver': 3.0.5 - '@smithy/core': 2.2.7 - '@smithy/fetch-http-handler': 3.2.2 + '@smithy/core': 2.3.1 + '@smithy/fetch-http-handler': 3.2.4 '@smithy/hash-node': 3.0.3 '@smithy/invalid-dependency': 3.0.3 - '@smithy/middleware-content-length': 3.0.4 - '@smithy/middleware-endpoint': 3.0.5 - '@smithy/middleware-retry': 3.0.10 + '@smithy/middleware-content-length': 3.0.5 + '@smithy/middleware-endpoint': 3.1.0 + '@smithy/middleware-retry': 3.0.13 '@smithy/middleware-serde': 3.0.3 '@smithy/middleware-stack': 3.0.3 '@smithy/node-config-provider': 3.1.4 - '@smithy/node-http-handler': 3.1.3 - '@smithy/protocol-http': 4.0.4 - '@smithy/smithy-client': 3.1.8 + '@smithy/node-http-handler': 3.1.4 + '@smithy/protocol-http': 4.1.0 + '@smithy/smithy-client': 3.1.11 '@smithy/types': 3.3.0 '@smithy/url-parser': 3.0.3 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.10 - '@smithy/util-defaults-mode-node': 3.0.10 + '@smithy/util-defaults-mode-browser': 3.0.13 + '@smithy/util-defaults-mode-node': 3.0.13 '@smithy/util-endpoints': 2.0.5 '@smithy/util-middleware': 3.0.3 '@smithy/util-retry': 3.0.3 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt - dev: false - - /@aws-sdk/client-sts@3.418.0: - resolution: {integrity: sha512-L0n0Hw+Pm+BhXTN1bYZ0y4JAMArYgazdHf1nUSlEHndgZicCCuQtlMLxfo3i/IbtWi0dzfZcZ9d/MdAM8p4Jyw==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/credential-provider-node': 3.418.0 - '@aws-sdk/middleware-host-header': 3.418.0 - '@aws-sdk/middleware-logger': 3.418.0 - '@aws-sdk/middleware-recursion-detection': 3.418.0 - '@aws-sdk/middleware-sdk-sts': 3.418.0 - '@aws-sdk/middleware-signing': 3.418.0 - '@aws-sdk/middleware-user-agent': 3.418.0 - '@aws-sdk/region-config-resolver': 3.418.0 - '@aws-sdk/types': 3.418.0 - '@aws-sdk/util-endpoints': 3.418.0 - '@aws-sdk/util-user-agent-browser': 3.418.0 - '@aws-sdk/util-user-agent-node': 3.418.0 - '@smithy/config-resolver': 2.0.10 - '@smithy/fetch-http-handler': 2.1.5 - '@smithy/hash-node': 2.0.9 - '@smithy/invalid-dependency': 2.0.9 - '@smithy/middleware-content-length': 2.0.11 - '@smithy/middleware-endpoint': 2.0.9 - '@smithy/middleware-retry': 2.0.12 - '@smithy/middleware-serde': 2.0.9 - '@smithy/middleware-stack': 2.0.3 - '@smithy/node-config-provider': 2.0.12 - '@smithy/node-http-handler': 2.1.5 - '@smithy/protocol-http': 3.0.5 - '@smithy/smithy-client': 2.1.7 - '@smithy/types': 2.3.3 - '@smithy/url-parser': 2.0.9 - '@smithy/util-base64': 2.0.0 - '@smithy/util-body-length-browser': 2.0.0 - '@smithy/util-body-length-node': 2.1.0 - '@smithy/util-defaults-mode-browser': 2.0.11 - '@smithy/util-defaults-mode-node': 2.0.13 - '@smithy/util-retry': 2.0.2 - '@smithy/util-utf8': 2.0.0 - fast-xml-parser: 4.2.5 - tslib: 2.6.2 + tslib: 2.6.3 transitivePeerDependencies: - aws-crt dev: false - /@aws-sdk/client-sts@3.614.0: - resolution: {integrity: sha512-i6QmaVA1KHHYNnI2VYQy/sc31rLm4+jSp8b/YbQpFnD0w3aXsrEEHHlxek45uSkHb4Nrj1omFBVy/xp1WVYx2Q==} + /@aws-sdk/client-sts@3.621.0: + resolution: {integrity: sha512-707uiuReSt+nAx6d0c21xLjLm2lxeKc7padxjv92CIrIocnQSlJPxSCM7r5zBhwiahJA6MNQwmTl2xznU67KgA==} engines: {node: '>=16.0.0'} dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.614.0(@aws-sdk/client-sts@3.614.0) - '@aws-sdk/core': 3.614.0 - '@aws-sdk/credential-provider-node': 3.614.0(@aws-sdk/client-sso-oidc@3.614.0)(@aws-sdk/client-sts@3.614.0) - '@aws-sdk/middleware-host-header': 3.609.0 + '@aws-sdk/client-sso-oidc': 3.621.0(@aws-sdk/client-sts@3.621.0) + '@aws-sdk/core': 3.621.0 + '@aws-sdk/credential-provider-node': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0)(@aws-sdk/client-sts@3.621.0) + '@aws-sdk/middleware-host-header': 3.620.0 '@aws-sdk/middleware-logger': 3.609.0 - '@aws-sdk/middleware-recursion-detection': 3.609.0 - '@aws-sdk/middleware-user-agent': 3.614.0 + '@aws-sdk/middleware-recursion-detection': 3.620.0 + '@aws-sdk/middleware-user-agent': 3.620.0 '@aws-sdk/region-config-resolver': 3.614.0 '@aws-sdk/types': 3.609.0 '@aws-sdk/util-endpoints': 3.614.0 '@aws-sdk/util-user-agent-browser': 3.609.0 '@aws-sdk/util-user-agent-node': 3.614.0 '@smithy/config-resolver': 3.0.5 - '@smithy/core': 2.2.7 - '@smithy/fetch-http-handler': 3.2.2 + '@smithy/core': 2.3.1 + '@smithy/fetch-http-handler': 3.2.4 '@smithy/hash-node': 3.0.3 '@smithy/invalid-dependency': 3.0.3 - '@smithy/middleware-content-length': 3.0.4 - '@smithy/middleware-endpoint': 3.0.5 - '@smithy/middleware-retry': 3.0.10 + '@smithy/middleware-content-length': 3.0.5 + '@smithy/middleware-endpoint': 3.1.0 + '@smithy/middleware-retry': 3.0.13 '@smithy/middleware-serde': 3.0.3 '@smithy/middleware-stack': 3.0.3 '@smithy/node-config-provider': 3.1.4 - '@smithy/node-http-handler': 3.1.3 - '@smithy/protocol-http': 4.0.4 - '@smithy/smithy-client': 3.1.8 + '@smithy/node-http-handler': 3.1.4 + '@smithy/protocol-http': 4.1.0 + '@smithy/smithy-client': 3.1.11 '@smithy/types': 3.3.0 '@smithy/url-parser': 3.0.3 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.10 - '@smithy/util-defaults-mode-node': 3.0.10 + '@smithy/util-defaults-mode-browser': 3.0.13 + '@smithy/util-defaults-mode-node': 3.0.13 '@smithy/util-endpoints': 2.0.5 '@smithy/util-middleware': 3.0.3 '@smithy/util-retry': 3.0.3 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 transitivePeerDependencies: - aws-crt dev: false - /@aws-sdk/core@3.614.0: - resolution: {integrity: sha512-BUuS5/1YkgmKc4J0bg83XEtMyDHVyqG2QDzfmhYe8gbOIZabUl1FlrFVwhCAthtrrI6MPGTQcERB4BtJKUSplw==} + /@aws-sdk/core@3.621.0: + resolution: {integrity: sha512-CtOwWmDdEiINkGXD93iGfXjN0WmCp9l45cDWHHGa8lRgEDyhuL7bwd/pH5aSzj0j8SiQBG2k0S7DHbd5RaqvbQ==} engines: {node: '>=16.0.0'} dependencies: - '@smithy/core': 2.2.7 - '@smithy/protocol-http': 4.0.4 - '@smithy/signature-v4': 3.1.2 - '@smithy/smithy-client': 3.1.8 + '@smithy/core': 2.3.1 + '@smithy/node-config-provider': 3.1.4 + '@smithy/protocol-http': 4.1.0 + '@smithy/signature-v4': 4.1.0 + '@smithy/smithy-client': 3.1.11 '@smithy/types': 3.3.0 - fast-xml-parser: 4.2.5 - tslib: 2.6.2 - dev: false - - /@aws-sdk/credential-provider-env@3.418.0: - resolution: {integrity: sha512-e74sS+x63EZUBO+HaI8zor886YdtmULzwKdctsZp5/37Xho1CVUNtEC+fYa69nigBD9afoiH33I4JggaHgrekQ==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.418.0 - '@smithy/property-provider': 2.0.10 - '@smithy/types': 2.3.3 - tslib: 2.6.2 + '@smithy/util-middleware': 3.0.3 + fast-xml-parser: 4.4.1 + tslib: 2.6.3 dev: false - /@aws-sdk/credential-provider-env@3.609.0: - resolution: {integrity: sha512-v69ZCWcec2iuV9vLVJMa6fAb5xwkzN4jYIT8yjo2c4Ia/j976Q+TPf35Pnz5My48Xr94EFcaBazrWedF+kwfuQ==} + /@aws-sdk/credential-provider-env@3.620.1: + resolution: {integrity: sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==} engines: {node: '>=16.0.0'} dependencies: '@aws-sdk/types': 3.609.0 '@smithy/property-provider': 3.1.3 '@smithy/types': 3.3.0 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@aws-sdk/credential-provider-http@3.614.0: - resolution: {integrity: sha512-YIEjlNUKb3Vo/iTnGAPdsiDC3FUUnNoex2OwU8LmR7AkYZiWdB8nx99DfgkkY+OFMUpw7nKD2PCOtuFONelfGA==} + /@aws-sdk/credential-provider-http@3.621.0: + resolution: {integrity: sha512-/jc2tEsdkT1QQAI5Dvoci50DbSxtJrevemwFsm0B73pwCcOQZ5ZwwSdVqGsPutzYzUVx3bcXg3LRL7jLACqRIg==} engines: {node: '>=16.0.0'} dependencies: '@aws-sdk/types': 3.609.0 - '@smithy/fetch-http-handler': 3.2.2 - '@smithy/node-http-handler': 3.1.3 + '@smithy/fetch-http-handler': 3.2.4 + '@smithy/node-http-handler': 3.1.4 '@smithy/property-provider': 3.1.3 - '@smithy/protocol-http': 4.0.4 - '@smithy/smithy-client': 3.1.8 + '@smithy/protocol-http': 4.1.0 + '@smithy/smithy-client': 3.1.11 '@smithy/types': 3.3.0 - '@smithy/util-stream': 3.1.0 - tslib: 2.6.2 - dev: false - - /@aws-sdk/credential-provider-ini@3.418.0: - resolution: {integrity: sha512-LTAeKKV85unlSqGNIeqEZ4N9gufaSoH+670n5YTUEk564zHCkUQW0PJomzLF5jKBco6Yfzv6rPBTukd+x9XWqw==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/credential-provider-env': 3.418.0 - '@aws-sdk/credential-provider-process': 3.418.0 - '@aws-sdk/credential-provider-sso': 3.418.0 - '@aws-sdk/credential-provider-web-identity': 3.418.0 - '@aws-sdk/types': 3.418.0 - '@smithy/credential-provider-imds': 2.0.12 - '@smithy/property-provider': 2.0.10 - '@smithy/shared-ini-file-loader': 2.0.11 - '@smithy/types': 2.3.3 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt + '@smithy/util-stream': 3.1.3 + tslib: 2.6.3 dev: false - /@aws-sdk/credential-provider-ini@3.614.0(@aws-sdk/client-sso-oidc@3.614.0)(@aws-sdk/client-sts@3.614.0): - resolution: {integrity: sha512-KfLuLFGwlvFSZ2MuzYwWGPb1y5TeiwX5okIDe0aQ1h10oD3924FXbN+mabOnUHQ8EFcGAtCaWbrC86mI7ktC6A==} + /@aws-sdk/credential-provider-ini@3.621.0(@aws-sdk/client-sso-oidc@3.621.0)(@aws-sdk/client-sts@3.621.0): + resolution: {integrity: sha512-0EWVnSc+JQn5HLnF5Xv405M8n4zfdx9gyGdpnCmAmFqEDHA8LmBdxJdpUk1Ovp/I5oPANhjojxabIW5f1uU0RA==} engines: {node: '>=16.0.0'} peerDependencies: - '@aws-sdk/client-sts': ^3.614.0 + '@aws-sdk/client-sts': ^3.621.0 dependencies: - '@aws-sdk/client-sts': 3.614.0 - '@aws-sdk/credential-provider-env': 3.609.0 - '@aws-sdk/credential-provider-http': 3.614.0 - '@aws-sdk/credential-provider-process': 3.614.0 - '@aws-sdk/credential-provider-sso': 3.614.0(@aws-sdk/client-sso-oidc@3.614.0) - '@aws-sdk/credential-provider-web-identity': 3.609.0(@aws-sdk/client-sts@3.614.0) + '@aws-sdk/client-sts': 3.621.0 + '@aws-sdk/credential-provider-env': 3.620.1 + '@aws-sdk/credential-provider-http': 3.621.0 + '@aws-sdk/credential-provider-process': 3.620.1 + '@aws-sdk/credential-provider-sso': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0) + '@aws-sdk/credential-provider-web-identity': 3.621.0(@aws-sdk/client-sts@3.621.0) '@aws-sdk/types': 3.609.0 - '@smithy/credential-provider-imds': 3.1.4 + '@smithy/credential-provider-imds': 3.2.0 '@smithy/property-provider': 3.1.3 '@smithy/shared-ini-file-loader': 3.1.4 '@smithy/types': 3.3.0 - tslib: 2.6.2 + tslib: 2.6.3 transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' - aws-crt dev: false - /@aws-sdk/credential-provider-node@3.418.0: - resolution: {integrity: sha512-VveTjtSC6m8YXj3fQDkMKEZuHv+CR2Z4u/NAN51Fi4xOtIWUtOBj5rfZ8HmBYoBjRF0DtRlPXuMiNnXAzTctfQ==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/credential-provider-env': 3.418.0 - '@aws-sdk/credential-provider-ini': 3.418.0 - '@aws-sdk/credential-provider-process': 3.418.0 - '@aws-sdk/credential-provider-sso': 3.418.0 - '@aws-sdk/credential-provider-web-identity': 3.418.0 - '@aws-sdk/types': 3.418.0 - '@smithy/credential-provider-imds': 2.0.12 - '@smithy/property-provider': 2.0.10 - '@smithy/shared-ini-file-loader': 2.0.11 - '@smithy/types': 2.3.3 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt - dev: false - - /@aws-sdk/credential-provider-node@3.614.0(@aws-sdk/client-sso-oidc@3.614.0)(@aws-sdk/client-sts@3.614.0): - resolution: {integrity: sha512-4J6gPEuFZP0mkWq5E//oMS1vrmMM88iNNcv7TEljYnsc6JTAlKejCyFwx6CN+nkIhmIZsl06SXIhBemzBdBPfg==} + /@aws-sdk/credential-provider-node@3.621.0(@aws-sdk/client-sso-oidc@3.621.0)(@aws-sdk/client-sts@3.621.0): + resolution: {integrity: sha512-4JqpccUgz5Snanpt2+53hbOBbJQrSFq7E1sAAbgY6BKVQUsW5qyXqnjvSF32kDeKa5JpBl3bBWLZl04IadcPHw==} engines: {node: '>=16.0.0'} dependencies: - '@aws-sdk/credential-provider-env': 3.609.0 - '@aws-sdk/credential-provider-http': 3.614.0 - '@aws-sdk/credential-provider-ini': 3.614.0(@aws-sdk/client-sso-oidc@3.614.0)(@aws-sdk/client-sts@3.614.0) - '@aws-sdk/credential-provider-process': 3.614.0 - '@aws-sdk/credential-provider-sso': 3.614.0(@aws-sdk/client-sso-oidc@3.614.0) - '@aws-sdk/credential-provider-web-identity': 3.609.0(@aws-sdk/client-sts@3.614.0) + '@aws-sdk/credential-provider-env': 3.620.1 + '@aws-sdk/credential-provider-http': 3.621.0 + '@aws-sdk/credential-provider-ini': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0)(@aws-sdk/client-sts@3.621.0) + '@aws-sdk/credential-provider-process': 3.620.1 + '@aws-sdk/credential-provider-sso': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0) + '@aws-sdk/credential-provider-web-identity': 3.621.0(@aws-sdk/client-sts@3.621.0) '@aws-sdk/types': 3.609.0 - '@smithy/credential-provider-imds': 3.1.4 + '@smithy/credential-provider-imds': 3.2.0 '@smithy/property-provider': 3.1.3 '@smithy/shared-ini-file-loader': 3.1.4 '@smithy/types': 3.3.0 - tslib: 2.6.2 + tslib: 2.6.3 transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' - '@aws-sdk/client-sts' - aws-crt dev: false - /@aws-sdk/credential-provider-process@3.418.0: - resolution: {integrity: sha512-xPbdm2WKz1oH6pTkrJoUmr3OLuqvvcPYTQX0IIlc31tmDwDWPQjXGGFD/vwZGIZIkKaFpFxVMgAzfFScxox7dw==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.418.0 - '@smithy/property-provider': 2.0.10 - '@smithy/shared-ini-file-loader': 2.0.11 - '@smithy/types': 2.3.3 - tslib: 2.6.2 - dev: false - - /@aws-sdk/credential-provider-process@3.614.0: - resolution: {integrity: sha512-Q0SI0sTRwi8iNODLs5+bbv8vgz8Qy2QdxbCHnPk/6Cx6LMf7i3dqmWquFbspqFRd8QiqxStrblwxrUYZi09tkA==} + /@aws-sdk/credential-provider-process@3.620.1: + resolution: {integrity: sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==} engines: {node: '>=16.0.0'} dependencies: '@aws-sdk/types': 3.609.0 '@smithy/property-provider': 3.1.3 '@smithy/shared-ini-file-loader': 3.1.4 '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@aws-sdk/credential-provider-sso@3.418.0: - resolution: {integrity: sha512-tUF5Hg/HfaU5t+E7IuvohYlodSIlBXa28xAJPPFxhKrUnvP6AIoW6JLazOtCIQjQgJYEUILV29XX+ojUuITcaw==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/client-sso': 3.418.0 - '@aws-sdk/token-providers': 3.418.0 - '@aws-sdk/types': 3.418.0 - '@smithy/property-provider': 2.0.10 - '@smithy/shared-ini-file-loader': 2.0.11 - '@smithy/types': 2.3.3 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt + tslib: 2.6.3 dev: false - /@aws-sdk/credential-provider-sso@3.614.0(@aws-sdk/client-sso-oidc@3.614.0): - resolution: {integrity: sha512-55+gp0JY4451cWI1qXmVMFM0GQaBKiQpXv2P0xmd9P3qLDyeFUSEW8XPh0d2lb1ICr6x4s47ynXVdGCIv2mXMg==} + /@aws-sdk/credential-provider-sso@3.621.0(@aws-sdk/client-sso-oidc@3.621.0): + resolution: {integrity: sha512-Kza0jcFeA/GEL6xJlzR2KFf1PfZKMFnxfGzJzl5yN7EjoGdMijl34KaRyVnfRjnCWcsUpBWKNIDk9WZVMY9yiw==} engines: {node: '>=16.0.0'} dependencies: - '@aws-sdk/client-sso': 3.614.0 - '@aws-sdk/token-providers': 3.614.0(@aws-sdk/client-sso-oidc@3.614.0) + '@aws-sdk/client-sso': 3.621.0 + '@aws-sdk/token-providers': 3.614.0(@aws-sdk/client-sso-oidc@3.621.0) '@aws-sdk/types': 3.609.0 '@smithy/property-provider': 3.1.3 '@smithy/shared-ini-file-loader': 3.1.4 '@smithy/types': 3.3.0 - tslib: 2.6.2 + tslib: 2.6.3 transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' - aws-crt dev: false - /@aws-sdk/credential-provider-web-identity@3.418.0: - resolution: {integrity: sha512-do7ang565n9p3dS1JdsQY01rUfRx8vkxQqz5M8OlcEHBNiCdi2PvSjNwcBdrv/FKkyIxZb0TImOfBSt40hVdxQ==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.418.0 - '@smithy/property-provider': 2.0.10 - '@smithy/types': 2.3.3 - tslib: 2.6.2 - dev: false - - /@aws-sdk/credential-provider-web-identity@3.609.0(@aws-sdk/client-sts@3.614.0): - resolution: {integrity: sha512-U+PG8NhlYYF45zbr1km3ROtBMYqyyj/oK8NRp++UHHeuavgrP+4wJ4wQnlEaKvJBjevfo3+dlIBcaeQ7NYejWg==} + /@aws-sdk/credential-provider-web-identity@3.621.0(@aws-sdk/client-sts@3.621.0): + resolution: {integrity: sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==} engines: {node: '>=16.0.0'} peerDependencies: - '@aws-sdk/client-sts': ^3.609.0 + '@aws-sdk/client-sts': ^3.621.0 dependencies: - '@aws-sdk/client-sts': 3.614.0 + '@aws-sdk/client-sts': 3.621.0 '@aws-sdk/types': 3.609.0 '@smithy/property-provider': 3.1.3 '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@aws-sdk/middleware-bucket-endpoint@3.418.0: - resolution: {integrity: sha512-gj/mj1UfbKkGbQ1N4YUvjTTp8BVs5fO1QAL2AjFJ+jfJOToLReX72aNEkm7sPGbHML0TqOY4cQbJuWYy+zdD5g==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.418.0 - '@aws-sdk/util-arn-parser': 3.310.0 - '@smithy/node-config-provider': 2.0.12 - '@smithy/protocol-http': 3.0.5 - '@smithy/types': 2.3.3 - '@smithy/util-config-provider': 2.0.0 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@aws-sdk/middleware-bucket-endpoint@3.614.0: - resolution: {integrity: sha512-TqEY8KcZeZ0LIxXaqG9RSSNnDHvD8RAFP4Xenwsxqnyad0Yn7LgCoFwRByelJ0t54ROYL1/ETJleWE4U4TOXdg==} + /@aws-sdk/middleware-bucket-endpoint@3.620.0: + resolution: {integrity: sha512-eGLL0W6L3HDb3OACyetZYOWpHJ+gLo0TehQKeQyy2G8vTYXqNTeqYhuI6up9HVjBzU9eQiULVQETmgQs7TFaRg==} engines: {node: '>=16.0.0'} dependencies: '@aws-sdk/types': 3.609.0 '@aws-sdk/util-arn-parser': 3.568.0 '@smithy/node-config-provider': 3.1.4 - '@smithy/protocol-http': 4.0.4 + '@smithy/protocol-http': 4.1.0 '@smithy/types': 3.3.0 '@smithy/util-config-provider': 3.0.0 - tslib: 2.6.2 - dev: false - - /@aws-sdk/middleware-expect-continue@3.418.0: - resolution: {integrity: sha512-6x4rcIj685EmqDLQkbWoCur3Dg5DRClHMen6nHXmD3CR5Xyt3z1Gk/+jmZICxyJo9c6M4AeZht8o95BopkmYAQ==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.418.0 - '@smithy/protocol-http': 3.0.5 - '@smithy/types': 2.3.3 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@aws-sdk/middleware-expect-continue@3.609.0: - resolution: {integrity: sha512-+zeg//mSer4JZRxOB/4mUOMUJyuYPwATnIC5moBB8P8Xe+mJaVRFy8qlCtzYNj2TycnlsBPzTK0j7P1yvDh97w==} + /@aws-sdk/middleware-expect-continue@3.620.0: + resolution: {integrity: sha512-QXeRFMLfyQ31nAHLbiTLtk0oHzG9QLMaof5jIfqcUwnOkO8YnQdeqzakrg1Alpy/VQ7aqzIi8qypkBe2KXZz0A==} engines: {node: '>=16.0.0'} dependencies: '@aws-sdk/types': 3.609.0 - '@smithy/protocol-http': 4.0.4 + '@smithy/protocol-http': 4.1.0 '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@aws-sdk/middleware-flexible-checksums@3.418.0: - resolution: {integrity: sha512-3O203dqS2JU5P1TAAbo7p1qplXQh59pevw9nqzPVb3EG8B+mSucVf2kKmF7kGHqKSk+nK/mB/4XGSsZBzGt6Wg==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-crypto/crc32': 3.0.0 - '@aws-crypto/crc32c': 3.0.0 - '@aws-sdk/types': 3.418.0 - '@smithy/is-array-buffer': 2.0.0 - '@smithy/protocol-http': 3.0.5 - '@smithy/types': 2.3.3 - '@smithy/util-utf8': 2.0.0 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@aws-sdk/middleware-flexible-checksums@3.614.0: - resolution: {integrity: sha512-ZLpxVXMboDeMT7p2Kdp5m1uLVKOktkZoMgLvvbe3zbrU4Ji5IU5xVE0aa4X7H28BtuODCs6SLESnPs19bhMKlA==} + /@aws-sdk/middleware-flexible-checksums@3.620.0: + resolution: {integrity: sha512-ftz+NW7qka2sVuwnnO1IzBku5ccP+s5qZGeRTPgrKB7OzRW85gthvIo1vQR2w+OwHFk7WJbbhhWwbCbktnP4UA==} engines: {node: '>=16.0.0'} dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-sdk/types': 3.609.0 '@smithy/is-array-buffer': 3.0.0 - '@smithy/protocol-http': 4.0.4 + '@smithy/protocol-http': 4.1.0 '@smithy/types': 3.3.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 - dev: false - - /@aws-sdk/middleware-host-header@3.418.0: - resolution: {integrity: sha512-LrMTdzalkPw/1ujLCKPLwCGvPMCmT4P+vOZQRbSEVZPnlZk+Aj++aL/RaHou0jL4kJH3zl8iQepriBt4a7UvXQ==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.418.0 - '@smithy/protocol-http': 3.0.5 - '@smithy/types': 2.3.3 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@aws-sdk/middleware-host-header@3.609.0: - resolution: {integrity: sha512-iTKfo158lc4jLDfYeZmYMIBHsn8m6zX+XB6birCSNZ/rrlzAkPbGE43CNdKfvjyWdqgLMRXF+B+OcZRvqhMXPQ==} + /@aws-sdk/middleware-host-header@3.620.0: + resolution: {integrity: sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==} engines: {node: '>=16.0.0'} dependencies: '@aws-sdk/types': 3.609.0 - '@smithy/protocol-http': 4.0.4 + '@smithy/protocol-http': 4.1.0 '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@aws-sdk/middleware-location-constraint@3.418.0: - resolution: {integrity: sha512-cc8M3VEaESHJhDsDV8tTpt2QYUprDWhvAVVSlcL43cTdZ54Quc0W+toDiaVOUlwrAZz2Y7g5NDj22ibJGFbOvw==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.418.0 - '@smithy/types': 2.3.3 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@aws-sdk/middleware-location-constraint@3.609.0: @@ -2159,16 +1814,7 @@ packages: dependencies: '@aws-sdk/types': 3.609.0 '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@aws-sdk/middleware-logger@3.418.0: - resolution: {integrity: sha512-StKGmyPVfoO/wdNTtKemYwoJsqIl4l7oqarQY7VSf2Mp3mqaa+njLViHsQbirYpyqpgUEusOnuTlH5utxJ1NsQ==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.418.0 - '@smithy/types': 2.3.3 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@aws-sdk/middleware-logger@3.609.0: @@ -2177,99 +1823,47 @@ packages: dependencies: '@aws-sdk/types': 3.609.0 '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@aws-sdk/middleware-recursion-detection@3.418.0: - resolution: {integrity: sha512-kKFrIQglBLUFPbHSDy1+bbe3Na2Kd70JSUC3QLMbUHmqipXN8KeXRfAj7vTv97zXl0WzG0buV++WcNwOm1rFjg==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.418.0 - '@smithy/protocol-http': 3.0.5 - '@smithy/types': 2.3.3 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@aws-sdk/middleware-recursion-detection@3.609.0: - resolution: {integrity: sha512-6sewsYB7/o/nbUfA99Aa/LokM+a/u4Wpm/X2o0RxOsDtSB795ObebLJe2BxY5UssbGaWkn7LswyfvrdZNXNj1w==} + /@aws-sdk/middleware-recursion-detection@3.620.0: + resolution: {integrity: sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==} engines: {node: '>=16.0.0'} dependencies: '@aws-sdk/types': 3.609.0 - '@smithy/protocol-http': 4.0.4 + '@smithy/protocol-http': 4.1.0 '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@aws-sdk/middleware-sdk-s3@3.418.0: - resolution: {integrity: sha512-rei32LF45SyqL3NlWDjEOfMwAca9A5F4QgUyXJqvASc43oWC1tJnLIhiCxNh8qkWAiRyRzFpcanTeqyaRSsZpA==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.418.0 - '@aws-sdk/util-arn-parser': 3.310.0 - '@smithy/protocol-http': 3.0.5 - '@smithy/smithy-client': 2.1.7 - '@smithy/types': 2.3.3 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@aws-sdk/middleware-sdk-s3@3.614.0: - resolution: {integrity: sha512-9fJTaiuuOfFV4FqmUEhPYzrtv7JOfYpB7q65oG3uayVH4ngWHIJkjnnX79zRhNZKdPGta+XIsnZzjEghg82ngA==} + /@aws-sdk/middleware-sdk-s3@3.621.0: + resolution: {integrity: sha512-CJrQrtKylcqvyPkRR16JmPZkHroCkWwLErQrg30ZcBPNNok8xbfX6cYqG16XDTnu4lSYzv2Yqc4w4oOBv8xerQ==} engines: {node: '>=16.0.0'} dependencies: '@aws-sdk/types': 3.609.0 '@aws-sdk/util-arn-parser': 3.568.0 '@smithy/node-config-provider': 3.1.4 - '@smithy/protocol-http': 4.0.4 - '@smithy/signature-v4': 3.1.2 - '@smithy/smithy-client': 3.1.8 + '@smithy/protocol-http': 4.1.0 + '@smithy/signature-v4': 4.1.0 + '@smithy/smithy-client': 3.1.11 '@smithy/types': 3.3.0 '@smithy/util-config-provider': 3.0.0 - tslib: 2.6.2 - dev: false - - /@aws-sdk/middleware-sdk-sts@3.418.0: - resolution: {integrity: sha512-cW8ijrCTP+mgihvcq4+TbhAcE/we5lFl4ydRqvTdtcSnYQAVQADg47rnTScQiFsPFEB3NKq7BGeyTJF9MKolPA==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/middleware-signing': 3.418.0 - '@aws-sdk/types': 3.418.0 - '@smithy/types': 2.3.3 - tslib: 2.6.2 - dev: false - - /@aws-sdk/middleware-signing@3.418.0: - resolution: {integrity: sha512-onvs5KoYQE8OlOE740RxWBGtsUyVIgAo0CzRKOQO63ZEYqpL1Os+MS1CGzdNhvQnJgJruE1WW+Ix8fjN30zKPA==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.418.0 - '@smithy/property-provider': 2.0.10 - '@smithy/protocol-http': 3.0.5 - '@smithy/signature-v4': 2.0.9 - '@smithy/types': 2.3.3 - '@smithy/util-middleware': 2.0.2 - tslib: 2.6.2 + '@smithy/util-stream': 3.1.3 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 dev: false - /@aws-sdk/middleware-signing@3.609.0: - resolution: {integrity: sha512-2w3dBLjQVKIajYzokO4hduq8/0hSMUYHHmIo1Kdl+MSY8uwRBt12bLL6pyreobTcRMxizvn2ph/CQ9I1ST/WGQ==} + /@aws-sdk/middleware-signing@3.620.0: + resolution: {integrity: sha512-gxI7rubiaanUXaLfJ4NybERa9MGPNg2Ycl/OqANsozrBnR3Pw8vqy3EuVImQOyn2pJ2IFvl8ZPoSMHf4pX56FQ==} engines: {node: '>=16.0.0'} dependencies: '@aws-sdk/types': 3.609.0 '@smithy/property-provider': 3.1.3 - '@smithy/protocol-http': 4.0.4 - '@smithy/signature-v4': 3.1.2 + '@smithy/protocol-http': 4.1.0 + '@smithy/signature-v4': 4.1.0 '@smithy/types': 3.3.0 '@smithy/util-middleware': 3.0.3 - tslib: 2.6.2 - dev: false - - /@aws-sdk/middleware-ssec@3.418.0: - resolution: {integrity: sha512-J7K+5h6aP7IYMlu/NwHEIjb0+WDu1eFvO8TCPo6j1H9xYRi8B/6h+6pa9Rk9IgRUzFnrdlDu9FazG8Tp0KKLyg==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.418.0 - '@smithy/types': 2.3.3 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@aws-sdk/middleware-ssec@3.609.0: @@ -2278,40 +1872,18 @@ packages: dependencies: '@aws-sdk/types': 3.609.0 '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@aws-sdk/middleware-user-agent@3.418.0: - resolution: {integrity: sha512-Jdcztg9Tal9SEAL0dKRrnpKrm6LFlWmAhvuwv0dQ7bNTJxIxyEFbpqdgy7mpQHsLVZgq1Aad/7gT/72c9igyZw==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.418.0 - '@aws-sdk/util-endpoints': 3.418.0 - '@smithy/protocol-http': 3.0.5 - '@smithy/types': 2.3.3 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@aws-sdk/middleware-user-agent@3.614.0: - resolution: {integrity: sha512-xUxh0UPQiMTG6E31Yvu6zVYlikrIcFDKljM11CaatInzvZubGTGiX0DjpqRlfGzUNsuPc/zNrKwRP2+wypgqIw==} + /@aws-sdk/middleware-user-agent@3.620.0: + resolution: {integrity: sha512-bvS6etn+KsuL32ubY5D3xNof1qkenpbJXf/ugGXbg0n98DvDFQ/F+SMLxHgbnER5dsKYchNnhmtI6/FC3HFu/A==} engines: {node: '>=16.0.0'} dependencies: '@aws-sdk/types': 3.609.0 '@aws-sdk/util-endpoints': 3.614.0 - '@smithy/protocol-http': 4.0.4 + '@smithy/protocol-http': 4.1.0 '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@aws-sdk/region-config-resolver@3.418.0: - resolution: {integrity: sha512-lJRZ/9TjZU6yLz+mAwxJkcJZ6BmyYoIJVo1p5+BN//EFdEmC8/c0c9gXMRzfISV/mqWSttdtccpAyN4/goHTYA==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/node-config-provider': 2.0.12 - '@smithy/types': 2.3.3 - '@smithy/util-config-provider': 2.0.0 - '@smithy/util-middleware': 2.0.2 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@aws-sdk/region-config-resolver@3.614.0: @@ -2323,95 +1895,33 @@ packages: '@smithy/types': 3.3.0 '@smithy/util-config-provider': 3.0.0 '@smithy/util-middleware': 3.0.3 - tslib: 2.6.2 - dev: false - - /@aws-sdk/signature-v4-multi-region@3.418.0: - resolution: {integrity: sha512-LeVYMZeUQUURFqDf4yZxTEv016g64hi0LqYBjU0mjwd8aPc0k6hckwvshezc80jCNbuLyjNfQclvlg3iFliItQ==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.418.0 - '@smithy/protocol-http': 3.0.5 - '@smithy/signature-v4': 2.0.9 - '@smithy/types': 2.3.3 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@aws-sdk/signature-v4-multi-region@3.614.0: - resolution: {integrity: sha512-6mW3ONW4oLzxrePznYhz7sNT9ji9Am9ufLeV722tbOVS5lArBOZ6E1oPz0uYBhisUPznWKhcLRMggt7vIJWMng==} + /@aws-sdk/signature-v4-multi-region@3.621.0: + resolution: {integrity: sha512-u+ulCaHFveqHaTxgiYrEAyfBVP6GRKjnmDut67CtjhjslshPWYpo/ndtlCW1zc0RDne3uUeK13Pqp7dp7p1d6g==} engines: {node: '>=16.0.0'} dependencies: - '@aws-sdk/middleware-sdk-s3': 3.614.0 + '@aws-sdk/middleware-sdk-s3': 3.621.0 '@aws-sdk/types': 3.609.0 - '@smithy/protocol-http': 4.0.4 - '@smithy/signature-v4': 3.1.2 + '@smithy/protocol-http': 4.1.0 + '@smithy/signature-v4': 4.1.0 '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@aws-sdk/token-providers@3.418.0: - resolution: {integrity: sha512-9P7Q0VN0hEzTngy3Sz5eya2qEOEf0Q8qf1vB3um0gE6ID6EVAdz/nc/DztfN32MFxk8FeVBrCP5vWdoOzmd72g==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/middleware-host-header': 3.418.0 - '@aws-sdk/middleware-logger': 3.418.0 - '@aws-sdk/middleware-recursion-detection': 3.418.0 - '@aws-sdk/middleware-user-agent': 3.418.0 - '@aws-sdk/types': 3.418.0 - '@aws-sdk/util-endpoints': 3.418.0 - '@aws-sdk/util-user-agent-browser': 3.418.0 - '@aws-sdk/util-user-agent-node': 3.418.0 - '@smithy/config-resolver': 2.0.10 - '@smithy/fetch-http-handler': 2.1.5 - '@smithy/hash-node': 2.0.9 - '@smithy/invalid-dependency': 2.0.9 - '@smithy/middleware-content-length': 2.0.11 - '@smithy/middleware-endpoint': 2.0.9 - '@smithy/middleware-retry': 2.0.12 - '@smithy/middleware-serde': 2.0.9 - '@smithy/middleware-stack': 2.0.3 - '@smithy/node-config-provider': 2.0.12 - '@smithy/node-http-handler': 2.1.5 - '@smithy/property-provider': 2.0.10 - '@smithy/protocol-http': 3.0.5 - '@smithy/shared-ini-file-loader': 2.0.11 - '@smithy/smithy-client': 2.1.7 - '@smithy/types': 2.3.3 - '@smithy/url-parser': 2.0.9 - '@smithy/util-base64': 2.0.0 - '@smithy/util-body-length-browser': 2.0.0 - '@smithy/util-body-length-node': 2.1.0 - '@smithy/util-defaults-mode-browser': 2.0.11 - '@smithy/util-defaults-mode-node': 2.0.13 - '@smithy/util-retry': 2.0.2 - '@smithy/util-utf8': 2.0.0 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt + tslib: 2.6.3 dev: false - /@aws-sdk/token-providers@3.614.0(@aws-sdk/client-sso-oidc@3.614.0): + /@aws-sdk/token-providers@3.614.0(@aws-sdk/client-sso-oidc@3.621.0): resolution: {integrity: sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==} engines: {node: '>=16.0.0'} peerDependencies: '@aws-sdk/client-sso-oidc': ^3.614.0 dependencies: - '@aws-sdk/client-sso-oidc': 3.614.0(@aws-sdk/client-sts@3.614.0) + '@aws-sdk/client-sso-oidc': 3.621.0(@aws-sdk/client-sts@3.621.0) '@aws-sdk/types': 3.609.0 '@smithy/property-provider': 3.1.3 '@smithy/shared-ini-file-loader': 3.1.4 '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@aws-sdk/types@3.418.0: - resolution: {integrity: sha512-y4PQSH+ulfFLY0+FYkaK4qbIaQI9IJNMO2xsxukW6/aNoApNymN1D2FSi2la8Qbp/iPjNDKsG8suNPm9NtsWXQ==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/types': 2.3.3 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@aws-sdk/types@3.609.0: @@ -2419,29 +1929,14 @@ packages: engines: {node: '>=16.0.0'} dependencies: '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@aws-sdk/util-arn-parser@3.310.0: - resolution: {integrity: sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA==} - engines: {node: '>=14.0.0'} - dependencies: - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@aws-sdk/util-arn-parser@3.568.0: resolution: {integrity: sha512-XUKJWWo+KOB7fbnPP0+g/o5Ulku/X53t7i/h+sPHr5xxYTJJ9CYnbToo95mzxe7xWvkLrsNtJ8L+MnNn9INs2w==} engines: {node: '>=16.0.0'} dependencies: - tslib: 2.6.2 - dev: false - - /@aws-sdk/util-endpoints@3.418.0: - resolution: {integrity: sha512-sYSDwRTl7yE7LhHkPzemGzmIXFVHSsi3AQ1KeNEk84eBqxMHHcCc2kqklaBk2roXWe50QDgRMy1ikZUxvtzNHQ==} - engines: {node: '>=14.0.0'} - dependencies: - '@aws-sdk/types': 3.418.0 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@aws-sdk/util-endpoints@3.614.0: @@ -2451,23 +1946,14 @@ packages: '@aws-sdk/types': 3.609.0 '@smithy/types': 3.3.0 '@smithy/util-endpoints': 2.0.5 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@aws-sdk/util-locate-window@3.310.0: - resolution: {integrity: sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==} - engines: {node: '>=14.0.0'} - dependencies: - tslib: 2.6.2 - dev: false - - /@aws-sdk/util-user-agent-browser@3.418.0: - resolution: {integrity: sha512-c4p4mc0VV/jIeNH0lsXzhJ1MpWRLuboGtNEpqE4s1Vl9ck2amv9VdUUZUmHbg+bVxlMgRQ4nmiovA4qIrqGuyg==} + /@aws-sdk/util-locate-window@3.568.0: + resolution: {integrity: sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==} + engines: {node: '>=16.0.0'} dependencies: - '@aws-sdk/types': 3.418.0 - '@smithy/types': 2.3.3 - bowser: 2.11.0 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@aws-sdk/util-user-agent-browser@3.609.0: @@ -2476,22 +1962,7 @@ packages: '@aws-sdk/types': 3.609.0 '@smithy/types': 3.3.0 bowser: 2.11.0 - tslib: 2.6.2 - dev: false - - /@aws-sdk/util-user-agent-node@3.418.0: - resolution: {integrity: sha512-BXMskXFtg+dmzSCgmnWOffokxIbPr1lFqa1D9kvM3l3IFRiFGx2IyDg+8MAhq11aPDLvoa/BDuQ0Yqma5izOhg==} - engines: {node: '>=14.0.0'} - peerDependencies: - aws-crt: '>=1.0.0' - peerDependenciesMeta: - aws-crt: - optional: true - dependencies: - '@aws-sdk/types': 3.418.0 - '@smithy/node-config-provider': 2.0.12 - '@smithy/types': 2.3.3 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@aws-sdk/util-user-agent-node@3.614.0: @@ -2506,20 +1977,7 @@ packages: '@aws-sdk/types': 3.609.0 '@smithy/node-config-provider': 3.1.4 '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@aws-sdk/util-utf8-browser@3.259.0: - resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} - dependencies: - tslib: 2.6.2 - dev: false - - /@aws-sdk/xml-builder@3.310.0: - resolution: {integrity: sha512-TqELu4mOuSIKQCqj63fGVs86Yh+vBx5nHRpWKNUNhB2nPTpfbziTs5c1X358be3peVWA4wPxW7Nt53KIg1tnNw==} - engines: {node: '>=14.0.0'} - dependencies: - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@aws-sdk/xml-builder@3.609.0: @@ -2527,1418 +1985,1433 @@ packages: engines: {node: '>=16.0.0'} dependencies: '@smithy/types': 3.3.0 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@babel/code-frame@7.21.4: - resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.22.13 - dev: true - - /@babel/code-frame@7.22.13: - resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + /@babel/code-frame@7.24.7: + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.22.13 - chalk: 2.4.2 + '@babel/highlight': 7.24.7 + picocolors: 1.0.1 - /@babel/compat-data@7.23.2: - resolution: {integrity: sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==} + /@babel/compat-data@7.25.2: + resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==} engines: {node: '>=6.9.0'} - /@babel/core@7.21.4: - resolution: {integrity: sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==} + /@babel/core@7.25.2: + resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} engines: {node: '>=6.9.0'} dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.21.4 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.21.4) - '@babel/helpers': 7.21.0 - '@babel/parser': 7.22.16 - '@babel/template': 7.22.15 - '@babel/traverse': 7.21.4 - '@babel/types': 7.23.0 - convert-source-map: 1.9.0 - debug: 4.3.4 + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.0 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helpers': 7.25.0 + '@babel/parser': 7.25.0 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.2 + '@babel/types': 7.25.2 + convert-source-map: 2.0.0 + debug: 4.3.6 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - /@babel/eslint-parser@7.21.3(@babel/core@7.21.4)(eslint@8.55.0): - resolution: {integrity: sha512-kfhmPimwo6k4P8zxNs8+T7yR44q1LdpsZdE1NkCsVlfiuTPRfnGgjaF8Qgug9q9Pou17u6wneYF0lDCZJATMFg==} + /@babel/eslint-parser@7.25.1(@babel/core@7.25.2)(eslint@8.57.0): + resolution: {integrity: sha512-Y956ghgTT4j7rKesabkh5WeqgSFZVFwaPR0IWFm7KFHFmmJ4afbG49SmfW4S+GyRPx0Dy5jxEWA5t0rpxfElWg==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: - '@babel/core': '>=7.11.0' - eslint: ^7.5.0 || ^8.0.0 + '@babel/core': ^7.11.0 + eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.25.2 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 8.55.0 + eslint: 8.57.0 eslint-visitor-keys: 2.1.0 semver: 6.3.1 dev: false - /@babel/generator@7.21.4: - resolution: {integrity: sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==} + /@babel/generator@7.25.0: + resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 + '@babel/types': 7.25.2 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 - /@babel/helper-annotate-as-pure@7.22.5: - resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + /@babel/helper-annotate-as-pure@7.24.7: + resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.25.2 - /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: - resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} + /@babel/helper-builder-binary-assignment-operator-visitor@7.24.7: + resolution: {integrity: sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/traverse': 7.25.2 + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color - /@babel/helper-compilation-targets@7.22.15: - resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + /@babel/helper-compilation-targets@7.25.2: + resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.23.2 - '@babel/helper-validator-option': 7.22.15 - browserslist: 4.21.10 + '@babel/compat-data': 7.25.2 + '@babel/helper-validator-option': 7.24.8 + browserslist: 4.23.2 lru-cache: 5.1.1 semver: 6.3.1 - /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.21.4): - resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} + /@babel/helper-create-class-features-plugin@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-member-expression-to-functions': 7.22.15 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.9(@babel/core@7.21.4) - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-member-expression-to-functions': 7.24.8 + '@babel/helper-optimise-call-expression': 7.24.7 + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/traverse': 7.25.2 semver: 6.3.1 + transitivePeerDependencies: + - supports-color - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.21.4): - resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + /@babel/helper-create-regexp-features-plugin@7.25.2(@babel/core@7.25.2): + resolution: {integrity: sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 regexpu-core: 5.3.2 semver: 6.3.1 - /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.21.4): - resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} + /@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.25.2): + resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} peerDependencies: - '@babel/core': ^7.4.0-0 + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - debug: 4.3.4 + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + debug: 4.3.6 lodash.debounce: 4.0.8 - resolve: 1.22.2 - semver: 6.3.1 + resolve: 1.22.8 transitivePeerDependencies: - supports-color - dev: false - /@babel/helper-define-polyfill-provider@0.4.3(@babel/core@7.21.4): - resolution: {integrity: sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + /@babel/helper-member-expression-to-functions@7.24.8: + resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==} + engines: {node: '>=6.9.0'} dependencies: - '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - debug: 4.3.4 - lodash.debounce: 4.0.8 - resolve: 1.22.2 + '@babel/traverse': 7.25.2 + '@babel/types': 7.25.2 transitivePeerDependencies: - supports-color - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} - engines: {node: '>=6.9.0'} - - /@babel/helper-environment-visitor@7.22.5: - resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} - engines: {node: '>=6.9.0'} - - /@babel/helper-function-name@7.22.5: - resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} + /@babel/helper-module-imports@7.24.7: + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.0 + '@babel/traverse': 7.25.2 + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + /@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2): + resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: - '@babel/types': 7.23.0 + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.2 + transitivePeerDependencies: + - supports-color - /@babel/helper-member-expression-to-functions@7.22.15: - resolution: {integrity: sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA==} + /@babel/helper-optimise-call-expression@7.24.7: + resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.25.2 - /@babel/helper-module-imports@7.22.15: - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + /@babel/helper-plugin-utils@7.24.8: + resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - /@babel/helper-module-transforms@7.22.17(@babel/core@7.21.4): - resolution: {integrity: sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==} + /@babel/helper-remap-async-to-generator@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-wrap-function': 7.25.0 + '@babel/traverse': 7.25.2 + transitivePeerDependencies: + - supports-color - /@babel/helper-module-transforms@7.23.0(@babel/core@7.21.4): - resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} + /@babel/helper-replace-supers@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/core': 7.25.2 + '@babel/helper-member-expression-to-functions': 7.24.8 + '@babel/helper-optimise-call-expression': 7.24.7 + '@babel/traverse': 7.25.2 + transitivePeerDependencies: + - supports-color - /@babel/helper-optimise-call-expression@7.22.5: - resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + /@babel/helper-simple-access@7.24.7: + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 - - /@babel/helper-plugin-utils@7.22.5: - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} - engines: {node: '>=6.9.0'} + '@babel/traverse': 7.25.2 + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color - /@babel/helper-remap-async-to-generator@7.22.17(@babel/core@7.21.4): - resolution: {integrity: sha512-bxH77R5gjH3Nkde6/LuncQoLaP16THYPscurp1S8z7S9ZgezCyV3G8Hc+TZiCmY8pz4fp8CvKSgtJMW0FkLAxA==} + /@babel/helper-skip-transparent-expression-wrappers@7.24.7: + resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-wrap-function': 7.22.20 + '@babel/traverse': 7.25.2 + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color - /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.21.4): - resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + /@babel/helper-string-parser@7.24.8: + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-wrap-function': 7.22.20 - /@babel/helper-replace-supers@7.22.9(@babel/core@7.21.4): - resolution: {integrity: sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==} + /@babel/helper-validator-identifier@7.24.7: + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-member-expression-to-functions': 7.22.15 - '@babel/helper-optimise-call-expression': 7.22.5 - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + /@babel/helper-validator-option@7.24.8: + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - /@babel/helper-skip-transparent-expression-wrappers@7.22.5: - resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + /@babel/helper-wrap-function@7.25.0: + resolution: {integrity: sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.2 + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + /@babel/helpers@7.25.0: + resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 - - /@babel/helper-string-parser@7.22.5: - resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} - engines: {node: '>=6.9.0'} + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - - /@babel/helper-validator-option@7.22.15: - resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + /@babel/highlight@7.24.7: + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 - /@babel/helper-wrap-function@7.22.20: - resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} - engines: {node: '>=6.9.0'} + /@babel/parser@7.25.0: + resolution: {integrity: sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA==} + engines: {node: '>=6.0.0'} + hasBin: true dependencies: - '@babel/helper-function-name': 7.22.5 - '@babel/template': 7.22.15 - '@babel/types': 7.23.0 + '@babel/types': 7.25.2 - /@babel/helpers@7.21.0: - resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} + /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-dG0aApncVQwAUJa8tP1VHTnmU67BeIQvKafd3raEx315H54FfkZSz3B/TT+33ZQAjatGJA79gZqTtqL5QZUKXw==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.21.4 - '@babel/types': 7.23.0 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/traverse': 7.25.2 transitivePeerDependencies: - supports-color - /@babel/highlight@7.22.13: - resolution: {integrity: sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==} + /@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - - /@babel/parser@7.22.16: - resolution: {integrity: sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.23.0 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.15(@babel/core@7.21.4): - resolution: {integrity: sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==} + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.15(@babel/core@7.21.4): - resolution: {integrity: sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==} + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.21.4) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/traverse': 7.25.2 + transitivePeerDependencies: + - supports-color - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.21.4): + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.25.2): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color dev: false - /@babel/plugin-proposal-class-properties@7.7.4(@babel/core@7.21.4): + /@babel/plugin-proposal-class-properties@7.7.4(@babel/core@7.25.2): resolution: {integrity: sha512-EcuXeV4Hv1X3+Q1TsuOmyyxeTRiSqurGJ26+I/FW1WbymmRRapVORm6x1Zl3iDIHyRxEs+VXWp6qnlcfcJSbbw==} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-proposal-decorators@7.21.0(@babel/core@7.21.4): - resolution: {integrity: sha512-MfgX49uRrFUTL/HvWtmx3zmpyzMMr4MTj3d527MLlr/4RTT9G/ytFFP7qet2uM2Ve03b+BkpWUpK+lRXnQ+v9w==} + /@babel/plugin-proposal-decorators@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-RL9GR0pUG5Kc8BUWLNDm2T5OpYwSX15r98I0IkgmRQTXuELq/OynH8xtMTMvTJFjXbMWFVTKtYkTaYQsuAwQlQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.9(@babel/core@7.21.4) - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/plugin-syntax-decorators': 7.21.0(@babel/core@7.21.4) + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-decorators': 7.24.7(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color - /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.21.4): + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.25.2): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) dev: false - /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.21.4): + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.25.2): resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) dev: false - /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.21.4): + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.25.2): resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color - /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.21.4): + /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.25.2): resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color dev: false - /@babel/plugin-proposal-private-property-in-object@7.21.0(@babel/core@7.21.4): - resolution: {integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==} + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2): + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.4) - dev: false + '@babel/core': 7.25.2 - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.21.4): - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + /@babel/plugin-proposal-private-property-in-object@7.21.11(@babel/core@7.25.2): + resolution: {integrity: sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + dev: false - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.21.4): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.21.4): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.21.4): + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-decorators@7.21.0(@babel/core@7.21.4): - resolution: {integrity: sha512-tIoPpGBR8UuM4++ccWN3gifhVvQu7ZizuR1fklhRJrd5ewgbkUS+0KVFeWWxELtn18NTLoW32XV7zyOgIAiz+w==} + /@babel/plugin-syntax-decorators@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-Ui4uLJJrRV1lb38zg1yYTmRKmiZLiftDEvZN2iq3kd9kUFU+PttmzTbAFC2ucRk/XJmtek6G23gPsuZbhrT8fQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-flow@7.21.4(@babel/core@7.21.4): - resolution: {integrity: sha512-l9xd3N+XG4fZRxEP3vXdK6RW7vN1Uf5dxzRC/09wV86wqZ/YYQooBIGNsiRdfNR3/q2/5pPzV4B54J/9ctX5jw==} + /@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} + /@babel/plugin-syntax-import-assertions@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} + /@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.21.4): + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - - /@babel/plugin-syntax-jsx@7.21.4(@babel/core@7.21.4): - resolution: {integrity: sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} + /@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.21.4): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.21.4): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.21.4): + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.21.4): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} + /@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.21.4): + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.25.2): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} + /@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-async-generator-functions@7.23.2(@babel/core@7.21.4): - resolution: {integrity: sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==} + /@babel/plugin-transform-async-generator-functions@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.21.4) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + '@babel/traverse': 7.25.2 + transitivePeerDependencies: + - supports-color - /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} + /@babel/plugin-transform-async-to-generator@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.17(@babel/core@7.21.4) + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color - /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} + /@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-block-scoping@7.23.0(@babel/core@7.21.4): - resolution: {integrity: sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==} + /@babel/plugin-transform-block-scoping@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} + /@babel/plugin-transform-class-properties@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color - /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.21.4): - resolution: {integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==} + /@babel/plugin-transform-class-static-block@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.4) + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color - /@babel/plugin-transform-classes@7.22.15(@babel/core@7.21.4): - resolution: {integrity: sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==} + /@babel/plugin-transform-classes@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.9(@babel/core@7.21.4) - '@babel/helper-split-export-declaration': 7.22.6 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + '@babel/traverse': 7.25.2 globals: 11.12.0 + transitivePeerDependencies: + - supports-color - /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} + /@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.22.15 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/template': 7.25.0 - /@babel/plugin-transform-destructuring@7.23.0(@babel/core@7.21.4): - resolution: {integrity: sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==} + /@babel/plugin-transform-destructuring@7.24.8(@babel/core@7.25.2): + resolution: {integrity: sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} + /@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} + /@babel/plugin-transform-duplicate-keys@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.21.4): - resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==} + /@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.4) + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} + /@babel/plugin-transform-dynamic-import@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) - /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.21.4): - resolution: {integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==} + /@babel/plugin-transform-exponentiation-operator@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.4) + '@babel/core': 7.25.2 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color - /@babel/plugin-transform-flow-strip-types@7.21.0(@babel/core@7.21.4): - resolution: {integrity: sha512-FlFA2Mj87a6sDkW4gfGrQQqwY/dLlBAyJa2dJEZ+FHXUVHBflO2wyKvg+OOEzXfrKYIa4HWl0mgmbCzt0cMb7w==} + /@babel/plugin-transform-export-namespace-from@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-flow': 7.21.4(@babel/core@7.21.4) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) - /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.21.4): - resolution: {integrity: sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==} + /@babel/plugin-transform-flow-strip-types@7.25.2(@babel/core@7.25.2): + resolution: {integrity: sha512-InBZ0O8tew5V0K6cHcQ+wgxlrjOw1W4wDXLkOTjLRD8GYhTSkxTVBtdy3MMtvYBrbAWa1Qm3hNoTc1620Yj+Mg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.25.2) - /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} + /@babel/plugin-transform-for-of@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + transitivePeerDependencies: + - supports-color - /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.21.4): - resolution: {integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==} + /@babel/plugin-transform-function-name@7.25.1(@babel/core@7.25.2): + resolution: {integrity: sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/traverse': 7.25.2 + transitivePeerDependencies: + - supports-color - /@babel/plugin-transform-literals@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} + /@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) - /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.21.4): - resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==} + /@babel/plugin-transform-literals@7.25.2(@babel/core@7.25.2): + resolution: {integrity: sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} + /@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) - /@babel/plugin-transform-modules-amd@7.23.0(@babel/core@7.21.4): - resolution: {integrity: sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==} + /@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.21.4): - resolution: {integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==} + /@babel/plugin-transform-modules-amd@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-simple-access': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color - /@babel/plugin-transform-modules-systemjs@7.23.0(@babel/core@7.21.4): - resolution: {integrity: sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==} + /@babel/plugin-transform-modules-commonjs@7.24.8(@babel/core@7.25.2): + resolution: {integrity: sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-simple-access': 7.24.7 + transitivePeerDependencies: + - supports-color - /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} + /@babel/plugin-transform-modules-systemjs@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-module-transforms': 7.22.17(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 - - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.2 + transitivePeerDependencies: + - supports-color - /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} + /@babel/plugin-transform-modules-umd@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color - /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.21.4): - resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==} + /@babel/plugin-transform-named-capturing-groups-regex@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.21.4): - resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==} + /@babel/plugin-transform-new-target@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-object-rest-spread@7.22.15(@babel/core@7.21.4): - resolution: {integrity: sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==} + /@babel/plugin-transform-nullish-coalescing-operator@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.23.2 - '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.21.4) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) - /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} + /@babel/plugin-transform-numeric-separator@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.9(@babel/core@7.21.4) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) - /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.21.4): - resolution: {integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==} + /@babel/plugin-transform-object-rest-spread@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) - /@babel/plugin-transform-optional-chaining@7.23.0(@babel/core@7.21.4): - resolution: {integrity: sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==} + /@babel/plugin-transform-object-super@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color - /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.21.4): - resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==} + /@babel/plugin-transform-optional-catch-binding@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) - /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} + /@babel/plugin-transform-optional-chaining@7.24.8(@babel/core@7.25.2): + resolution: {integrity: sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color - /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.21.4): - resolution: {integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==} + /@babel/plugin-transform-parameters@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.4) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} + /@babel/plugin-transform-private-methods@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color - /@babel/plugin-transform-react-constant-elements@7.21.3(@babel/core@7.21.4): - resolution: {integrity: sha512-4DVcFeWe/yDYBLp0kBmOGFJ6N2UYg7coGid1gdxb4co62dy/xISDMaYBXBVXEDhfgMk7qkbcYiGtwd5Q/hwDDQ==} + /@babel/plugin-transform-private-property-in-object@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color - /@babel/plugin-transform-react-display-name@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==} + /@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: false + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==} + /@babel/plugin-transform-react-constant-elements@7.25.1(@babel/core@7.25.2): + resolution: {integrity: sha512-SLV/giH/V4SmloZ6Dt40HjTGTAIkxn33TVIHxNGNvo8ezMhrxBkzisj4op1KZYPIOHFLqhv60OHvX+YRu4xbmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} + /@babel/plugin-transform-react-display-name@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.21.4) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-react-jsx@7.21.0(@babel/core@7.21.4): - resolution: {integrity: sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg==} + /@babel/plugin-transform-react-jsx-development@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.21.4) - '@babel/types': 7.23.0 - dev: true + '@babel/core': 7.25.2 + '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color - /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.21.4): - resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==} + /@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2): + resolution: {integrity: sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.21.4) - '@babel/types': 7.23.0 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color - /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==} + /@babel/plugin-transform-react-pure-annotations@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.21.4): - resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} + /@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 regenerator-transform: 0.15.2 - /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} + /@babel/plugin-transform-reserved-words@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-runtime@7.21.4(@babel/core@7.21.4): - resolution: {integrity: sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA==} + /@babel/plugin-transform-runtime@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.21.4) - babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.21.4) - babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.21.4) + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.25.2) + babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.25.2) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.25.2) semver: 6.3.1 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} + /@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-spread@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} + /@babel/plugin-transform-spread@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + transitivePeerDependencies: + - supports-color - /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} + /@babel/plugin-transform-sticky-regex@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} + /@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} + /@babel/plugin-transform-typeof-symbol@7.24.8(@babel/core@7.25.2): + resolution: {integrity: sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-typescript@7.22.15(@babel/core@7.21.4): - resolution: {integrity: sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==} + /@babel/plugin-transform-typescript@7.25.2(@babel/core@7.25.2): + resolution: {integrity: sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.21.4) + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color - /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.21.4): - resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} + /@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} + /@babel/plugin-transform-unicode-property-regex@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} + /@babel/plugin-transform-unicode-regex@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} + /@babel/plugin-transform-unicode-sets-regex@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 - /@babel/preset-env@7.23.2(@babel/core@7.21.4): - resolution: {integrity: sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==} + /@babel/preset-env@7.25.2(@babel/core@7.25.2): + resolution: {integrity: sha512-Y2Vkwy3ITW4id9c6KXshVV/x5yCGK7VdJmKkzOzNsDZMojRKfSA/033rRbLqlRozmhRXCejxWHLSJOg/wUHfzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.23.2 - '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.15(@babel/core@7.21.4) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.15(@babel/core@7.21.4) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.21.4) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.21.4) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.4) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.21.4) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.4) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.21.4) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-async-generator-functions': 7.23.2(@babel/core@7.21.4) - '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-block-scoping': 7.23.0(@babel/core@7.21.4) - '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-class-static-block': 7.22.11(@babel/core@7.21.4) - '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.21.4) - '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-destructuring': 7.23.0(@babel/core@7.21.4) - '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-dynamic-import': 7.22.11(@babel/core@7.21.4) - '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-export-namespace-from': 7.22.11(@babel/core@7.21.4) - '@babel/plugin-transform-for-of': 7.22.15(@babel/core@7.21.4) - '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-json-strings': 7.22.11(@babel/core@7.21.4) - '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-logical-assignment-operators': 7.22.11(@babel/core@7.21.4) - '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-modules-amd': 7.23.0(@babel/core@7.21.4) - '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.21.4) - '@babel/plugin-transform-modules-systemjs': 7.23.0(@babel/core@7.21.4) - '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-nullish-coalescing-operator': 7.22.11(@babel/core@7.21.4) - '@babel/plugin-transform-numeric-separator': 7.22.11(@babel/core@7.21.4) - '@babel/plugin-transform-object-rest-spread': 7.22.15(@babel/core@7.21.4) - '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-optional-catch-binding': 7.22.11(@babel/core@7.21.4) - '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.21.4) - '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.21.4) - '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-private-property-in-object': 7.22.11(@babel/core@7.21.4) - '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-regenerator': 7.22.10(@babel/core@7.21.4) - '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-unicode-escapes': 7.22.10(@babel/core@7.21.4) - '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.21.4) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.21.4) - '@babel/types': 7.23.0 - babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.21.4) - babel-plugin-polyfill-corejs3: 0.8.5(@babel/core@7.21.4) - babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.21.4) - core-js-compat: 3.32.2 + '@babel/compat-data': 7.25.2 + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-import-assertions': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-async-generator-functions': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-async-to-generator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoping': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-class-properties': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-class-static-block': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-classes': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-destructuring': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-dotall-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-duplicate-keys': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-dynamic-import': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-exponentiation-operator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-export-namespace-from': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-function-name': 7.25.1(@babel/core@7.25.2) + '@babel/plugin-transform-json-strings': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-literals': 7.25.2(@babel/core@7.25.2) + '@babel/plugin-transform-logical-assignment-operators': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-modules-amd': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-modules-systemjs': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-modules-umd': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-named-capturing-groups-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-new-target': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-numeric-separator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-object-rest-spread': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-optional-catch-binding': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-private-methods': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-private-property-in-object': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-regenerator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-reserved-words': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-sticky-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-typeof-symbol': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-escapes': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-property-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-sets-regex': 7.24.7(@babel/core@7.25.2) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.25.2) + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.25.2) + babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.25.2) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.25.2) + core-js-compat: 3.37.1 semver: 6.3.1 transitivePeerDependencies: - supports-color - /@babel/preset-flow@7.21.4(@babel/core@7.21.4): - resolution: {integrity: sha512-F24cSq4DIBmhq4OzK3dE63NHagb27OPE3eWR+HLekt4Z3Y5MzIIUGF3LlLgV0gN8vzbDViSY7HnrReNVCJXTeA==} + /@babel/preset-flow@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-NL3Lo0NorCU607zU3NwRyJbpaB6E3t0xtd3LfAQKDfkeX4/ggcDXvkmkW42QWT5owUeW/jAe4hn+2qvkV1IbfQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-transform-flow-strip-types': 7.21.0(@babel/core@7.21.4) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-transform-flow-strip-types': 7.25.2(@babel/core@7.25.2) dev: true - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.21.4): + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.25.2): resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/types': 7.23.0 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/types': 7.25.2 esutils: 2.0.3 - /@babel/preset-react@7.22.15(@babel/core@7.21.4): - resolution: {integrity: sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==} + /@babel/preset-react@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.21.4) - '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-react-pure-annotations': 7.22.5(@babel/core@7.21.4) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-transform-react-display-name': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2) + '@babel/plugin-transform-react-jsx-development': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-react-pure-annotations': 7.24.7(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color - /@babel/preset-typescript@7.23.2(@babel/core@7.21.4): - resolution: {integrity: sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA==} + /@babel/preset-typescript@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.21.4) - '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.21.4) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color /@babel/regjsgen@0.8.0: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - /@babel/runtime@7.21.0: - resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} + /@babel/runtime@7.25.0: + resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} engines: {node: '>=6.9.0'} dependencies: - regenerator-runtime: 0.13.11 + regenerator-runtime: 0.14.1 - /@babel/template@7.22.15: - resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + /@babel/template@7.25.0: + resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.13 - '@babel/parser': 7.22.16 - '@babel/types': 7.23.0 + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.25.0 + '@babel/types': 7.25.2 - /@babel/traverse@7.21.4: - resolution: {integrity: sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==} + /@babel/traverse@7.25.2: + resolution: {integrity: sha512-s4/r+a7xTnny2O6FcZzqgT6nE4/GHEdcqj4qAeglbUOh0TeglEfmNJFAd/OLoVtGd6ZhAO8GCVvCNUO5t/VJVQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.21.4 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.16 - '@babel/types': 7.23.0 - debug: 4.3.4 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.0 + '@babel/parser': 7.25.0 + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 + debug: 4.3.6 globals: 11.12.0 transitivePeerDependencies: - supports-color - /@babel/types@7.23.0: - resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} + /@babel/types@7.25.2: + resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 /@balena/dockerignore@1.0.2: @@ -3965,224 +3438,224 @@ packages: dependencies: '@jridgewell/trace-mapping': 0.3.9 - /@csstools/normalize.css@12.0.0: - resolution: {integrity: sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==} + /@csstools/normalize.css@12.1.1: + resolution: {integrity: sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==} dev: false - /@csstools/postcss-cascade-layers@1.1.1(postcss@8.4.30): + /@csstools/postcss-cascade-layers@1.1.1(postcss@8.4.40): resolution: {integrity: sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.0.11) - postcss: 8.4.30 - postcss-selector-parser: 6.0.11 + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.1) + postcss: 8.4.40 + postcss-selector-parser: 6.1.1 dev: false - /@csstools/postcss-color-function@1.1.1(postcss@8.4.30): + /@csstools/postcss-color-function@1.1.1(postcss@8.4.40): resolution: {integrity: sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.30) - postcss: 8.4.30 + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.40) + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false - /@csstools/postcss-font-format-keywords@1.0.1(postcss@8.4.30): + /@csstools/postcss-font-format-keywords@1.0.1(postcss@8.4.40): resolution: {integrity: sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.30 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false - /@csstools/postcss-hwb-function@1.0.2(postcss@8.4.30): + /@csstools/postcss-hwb-function@1.0.2(postcss@8.4.40): resolution: {integrity: sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.30 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false - /@csstools/postcss-ic-unit@1.0.1(postcss@8.4.30): + /@csstools/postcss-ic-unit@1.0.1(postcss@8.4.40): resolution: {integrity: sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.30) - postcss: 8.4.30 + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.40) + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false - /@csstools/postcss-is-pseudo-class@2.0.7(postcss@8.4.30): + /@csstools/postcss-is-pseudo-class@2.0.7(postcss@8.4.40): resolution: {integrity: sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.0.11) - postcss: 8.4.30 - postcss-selector-parser: 6.0.11 + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.1) + postcss: 8.4.40 + postcss-selector-parser: 6.1.1 dev: false - /@csstools/postcss-nested-calc@1.0.0(postcss@8.4.30): + /@csstools/postcss-nested-calc@1.0.0(postcss@8.4.40): resolution: {integrity: sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.30 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false - /@csstools/postcss-normalize-display-values@1.0.1(postcss@8.4.30): + /@csstools/postcss-normalize-display-values@1.0.1(postcss@8.4.40): resolution: {integrity: sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.30 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false - /@csstools/postcss-oklab-function@1.1.1(postcss@8.4.30): + /@csstools/postcss-oklab-function@1.1.1(postcss@8.4.40): resolution: {integrity: sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.30) - postcss: 8.4.30 + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.40) + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false - /@csstools/postcss-progressive-custom-properties@1.3.0(postcss@8.4.30): + /@csstools/postcss-progressive-custom-properties@1.3.0(postcss@8.4.40): resolution: {integrity: sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.3 dependencies: - postcss: 8.4.30 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false - /@csstools/postcss-stepped-value-functions@1.0.1(postcss@8.4.30): + /@csstools/postcss-stepped-value-functions@1.0.1(postcss@8.4.40): resolution: {integrity: sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.30 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false - /@csstools/postcss-text-decoration-shorthand@1.0.0(postcss@8.4.30): + /@csstools/postcss-text-decoration-shorthand@1.0.0(postcss@8.4.40): resolution: {integrity: sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.30 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false - /@csstools/postcss-trigonometric-functions@1.0.2(postcss@8.4.30): + /@csstools/postcss-trigonometric-functions@1.0.2(postcss@8.4.40): resolution: {integrity: sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==} engines: {node: ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.30 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false - /@csstools/postcss-unset-value@1.0.2(postcss@8.4.30): + /@csstools/postcss-unset-value@1.0.2(postcss@8.4.40): resolution: {integrity: sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.30 + postcss: 8.4.40 dev: false - /@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.0.11): + /@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.1.1): resolution: {integrity: sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss-selector-parser: ^6.0.10 dependencies: - postcss-selector-parser: 6.0.11 + postcss-selector-parser: 6.1.1 dev: false - /@ctrl/tinycolor@3.6.0: - resolution: {integrity: sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==} + /@ctrl/tinycolor@3.6.1: + resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} engines: {node: '>=10'} /@discoveryjs/json-ext@0.5.7: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} - /@dnd-kit/accessibility@3.0.1(react@18.2.0): - resolution: {integrity: sha512-HXRrwS9YUYQO9lFRc/49uO/VICbM+O+ZRpFDe9Pd1rwVv2PCNkRiTZRdxrDgng/UkvdC3Re9r2vwPpXXrWeFzg==} + /@dnd-kit/accessibility@3.1.0(react@18.3.1): + resolution: {integrity: sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==} peerDependencies: react: '>=16.8.0' dependencies: - react: 18.2.0 - tslib: 2.6.2 + react: 18.3.1 + tslib: 2.6.3 dev: false - /@dnd-kit/core@6.0.8(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-lYaoP8yHTQSLlZe6Rr9qogouGUz9oRUj4AHhDQGQzq/hqaJRpFo65X+JKsdHf8oUFBzx5A+SJPUvxAwTF2OabA==} + /@dnd-kit/core@6.1.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@dnd-kit/accessibility': 3.0.1(react@18.2.0) - '@dnd-kit/utilities': 3.2.1(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - tslib: 2.6.2 + '@dnd-kit/accessibility': 3.1.0(react@18.3.1) + '@dnd-kit/utilities': 3.2.2(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tslib: 2.6.3 dev: false - /@dnd-kit/modifiers@6.0.1(@dnd-kit/core@6.0.8)(react@18.2.0): + /@dnd-kit/modifiers@6.0.1(@dnd-kit/core@6.1.0)(react@18.3.1): resolution: {integrity: sha512-rbxcsg3HhzlcMHVHWDuh9LCjpOVAgqbV78wLGI8tziXY3+qcMQ61qVXIvNKQFuhj75dSfD+o+PYZQ/NUk2A23A==} peerDependencies: '@dnd-kit/core': ^6.0.6 react: '>=16.8.0' dependencies: - '@dnd-kit/core': 6.0.8(react-dom@18.2.0)(react@18.2.0) - '@dnd-kit/utilities': 3.2.1(react@18.2.0) - react: 18.2.0 - tslib: 2.6.2 + '@dnd-kit/core': 6.1.0(react-dom@18.3.1)(react@18.3.1) + '@dnd-kit/utilities': 3.2.2(react@18.3.1) + react: 18.3.1 + tslib: 2.6.3 dev: false - /@dnd-kit/sortable@7.0.2(@dnd-kit/core@6.0.8)(react@18.2.0): + /@dnd-kit/sortable@7.0.2(@dnd-kit/core@6.1.0)(react@18.3.1): resolution: {integrity: sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA==} peerDependencies: '@dnd-kit/core': ^6.0.7 react: '>=16.8.0' dependencies: - '@dnd-kit/core': 6.0.8(react-dom@18.2.0)(react@18.2.0) - '@dnd-kit/utilities': 3.2.1(react@18.2.0) - react: 18.2.0 - tslib: 2.6.2 + '@dnd-kit/core': 6.1.0(react-dom@18.3.1)(react@18.3.1) + '@dnd-kit/utilities': 3.2.2(react@18.3.1) + react: 18.3.1 + tslib: 2.6.3 dev: false - /@dnd-kit/utilities@3.2.1(react@18.2.0): - resolution: {integrity: sha512-OOXqISfvBw/1REtkSK2N3Fi2EQiLMlWUlqnOK/UpOISqBZPWpE6TqL+jcPtMOkE8TqYGiURvRdPSI9hltNUjEA==} + /@dnd-kit/utilities@3.2.2(react@18.3.1): + resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} peerDependencies: react: '>=16.8.0' dependencies: - react: 18.2.0 - tslib: 2.6.2 + react: 18.3.1 + tslib: 2.6.3 dev: false /@edge-runtime/cookies@3.4.1: @@ -4202,16 +3675,21 @@ packages: '@edge-runtime/cookies': 3.4.1 dev: true - /@edge-runtime/primitives@3.1.1: - resolution: {integrity: sha512-ROO22py+KdAfzqWZu6CtVMC4qV6mS0W1jPI51jGXE+uenyBUN7cQTWB9ReQc8Bm4cnjqmhajvpqEx3j7Y9iSOg==} + /@edge-runtime/ponyfill@2.4.1: + resolution: {integrity: sha512-ZbR/EViY3gg2rmEAQTKPa6mXl4aR1/+cFcQe4r1segCjEbTAxT6PWu40odbu/KlZKSysEb2O/BWIC2lJgSJOMQ==} + engines: {node: '>=16'} + dev: true + + /@edge-runtime/primitives@4.0.5: + resolution: {integrity: sha512-t7QiN5d/KpXgCvIfSt6Nm9Hj3WVdNgc5CpOD73jasY+9EvTI7Ngdj5cXvjcHrPcmYWJZMySPgeEeoL/1N/Llag==} engines: {node: '>=16'} dev: true - /@edge-runtime/vm@3.1.1: - resolution: {integrity: sha512-6NJRRG04/91qnWLZj+wZm27q6fJkTbkZdIJdo/Ig++GTxkAv8Wh/45nIcz9Xg7AzIAMpAkflFdiCrCoZ3hp1Iw==} + /@edge-runtime/vm@3.1.7: + resolution: {integrity: sha512-hUMFbDQ/nZN+1TLMi6iMO1QFz9RSV8yGG8S42WFPFma1d7VSNE0eMdJUmwjmtav22/iQkzHMmu6oTSfAvRGS8g==} engines: {node: '>=16'} dependencies: - '@edge-runtime/primitives': 3.1.1 + '@edge-runtime/primitives': 4.0.5 dev: true /@emotion/hash@0.8.0: @@ -4220,17 +3698,17 @@ packages: /@emotion/unitless@0.7.5: resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} - /@eslint-community/eslint-utils@4.4.0(eslint@8.55.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.55.0 + eslint: 8.57.0 eslint-visitor-keys: 3.4.3 - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + /@eslint-community/regexpp@4.11.0: + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} /@eslint/eslintrc@1.4.1: @@ -4238,10 +3716,10 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.4 + debug: 4.3.6 espree: 9.6.1 - globals: 13.20.0 - ignore: 5.2.4 + globals: 13.24.0 + ignore: 5.3.1 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -4254,10 +3732,10 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.4 + debug: 4.3.6 espree: 9.6.1 - globals: 13.20.0 - ignore: 5.2.4 + globals: 13.24.0 + ignore: 5.3.1 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -4265,8 +3743,8 @@ packages: transitivePeerDependencies: - supports-color - /@eslint/js@8.55.0: - resolution: {integrity: sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==} + /@eslint/js@8.57.0: + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} /@fastify/busboy@1.2.1: @@ -4276,120 +3754,133 @@ packages: text-decoding: 1.0.0 dev: false - /@firebase/analytics-compat@0.2.6(@firebase/app-compat@0.2.19)(@firebase/app@0.9.19): - resolution: {integrity: sha512-4MqpVLFkGK7NJf/5wPEEP7ePBJatwYpyjgJ+wQHQGHfzaCDgntOnl9rL2vbVGGKCnRqWtZDIWhctB86UWXaX2Q==} + /@fastify/busboy@2.1.1: + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + + /@firebase/analytics-compat@0.2.12(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7): + resolution: {integrity: sha512-rXWnOAdEHbvBPLNjFLu3U0yDZVIAi+C0DL+RkUEOirfSqAeQaKzBCATeBw6+K7FVpEnknhm4tZrvVUVtJjShMw==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/analytics': 0.10.0(@firebase/app@0.9.19) - '@firebase/analytics-types': 0.8.0 - '@firebase/app-compat': 0.2.19 - '@firebase/component': 0.6.4 - '@firebase/util': 1.9.3 - tslib: 2.6.2 + '@firebase/analytics': 0.10.6(@firebase/app@0.10.7) + '@firebase/analytics-types': 0.8.2 + '@firebase/app-compat': 0.2.37 + '@firebase/component': 0.6.8 + '@firebase/util': 1.9.7 + tslib: 2.6.3 transitivePeerDependencies: - '@firebase/app' - /@firebase/analytics-types@0.8.0: - resolution: {integrity: sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw==} + /@firebase/analytics-types@0.8.2: + resolution: {integrity: sha512-EnzNNLh+9/sJsimsA/FGqzakmrAUKLeJvjRHlg8df1f97NLUlFidk9600y0ZgWOp3CAxn6Hjtk+08tixlUOWyw==} - /@firebase/analytics@0.10.0(@firebase/app@0.9.19): - resolution: {integrity: sha512-Locv8gAqx0e+GX/0SI3dzmBY5e9kjVDtD+3zCFLJ0tH2hJwuCAiL+5WkHuxKj92rqQj/rvkBUCfA1ewlX2hehg==} + /@firebase/analytics@0.10.6(@firebase/app@0.10.7): + resolution: {integrity: sha512-sB59EwcAvLt0fINGfMWmcRKcdUiYhE4AJNdDXSCSDo4D/ZXFRmb6qwX9YesKHXFB59XTLT03mAjqQcDrdym9qA==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.9.19 - '@firebase/component': 0.6.4 - '@firebase/installations': 0.6.4(@firebase/app@0.9.19) - '@firebase/logger': 0.4.0 - '@firebase/util': 1.9.3 - tslib: 2.6.2 + '@firebase/app': 0.10.7 + '@firebase/component': 0.6.8 + '@firebase/installations': 0.6.8(@firebase/app@0.10.7) + '@firebase/logger': 0.4.2 + '@firebase/util': 1.9.7 + safevalues: 0.6.0 + tslib: 2.6.3 - /@firebase/app-check-compat@0.3.7(@firebase/app-compat@0.2.19)(@firebase/app@0.9.19): - resolution: {integrity: sha512-cW682AxsyP1G+Z0/P7pO/WT2CzYlNxoNe5QejVarW2o5ZxeWSSPAiVEwpEpQR/bUlUmdeWThYTMvBWaopdBsqw==} + /@firebase/app-check-compat@0.3.13(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7): + resolution: {integrity: sha512-1sbS5Apq7dLys1KYdNQsmZLFIjJoFP9Mv4bzIcdXuTkWQjr3X2qAvwiTslC6prVAUMiTV0eM9eicdQIXVsiSRw==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-check': 0.8.0(@firebase/app@0.9.19) - '@firebase/app-check-types': 0.5.0 - '@firebase/app-compat': 0.2.19 - '@firebase/component': 0.6.4 - '@firebase/logger': 0.4.0 - '@firebase/util': 1.9.3 - tslib: 2.6.2 + '@firebase/app-check': 0.8.6(@firebase/app@0.10.7) + '@firebase/app-check-types': 0.5.2 + '@firebase/app-compat': 0.2.37 + '@firebase/component': 0.6.8 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.9.7 + tslib: 2.6.3 transitivePeerDependencies: - '@firebase/app' - /@firebase/app-check-interop-types@0.3.0: - resolution: {integrity: sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg==} + /@firebase/app-check-interop-types@0.3.2: + resolution: {integrity: sha512-LMs47Vinv2HBMZi49C09dJxp0QT5LwDzFaVGf/+ITHe3BlIhUiLNttkATSXplc89A2lAaeTqjgqVkiRfUGyQiQ==} - /@firebase/app-check-types@0.5.0: - resolution: {integrity: sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ==} + /@firebase/app-check-types@0.5.2: + resolution: {integrity: sha512-FSOEzTzL5bLUbD2co3Zut46iyPWML6xc4x+78TeaXMSuJap5QObfb+rVvZJtla3asN4RwU7elaQaduP+HFizDA==} - /@firebase/app-check@0.8.0(@firebase/app@0.9.19): - resolution: {integrity: sha512-dRDnhkcaC2FspMiRK/Vbp+PfsOAEP6ZElGm9iGFJ9fDqHoPs0HOPn7dwpJ51lCFi1+2/7n5pRPGhqF/F03I97g==} + /@firebase/app-check@0.8.6(@firebase/app@0.10.7): + resolution: {integrity: sha512-uSzl0/SDw54hwuORWHDtldb9kK/QEVZOcoPn2mlIjMrJOLDug/6kcqnIN3IHzwmPyf23Epg0AGBktvG2FugW4w==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.9.19 - '@firebase/component': 0.6.4 - '@firebase/logger': 0.4.0 - '@firebase/util': 1.9.3 - tslib: 2.6.2 + '@firebase/app': 0.10.7 + '@firebase/component': 0.6.8 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.9.7 + safevalues: 0.6.0 + tslib: 2.6.3 - /@firebase/app-compat@0.2.19: - resolution: {integrity: sha512-QkJDqYqjhvs4fTMcRVXQkP9hbo5yfoJXDWkhU4VA5Vzs8Qsp76VPzYbqx5SD5OmBy+bz/Ot1UV8qySPGI4aKuw==} + /@firebase/app-compat@0.2.37: + resolution: {integrity: sha512-yiQLYT9LYQHuJGu/msuBLFtdWWTJ3Pz04E9gSeWykSB+8s0XXJJqfqQlghH7CcQ3KnJZR+Wuc3zSMcY3a+dn6Q==} dependencies: - '@firebase/app': 0.9.19 - '@firebase/component': 0.6.4 - '@firebase/logger': 0.4.0 - '@firebase/util': 1.9.3 - tslib: 2.6.2 + '@firebase/app': 0.10.7 + '@firebase/component': 0.6.8 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.9.7 + tslib: 2.6.3 /@firebase/app-types@0.9.0: resolution: {integrity: sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==} + dev: false + + /@firebase/app-types@0.9.2: + resolution: {integrity: sha512-oMEZ1TDlBz479lmABwWsWjzHwheQKiAgnuKxE0pz0IXCVx7/rtlkx1fQ6GfgK24WCrxDKMplZrT50Kh04iMbXQ==} - /@firebase/app@0.9.19: - resolution: {integrity: sha512-t/SHyZ3xWkR77ZU9VMoobDNFLdDKQ5xqoCAn4o16gTsA1C8sJ6ZOMZ02neMOPxNHuQXVE4tA8ukilnDbnK7uJA==} + /@firebase/app@0.10.7: + resolution: {integrity: sha512-7OCd53B+wnk/onbMLn/vM10pDjw97zzWUD8m3swtLYKJIrL+gDZ7HZ4xcbBLw7OB8ikzu8k1ORNjRe2itgAy4g==} dependencies: - '@firebase/component': 0.6.4 - '@firebase/logger': 0.4.0 - '@firebase/util': 1.9.3 + '@firebase/component': 0.6.8 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.9.7 idb: 7.1.1 - tslib: 2.6.2 + tslib: 2.6.3 - /@firebase/auth-compat@0.4.6(@firebase/app-compat@0.2.19)(@firebase/app-types@0.9.0)(@firebase/app@0.9.19): - resolution: {integrity: sha512-pKp1d4fSf+yoy1EBjTx9ISxlunqhW0vTICk0ByZ3e+Lp6ZIXThfUy4F1hAJlEafD/arM0oepRiAh7LXS1xn/BA==} + /@firebase/auth-compat@0.5.10(@firebase/app-compat@0.2.37)(@firebase/app-types@0.9.2)(@firebase/app@0.10.7): + resolution: {integrity: sha512-epDhgNIXmhl9DPuTW9Ec5NDJJKMFIdXBXiQI9O0xNHveow/ETtBCY86srzF7iCacqsd30CcpLwwXlhk8Y19Olg==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.2.19 - '@firebase/auth': 1.3.0(@firebase/app@0.9.19) - '@firebase/auth-types': 0.12.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.3) - '@firebase/component': 0.6.4 - '@firebase/util': 1.9.3 - node-fetch: 2.6.7 - tslib: 2.6.2 + '@firebase/app-compat': 0.2.37 + '@firebase/auth': 1.7.5(@firebase/app@0.10.7) + '@firebase/auth-types': 0.12.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.7) + '@firebase/component': 0.6.8 + '@firebase/util': 1.9.7 + tslib: 2.6.3 + undici: 5.28.4 transitivePeerDependencies: - '@firebase/app' - '@firebase/app-types' - '@react-native-async-storage/async-storage' - - encoding /@firebase/auth-interop-types@0.2.1: resolution: {integrity: sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==} + dev: false - /@firebase/auth-types@0.12.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.3): - resolution: {integrity: sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA==} + /@firebase/auth-interop-types@0.2.3: + resolution: {integrity: sha512-Fc9wuJGgxoxQeavybiuwgyi+0rssr76b+nHpj+eGhXFYAdudMWyfBHvFL/I5fEHniUM/UQdFzi9VXJK2iZF7FQ==} + + /@firebase/auth-types@0.12.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.7): + resolution: {integrity: sha512-qsEBaRMoGvHO10unlDJhaKSuPn4pyoTtlQuP1ghZfzB6rNQPuhp/N/DcFZxm9i4v0SogjCbf9reWupwIvfmH6w==} peerDependencies: '@firebase/app-types': 0.x '@firebase/util': 1.x dependencies: - '@firebase/app-types': 0.9.0 - '@firebase/util': 1.9.3 + '@firebase/app-types': 0.9.2 + '@firebase/util': 1.9.7 - /@firebase/auth@1.3.0(@firebase/app@0.9.19): - resolution: {integrity: sha512-vjK4CHbY9aWdiVOrKi6mpa8z6uxeaf7LB/MZTHuZOiGHMcUoTGB6TeMbRShyqk1uaMrxhhZ5Ar/dR0965E1qyA==} + /@firebase/auth@1.7.5(@firebase/app@0.10.7): + resolution: {integrity: sha512-DMFR1OA/f1/voeuFbSORg9AP36pMgOoSb/DRgiDalLmIJsDTlQNMCu+givjMP4s/XL85+tBk2MerYnK/AscJjw==} peerDependencies: '@firebase/app': 0.x '@react-native-async-storage/async-storage': ^1.18.1 @@ -4397,20 +3888,25 @@ packages: '@react-native-async-storage/async-storage': optional: true dependencies: - '@firebase/app': 0.9.19 - '@firebase/component': 0.6.4 - '@firebase/logger': 0.4.0 - '@firebase/util': 1.9.3 - node-fetch: 2.6.7 - tslib: 2.6.2 - transitivePeerDependencies: - - encoding + '@firebase/app': 0.10.7 + '@firebase/component': 0.6.8 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.9.7 + tslib: 2.6.3 + undici: 5.28.4 /@firebase/component@0.6.4: resolution: {integrity: sha512-rLMyrXuO9jcAUCaQXCMjCMUsWrba5fzHlNK24xz5j2W6A/SRmK8mZJ/hn7V0fViLbxC0lPMtrK1eYzk6Fg03jA==} dependencies: '@firebase/util': 1.9.3 - tslib: 2.6.2 + tslib: 2.6.3 + dev: false + + /@firebase/component@0.6.8: + resolution: {integrity: sha512-LcNvxGLLGjBwB0dJUsBGCej2fqAepWyBubs4jt1Tiuns7QLbXHuyObZ4aMeBjZjWx4m8g1LoVI9QFpSaq/k4/g==} + dependencies: + '@firebase/util': 1.9.7 + tslib: 2.6.3 /@firebase/database-compat@0.3.4: resolution: {integrity: sha512-kuAW+l+sLMUKBThnvxvUZ+Q1ZrF/vFJ58iUY9kAcbX48U03nVzIF6Tmkf0p3WVQwMqiXguSgtOPIB6ZCeF+5Gg==} @@ -4420,18 +3916,18 @@ packages: '@firebase/database-types': 0.10.4 '@firebase/logger': 0.4.0 '@firebase/util': 1.9.3 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@firebase/database-compat@1.0.1: - resolution: {integrity: sha512-ky82yLIboLxtAIWyW/52a6HLMVTzD2kpZlEilVDok73pNPLjkJYowj8iaIWK5nTy7+6Gxt7d00zfjL6zckGdXQ==} + /@firebase/database-compat@1.0.6: + resolution: {integrity: sha512-1OGA0sLY47mkXjhICCrUTXEYFnSSXoiXWm1SHsN62b+Lzs5aKA3aWTjTUmYIoK93kDAMPkYpulSv8jcbH4Hwew==} dependencies: - '@firebase/component': 0.6.4 - '@firebase/database': 1.0.1 - '@firebase/database-types': 1.0.0 - '@firebase/logger': 0.4.0 - '@firebase/util': 1.9.3 - tslib: 2.6.2 + '@firebase/component': 0.6.8 + '@firebase/database': 1.0.6 + '@firebase/database-types': 1.0.4 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.9.7 + tslib: 2.6.3 /@firebase/database-types@0.10.4: resolution: {integrity: sha512-dPySn0vJ/89ZeBac70T+2tWWPiJXWbmRygYv0smT5TfE3hDrQ09eKMF3Y+vMlTdrMWq7mUdYW5REWPSGH4kAZQ==} @@ -4440,11 +3936,11 @@ packages: '@firebase/util': 1.9.3 dev: false - /@firebase/database-types@1.0.0: - resolution: {integrity: sha512-SjnXStoE0Q56HcFgNQ+9SsmJc0c8TqGARdI/T44KXy+Ets3r6x/ivhQozT66bMnCEjJRywYoxNurRTMlZF8VNg==} + /@firebase/database-types@1.0.4: + resolution: {integrity: sha512-mz9ZzbH6euFXbcBo+enuJ36I5dR5w+enJHHjy9Y5ThCdKUseqfDjW3vCp1YxE9zygFCSjJJ/z1cQ+zodvUcwPQ==} dependencies: - '@firebase/app-types': 0.9.0 - '@firebase/util': 1.9.3 + '@firebase/app-types': 0.9.2 + '@firebase/util': 1.9.7 /@firebase/database@0.14.4: resolution: {integrity: sha512-+Ea/IKGwh42jwdjCyzTmeZeLM3oy1h0mFPsTy6OqCWzcu/KFqRAr5Tt1HRCOBlNOdbh84JPZC47WLU18n2VbxQ==} @@ -4454,268 +3950,287 @@ packages: '@firebase/logger': 0.4.0 '@firebase/util': 1.9.3 faye-websocket: 0.11.4 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@firebase/database@1.0.1: - resolution: {integrity: sha512-VAhF7gYwunW4Lw/+RQZvW8dlsf2r0YYqV9W0Gi2Mz8+0TGg1mBJWoUtsHfOr8kPJXhcLsC4eP/z3x6L/Fvjk/A==} + /@firebase/database@1.0.6: + resolution: {integrity: sha512-nrexUEG/fpVlHtWKkyfhTC3834kZ1WS7voNyqbBsBCqHXQOvznN5Z0L3nxBqdXSJyltNAf4ndFlQqm5gZiEczQ==} dependencies: - '@firebase/auth-interop-types': 0.2.1 - '@firebase/component': 0.6.4 - '@firebase/logger': 0.4.0 - '@firebase/util': 1.9.3 + '@firebase/app-check-interop-types': 0.3.2 + '@firebase/auth-interop-types': 0.2.3 + '@firebase/component': 0.6.8 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.9.7 faye-websocket: 0.11.4 - tslib: 2.6.2 + tslib: 2.6.3 - /@firebase/firestore-compat@0.3.18(@firebase/app-compat@0.2.19)(@firebase/app-types@0.9.0)(@firebase/app@0.9.19): - resolution: {integrity: sha512-hkqv4mb1oScKbEtzfcK8Go8c0VpDWmbAvbD6B6XnphLqi27pkXgo9Rp+aSKlD7cBL29VMEekP5bEm9lSVfZpNw==} + /@firebase/firestore-compat@0.3.33(@firebase/app-compat@0.2.37)(@firebase/app-types@0.9.2)(@firebase/app@0.10.7): + resolution: {integrity: sha512-i42a2l31N95CwYEB7zmfK0FS1mrO6pwOLwxavCrwu1BCFrVVVQhUheTPIda/iGguK/2Nog0RaIR1bo7QkZEz3g==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.2.19 - '@firebase/component': 0.6.4 - '@firebase/firestore': 4.2.0(@firebase/app@0.9.19) - '@firebase/firestore-types': 3.0.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.3) - '@firebase/util': 1.9.3 - tslib: 2.6.2 + '@firebase/app-compat': 0.2.37 + '@firebase/component': 0.6.8 + '@firebase/firestore': 4.6.4(@firebase/app@0.10.7) + '@firebase/firestore-types': 3.0.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.7) + '@firebase/util': 1.9.7 + tslib: 2.6.3 transitivePeerDependencies: - '@firebase/app' - '@firebase/app-types' - - encoding - /@firebase/firestore-types@3.0.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.3): - resolution: {integrity: sha512-Meg4cIezHo9zLamw0ymFYBD4SMjLb+ZXIbuN7T7ddXN6MGoICmOTq3/ltdCGoDCS2u+H1XJs2u/cYp75jsX9Qw==} + /@firebase/firestore-types@3.0.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.7): + resolution: {integrity: sha512-wp1A+t5rI2Qc/2q7r2ZpjUXkRVPtGMd6zCLsiWurjsQpqPgFin3AhNibKcIzoF2rnToNa/XYtyWXuifjOOwDgg==} peerDependencies: '@firebase/app-types': 0.x '@firebase/util': 1.x dependencies: - '@firebase/app-types': 0.9.0 - '@firebase/util': 1.9.3 + '@firebase/app-types': 0.9.2 + '@firebase/util': 1.9.7 - /@firebase/firestore@4.2.0(@firebase/app@0.9.19): - resolution: {integrity: sha512-iKZqIdOBJpJUcwY5airLX0W04TLrQSJuActOP1HG5WoIY5oyGTQE4Ml7hl5GW7mBqFieT4ojtUuDXj6MLrn1lA==} + /@firebase/firestore@4.6.4(@firebase/app@0.10.7): + resolution: {integrity: sha512-vk2MoH5HxYEhiNg1l+yBXq1Fkhue/11bFg4HdlTv6BJHcTnnAj2a+/afPpatcW4MOdYA3Tv+d5nGzWbbOC1SHw==} engines: {node: '>=10.10.0'} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.9.19 - '@firebase/component': 0.6.4 - '@firebase/logger': 0.4.0 - '@firebase/util': 1.9.3 - '@firebase/webchannel-wrapper': 0.10.3 - '@grpc/grpc-js': 1.9.3 - '@grpc/proto-loader': 0.7.10 - node-fetch: 2.6.7 - tslib: 2.6.2 - transitivePeerDependencies: - - encoding + '@firebase/app': 0.10.7 + '@firebase/component': 0.6.8 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.9.7 + '@firebase/webchannel-wrapper': 1.0.1 + '@grpc/grpc-js': 1.9.15 + '@grpc/proto-loader': 0.7.13 + tslib: 2.6.3 + undici: 5.28.4 - /@firebase/functions-compat@0.3.5(@firebase/app-compat@0.2.19)(@firebase/app@0.9.19): - resolution: {integrity: sha512-uD4jwgwVqdWf6uc3NRKF8cSZ0JwGqSlyhPgackyUPe+GAtnERpS4+Vr66g0b3Gge0ezG4iyHo/EXW/Hjx7QhHw==} + /@firebase/functions-compat@0.3.12(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7): + resolution: {integrity: sha512-r3XUb5VlITWpML46JymfJPkK6I9j4SNlO7qWIXUc0TUmkv0oAfVoiIt1F83/NuMZXaGr4YWA/794nVSy4GV8tw==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.2.19 - '@firebase/component': 0.6.4 - '@firebase/functions': 0.10.0(@firebase/app@0.9.19) - '@firebase/functions-types': 0.6.0 - '@firebase/util': 1.9.3 - tslib: 2.6.2 + '@firebase/app-compat': 0.2.37 + '@firebase/component': 0.6.8 + '@firebase/functions': 0.11.6(@firebase/app@0.10.7) + '@firebase/functions-types': 0.6.2 + '@firebase/util': 1.9.7 + tslib: 2.6.3 transitivePeerDependencies: - '@firebase/app' - - encoding - /@firebase/functions-types@0.6.0: - resolution: {integrity: sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw==} + /@firebase/functions-types@0.6.2: + resolution: {integrity: sha512-0KiJ9lZ28nS2iJJvimpY4nNccV21rkQyor5Iheu/nq8aKXJqtJdeSlZDspjPSBBiHRzo7/GMUttegnsEITqR+w==} - /@firebase/functions@0.10.0(@firebase/app@0.9.19): - resolution: {integrity: sha512-2U+fMNxTYhtwSpkkR6WbBcuNMOVaI7MaH3cZ6UAeNfj7AgEwHwMIFLPpC13YNZhno219F0lfxzTAA0N62ndWzA==} + /@firebase/functions@0.11.6(@firebase/app@0.10.7): + resolution: {integrity: sha512-GPfIBPtpwQvsC7SQbgaUjLTdja0CsNwMoKSgrzA1FGGRk4NX6qO7VQU6XCwBiAFWbpbQex6QWkSMsCzLx1uibQ==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.9.19 - '@firebase/app-check-interop-types': 0.3.0 - '@firebase/auth-interop-types': 0.2.1 - '@firebase/component': 0.6.4 - '@firebase/messaging-interop-types': 0.2.0 - '@firebase/util': 1.9.3 - node-fetch: 2.6.7 - tslib: 2.6.2 - transitivePeerDependencies: - - encoding + '@firebase/app': 0.10.7 + '@firebase/app-check-interop-types': 0.3.2 + '@firebase/auth-interop-types': 0.2.3 + '@firebase/component': 0.6.8 + '@firebase/messaging-interop-types': 0.2.2 + '@firebase/util': 1.9.7 + tslib: 2.6.3 + undici: 5.28.4 - /@firebase/installations-compat@0.2.4(@firebase/app-compat@0.2.19)(@firebase/app-types@0.9.0)(@firebase/app@0.9.19): - resolution: {integrity: sha512-LI9dYjp0aT9Njkn9U4JRrDqQ6KXeAmFbRC0E7jI7+hxl5YmRWysq5qgQl22hcWpTk+cm3es66d/apoDU/A9n6Q==} + /@firebase/installations-compat@0.2.8(@firebase/app-compat@0.2.37)(@firebase/app-types@0.9.2)(@firebase/app@0.10.7): + resolution: {integrity: sha512-pI2q8JFHB7yIq/szmhzGSWXtOvtzl6tCUmyykv5C8vvfOVJUH6mP4M4iwjbK8S1JotKd/K70+JWyYlxgQ0Kpyw==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.2.19 - '@firebase/component': 0.6.4 - '@firebase/installations': 0.6.4(@firebase/app@0.9.19) - '@firebase/installations-types': 0.5.0(@firebase/app-types@0.9.0) - '@firebase/util': 1.9.3 - tslib: 2.6.2 + '@firebase/app-compat': 0.2.37 + '@firebase/component': 0.6.8 + '@firebase/installations': 0.6.8(@firebase/app@0.10.7) + '@firebase/installations-types': 0.5.2(@firebase/app-types@0.9.2) + '@firebase/util': 1.9.7 + tslib: 2.6.3 transitivePeerDependencies: - '@firebase/app' - '@firebase/app-types' - /@firebase/installations-types@0.5.0(@firebase/app-types@0.9.0): - resolution: {integrity: sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg==} + /@firebase/installations-types@0.5.2(@firebase/app-types@0.9.2): + resolution: {integrity: sha512-que84TqGRZJpJKHBlF2pkvc1YcXrtEDOVGiDjovP/a3s6W4nlbohGXEsBJo0JCeeg/UG9A+DEZVDUV9GpklUzA==} peerDependencies: '@firebase/app-types': 0.x dependencies: - '@firebase/app-types': 0.9.0 + '@firebase/app-types': 0.9.2 - /@firebase/installations@0.6.4(@firebase/app@0.9.19): - resolution: {integrity: sha512-u5y88rtsp7NYkCHC3ElbFBrPtieUybZluXyzl7+4BsIz4sqb4vSAuwHEUgCgCeaQhvsnxDEU6icly8U9zsJigA==} + /@firebase/installations@0.6.8(@firebase/app@0.10.7): + resolution: {integrity: sha512-57V374qdb2+wT5v7+ntpLXBjZkO6WRgmAUbVkRfFTM/4t980p0FesbqTAcOIiM8U866UeuuuF8lYH70D3jM/jQ==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.9.19 - '@firebase/component': 0.6.4 - '@firebase/util': 1.9.3 - idb: 7.0.1 - tslib: 2.6.2 + '@firebase/app': 0.10.7 + '@firebase/component': 0.6.8 + '@firebase/util': 1.9.7 + idb: 7.1.1 + tslib: 2.6.3 /@firebase/logger@0.4.0: resolution: {integrity: sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==} dependencies: - tslib: 2.6.2 + tslib: 2.6.3 + dev: false + + /@firebase/logger@0.4.2: + resolution: {integrity: sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==} + dependencies: + tslib: 2.6.3 - /@firebase/messaging-compat@0.2.4(@firebase/app-compat@0.2.19)(@firebase/app@0.9.19): - resolution: {integrity: sha512-lyFjeUhIsPRYDPNIkYX1LcZMpoVbBWXX4rPl7c/rqc7G+EUea7IEtSt4MxTvh6fDfPuzLn7+FZADfscC+tNMfg==} + /@firebase/messaging-compat@0.2.10(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7): + resolution: {integrity: sha512-FXQm7rcowkDm8kFLduHV35IRYCRo+Ng0PIp/t1+EBuEbyplaKkGjZ932pE+owf/XR+G/60ku2QRBptRGLXZydg==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.2.19 - '@firebase/component': 0.6.4 - '@firebase/messaging': 0.12.4(@firebase/app@0.9.19) - '@firebase/util': 1.9.3 - tslib: 2.6.2 + '@firebase/app-compat': 0.2.37 + '@firebase/component': 0.6.8 + '@firebase/messaging': 0.12.10(@firebase/app@0.10.7) + '@firebase/util': 1.9.7 + tslib: 2.6.3 transitivePeerDependencies: - '@firebase/app' - /@firebase/messaging-interop-types@0.2.0: - resolution: {integrity: sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ==} + /@firebase/messaging-interop-types@0.2.2: + resolution: {integrity: sha512-l68HXbuD2PPzDUOFb3aG+nZj5KA3INcPwlocwLZOzPp9rFM9yeuI9YLl6DQfguTX5eAGxO0doTR+rDLDvQb5tA==} - /@firebase/messaging@0.12.4(@firebase/app@0.9.19): - resolution: {integrity: sha512-6JLZct6zUaex4g7HI3QbzeUrg9xcnmDAPTWpkoMpd/GoSVWH98zDoWXMGrcvHeCAIsLpFMe4MPoZkJbrPhaASw==} + /@firebase/messaging@0.12.10(@firebase/app@0.10.7): + resolution: {integrity: sha512-fGbxJPKpl2DIKNJGhbk4mYPcM+qE2gl91r6xPoiol/mN88F5Ym6UeRdMVZah+pijh9WxM55alTYwXuW40r1Y2Q==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.9.19 - '@firebase/component': 0.6.4 - '@firebase/installations': 0.6.4(@firebase/app@0.9.19) - '@firebase/messaging-interop-types': 0.2.0 - '@firebase/util': 1.9.3 - idb: 7.0.1 - tslib: 2.6.2 + '@firebase/app': 0.10.7 + '@firebase/component': 0.6.8 + '@firebase/installations': 0.6.8(@firebase/app@0.10.7) + '@firebase/messaging-interop-types': 0.2.2 + '@firebase/util': 1.9.7 + idb: 7.1.1 + tslib: 2.6.3 - /@firebase/performance-compat@0.2.4(@firebase/app-compat@0.2.19)(@firebase/app@0.9.19): - resolution: {integrity: sha512-nnHUb8uP9G8islzcld/k6Bg5RhX62VpbAb/Anj7IXs/hp32Eb2LqFPZK4sy3pKkBUO5wcrlRWQa6wKOxqlUqsg==} + /@firebase/performance-compat@0.2.8(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7): + resolution: {integrity: sha512-o7TFClRVJd3VIBoY7KZQqtCeW0PC6v9uBzM6Lfw3Nc9D7hM6OonqecYvh7NwJ6R14k+xM27frLS4BcCvFHKw2A==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.2.19 - '@firebase/component': 0.6.4 - '@firebase/logger': 0.4.0 - '@firebase/performance': 0.6.4(@firebase/app@0.9.19) - '@firebase/performance-types': 0.2.0 - '@firebase/util': 1.9.3 - tslib: 2.6.2 + '@firebase/app-compat': 0.2.37 + '@firebase/component': 0.6.8 + '@firebase/logger': 0.4.2 + '@firebase/performance': 0.6.8(@firebase/app@0.10.7) + '@firebase/performance-types': 0.2.2 + '@firebase/util': 1.9.7 + tslib: 2.6.3 transitivePeerDependencies: - '@firebase/app' - /@firebase/performance-types@0.2.0: - resolution: {integrity: sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA==} + /@firebase/performance-types@0.2.2: + resolution: {integrity: sha512-gVq0/lAClVH5STrIdKnHnCo2UcPLjJlDUoEB/tB4KM+hAeHUxWKnpT0nemUPvxZ5nbdY/pybeyMe8Cs29gEcHA==} - /@firebase/performance@0.6.4(@firebase/app@0.9.19): - resolution: {integrity: sha512-HfTn/bd8mfy/61vEqaBelNiNnvAbUtME2S25A67Nb34zVuCSCRIX4SseXY6zBnOFj3oLisaEqhVcJmVPAej67g==} + /@firebase/performance@0.6.8(@firebase/app@0.10.7): + resolution: {integrity: sha512-F+alziiIZ6Yn8FG47mxwljq+4XkgkT2uJIFRlkyViUQRLzrogaUJW6u/+6ZrePXnouKlKIwzqos3PVJraPEcCA==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.9.19 - '@firebase/component': 0.6.4 - '@firebase/installations': 0.6.4(@firebase/app@0.9.19) - '@firebase/logger': 0.4.0 - '@firebase/util': 1.9.3 - tslib: 2.6.2 + '@firebase/app': 0.10.7 + '@firebase/component': 0.6.8 + '@firebase/installations': 0.6.8(@firebase/app@0.10.7) + '@firebase/logger': 0.4.2 + '@firebase/util': 1.9.7 + tslib: 2.6.3 - /@firebase/remote-config-compat@0.2.4(@firebase/app-compat@0.2.19)(@firebase/app@0.9.19): - resolution: {integrity: sha512-FKiki53jZirrDFkBHglB3C07j5wBpitAaj8kLME6g8Mx+aq7u9P7qfmuSRytiOItADhWUj7O1JIv7n9q87SuwA==} + /@firebase/remote-config-compat@0.2.8(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7): + resolution: {integrity: sha512-UxSFOp6dzFj2AHB8Bq/BYtbq5iFyizKx4Rd6WxAdaKYM8cnPMeK+l2v+Oogtjae+AeyHRI+MfL2acsfVe5cd2A==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.2.19 - '@firebase/component': 0.6.4 - '@firebase/logger': 0.4.0 - '@firebase/remote-config': 0.4.4(@firebase/app@0.9.19) - '@firebase/remote-config-types': 0.3.0 - '@firebase/util': 1.9.3 - tslib: 2.6.2 + '@firebase/app-compat': 0.2.37 + '@firebase/component': 0.6.8 + '@firebase/logger': 0.4.2 + '@firebase/remote-config': 0.4.8(@firebase/app@0.10.7) + '@firebase/remote-config-types': 0.3.2 + '@firebase/util': 1.9.7 + tslib: 2.6.3 transitivePeerDependencies: - '@firebase/app' - /@firebase/remote-config-types@0.3.0: - resolution: {integrity: sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA==} + /@firebase/remote-config-types@0.3.2: + resolution: {integrity: sha512-0BC4+Ud7y2aPTyhXJTMTFfrGGLqdYXrUB9sJVAB8NiqJswDTc4/2qrE/yfUbnQJhbSi6ZaTTBKyG3n1nplssaA==} - /@firebase/remote-config@0.4.4(@firebase/app@0.9.19): - resolution: {integrity: sha512-x1ioTHGX8ZwDSTOVp8PBLv2/wfwKzb4pxi0gFezS5GCJwbLlloUH4YYZHHS83IPxnua8b6l0IXUaWd0RgbWwzQ==} + /@firebase/remote-config@0.4.8(@firebase/app@0.10.7): + resolution: {integrity: sha512-AMLqe6wfIRnjc6FkCWOSUjhc1fSTEf8o+cv1NolFvbiJ/tU+TqN4pI7pT+MIKQzNiq5fxLehkOx+xtAQBxPJKQ==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.9.19 - '@firebase/component': 0.6.4 - '@firebase/installations': 0.6.4(@firebase/app@0.9.19) - '@firebase/logger': 0.4.0 - '@firebase/util': 1.9.3 - tslib: 2.6.2 + '@firebase/app': 0.10.7 + '@firebase/component': 0.6.8 + '@firebase/installations': 0.6.8(@firebase/app@0.10.7) + '@firebase/logger': 0.4.2 + '@firebase/util': 1.9.7 + tslib: 2.6.3 - /@firebase/storage-compat@0.3.2(@firebase/app-compat@0.2.19)(@firebase/app-types@0.9.0)(@firebase/app@0.9.19): - resolution: {integrity: sha512-wvsXlLa9DVOMQJckbDNhXKKxRNNewyUhhbXev3t8kSgoCotd1v3MmqhKKz93ePhDnhHnDs7bYHy+Qa8dRY6BXw==} + /@firebase/storage-compat@0.3.9(@firebase/app-compat@0.2.37)(@firebase/app-types@0.9.2)(@firebase/app@0.10.7): + resolution: {integrity: sha512-WWgAp5bTW961oIsCc9+98m4MIVKpEqztAlIngfHfwO/x3DYoBPRl/awMRG3CAXyVxG+7B7oHC5IsnqM+vTwx2A==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.2.19 - '@firebase/component': 0.6.4 - '@firebase/storage': 0.11.2(@firebase/app@0.9.19) - '@firebase/storage-types': 0.8.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.3) - '@firebase/util': 1.9.3 - tslib: 2.6.2 + '@firebase/app-compat': 0.2.37 + '@firebase/component': 0.6.8 + '@firebase/storage': 0.12.6(@firebase/app@0.10.7) + '@firebase/storage-types': 0.8.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.7) + '@firebase/util': 1.9.7 + tslib: 2.6.3 transitivePeerDependencies: - '@firebase/app' - '@firebase/app-types' - - encoding - /@firebase/storage-types@0.8.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.3): - resolution: {integrity: sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg==} + /@firebase/storage-types@0.8.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.7): + resolution: {integrity: sha512-0vWu99rdey0g53lA7IShoA2Lol1jfnPovzLDUBuon65K7uKG9G+L5uO05brD9pMw+l4HRFw23ah3GwTGpEav6g==} peerDependencies: '@firebase/app-types': 0.x '@firebase/util': 1.x dependencies: - '@firebase/app-types': 0.9.0 - '@firebase/util': 1.9.3 + '@firebase/app-types': 0.9.2 + '@firebase/util': 1.9.7 - /@firebase/storage@0.11.2(@firebase/app@0.9.19): - resolution: {integrity: sha512-CtvoFaBI4hGXlXbaCHf8humajkbXhs39Nbh6MbNxtwJiCqxPy9iH3D3CCfXAvP0QvAAwmJUTK3+z9a++Kc4nkA==} + /@firebase/storage@0.12.6(@firebase/app@0.10.7): + resolution: {integrity: sha512-Zgb9WuehJxzhj7pGXUvkAEaH+3HvLjD9xSZ9nepuXf5f8378xME7oGJtREr/RnepdDA5YW0XIxe0QQBNHpe1nw==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.9.19 - '@firebase/component': 0.6.4 - '@firebase/util': 1.9.3 - node-fetch: 2.6.7 - tslib: 2.6.2 - transitivePeerDependencies: - - encoding + '@firebase/app': 0.10.7 + '@firebase/component': 0.6.8 + '@firebase/util': 1.9.7 + tslib: 2.6.3 + undici: 5.28.4 /@firebase/util@1.9.3: resolution: {integrity: sha512-DY02CRhOZwpzO36fHpuVysz6JZrscPiBXD0fXp6qSrL9oNOx5KWICKdR95C0lSITzxp0TZosVyHqzatE8JbcjA==} dependencies: - tslib: 2.6.2 + tslib: 2.6.3 + dev: false + + /@firebase/util@1.9.7: + resolution: {integrity: sha512-fBVNH/8bRbYjqlbIhZ+lBtdAAS4WqZumx03K06/u7fJSpz1TGjEMm1ImvKD47w+xaFKIP2ori6z8BrbakRfjJA==} + dependencies: + tslib: 2.6.3 + + /@firebase/vertexai-preview@0.0.3(@firebase/app-types@0.9.2)(@firebase/app@0.10.7): + resolution: {integrity: sha512-KVtUWLp+ScgiwkDKAvNkVucAyhLVQp6C6lhnVEuIg4mWhWcS3oerjAeVhZT4uNofKwWxRsOaB2Yec7DMTXlQPQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + '@firebase/app': 0.x + '@firebase/app-types': 0.x + dependencies: + '@firebase/app': 0.10.7 + '@firebase/app-check-interop-types': 0.3.2 + '@firebase/app-types': 0.9.2 + '@firebase/component': 0.6.8 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.9.7 + tslib: 2.6.3 - /@firebase/webchannel-wrapper@0.10.3: - resolution: {integrity: sha512-+ZplYUN3HOpgCfgInqgdDAbkGGVzES1cs32JJpeqoh87SkRobGXElJx+1GZSaDqzFL+bYiX18qEcBK76mYs8uA==} + /@firebase/webchannel-wrapper@1.0.1: + resolution: {integrity: sha512-jmEnr/pk0yVkA7mIlHNnxCi+wWzOFUg0WyIotgkKAb2u1J7fAeDBcVNSTjTihbAYNusCLQdW5s9IJ5qwnEufcQ==} /@fontsource/inter@4.5.15: resolution: {integrity: sha512-FzleM9AxZQK2nqsTDtBiY0PMEVWvnKnuu2i09+p6DHvrHsuucoV2j0tmw+kAT3L4hvsLdAIDv6MdGehsPIdT+Q==} @@ -4728,15 +4243,15 @@ packages: /@gar/promisify@1.1.3: resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} - /@google-cloud/firestore@6.7.0: - resolution: {integrity: sha512-bkH2jb5KkQSUa+NAvpip9HQ+rpYhi77IaqHovWuN07adVmvNXX08gPpvPWEzoXYa/wDjEVI7LiAtCWkJJEYTNg==} + /@google-cloud/firestore@6.8.0: + resolution: {integrity: sha512-JRpk06SmZXLGz0pNx1x7yU3YhkUXheKgH5hbDZ4kMsdhtfV5qPLJLRI4wv69K0cZorIk+zTMOwptue7hizo0eA==} engines: {node: '>=12.0.0'} requiresBuild: true dependencies: fast-deep-equal: 3.1.3 functional-red-black-tree: 1.0.1 - google-gax: 3.6.0 - protobufjs: 7.2.5 + google-gax: 3.6.1 + protobufjs: 7.3.2 transitivePeerDependencies: - encoding - supports-color @@ -4767,18 +4282,18 @@ packages: dev: false optional: true - /@google-cloud/scheduler@4.0.0: - resolution: {integrity: sha512-9q3djPsxaKIJETgdlx+76F8zobzUTyCZujSVtj2FD2K7jyjfhYZ31meLVBJzbsJ+YwDzF9KK3cCIx57Xap39WQ==} + /@google-cloud/scheduler@4.3.0: + resolution: {integrity: sha512-3VeVu/YVkJ0NIC0zDRucmY6o4wm7ii5TGHJLKtJUz4osm8f143uJ/FDSJz1vXMAg6GseZ/yzLvBQ5r/Sb+U2Ow==} engines: {node: '>=14.0.0'} dependencies: - google-gax: 4.0.3 + google-gax: 4.3.8 transitivePeerDependencies: - encoding - supports-color dev: false - /@google-cloud/storage@6.9.5: - resolution: {integrity: sha512-fcLsDA8YKcGuqvhk0XTjJGVpG9dzs5Em8IcUjSjspYvERuHYqMy9CMChWapSjv3Lyw//exa3mv4nUxPlV93BnA==} + /@google-cloud/storage@6.12.0: + resolution: {integrity: sha512-78nNAY7iiZ4O/BouWMWTD/oSF2YtYgYB3GZirn0To6eBOugjXVoK+GXgUXOl+HlqbAOyHxAVXOlsj3snfbQ1dw==} engines: {node: '>=12'} requiresBuild: true dependencies: @@ -4788,11 +4303,12 @@ packages: abort-controller: 3.0.0 async-retry: 1.3.3 compressible: 2.0.18 - duplexify: 4.1.2 - ent: 2.2.0 + duplexify: 4.1.3 + ent: 2.2.1 extend: 3.0.2 - gaxios: 5.1.0 - google-auth-library: 8.7.0 + fast-xml-parser: 4.4.1 + gaxios: 5.1.3 + google-auth-library: 8.9.0 mime: 3.0.0 mime-types: 2.1.35 p-limit: 3.1.0 @@ -4805,38 +4321,30 @@ packages: dev: false optional: true - /@grpc/grpc-js@1.10.10: - resolution: {integrity: sha512-HPa/K5NX6ahMoeBv15njAc/sfF4/jmiXLar9UlC2UfHFKZzsCVLc3wbe7+7qua7w9VPh2/L6EBxyAV7/E8Wftg==} + /@grpc/grpc-js@1.11.1: + resolution: {integrity: sha512-gyt/WayZrVPH2w/UTLansS7F9Nwld472JxxaETamrM8HNlsa+jSLNyKAZmhxI2Me4c3mQHFiS1wWHDY1g1Kthw==} engines: {node: '>=12.10.0'} dependencies: '@grpc/proto-loader': 0.7.13 '@js-sdsl/ordered-map': 4.4.2 dev: false - /@grpc/grpc-js@1.8.13: - resolution: {integrity: sha512-iY3jsdfbc0ARoCLFvbvUB8optgyb0r1XLPb142u+QtgBcKJYkCIFt3Fd/881KqjLYWjsBJF57N3b8Eop9NDfUA==} + /@grpc/grpc-js@1.8.22: + resolution: {integrity: sha512-oAjDdN7fzbUi+4hZjKG96MR6KTEubAeMpQEb+77qy+3r0Ua5xTFuie6JOLr4ZZgl5g+W5/uRTS2M1V8mVAFPuA==} engines: {node: ^8.13.0 || >=10.10.0} + requiresBuild: true dependencies: - '@grpc/proto-loader': 0.7.10 - '@types/node': 20.14.2 + '@grpc/proto-loader': 0.7.13 + '@types/node': 18.19.42 dev: false + optional: true - /@grpc/grpc-js@1.9.3: - resolution: {integrity: sha512-b8iWtdrYIeT5fdZdS4Br/6h/kuk0PW5EVBUGk1amSbrpL8DlktJD43CdcCWwRdd6+jgwHhADSbL9CsNnm6EUPA==} + /@grpc/grpc-js@1.9.15: + resolution: {integrity: sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ==} engines: {node: ^8.13.0 || >=10.10.0} dependencies: - '@grpc/proto-loader': 0.7.10 - '@types/node': 20.14.2 - - /@grpc/proto-loader@0.7.10: - resolution: {integrity: sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==} - engines: {node: '>=6'} - hasBin: true - dependencies: - lodash.camelcase: 4.3.0 - long: 5.2.1 - protobufjs: 7.2.5 - yargs: 17.7.2 + '@grpc/proto-loader': 0.7.13 + '@types/node': 18.19.42 /@grpc/proto-loader@0.7.13: resolution: {integrity: sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==} @@ -4844,10 +4352,9 @@ packages: hasBin: true dependencies: lodash.camelcase: 4.3.0 - long: 5.2.1 + long: 5.2.3 protobufjs: 7.3.2 yargs: 17.7.2 - dev: false /@hubspot/api-client@11.1.0: resolution: {integrity: sha512-HUkvUJKKvKhED0RZfpjnTX+b5+RNRlFfAllT7ozLP7gEoT5fp5aT148mnBdNZTr1UPfScBdDQa42ixHjgkIlNQ==} @@ -4867,9 +4374,10 @@ packages: /@humanwhocodes/config-array@0.10.7: resolution: {integrity: sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==} engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead dependencies: '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 + debug: 4.3.6 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -4878,23 +4386,13 @@ packages: /@humanwhocodes/config-array@0.11.14: resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead dependencies: - '@humanwhocodes/object-schema': 2.0.2 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - /@humanwhocodes/config-array@0.11.8: - resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.6 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - dev: false /@humanwhocodes/gitignore-to-minimatch@1.0.2: resolution: {integrity: sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==} @@ -4906,13 +4404,32 @@ packages: /@humanwhocodes/object-schema@1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + deprecated: Use @eslint/object-schema instead + dev: true - /@humanwhocodes/object-schema@2.0.2: - resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + /@humanwhocodes/object-schema@2.0.3: + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + /@inquirer/figures@1.0.5: + resolution: {integrity: sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==} + engines: {node: '>=18'} + dev: true /@ioredis/commands@1.2.0: resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + /@isaacs/string-locale-compare@1.1.0: resolution: {integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==} @@ -4940,7 +4457,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 20.14.2 + '@types/node': 18.19.42 chalk: 4.1.2 jest-message-util: 27.5.1 jest-util: 27.5.1 @@ -4952,36 +4469,24 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@jest/types': 28.1.3 - '@types/node': 20.14.2 + '@types/node': 18.19.42 chalk: 4.1.2 jest-message-util: 28.1.3 jest-util: 28.1.3 slash: 3.0.0 - /@jest/console@29.5.0: - resolution: {integrity: sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.14.2 - chalk: 4.1.2 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 - dev: true - /@jest/console@29.7.0: resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.14.2 + '@types/node': 18.19.42 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 slash: 3.0.0 - /@jest/core@27.5.1(ts-node@10.8.2): + /@jest/core@27.5.1(ts-node@10.9.2): resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: @@ -4995,14 +4500,14 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.14.2 + '@types/node': 18.19.42 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.8.1 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 27.5.1 - jest-config: 27.5.1(ts-node@10.8.2) + jest-config: 27.5.1(ts-node@10.9.2) jest-haste-map: 27.5.1 jest-message-util: 27.5.1 jest-regex-util: 27.5.1 @@ -5014,7 +4519,7 @@ packages: jest-util: 27.5.1 jest-validate: 27.5.1 jest-watcher: 27.5.1 - micromatch: 4.0.5 + micromatch: 4.0.7 rimraf: 3.0.2 slash: 3.0.0 strip-ansi: 6.0.1 @@ -5026,7 +4531,7 @@ packages: - utf-8-validate dev: false - /@jest/core@28.1.3(ts-node@10.8.2): + /@jest/core@28.1.3(ts-node@10.9.2): resolution: {integrity: sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} peerDependencies: @@ -5040,14 +4545,14 @@ packages: '@jest/test-result': 28.1.3 '@jest/transform': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 20.14.2 + '@types/node': 18.19.42 ansi-escapes: 4.3.2 chalk: 4.1.2 - ci-info: 3.8.0 + ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 28.1.3 - jest-config: 28.1.3(@types/node@20.14.2)(ts-node@10.8.2) + jest-config: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2) jest-haste-map: 28.1.3 jest-message-util: 28.1.3 jest-regex-util: 28.0.2 @@ -5059,7 +4564,7 @@ packages: jest-util: 28.1.3 jest-validate: 28.1.3 jest-watcher: 28.1.3 - micromatch: 4.0.5 + micromatch: 4.0.7 pretty-format: 28.1.3 rimraf: 3.0.2 slash: 3.0.0 @@ -5069,135 +4574,6 @@ packages: - ts-node dev: true - /@jest/core@29.5.0(ts-node@10.8.2): - resolution: {integrity: sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/console': 29.5.0 - '@jest/reporters': 29.5.0 - '@jest/test-result': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.6.3 - '@types/node': 20.14.2 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.8.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.5.0 - jest-config: 29.5.0(@types/node@20.14.2)(ts-node@10.8.2) - jest-haste-map: 29.5.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.4.3 - jest-resolve: 29.5.0 - jest-resolve-dependencies: 29.5.0 - jest-runner: 29.5.0 - jest-runtime: 29.5.0 - jest-snapshot: 29.5.0 - jest-util: 29.7.0 - jest-validate: 29.5.0 - jest-watcher: 29.5.0 - micromatch: 4.0.5 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - dev: true - - /@jest/core@29.7.0(ts-node@10.8.2): - resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.14.2 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.8.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.14.2)(ts-node@10.8.2) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.5 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - dev: true - - /@jest/core@29.7.0(ts-node@10.9.1): - resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.14.2 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.8.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.14.2)(ts-node@10.9.1) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.5 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - dev: true - /@jest/core@29.7.0(ts-node@10.9.2): resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5212,14 +4588,14 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.2 + '@types/node': 18.19.42 ansi-escapes: 4.3.2 chalk: 4.1.2 - ci-info: 3.8.0 + ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.14.2)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -5231,7 +4607,7 @@ packages: jest-util: 29.7.0 jest-validate: 29.7.0 jest-watcher: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.7 pretty-format: 29.7.0 slash: 3.0.0 strip-ansi: 6.0.1 @@ -5246,7 +4622,7 @@ packages: dependencies: '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.14.2 + '@types/node': 18.19.42 jest-mock: 27.5.1 dev: false @@ -5256,27 +4632,17 @@ packages: dependencies: '@jest/fake-timers': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 20.14.2 + '@types/node': 18.19.42 jest-mock: 28.1.3 dev: true - /@jest/environment@29.5.0: - resolution: {integrity: sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/fake-timers': 29.5.0 - '@jest/types': 29.6.3 - '@types/node': 20.14.2 - jest-mock: 29.7.0 - dev: true - /@jest/environment@29.7.0: resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.2 + '@types/node': 18.19.42 jest-mock: 29.7.0 /@jest/expect-utils@28.1.3: @@ -5302,16 +4668,6 @@ packages: - supports-color dev: true - /@jest/expect@29.5.0: - resolution: {integrity: sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - expect: 29.7.0 - jest-snapshot: 29.5.0 - transitivePeerDependencies: - - supports-color - dev: true - /@jest/expect@29.7.0: resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5327,7 +4683,7 @@ packages: dependencies: '@jest/types': 27.5.1 '@sinonjs/fake-timers': 8.1.0 - '@types/node': 20.14.2 + '@types/node': 18.19.42 jest-message-util: 27.5.1 jest-mock: 27.5.1 jest-util: 27.5.1 @@ -5339,31 +4695,19 @@ packages: dependencies: '@jest/types': 28.1.3 '@sinonjs/fake-timers': 9.1.2 - '@types/node': 20.14.2 + '@types/node': 18.19.42 jest-message-util: 28.1.3 jest-mock: 28.1.3 jest-util: 28.1.3 dev: true - /@jest/fake-timers@29.5.0: - resolution: {integrity: sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.0.2 - '@types/node': 20.14.2 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-util: 29.7.0 - dev: true - /@jest/fake-timers@29.7.0: resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.0.2 - '@types/node': 20.14.2 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 18.19.42 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -5388,18 +4732,6 @@ packages: - supports-color dev: true - /@jest/globals@29.5.0: - resolution: {integrity: sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.5.0 - '@jest/expect': 29.5.0 - '@jest/types': 29.5.0 - jest-mock: 29.5.0 - transitivePeerDependencies: - - supports-color - dev: true - /@jest/globals@29.7.0: resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5425,17 +4757,17 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.14.2 + '@types/node': 18.19.42 chalk: 4.1.2 - collect-v8-coverage: 1.0.1 + collect-v8-coverage: 1.0.2 exit: 0.1.2 glob: 7.2.3 graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.0 + istanbul-lib-coverage: 3.2.2 istanbul-lib-instrument: 5.2.1 - istanbul-lib-report: 3.0.0 + istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.5 + istanbul-reports: 3.1.7 jest-haste-map: 27.5.1 jest-resolve: 27.5.1 jest-util: 27.5.1 @@ -5463,18 +4795,18 @@ packages: '@jest/test-result': 28.1.3 '@jest/transform': 28.1.3 '@jest/types': 28.1.3 - '@jridgewell/trace-mapping': 0.3.18 - '@types/node': 20.14.2 + '@jridgewell/trace-mapping': 0.3.25 + '@types/node': 18.19.42 chalk: 4.1.2 - collect-v8-coverage: 1.0.1 + collect-v8-coverage: 1.0.2 exit: 0.1.2 glob: 7.2.3 graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.0 + istanbul-lib-coverage: 3.2.2 istanbul-lib-instrument: 5.2.1 - istanbul-lib-report: 3.0.0 + istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.5 + istanbul-reports: 3.1.7 jest-message-util: 28.1.3 jest-util: 28.1.3 jest-worker: 28.1.3 @@ -5482,44 +4814,7 @@ packages: string-length: 4.0.2 strip-ansi: 6.0.1 terminal-link: 2.1.1 - v8-to-istanbul: 9.1.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/reporters@29.5.0: - resolution: {integrity: sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.18 - '@types/node': 20.14.2 - chalk: 4.1.2 - collect-v8-coverage: 1.0.1 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 5.2.1 - istanbul-lib-report: 3.0.0 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.5 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - jest-worker: 29.7.0 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - v8-to-istanbul: 9.1.0 + v8-to-istanbul: 9.3.0 transitivePeerDependencies: - supports-color dev: true @@ -5538,25 +4833,25 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.18 - '@types/node': 20.14.2 + '@jridgewell/trace-mapping': 0.3.25 + '@types/node': 18.19.42 chalk: 4.1.2 - collect-v8-coverage: 1.0.1 + collect-v8-coverage: 1.0.2 exit: 0.1.2 glob: 7.2.3 graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 6.0.0 - istanbul-lib-report: 3.0.0 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3 + istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.5 + istanbul-reports: 3.1.7 jest-message-util: 29.7.0 jest-util: 29.7.0 jest-worker: 29.7.0 slash: 3.0.0 string-length: 4.0.2 strip-ansi: 6.0.1 - v8-to-istanbul: 9.1.0 + v8-to-istanbul: 9.3.0 transitivePeerDependencies: - supports-color @@ -5566,13 +4861,6 @@ packages: dependencies: '@sinclair/typebox': 0.24.51 - /@jest/schemas@29.4.3: - resolution: {integrity: sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.25.24 - dev: true - /@jest/schemas@29.6.3: resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5592,7 +4880,7 @@ packages: resolution: {integrity: sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - '@jridgewell/trace-mapping': 0.3.18 + '@jridgewell/trace-mapping': 0.3.25 callsites: 3.1.0 graceful-fs: 4.2.11 dev: true @@ -5601,7 +4889,7 @@ packages: resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jridgewell/trace-mapping': 0.3.18 + '@jridgewell/trace-mapping': 0.3.25 callsites: 3.1.0 graceful-fs: 4.2.11 @@ -5611,8 +4899,8 @@ packages: dependencies: '@jest/console': 27.5.1 '@jest/types': 27.5.1 - '@types/istanbul-lib-coverage': 2.0.4 - collect-v8-coverage: 1.0.1 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 dev: false /@jest/test-result@28.1.3: @@ -5621,18 +4909,8 @@ packages: dependencies: '@jest/console': 28.1.3 '@jest/types': 28.1.3 - '@types/istanbul-lib-coverage': 2.0.4 - collect-v8-coverage: 1.0.1 - - /@jest/test-result@29.5.0: - resolution: {integrity: sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/console': 29.7.0 - '@jest/types': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.4 - collect-v8-coverage: 1.0.1 - dev: true + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 /@jest/test-result@29.7.0: resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} @@ -5640,8 +4918,8 @@ packages: dependencies: '@jest/console': 29.7.0 '@jest/types': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.4 - collect-v8-coverage: 1.0.1 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 /@jest/test-sequencer@27.5.1: resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} @@ -5678,7 +4956,7 @@ packages: resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.25.2 '@jest/types': 27.5.1 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 @@ -5688,8 +4966,8 @@ packages: jest-haste-map: 27.5.1 jest-regex-util: 27.5.1 jest-util: 27.5.1 - micromatch: 4.0.5 - pirates: 4.0.5 + micromatch: 4.0.7 + pirates: 4.0.6 slash: 3.0.0 source-map: 0.6.1 write-file-atomic: 3.0.3 @@ -5701,9 +4979,9 @@ packages: resolution: {integrity: sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.25.2 '@jest/types': 28.1.3 - '@jridgewell/trace-mapping': 0.3.18 + '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 1.9.0 @@ -5712,31 +4990,8 @@ packages: jest-haste-map: 28.1.3 jest-regex-util: 28.0.2 jest-util: 28.1.3 - micromatch: 4.0.5 - pirates: 4.0.5 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/transform@29.5.0: - resolution: {integrity: sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/core': 7.21.4 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.18 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - micromatch: 4.0.5 - pirates: 4.0.5 + micromatch: 4.0.7 + pirates: 4.0.6 slash: 3.0.0 write-file-atomic: 4.0.2 transitivePeerDependencies: @@ -5747,9 +5002,9 @@ packages: resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.25.2 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.18 + '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 @@ -5758,8 +5013,8 @@ packages: jest-haste-map: 29.7.0 jest-regex-util: 29.6.3 jest-util: 29.7.0 - micromatch: 4.0.5 - pirates: 4.0.5 + micromatch: 4.0.7 + pirates: 4.0.6 slash: 3.0.0 write-file-atomic: 4.0.2 transitivePeerDependencies: @@ -5769,10 +5024,10 @@ packages: resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 20.14.2 - '@types/yargs': 16.0.5 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 18.19.42 + '@types/yargs': 16.0.9 chalk: 4.1.2 dev: false @@ -5781,95 +5036,71 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@jest/schemas': 28.1.3 - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 20.14.2 - '@types/yargs': 17.0.24 - chalk: 4.1.2 - - /@jest/types@29.5.0: - resolution: {integrity: sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 20.14.2 - '@types/yargs': 17.0.24 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 18.19.42 + '@types/yargs': 17.0.32 chalk: 4.1.2 - dev: true /@jest/types@29.6.3: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 20.14.2 - '@types/yargs': 17.0.24 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 18.19.42 + '@types/yargs': 17.0.32 chalk: 4.1.2 /@jitsu/sdk-js@3.1.5: resolution: {integrity: sha512-e7P8uvGBNwWCC864MItcYSv0IT2+nwYiX8QXZ0lfyG8hutEXXX9Yt2/+MynXuGxMIoIrJ+j0bWVu20k9rrhxSg==} + deprecated: This package is for legacy Jitsu Classic version. For latest version of Jitsu please use @jitsu/js dev: true - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.18 - - /@jridgewell/resolve-uri@3.1.0: - resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} - engines: {node: '>=6.0.0'} + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - /@jridgewell/source-map@0.3.3: - resolution: {integrity: sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==} + /@jridgewell/source-map@0.3.6: + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - - /@jridgewell/sourcemap-codec@1.4.14: - resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 - /@jridgewell/trace-mapping@0.3.18: - resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 + /@jridgewell/sourcemap-codec@1.5.0: + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} /@jridgewell/trace-mapping@0.3.25: resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 /@js-sdsl/ordered-map@4.4.2: resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} dev: false - /@jsdoc/salty@0.2.5: - resolution: {integrity: sha512-TfRP53RqunNe2HBobVBJ0VLhK1HbfvBYeTC1ahnN64PWvyYyGebmMiPkuwvD9fpw2ZbkoPb8Q7mwy0aR8Z9rvw==} + /@jsdoc/salty@0.2.8: + resolution: {integrity: sha512-5e+SFVavj1ORKlKaKr2BmTOekmXbelU7dC0cDkQLqag7xfuTPuGMUFx7KWJuv4bYZrTsoL2Z18VVCOKYxzoHcg==} engines: {node: '>=v12.0.0'} requiresBuild: true dependencies: @@ -5884,7 +5115,7 @@ packages: /@kwsites/file-exists@1.1.1: resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} dependencies: - debug: 4.3.4 + debug: 4.3.6 transitivePeerDependencies: - supports-color dev: false @@ -5893,24 +5124,19 @@ packages: resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} dev: false - /@leichtgewicht/ip-codec@2.0.4: - resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} + /@leichtgewicht/ip-codec@2.0.5: + resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} dev: false - /@ljharb/through@2.3.9: - resolution: {integrity: sha512-yN599ZBuMPPK4tdoToLlvgJB4CLK8fGl7ntfy0Wn7U6ttNvHYurd81bfUiK/6sMkiIwm65R6ck4L6+Y3DfVbNQ==} - engines: {node: '>= 0.4'} - dev: true - - /@loadable/component@5.15.3(react@18.2.0): - resolution: {integrity: sha512-VOgYgCABn6+/7aGIpg7m0Ruj34tGetaJzt4bQ345FwEovDQZ+dua+NWLmuJKv8rWZyxOUSfoJkmGnzyDXH2BAQ==} + /@loadable/component@5.16.4(react@18.3.1): + resolution: {integrity: sha512-fJWxx9b5WHX90QKmizo9B+es2so8DnBthI1mbflwCoOyvzEwxiZ/SVDCTtXEnHG72/kGBdzr297SSIekYtzSOQ==} engines: {node: '>=8'} peerDependencies: react: ^16.3.0 || ^17.0.0 || ^18.0.0 dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 hoist-non-react-statics: 3.3.2 - react: 18.2.0 + react: 18.3.1 react-is: 16.13.1 dev: false @@ -5926,19 +5152,19 @@ packages: '@lukeed/csprng': 1.1.0 dev: true - /@mapbox/node-pre-gyp@1.0.10: - resolution: {integrity: sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==} + /@mapbox/node-pre-gyp@1.0.11: + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} hasBin: true dependencies: - detect-libc: 2.0.1 + detect-libc: 2.0.3 https-proxy-agent: 5.0.1 make-dir: 3.1.0 node-fetch: 2.7.0 nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 - semver: 7.5.4 - tar: 6.2.0 + semver: 7.6.3 + tar: 6.2.1 transitivePeerDependencies: - encoding - supports-color @@ -5948,7 +5174,7 @@ packages: resolution: {integrity: sha512-TIyKmvdIjDtRRRZTM2tgm8vHoKH1Sxr7+r7g2bB+5+Uvho7M9/+gXMZalQMpqMtm2hKFq27qoHpMpqq82ycxQA==} dependencies: ip6addr: 0.2.5 - maxmind: 4.3.18 + maxmind: 4.3.20 dev: false /@monaco-editor/loader@1.4.0(monaco-editor@0.50.0): @@ -5960,7 +5186,7 @@ packages: state-local: 1.0.7 dev: false - /@monaco-editor/react@4.6.0(monaco-editor@0.50.0)(react-dom@18.2.0)(react@18.2.0): + /@monaco-editor/react@4.6.0(monaco-editor@0.50.0)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==} peerDependencies: monaco-editor: '>= 0.25.0 < 1' @@ -5969,12 +5195,12 @@ packages: dependencies: '@monaco-editor/loader': 1.4.0(monaco-editor@0.50.0) monaco-editor: 0.50.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) dev: false - /@mongodb-js/saslprep@1.1.5: - resolution: {integrity: sha512-XLNOMH66KhJzUJNwT/qlMnS4WsNDWD5ASdyaSH3EtK+F4r/CFGa3jT4GNi4mfOitGvWXtdLgQJkQjxSVrio+jA==} + /@mongodb-js/saslprep@1.1.8: + resolution: {integrity: sha512-qKwC/M/nNNaKUBMQ0nuzm47b7ZYWQHN3pcXq4IIcoSBc2hOIrflAxJduIvvqmhoz3gR2TacTAs8vlsCVPkiEdQ==} dependencies: sparse-bitfield: 3.0.3 dev: false @@ -6055,28 +5281,21 @@ packages: '@mongodb-js/zstd-win32-x64-msvc': 1.2.0 dev: false - /@nangohq/frontend@0.21.11: - resolution: {integrity: sha512-oNOqM8gZhRaaHt63zyaWxsWi3pip4a78S9IzstEBVvUUzEFOU3+ys0r3TmyQCbA1veaAZjzeMyq+LtZem/Nt9g==} - dev: false - - /@next/env@13.5.6: - resolution: {integrity: sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==} + /@nangohq/frontend@0.21.17: + resolution: {integrity: sha512-utnO6JkRIQVqZBo472Yynf0nBl5Pc3QCMlC9L5LsIWApCD1pSkqZCA7cZKIJiX2p3tiB8Hzav31o0lAsnTZ1AQ==} dev: false - /@next/eslint-plugin-next@13.0.0: - resolution: {integrity: sha512-z+gnX4Zizatqatc6f4CQrcC9oN8Us3Vrq/OLyc98h7K/eWctrnV91zFZodmJHUjx0cITY8uYM7LXD7IdYkg3kg==} - dependencies: - glob: 7.1.7 + /@next/env@14.2.5: + resolution: {integrity: sha512-/zZGkrTOsraVfYjGP8uM0p6r0BDT6xWpkjdVbcz66PJVSpwXX3yNiRycxAuDfBKGWBrZBXRuK/YVlkNgxHGwmA==} dev: false - /@next/eslint-plugin-next@13.3.0: - resolution: {integrity: sha512-wuGN5qSEjSgcq9fVkH0Y/qIPFjnZtW3ZPwfjJOn7l/rrf6y8J24h/lo61kwqunTyzZJm/ETGfGVU9PUs8cnzEA==} + /@next/eslint-plugin-next@14.2.5: + resolution: {integrity: sha512-LY3btOpPh+OTIpviNojDpUdIbHW9j0JBYBjsIp8IxtDFfYFyORvw3yNq6N231FVqQA7n7lwaf7xHbVJlA1ED7g==} dependencies: - glob: 7.1.7 - dev: true + glob: 10.3.10 - /@next/swc-darwin-arm64@13.5.6: - resolution: {integrity: sha512-5nvXMzKtZfvcu4BhtV0KH1oGv4XEW+B+jOfmBdpFI3C7FrB/MfujRpWYSBBO64+qbW8pkZiSyQv9eiwnn5VIQA==} + /@next/swc-darwin-arm64@14.2.5: + resolution: {integrity: sha512-/9zVxJ+K9lrzSGli1///ujyRfon/ZneeZ+v4ptpiPoOU+GKZnm8Wj8ELWU1Pm7GHltYRBklmXMTUqM/DqQ99FQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -6084,8 +5303,8 @@ packages: dev: false optional: true - /@next/swc-darwin-x64@13.5.6: - resolution: {integrity: sha512-6cgBfxg98oOCSr4BckWjLLgiVwlL3vlLj8hXg2b+nDgm4bC/qVXXLfpLB9FHdoDu4057hzywbxKvmYGmi7yUzA==} + /@next/swc-darwin-x64@14.2.5: + resolution: {integrity: sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -6093,8 +5312,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-gnu@13.5.6: - resolution: {integrity: sha512-txagBbj1e1w47YQjcKgSU4rRVQ7uF29YpnlHV5xuVUsgCUf2FmyfJ3CPjZUvpIeXCJAoMCFAoGnbtX86BK7+sg==} + /@next/swc-linux-arm64-gnu@14.2.5: + resolution: {integrity: sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -6102,8 +5321,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-musl@13.5.6: - resolution: {integrity: sha512-cGd+H8amifT86ZldVJtAKDxUqeFyLWW+v2NlBULnLAdWsiuuN8TuhVBt8ZNpCqcAuoruoSWynvMWixTFcroq+Q==} + /@next/swc-linux-arm64-musl@14.2.5: + resolution: {integrity: sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -6111,8 +5330,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-gnu@13.5.6: - resolution: {integrity: sha512-Mc2b4xiIWKXIhBy2NBTwOxGD3nHLmq4keFk+d4/WL5fMsB8XdJRdtUlL87SqVCTSaf1BRuQQf1HvXZcy+rq3Nw==} + /@next/swc-linux-x64-gnu@14.2.5: + resolution: {integrity: sha512-8XFikMSxWleYNryWIjiCX+gU201YS+erTUidKdyOVYi5qUQo/gRxv/3N1oZFCgqpesN6FPeqGM72Zve+nReVXQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -6120,8 +5339,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-musl@13.5.6: - resolution: {integrity: sha512-CFHvP9Qz98NruJiUnCe61O6GveKKHpJLloXbDSWRhqhkJdZD2zU5hG+gtVJR//tyW897izuHpM6Gtf6+sNgJPQ==} + /@next/swc-linux-x64-musl@14.2.5: + resolution: {integrity: sha512-6QLwi7RaYiQDcRDSU/os40r5o06b5ue7Jsk5JgdRBGGp8l37RZEh9JsLSM8QF0YDsgcosSeHjglgqi25+m04IQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -6129,8 +5348,8 @@ packages: dev: false optional: true - /@next/swc-win32-arm64-msvc@13.5.6: - resolution: {integrity: sha512-aFv1ejfkbS7PUa1qVPwzDHjQWQtknzAZWGTKYIAaS4NMtBlk3VyA6AYn593pqNanlicewqyl2jUhQAaFV/qXsg==} + /@next/swc-win32-arm64-msvc@14.2.5: + resolution: {integrity: sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -6138,8 +5357,8 @@ packages: dev: false optional: true - /@next/swc-win32-ia32-msvc@13.5.6: - resolution: {integrity: sha512-XqqpHgEIlBHvzwG8sp/JXMFkLAfGLqkbVsyN+/Ih1mR8INb6YCc2x/Mbwi6hsAgUnqQztz8cvEbHJUbSl7RHDg==} + /@next/swc-win32-ia32-msvc@14.2.5: + resolution: {integrity: sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -6147,8 +5366,8 @@ packages: dev: false optional: true - /@next/swc-win32-x64-msvc@13.5.6: - resolution: {integrity: sha512-Cqfe1YmOS7k+5mGu92nl5ULkzpKuxJrP3+4AEuPmrpFZ3BHxTY3TnHmU1On3bFmFFs6FbTcdF58CCUProGpIGQ==} + /@next/swc-win32-x64-msvc@14.2.5: + resolution: {integrity: sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -6178,7 +5397,7 @@ packages: engines: {node: '>= 8'} dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 + fastq: 1.17.1 /@npmcli/arborist@4.3.1: resolution: {integrity: sha512-yMRgZVDpwWjplorzt9SFSaakWx6QIK248Nw4ZFgkrAy/GvJaFRaSZzE6nD7JBK5r8g/+PTxFq5Wj/sfciE7x+A==} @@ -6213,7 +5432,7 @@ packages: read-package-json-fast: 2.0.3 readdir-scoped-modules: 1.1.0 rimraf: 3.0.2 - semver: 7.5.4 + semver: 7.6.3 ssri: 8.0.1 treeverse: 1.0.4 walk-up-path: 1.0.0 @@ -6225,14 +5444,20 @@ packages: resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} dependencies: '@gar/promisify': 1.1.3 - semver: 7.5.4 + semver: 7.6.3 /@npmcli/fs@2.1.2: resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: '@gar/promisify': 1.1.3 - semver: 7.5.4 + semver: 7.6.3 + + /@npmcli/fs@3.1.1: + resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + semver: 7.6.3 /@npmcli/git@2.1.0: resolution: {integrity: sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==} @@ -6243,11 +5468,26 @@ packages: npm-pick-manifest: 6.1.1 promise-inflight: 1.0.1 promise-retry: 2.0.1 - semver: 7.5.4 + semver: 7.6.3 which: 2.0.2 transitivePeerDependencies: - bluebird + /@npmcli/git@4.1.0: + resolution: {integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@npmcli/promise-spawn': 6.0.2 + lru-cache: 7.18.3 + npm-pick-manifest: 8.0.2 + proc-log: 3.0.0 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.6.3 + which: 3.0.1 + transitivePeerDependencies: + - bluebird + /@npmcli/installed-package-contents@1.0.7: resolution: {integrity: sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==} engines: {node: '>= 10'} @@ -6256,9 +5496,17 @@ packages: npm-bundled: 1.1.2 npm-normalize-package-bin: 1.0.1 - /@npmcli/map-workspaces@2.0.4: - resolution: {integrity: sha512-bMo0aAfwhVwqoVM5UzX1DJnlvVvzDCHae821jv48L1EsrYwfOZChlqWYXEtto/+BkBXetPbEWgau++/brh4oVg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + /@npmcli/installed-package-contents@2.1.0: + resolution: {integrity: sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + npm-bundled: 3.0.1 + npm-normalize-package-bin: 3.0.1 + + /@npmcli/map-workspaces@2.0.4: + resolution: {integrity: sha512-bMo0aAfwhVwqoVM5UzX1DJnlvVvzDCHae821jv48L1EsrYwfOZChlqWYXEtto/+BkBXetPbEWgau++/brh4oVg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: '@npmcli/name-from-folder': 1.0.1 glob: 8.1.0 @@ -6272,7 +5520,7 @@ packages: cacache: 15.3.0 json-parse-even-better-errors: 2.3.1 pacote: 12.0.3 - semver: 7.5.4 + semver: 7.6.3 transitivePeerDependencies: - bluebird - supports-color @@ -6299,6 +5547,10 @@ packages: /@npmcli/node-gyp@1.0.3: resolution: {integrity: sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==} + /@npmcli/node-gyp@3.0.0: + resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + /@npmcli/package-json@1.0.1: resolution: {integrity: sha512-y6jnu76E9C23osz8gEMBayZmaZ69vFOIk8vR1FJL/wbEJ54+9aVG9rLTjQKSXfgYZEr50nw1txBBFfBZZe+bYg==} dependencies: @@ -6309,6 +5561,12 @@ packages: dependencies: infer-owner: 1.0.4 + /@npmcli/promise-spawn@6.0.2: + resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + which: 3.0.1 + /@npmcli/run-script@2.0.0: resolution: {integrity: sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig==} dependencies: @@ -6320,6 +5578,19 @@ packages: - bluebird - supports-color + /@npmcli/run-script@6.0.2: + resolution: {integrity: sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@npmcli/node-gyp': 3.0.0 + '@npmcli/promise-spawn': 6.0.2 + node-gyp: 9.4.1 + read-package-json-fast: 3.0.2 + which: 3.0.1 + transitivePeerDependencies: + - bluebird + - supports-color + /@octokit/auth-token@2.5.0: resolution: {integrity: sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==} dependencies: @@ -6334,7 +5605,7 @@ packages: '@octokit/request-error': 2.1.0 '@octokit/types': 6.41.0 before-after-hook: 2.2.3 - universal-user-agent: 6.0.0 + universal-user-agent: 6.0.1 transitivePeerDependencies: - encoding @@ -6343,14 +5614,14 @@ packages: dependencies: '@octokit/types': 6.41.0 is-plain-object: 5.0.0 - universal-user-agent: 6.0.0 + universal-user-agent: 6.0.1 /@octokit/graphql@4.8.0: resolution: {integrity: sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==} dependencies: '@octokit/request': 5.6.3 '@octokit/types': 6.41.0 - universal-user-agent: 6.0.0 + universal-user-agent: 6.0.1 transitivePeerDependencies: - encoding @@ -6396,7 +5667,7 @@ packages: '@octokit/types': 6.41.0 is-plain-object: 5.0.0 node-fetch: 2.7.0 - universal-user-agent: 6.0.0 + universal-user-agent: 6.0.1 transitivePeerDependencies: - encoding @@ -6415,21 +5686,19 @@ packages: dependencies: '@octokit/openapi-types': 12.11.0 - /@panva/hkdf@1.0.4: - resolution: {integrity: sha512-003xWiCuvePbLaPHT+CRuaV4GlyCAVm6XYSbBZDHoWZGn1mNkVKFaDbGJjjxmEFvizUwlCoM6O18FCBMMky2zQ==} + /@one-ini/wasm@0.1.1: + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} dev: false - /@pkgr/utils@2.3.1: - resolution: {integrity: sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - dependencies: - cross-spawn: 7.0.3 - is-glob: 4.0.3 - open: 8.4.2 - picocolors: 1.0.0 - tiny-glob: 0.2.9 - tslib: 2.6.2 - dev: true + /@panva/hkdf@1.2.1: + resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==} + dev: false + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + optional: true /@playwright/test@1.39.0: resolution: {integrity: sha512-3u1iFqgzl7zr004bGPYiN/5EZpRUSFddQBra8Rqll5N0/vfpqlP9I9EXqAoGacuAbX6c9Ulg/Cjqglp5VkK6UQ==} @@ -6437,18 +5706,17 @@ packages: hasBin: true dependencies: playwright: 1.39.0 - dev: true - /@pmmmwh/react-refresh-webpack-plugin@0.5.10(react-refresh@0.11.0)(webpack-dev-server@4.13.2)(webpack@5.91.0): - resolution: {integrity: sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==} + /@pmmmwh/react-refresh-webpack-plugin@0.5.15(react-refresh@0.11.0)(webpack-dev-server@4.15.2)(webpack@5.93.0): + resolution: {integrity: sha512-LFWllMA55pzB9D34w/wXUCf8+c+IYKuJDgxiZ3qMhl64KRMBHYM1I3VdGaD2BV5FNPV2/S2596bppxHbv2ZydQ==} engines: {node: '>= 10.13'} peerDependencies: '@types/webpack': 4.x || 5.x react-refresh: '>=0.10.0 <1.0.0' sockjs-client: ^1.4.0 - type-fest: '>=0.17.0 <4.0.0' + type-fest: '>=0.17.0 <5.0.0' webpack: '>=4.43.0 <6.0.0' - webpack-dev-server: 3.x || 4.x + webpack-dev-server: 3.x || 4.x || 5.x webpack-hot-middleware: 2.x webpack-plugin-serve: 0.x || 1.x peerDependenciesMeta: @@ -6465,23 +5733,21 @@ packages: webpack-plugin-serve: optional: true dependencies: - ansi-html-community: 0.0.8 - common-path-prefix: 3.0.0 - core-js-pure: 3.30.0 + ansi-html: 0.0.9 + core-js-pure: 3.37.1 error-stack-parser: 2.1.4 - find-up: 5.0.0 - html-entities: 2.3.3 + html-entities: 2.5.2 loader-utils: 2.0.4 react-refresh: 0.11.0 - schema-utils: 3.3.0 + schema-utils: 4.2.0 source-map: 0.7.4 - webpack: 5.91.0(webpack-cli@5.1.4) - webpack-dev-server: 4.13.2(webpack@5.91.0) + webpack: 5.93.0(webpack-cli@5.1.4) + webpack-dev-server: 4.15.2(webpack@5.93.0) dev: false - /@prisma/client@4.12.0(prisma@5.7.1): - resolution: {integrity: sha512-j9/ighfWwux97J2dS15nqhl60tYoH8V0IuSsgZDb6bCFcQD3fXbXmxjYC8GHhIgOk3lB7Pq+8CwElz2MiDpsSg==} - engines: {node: '>=14.17'} + /@prisma/client@5.17.0(prisma@5.17.0): + resolution: {integrity: sha512-N2tnyKayT0Zf7mHjwEyE8iG7FwTmXDHFZ1GnNhQp0pJUObsuel4ZZ1XwfuAYkq5mRIiC/Kot0kt0tGCfLJ70Jw==} + engines: {node: '>=16.13'} requiresBuild: true peerDependencies: prisma: '*' @@ -6489,8 +5755,7 @@ packages: prisma: optional: true dependencies: - '@prisma/engines-version': 4.12.0-67.659ef412370fa3b41cd7bf6e94587c1dfb7f67e7 - prisma: 5.7.1 + prisma: 5.17.0 dev: false /@prisma/debug@3.8.1: @@ -6501,39 +5766,27 @@ packages: strip-ansi: 6.0.1 dev: true - /@prisma/debug@5.7.1: - resolution: {integrity: sha512-yrVSO/YZOxdeIxcBtZ5BaNqUfPrZkNsAKQIQg36cJKMxj/VYK3Vk5jMKkI+gQLl0KReo1YvX8GWKfV788SELjw==} - - /@prisma/engines-version@4.12.0-67.659ef412370fa3b41cd7bf6e94587c1dfb7f67e7: - resolution: {integrity: sha512-JIHNj5jlXb9mcaJwakM0vpgRYJIAurxTUqM0iX0tfEQA5XLZ9ONkIckkhuAKdAzocZ+80GYg7QSsfpjg7OxbOA==} - dev: false + /@prisma/debug@5.17.0: + resolution: {integrity: sha512-l7+AteR3P8FXiYyo496zkuoiJ5r9jLQEdUuxIxNCN1ud8rdbH3GTxm+f+dCyaSv9l9WY+29L9czaVRXz9mULfg==} - /@prisma/engines-version@5.7.1-1.0ca5ccbcfa6bdc81c003cf549abe4269f59c41e5: - resolution: {integrity: sha512-dIR5IQK/ZxEoWRBDOHF87r1Jy+m2ih3Joi4vzJRP+FOj5yxCwS2pS5SBR3TWoVnEK1zxtLI/3N7BjHyGF84fgw==} + /@prisma/engines-version@5.17.0-31.393aa359c9ad4a4bb28630fb5613f9c281cde053: + resolution: {integrity: sha512-tUuxZZysZDcrk5oaNOdrBnnkoTtmNQPkzINFDjz7eG6vcs9AVDmA/F6K5Plsb2aQc/l5M2EnFqn3htng9FA4hg==} - /@prisma/engines@5.7.1: - resolution: {integrity: sha512-R+Pqbra8tpLP2cvyiUpx+SIKglav3nTCpA+rn6826CThviQ8yvbNG0s8jNpo51vS9FuZO3pOkARqG062vKX7uA==} + /@prisma/engines@5.17.0: + resolution: {integrity: sha512-+r+Nf+JP210Jur+/X8SIPLtz+uW9YA4QO5IXA+KcSOBe/shT47bCcRMTYCbOESw3FFYFTwe7vU6KTWHKPiwvtg==} requiresBuild: true dependencies: - '@prisma/debug': 5.7.1 - '@prisma/engines-version': 5.7.1-1.0ca5ccbcfa6bdc81c003cf549abe4269f59c41e5 - '@prisma/fetch-engine': 5.7.1 - '@prisma/get-platform': 5.7.1 + '@prisma/debug': 5.17.0 + '@prisma/engines-version': 5.17.0-31.393aa359c9ad4a4bb28630fb5613f9c281cde053 + '@prisma/fetch-engine': 5.17.0 + '@prisma/get-platform': 5.17.0 - /@prisma/extension-read-replicas@0.3.0(@prisma/client@4.12.0): - resolution: {integrity: sha512-F9+rSmYday6GT2qjhJtkZcBOpLO5LtpvFcMGqrBDHf+78LEdSuxfFjOxYlNuqk4B+th62yxpbhfpmB9/Mca14Q==} - peerDependencies: - '@prisma/client': ^5.2.0 - dependencies: - '@prisma/client': 4.12.0(prisma@5.7.1) - dev: false - - /@prisma/fetch-engine@5.7.1: - resolution: {integrity: sha512-9ELauIEBkIaEUpMIYPRlh5QELfoC6pyHolHVQgbNxglaINikZ9w9X7r1TIePAcm05pCNp2XPY1ObQIJW5nYfBQ==} + /@prisma/fetch-engine@5.17.0: + resolution: {integrity: sha512-ESxiOaHuC488ilLPnrv/tM2KrPhQB5TRris/IeIV4ZvUuKeaicCl4Xj/JCQeG9IlxqOgf1cCg5h5vAzlewN91Q==} dependencies: - '@prisma/debug': 5.7.1 - '@prisma/engines-version': 5.7.1-1.0ca5ccbcfa6bdc81c003cf549abe4269f59c41e5 - '@prisma/get-platform': 5.7.1 + '@prisma/debug': 5.17.0 + '@prisma/engines-version': 5.17.0-31.393aa359c9ad4a4bb28630fb5613f9c281cde053 + '@prisma/get-platform': 5.17.0 /@prisma/generator-helper@3.8.1: resolution: {integrity: sha512-3zSy+XTEjmjLj6NO+/YPN1Cu7or3xA11TOoOnLRJ9G4pTT67RJXjK0L9Xy5n+3I0Xlb7xrWCgo8MvQQLMWzxPA==} @@ -6544,10 +5797,10 @@ packages: cross-spawn: 7.0.3 dev: true - /@prisma/get-platform@5.7.1: - resolution: {integrity: sha512-eDlswr3a1m5z9D/55Iyt/nZqS5UpD+DZ9MooBB3hvrcPhDQrcf9m4Tl7buy4mvAtrubQ626ECtb8c6L/f7rGSQ==} + /@prisma/get-platform@5.17.0: + resolution: {integrity: sha512-UlDgbRozCP1rfJ5Tlkf3Cnftb6srGrEQ4Nm3og+1Se2gWmCZ0hmPIi+tQikGDUVLlvOWx3Gyi9LzgRP+HTXV9w==} dependencies: - '@prisma/debug': 5.7.1 + '@prisma/debug': 5.17.0 /@protobufjs/aspromise@1.1.2: resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} @@ -6582,128 +5835,159 @@ packages: /@protobufjs/utf8@1.1.0: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - /@rc-component/context@1.3.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-6QdaCJ7Wn5UZLJs15IEfqy4Ru3OaL5ctqpQYWd5rlfV9wwzrzdt6+kgAQZV/qdB0MUPN4nhyBfRembQCIvBf+w==} + /@rc-component/async-validator@5.0.4: + resolution: {integrity: sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==} + engines: {node: '>=14.x'} + dependencies: + '@babel/runtime': 7.25.0 + + /@rc-component/color-picker@1.5.3(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-+tGGH3nLmYXTalVe0L8hSZNs73VTP5ueSHwUlDC77KKRaN7G4DS4wcpG5DTDzdcV/Yas+rzA6UGgIyzd8fS4cw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.25.0 + '@ctrl/tinycolor': 3.6.1 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + /@rc-component/context@1.4.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /@rc-component/mini-decimal@1.0.1: - resolution: {integrity: sha512-9N8nRk0oKj1qJzANKl+n9eNSMUGsZtjwNuDCiZ/KA+dt1fE3zq5x2XxclRcAbOIXnZcJ53ozP2Pa60gyELXagA==} + /@rc-component/mini-decimal@1.1.0: + resolution: {integrity: sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==} engines: {node: '>=8.x'} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 - /@rc-component/mutate-observer@1.0.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-okqRJSfNisXdI6CUeOLZC5ukBW/8kir2Ii4PJiKpUt+3+uS7dxwJUMxsUZquxA1rQuL8YcEmKVp/TCnR+yUdZA==} + /@rc-component/mutate-observer@1.1.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - classnames: 2.3.2 - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /@rc-component/portal@1.1.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-m8w3dFXX0H6UkJ4wtfrSwhe2/6M08uz24HHrF8pWfAXPwA9hwCuTE5per/C86KwNLouRpwFGcr7LfpHaa1F38g==} + /@rc-component/portal@1.1.2(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - classnames: 2.3.2 - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /@rc-component/tour@1.8.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-rrRGioHTLQlGca27G2+lw7QpRb3uuMYCUIJjj31/B44VCJS0P2tqYhOgtzvWQmaLMlWH3ZlpzotkKX13NT4XEA==} + /@rc-component/qrcode@1.0.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - '@rc-component/portal': 1.1.1(react-dom@18.2.0)(react@18.2.0) - '@rc-component/trigger': 1.8.0(react-dom@18.2.0)(react@18.2.0) - classnames: 2.3.2 - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /@rc-component/trigger@1.8.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-O9d4Tlg/FiCUlkQ+aAUUO5KmrBbj4XYq6qYfZE/hvNHzIepHqwLGx8H/d+1fG13dVPq70nGDf5ha9PQ96YRMVg==} + /@rc-component/tour@1.15.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-h6hyILDwL+In9GAgRobwRWihLqqsD7Uft3fZGrJ7L4EiyCoxbnNYwzPXDfz7vNDhWeVyvAWQJj9fJCzpI4+b4g==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - '@rc-component/portal': 1.1.1(react-dom@18.2.0)(react@18.2.0) - classnames: 2.3.2 - rc-align: 4.0.15(react-dom@18.2.0)(react@18.2.0) - rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) - rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - /@remix-run/router@1.5.0: - resolution: {integrity: sha512-bkUDCp8o1MvFO+qxkODcbhSqRa6P2GXgrGZVpt0dCXNW2HCSCqYI0ZoAqEOSAjRWmmlKcYgFvN4B4S+zo/f8kg==} - engines: {node: '>=14'} + '@babel/runtime': 7.25.0 + '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) + '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + /@rc-component/trigger@2.2.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-QarBCji02YE9aRFhZgRZmOpXBj0IZutRippsVBv85sxvG4FGk/vRxwAlkn3MS9zK5mwbETd86mAVg2tKqTkdJA==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.25.0 + '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + /@remix-run/router@1.18.0: + resolution: {integrity: sha512-L3jkqmqoSVBVKHfpGZmLrex0lxR5SucGA0sUfFzGctehw+S/ggL9L/0NnC5mw6P8HUWpFZ3nQw3cRApjjWx9Sw==} + engines: {node: '>=14.0.0'} dev: false - /@rjsf/antd@5.10.0(@ant-design/icons@5.0.1)(@rjsf/core@5.10.0)(@rjsf/utils@5.10.0)(antd@5.4.2)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-dj0BVL/g2wtrvNxnlya069H8M9hoserMTEWtRtutLf99nsmiargCei34OhM+MxkKkk+c8SsSv5DlEqPiUa+Low==} + /@rjsf/antd@5.19.4(@ant-design/icons@5.4.0)(@rjsf/core@5.10.0)(@rjsf/utils@5.10.0)(antd@5.19.4)(dayjs@1.11.12)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-oWeHkNEWTzNWTNI7fxLRCbWf89aM7Xj3/SQfxVTCYniDQTR6PWQYZ9E6glDpfzbN66gV3E+blvDnxrcq3+pWIA==} engines: {node: '>=14'} peerDependencies: - '@ant-design/icons': ^4.0.0 - '@rjsf/core': ^5.8.x - '@rjsf/utils': ^5.8.x - antd: ^4.0.0 + '@ant-design/icons': ^4.0.0 || ^5.0.0 + '@rjsf/core': ^5.19.x + '@rjsf/utils': ^5.19.x + antd: ^4.24.0 || ^5.8.5 dayjs: ^1.8.0 react: ^16.14.0 || >=17 dependencies: - '@ant-design/icons': 5.0.1(react-dom@18.2.0)(react@18.2.0) - '@rjsf/core': 5.10.0(@rjsf/utils@5.10.0)(react@18.2.0) - '@rjsf/utils': 5.10.0(react@18.2.0) - antd: 5.4.2(react-dom@18.2.0)(react@18.2.0) - classnames: 2.3.2 - dayjs: 1.11.10 + '@ant-design/icons': 5.4.0(react-dom@18.3.1)(react@18.3.1) + '@rjsf/core': 5.10.0(@rjsf/utils@5.10.0)(react@18.3.1) + '@rjsf/utils': 5.10.0(react@18.3.1) + antd: 5.19.4(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + dayjs: 1.11.12 lodash: 4.17.21 lodash-es: 4.17.21 - rc-picker: 2.7.2(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 + rc-picker: 2.7.6(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 transitivePeerDependencies: - react-dom dev: false - /@rjsf/core@5.10.0(@rjsf/utils@5.10.0)(react@18.2.0): + /@rjsf/core@5.10.0(@rjsf/utils@5.10.0)(react@18.3.1): resolution: {integrity: sha512-G9KapNurCpP9l/CK4rR3/pQ1rKuaD1BxdzHjaWUWrpUbEqbDTeNu+5630ymUf0y8A04JuSN1guQRVyYl0Dlfxw==} engines: {node: '>=14'} peerDependencies: '@rjsf/utils': ^5.8.x react: ^16.14.0 || >=17 dependencies: - '@rjsf/utils': 5.10.0(react@18.2.0) + '@rjsf/utils': 5.10.0(react@18.3.1) lodash: 4.17.21 lodash-es: 4.17.21 - markdown-to-jsx: 7.2.1(react@18.2.0) - nanoid: 3.3.6 + markdown-to-jsx: 7.4.7(react@18.3.1) + nanoid: 3.3.7 prop-types: 15.8.1 - react: 18.2.0 + react: 18.3.1 dev: false - /@rjsf/utils@5.10.0(react@18.2.0): + /@rjsf/utils@5.10.0(react@18.3.1): resolution: {integrity: sha512-HGytUxCGtV6OCOw4PbjFcksxrPIxUt0y3T9oqCTsP4xiqnLfve4ZfY9FkbHzPSGOXVp57yCNNEZTWiK6tcV9uA==} engines: {node: '>=14'} peerDependencies: @@ -6713,8 +5997,8 @@ packages: jsonpointer: 5.0.1 lodash: 4.17.21 lodash-es: 4.17.21 - react: 18.2.0 - react-is: 18.2.0 + react: 18.3.1 + react-is: 18.3.1 dev: false /@rjsf/validator-ajv6@5.10.0(@rjsf/utils@5.10.0): @@ -6723,7 +6007,7 @@ packages: peerDependencies: '@rjsf/utils': ^5.8.x dependencies: - '@rjsf/utils': 5.10.0(react@18.2.0) + '@rjsf/utils': 5.10.0(react@18.3.1) ajv: 6.12.6 lodash: 4.17.21 lodash-es: 4.17.21 @@ -6739,7 +6023,7 @@ packages: slash: 3.0.0 dev: true - /@rollup/plugin-babel@5.3.1(@babel/core@7.21.4)(rollup@2.79.1): + /@rollup/plugin-babel@5.3.1(@babel/core@7.25.2)(rollup@2.79.1): resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} peerDependencies: @@ -6750,13 +6034,15 @@ packages: '@types/babel__core': optional: true dependencies: - '@babel/core': 7.21.4 - '@babel/helper-module-imports': 7.22.15 + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 '@rollup/pluginutils': 3.1.0(rollup@2.79.1) rollup: 2.79.1 + transitivePeerDependencies: + - supports-color dev: false - /@rollup/plugin-babel@6.0.4(@babel/core@7.21.4)(rollup@3.20.2): + /@rollup/plugin-babel@6.0.4(@babel/core@7.25.2)(rollup@4.19.1): resolution: {integrity: sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==} engines: {node: '>=14.0.0'} peerDependencies: @@ -6769,10 +6055,12 @@ packages: rollup: optional: true dependencies: - '@babel/core': 7.21.4 - '@babel/helper-module-imports': 7.22.15 - '@rollup/pluginutils': 5.0.2(rollup@3.20.2) - rollup: 3.20.2 + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@rollup/pluginutils': 5.1.0(rollup@4.19.1) + rollup: 4.19.1 + transitivePeerDependencies: + - supports-color dev: true /@rollup/plugin-commonjs@11.1.0(rollup@1.32.1): @@ -6787,11 +6075,11 @@ packages: glob: 7.2.3 is-reference: 1.2.1 magic-string: 0.25.9 - resolve: 1.22.2 + resolve: 1.22.8 rollup: 1.32.1 dev: true - /@rollup/plugin-commonjs@23.0.7(rollup@3.20.2): + /@rollup/plugin-commonjs@23.0.7(rollup@3.29.4): resolution: {integrity: sha512-hsSD5Qzyuat/swzrExGG5l7EuIlPhwTsT7KwKbSCQzIcJWjRxiimi/0tyMYY2bByitNb3i1p+6JWEDGa0NvT0Q==} engines: {node: '>=14.0.0'} peerDependencies: @@ -6800,13 +6088,13 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.20.2) + '@rollup/pluginutils': 5.1.0(rollup@3.29.4) commondir: 1.0.1 estree-walker: 2.0.2 glob: 8.1.0 is-reference: 1.2.1 magic-string: 0.27.0 - rollup: 3.20.2 + rollup: 3.29.4 dev: true /@rollup/plugin-commonjs@24.0.0(rollup@2.78.0): @@ -6818,7 +6106,7 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@2.78.0) + '@rollup/pluginutils': 5.1.0(rollup@2.78.0) commondir: 1.0.1 estree-walker: 2.0.2 glob: 8.1.0 @@ -6827,22 +6115,40 @@ packages: rollup: 2.78.0 dev: false - /@rollup/plugin-commonjs@25.0.4(rollup@3.29.1): - resolution: {integrity: sha512-L92Vz9WUZXDnlQQl3EwbypJR4+DM2EbsO+/KOcEkP4Mc6Ct453EeDB2uH9lgRwj4w5yflgNpq9pHOiY8aoUXBQ==} + /@rollup/plugin-commonjs@25.0.8(rollup@3.29.4): + resolution: {integrity: sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^2.68.0||^3.0.0 + rollup: ^2.68.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.29.1) + '@rollup/pluginutils': 5.1.0(rollup@3.29.4) commondir: 1.0.1 estree-walker: 2.0.2 glob: 8.1.0 is-reference: 1.2.1 - magic-string: 0.27.0 - rollup: 3.29.1 + magic-string: 0.30.11 + rollup: 3.29.4 + dev: true + + /@rollup/plugin-commonjs@26.0.1(rollup@4.19.1): + resolution: {integrity: sha512-UnsKoZK6/aGIH6AdkptXhNvhaqftcjq3zZdT+LY5Ftms6JR06nADcDsYp5hTU9E2lbJUEOhdlY5J4DNTneM+jQ==} + engines: {node: '>=16.0.0 || 14 >= 14.17'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@4.19.1) + commondir: 1.0.1 + estree-walker: 2.0.2 + glob: 10.4.5 + is-reference: 1.2.1 + magic-string: 0.30.11 + rollup: 4.19.1 dev: true /@rollup/plugin-json@4.1.0(rollup@1.32.1): @@ -6854,7 +6160,7 @@ packages: rollup: 1.32.1 dev: true - /@rollup/plugin-json@5.0.2(rollup@3.20.2): + /@rollup/plugin-json@5.0.2(rollup@3.29.4): resolution: {integrity: sha512-D1CoOT2wPvadWLhVcmpkDnesTzjhNIQRWLsc3fA49IFOP2Y84cFOOJ+nKGYedvXHKUsPeq07HR4hXpBBr+CHlA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -6863,35 +6169,62 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.20.2) - rollup: 3.20.2 + '@rollup/pluginutils': 5.1.0(rollup@3.29.4) + rollup: 3.29.4 dev: true - /@rollup/plugin-json@6.0.0(rollup@3.29.1): - resolution: {integrity: sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==} + /@rollup/plugin-json@6.1.0(rollup@3.29.4): + resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.29.1) - rollup: 3.29.1 + '@rollup/pluginutils': 5.1.0(rollup@3.29.4) + rollup: 3.29.4 dev: true - /@rollup/plugin-multi-entry@6.0.0(rollup@3.20.2): - resolution: {integrity: sha512-msBgVncGQwh/ahxeP/rc8MXVZNBOjoVCsBuDk6uqyFzDv/SZN7jksfAsu6DJ2w4r5PaBX3/OXOjVPeCxya2waA==} + /@rollup/plugin-json@6.1.0(rollup@4.19.1): + resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@4.19.1) + rollup: 4.19.1 + dev: true + + /@rollup/plugin-multi-entry@6.0.1(rollup@3.29.4): + resolution: {integrity: sha512-AXm6toPyTSfbYZWghQGbom1Uh7dHXlrGa+HoiYNhQtDUE3Q7LqoUYdVQx9E1579QWS1uOiu+cZRSE4okO7ySgw==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/plugin-virtual': 3.0.2(rollup@3.29.4) + matched: 5.0.1 + rollup: 3.29.4 + dev: true + + /@rollup/plugin-multi-entry@6.0.1(rollup@4.19.1): + resolution: {integrity: sha512-AXm6toPyTSfbYZWghQGbom1Uh7dHXlrGa+HoiYNhQtDUE3Q7LqoUYdVQx9E1579QWS1uOiu+cZRSE4okO7ySgw==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true dependencies: - '@rollup/plugin-virtual': 3.0.1(rollup@3.20.2) + '@rollup/plugin-virtual': 3.0.2(rollup@4.19.1) matched: 5.0.1 - rollup: 3.20.2 + rollup: 4.19.1 dev: true /@rollup/plugin-node-resolve@11.2.1(rollup@2.79.1): @@ -6905,44 +6238,44 @@ packages: builtin-modules: 3.3.0 deepmerge: 4.3.1 is-module: 1.0.0 - resolve: 1.22.2 + resolve: 1.22.8 rollup: 2.79.1 dev: false - /@rollup/plugin-node-resolve@15.0.2(rollup@3.20.2): - resolution: {integrity: sha512-Y35fRGUjC3FaurG722uhUuG8YHOJRJQbI6/CkbRkdPotSpDj9NtIN85z1zrcyDcCQIW4qp5mgG72U+gJ0TAFEg==} + /@rollup/plugin-node-resolve@15.2.3(rollup@3.29.4): + resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^2.78.0||^3.0.0 + rollup: ^2.78.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.20.2) + '@rollup/pluginutils': 5.1.0(rollup@3.29.4) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-builtin-module: 3.2.1 is-module: 1.0.0 - resolve: 1.22.2 - rollup: 3.20.2 + resolve: 1.22.8 + rollup: 3.29.4 dev: true - /@rollup/plugin-node-resolve@15.2.1(rollup@3.29.1): - resolution: {integrity: sha512-nsbUg588+GDSu8/NS8T4UAshO6xeaOfINNuXeVHcKV02LJtoRaM1SiOacClw4kws1SFiNhdLGxlbMY9ga/zs/w==} + /@rollup/plugin-node-resolve@15.2.3(rollup@4.19.1): + resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^2.78.0||^3.0.0 + rollup: ^2.78.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.29.1) + '@rollup/pluginutils': 5.1.0(rollup@4.19.1) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-builtin-module: 3.2.1 is-module: 1.0.0 - resolve: 1.22.2 - rollup: 3.29.1 + resolve: 1.22.8 + rollup: 4.19.1 dev: true /@rollup/plugin-node-resolve@6.1.0(rollup@1.32.1): @@ -6955,7 +6288,7 @@ packages: '@types/resolve': 0.0.8 builtin-modules: 3.3.0 is-module: 1.0.0 - resolve: 1.22.2 + resolve: 1.22.8 rollup: 1.32.1 dev: true @@ -6969,21 +6302,21 @@ packages: rollup: 2.79.1 dev: false - /@rollup/plugin-replace@5.0.2(rollup@3.20.2): - resolution: {integrity: sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==} + /@rollup/plugin-replace@5.0.7(rollup@3.29.4): + resolution: {integrity: sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.20.2) - magic-string: 0.27.0 - rollup: 3.20.2 + '@rollup/pluginutils': 5.1.0(rollup@3.29.4) + magic-string: 0.30.11 + rollup: 3.29.4 dev: true - /@rollup/plugin-terser@0.1.0(rollup@3.20.2): + /@rollup/plugin-terser@0.1.0(rollup@3.29.4): resolution: {integrity: sha512-N2KK+qUfHX2hBzVzM41UWGLrEmcjVC37spC8R3c9mt3oEDFKh3N2e12/lLp9aVSt86veR0TQiCNQXrm8C6aiUQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -6992,47 +6325,42 @@ packages: rollup: optional: true dependencies: - rollup: 3.20.2 - terser: 5.16.9 + rollup: 3.29.4 + terser: 5.31.3 dev: true - /@rollup/plugin-terser@0.4.3(rollup@3.29.1): - resolution: {integrity: sha512-EF0oejTMtkyhrkwCdg0HJ0IpkcaVg1MMSf2olHb2Jp+1mnLM04OhjpJWGma4HobiDTF0WCyViWuvadyE9ch2XA==} + /@rollup/plugin-terser@0.4.4(rollup@3.29.4): + resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^2.x || ^3.x + rollup: ^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true dependencies: - rollup: 3.29.1 - serialize-javascript: 6.0.1 - smob: 1.4.0 - terser: 5.19.4 + rollup: 3.29.4 + serialize-javascript: 6.0.2 + smob: 1.5.0 + terser: 5.31.3 dev: true - /@rollup/plugin-typescript@11.1.3(rollup@3.29.1)(tslib@2.6.2)(typescript@5.4.5): - resolution: {integrity: sha512-8o6cNgN44kQBcpsUJTbTXMTtb87oR1O0zgP3Dxm71hrNgparap3VujgofEilTYJo+ivf2ke6uy3/E5QEaiRlDA==} + /@rollup/plugin-terser@0.4.4(rollup@4.19.1): + resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^2.14.0||^3.0.0 - tslib: '*' - typescript: '>=3.7.0' + rollup: ^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - tslib: - optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.29.1) - resolve: 1.22.2 - rollup: 3.29.1 - tslib: 2.6.2 - typescript: 5.4.5 + rollup: 4.19.1 + serialize-javascript: 6.0.2 + smob: 1.5.0 + terser: 5.31.3 dev: true - /@rollup/plugin-typescript@11.1.5(rollup@4.1.4)(tslib@2.6.2)(typescript@5.4.5): - resolution: {integrity: sha512-rnMHrGBB0IUEv69Q8/JGRD/n4/n6b3nfpufUu26axhUcboUzv/twfZU8fIBbTOphRAe0v8EyxzeDpKXqGHfyDA==} + /@rollup/plugin-typescript@11.1.6(rollup@3.29.4)(tslib@2.6.3)(typescript@5.5.4): + resolution: {integrity: sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^2.14.0||^3.0.0||^4.0.0 @@ -7044,18 +6372,18 @@ packages: tslib: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@4.1.4) - resolve: 1.22.2 - rollup: 4.1.4 - tslib: 2.6.2 - typescript: 5.4.5 + '@rollup/pluginutils': 5.1.0(rollup@3.29.4) + resolve: 1.22.8 + rollup: 3.29.4 + tslib: 2.6.3 + typescript: 5.5.4 dev: true - /@rollup/plugin-typescript@9.0.2(rollup@3.20.2)(tslib@2.5.0)(typescript@5.3.3): - resolution: {integrity: sha512-/sS93vmHUMjzDUsl5scNQr1mUlNE1QjBBvOhmRwJCH8k2RRhDIm3c977B3wdu3t3Ap17W6dDeXP3hj1P1Un1bA==} + /@rollup/plugin-typescript@11.1.6(rollup@4.19.1)(tslib@2.6.3)(typescript@5.5.4): + resolution: {integrity: sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^2.14.0||^3.0.0 + rollup: ^2.14.0||^3.0.0||^4.0.0 tslib: '*' typescript: '>=3.7.0' peerDependenciesMeta: @@ -7064,23 +6392,35 @@ packages: tslib: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.20.2) - resolve: 1.22.2 - rollup: 3.20.2 - tslib: 2.5.0 - typescript: 5.3.3 + '@rollup/pluginutils': 5.1.0(rollup@4.19.1) + resolve: 1.22.8 + rollup: 4.19.1 + tslib: 2.6.3 + typescript: 5.5.4 dev: true - /@rollup/plugin-virtual@3.0.1(rollup@3.20.2): - resolution: {integrity: sha512-fK8O0IL5+q+GrsMLuACVNk2x21g3yaw+sG2qn16SnUd3IlBsQyvWxLMGHmCmXRMecPjGRSZ/1LmZB4rjQm68og==} + /@rollup/plugin-virtual@3.0.2(rollup@3.29.4): + resolution: {integrity: sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true dependencies: - rollup: 3.20.2 + rollup: 3.29.4 + dev: true + + /@rollup/plugin-virtual@3.0.2(rollup@4.19.1): + resolution: {integrity: sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + rollup: 4.19.1 dev: true /@rollup/pluginutils@3.1.0(rollup@1.32.1): @@ -7115,190 +6455,212 @@ packages: picomatch: 2.3.1 dev: true - /@rollup/pluginutils@5.0.2(rollup@2.78.0): - resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} + /@rollup/pluginutils@5.1.0(rollup@2.78.0): + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 rollup: 2.78.0 dev: false - /@rollup/pluginutils@5.0.2(rollup@3.20.2): - resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true - dependencies: - '@types/estree': 1.0.1 - estree-walker: 2.0.2 - picomatch: 2.3.1 - rollup: 3.20.2 - dev: true - - /@rollup/pluginutils@5.0.2(rollup@3.29.1): - resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} + /@rollup/pluginutils@5.1.0(rollup@3.29.4): + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 - rollup: 3.29.1 + rollup: 3.29.4 dev: true - /@rollup/pluginutils@5.0.2(rollup@4.1.4): - resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} + /@rollup/pluginutils@5.1.0(rollup@4.19.1): + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 - rollup: 4.1.4 + rollup: 4.19.1 dev: true - /@rollup/rollup-android-arm-eabi@4.1.4: - resolution: {integrity: sha512-WlzkuFvpKl6CLFdc3V6ESPt7gq5Vrimd2Yv9IzKXdOpgbH4cdDSS1JLiACX8toygihtH5OlxyQzhXOph7Ovlpw==} + /@rollup/rollup-android-arm-eabi@4.19.1: + resolution: {integrity: sha512-XzqSg714++M+FXhHfXpS1tDnNZNpgxxuGZWlRG/jSj+VEPmZ0yg6jV4E0AL3uyBKxO8mO3xtOsP5mQ+XLfrlww==} cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-android-arm64@4.1.4: - resolution: {integrity: sha512-D1e+ABe56T9Pq2fD+R3ybe1ylCDzu3tY4Qm2Mj24R9wXNCq35+JbFbOpc2yrroO2/tGhTobmEl2Bm5xfE/n8RA==} + /@rollup/rollup-android-arm64@4.19.1: + resolution: {integrity: sha512-thFUbkHteM20BGShD6P08aungq4irbIZKUNbG70LN8RkO7YztcGPiKTTGZS7Kw+x5h8hOXs0i4OaHwFxlpQN6A==} cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-arm64@4.1.4: - resolution: {integrity: sha512-7vTYrgEiOrjxnjsgdPB+4i7EMxbVp7XXtS+50GJYj695xYTTEMn3HZVEvgtwjOUkAP/Q4HDejm4fIAjLeAfhtg==} + /@rollup/rollup-darwin-arm64@4.19.1: + resolution: {integrity: sha512-8o6eqeFZzVLia2hKPUZk4jdE3zW7LCcZr+MD18tXkgBBid3lssGVAYuox8x6YHoEPDdDa9ixTaStcmx88lio5Q==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-x64@4.1.4: - resolution: {integrity: sha512-eGJVZScKSLZkYjhTAESCtbyTBq9SXeW9+TX36ki5gVhDqJtnQ5k0f9F44jNK5RhAMgIj0Ht9+n6HAgH0gUUyWQ==} + /@rollup/rollup-darwin-x64@4.19.1: + resolution: {integrity: sha512-4T42heKsnbjkn7ovYiAdDVRRWZLU9Kmhdt6HafZxFcUdpjlBlxj4wDrt1yFWLk7G4+E+8p2C9tcmSu0KA6auGA==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.1.4: - resolution: {integrity: sha512-HnigYSEg2hOdX1meROecbk++z1nVJDpEofw9V2oWKqOWzTJlJf1UXVbDE6Hg30CapJxZu5ga4fdAQc/gODDkKg==} + /@rollup/rollup-linux-arm-gnueabihf@4.19.1: + resolution: {integrity: sha512-MXg1xp+e5GhZ3Vit1gGEyoC+dyQUBy2JgVQ+3hUrD9wZMkUw/ywgkpK7oZgnB6kPpGrxJ41clkPPnsknuD6M2Q==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-musleabihf@4.19.1: + resolution: {integrity: sha512-DZNLwIY4ftPSRVkJEaxYkq7u2zel7aah57HESuNkUnz+3bZHxwkCUkrfS2IWC1sxK6F2QNIR0Qr/YXw7nkF3Pw==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.1.4: - resolution: {integrity: sha512-TzJ+N2EoTLWkaClV2CUhBlj6ljXofaYzF/R9HXqQ3JCMnCHQZmQnbnZllw7yTDp0OG5whP4gIPozR4QiX+00MQ==} + /@rollup/rollup-linux-arm64-gnu@4.19.1: + resolution: {integrity: sha512-C7evongnjyxdngSDRRSQv5GvyfISizgtk9RM+z2biV5kY6S/NF/wta7K+DanmktC5DkuaJQgoKGf7KUDmA7RUw==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.1.4: - resolution: {integrity: sha512-aVPmNMdp6Dlo2tWkAduAD/5TL/NT5uor290YvjvFvCv0Q3L7tVdlD8MOGDL+oRSw5XKXKAsDzHhUOPUNPRHVTQ==} + /@rollup/rollup-linux-arm64-musl@4.19.1: + resolution: {integrity: sha512-89tFWqxfxLLHkAthAcrTs9etAoBFRduNfWdl2xUs/yLV+7XDrJ5yuXMHptNqf1Zw0UCA3cAutkAiAokYCkaPtw==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.1.4: - resolution: {integrity: sha512-77Fb79ayiDad0grvVsz4/OB55wJRyw9Ao+GdOBA9XywtHpuq5iRbVyHToGxWquYWlEf6WHFQQnFEttsAzboyKg==} + /@rollup/rollup-linux-powerpc64le-gnu@4.19.1: + resolution: {integrity: sha512-PromGeV50sq+YfaisG8W3fd+Cl6mnOOiNv2qKKqKCpiiEke2KiKVyDqG/Mb9GWKbYMHj5a01fq/qlUR28PFhCQ==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.19.1: + resolution: {integrity: sha512-/1BmHYh+iz0cNCP0oHCuF8CSiNj0JOGf0jRlSo3L/FAyZyG2rGBuKpkZVH9YF+x58r1jgWxvm1aRg3DHrLDt6A==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-s390x-gnu@4.19.1: + resolution: {integrity: sha512-0cYP5rGkQWRZKy9/HtsWVStLXzCF3cCBTRI+qRL8Z+wkYlqN7zrSYm6FuY5Kd5ysS5aH0q5lVgb/WbG4jqXN1Q==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.19.1: + resolution: {integrity: sha512-XUXeI9eM8rMP8aGvii/aOOiMvTs7xlCosq9xCjcqI9+5hBxtjDpD+7Abm1ZhVIFE1J2h2VIg0t2DX/gjespC2Q==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.1.4: - resolution: {integrity: sha512-/t6C6niEQTqmQTVTD9TDwUzxG91Mlk69/v0qodIPUnjjB3wR4UA3klg+orR2SU3Ux2Cgf2pWPL9utK80/1ek8g==} + /@rollup/rollup-linux-x64-musl@4.19.1: + resolution: {integrity: sha512-V7cBw/cKXMfEVhpSvVZhC+iGifD6U1zJ4tbibjjN+Xi3blSXaj/rJynAkCFFQfoG6VZrAiP7uGVzL440Q6Me2Q==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.1.4: - resolution: {integrity: sha512-ZY5BHHrOPkMbCuGWFNpJH0t18D2LU6GMYKGaqaWTQ3CQOL57Fem4zE941/Ek5pIsVt70HyDXssVEFQXlITI5Gg==} + /@rollup/rollup-win32-arm64-msvc@4.19.1: + resolution: {integrity: sha512-88brja2vldW/76jWATlBqHEoGjJLRnP0WOEKAUbMcXaAZnemNhlAHSyj4jIwMoP2T750LE9lblvD4e2jXleZsA==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.1.4: - resolution: {integrity: sha512-XG2mcRfFrJvYyYaQmvCIvgfkaGinfXrpkBuIbJrTl9SaIQ8HumheWTIwkNz2mktCKwZfXHQNpO7RgXLIGQ7HXA==} + /@rollup/rollup-win32-ia32-msvc@4.19.1: + resolution: {integrity: sha512-LdxxcqRVSXi6k6JUrTah1rHuaupoeuiv38du8Mt4r4IPer3kwlTo+RuvfE8KzZ/tL6BhaPlzJ3835i6CxrFIRQ==} cpu: [ia32] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.1.4: - resolution: {integrity: sha512-ANFqWYPwkhIqPmXw8vm0GpBEHiPpqcm99jiiAp71DbCSqLDhrtr019C5vhD0Bw4My+LmMvciZq6IsWHqQpl2ZQ==} + /@rollup/rollup-win32-x64-msvc@4.19.1: + resolution: {integrity: sha512-2bIrL28PcK3YCqD9anGxDxamxdiJAxA+l7fWIwM5o8UqNy1t3d1NdAweO2XhA0KTDJ5aH1FsuiT5+7VhtHliXg==} cpu: [x64] os: [win32] requiresBuild: true dev: true optional: true - /@rushstack/eslint-patch@1.2.0: - resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==} + /@rushstack/eslint-patch@1.10.4: + resolution: {integrity: sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==} - /@segment/analytics-core@1.2.3: - resolution: {integrity: sha512-/B4f4Hxmwd9WpEba/ChYkUwhILz5cPhG4Sto03IlLc8vbV7gAOCGH021EKvU3Wv70WlRK6EgJkuDLPnRl2a2aA==} + /@segment/analytics-core@1.6.0: + resolution: {integrity: sha512-bn9X++IScUfpT7aJGjKU/yJAu/Ko2sYD6HsKA70Z2560E89x30pqgqboVKY8kootvQnT4UKCJiUr5NDMgjmWdQ==} dependencies: '@lukeed/uuid': 2.0.1 - dset: 3.1.2 - tslib: 2.6.2 + '@segment/analytics-generic-utils': 1.2.0 + dset: 3.1.3 + tslib: 2.6.3 + dev: true + + /@segment/analytics-generic-utils@1.2.0: + resolution: {integrity: sha512-DfnW6mW3YQOLlDQQdR89k4EqfHb0g/3XvBXkovH1FstUN93eL1kfW9CsDcVQyH3bAC5ZsFyjA/o/1Q2j0QeoWw==} + dependencies: + tslib: 2.6.3 dev: true - /@segment/analytics-next@1.51.3: - resolution: {integrity: sha512-c22GDz6rrhliIsgtLQjEcRiZdqb70+0hEyfTI6YpRXZzEXBwdJybO5ZCD7NRlVFHf/qXp1qcjHuQ5xyOGr2lJg==} + /@segment/analytics-next@1.72.1: + resolution: {integrity: sha512-OeCe/jMAWxC5a1fY8RRszIzG7zevmkRHEaUQZMXskPFPWu2fB9r8A/JeZtoX9+kKlNg2SMMAdsnIRxsvaHIkMA==} dependencies: '@lukeed/uuid': 2.0.1 - '@segment/analytics-core': 1.2.3 + '@segment/analytics-core': 1.6.0 + '@segment/analytics-generic-utils': 1.2.0 '@segment/analytics.js-video-plugins': 0.2.1 '@segment/facade': 3.4.10 - '@segment/tsub': 1.0.1 - dset: 3.1.2 + dset: 3.1.3 js-cookie: 3.0.1 node-fetch: 2.7.0 - spark-md5: 3.0.2 - tslib: 2.6.2 + tslib: 2.6.3 unfetch: 4.2.0 transitivePeerDependencies: - encoding - - supports-color dev: true /@segment/analytics.js-video-plugins@0.2.1: @@ -7326,52 +6688,60 @@ packages: resolution: {integrity: sha512-BtanDuvJqnACFkeeYje7pWULVv8RgZaqKHWwGFnL/g/TH/CcZjkIVTfGDp/MAxmilYHUkrX70SqwnYSTNEaN7A==} dev: true - /@segment/tsub@1.0.1: - resolution: {integrity: sha512-rUpvlj/rRfOolk5rjwyrsbl0qzGLsaYgFNEiOSrwrWDryDPq1ZGdo+3Eb+E8+EC0yZOAO4F1DjJfLtaSifpx7w==} - hasBin: true - dependencies: - '@stdlib/math-base-special-ldexp': 0.0.5 - dlv: 1.1.3 - dset: 3.1.2 - tiny-hashes: 1.0.1 - transitivePeerDependencies: - - supports-color - dev: true - /@sensejs/kafkajs-zstd-support@0.11.0(kafkajs@2.2.4): resolution: {integrity: sha512-qWTaL7wUOUv/HLW8zBmfReVWFn1qOUvubqdhbjMzf1mD6at0dkOFF5g+QSi8Nb3RXWJeNb0KhgIwbOm/S+wPaQ==} peerDependencies: kafkajs: ^2.0.2 dependencies: kafkajs: 2.2.4 - tslib: 2.6.2 + tslib: 2.6.3 zstd-napi: 0.0.6 dev: false - /@sentry-internal/tracing@7.70.0: - resolution: {integrity: sha512-SpbE6wZhs6QwG2ORWCt8r28o1T949qkWx/KeRTCdK4Ub95PQ3Y3DgnqD8Wz//3q50Wt6EZDEibmz4t067g6PPg==} + /@sentry-internal/feedback@7.118.0: + resolution: {integrity: sha512-IYOGRcqIqKJJpMwBBv+0JTu0FPpXnakJYvOx/XEa/SNyF5+l7b9gGEjUVWh1ok50kTLW/XPnpnXNAGQcoKHg+w==} + engines: {node: '>=12'} + dependencies: + '@sentry/core': 7.118.0 + '@sentry/types': 7.118.0 + '@sentry/utils': 7.118.0 + dev: false + + /@sentry-internal/replay-canvas@7.118.0: + resolution: {integrity: sha512-XxHlCClvrxmVKpiZetFYyiBaPQNiojoBGFFVgbbWBIAPc+fWeLJ2BMoQEBjn/0NA/8u8T6lErK5YQo/eIx9+XQ==} + engines: {node: '>=12'} + dependencies: + '@sentry/core': 7.118.0 + '@sentry/replay': 7.118.0 + '@sentry/types': 7.118.0 + '@sentry/utils': 7.118.0 + dev: false + + /@sentry-internal/tracing@7.118.0: + resolution: {integrity: sha512-dERAshKlQLrBscHSarhHyUeGsu652bDTUN1FK0m4e3X48M3I5/s+0N880Qjpe5MprNLcINlaIgdQ9jkisvxjfw==} engines: {node: '>=8'} dependencies: - '@sentry/core': 7.70.0 - '@sentry/types': 7.70.0 - '@sentry/utils': 7.70.0 - tslib: 2.6.2 + '@sentry/core': 7.118.0 + '@sentry/types': 7.118.0 + '@sentry/utils': 7.118.0 dev: false - /@sentry/browser@7.70.0: - resolution: {integrity: sha512-PB+IP49/TLcnDHCj9eJ5tcHE0pzXg23wBakmF3KGMSd5nxEbUvmOsaFPZcgUUlL9JlU3v1Y40We7HdPStrY6oA==} + /@sentry/browser@7.118.0: + resolution: {integrity: sha512-8onDOFV1VLEoBuqA5yaJeR3FF1JNuxr5C7p1oN3OwY724iTVqQnOLmZKZaSnHV3RkY67wKDGQkQIie14sc+42g==} engines: {node: '>=8'} dependencies: - '@sentry-internal/tracing': 7.70.0 - '@sentry/core': 7.70.0 - '@sentry/replay': 7.70.0 - '@sentry/types': 7.70.0 - '@sentry/utils': 7.70.0 - tslib: 2.6.2 + '@sentry-internal/feedback': 7.118.0 + '@sentry-internal/replay-canvas': 7.118.0 + '@sentry-internal/tracing': 7.118.0 + '@sentry/core': 7.118.0 + '@sentry/integrations': 7.118.0 + '@sentry/replay': 7.118.0 + '@sentry/types': 7.118.0 + '@sentry/utils': 7.118.0 dev: false - /@sentry/cli@1.75.2: - resolution: {integrity: sha512-CG0CKH4VCKWzEaegouWfCLQt9SFN+AieFESCatJ7zSuJmzF05ywpMusjxqRul6lMwfUhRKjGKOzcRJ1jLsfTBw==} + /@sentry/cli@1.77.3: + resolution: {integrity: sha512-c3eDqcDRmy4TFz2bFU5Y6QatlpoBPPa8cxBooaS4aMQpnIdLYPF1xhyyiW0LQlDUNc3rRjNF7oN5qKoaRoMTQQ==} engines: {node: '>= 8'} hasBin: true requiresBuild: true @@ -7387,30 +6757,29 @@ packages: - supports-color dev: false - /@sentry/core@7.70.0: - resolution: {integrity: sha512-voUsGVM+jwRp99AQYFnRvr7sVd2tUhIMj1L6F42LtD3vp7t5ZnKp3NpXagtFW2vWzXESfyJUBhM0qI/bFvn7ZA==} + /@sentry/core@7.118.0: + resolution: {integrity: sha512-ol0xBdp3/K11IMAYSQE0FMxBOOH9hMsb/rjxXWe0hfM5c72CqYWL3ol7voPci0GELJ5CZG+9ImEU1V9r6gK64g==} engines: {node: '>=8'} dependencies: - '@sentry/types': 7.70.0 - '@sentry/utils': 7.70.0 - tslib: 2.6.2 + '@sentry/types': 7.118.0 + '@sentry/utils': 7.118.0 dev: false - /@sentry/integrations@7.70.0: - resolution: {integrity: sha512-ffIEuiElROzl4IpYX0O7vtPaadXVycPtyjq86YTHjd2TUFcYuQTPBm5UjEVE0/sSNNCdfWYxNThU/fVyq93l1g==} + /@sentry/integrations@7.118.0: + resolution: {integrity: sha512-C2rR4NvIMjokF8jP5qzSf1o2zxDx7IeYnr8u15Kb2+HdZtX559owALR0hfgwnfeElqMhGlJBaKUWZ48lXJMzCQ==} engines: {node: '>=8'} dependencies: - '@sentry/types': 7.70.0 - '@sentry/utils': 7.70.0 + '@sentry/core': 7.118.0 + '@sentry/types': 7.118.0 + '@sentry/utils': 7.118.0 localforage: 1.10.0 - tslib: 2.6.2 dev: false - /@sentry/nextjs@7.70.0(next@13.5.6)(react@18.2.0)(webpack@5.91.0): - resolution: {integrity: sha512-Mpto8+LY4ZohRUOy1KJIM6r0oAJ+vo/lVAYXtO3L1rgSIcKD422XqBvJAQIQhQjru1/FpWVdOd2BKl+gD1emFw==} + /@sentry/nextjs@7.118.0(next@14.2.5)(react@18.3.1)(webpack@5.93.0): + resolution: {integrity: sha512-UFhg4QSZ6LqOKTU67kgjojy23ZqoIgB1fjwOS6S10d5LKdbz7POwrNwHqi+aB3YIqyrSvRtFCXA+8mmsE0QoqA==} engines: {node: '>=8'} peerDependencies: - next: ^10.0.8 || ^11.0 || ^12.0 || ^13.0 + next: ^10.0.8 || ^11.0 || ^12.0 || ^13.0 || ^14.0 react: 16.x || 17.x || 18.x webpack: '>= 4.0.0' peerDependenciesMeta: @@ -7418,99 +6787,124 @@ packages: optional: true dependencies: '@rollup/plugin-commonjs': 24.0.0(rollup@2.78.0) - '@sentry/core': 7.70.0 - '@sentry/integrations': 7.70.0 - '@sentry/node': 7.70.0 - '@sentry/react': 7.70.0(react@18.2.0) - '@sentry/types': 7.70.0 - '@sentry/utils': 7.70.0 - '@sentry/vercel-edge': 7.70.0 - '@sentry/webpack-plugin': 1.20.0 + '@sentry/core': 7.118.0 + '@sentry/integrations': 7.118.0 + '@sentry/node': 7.118.0 + '@sentry/react': 7.118.0(react@18.3.1) + '@sentry/types': 7.118.0 + '@sentry/utils': 7.118.0 + '@sentry/vercel-edge': 7.118.0 + '@sentry/webpack-plugin': 1.21.0 chalk: 3.0.0 - next: 13.5.6(@babel/core@7.21.4)(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 + next: 14.2.5(@babel/core@7.25.2)(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + resolve: 1.22.8 rollup: 2.78.0 stacktrace-parser: 0.1.10 - tslib: 2.6.2 - webpack: 5.91.0(webpack-cli@5.1.4) + webpack: 5.93.0(webpack-cli@5.1.4) transitivePeerDependencies: - encoding - supports-color dev: false - /@sentry/node@7.70.0: - resolution: {integrity: sha512-GeGlnu3QnJX0GN2FvZ3E31e48ZhRzEpREyC0Wa4BRvYHnyiGvsQjo/0RKeq6vvlggRhVnuoMg/jESyUmdntrAA==} + /@sentry/node@7.118.0: + resolution: {integrity: sha512-79N63DvYKkNPqzmc0cjO+vMZ/nU7+CbE3K3COQNiV7gk58+666G9mRZQJuZVOVebatq5wM5UR0G4LPkwD+J84g==} engines: {node: '>=8'} dependencies: - '@sentry-internal/tracing': 7.70.0 - '@sentry/core': 7.70.0 - '@sentry/types': 7.70.0 - '@sentry/utils': 7.70.0 - cookie: 0.5.0 - https-proxy-agent: 5.0.1 - lru_map: 0.3.3 - tslib: 2.6.2 - transitivePeerDependencies: - - supports-color + '@sentry-internal/tracing': 7.118.0 + '@sentry/core': 7.118.0 + '@sentry/integrations': 7.118.0 + '@sentry/types': 7.118.0 + '@sentry/utils': 7.118.0 dev: false - /@sentry/react@7.70.0(react@18.2.0): - resolution: {integrity: sha512-oFd1NEG6S3nczZY8ZFQdEY9ZOfgOvJT1KRoXaSaBIC1KjL0+ngX9TKg+eiYxvI0euxnY5jCwozbA0NsDXqwN7A==} + /@sentry/react@7.118.0(react@18.3.1): + resolution: {integrity: sha512-oEYe5TGk8S7YzPsFqDf4xDHjfzs35/QFE+dou3S2d24OYpso8Tq4C5f1VzYmnOOyy85T7JNicYLSo0n0NSJvQg==} engines: {node: '>=8'} peerDependencies: react: 15.x || 16.x || 17.x || 18.x dependencies: - '@sentry/browser': 7.70.0 - '@sentry/types': 7.70.0 - '@sentry/utils': 7.70.0 + '@sentry/browser': 7.118.0 + '@sentry/core': 7.118.0 + '@sentry/types': 7.118.0 + '@sentry/utils': 7.118.0 hoist-non-react-statics: 3.3.2 - react: 18.2.0 - tslib: 2.6.2 + react: 18.3.1 dev: false - /@sentry/replay@7.70.0: - resolution: {integrity: sha512-XjnyE6ORREz9kBWWHdXaIjS9P2Wo7uEw+y23vfLQwzV0Nx3xJ+FG4dwf8onyIoeCZDKbz7cqQIbugU1gkgUtZw==} + /@sentry/replay@7.118.0: + resolution: {integrity: sha512-boQfCL+1L/tSZ9Huwi00+VtU+Ih1Lcg8HtxBuAsBCJR9pQgUL5jp7ECYdTeeHyCh/RJO7JqV1CEoGTgohe10mA==} engines: {node: '>=12'} dependencies: - '@sentry/core': 7.70.0 - '@sentry/types': 7.70.0 - '@sentry/utils': 7.70.0 + '@sentry-internal/tracing': 7.118.0 + '@sentry/core': 7.118.0 + '@sentry/types': 7.118.0 + '@sentry/utils': 7.118.0 dev: false - /@sentry/types@7.70.0: - resolution: {integrity: sha512-rY4DqpiDBtXSk4MDNBH3dwWqfPbNBI/9GA7Y5WJSIcObBtfBKp0fzYliHJZD0pgM7d4DPFrDn42K9Iiumgymkw==} + /@sentry/types@7.118.0: + resolution: {integrity: sha512-2drqrD2+6kgeg+W/ycmiti3G4lJrV3hGjY9PpJ3bJeXrh6T2+LxKPzlgSEnKFaeQWkXdZ4eaUbtTXVebMjb5JA==} engines: {node: '>=8'} dev: false - /@sentry/utils@7.70.0: - resolution: {integrity: sha512-0cChMH0lsGp+5I3D4wOHWwjFN19HVrGUs7iWTLTO5St3EaVbdeLbI1vFXHxMxvopbwgpeZafbreHw/loIdZKpw==} + /@sentry/utils@7.118.0: + resolution: {integrity: sha512-43qItc/ydxZV1Zb3Kn2M54RwL9XXFa3IAYBO8S82Qvq5YUYmU2AmJ1jgg7DabXlVSWgMA1HntwqnOV3JLaEnTQ==} engines: {node: '>=8'} dependencies: - '@sentry/types': 7.70.0 - tslib: 2.6.2 + '@sentry/types': 7.118.0 dev: false - /@sentry/vercel-edge@7.70.0: - resolution: {integrity: sha512-YveyP23ALodINciALKPyw6zDflujGCywzOKh249WzVkO4/3MkFstk82luuPWIbn3Aba4L7MqUB8xHZQANw/dMw==} + /@sentry/vercel-edge@7.118.0: + resolution: {integrity: sha512-DclIpD0/Xi0kNeT97aFFtMLBzk3GFZXf9mpGgbx29Gt9Vt7Fyq8ZA9izALHYzXx056fqQaLtvOAkQxWsy9QuSA==} engines: {node: '>=8'} dependencies: - '@sentry/core': 7.70.0 - '@sentry/types': 7.70.0 - '@sentry/utils': 7.70.0 - tslib: 2.6.2 + '@sentry-internal/tracing': 7.118.0 + '@sentry/core': 7.118.0 + '@sentry/integrations': 7.118.0 + '@sentry/types': 7.118.0 + '@sentry/utils': 7.118.0 dev: false - /@sentry/webpack-plugin@1.20.0: - resolution: {integrity: sha512-Ssj1mJVFsfU6vMCOM2d+h+KQR7QHSfeIP16t4l20Uq/neqWXZUQ2yvQfe4S3BjdbJXz/X4Rw8Hfy1Sd0ocunYw==} + /@sentry/webpack-plugin@1.21.0: + resolution: {integrity: sha512-x0PYIMWcsTauqxgl7vWUY6sANl+XGKtx7DCVnnY7aOIIlIna0jChTAPANTfA2QrK+VK+4I/4JxatCEZBnXh3Og==} engines: {node: '>= 8'} dependencies: - '@sentry/cli': 1.75.2 + '@sentry/cli': 1.77.3 webpack-sources: 3.2.3 transitivePeerDependencies: - encoding - supports-color dev: false + /@sigstore/bundle@1.1.0: + resolution: {integrity: sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@sigstore/protobuf-specs': 0.2.1 + + /@sigstore/protobuf-specs@0.2.1: + resolution: {integrity: sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + /@sigstore/sign@1.0.0: + resolution: {integrity: sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@sigstore/bundle': 1.1.0 + '@sigstore/protobuf-specs': 0.2.1 + make-fetch-happen: 11.1.1 + transitivePeerDependencies: + - supports-color + + /@sigstore/tuf@1.0.3: + resolution: {integrity: sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@sigstore/protobuf-specs': 0.2.1 + tuf-js: 1.1.7 + transitivePeerDependencies: + - supports-color + /@sinclair/typebox@0.24.51: resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} @@ -7531,15 +6925,15 @@ packages: dependencies: type-detect: 4.0.8 - /@sinonjs/commons@2.0.0: - resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} + /@sinonjs/commons@3.0.1: + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} dependencies: type-detect: 4.0.8 - /@sinonjs/fake-timers@10.0.2: - resolution: {integrity: sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==} + /@sinonjs/fake-timers@10.3.0: + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} dependencies: - '@sinonjs/commons': 2.0.0 + '@sinonjs/commons': 3.0.1 /@sinonjs/fake-timers@8.1.0: resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} @@ -7553,57 +6947,25 @@ packages: '@sinonjs/commons': 1.8.6 dev: true - /@smithy/abort-controller@2.0.9: - resolution: {integrity: sha512-8liHOEbx99xcy4VndeQNQhyA0LS+e7UqsuRnDTSIA26IKBv/7vA9w09KOd4fgNULrvX0r3WpA6cwsQTRJpSWkg==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/types': 2.3.3 - tslib: 2.6.2 - dev: false - /@smithy/abort-controller@3.1.1: resolution: {integrity: sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==} engines: {node: '>=16.0.0'} dependencies: '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@smithy/chunked-blob-reader-native@2.0.0: - resolution: {integrity: sha512-HM8V2Rp1y8+1343tkZUKZllFhEQPNmpNdgFAncbTsxkZ18/gqjk23XXv3qGyXWp412f3o43ZZ1UZHVcHrpRnCQ==} - dependencies: - '@smithy/util-base64': 2.0.0 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@smithy/chunked-blob-reader-native@3.0.0: resolution: {integrity: sha512-VDkpCYW+peSuM4zJip5WDfqvg2Mo/e8yxOv3VF1m11y7B8KKMKVFtmZWDe36Fvk8rGuWrPZHHXZ7rR7uM5yWyg==} dependencies: '@smithy/util-base64': 3.0.0 - tslib: 2.6.2 - dev: false - - /@smithy/chunked-blob-reader@2.0.0: - resolution: {integrity: sha512-k+J4GHJsMSAIQPChGBrjEmGS+WbPonCXesoqP9fynIqjn7rdOThdH8FAeCmokP9mxTYKQAKoHCLPzNlm6gh7Wg==} - dependencies: - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@smithy/chunked-blob-reader@3.0.0: resolution: {integrity: sha512-sbnURCwjF0gSToGlsBiAmd1lRCmSn72nu9axfJu5lIx6RUEgHu6GwTMbqCdhQSi0Pumcm5vFxsi9XWXb2mTaoA==} dependencies: - tslib: 2.6.2 - dev: false - - /@smithy/config-resolver@2.0.10: - resolution: {integrity: sha512-MwToDsCltHjumkCuRn883qoNeJUawc2b8sX9caSn5vLz6J5crU1IklklNxWCaMO2z2nDL91Po4b/aI1eHv5PfA==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/node-config-provider': 2.0.12 - '@smithy/types': 2.3.3 - '@smithy/util-config-provider': 2.0.0 - '@smithy/util-middleware': 2.0.2 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@smithy/config-resolver@3.0.5: @@ -7614,52 +6976,32 @@ packages: '@smithy/types': 3.3.0 '@smithy/util-config-provider': 3.0.0 '@smithy/util-middleware': 3.0.3 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@smithy/core@2.2.7: - resolution: {integrity: sha512-Wwd9QWKaYdR+n/oIqJbuwSr9lHuv7sa1e3Zu4wIToZl0sS7xapTYYqQtXP1hKKtIWz0jl8AhvOfNwkfT5jjV0w==} + /@smithy/core@2.3.1: + resolution: {integrity: sha512-BC7VMXx/1BCmRPCVzzn4HGWAtsrb7/0758EtwOGFJQrlSwJBEjCcDLNZLFoL/68JexYa2s+KmgL/UfmXdG6v1w==} engines: {node: '>=16.0.0'} dependencies: - '@smithy/middleware-endpoint': 3.0.5 - '@smithy/middleware-retry': 3.0.10 + '@smithy/middleware-endpoint': 3.1.0 + '@smithy/middleware-retry': 3.0.13 '@smithy/middleware-serde': 3.0.3 - '@smithy/protocol-http': 4.0.4 - '@smithy/smithy-client': 3.1.8 + '@smithy/protocol-http': 4.1.0 + '@smithy/smithy-client': 3.1.11 '@smithy/types': 3.3.0 '@smithy/util-middleware': 3.0.3 - tslib: 2.6.2 - dev: false - - /@smithy/credential-provider-imds@2.0.12: - resolution: {integrity: sha512-S3lUNe+2fEFwKcmiQniXGPXt69vaHvQCw8kYQOBL4OvJsgwfpkIYDZdroHbTshYi0M6WaKL26Mw+hvgma6dZqA==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/node-config-provider': 2.0.12 - '@smithy/property-provider': 2.0.10 - '@smithy/types': 2.3.3 - '@smithy/url-parser': 2.0.9 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@smithy/credential-provider-imds@3.1.4: - resolution: {integrity: sha512-NKyH01m97Xa5xf3pB2QOF3lnuE8RIK0hTVNU5zvZAwZU8uspYO4DHQVlK+Y5gwSrujTfHvbfd1D9UFJAc0iYKQ==} + /@smithy/credential-provider-imds@3.2.0: + resolution: {integrity: sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA==} engines: {node: '>=16.0.0'} dependencies: '@smithy/node-config-provider': 3.1.4 '@smithy/property-provider': 3.1.3 '@smithy/types': 3.3.0 '@smithy/url-parser': 3.0.3 - tslib: 2.6.2 - dev: false - - /@smithy/eventstream-codec@2.0.9: - resolution: {integrity: sha512-sy0pcbKnawt1iu+qCoSFbs/h9PAaUgvlJEO3lqkE1HFFj4p5RgL98vH+9CyDoj6YY82cG5XsorFmcLqQJHTOYw==} - dependencies: - '@aws-crypto/crc32': 3.0.0 - '@smithy/types': 2.3.3 - '@smithy/util-hex-encoding': 2.0.0 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@smithy/eventstream-codec@3.1.2: @@ -7668,33 +7010,16 @@ packages: '@aws-crypto/crc32': 5.2.0 '@smithy/types': 3.3.0 '@smithy/util-hex-encoding': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@smithy/eventstream-serde-browser@2.0.9: - resolution: {integrity: sha512-g70enHZau2hGj1Uxedrn8AAjH9E7RnpHdwkuPKapagah53ztbwI7xaNeA5SLD4MjSjdrjathyQBCQKIzwXrR1g==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/eventstream-serde-universal': 2.0.9 - '@smithy/types': 2.3.3 - tslib: 2.6.2 - dev: false - - /@smithy/eventstream-serde-browser@3.0.4: - resolution: {integrity: sha512-Eo4anLZX6ltGJTZ5yJMc80gZPYYwBn44g0h7oFq6et+TYr5dUsTpIcDbz2evsOKIZhZ7zBoFWHtBXQ4QQeb5xA==} + /@smithy/eventstream-serde-browser@3.0.5: + resolution: {integrity: sha512-dEyiUYL/ekDfk+2Ra4GxV+xNnFoCmk1nuIXg+fMChFTrM2uI/1r9AdiTYzPqgb72yIv/NtAj6C3dG//1wwgakQ==} engines: {node: '>=16.0.0'} dependencies: '@smithy/eventstream-serde-universal': 3.0.4 '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@smithy/eventstream-serde-config-resolver@2.0.9: - resolution: {integrity: sha512-+15GzIMtdSuRPyuCeGZ7gzgD94Ejv6eM1vKcqvipdzS+i36KTZ2A9aZsJk+gDw//OCD1EMx9SqpV6bUvMS4PWg==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/types': 2.3.3 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@smithy/eventstream-serde-config-resolver@3.0.3: @@ -7702,16 +7027,7 @@ packages: engines: {node: '>=16.0.0'} dependencies: '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@smithy/eventstream-serde-node@2.0.9: - resolution: {integrity: sha512-UEJcvN2WXXEjkewtFkj1S2HSZLbyCgzUnfoFPrTuKy4+xRfakO5dNx6ws2h1pvb8Vc7mTuBL+Webl1R5mnVsXA==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/eventstream-serde-universal': 2.0.9 - '@smithy/types': 2.3.3 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@smithy/eventstream-serde-node@3.0.4: @@ -7720,16 +7036,7 @@ packages: dependencies: '@smithy/eventstream-serde-universal': 3.0.4 '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@smithy/eventstream-serde-universal@2.0.9: - resolution: {integrity: sha512-dAHQEYlK/1tjjieBE7jjXwpLQFgKdkvC4HSQf+/Jj4t34XbUmXWHbw92/EuLp9+vjNB/JQPvkwpMtN31jxIDeg==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/eventstream-codec': 2.0.9 - '@smithy/types': 2.3.3 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@smithy/eventstream-serde-universal@3.0.4: @@ -7738,36 +7045,17 @@ packages: dependencies: '@smithy/eventstream-codec': 3.1.2 '@smithy/types': 3.3.0 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@smithy/fetch-http-handler@2.1.5: - resolution: {integrity: sha512-BIeCHGfr5JCGN+EMTwZK74ELvjPXOIrI7OLM5OhZJJ6AmZyRv2S9ANJk18AtLwht0TsSm+8WoXIEp8LuxNgUyA==} + /@smithy/fetch-http-handler@3.2.4: + resolution: {integrity: sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==} dependencies: - '@smithy/protocol-http': 3.0.5 - '@smithy/querystring-builder': 2.0.9 - '@smithy/types': 2.3.3 - '@smithy/util-base64': 2.0.0 - tslib: 2.6.2 - dev: false - - /@smithy/fetch-http-handler@3.2.2: - resolution: {integrity: sha512-3LaWlBZObyGrOOd7e5MlacnAKEwFBmAeiW/TOj2eR9475Vnq30uS2510+tnKbxrGjROfNdOhQqGo5j3sqLT6bA==} - dependencies: - '@smithy/protocol-http': 4.0.4 + '@smithy/protocol-http': 4.1.0 '@smithy/querystring-builder': 3.0.3 '@smithy/types': 3.3.0 '@smithy/util-base64': 3.0.0 - tslib: 2.6.2 - dev: false - - /@smithy/hash-blob-browser@2.0.9: - resolution: {integrity: sha512-JNWOV1ci9vIg4U82klNr07bZXsA6OCumqHugpvZdvvn6cNGwTa4rvpS5FpPcqKeh3Rdg1rr4h8g+X6zyOamnZw==} - dependencies: - '@smithy/chunked-blob-reader': 2.0.0 - '@smithy/chunked-blob-reader-native': 2.0.0 - '@smithy/types': 2.3.3 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@smithy/hash-blob-browser@3.1.2: @@ -7776,17 +7064,7 @@ packages: '@smithy/chunked-blob-reader': 3.0.0 '@smithy/chunked-blob-reader-native': 3.0.0 '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@smithy/hash-node@2.0.9: - resolution: {integrity: sha512-XP3yWd5wyCtiVmsY5Nuq/FUwyCEQ6YG7DsvRh7ThldNukGpCzyFdP8eivZJVjn4Fx7oYrrOnVoYZ0WEgpW1AvQ==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/types': 2.3.3 - '@smithy/util-buffer-from': 2.0.0 - '@smithy/util-utf8': 2.0.0 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@smithy/hash-node@3.0.3: @@ -7796,16 +7074,7 @@ packages: '@smithy/types': 3.3.0 '@smithy/util-buffer-from': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 - dev: false - - /@smithy/hash-stream-node@2.0.9: - resolution: {integrity: sha512-3nrkMpiOrhsJvJS6K4OkP0qvA3U5r8PpseXULeGd1ZD1EbfcZ30Lvl72FGaaHskwWZyTPR4czr1d/RwLRCVHNA==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/types': 2.3.3 - '@smithy/util-utf8': 2.0.0 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@smithy/hash-stream-node@3.1.2: @@ -7814,43 +7083,28 @@ packages: dependencies: '@smithy/types': 3.3.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@smithy/invalid-dependency@2.0.9: - resolution: {integrity: sha512-RuJqhYf8nViK96IIO9JbTtjDUuFItVfuuJhWw2yk7fv67yltQ7fZD6IQ2OsHHluoVmstnQJuCg5raXJR696Ubw==} - dependencies: - '@smithy/types': 2.3.3 - tslib: 2.6.2 - dev: false - - /@smithy/invalid-dependency@3.0.3: - resolution: {integrity: sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==} + /@smithy/invalid-dependency@3.0.3: + resolution: {integrity: sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==} dependencies: '@smithy/types': 3.3.0 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@smithy/is-array-buffer@2.0.0: - resolution: {integrity: sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==} + /@smithy/is-array-buffer@2.2.0: + resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@smithy/is-array-buffer@3.0.0: resolution: {integrity: sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==} engines: {node: '>=16.0.0'} dependencies: - tslib: 2.6.2 - dev: false - - /@smithy/md5-js@2.0.9: - resolution: {integrity: sha512-ALHGoTZDgBXBbjCpQzVy6hpa6Rdr6e2jyEw51d6CQOUpHkUnFH7G96UWhVwUnkP0xozPCvmWy+3+j2QUX+oK9w==} - dependencies: - '@smithy/types': 2.3.3 - '@smithy/util-utf8': 2.0.0 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@smithy/md5-js@3.0.3: @@ -7858,40 +7112,20 @@ packages: dependencies: '@smithy/types': 3.3.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@smithy/middleware-content-length@2.0.11: - resolution: {integrity: sha512-Malj4voNTL4+a5ZL3a6+Ij7JTUMTa2R7c3ZIBzMxN5OUUgAspU7uFi1Q97f4B0afVh2joQBAWH5IQJUG25nl8g==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/protocol-http': 3.0.5 - '@smithy/types': 2.3.3 - tslib: 2.6.2 - dev: false - - /@smithy/middleware-content-length@3.0.4: - resolution: {integrity: sha512-wySGje/KfhsnF8YSh9hP16pZcl3C+X6zRsvSfItQGvCyte92LliilU3SD0nR7kTlxnAJwxY8vE/k4Eoezj847Q==} + /@smithy/middleware-content-length@3.0.5: + resolution: {integrity: sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw==} engines: {node: '>=16.0.0'} dependencies: - '@smithy/protocol-http': 4.0.4 + '@smithy/protocol-http': 4.1.0 '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@smithy/middleware-endpoint@2.0.9: - resolution: {integrity: sha512-72/o8R6AAO4+nyTI6h4z6PYGTSA4dr1M7tZz29U8DEUHuh1YkhC77js0P6RyF9G0wDLuYqxb+Yh0crI5WG2pJg==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/middleware-serde': 2.0.9 - '@smithy/types': 2.3.3 - '@smithy/url-parser': 2.0.9 - '@smithy/util-middleware': 2.0.2 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@smithy/middleware-endpoint@3.0.5: - resolution: {integrity: sha512-V4acqqrh5tDxUEGVTOgf2lYMZqPQsoGntCrjrJZEeBzEzDry2d2vcI1QCXhGltXPPY+BMc6eksZMguA9fIY8vA==} + /@smithy/middleware-endpoint@3.1.0: + resolution: {integrity: sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==} engines: {node: '>=16.0.0'} dependencies: '@smithy/middleware-serde': 3.0.3 @@ -7900,60 +7134,30 @@ packages: '@smithy/types': 3.3.0 '@smithy/url-parser': 3.0.3 '@smithy/util-middleware': 3.0.3 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@smithy/middleware-retry@2.0.12: - resolution: {integrity: sha512-YQ/ufXX4/d9/+Jf1QQ4J+CVeupC7BW52qldBTvRV33PDX9vxndlAwkFwzBcmnUFC3Hjf1//HW6I77EItcjNSCA==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/node-config-provider': 2.0.12 - '@smithy/protocol-http': 3.0.5 - '@smithy/service-error-classification': 2.0.2 - '@smithy/types': 2.3.3 - '@smithy/util-middleware': 2.0.2 - '@smithy/util-retry': 2.0.2 - tslib: 2.6.2 - uuid: 8.3.2 - dev: false - - /@smithy/middleware-retry@3.0.10: - resolution: {integrity: sha512-+6ibpv6jpkTNJS6yErQSEjbxCWf1/jMeUSlpSlUiTYf73LGR9riSRlIrL1+JEW0eEpb6MelQ04BIc38aj8GtxQ==} + /@smithy/middleware-retry@3.0.13: + resolution: {integrity: sha512-zvCLfaRYCaUmjbF2yxShGZdolSHft7NNCTA28HVN9hKcEbOH+g5irr1X9s+in8EpambclGnevZY4A3lYpvDCFw==} engines: {node: '>=16.0.0'} dependencies: '@smithy/node-config-provider': 3.1.4 - '@smithy/protocol-http': 4.0.4 + '@smithy/protocol-http': 4.1.0 '@smithy/service-error-classification': 3.0.3 - '@smithy/smithy-client': 3.1.8 + '@smithy/smithy-client': 3.1.11 '@smithy/types': 3.3.0 '@smithy/util-middleware': 3.0.3 '@smithy/util-retry': 3.0.3 - tslib: 2.6.2 + tslib: 2.6.3 uuid: 9.0.1 dev: false - /@smithy/middleware-serde@2.0.9: - resolution: {integrity: sha512-GVbauxrr6WmtCaesakktg3t5LR/yDbajpC7KkWc8rtCpddMI4ShAVO5Q6DqwX8MDFi4CLaY8H7eTGcxhl3jbLg==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/types': 2.3.3 - tslib: 2.6.2 - dev: false - /@smithy/middleware-serde@3.0.3: resolution: {integrity: sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==} engines: {node: '>=16.0.0'} dependencies: '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@smithy/middleware-stack@2.0.3: - resolution: {integrity: sha512-AlhPmbwpkC4lQBVaVHXczmjFvsAhDHhrakqLt038qFLotnJcvDLhmMzAtu23alBeOSkKxkTQq0LsAt2N0WpAbw==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/types': 2.3.3 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@smithy/middleware-stack@3.0.3: @@ -7961,17 +7165,7 @@ packages: engines: {node: '>=16.0.0'} dependencies: '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@smithy/node-config-provider@2.0.12: - resolution: {integrity: sha512-df9y9ywv+JmS40Y60ZqJ4jfZiTCmyHQffwzIqjBjLJLJl0imf9F6DWBd+jiEWHvlohR+sFhyY+KL/qzKgnAq1A==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/property-provider': 2.0.10 - '@smithy/shared-ini-file-loader': 2.0.11 - '@smithy/types': 2.3.3 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@smithy/node-config-provider@3.1.4: @@ -7981,37 +7175,18 @@ packages: '@smithy/property-provider': 3.1.3 '@smithy/shared-ini-file-loader': 3.1.4 '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@smithy/node-http-handler@2.1.5: - resolution: {integrity: sha512-52uF+BrZaFiBh+NT/bADiVDCQO91T+OwDRsuaAeWZC1mlCXFjAPPQdxeQohtuYOe9m7mPP/xIMNiqbe8jvndHA==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/abort-controller': 2.0.9 - '@smithy/protocol-http': 3.0.5 - '@smithy/querystring-builder': 2.0.9 - '@smithy/types': 2.3.3 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@smithy/node-http-handler@3.1.3: - resolution: {integrity: sha512-UiKZm8KHb/JeOPzHZtRUfyaRDO1KPKPpsd7iplhiwVGOeVdkiVJ5bVe7+NhWREMOKomrDIDdSZyglvMothLg0Q==} + /@smithy/node-http-handler@3.1.4: + resolution: {integrity: sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==} engines: {node: '>=16.0.0'} dependencies: '@smithy/abort-controller': 3.1.1 - '@smithy/protocol-http': 4.0.4 + '@smithy/protocol-http': 4.1.0 '@smithy/querystring-builder': 3.0.3 '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@smithy/property-provider@2.0.10: - resolution: {integrity: sha512-YMBVfh0ZMmJtbsUn+WfSwR32iRljZPdRN0Tn2GAcdJ+ejX8WrBXD7Z0jIkQDrQZr8fEuuv5x8WxMIj+qVbsPQw==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/types': 2.3.3 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@smithy/property-provider@3.1.3: @@ -8019,32 +7194,15 @@ packages: engines: {node: '>=16.0.0'} dependencies: '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@smithy/protocol-http@3.0.5: - resolution: {integrity: sha512-3t3fxj+ip4EPHRC2fQ0JimMxR/qCQ1LSQJjZZVZFgROnFLYWPDgUZqpoi7chr+EzatxJVXF/Rtoi5yLHOWCoZQ==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/types': 2.3.3 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@smithy/protocol-http@4.0.4: - resolution: {integrity: sha512-fAA2O4EFyNRyYdFLVIv5xMMeRb+3fRKc/Rt2flh5k831vLvUmNFXcydeg7V3UeEhGURJI4c1asmGJBjvmF6j8Q==} + /@smithy/protocol-http@4.1.0: + resolution: {integrity: sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==} engines: {node: '>=16.0.0'} dependencies: '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@smithy/querystring-builder@2.0.9: - resolution: {integrity: sha512-Yt6CPF4j3j1cuwod/DRflbuXxBFjJm7gAjy6W1RE21Rz5/kfGFqiZBXWmmXwGtnnhiLThYwoHK4S6/TQtnx0Fg==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/types': 2.3.3 - '@smithy/util-uri-escape': 2.0.0 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@smithy/querystring-builder@3.0.3: @@ -8053,15 +7211,7 @@ packages: dependencies: '@smithy/types': 3.3.0 '@smithy/util-uri-escape': 3.0.0 - tslib: 2.6.2 - dev: false - - /@smithy/querystring-parser@2.0.9: - resolution: {integrity: sha512-U6z4N743s4vrcxPW8p8+reLV0PjMCYEyb1/wtMVvv3VnbJ74gshdI8SR1sBnEh95cF8TxonmX5IxY25tS9qGfg==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/types': 2.3.3 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@smithy/querystring-parser@3.0.3: @@ -8069,14 +7219,7 @@ packages: engines: {node: '>=16.0.0'} dependencies: '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@smithy/service-error-classification@2.0.2: - resolution: {integrity: sha512-GTUd2j63gKy7A+ggvSdn2hc4sejG7LWfE+ZMF17vzWoNyqERWbRP7HTPS0d0Lwg1p6OQCAzvNigSrEIWVFt6iA==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/types': 2.3.3 + tslib: 2.6.3 dev: false /@smithy/service-error-classification@3.0.3: @@ -8086,91 +7229,45 @@ packages: '@smithy/types': 3.3.0 dev: false - /@smithy/shared-ini-file-loader@2.0.11: - resolution: {integrity: sha512-Sf0u5C5px6eykXi6jImDTp+edvG3REtPjXnFWU/J+b7S2wkXwUqFXqBL5DdM4zC1F+M8u57ZT7NRqDwMOw7/Tw==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/types': 2.3.3 - tslib: 2.6.2 - dev: false - /@smithy/shared-ini-file-loader@3.1.4: resolution: {integrity: sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==} engines: {node: '>=16.0.0'} dependencies: '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@smithy/signature-v4@2.0.9: - resolution: {integrity: sha512-RkHP0joSI1j2EI+mU55sOi33/aMMkKdL9ZY+SWrPxsiCe1oyzzuy79Tpn8X7uT+t0ilNmQlwPpkP/jUy940pEA==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/eventstream-codec': 2.0.9 - '@smithy/is-array-buffer': 2.0.0 - '@smithy/types': 2.3.3 - '@smithy/util-hex-encoding': 2.0.0 - '@smithy/util-middleware': 2.0.2 - '@smithy/util-uri-escape': 2.0.0 - '@smithy/util-utf8': 2.0.0 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@smithy/signature-v4@3.1.2: - resolution: {integrity: sha512-3BcPylEsYtD0esM4Hoyml/+s7WP2LFhcM3J2AGdcL2vx9O60TtfpDOL72gjb4lU8NeRPeKAwR77YNyyGvMbuEA==} + /@smithy/signature-v4@4.1.0: + resolution: {integrity: sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag==} engines: {node: '>=16.0.0'} dependencies: '@smithy/is-array-buffer': 3.0.0 + '@smithy/protocol-http': 4.1.0 '@smithy/types': 3.3.0 '@smithy/util-hex-encoding': 3.0.0 '@smithy/util-middleware': 3.0.3 '@smithy/util-uri-escape': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 - dev: false - - /@smithy/smithy-client@2.1.7: - resolution: {integrity: sha512-r6T/oiBQ8vCbGqObH4/h0YqD0jFB1hAS9KFRmuTfaNJueu/L2hjmjqFjv3PV5lkbNHTgUYraSv4cFQ1naxiELQ==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/middleware-stack': 2.0.3 - '@smithy/types': 2.3.3 - '@smithy/util-stream': 2.0.12 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@smithy/smithy-client@3.1.8: - resolution: {integrity: sha512-nUNGCa0NgvtD0eM45732EBp1H9JQITChMBegGtPRhJD00v3hiFF6tibiOihcYwP5mbp9Kui+sOCl86rDT/Ew2w==} + /@smithy/smithy-client@3.1.11: + resolution: {integrity: sha512-l0BpyYkciNyMaS+PnFFz4aO5sBcXvGLoJd7mX9xrMBIm2nIQBVvYgp2ZpPDMzwjKCavsXu06iuCm0F6ZJZc6yQ==} engines: {node: '>=16.0.0'} dependencies: - '@smithy/middleware-endpoint': 3.0.5 + '@smithy/middleware-endpoint': 3.1.0 '@smithy/middleware-stack': 3.0.3 - '@smithy/protocol-http': 4.0.4 + '@smithy/protocol-http': 4.1.0 '@smithy/types': 3.3.0 - '@smithy/util-stream': 3.1.0 - tslib: 2.6.2 - dev: false - - /@smithy/types@2.3.3: - resolution: {integrity: sha512-zTdIPR9PvFVNRdIKMQu4M5oyTaycIbUqLheQqaOi9rTWPkgjGO2wDBxMA1rBHQB81aqAEv+DbSS4jfKyQMnXRA==} - engines: {node: '>=14.0.0'} - dependencies: - tslib: 2.6.2 + '@smithy/util-stream': 3.1.3 + tslib: 2.6.3 dev: false /@smithy/types@3.3.0: resolution: {integrity: sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==} engines: {node: '>=16.0.0'} dependencies: - tslib: 2.6.2 - dev: false - - /@smithy/url-parser@2.0.9: - resolution: {integrity: sha512-NBnJ0NiY8z6E82Xd5VYUFQfKwK/wA/+QkKmpYUYP+cpH3aCzE6g2gvixd9vQKYjsIdRfNPCf+SFAozt8ljozOw==} - dependencies: - '@smithy/querystring-parser': 2.0.9 - '@smithy/types': 2.3.3 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@smithy/url-parser@3.0.3: @@ -8178,15 +7275,7 @@ packages: dependencies: '@smithy/querystring-parser': 3.0.3 '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@smithy/util-base64@2.0.0: - resolution: {integrity: sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/util-buffer-from': 2.0.0 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@smithy/util-base64@3.0.0: @@ -8195,41 +7284,28 @@ packages: dependencies: '@smithy/util-buffer-from': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 - dev: false - - /@smithy/util-body-length-browser@2.0.0: - resolution: {integrity: sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==} - dependencies: - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@smithy/util-body-length-browser@3.0.0: resolution: {integrity: sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==} dependencies: - tslib: 2.6.2 - dev: false - - /@smithy/util-body-length-node@2.1.0: - resolution: {integrity: sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==} - engines: {node: '>=14.0.0'} - dependencies: - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@smithy/util-body-length-node@3.0.0: resolution: {integrity: sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==} engines: {node: '>=16.0.0'} dependencies: - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@smithy/util-buffer-from@2.0.0: - resolution: {integrity: sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==} + /@smithy/util-buffer-from@2.2.0: + resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/is-array-buffer': 2.0.0 - tslib: 2.6.2 + '@smithy/is-array-buffer': 2.2.0 + tslib: 2.6.3 dev: false /@smithy/util-buffer-from@3.0.0: @@ -8237,69 +7313,38 @@ packages: engines: {node: '>=16.0.0'} dependencies: '@smithy/is-array-buffer': 3.0.0 - tslib: 2.6.2 - dev: false - - /@smithy/util-config-provider@2.0.0: - resolution: {integrity: sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==} - engines: {node: '>=14.0.0'} - dependencies: - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@smithy/util-config-provider@3.0.0: resolution: {integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==} engines: {node: '>=16.0.0'} dependencies: - tslib: 2.6.2 - dev: false - - /@smithy/util-defaults-mode-browser@2.0.11: - resolution: {integrity: sha512-0syV1Mz/mCQ7CG/MHKQfH+w86xq59jpD0EOXv5oe0WBXLmq2lWPpVHl2Y6+jQ+/9fYzyZ5NF+NC/WEIuiv690A==} - engines: {node: '>= 10.0.0'} - dependencies: - '@smithy/property-provider': 2.0.10 - '@smithy/smithy-client': 2.1.7 - '@smithy/types': 2.3.3 - bowser: 2.11.0 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@smithy/util-defaults-mode-browser@3.0.10: - resolution: {integrity: sha512-WgaNxh33md2zvlD+1TSceVmM7DIy7qYMtuhOat+HYoTntsg0QTbNvoB/5DRxEwSpN84zKf9O34yqzRRtxJZgFg==} + /@smithy/util-defaults-mode-browser@3.0.13: + resolution: {integrity: sha512-ZIRSUsnnMRStOP6OKtW+gCSiVFkwnfQF2xtf32QKAbHR6ACjhbAybDvry+3L5qQYdh3H6+7yD/AiUE45n8mTTw==} engines: {node: '>= 10.0.0'} dependencies: '@smithy/property-provider': 3.1.3 - '@smithy/smithy-client': 3.1.8 + '@smithy/smithy-client': 3.1.11 '@smithy/types': 3.3.0 bowser: 2.11.0 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@smithy/util-defaults-mode-node@2.0.13: - resolution: {integrity: sha512-6BtCHYdw5Z8r6KpW8tRCc3yURgvcQwfIEeHhR70BeSOfx8T/TXPPjb8A+K45+KASspa3fzrsSxeIwB0sAeMoHA==} - engines: {node: '>= 10.0.0'} - dependencies: - '@smithy/config-resolver': 2.0.10 - '@smithy/credential-provider-imds': 2.0.12 - '@smithy/node-config-provider': 2.0.12 - '@smithy/property-provider': 2.0.10 - '@smithy/smithy-client': 2.1.7 - '@smithy/types': 2.3.3 - tslib: 2.6.2 - dev: false - - /@smithy/util-defaults-mode-node@3.0.10: - resolution: {integrity: sha512-3x/pcNIFyaAEQqXc3qnQsCFLlTz/Mwsfl9ciEPU56/Dk/g1kTFjkzyLbUNJaeOo5HT01VrpJBKrBuN94qbPm9A==} + /@smithy/util-defaults-mode-node@3.0.13: + resolution: {integrity: sha512-voUa8TFJGfD+U12tlNNLCDlXibt9vRdNzRX45Onk/WxZe7TS+hTOZouEZRa7oARGicdgeXvt1A0W45qLGYdy+g==} engines: {node: '>= 10.0.0'} dependencies: '@smithy/config-resolver': 3.0.5 - '@smithy/credential-provider-imds': 3.1.4 + '@smithy/credential-provider-imds': 3.2.0 '@smithy/node-config-provider': 3.1.4 '@smithy/property-provider': 3.1.3 - '@smithy/smithy-client': 3.1.8 + '@smithy/smithy-client': 3.1.11 '@smithy/types': 3.3.0 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@smithy/util-endpoints@2.0.5: @@ -8308,29 +7353,14 @@ packages: dependencies: '@smithy/node-config-provider': 3.1.4 '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@smithy/util-hex-encoding@2.0.0: - resolution: {integrity: sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==} - engines: {node: '>=14.0.0'} - dependencies: - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@smithy/util-hex-encoding@3.0.0: resolution: {integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==} engines: {node: '>=16.0.0'} dependencies: - tslib: 2.6.2 - dev: false - - /@smithy/util-middleware@2.0.2: - resolution: {integrity: sha512-UGPZM+Ja/vke5pc/S8G0LNiHpVirtjppsXO+GK9m9wbzRGzPJTfnZA/gERUUN/AfxEy/8SL7U1kd7u4t2X8K1w==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/types': 2.3.3 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@smithy/util-middleware@3.0.3: @@ -8338,16 +7368,7 @@ packages: engines: {node: '>=16.0.0'} dependencies: '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@smithy/util-retry@2.0.2: - resolution: {integrity: sha512-ovWiayUB38moZcLhSFFfUgB2IMb7R1JfojU20qSahjxAgfOZvDWme3eOYUMtAVnouZ9kYJiFgHLy27qRH4NeeA==} - engines: {node: '>= 14.0.0'} - dependencies: - '@smithy/service-error-classification': 2.0.2 - '@smithy/types': 2.3.3 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@smithy/util-retry@3.0.3: @@ -8356,57 +7377,36 @@ packages: dependencies: '@smithy/service-error-classification': 3.0.3 '@smithy/types': 3.3.0 - tslib: 2.6.2 - dev: false - - /@smithy/util-stream@2.0.12: - resolution: {integrity: sha512-FOCpRLaj6gvSyUC5mJAACT+sPMPmp9sD1o+hVbUH/QxwZfulypA3ZIFdAg/59/IY0d/1Q4CTztsiHEB5LgjN4g==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/fetch-http-handler': 2.1.5 - '@smithy/node-http-handler': 2.1.5 - '@smithy/types': 2.3.3 - '@smithy/util-base64': 2.0.0 - '@smithy/util-buffer-from': 2.0.0 - '@smithy/util-hex-encoding': 2.0.0 - '@smithy/util-utf8': 2.0.0 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@smithy/util-stream@3.1.0: - resolution: {integrity: sha512-QEMvyv58QIptWA8cpQPbHagJOAlrbCt3ueB9EShwdFfVMYAviXdVtksszQQq+o+dv5dalUMWUbUHUDSJgkF9xg==} + /@smithy/util-stream@3.1.3: + resolution: {integrity: sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==} engines: {node: '>=16.0.0'} dependencies: - '@smithy/fetch-http-handler': 3.2.2 - '@smithy/node-http-handler': 3.1.3 + '@smithy/fetch-http-handler': 3.2.4 + '@smithy/node-http-handler': 3.1.4 '@smithy/types': 3.3.0 '@smithy/util-base64': 3.0.0 '@smithy/util-buffer-from': 3.0.0 '@smithy/util-hex-encoding': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 - dev: false - - /@smithy/util-uri-escape@2.0.0: - resolution: {integrity: sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==} - engines: {node: '>=14.0.0'} - dependencies: - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@smithy/util-uri-escape@3.0.0: resolution: {integrity: sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==} engines: {node: '>=16.0.0'} dependencies: - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@smithy/util-utf8@2.0.0: - resolution: {integrity: sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==} + /@smithy/util-utf8@2.3.0: + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/util-buffer-from': 2.0.0 - tslib: 2.6.2 + '@smithy/util-buffer-from': 2.2.0 + tslib: 2.6.3 dev: false /@smithy/util-utf8@3.0.0: @@ -8414,16 +7414,7 @@ packages: engines: {node: '>=16.0.0'} dependencies: '@smithy/util-buffer-from': 3.0.0 - tslib: 2.6.2 - dev: false - - /@smithy/util-waiter@2.0.9: - resolution: {integrity: sha512-Hy9Cs0FtIacC1aVFk98bm/7CYqim9fnHAPRnV/SB2mj02ExYs/9Dn5SrNQmtTBTLCn65KqYnNVBNS8GuGpZOOw==} - engines: {node: '>=14.0.0'} - dependencies: - '@smithy/abort-controller': 2.0.9 - '@smithy/types': 2.3.3 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /@smithy/util-waiter@3.1.2: @@ -8432,5534 +7423,4497 @@ packages: dependencies: '@smithy/abort-controller': 3.1.1 '@smithy/types': 3.3.0 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /@stdlib/array-float32@0.0.6: - resolution: {integrity: sha512-QgKT5UaE92Rv7cxfn7wBKZAlwFFHPla8eXsMFsTGt5BiL4yUy36lwinPUh4hzybZ11rw1vifS3VAPuk6JP413Q==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@surma/rollup-plugin-off-main-thread@2.2.3: + resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} dependencies: - '@stdlib/assert-has-float32array-support': 0.0.8 - transitivePeerDependencies: - - supports-color - dev: true + ejs: 3.1.10 + json5: 2.2.3 + magic-string: 0.25.9 + string.prototype.matchall: 4.0.11 + dev: false - /@stdlib/array-float64@0.0.6: - resolution: {integrity: sha512-oE8y4a84LyBF1goX5//sU1mOjet8gLI0/6wucZcjg+j/yMmNV1xFu84Az9GOGmFSE6Ze6lirGOhfBeEWNNNaJg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - dependencies: - '@stdlib/assert-has-float64array-support': 0.0.8 - dev: true + /@svgr/babel-plugin-add-jsx-attribute@5.4.0: + resolution: {integrity: sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==} + engines: {node: '>=10'} - /@stdlib/array-uint16@0.0.6: - resolution: {integrity: sha512-/A8Tr0CqJ4XScIDRYQawosko8ha1Uy+50wsTgJhjUtXDpPRp7aUjmxvYkbe7Rm+ImYYbDQVix/uCiPAFQ8ed4Q==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - dependencies: - '@stdlib/assert-has-uint16array-support': 0.0.8 - dev: true + /@svgr/babel-plugin-remove-jsx-attribute@5.4.0: + resolution: {integrity: sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==} + engines: {node: '>=10'} - /@stdlib/array-uint32@0.0.6: - resolution: {integrity: sha512-2hFPK1Fg7obYPZWlGDjW9keiIB6lXaM9dKmJubg/ergLQCsJQJZpYsG6mMAfTJi4NT1UF4jTmgvyKD+yf0D9cA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - dependencies: - '@stdlib/assert-has-uint32array-support': 0.0.8 - dev: true + /@svgr/babel-plugin-remove-jsx-empty-expression@5.0.1: + resolution: {integrity: sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==} + engines: {node: '>=10'} - /@stdlib/array-uint8@0.0.7: - resolution: {integrity: sha512-qYJQQfGKIcky6TzHFIGczZYTuVlut7oO+V8qUBs7BJC9TwikVnnOmb3hY3jToY4xaoi5p9OvgdJKPInhyIhzFg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - dependencies: - '@stdlib/assert-has-uint8array-support': 0.0.8 - dev: true + /@svgr/babel-plugin-replace-jsx-attribute-value@5.0.1: + resolution: {integrity: sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==} + engines: {node: '>=10'} - /@stdlib/assert-has-float32array-support@0.0.8: - resolution: {integrity: sha512-Yrg7K6rBqwCzDWZ5bN0VWLS5dNUWcoSfUeU49vTERdUmZID06J069CDc07UUl8vfQWhFgBWGocH3rrpKm1hi9w==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true - dependencies: - '@stdlib/assert-is-float32array': 0.0.8 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/constants-float64-pinf': 0.0.8 - '@stdlib/fs-read-file': 0.0.8 - transitivePeerDependencies: - - supports-color - dev: true + /@svgr/babel-plugin-svg-dynamic-title@5.4.0: + resolution: {integrity: sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==} + engines: {node: '>=10'} - /@stdlib/assert-has-float64array-support@0.0.8: - resolution: {integrity: sha512-UVQcoeWqgMw9b8PnAmm/sgzFnuWkZcNhJoi7xyMjbiDV/SP1qLCrvi06mq86cqS3QOCma1fEayJdwgteoXyyuw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true - dependencies: - '@stdlib/assert-is-float64array': 0.0.8 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-read-file': 0.0.8 - dev: true + /@svgr/babel-plugin-svg-em-dimensions@5.4.0: + resolution: {integrity: sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==} + engines: {node: '>=10'} - /@stdlib/assert-has-node-buffer-support@0.0.8: - resolution: {integrity: sha512-fgI+hW4Yg4ciiv4xVKH+1rzdV7e5+6UKgMnFbc1XDXHcxLub3vOr8+H6eDECdAIfgYNA7X0Dxa/DgvX9dwDTAQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true - dependencies: - '@stdlib/assert-is-buffer': 0.0.8 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-read-file': 0.0.8 - dev: true + /@svgr/babel-plugin-transform-react-native-svg@5.4.0: + resolution: {integrity: sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==} + engines: {node: '>=10'} - /@stdlib/assert-has-own-property@0.0.7: - resolution: {integrity: sha512-3YHwSWiUqGlTLSwxAWxrqaD1PkgcJniGyotJeIt5X0tSNmSW0/c9RWroCImTUUB3zBkyBJ79MyU9Nf4Qgm59fQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - dev: true + /@svgr/babel-plugin-transform-svg-component@5.5.0: + resolution: {integrity: sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==} + engines: {node: '>=10'} - /@stdlib/assert-has-symbol-support@0.0.8: - resolution: {integrity: sha512-PoQ9rk8DgDCuBEkOIzGGQmSnjtcdagnUIviaP5YskB45/TJHXseh4NASWME8FV77WFW9v/Wt1MzKFKMzpDFu4Q==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true + /@svgr/babel-preset@5.5.0: + resolution: {integrity: sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==} + engines: {node: '>=10'} dependencies: - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-read-file': 0.0.8 - dev: true + '@svgr/babel-plugin-add-jsx-attribute': 5.4.0 + '@svgr/babel-plugin-remove-jsx-attribute': 5.4.0 + '@svgr/babel-plugin-remove-jsx-empty-expression': 5.0.1 + '@svgr/babel-plugin-replace-jsx-attribute-value': 5.0.1 + '@svgr/babel-plugin-svg-dynamic-title': 5.4.0 + '@svgr/babel-plugin-svg-em-dimensions': 5.4.0 + '@svgr/babel-plugin-transform-react-native-svg': 5.4.0 + '@svgr/babel-plugin-transform-svg-component': 5.5.0 - /@stdlib/assert-has-tostringtag-support@0.0.9: - resolution: {integrity: sha512-UTsqdkrnQ7eufuH5BeyWOJL3ska3u5nvDWKqw3onNNZ2mvdgkfoFD7wHutVGzAA2rkTsSJAMBHVwWLsm5SbKgw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true + /@svgr/core@5.5.0: + resolution: {integrity: sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==} + engines: {node: '>=10'} dependencies: - '@stdlib/assert-has-symbol-support': 0.0.8 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-read-file': 0.0.8 - dev: true + '@svgr/plugin-jsx': 5.5.0 + camelcase: 6.3.0 + cosmiconfig: 7.1.0 + transitivePeerDependencies: + - supports-color - /@stdlib/assert-has-uint16array-support@0.0.8: - resolution: {integrity: sha512-vqFDn30YrtzD+BWnVqFhB130g3cUl2w5AdOxhIkRkXCDYAM5v7YwdNMJEON+D4jI8YB4D5pEYjqKweYaCq4nyg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true + /@svgr/hast-util-to-babel-ast@5.5.0: + resolution: {integrity: sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==} + engines: {node: '>=10'} dependencies: - '@stdlib/assert-is-uint16array': 0.0.8 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/constants-uint16-max': 0.0.7 - '@stdlib/fs-read-file': 0.0.8 - dev: true + '@babel/types': 7.25.2 - /@stdlib/assert-has-uint32array-support@0.0.8: - resolution: {integrity: sha512-tJtKuiFKwFSQQUfRXEReOVGXtfdo6+xlshSfwwNWXL1WPP2LrceoiUoQk7zMCMT6VdbXgGH92LDjVcPmSbH4Xw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true + /@svgr/plugin-jsx@5.5.0: + resolution: {integrity: sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==} + engines: {node: '>=10'} dependencies: - '@stdlib/assert-is-uint32array': 0.0.8 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/constants-uint32-max': 0.0.7 - '@stdlib/fs-read-file': 0.0.8 - dev: true + '@babel/core': 7.25.2 + '@svgr/babel-preset': 5.5.0 + '@svgr/hast-util-to-babel-ast': 5.5.0 + svg-parser: 2.0.4 + transitivePeerDependencies: + - supports-color - /@stdlib/assert-has-uint8array-support@0.0.8: - resolution: {integrity: sha512-ie4vGTbAS/5Py+LLjoSQi0nwtYBp+WKk20cMYCzilT0rCsBI/oez0RqHrkYYpmt4WaJL4eJqC+/vfQ5NsI7F5w==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true + /@svgr/plugin-svgo@5.5.0: + resolution: {integrity: sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==} + engines: {node: '>=10'} dependencies: - '@stdlib/assert-is-uint8array': 0.0.8 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/constants-uint8-max': 0.0.7 - '@stdlib/fs-read-file': 0.0.8 - dev: true + cosmiconfig: 7.1.0 + deepmerge: 4.3.1 + svgo: 1.3.2 - /@stdlib/assert-is-array@0.0.7: - resolution: {integrity: sha512-/o6KclsGkNcZ5hiROarsD9XUs6xQMb4lTwF6O71UHbKWTtomEF/jD0rxLvlvj0BiCxfKrReddEYd2CnhUyskMA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@svgr/rollup@5.5.0: + resolution: {integrity: sha512-EiZmH2VTr+Xzyb6Ga8XtGa9MEbiU3WQnB5vHmqhwAUqibU3uwuwr7MN+QwIh/gtBk1ucMim8BCfcRTlLVREM8A==} + engines: {node: '>=10'} dependencies: - '@stdlib/utils-native-class': 0.0.8 + '@babel/core': 7.25.2 + '@babel/plugin-transform-react-constant-elements': 7.25.1(@babel/core@7.25.2) + '@babel/preset-env': 7.25.2(@babel/core@7.25.2) + '@babel/preset-react': 7.24.7(@babel/core@7.25.2) + '@svgr/core': 5.5.0 + '@svgr/plugin-jsx': 5.5.0 + '@svgr/plugin-svgo': 5.5.0 + rollup-pluginutils: 2.8.2 + transitivePeerDependencies: + - supports-color dev: true - /@stdlib/assert-is-big-endian@0.0.7: - resolution: {integrity: sha512-BvutsX84F76YxaSIeS5ZQTl536lz+f+P7ew68T1jlFqxBhr4v7JVYFmuf24U040YuK1jwZ2sAq+bPh6T09apwQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true + /@svgr/webpack@5.5.0: + resolution: {integrity: sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==} + engines: {node: '>=10'} dependencies: - '@stdlib/array-uint16': 0.0.6 - '@stdlib/array-uint8': 0.0.7 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-read-file': 0.0.8 - dev: true + '@babel/core': 7.25.2 + '@babel/plugin-transform-react-constant-elements': 7.25.1(@babel/core@7.25.2) + '@babel/preset-env': 7.25.2(@babel/core@7.25.2) + '@babel/preset-react': 7.24.7(@babel/core@7.25.2) + '@svgr/core': 5.5.0 + '@svgr/plugin-jsx': 5.5.0 + '@svgr/plugin-svgo': 5.5.0 + loader-utils: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: false - /@stdlib/assert-is-boolean@0.0.8: - resolution: {integrity: sha512-PRCpslMXSYqFMz1Yh4dG2K/WzqxTCtlKbgJQD2cIkAtXux4JbYiXCtepuoV7l4Wv1rm0a1eU8EqNPgnOmWajGw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - dependencies: - '@stdlib/assert-has-tostringtag-support': 0.0.9 - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - '@stdlib/utils-native-class': 0.0.8 - dev: true + /@swc/counter@0.1.3: + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + dev: false - /@stdlib/assert-is-buffer@0.0.8: - resolution: {integrity: sha512-SYmGwOXkzZVidqUyY1IIx6V6QnSL36v3Lcwj8Rvne/fuW0bU2OomsEBzYCFMvcNgtY71vOvgZ9VfH3OppvV6eA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@swc/helpers@0.5.5: + resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} dependencies: - '@stdlib/assert-is-object-like': 0.0.8 - dev: true + '@swc/counter': 0.1.3 + tslib: 2.6.3 + dev: false - /@stdlib/assert-is-float32array@0.0.8: - resolution: {integrity: sha512-Phk0Ze7Vj2/WLv5Wy8Oo7poZIDMSTiTrEnc1t4lBn3Svz2vfBXlvCufi/i5d93vc4IgpkdrOEwfry6nldABjNQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@tailwindcss/typography@0.5.13(tailwindcss@3.4.7): + resolution: {integrity: sha512-ADGcJ8dX21dVVHIwTRgzrcunY6YY9uSlAHHGVKvkA+vLc5qLwEszvKts40lx7z0qc4clpjclwLeK5rVCV2P/uw==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' dependencies: - '@stdlib/utils-native-class': 0.0.8 + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 3.4.7(ts-node@10.9.2) dev: true - /@stdlib/assert-is-float64array@0.0.8: - resolution: {integrity: sha512-UC0Av36EEYIgqBbCIz1lj9g7qXxL5MqU1UrWun+n91lmxgdJ+Z77fHy75efJbJlXBf6HXhcYXECIsc0u3SzyDQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - dependencies: - '@stdlib/utils-native-class': 0.0.8 - dev: true + /@tanstack/query-core@4.36.1: + resolution: {integrity: sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA==} + dev: false - /@stdlib/assert-is-function@0.0.8: - resolution: {integrity: sha512-M55Dt2njp5tnY8oePdbkKBRIypny+LpCMFZhEjJIxjLE4rA6zSlHs1yRMqD4PmW+Wl9WTeEM1GYO4AQHl1HAjA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@tanstack/react-query@4.36.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-y7ySVHFyyQblPl3J3eQBWpXZkliroki3ARnBKsdJchlgt7yJLRDUcf4B8soufgiYt3pEQIkBWBx1N9/ZPIeUWw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true dependencies: - '@stdlib/utils-type-of': 0.0.8 - dev: true + '@tanstack/query-core': 4.36.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + use-sync-external-store: 1.2.2(react@18.3.1) + dev: false - /@stdlib/assert-is-little-endian@0.0.7: - resolution: {integrity: sha512-SPObC73xXfDXY0dOewXR0LDGN3p18HGzm+4K8azTj6wug0vpRV12eB3hbT28ybzRCa6TAKUjwM/xY7Am5QzIlA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true + /@testing-library/dom@10.4.0: + resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} + engines: {node: '>=18'} dependencies: - '@stdlib/array-uint16': 0.0.6 - '@stdlib/array-uint8': 0.0.7 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-read-file': 0.0.8 + '@babel/code-frame': 7.24.7 + '@babel/runtime': 7.25.0 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 dev: true - /@stdlib/assert-is-number@0.0.7: - resolution: {integrity: sha512-mNV4boY1cUOmoWWfA2CkdEJfXA6YvhcTvwKC0Fzq+HoFFOuTK/scpTd9HanUyN6AGBlWA8IW+cQ1ZwOT3XMqag==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@testing-library/dom@8.20.1: + resolution: {integrity: sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==} + engines: {node: '>=12'} dependencies: - '@stdlib/assert-has-tostringtag-support': 0.0.9 - '@stdlib/number-ctor': 0.0.7 - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - '@stdlib/utils-native-class': 0.0.8 + '@babel/code-frame': 7.24.7 + '@babel/runtime': 7.25.0 + '@types/aria-query': 5.0.4 + aria-query: 5.1.3 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 dev: true - /@stdlib/assert-is-object-like@0.0.8: - resolution: {integrity: sha512-pe9selDPYAu/lYTFV5Rj4BStepgbzQCr36b/eC8EGSJh6gMgRXgHVv0R+EbdJ69KNkHvKKRjnWj0A/EmCwW+OA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@testing-library/jest-dom@6.4.8: + resolution: {integrity: sha512-JD0G+Zc38f5MBHA4NgxQMR5XtO5Jx9g86jqturNTt2WUfRmLDIY7iKkWHDCCTiDuFMre6nxAD5wHw9W5kI4rGw==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} dependencies: - '@stdlib/assert-tools-array-function': 0.0.7 - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 + '@adobe/css-tools': 4.4.0 + '@babel/runtime': 7.25.0 + aria-query: 5.3.0 + chalk: 3.0.0 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + lodash: 4.17.21 + redent: 3.0.0 dev: true - /@stdlib/assert-is-object@0.0.8: - resolution: {integrity: sha512-ooPfXDp9c7w+GSqD2NBaZ/Du1JRJlctv+Abj2vRJDcDPyrnRTb1jmw+AuPgcW7Ca7op39JTbArI+RVHm/FPK+Q==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@testing-library/react@13.4.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==} + engines: {node: '>=12'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 dependencies: - '@stdlib/assert-is-array': 0.0.7 + '@babel/runtime': 7.25.0 + '@testing-library/dom': 8.20.1 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) dev: true - /@stdlib/assert-is-plain-object@0.0.7: - resolution: {integrity: sha512-t/CEq2a083ajAgXgSa5tsH8l3kSoEqKRu1qUwniVLFYL4RGv3615CrpJUDQKVtEX5S/OKww5q0Byu3JidJ4C5w==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@testing-library/user-event@14.5.2(@testing-library/dom@10.4.0): + resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' dependencies: - '@stdlib/assert-has-own-property': 0.0.7 - '@stdlib/assert-is-function': 0.0.8 - '@stdlib/assert-is-object': 0.0.8 - '@stdlib/utils-get-prototype-of': 0.0.7 - '@stdlib/utils-native-class': 0.0.8 + '@testing-library/dom': 10.4.0 dev: true - /@stdlib/assert-is-regexp-string@0.0.9: - resolution: {integrity: sha512-FYRJJtH7XwXEf//X6UByUC0Eqd0ZYK5AC8or5g5m5efQrgr2lOaONHyDQ3Scj1A2D6QLIJKZc9XBM4uq5nOPXA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true - dependencies: - '@stdlib/assert-is-string': 0.0.8 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-read-file': 0.0.8 - '@stdlib/process-read-stdin': 0.0.7 - '@stdlib/regexp-eol': 0.0.7 - '@stdlib/regexp-regexp': 0.0.8 - '@stdlib/streams-node-stdin': 0.0.7 - dev: true + /@tootallnate/once@1.1.2: + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} - /@stdlib/assert-is-regexp@0.0.7: - resolution: {integrity: sha512-ty5qvLiqkDq6AibHlNJe0ZxDJ9Mg896qolmcHb69mzp64vrsORnPPOTzVapAq0bEUZbXoypeijypLPs9sCGBSQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - dependencies: - '@stdlib/assert-has-tostringtag-support': 0.0.9 - '@stdlib/utils-native-class': 0.0.8 - dev: true + /@tootallnate/once@2.0.0: + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} - /@stdlib/assert-is-string@0.0.8: - resolution: {integrity: sha512-Uk+bR4cglGBbY0q7O7HimEJiW/DWnO1tSzr4iAGMxYgf+VM2PMYgI5e0TLy9jOSOzWon3YS39lc63eR3a9KqeQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - dependencies: - '@stdlib/assert-has-tostringtag-support': 0.0.9 - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - '@stdlib/utils-native-class': 0.0.8 - dev: true + /@trysound/sax@0.2.0: + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + dev: false - /@stdlib/assert-is-uint16array@0.0.8: - resolution: {integrity: sha512-M+qw7au+qglRXcXHjvoUZVLlGt1mPjuKudrVRto6KL4+tDsP2j+A89NDP3Fz8/XIUD+5jhj+65EOKHSMvDYnng==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@ts-morph/common@0.11.1: + resolution: {integrity: sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g==} dependencies: - '@stdlib/utils-native-class': 0.0.8 + fast-glob: 3.3.2 + minimatch: 3.1.2 + mkdirp: 1.0.4 + path-browserify: 1.0.1 dev: true - /@stdlib/assert-is-uint32array@0.0.8: - resolution: {integrity: sha512-cnZi2DicYcplMnkJ3dBxBVKsRNFjzoGpmG9A6jXq4KH5rFl52SezGAXSVY9o5ZV7bQGaF5JLyCLp6n9Y74hFGg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@ts-morph/common@0.12.3: + resolution: {integrity: sha512-4tUmeLyXJnJWvTFOKtcNJ1yh0a3SsTLi2MUoyj8iUNznFRN1ZquaNe7Oukqrnki2FzZkm0J9adCNLDZxUzvj+w==} dependencies: - '@stdlib/utils-native-class': 0.0.8 + fast-glob: 3.3.2 + minimatch: 3.1.2 + mkdirp: 1.0.4 + path-browserify: 1.0.1 dev: true - /@stdlib/assert-is-uint8array@0.0.8: - resolution: {integrity: sha512-8cqpDQtjnJAuVtRkNAktn45ixq0JHaGJxVsSiK79k7GRggvMI6QsbzO6OvcLnZ/LimD42FmgbLd13Yc2esDmZw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - dependencies: - '@stdlib/utils-native-class': 0.0.8 - dev: true + /@tsconfig/node10@1.0.11: + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} - /@stdlib/assert-tools-array-function@0.0.7: - resolution: {integrity: sha512-3lqkaCIBMSJ/IBHHk4NcCnk2NYU52tmwTYbbqhAmv7vim8rZPNmGfj3oWkzrCsyCsyTF7ooD+In2x+qTmUbCtQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - dependencies: - '@stdlib/assert-is-array': 0.0.7 - dev: true + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - /@stdlib/buffer-ctor@0.0.7: - resolution: {integrity: sha512-4IyTSGijKUQ8+DYRaKnepf9spvKLZ+nrmZ+JrRcB3FrdTX/l9JDpggcUcC/Fe+A4KIZOnClfxLn6zfIlkCZHNA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - dependencies: - '@stdlib/assert-has-node-buffer-support': 0.0.8 - dev: true + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - /@stdlib/buffer-from-string@0.0.8: - resolution: {integrity: sha512-Dws5ZbK2M9l4Bkn/ODHFm3lNZ8tWko+NYXqGS/UH/RIQv3PGp+1tXFUSvjwjDneM6ppjQVExzVedUH1ftABs9A==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - dependencies: - '@stdlib/assert-is-function': 0.0.8 - '@stdlib/assert-is-string': 0.0.8 - '@stdlib/buffer-ctor': 0.0.7 - '@stdlib/string-format': 0.0.3 - dev: true + /@tsconfig/node16@1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + /@tufjs/canonical-json@1.0.0: + resolution: {integrity: sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - /@stdlib/cli-ctor@0.0.3: - resolution: {integrity: sha512-0zCuZnzFyxj66GoF8AyIOhTX5/mgGczFvr6T9h4mXwegMZp8jBC/ZkOGMwmp+ODLBTvlcnnDNpNFkDDyR6/c2g==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@tufjs/models@1.0.4: + resolution: {integrity: sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - '@stdlib/utils-noop': 0.0.14 - minimist: 1.2.8 - dev: true + '@tufjs/canonical-json': 1.0.0 + minimatch: 9.0.5 - /@stdlib/complex-float32@0.0.7: - resolution: {integrity: sha512-POCtQcBZnPm4IrFmTujSaprR1fcOFr/MRw2Mt7INF4oed6b1nzeG647K+2tk1m4mMrMPiuXCdvwJod4kJ0SXxQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/archiver@5.3.4: + resolution: {integrity: sha512-Lj7fLBIMwYFgViVVZHEdExZC3lVYsl+QL0VmdNdIzGZH544jHveYWij6qdnBgJQDnR7pMKliN9z2cPZFEbhyPw==} dependencies: - '@stdlib/assert-is-number': 0.0.7 - '@stdlib/number-float64-base-to-float32': 0.0.7 - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - '@stdlib/utils-define-property': 0.0.9 - '@stdlib/utils-library-manifest': 0.0.8 - transitivePeerDependencies: - - supports-color + '@types/readdir-glob': 1.1.5 dev: true - /@stdlib/complex-float64@0.0.8: - resolution: {integrity: sha512-lUJwsXtGEziOWAqCcnKnZT4fcVoRsl6t6ECaCJX45Z7lAc70yJLiwUieLWS5UXmyoADHuZyUXkxtI4oClfpnaw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - dependencies: - '@stdlib/assert-is-number': 0.0.7 - '@stdlib/complex-float32': 0.0.7 - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - '@stdlib/utils-define-property': 0.0.9 - '@stdlib/utils-library-manifest': 0.0.8 - transitivePeerDependencies: - - supports-color + /@types/aria-query@5.0.4: + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} dev: true - /@stdlib/complex-reim@0.0.6: - resolution: {integrity: sha512-28WXfPSIFMtHb0YgdatkGS4yxX5sPYea5MiNgqPv3E78+tFcg8JJG52NQ/MviWP2wsN9aBQAoCPeu8kXxSPdzA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} dependencies: - '@stdlib/array-float64': 0.0.6 - '@stdlib/complex-float64': 0.0.8 - '@stdlib/types': 0.0.14 - '@stdlib/utils-library-manifest': 0.0.8 - transitivePeerDependencies: - - supports-color - dev: true + '@babel/parser': 7.25.0 + '@babel/types': 7.25.2 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 - /@stdlib/complex-reimf@0.0.1: - resolution: {integrity: sha512-P9zu05ZW2i68Oppp3oHelP7Tk0D7tGBL0hGl1skJppr2vY9LltuNbeYI3C96tQe/7Enw/5GyAWgxoQI4cWccQA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/babel__generator@7.6.8: + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} dependencies: - '@stdlib/array-float32': 0.0.6 - '@stdlib/complex-float32': 0.0.7 - '@stdlib/types': 0.0.14 - '@stdlib/utils-library-manifest': 0.0.8 - transitivePeerDependencies: - - supports-color - dev: true + '@babel/types': 7.25.2 - /@stdlib/constants-float64-exponent-bias@0.0.8: - resolution: {integrity: sha512-IzBJQw9hYgWCki7VoC/zJxEA76Nmf8hmY+VkOWnJ8IyfgTXClgY8tfDGS1cc4l/hCOEllxGp9FRvVdn24A5tKQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: - '@stdlib/utils-library-manifest': 0.0.8 - transitivePeerDependencies: - - supports-color - dev: true + '@babel/parser': 7.25.0 + '@babel/types': 7.25.2 - /@stdlib/constants-float64-high-word-abs-mask@0.0.1: - resolution: {integrity: sha512-1vy8SUyMHFBwqUUVaZFA7r4/E3cMMRKSwsaa/EZ15w7Kmc01W/ZmaaTLevRcIdACcNgK+8i8813c8H7LScXNcQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/babel__traverse@7.20.6: + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} dependencies: - '@stdlib/utils-library-manifest': 0.0.8 - transitivePeerDependencies: - - supports-color - dev: true + '@babel/types': 7.25.2 - /@stdlib/constants-float64-high-word-exponent-mask@0.0.8: - resolution: {integrity: sha512-z28/EQERc0VG7N36bqdvtrRWjFc8600PKkwvl/nqx6TpKAzMXNw55BS1xT4C28Sa9Z7uBWeUj3UbIFedbkoyMw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/body-parser@1.19.5: + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} dependencies: - '@stdlib/utils-library-manifest': 0.0.8 - transitivePeerDependencies: - - supports-color - dev: true + '@types/connect': 3.4.38 + '@types/node': 18.19.42 - /@stdlib/constants-float64-high-word-sign-mask@0.0.1: - resolution: {integrity: sha512-hmTr5caK1lh1m0eyaQqt2Vt3y+eEdAx57ndbADEbXhxC9qSGd0b4bLSzt/Xp4MYBYdQkHAE/BlkgUiRThswhCg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/bonjour@3.5.13: + resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} dependencies: - '@stdlib/utils-library-manifest': 0.0.8 - transitivePeerDependencies: - - supports-color - dev: true + '@types/node': 18.19.42 + dev: false + + /@types/caseless@0.12.5: + resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} + dev: false - /@stdlib/constants-float64-max-base2-exponent-subnormal@0.0.8: - resolution: {integrity: sha512-YGBZykSiXFebznnJfWFDwhho2Q9xhUWOL+X0lZJ4ItfTTo40W6VHAyNYz98tT/gJECFype0seNzzo1nUxCE7jQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/chalk@2.2.0: + resolution: {integrity: sha512-1zzPV9FDe1I/WHhRkf9SNgqtRJWZqrBWgu7JGveuHmmyR9CnAPCie2N/x+iHrgnpYBIcCJWHBoMRv2TRWktsvw==} + deprecated: This is a stub types definition for chalk (https://github.com/chalk/chalk). chalk provides its own type definitions, so you don't need @types/chalk installed! dependencies: - '@stdlib/utils-library-manifest': 0.0.8 - transitivePeerDependencies: - - supports-color + chalk: 5.3.0 dev: true - /@stdlib/constants-float64-max-base2-exponent@0.0.8: - resolution: {integrity: sha512-xBAOtso1eiy27GnTut2difuSdpsGxI8dJhXupw0UukGgvy/3CSsyNm+a1Suz/dhqK4tPOTe5QboIdNMw5IgXKQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/cli-progress@3.11.6: + resolution: {integrity: sha512-cE3+jb9WRlu+uOSAugewNpITJDt1VF8dHOopPO4IABFc3SXYL5WE/+PTz/FCdZRRfIujiWW3n3aMbv1eIGVRWA==} dependencies: - '@stdlib/utils-library-manifest': 0.0.8 - transitivePeerDependencies: - - supports-color + '@types/node': 18.19.42 dev: true - /@stdlib/constants-float64-min-base2-exponent-subnormal@0.0.8: - resolution: {integrity: sha512-bt81nBus/91aEqGRQBenEFCyWNsf8uaxn4LN1NjgkvY92S1yVxXFlC65fJHsj9FTqvyZ+uj690/gdMKUDV3NjQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/commander@2.12.2: + resolution: {integrity: sha512-0QEFiR8ljcHp9bAbWxecjVRuAMr16ivPiGOw6KFQBVrVd0RQIcM3xKdRisH2EDWgVWujiYtHwhSkSUoAAGzH7Q==} + deprecated: This is a stub types definition for commander (https://github.com/tj/commander.js). commander provides its own type definitions, so you don't need @types/commander installed! dependencies: - '@stdlib/utils-library-manifest': 0.0.8 - transitivePeerDependencies: - - supports-color + commander: 11.1.0 dev: true - /@stdlib/constants-float64-ninf@0.0.8: - resolution: {integrity: sha512-bn/uuzCne35OSLsQZJlNrkvU1/40spGTm22g1+ZI1LL19J8XJi/o4iupIHRXuLSTLFDBqMoJlUNphZlWQ4l8zw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/connect-history-api-fallback@1.5.4: + resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} dependencies: - '@stdlib/number-ctor': 0.0.7 - '@stdlib/utils-library-manifest': 0.0.8 - transitivePeerDependencies: - - supports-color - dev: true + '@types/express-serve-static-core': 4.19.5 + '@types/node': 18.19.42 + dev: false - /@stdlib/constants-float64-pinf@0.0.8: - resolution: {integrity: sha512-I3R4rm2cemoMuiDph07eo5oWZ4ucUtpuK73qBJiJPDQKz8fSjSe4wJBAigq2AmWYdd7yJHsl5NJd8AgC6mP5Qw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/connect@3.4.38: + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} dependencies: - '@stdlib/utils-library-manifest': 0.0.8 - transitivePeerDependencies: - - supports-color - dev: true + '@types/node': 18.19.42 + + /@types/cookie@0.5.4: + resolution: {integrity: sha512-7z/eR6O859gyWIAjuvBWFzNURmf2oPBmJlfVWkwehU5nzIyjwBsTh7WMmEEV4JFnHuQ3ex4oyTvfKzcyJVDBNA==} + dev: false - /@stdlib/constants-float64-smallest-normal@0.0.8: - resolution: {integrity: sha512-Qwxpn5NA3RXf+mQcffCWRcsHSPTUQkalsz0+JDpblDszuz2XROcXkOdDr5LKgTAUPIXsjOgZzTsuRONENhsSEg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/cross-spawn@6.0.2: + resolution: {integrity: sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==} dependencies: - '@stdlib/utils-library-manifest': 0.0.8 - transitivePeerDependencies: - - supports-color + '@types/node': 18.19.42 dev: true - /@stdlib/constants-uint16-max@0.0.7: - resolution: {integrity: sha512-7TPoku7SlskA67mAm7mykIAjeEnkQJemw1cnKZur0mT5W4ryvDR6iFfL9xBiByVnWYq/+ei7DHbOv6/2b2jizw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/crypto-js@4.2.2: + resolution: {integrity: sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==} dev: true - /@stdlib/constants-uint32-max@0.0.7: - resolution: {integrity: sha512-8+NK0ewqc1vnEZNqzwFJgFSy3S543Eft7i8WyW/ygkofiqEiLAsujvYMHzPAB8/3D+PYvjTSe37StSwRwvQ6uw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - dev: true + /@types/d3-array@3.2.1: + resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} + dev: false - /@stdlib/constants-uint8-max@0.0.7: - resolution: {integrity: sha512-fqV+xds4jgwFxwWu08b8xDuIoW6/D4/1dtEjZ1sXVeWR7nf0pjj1cHERq4kdkYxsvOGu+rjoR3MbjzpFc4fvSw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - dev: true + /@types/d3-color@3.1.3: + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + dev: false - /@stdlib/fs-exists@0.0.8: - resolution: {integrity: sha512-mZktcCxiLmycCJefm1+jbMTYkmhK6Jk1ShFmUVqJvs+Ps9/2EEQXfPbdEniLoVz4HeHLlcX90JWobUEghOOnAQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true + /@types/d3-ease@3.0.2: + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + dev: false + + /@types/d3-interpolate@3.0.4: + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} dependencies: - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-read-file': 0.0.8 - '@stdlib/process-cwd': 0.0.8 - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - dev: true + '@types/d3-color': 3.1.3 + dev: false - /@stdlib/fs-read-file@0.0.8: - resolution: {integrity: sha512-pIZID/G91+q7ep4x9ECNC45+JT2j0+jdz/ZQVjCHiEwXCwshZPEvxcPQWb9bXo6coOY+zJyX5TwBIpXBxomWFg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true + /@types/d3-path@3.1.0: + resolution: {integrity: sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==} + dev: false + + /@types/d3-scale@4.0.8: + resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} dependencies: - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - dev: true + '@types/d3-time': 3.0.3 + dev: false - /@stdlib/fs-resolve-parent-path@0.0.8: - resolution: {integrity: sha512-ok1bTWsAziChibQE3u7EoXwbCQUDkFjjRAHSxh7WWE5JEYVJQg1F0o3bbjRr4D/wfYYPWLAt8AFIKBUDmWghpg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true + /@types/d3-shape@3.1.6: + resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==} dependencies: - '@stdlib/assert-has-own-property': 0.0.7 - '@stdlib/assert-is-function': 0.0.8 - '@stdlib/assert-is-plain-object': 0.0.7 - '@stdlib/assert-is-string': 0.0.8 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-exists': 0.0.8 - '@stdlib/fs-read-file': 0.0.8 - '@stdlib/process-cwd': 0.0.8 - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - dev: true + '@types/d3-path': 3.1.0 + dev: false + + /@types/d3-time@3.0.3: + resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} + dev: false + + /@types/d3-timer@3.0.2: + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + dev: false - /@stdlib/math-base-assert-is-infinite@0.0.9: - resolution: {integrity: sha512-JuPDdmxd+AtPWPHu9uaLvTsnEPaZODZk+zpagziNbDKy8DRiU1cy+t+QEjB5WizZt0A5MkuxDTjZ/8/sG5GaYQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/debug@4.1.7: + resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} dependencies: - '@stdlib/constants-float64-ninf': 0.0.8 - '@stdlib/constants-float64-pinf': 0.0.8 - '@stdlib/utils-library-manifest': 0.0.8 - transitivePeerDependencies: - - supports-color + '@types/ms': 0.7.34 dev: true - /@stdlib/math-base-assert-is-nan@0.0.8: - resolution: {integrity: sha512-m+gCVBxLFW8ZdAfdkATetYMvM7sPFoMKboacHjb1pe21jHQqVb+/4bhRSDg6S7HGX7/8/bSzEUm9zuF7vqK5rQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/dlv@1.1.4: + resolution: {integrity: sha512-m8KmImw4Jt+4rIgupwfivrWEOnj1LzkmKkqbh075uG13eTQ1ZxHWT6T0vIdSQhLIjQCiR0n0lZdtyDOPO1x2Mw==} + dev: false + + /@types/docker-modem@3.0.6: + resolution: {integrity: sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==} dependencies: - '@stdlib/utils-library-manifest': 0.0.8 - transitivePeerDependencies: - - supports-color + '@types/node': 18.19.42 + '@types/ssh2': 1.15.0 dev: true - /@stdlib/math-base-napi-binary@0.0.8: - resolution: {integrity: sha512-B8d0HBPhfXefbdl/h0h5c+lM2sE+/U7Fb7hY/huVeoQtBtEx0Jbx/qKvPSVxMjmWCKfWlbPpbgKpN5GbFgLiAg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/dockerode@3.3.31: + resolution: {integrity: sha512-42R9eoVqJDSvVspV89g7RwRqfNExgievLNWoHkg7NoWIqAmavIbgQBb4oc0qRtHkxE+I3Xxvqv7qVXFABKPBTg==} dependencies: - '@stdlib/complex-float32': 0.0.7 - '@stdlib/complex-float64': 0.0.8 - '@stdlib/complex-reim': 0.0.6 - '@stdlib/complex-reimf': 0.0.1 - '@stdlib/utils-library-manifest': 0.0.8 - transitivePeerDependencies: - - supports-color + '@types/docker-modem': 3.0.6 + '@types/node': 18.19.42 + '@types/ssh2': 1.15.0 dev: true - /@stdlib/math-base-napi-unary@0.0.9: - resolution: {integrity: sha512-2WNKhjCygkGMp0RgjaD7wAHJTqPZmuVW7yPOc62Tnz2U+Ad8q/tcOcN+uvq2dtKsAGr1HDMIQxZ/XrrThMePyA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/eslint-scope@3.7.7: + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} dependencies: - '@stdlib/complex-float32': 0.0.7 - '@stdlib/complex-float64': 0.0.8 - '@stdlib/complex-reim': 0.0.6 - '@stdlib/complex-reimf': 0.0.1 - '@stdlib/utils-library-manifest': 0.0.8 - transitivePeerDependencies: - - supports-color - dev: true + '@types/eslint': 9.6.0 + '@types/estree': 1.0.5 - /@stdlib/math-base-special-abs@0.0.6: - resolution: {integrity: sha512-FaaMUnYs2qIVN3kI5m/qNlBhDnjszhDOzEhxGEoQWR/k0XnxbCsTyjNesR2DkpiKuoAXAr9ojoDe2qBYdirWoQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/eslint@8.56.11: + resolution: {integrity: sha512-sVBpJMf7UPo/wGecYOpk2aQya2VUGeHhe38WG7/mN5FufNSubf5VT9Uh9Uyp8/eLJpu1/tuhJ/qTo4mhSB4V4Q==} dependencies: - '@stdlib/math-base-napi-unary': 0.0.9 - '@stdlib/number-float64-base-to-words': 0.0.7 - '@stdlib/utils-library-manifest': 0.0.8 - transitivePeerDependencies: - - supports-color - dev: true + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 + dev: false - /@stdlib/math-base-special-copysign@0.0.7: - resolution: {integrity: sha512-7Br7oeuVJSBKG8BiSk/AIRFTBd2sbvHdV3HaqRj8tTZHX8BQomZ3Vj4Qsiz3kPyO4d6PpBLBTYlGTkSDlGOZJA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/eslint@9.6.0: + resolution: {integrity: sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==} dependencies: - '@stdlib/constants-float64-high-word-abs-mask': 0.0.1 - '@stdlib/constants-float64-high-word-sign-mask': 0.0.1 - '@stdlib/math-base-napi-binary': 0.0.8 - '@stdlib/number-float64-base-from-words': 0.0.6 - '@stdlib/number-float64-base-get-high-word': 0.0.6 - '@stdlib/number-float64-base-to-words': 0.0.7 - '@stdlib/utils-library-manifest': 0.0.8 - transitivePeerDependencies: - - supports-color - dev: true + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 - /@stdlib/math-base-special-ldexp@0.0.5: - resolution: {integrity: sha512-RLRsPpCdcJZMhwb4l4B/FsmGfEPEWAsik6KYUkUSSHb7ok/gZWt8LgVScxGMpJMpl5IV0v9qG4ZINVONKjX5KA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - dependencies: - '@stdlib/constants-float64-exponent-bias': 0.0.8 - '@stdlib/constants-float64-max-base2-exponent': 0.0.8 - '@stdlib/constants-float64-max-base2-exponent-subnormal': 0.0.8 - '@stdlib/constants-float64-min-base2-exponent-subnormal': 0.0.8 - '@stdlib/constants-float64-ninf': 0.0.8 - '@stdlib/constants-float64-pinf': 0.0.8 - '@stdlib/math-base-assert-is-infinite': 0.0.9 - '@stdlib/math-base-assert-is-nan': 0.0.8 - '@stdlib/math-base-special-copysign': 0.0.7 - '@stdlib/number-float64-base-exponent': 0.0.6 - '@stdlib/number-float64-base-from-words': 0.0.6 - '@stdlib/number-float64-base-normalize': 0.0.9 - '@stdlib/number-float64-base-to-words': 0.0.7 - transitivePeerDependencies: - - supports-color - dev: true + /@types/estree@0.0.39: + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} - /@stdlib/number-ctor@0.0.7: - resolution: {integrity: sha512-kXNwKIfnb10Ro3RTclhAYqbE3DtIXax+qpu0z1/tZpI2vkmTfYDQLno2QJrzJsZZgdeFtXIws+edONN9kM34ow==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - dev: true + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - /@stdlib/number-float64-base-exponent@0.0.6: - resolution: {integrity: sha512-wLXsG+cvynmapoffmj5hVNDH7BuHIGspBcTCdjPaD+tnqPDIm03qV5Z9YBhDh91BdOCuPZQ8Ovu2WBpX+ySeGg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - dependencies: - '@stdlib/constants-float64-exponent-bias': 0.0.8 - '@stdlib/constants-float64-high-word-exponent-mask': 0.0.8 - '@stdlib/number-float64-base-get-high-word': 0.0.6 - transitivePeerDependencies: - - supports-color - dev: true + /@types/expect@1.20.4: + resolution: {integrity: sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==} - /@stdlib/number-float64-base-from-words@0.0.6: - resolution: {integrity: sha512-r0elnekypCN831aw9Gp8+08br8HHAqvqtc5uXaxEh3QYIgBD/QM5qSb3b7WSAQ0ZxJJKdoykupODWWBkWQTijg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/express-serve-static-core@4.19.5: + resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==} dependencies: - '@stdlib/array-float64': 0.0.6 - '@stdlib/array-uint32': 0.0.6 - '@stdlib/assert-is-little-endian': 0.0.7 - '@stdlib/number-float64-base-to-words': 0.0.7 - '@stdlib/utils-library-manifest': 0.0.8 - transitivePeerDependencies: - - supports-color - dev: true + '@types/node': 18.19.42 + '@types/qs': 6.9.15 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 - /@stdlib/number-float64-base-get-high-word@0.0.6: - resolution: {integrity: sha512-jSFSYkgiG/IzDurbwrDKtWiaZeSEJK8iJIsNtbPG1vOIdQMRyw+t0bf3Kf3vuJu/+bnSTvYZLqpCO6wzT/ve9g==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/express@4.17.21: + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} dependencies: - '@stdlib/array-float64': 0.0.6 - '@stdlib/array-uint32': 0.0.6 - '@stdlib/assert-is-little-endian': 0.0.7 - '@stdlib/number-float64-base-to-words': 0.0.7 - '@stdlib/utils-library-manifest': 0.0.8 - transitivePeerDependencies: - - supports-color - dev: true + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.19.5 + '@types/qs': 6.9.15 + '@types/serve-static': 1.15.7 - /@stdlib/number-float64-base-normalize@0.0.9: - resolution: {integrity: sha512-+rm7RQJEj8zHkqYFE2a6DgNQSB5oKE/IydHAajgZl40YB91BoYRYf/ozs5/tTwfy2Fc04+tIpSfFtzDr4ZY19Q==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/firebase@3.2.1: + resolution: {integrity: sha512-G8XgHMu2jHlElfc2xVNaYP50F0qrqeTCjgeG1v5b4SRwWG4XKC4fCuEdVZuZaMRmVygcnbRZBAo9O7RsDvmkGQ==} + deprecated: This is a stub types definition for Firebase API (https://www.firebase.com/docs/javascript/firebase). Firebase API provides its own type definitions, so you don't need @types/firebase installed! dependencies: - '@stdlib/constants-float64-smallest-normal': 0.0.8 - '@stdlib/math-base-assert-is-infinite': 0.0.9 - '@stdlib/math-base-assert-is-nan': 0.0.8 - '@stdlib/math-base-special-abs': 0.0.6 - '@stdlib/types': 0.0.14 - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - '@stdlib/utils-library-manifest': 0.0.8 + firebase: 10.12.4 transitivePeerDependencies: - - supports-color + - '@react-native-async-storage/async-storage' dev: true - /@stdlib/number-float64-base-to-float32@0.0.7: - resolution: {integrity: sha512-PNUSi6+cqfFiu4vgFljUKMFY2O9PxI6+T+vqtIoh8cflf+PjSGj3v4QIlstK9+6qU40eGR5SHZyLTWdzmNqLTQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/glob@7.2.0: + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: - '@stdlib/array-float32': 0.0.6 - transitivePeerDependencies: - - supports-color + '@types/minimatch': 5.1.2 + '@types/node': 18.19.42 dev: true - /@stdlib/number-float64-base-to-words@0.0.7: - resolution: {integrity: sha512-7wsYuq+2MGp9rAkTnQ985rah7EJI9TfgHrYSSd4UIu4qIjoYmWIKEhIDgu7/69PfGrls18C3PxKg1pD/v7DQTg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/glob@8.1.0: + resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} dependencies: - '@stdlib/array-float64': 0.0.6 - '@stdlib/array-uint32': 0.0.6 - '@stdlib/assert-is-little-endian': 0.0.7 - '@stdlib/os-byte-order': 0.0.7 - '@stdlib/os-float-word-order': 0.0.7 - '@stdlib/types': 0.0.14 - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - '@stdlib/utils-library-manifest': 0.0.8 - transitivePeerDependencies: - - supports-color - dev: true + '@types/minimatch': 5.1.2 + '@types/node': 18.19.42 - /@stdlib/os-byte-order@0.0.7: - resolution: {integrity: sha512-rRJWjFM9lOSBiIX4zcay7BZsqYBLoE32Oz/Qfim8cv1cN1viS5D4d3DskRJcffw7zXDnG3oZAOw5yZS0FnlyUg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true + /@types/graceful-fs@4.1.9: + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} dependencies: - '@stdlib/assert-is-big-endian': 0.0.7 - '@stdlib/assert-is-little-endian': 0.0.7 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-read-file': 0.0.8 - '@stdlib/utils-library-manifest': 0.0.8 - transitivePeerDependencies: - - supports-color - dev: true + '@types/node': 18.19.42 - /@stdlib/os-float-word-order@0.0.7: - resolution: {integrity: sha512-gXIcIZf+ENKP7E41bKflfXmPi+AIfjXW/oU+m8NbP3DQasqHaZa0z5758qvnbO8L1lRJb/MzLOkIY8Bx/0cWEA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true - dependencies: - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-read-file': 0.0.8 - '@stdlib/os-byte-order': 0.0.7 - '@stdlib/utils-library-manifest': 0.0.8 - transitivePeerDependencies: - - supports-color - dev: true + /@types/html-minifier-terser@6.1.0: + resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} + dev: false - /@stdlib/process-cwd@0.0.8: - resolution: {integrity: sha512-GHINpJgSlKEo9ODDWTHp0/Zc/9C/qL92h5Mc0QlIFBXAoUjy6xT4FB2U16wCNZMG3eVOzt5+SjmCwvGH0Wbg3Q==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true + /@types/http-errors@2.0.4: + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + /@types/http-proxy@1.17.14: + resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==} dependencies: - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-read-file': 0.0.8 - dev: true + '@types/node': 18.19.42 + dev: false - /@stdlib/process-read-stdin@0.0.7: - resolution: {integrity: sha512-nep9QZ5iDGrRtrZM2+pYAvyCiYG4HfO0/9+19BiLJepjgYq4GKeumPAQo22+1xawYDL7Zu62uWzYszaVZcXuyw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/inquirer@9.0.7: + resolution: {integrity: sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g==} dependencies: - '@stdlib/assert-is-function': 0.0.8 - '@stdlib/assert-is-string': 0.0.8 - '@stdlib/buffer-ctor': 0.0.7 - '@stdlib/buffer-from-string': 0.0.8 - '@stdlib/streams-node-stdin': 0.0.7 - '@stdlib/utils-next-tick': 0.0.8 + '@types/through': 0.0.33 + rxjs: 7.8.1 dev: true - /@stdlib/regexp-eol@0.0.7: - resolution: {integrity: sha512-BTMpRWrmlnf1XCdTxOrb8o6caO2lmu/c80XSyhYCi1DoizVIZnqxOaN5yUJNCr50g28vQ47PpsT3Yo7J3SdlRA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + /@types/istanbul-lib-report@3.0.3: + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} dependencies: - '@stdlib/assert-has-own-property': 0.0.7 - '@stdlib/assert-is-boolean': 0.0.8 - '@stdlib/assert-is-plain-object': 0.0.7 - '@stdlib/assert-is-string': 0.0.8 - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - dev: true + '@types/istanbul-lib-coverage': 2.0.6 - /@stdlib/regexp-extended-length-path@0.0.7: - resolution: {integrity: sha512-z6uqzMWq3WPDKbl4MIZJoNA5ZsYLQI9G3j2TIvhU8X2hnhlku8p4mvK9F+QmoVvgPxKliwNnx/DAl7ltutSDKw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/istanbul-reports@3.0.4: + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} dependencies: - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - dev: true + '@types/istanbul-lib-report': 3.0.3 - /@stdlib/regexp-function-name@0.0.7: - resolution: {integrity: sha512-MaiyFUUqkAUpUoz/9F6AMBuMQQfA9ssQfK16PugehLQh4ZtOXV1LhdY8e5Md7SuYl9IrvFVg1gSAVDysrv5ZMg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/jest@29.5.12: + resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} dependencies: - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 + expect: 29.7.0 + pretty-format: 29.7.0 dev: true - /@stdlib/regexp-regexp@0.0.8: - resolution: {integrity: sha512-S5PZICPd/XRcn1dncVojxIDzJsHtEleuJHHD7ji3o981uPHR7zI2Iy9a1eV2u7+ABeUswbI1Yuix6fXJfcwV1w==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - dependencies: - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - dev: true + /@types/js-cookie@2.2.7: + resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} + dev: false - /@stdlib/streams-node-stdin@0.0.7: - resolution: {integrity: sha512-gg4lgrjuoG3V/L29wNs32uADMCqepIcmoOFHJCTAhVe0GtHDLybUVnLljaPfdvmpPZmTvmusPQtIcscbyWvAyg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/js-yaml@4.0.9: + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} dev: true - /@stdlib/string-base-format-interpolate@0.0.4: - resolution: {integrity: sha512-8FC8+/ey+P5hf1B50oXpXzRzoAgKI1rikpyKZ98Xmjd5rcbSq3NWYi8TqOF8mUHm9hVZ2CXWoNCtEe2wvMQPMg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - dev: true + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - /@stdlib/string-base-format-tokenize@0.0.4: - resolution: {integrity: sha512-+vMIkheqAhDeT/iF5hIQo95IMkt5IzC68eR3CxW1fhc48NMkKFE2UfN73ET8fmLuOanLo/5pO2E90c2G7PExow==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - dev: true + /@types/json5@0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - /@stdlib/string-format@0.0.3: - resolution: {integrity: sha512-1jiElUQXlI/tTkgRuzJi9jUz/EjrO9kzS8VWHD3g7gdc3ZpxlA5G9JrIiPXGw/qmZTi0H1pXl6KmX+xWQEQJAg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/jsonwebtoken@9.0.6: + resolution: {integrity: sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==} dependencies: - '@stdlib/string-base-format-interpolate': 0.0.4 - '@stdlib/string-base-format-tokenize': 0.0.4 - dev: true + '@types/node': 18.19.42 - /@stdlib/string-lowercase@0.0.9: - resolution: {integrity: sha512-tXFFjbhIlDak4jbQyV1DhYiSTO8b1ozS2g/LELnsKUjIXECDKxGFyWYcz10KuyAWmFotHnCJdIm8/blm2CfDIA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true - dependencies: - '@stdlib/assert-is-string': 0.0.8 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-read-file': 0.0.8 - '@stdlib/process-read-stdin': 0.0.7 - '@stdlib/streams-node-stdin': 0.0.7 - '@stdlib/string-format': 0.0.3 + /@types/linkify-it@5.0.0: + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + requiresBuild: true + dev: false + optional: true + + /@types/lodash@4.17.7: + resolution: {integrity: sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==} dev: true - /@stdlib/string-replace@0.0.11: - resolution: {integrity: sha512-F0MY4f9mRE5MSKpAUfL4HLbJMCbG6iUTtHAWnNeAXIvUX1XYIw/eItkA58R9kNvnr1l5B08bavnjrgTJGIKFFQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true + /@types/long@4.0.2: + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + dev: false + + /@types/markdown-it@14.1.2: + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + requiresBuild: true dependencies: - '@stdlib/assert-is-function': 0.0.8 - '@stdlib/assert-is-regexp': 0.0.7 - '@stdlib/assert-is-regexp-string': 0.0.9 - '@stdlib/assert-is-string': 0.0.8 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-read-file': 0.0.8 - '@stdlib/process-read-stdin': 0.0.7 - '@stdlib/regexp-eol': 0.0.7 - '@stdlib/streams-node-stdin': 0.0.7 - '@stdlib/string-format': 0.0.3 - '@stdlib/utils-escape-regexp-string': 0.0.9 - '@stdlib/utils-regexp-from-string': 0.0.9 - dev: true + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + dev: false + optional: true + + /@types/mdurl@2.0.0: + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + requiresBuild: true + dev: false + optional: true + + /@types/mime@1.3.5: + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + /@types/minimatch@3.0.5: + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + + /@types/minimatch@5.1.2: + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - /@stdlib/types@0.0.14: - resolution: {integrity: sha512-AP3EI9/il/xkwUazcoY+SbjtxHRrheXgSbWZdEGD+rWpEgj6n2i63hp6hTOpAB5NipE0tJwinQlDGOuQ1lCaCw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/minimist@1.2.5: + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} dev: true - /@stdlib/utils-constructor-name@0.0.8: - resolution: {integrity: sha512-GXpyNZwjN8u3tyYjL2GgGfrsxwvfogUC3gg7L7NRZ1i86B6xmgfnJUYHYOUnSfB+R531ET7NUZlK52GxL7P82Q==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - dependencies: - '@stdlib/assert-is-buffer': 0.0.8 - '@stdlib/regexp-function-name': 0.0.7 - '@stdlib/utils-native-class': 0.0.8 + /@types/ms@0.7.34: + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} dev: true - /@stdlib/utils-convert-path@0.0.8: - resolution: {integrity: sha512-GNd8uIswrcJCctljMbmjtE4P4oOjhoUIfMvdkqfSrRLRY+ZqPB2xM+yI0MQFfUq/0Rnk/xtESlGSVLz9ZDtXfA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true + /@types/node-fetch@2.6.11: + resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} dependencies: - '@stdlib/assert-is-string': 0.0.8 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-read-file': 0.0.8 - '@stdlib/process-read-stdin': 0.0.7 - '@stdlib/regexp-eol': 0.0.7 - '@stdlib/regexp-extended-length-path': 0.0.7 - '@stdlib/streams-node-stdin': 0.0.7 - '@stdlib/string-lowercase': 0.0.9 - '@stdlib/string-replace': 0.0.11 - dev: true + '@types/node': 18.19.42 + form-data: 4.0.0 + dev: false - /@stdlib/utils-define-nonenumerable-read-only-property@0.0.7: - resolution: {integrity: sha512-c7dnHDYuS4Xn3XBRWIQBPcROTtP/4lkcFyq0FrQzjXUjimfMgHF7cuFIIob6qUTnU8SOzY9p0ydRR2QJreWE6g==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/node-forge@1.3.11: + resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} dependencies: - '@stdlib/types': 0.0.14 - '@stdlib/utils-define-property': 0.0.9 + '@types/node': 18.19.42 + dev: false + + /@types/node@14.18.33: + resolution: {integrity: sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==} dev: true - /@stdlib/utils-define-property@0.0.9: - resolution: {integrity: sha512-pIzVvHJvVfU/Lt45WwUAcodlvSPDDSD4pIPc9WmIYi4vnEBA9U7yHtiNz2aTvfGmBMTaLYTVVFIXwkFp+QotMA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/node@15.14.9: + resolution: {integrity: sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==} + + /@types/node@18.19.42: + resolution: {integrity: sha512-d2ZFc/3lnK2YCYhos8iaNIYu9Vfhr92nHiyJHRltXWjXUBjEE+A4I58Tdbnw4VhggSW+2j5y5gTrLs4biNnubg==} dependencies: - '@stdlib/types': 0.0.14 - dev: true + undici-types: 5.26.5 - /@stdlib/utils-escape-regexp-string@0.0.9: - resolution: {integrity: sha512-E+9+UDzf2mlMLgb+zYrrPy2FpzbXh189dzBJY6OG+XZqEJAXcjWs7DURO5oGffkG39EG5KXeaQwDXUavcMDCIw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/nodemailer@6.4.15: + resolution: {integrity: sha512-0EBJxawVNjPkng1zm2vopRctuWVCxk34JcIlRuXSf54habUWdz1FB7wHDqOqvDa8Mtpt0Q3LTXQkAs2LNyK5jQ==} dependencies: - '@stdlib/assert-is-string': 0.0.8 - '@stdlib/string-format': 0.0.3 + '@types/node': 18.19.42 dev: true - /@stdlib/utils-get-prototype-of@0.0.7: - resolution: {integrity: sha512-fCUk9lrBO2ELrq+/OPJws1/hquI4FtwG0SzVRH6UJmJfwb1zoEFnjcwyDAy+HWNVmo3xeRLsrz6XjHrJwer9pg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/normalize-package-data@2.4.4: + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + /@types/parse-json@4.0.2: + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + /@types/pg-cursor@2.7.2: + resolution: {integrity: sha512-m3xT8bVFCvx98LuzbvXyuCdT/Hjdd/v8ml4jL4K1QF70Y8clOfCFdgoaEB1FWdcSwcpoFYZTJQaMD9/GQ27efQ==} dependencies: - '@stdlib/assert-is-function': 0.0.8 - '@stdlib/utils-native-class': 0.0.8 - dev: true + '@types/node': 18.19.42 + '@types/pg': 8.11.6 + dev: false - /@stdlib/utils-global@0.0.7: - resolution: {integrity: sha512-BBNYBdDUz1X8Lhfw9nnnXczMv9GztzGpQ88J/6hnY7PHJ71av5d41YlijWeM9dhvWjnH9I7HNE3LL7R07yw0kA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/pg-promise@5.4.3: + resolution: {integrity: sha512-ABgy5hzmcyRZxLNG6HUafpxbpmXGeVJ5dopKwssEsFeA7rpRakdoodt75HJNIjQB4He+s3PTfG1AoWQWm7OuCg==} + deprecated: This is a stub types definition for pg-promise (https://github.com/vitaly-t/pg-promise). pg-promise provides its own type definitions, so you don't need @types/pg-promise installed! dependencies: - '@stdlib/assert-is-boolean': 0.0.8 - dev: true + pg-promise: 11.9.1 + transitivePeerDependencies: + - pg-native + dev: false - /@stdlib/utils-library-manifest@0.0.8: - resolution: {integrity: sha512-IOQSp8skSRQn9wOyMRUX9Hi0j/P5v5TvD8DJWTqtE8Lhr8kVVluMBjHfvheoeKHxfWAbNHSVpkpFY/Bdh/SHgQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true + /@types/pg-query-stream@3.4.0(pg@8.11.6): + resolution: {integrity: sha512-oqGAu+5CMPAVNqemN9xYT3LBDy2qXBke15cstEuVYIvJL6lcKSNKeG61fONlVrxTYIFi9sPuGVtIweanrEZcJw==} + deprecated: This is a stub types definition. pg-query-stream provides its own type definitions, so you do not need this installed. dependencies: - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-resolve-parent-path': 0.0.8 - '@stdlib/utils-convert-path': 0.0.8 - debug: 2.6.9 - resolve: 1.22.2 + pg-query-stream: 4.6.0(pg@8.11.6) transitivePeerDependencies: - - supports-color + - pg dev: true - /@stdlib/utils-native-class@0.0.8: - resolution: {integrity: sha512-0Zl9me2V9rSrBw/N8o8/9XjmPUy8zEeoMM0sJmH3N6C9StDsYTjXIAMPGzYhMEWaWHvGeYyNteFK2yDOVGtC3w==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/pg@8.11.6: + resolution: {integrity: sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==} dependencies: - '@stdlib/assert-has-own-property': 0.0.7 - '@stdlib/assert-has-tostringtag-support': 0.0.9 - dev: true + '@types/node': 18.19.42 + pg-protocol: 1.6.1 + pg-types: 4.0.2 - /@stdlib/utils-next-tick@0.0.8: - resolution: {integrity: sha512-l+hPl7+CgLPxk/gcWOXRxX/lNyfqcFCqhzzV/ZMvFCYLY/wI9lcWO4xTQNMALY2rp+kiV+qiAiO9zcO+hewwUg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - dev: true + /@types/prettier@2.7.3: + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} - /@stdlib/utils-noop@0.0.14: - resolution: {integrity: sha512-A5faFEUfszMgd93RCyB+aWb62hQxgP+dZ/l9rIOwNWbIrCYNwSuL4z50lNJuatnwwU4BQ4EjQr+AmBsnvuLcyQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - dev: true + /@types/prop-types@15.7.12: + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + + /@types/q@1.5.8: + resolution: {integrity: sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==} + + /@types/qs@6.9.15: + resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} - /@stdlib/utils-regexp-from-string@0.0.9: - resolution: {integrity: sha512-3rN0Mcyiarl7V6dXRjFAUMacRwe0/sYX7ThKYurf0mZkMW9tjTP+ygak9xmL9AL0QQZtbrFFwWBrDO+38Vnavw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/range-parser@1.2.7: + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + /@types/react-dom@18.3.0: + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} dependencies: - '@stdlib/assert-is-string': 0.0.8 - '@stdlib/regexp-regexp': 0.0.8 - '@stdlib/string-format': 0.0.3 - dev: true + '@types/react': 18.3.3 + + /@types/react@18.3.3: + resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} + dependencies: + '@types/prop-types': 15.7.12 + csstype: 3.1.3 - /@stdlib/utils-type-of@0.0.8: - resolution: {integrity: sha512-b4xqdy3AnnB7NdmBBpoiI67X4vIRxvirjg3a8BfhM5jPr2k0njby1jAbG9dUxJvgAV6o32S4kjUgfIdjEYpTNQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] + /@types/readdir-glob@1.1.5: + resolution: {integrity: sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg==} dependencies: - '@stdlib/utils-constructor-name': 0.0.8 - '@stdlib/utils-global': 0.0.7 + '@types/node': 18.19.42 dev: true - /@surma/rollup-plugin-off-main-thread@2.2.3: - resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + /@types/request@2.48.12: + resolution: {integrity: sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==} dependencies: - ejs: 3.1.9 - json5: 2.2.3 - magic-string: 0.25.9 - string.prototype.matchall: 4.0.8 + '@types/caseless': 0.12.5 + '@types/node': 18.19.42 + '@types/tough-cookie': 4.0.5 + form-data: 2.5.1 dev: false - /@svgr/babel-plugin-add-jsx-attribute@5.4.0: - resolution: {integrity: sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==} - engines: {node: '>=10'} + /@types/resolve@0.0.8: + resolution: {integrity: sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==} + dependencies: + '@types/node': 18.19.42 + dev: true - /@svgr/babel-plugin-remove-jsx-attribute@5.4.0: - resolution: {integrity: sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==} - engines: {node: '>=10'} + /@types/resolve@1.17.1: + resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} + dependencies: + '@types/node': 18.19.42 + dev: false - /@svgr/babel-plugin-remove-jsx-empty-expression@5.0.1: - resolution: {integrity: sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==} - engines: {node: '>=10'} + /@types/resolve@1.20.2: + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + dev: true - /@svgr/babel-plugin-replace-jsx-attribute-value@5.0.1: - resolution: {integrity: sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==} - engines: {node: '>=10'} + /@types/retry@0.12.0: + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + dev: false - /@svgr/babel-plugin-svg-dynamic-title@5.4.0: - resolution: {integrity: sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==} - engines: {node: '>=10'} + /@types/rimraf@3.0.2: + resolution: {integrity: sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==} + requiresBuild: true + dependencies: + '@types/glob': 8.1.0 + '@types/node': 18.19.42 + dev: false + optional: true - /@svgr/babel-plugin-svg-em-dimensions@5.4.0: - resolution: {integrity: sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==} - engines: {node: '>=10'} + /@types/semver@7.5.8: + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - /@svgr/babel-plugin-transform-react-native-svg@5.4.0: - resolution: {integrity: sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==} - engines: {node: '>=10'} + /@types/send@0.17.4: + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + dependencies: + '@types/mime': 1.3.5 + '@types/node': 18.19.42 - /@svgr/babel-plugin-transform-svg-component@5.5.0: - resolution: {integrity: sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==} - engines: {node: '>=10'} + /@types/serve-index@1.9.4: + resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} + dependencies: + '@types/express': 4.17.21 + dev: false - /@svgr/babel-preset@5.5.0: - resolution: {integrity: sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==} - engines: {node: '>=10'} + /@types/serve-static@1.15.7: + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} dependencies: - '@svgr/babel-plugin-add-jsx-attribute': 5.4.0 - '@svgr/babel-plugin-remove-jsx-attribute': 5.4.0 - '@svgr/babel-plugin-remove-jsx-empty-expression': 5.0.1 - '@svgr/babel-plugin-replace-jsx-attribute-value': 5.0.1 - '@svgr/babel-plugin-svg-dynamic-title': 5.4.0 - '@svgr/babel-plugin-svg-em-dimensions': 5.4.0 - '@svgr/babel-plugin-transform-react-native-svg': 5.4.0 - '@svgr/babel-plugin-transform-svg-component': 5.5.0 + '@types/http-errors': 2.0.4 + '@types/node': 18.19.42 + '@types/send': 0.17.4 - /@svgr/core@5.5.0: - resolution: {integrity: sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==} - engines: {node: '>=10'} + /@types/sockjs@0.3.36: + resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} dependencies: - '@svgr/plugin-jsx': 5.5.0 - camelcase: 6.3.0 - cosmiconfig: 7.1.0 - transitivePeerDependencies: - - supports-color + '@types/node': 18.19.42 + dev: false - /@svgr/hast-util-to-babel-ast@5.5.0: - resolution: {integrity: sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==} - engines: {node: '>=10'} + /@types/ssh2-streams@0.1.12: + resolution: {integrity: sha512-Sy8tpEmCce4Tq0oSOYdfqaBpA3hDM8SoxoFh5vzFsu2oL+znzGz8oVWW7xb4K920yYMUY+PIG31qZnFMfPWNCg==} dependencies: - '@babel/types': 7.23.0 + '@types/node': 18.19.42 + dev: true - /@svgr/plugin-jsx@5.5.0: - resolution: {integrity: sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==} - engines: {node: '>=10'} + /@types/ssh2@0.5.52: + resolution: {integrity: sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==} dependencies: - '@babel/core': 7.21.4 - '@svgr/babel-preset': 5.5.0 - '@svgr/hast-util-to-babel-ast': 5.5.0 - svg-parser: 2.0.4 - transitivePeerDependencies: - - supports-color + '@types/node': 18.19.42 + '@types/ssh2-streams': 0.1.12 + dev: true - /@svgr/plugin-svgo@5.5.0: - resolution: {integrity: sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==} - engines: {node: '>=10'} + /@types/ssh2@1.15.0: + resolution: {integrity: sha512-YcT8jP5F8NzWeevWvcyrrLB3zcneVjzYY9ZDSMAMboI+2zR1qYWFhwsyOFVzT7Jorn67vqxC0FRiw8YyG9P1ww==} dependencies: - cosmiconfig: 7.1.0 - deepmerge: 4.3.1 - svgo: 1.3.2 + '@types/node': 18.19.42 + dev: true - /@svgr/rollup@5.5.0: - resolution: {integrity: sha512-EiZmH2VTr+Xzyb6Ga8XtGa9MEbiU3WQnB5vHmqhwAUqibU3uwuwr7MN+QwIh/gtBk1ucMim8BCfcRTlLVREM8A==} - engines: {node: '>=10'} + /@types/stack-utils@2.0.3: + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + /@types/strip-bom@3.0.0: + resolution: {integrity: sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==} + dev: true + + /@types/strip-json-comments@0.0.30: + resolution: {integrity: sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==} + dev: true + + /@types/stripe@8.0.417: + resolution: {integrity: sha512-PTuqskh9YKNENnOHGVJBm4sM0zE8B1jZw1JIskuGAPkMB+OH236QeN8scclhYGPA4nG6zTtPXgwpXdp+HPDTVw==} + deprecated: This is a stub types definition. stripe provides its own type definitions, so you do not need this installed. dependencies: - '@babel/core': 7.21.4 - '@babel/plugin-transform-react-constant-elements': 7.21.3(@babel/core@7.21.4) - '@babel/preset-env': 7.23.2(@babel/core@7.21.4) - '@babel/preset-react': 7.22.15(@babel/core@7.21.4) - '@svgr/core': 5.5.0 - '@svgr/plugin-jsx': 5.5.0 - '@svgr/plugin-svgo': 5.5.0 - rollup-pluginutils: 2.8.2 - transitivePeerDependencies: - - supports-color + stripe: 11.18.0 dev: true - /@svgr/webpack@5.5.0: - resolution: {integrity: sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==} - engines: {node: '>=10'} + /@types/through@0.0.33: + resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} dependencies: - '@babel/core': 7.21.4 - '@babel/plugin-transform-react-constant-elements': 7.21.3(@babel/core@7.21.4) - '@babel/preset-env': 7.23.2(@babel/core@7.21.4) - '@babel/preset-react': 7.22.15(@babel/core@7.21.4) - '@svgr/core': 5.5.0 - '@svgr/plugin-jsx': 5.5.0 - '@svgr/plugin-svgo': 5.5.0 - loader-utils: 2.0.4 - transitivePeerDependencies: - - supports-color + '@types/node': 18.19.42 + dev: true + + /@types/tough-cookie@4.0.5: + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + dev: false + + /@types/trusted-types@2.0.7: + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} dev: false - /@swc/helpers@0.5.2: - resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} + /@types/vinyl@2.0.12: + resolution: {integrity: sha512-Sr2fYMBUVGYq8kj3UthXFAu5UN6ZW+rYr4NACjZQJvHvj+c8lYv0CahmZ2P/r7iUkN44gGUBwqxZkrKXYPb7cw==} dependencies: - tslib: 2.6.2 + '@types/expect': 1.20.4 + '@types/node': 18.19.42 + + /@types/web@0.0.69: + resolution: {integrity: sha512-0CqMxeJ+ETljejsVQ5U6gV75C9zz9nmCBXHYqdfnVmWp54VfoJSxUgeO6NI+ezgBl0JQsSiZCs2pkCCT9ERhbA==} + dev: true + + /@types/webidl-conversions@7.0.3: + resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} dev: false - /@tailwindcss/typography@0.5.9(tailwindcss@3.3.1): - resolution: {integrity: sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg==} - peerDependencies: - tailwindcss: '>=3.0.0 || insiders' + /@types/webpack@5.28.5(webpack-cli@5.1.4): + resolution: {integrity: sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==} dependencies: - lodash.castarray: 4.4.0 - lodash.isplainobject: 4.0.6 - lodash.merge: 4.6.2 - postcss-selector-parser: 6.0.10 - tailwindcss: 3.3.1(postcss@8.4.30)(ts-node@10.8.2) + '@types/node': 18.19.42 + tapable: 2.2.1 + webpack: 5.93.0(webpack-cli@5.1.4) + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + - webpack-cli dev: true - /@tanstack/query-core@4.29.1: - resolution: {integrity: sha512-vkPewLEG8ua0efo3SsVT0BcBtkq5RZX8oPhDAyKL+k/rdOYSQTEocfGEXSaBwIwsXeOGBUpfKqI+UmHvNqdWXg==} + /@types/whatwg-url@11.0.5: + resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} + dependencies: + '@types/webidl-conversions': 7.0.3 dev: false - /@tanstack/react-query@4.29.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-/crv1v+OeuGG6EOvaQmyeo9GCKtH4jbmuhZkvk9ulufRiHcTr/A9+YP9GevEAZzUTdzXMwenpTbyxBGvG2xXvw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-native: '*' - peerDependenciesMeta: - react-dom: - optional: true - react-native: - optional: true + /@types/ws@8.5.12: + resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} dependencies: - '@tanstack/query-core': 4.29.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - use-sync-external-store: 1.2.0(react@18.2.0) + '@types/node': 18.19.42 dev: false - /@testing-library/dom@8.20.0: - resolution: {integrity: sha512-d9ULIT+a4EXLX3UU8FBjauG9NnsZHkHztXoIcTsOKoOw030fyjheN9svkTULjJxtYag9DZz5Jz5qkWZDPxTFwA==} - engines: {node: '>=12'} + /@types/yargs-parser@21.0.3: + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + /@types/yargs@16.0.9: + resolution: {integrity: sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==} dependencies: - '@babel/code-frame': 7.21.4 - '@babel/runtime': 7.21.0 - '@types/aria-query': 5.0.1 - aria-query: 5.1.3 - chalk: 4.1.2 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 - pretty-format: 27.5.1 - dev: true + '@types/yargs-parser': 21.0.3 + dev: false - /@testing-library/dom@9.2.0: - resolution: {integrity: sha512-xTEnpUKiV/bMyEsE5bT4oYA0x0Z/colMtxzUY8bKyPXBNLn/e0V4ZjBZkEhms0xE4pv9QsPfSRu9AWS4y5wGvA==} - engines: {node: '>=14'} + /@types/yargs@17.0.32: + resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} dependencies: - '@babel/code-frame': 7.22.13 - '@babel/runtime': 7.21.0 - '@types/aria-query': 5.0.1 - aria-query: 5.1.3 - chalk: 4.1.2 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 - pretty-format: 27.5.1 - dev: true + '@types/yargs-parser': 21.0.3 - /@testing-library/jest-dom@6.1.3(@types/jest@29.5.0): - resolution: {integrity: sha512-YzpjRHoCBWPzpPNtg6gnhasqtE/5O4qz8WCwDEaxtfnPO6gkaLrnuXusrGSPyhIGPezr1HM7ZH0CFaUTY9PJEQ==} - engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.5.4): + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - '@jest/globals': '>= 28' - '@types/jest': '>= 28' - jest: '>= 28' - vitest: '>= 0.32' + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' peerDependenciesMeta: - '@jest/globals': - optional: true - '@types/jest': - optional: true - jest: - optional: true - vitest: + typescript: optional: true dependencies: - '@adobe/css-tools': 4.3.1 - '@babel/runtime': 7.21.0 - '@types/jest': 29.5.0 - aria-query: 5.1.3 - chalk: 3.0.0 - css.escape: 1.5.1 - dom-accessibility-api: 0.5.16 - lodash: 4.17.21 - redent: 3.0.0 - dev: true + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + debug: 4.3.6 + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare-lite: 1.4.0 + semver: 7.6.3 + tsutils: 3.21.0(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + dev: false - /@testing-library/jest-dom@6.1.3(jest@28.1.3): - resolution: {integrity: sha512-YzpjRHoCBWPzpPNtg6gnhasqtE/5O4qz8WCwDEaxtfnPO6gkaLrnuXusrGSPyhIGPezr1HM7ZH0CFaUTY9PJEQ==} - engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.5.4): + resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - '@jest/globals': '>= 28' - '@types/jest': '>= 28' - jest: '>= 28' - vitest: '>= 0.32' + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' peerDependenciesMeta: - '@jest/globals': - optional: true - '@types/jest': - optional: true - jest: - optional: true - vitest: + typescript: optional: true dependencies: - '@adobe/css-tools': 4.3.1 - '@babel/runtime': 7.21.0 - aria-query: 5.1.3 - chalk: 3.0.0 - css.escape: 1.5.1 - dom-accessibility-api: 0.5.16 - jest: 28.1.3(@types/node@18.15.11)(ts-node@10.8.2) - lodash: 4.17.21 - redent: 3.0.0 + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.6 + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color dev: true - /@testing-library/react@13.4.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==} - engines: {node: '>=12'} + /@typescript-eslint/experimental-utils@5.62.0(eslint@8.57.0)(typescript@5.5.4): + resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@babel/runtime': 7.21.0 - '@testing-library/dom': 8.20.0 - '@types/react-dom': 18.0.11 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + eslint: 8.57.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: false - /@testing-library/user-event@14.4.3(@testing-library/dom@9.2.0): - resolution: {integrity: sha512-kCUc5MEwaEMakkO5x7aoD+DLi02ehmEM2QCGWvNqAS1dV/fAvORWEjnjsEIvml59M7Y5kCkWN6fCCyPOe8OL6Q==} - engines: {node: '>=12', npm: '>=6'} + /@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4): + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - '@testing-library/dom': '>=7.21.4' + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true dependencies: - '@testing-library/dom': 9.2.0 - dev: true - - /@tootallnate/once@1.1.2: - resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} - engines: {node: '>= 6'} - - /@tootallnate/once@2.0.0: - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - - /@trysound/sax@0.2.0: - resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} - engines: {node: '>=10.13.0'} + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) + debug: 4.3.6 + eslint: 8.57.0 + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color dev: false - /@ts-morph/common@0.11.1: - resolution: {integrity: sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g==} + /@typescript-eslint/parser@6.21.0(eslint@8.24.0)(typescript@5.5.4): + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true dependencies: - fast-glob: 3.2.12 - minimatch: 3.1.2 - mkdirp: 1.0.4 - path-browserify: 1.0.1 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.6 + eslint: 8.24.0 + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color dev: true - /@ts-morph/common@0.12.3: - resolution: {integrity: sha512-4tUmeLyXJnJWvTFOKtcNJ1yh0a3SsTLi2MUoyj8iUNznFRN1ZquaNe7Oukqrnki2FzZkm0J9adCNLDZxUzvj+w==} + /@typescript-eslint/parser@6.21.0(eslint@8.29.0)(typescript@5.5.4): + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true dependencies: - fast-glob: 3.2.12 - minimatch: 3.1.2 - mkdirp: 1.0.4 - path-browserify: 1.0.1 - dev: true - - /@tsconfig/node10@1.0.9: - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} - - /@tsconfig/node12@1.0.11: - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - - /@tsconfig/node14@1.0.3: - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - - /@tsconfig/node16@1.0.3: - resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.6 + eslint: 8.29.0 + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + dev: false - /@types/archiver@5.3.2: - resolution: {integrity: sha512-IctHreBuWE5dvBDz/0WeKtyVKVRs4h75IblxOACL92wU66v+HGAfEYAOyXkOFphvRJMhuXdI9huDXpX0FC6lCw==} + /@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4): + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true dependencies: - '@types/readdir-glob': 1.1.1 - dev: true - - /@types/aria-query@5.0.1: - resolution: {integrity: sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==} + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.6 + eslint: 8.57.0 + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color dev: true - /@types/babel__core@7.20.0: - resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} - dependencies: - '@babel/parser': 7.22.16 - '@babel/types': 7.23.0 - '@types/babel__generator': 7.6.4 - '@types/babel__template': 7.4.1 - '@types/babel__traverse': 7.18.3 - - /@types/babel__generator@7.6.4: - resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} + /@typescript-eslint/scope-manager@5.62.0: + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@babel/types': 7.23.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + dev: false - /@types/babel__template@7.4.1: - resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} + /@typescript-eslint/scope-manager@6.21.0: + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} + engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@babel/parser': 7.22.16 - '@babel/types': 7.23.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 - /@types/babel__traverse@7.18.3: - resolution: {integrity: sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==} + /@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.5.4): + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true dependencies: - '@babel/types': 7.23.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + debug: 4.3.6 + eslint: 8.57.0 + tsutils: 3.21.0(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + dev: false - /@types/body-parser@1.19.2: - resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} + /@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.5.4): + resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true dependencies: - '@types/connect': 3.4.35 - '@types/node': 20.14.2 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.5.4) + debug: 4.3.6 + eslint: 8.57.0 + ts-api-utils: 1.3.0(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + dev: true - /@types/bonjour@3.5.10: - resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} - dependencies: - '@types/node': 20.14.2 + /@typescript-eslint/types@5.62.0: + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: false - /@types/caseless@0.12.5: - resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} + /@typescript-eslint/types@6.21.0: + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} + engines: {node: ^16.0.0 || >=18.0.0} + + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.5.4): + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.6 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.6.3 + tsutils: 3.21.0(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color dev: false - /@types/chalk@2.2.0: - resolution: {integrity: sha512-1zzPV9FDe1I/WHhRkf9SNgqtRJWZqrBWgu7JGveuHmmyR9CnAPCie2N/x+iHrgnpYBIcCJWHBoMRv2TRWktsvw==} - deprecated: This is a stub types definition for chalk (https://github.com/chalk/chalk). chalk provides its own type definitions, so you don't need @types/chalk installed! + /@typescript-eslint/typescript-estree@6.21.0(typescript@5.5.4): + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true dependencies: - chalk: 5.3.0 - dev: true + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.6 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color - /@types/cli-progress@3.11.0: - resolution: {integrity: sha512-XhXhBv1R/q2ahF3BM7qT5HLzJNlIL0wbcGyZVjqOTqAybAnsLisd7gy1UCyIqpL+5Iv6XhlSyzjLCnI2sIdbCg==} + /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.5.4): + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@types/node': 20.14.2 - dev: true + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) + eslint: 8.57.0 + eslint-scope: 5.1.1 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + - typescript + dev: false - /@types/commander@2.12.2: - resolution: {integrity: sha512-0QEFiR8ljcHp9bAbWxecjVRuAMr16ivPiGOw6KFQBVrVd0RQIcM3xKdRisH2EDWgVWujiYtHwhSkSUoAAGzH7Q==} - deprecated: This is a stub types definition for commander (https://github.com/tj/commander.js). commander provides its own type definitions, so you don't need @types/commander installed! + /@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.5.4): + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 dependencies: - commander: 11.0.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) + eslint: 8.57.0 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + - typescript dev: true - /@types/connect-history-api-fallback@1.3.5: - resolution: {integrity: sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==} + /@typescript-eslint/visitor-keys@5.62.0: + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@types/express-serve-static-core': 4.17.33 - '@types/node': 20.14.2 + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 dev: false - /@types/connect@3.4.35: - resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} + /@typescript-eslint/visitor-keys@6.21.0: + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} + engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@types/node': 20.14.2 + '@typescript-eslint/types': 6.21.0 + eslint-visitor-keys: 3.4.3 - /@types/cookie@0.5.1: - resolution: {integrity: sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==} - dev: false + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - /@types/cross-spawn@6.0.2: - resolution: {integrity: sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==} - dependencies: - '@types/node': 20.14.2 + /@vercel/build-utils@7.3.0: + resolution: {integrity: sha512-RJwqrGYSk75auHZqWmlSL+a5JsWv+4SF1AxNQJ+KpF3XWZ/8yThkN/jHBfNxMmW6VvNczSVtMaXI0/2Sess6Eg==} dev: true - /@types/crypto-js@4.1.1: - resolution: {integrity: sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==} + /@vercel/error-utils@2.0.2: + resolution: {integrity: sha512-Sj0LFafGpYr6pfCqrQ82X6ukRl5qpmVrHM/191kNYFqkkB9YkjlMAj6QcEsvCG259x4QZ7Tya++0AB85NDPbKQ==} dev: true - /@types/d3-array@3.2.1: - resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} - dev: false - - /@types/d3-color@3.1.3: - resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} - dev: false - - /@types/d3-ease@3.0.2: - resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} - dev: false - - /@types/d3-interpolate@3.0.4: - resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} - dependencies: - '@types/d3-color': 3.1.3 - dev: false - - /@types/d3-path@3.0.2: - resolution: {integrity: sha512-WAIEVlOCdd/NKRYTsqCpOMHQHemKBEINf8YXMYOtXH0GA7SY0dqMB78P3Uhgfy+4X+/Mlw2wDtlETkN6kQUCMA==} - dev: false - - /@types/d3-scale@4.0.8: - resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} + /@vercel/fun@1.1.0: + resolution: {integrity: sha512-SpuPAo+MlAYMtcMcC0plx7Tv4Mp7SQhJJj1iIENlOnABL24kxHpL09XLQMGzZIzIW7upR8c3edwgfpRtp+dhVw==} + engines: {node: '>= 10'} dependencies: - '@types/d3-time': 3.0.3 - dev: false - - /@types/d3-shape@3.1.6: - resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==} - dependencies: - '@types/d3-path': 3.0.2 - dev: false - - /@types/d3-time@3.0.3: - resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} - dev: false - - /@types/d3-timer@3.0.2: - resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} - dev: false - - /@types/debug@4.1.7: - resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} - dependencies: - '@types/ms': 0.7.31 + '@tootallnate/once': 2.0.0 + async-listen: 1.2.0 + debug: 4.1.1 + execa: 3.2.0 + fs-extra: 8.1.0 + generic-pool: 3.4.2 + micro: 9.3.5-canary.3 + ms: 2.1.1 + node-fetch: 2.6.7 + path-match: 1.2.4 + promisepipe: 3.0.0 + semver: 7.3.5 + stat-mode: 0.3.0 + stream-to-promise: 2.2.0 + tar: 4.4.18 + tree-kill: 1.2.2 + uid-promise: 1.0.0 + uuid: 3.3.2 + xdg-app-paths: 5.1.0 + yauzl-promise: 2.1.3 + transitivePeerDependencies: + - encoding + - supports-color dev: true - /@types/dlv@1.1.2: - resolution: {integrity: sha512-OyiZ3jEKu7RtGO1yp9oOdK0cTwZ/10oE9PDJ6fyN3r9T5wkyOcvr6awdugjYdqF6KVO5eUvt7jx7rk2Eylufow==} - dev: false - - /@types/docker-modem@3.0.2: - resolution: {integrity: sha512-qC7prjoEYR2QEe6SmCVfB1x3rfcQtUr1n4x89+3e0wSTMQ/KYCyf+/RAA9n2tllkkNc6//JMUZePdFRiGIWfaQ==} + /@vercel/gatsby-plugin-vercel-analytics@1.0.11: + resolution: {integrity: sha512-iTEA0vY6RBPuEzkwUTVzSHDATo1aF6bdLLspI68mQ/BTbi5UQEGjpjyzdKOVcSYApDtFU6M6vypZ1t4vIEnHvw==} dependencies: - '@types/node': 20.14.2 - '@types/ssh2': 1.11.11 + web-vitals: 0.2.4 dev: true - /@types/dockerode@3.3.16: - resolution: {integrity: sha512-ZAX2VrkTjwjk1808T8m6vMr+CFXSLiDD+tkEkLThI+v83AfzlYQZEWfZKwFyk1PWopSXkdDunmIhrF7sxt+zWg==} + /@vercel/gatsby-plugin-vercel-builder@2.0.12: + resolution: {integrity: sha512-S1RkywrUItewqg06T3L4cgYfiwi2BFngHIIerhOYhVuD9A+yfMgxnH5dkbu6nujmV1SEws+Q92wSiPfLPmO0eA==} dependencies: - '@types/docker-modem': 3.0.2 - '@types/node': 20.14.2 + '@sinclair/typebox': 0.25.24 + '@vercel/build-utils': 7.3.0 + '@vercel/routing-utils': 3.1.0 + esbuild: 0.14.47 + etag: 1.8.1 + fs-extra: 11.1.0 dev: true - /@types/eslint-scope@3.7.4: - resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} - dependencies: - '@types/eslint': 8.37.0 - '@types/estree': 1.0.5 - - /@types/eslint@8.37.0: - resolution: {integrity: sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==} - dependencies: - '@types/estree': 1.0.5 - '@types/json-schema': 7.0.15 - - /@types/estree@0.0.39: - resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} - - /@types/estree@1.0.1: - resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} - - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - - /@types/expect@1.20.4: - resolution: {integrity: sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==} - - /@types/express-serve-static-core@4.17.33: - resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} - dependencies: - '@types/node': 20.14.2 - '@types/qs': 6.9.7 - '@types/range-parser': 1.2.4 + /@vercel/go@3.0.4: + resolution: {integrity: sha512-hMIJm2xwU1HT56YRNF8HNOnIFNH7WnGl1l2D6lc6UJk7XdCCh1Dm0nsqLqki2SprTUh3I+53pTQaqgRsFGf06A==} + dev: true - /@types/express@4.17.17: - resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} + /@vercel/hydrogen@1.0.1: + resolution: {integrity: sha512-4PYk4LeIWPTjGtgnxvB0Hdw7aqCau843/96K2xX3z9pa0Hn//pUnZBMz2jrs5MRseCm1Li1LdQAK3u8/vaUnVQ==} dependencies: - '@types/body-parser': 1.19.2 - '@types/express-serve-static-core': 4.17.33 - '@types/qs': 6.9.7 - '@types/serve-static': 1.15.1 + '@vercel/static-config': 3.0.0 + ts-morph: 12.0.0 + dev: true - /@types/firebase@3.2.1: - resolution: {integrity: sha512-G8XgHMu2jHlElfc2xVNaYP50F0qrqeTCjgeG1v5b4SRwWG4XKC4fCuEdVZuZaMRmVygcnbRZBAo9O7RsDvmkGQ==} - deprecated: This is a stub types definition for Firebase API (https://www.firebase.com/docs/javascript/firebase). Firebase API provides its own type definitions, so you don't need @types/firebase installed! + /@vercel/next@4.0.15: + resolution: {integrity: sha512-BxMxIJrya7MS6IWrQIaQaYHPmq7WoZFLX909RBpNoAG5wgzrTrW756d2EsibBwGo7sQYBv2atyI5GqBIHzYbWg==} dependencies: - firebase: 10.4.0 + '@vercel/nft': 0.24.2 transitivePeerDependencies: - - '@react-native-async-storage/async-storage' - encoding + - supports-color dev: true - /@types/glob@7.2.0: - resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + /@vercel/nft@0.24.2: + resolution: {integrity: sha512-KhY3Ky/lCqE+fHpOXiKOLnXYJ49PZh1dyDSfVtZhmYtmica0NQgyO6kPOAGDNWqD9IOBx8hb65upxxjfnfa1JA==} + engines: {node: '>=16'} + hasBin: true dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 20.14.2 + '@mapbox/node-pre-gyp': 1.0.11 + '@rollup/pluginutils': 4.2.1 + acorn: 8.12.1 + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + micromatch: 4.0.7 + node-gyp-build: 4.8.1 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - supports-color dev: true - /@types/glob@8.1.0: - resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} - dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 20.14.2 - - /@types/graceful-fs@4.1.6: - resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} - dependencies: - '@types/node': 20.14.2 - - /@types/html-minifier-terser@6.1.0: - resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} - dev: false - - /@types/http-proxy@1.17.10: - resolution: {integrity: sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g==} - dependencies: - '@types/node': 20.14.2 - dev: false - - /@types/inquirer@9.0.3: - resolution: {integrity: sha512-CzNkWqQftcmk2jaCWdBTf9Sm7xSw4rkI1zpU/Udw3HX5//adEZUIm9STtoRP1qgWj0CWQtJ9UTvqmO2NNjhMJw==} + /@vercel/node@3.0.12: + resolution: {integrity: sha512-OiNHiUe1LX/CfDrQ07ntPsoYhJiC38mEeErYeqA6YNVAz3QGdX3pthiaIig2KPqeeYkEx5bSkVIqQtQOTJBuLQ==} dependencies: - '@types/through': 0.0.31 - rxjs: 7.8.0 + '@edge-runtime/node-utils': 2.2.1 + '@edge-runtime/primitives': 4.0.5 + '@edge-runtime/vm': 3.1.7 + '@types/node': 14.18.33 + '@vercel/build-utils': 7.3.0 + '@vercel/error-utils': 2.0.2 + '@vercel/nft': 0.24.2 + '@vercel/static-config': 3.0.0 + async-listen: 3.0.0 + edge-runtime: 2.5.7 + esbuild: 0.14.47 + etag: 1.8.1 + exit-hook: 2.2.1 + node-fetch: 2.6.9 + path-to-regexp: 6.2.1 + ts-morph: 12.0.0 + ts-node: 10.9.1(@types/node@14.18.33)(typescript@4.9.5) + typescript: 4.9.5 + undici: 5.26.5 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - encoding + - supports-color dev: true - /@types/istanbul-lib-coverage@2.0.4: - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} - - /@types/istanbul-lib-report@3.0.0: - resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - - /@types/istanbul-reports@3.0.1: - resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} - dependencies: - '@types/istanbul-lib-report': 3.0.0 + /@vercel/python@4.1.0: + resolution: {integrity: sha512-EIQXK5zL6fce0Barh74gc7xyLtRyvgmLZDIVQ8yJLtFxPlPCRY3GXkdJ7Jdcw8Pd0uuVF0vIHatv18xSLbcwtg==} + dev: true - /@types/jest@29.5.0: - resolution: {integrity: sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==} + /@vercel/redwood@2.0.5: + resolution: {integrity: sha512-9iWTxfMkC7yNnwN2xxOdptiIDAgXe1V1fh3aw92MWt5PBRcFY9RqgIPF7Q3Qa7yzQFgpbHwCnSTqWO+HCEuFtw==} dependencies: - expect: 29.5.0 - pretty-format: 29.5.0 + '@vercel/nft': 0.24.2 + '@vercel/routing-utils': 3.1.0 + semver: 6.3.1 + transitivePeerDependencies: + - encoding + - supports-color dev: true - /@types/jest@29.5.11: - resolution: {integrity: sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==} + /@vercel/remix-builder@2.0.14: + resolution: {integrity: sha512-c+ILERSRq404sf6kt0qWhYhuxWkkoTEm2FdLoUnVs21K6kzGtJMJbUExEHoPZvN9a0tq86ZU86jVvRZV6WL0cQ==} dependencies: - expect: 29.7.0 - pretty-format: 29.7.0 + '@vercel/nft': 0.24.2 + '@vercel/static-config': 3.0.0 + ts-morph: 12.0.0 + transitivePeerDependencies: + - encoding + - supports-color dev: true - /@types/jest@29.5.5: - resolution: {integrity: sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg==} + /@vercel/routing-utils@3.1.0: + resolution: {integrity: sha512-Ci5xTjVTJY/JLZXpCXpLehMft97i9fH34nu9PGav6DtwkVUF6TOPX86U0W0niQjMZ5n6/ZP0BwcJK2LOozKaGw==} dependencies: - expect: 29.5.0 - pretty-format: 29.5.0 + path-to-regexp: 6.1.0 + optionalDependencies: + ajv: 6.12.6 dev: true - /@types/js-cookie@2.2.7: - resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} - dev: false - - /@types/js-yaml@4.0.5: - resolution: {integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==} + /@vercel/ruby@2.0.4: + resolution: {integrity: sha512-EpZyfF6wFGzFDmubFIh/EZtYpKindmXx/69xSfKEBTVU0afgljyOOICbyZePe5tvigfOEBLSLgrt/2nN+MlLtA==} dev: true - /@types/json-schema@7.0.11: - resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} - - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - /@types/json5@0.0.29: - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - /@types/jsonwebtoken@9.0.3: - resolution: {integrity: sha512-b0jGiOgHtZ2jqdPgPnP6WLCXZk1T8p06A/vPGzUvxpFGgKMbjXJDjC5m52ErqBnIuWZFgGoIJyRdeG5AyreJjA==} + /@vercel/static-build@2.0.14: + resolution: {integrity: sha512-l5eQtJbk5Pc+P8XARDnpcbX4LnK3bGy7uf6S1aFOD4h6F8iBdg0agWTufZnq5BI91pcPVICPazM5BYhigIEznQ==} dependencies: - '@types/node': 20.14.2 - - /@types/linkify-it@3.0.2: - resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==} - requiresBuild: true - dev: false - optional: true - - /@types/lodash@4.14.192: - resolution: {integrity: sha512-km+Vyn3BYm5ytMO13k9KTp27O75rbQ0NFw+U//g+PX7VZyjCioXaRFisqSIJRECljcTv73G3i6BpglNGHgUQ5A==} - dev: true - - /@types/lodash@4.14.198: - resolution: {integrity: sha512-trNJ/vtMZYMLhfN45uLq4ShQSw0/S7xCTLLVM+WM1rmFpba/VS42jVUgaO3w/NOLiWR/09lnYk0yMaA/atdIsg==} + '@vercel/gatsby-plugin-vercel-analytics': 1.0.11 + '@vercel/gatsby-plugin-vercel-builder': 2.0.12 + '@vercel/static-config': 3.0.0 + ts-morph: 12.0.0 dev: true - /@types/lodash@4.14.200: - resolution: {integrity: sha512-YI/M/4HRImtNf3pJgbF+W6FrXovqj+T+/HpENLTooK9PnkacBsDpeP3IpHab40CClUfhNmdM2WTNP2sa2dni5Q==} + /@vercel/static-config@3.0.0: + resolution: {integrity: sha512-2qtvcBJ1bGY0dYGYh3iM7yGKkk971FujLEDXzuW5wcZsPr1GSEjO/w2iSr3qve6nDDtBImsGoDEnus5FI4+fIw==} + dependencies: + ajv: 8.6.3 + json-schema-to-ts: 1.6.4 + ts-morph: 12.0.0 dev: true - /@types/long@4.0.2: - resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} - dev: false - - /@types/markdown-it@12.2.3: - resolution: {integrity: sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==} - requiresBuild: true + /@webassemblyjs/ast@1.12.1: + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} dependencies: - '@types/linkify-it': 3.0.2 - '@types/mdurl': 1.0.2 - dev: false - optional: true - - /@types/mdurl@1.0.2: - resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==} - requiresBuild: true - dev: false - optional: true - - /@types/mime@3.0.1: - resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} - - /@types/minimatch@3.0.5: - resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - /@types/minimatch@5.1.2: - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + /@webassemblyjs/floating-point-hex-parser@1.11.6: + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - /@types/minimist@1.2.2: - resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} - dev: true + /@webassemblyjs/helper-api-error@1.11.6: + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - /@types/ms@0.7.31: - resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} - dev: true + /@webassemblyjs/helper-buffer@1.12.1: + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} - /@types/node-fetch@2.6.11: - resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} + /@webassemblyjs/helper-numbers@1.11.6: + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} dependencies: - '@types/node': 20.14.2 - form-data: 4.0.0 - dev: false - - /@types/node@14.18.33: - resolution: {integrity: sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==} - dev: true - - /@types/node@15.14.9: - resolution: {integrity: sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==} + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 - /@types/node@18.15.11: - resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} + /@webassemblyjs/helper-wasm-bytecode@1.11.6: + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - /@types/node@20.10.8: - resolution: {integrity: sha512-f8nQs3cLxbAFc00vEU59yf9UyGUftkPaLGfvbVOIDdx2i1b8epBqj2aNGyP19fiyXWvlmZ7qC1XLjAzw/OKIeA==} + /@webassemblyjs/helper-wasm-section@1.12.1: + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} dependencies: - undici-types: 5.26.5 - dev: true + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.12.1 - /@types/node@20.14.2: - resolution: {integrity: sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==} + /@webassemblyjs/ieee754@1.11.6: + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} dependencies: - undici-types: 5.26.5 + '@xtuc/ieee754': 1.2.0 - /@types/nodemailer@6.4.7: - resolution: {integrity: sha512-f5qCBGAn/f0qtRcd4SEn88c8Fp3Swct1731X4ryPKqS61/A3LmmzN8zaEz7hneJvpjFbUUgY7lru/B/7ODTazg==} + /@webassemblyjs/leb128@1.11.6: + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} dependencies: - '@types/node': 20.14.2 - dev: true - - /@types/normalize-package-data@2.4.1: - resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + '@xtuc/long': 4.2.2 - /@types/parse-json@4.0.0: - resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + /@webassemblyjs/utf8@1.11.6: + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - /@types/pg-cursor@2.7.2: - resolution: {integrity: sha512-m3xT8bVFCvx98LuzbvXyuCdT/Hjdd/v8ml4jL4K1QF70Y8clOfCFdgoaEB1FWdcSwcpoFYZTJQaMD9/GQ27efQ==} + /@webassemblyjs/wasm-edit@1.12.1: + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} dependencies: - '@types/node': 20.14.2 - '@types/pg': 8.6.6 - dev: false + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-opt': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/wast-printer': 1.12.1 - /@types/pg-promise@5.4.3: - resolution: {integrity: sha512-ABgy5hzmcyRZxLNG6HUafpxbpmXGeVJ5dopKwssEsFeA7rpRakdoodt75HJNIjQB4He+s3PTfG1AoWQWm7OuCg==} - deprecated: This is a stub types definition for pg-promise (https://github.com/vitaly-t/pg-promise). pg-promise provides its own type definitions, so you don't need @types/pg-promise installed! + /@webassemblyjs/wasm-gen@1.12.1: + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} dependencies: - pg-promise: 11.4.3 - transitivePeerDependencies: - - pg-native - dev: false + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 - /@types/pg-query-stream@3.4.0(pg@8.11.3): - resolution: {integrity: sha512-oqGAu+5CMPAVNqemN9xYT3LBDy2qXBke15cstEuVYIvJL6lcKSNKeG61fONlVrxTYIFi9sPuGVtIweanrEZcJw==} - deprecated: This is a stub types definition. pg-query-stream provides its own type definitions, so you do not need this installed. + /@webassemblyjs/wasm-opt@1.12.1: + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} dependencies: - pg-query-stream: 4.4.0(pg@8.11.3) - transitivePeerDependencies: - - pg - dev: true + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 - /@types/pg@8.6.6: - resolution: {integrity: sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==} + /@webassemblyjs/wasm-parser@1.12.1: + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} dependencies: - '@types/node': 20.14.2 - pg-protocol: 1.6.0 - pg-types: 2.2.0 - - /@types/prettier@2.7.2: - resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==} - - /@types/prop-types@15.7.5: - resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} - - /@types/q@1.5.5: - resolution: {integrity: sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==} - - /@types/qs@6.9.7: - resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} - - /@types/range-parser@1.2.4: - resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 - /@types/react-dom@18.0.11: - resolution: {integrity: sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==} + /@webassemblyjs/wast-printer@1.12.1: + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} dependencies: - '@types/react': 18.0.28 + '@webassemblyjs/ast': 1.12.1 + '@xtuc/long': 4.2.2 - /@types/react@18.0.28: - resolution: {integrity: sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==} + /@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.93.0): + resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x dependencies: - '@types/prop-types': 15.7.5 - '@types/scheduler': 0.16.3 - csstype: 3.1.2 + webpack: 5.93.0(webpack-cli@5.1.4) + webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) - /@types/readdir-glob@1.1.1: - resolution: {integrity: sha512-ImM6TmoF8bgOwvehGviEj3tRdRBbQujr1N+0ypaln/GWjaerOB26jb93vsRHmdMtvVQZQebOlqt2HROark87mQ==} + /@webpack-cli/generators@3.0.7(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0): + resolution: {integrity: sha512-H4dlEX8CzO5EHBYYZQop9x4w6lG9FenSF/1spLRlvRAULDgTs0VfmwOuwp03tTLml9jpMsouuVw6vEN8KpwE/w==} + engines: {node: '>=14.15.0'} + peerDependencies: + prettier: '*' + webpack: 5.x.x + webpack-cli: 5.x.x + peerDependenciesMeta: + prettier: + optional: true dependencies: - '@types/node': 20.14.2 - dev: true + prettier: 2.8.8 + webpack: 5.93.0(webpack-cli@5.1.4) + webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) + yeoman-environment: 3.19.3 + yeoman-generator: 5.10.0(yeoman-environment@3.19.3) + transitivePeerDependencies: + - bluebird + - encoding + - mem-fs + - supports-color - /@types/request@2.48.12: - resolution: {integrity: sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==} + /@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.93.0): + resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x dependencies: - '@types/caseless': 0.12.5 - '@types/node': 20.14.2 - '@types/tough-cookie': 4.0.5 - form-data: 2.5.1 - dev: false + webpack: 5.93.0(webpack-cli@5.1.4) + webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) - /@types/resolve@0.0.8: - resolution: {integrity: sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==} + /@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.93.0): + resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + webpack-dev-server: '*' + peerDependenciesMeta: + webpack-dev-server: + optional: true dependencies: - '@types/node': 20.14.2 - dev: true + webpack: 5.93.0(webpack-cli@5.1.4) + webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) - /@types/resolve@1.17.1: - resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} - dependencies: - '@types/node': 20.14.2 + /@xobotyi/scrollbar-width@1.9.5: + resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} dev: false - /@types/resolve@1.20.2: - resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - dev: true + /@xtuc/ieee754@1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - /@types/retry@0.12.0: - resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - dev: false + /@xtuc/long@4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - /@types/rimraf@3.0.2: - resolution: {integrity: sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==} - requiresBuild: true - dependencies: - '@types/glob': 8.1.0 - '@types/node': 20.14.2 + /abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead dev: false - optional: true - /@types/scheduler@0.16.3: - resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} - - /@types/semver@7.5.6: - resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - /@types/serve-index@1.9.1: - resolution: {integrity: sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==} - dependencies: - '@types/express': 4.17.17 + /abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: false - /@types/serve-static@1.15.1: - resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} dependencies: - '@types/mime': 3.0.1 - '@types/node': 20.14.2 + event-target-shim: 5.0.1 - /@types/sockjs@0.3.33: - resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} dependencies: - '@types/node': 20.14.2 - dev: false + mime-types: 2.1.35 + negotiator: 0.6.3 - /@types/ssh2-streams@0.1.9: - resolution: {integrity: sha512-I2J9jKqfmvXLR5GomDiCoHrEJ58hAOmFrekfFqmCFd+A6gaEStvWnPykoWUwld1PNg4G5ag1LwdA+Lz1doRJqg==} + /acorn-globals@6.0.0: + resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} dependencies: - '@types/node': 20.14.2 - dev: true + acorn: 7.4.1 + acorn-walk: 7.2.0 + dev: false - /@types/ssh2@0.5.52: - resolution: {integrity: sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==} + /acorn-import-attributes@1.9.5(acorn@8.12.1): + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 dependencies: - '@types/node': 20.14.2 - '@types/ssh2-streams': 0.1.9 - dev: true + acorn: 8.12.1 - /@types/ssh2@1.11.11: - resolution: {integrity: sha512-LdnE7UBpvHCgUznvn2fwLt2hkaENcKPFqOyXGkvyTLfxCXBN6roc1RmECNYuzzbHePzD3PaAov5rri9hehzx9Q==} + /acorn-jsx@5.3.2(acorn@8.12.1): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@types/node': 18.15.11 - dev: true - - /@types/stack-utils@2.0.1: - resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} - - /@types/strip-bom@3.0.0: - resolution: {integrity: sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==} - dev: true + acorn: 8.12.1 - /@types/strip-json-comments@0.0.30: - resolution: {integrity: sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==} - dev: true + /acorn-walk@7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} + dev: false - /@types/stripe@8.0.417: - resolution: {integrity: sha512-PTuqskh9YKNENnOHGVJBm4sM0zE8B1jZw1JIskuGAPkMB+OH236QeN8scclhYGPA4nG6zTtPXgwpXdp+HPDTVw==} - deprecated: This is a stub types definition. stripe provides its own type definitions, so you do not need this installed. + /acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} + engines: {node: '>=0.4.0'} dependencies: - stripe: 11.18.0 - dev: true + acorn: 8.12.1 - /@types/through@0.0.31: - resolution: {integrity: sha512-LpKpmb7FGevYgXnBXYs6HWnmiFyVG07Pt1cnbgM1IhEacITTiUaBXXvOR3Y50ksaJWGSfhbEvQFivQEFGCC55w==} - dependencies: - '@types/node': 20.14.2 - dev: true + /acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true - /@types/tough-cookie@4.0.5: - resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - dev: false + /acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true - /@types/trusted-types@2.0.3: - resolution: {integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==} + /address@1.2.2: + resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} + engines: {node: '>= 10.0.0'} dev: false - /@types/vinyl@2.0.7: - resolution: {integrity: sha512-4UqPv+2567NhMQuMLdKAyK4yzrfCqwaTt6bLhHEs8PFcxbHILsrxaY63n4wgE/BRLDWDQeI+WcTmkXKExh9hQg==} + /adjust-sourcemap-loader@4.0.0: + resolution: {integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==} + engines: {node: '>=8.9'} dependencies: - '@types/expect': 1.20.4 - '@types/node': 20.14.2 - - /@types/web@0.0.69: - resolution: {integrity: sha512-0CqMxeJ+ETljejsVQ5U6gV75C9zz9nmCBXHYqdfnVmWp54VfoJSxUgeO6NI+ezgBl0JQsSiZCs2pkCCT9ERhbA==} - dev: true - - /@types/webidl-conversions@7.0.0: - resolution: {integrity: sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==} + loader-utils: 2.0.4 + regex-parser: 2.3.0 dev: false - /@types/webpack@5.28.5(webpack-cli@5.1.4): - resolution: {integrity: sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==} + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} dependencies: - '@types/node': 20.14.2 - tapable: 2.2.1 - webpack: 5.91.0(webpack-cli@5.1.4) + debug: 4.3.6 transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - webpack-cli - dev: true - - /@types/whatwg-url@11.0.4: - resolution: {integrity: sha512-lXCmTWSHJvf0TRSO58nm978b8HJ/EdsSsEKLd3ODHFjo+3VGAyyTp4v50nWvwtzBxSMQrVOK7tcuN0zGPLICMw==} - dependencies: - '@types/webidl-conversions': 7.0.0 - dev: false + - supports-color - /@types/ws@8.5.4: - resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} + /agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + engines: {node: '>= 14'} dependencies: - '@types/node': 20.14.2 + debug: 4.3.6 + transitivePeerDependencies: + - supports-color dev: false - /@types/yargs-parser@21.0.0: - resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} - - /@types/yargs@16.0.5: - resolution: {integrity: sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==} + /agentkeepalive@4.3.0: + resolution: {integrity: sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==} + engines: {node: '>= 8.0.0'} dependencies: - '@types/yargs-parser': 21.0.0 - dev: false + debug: 4.3.6 + depd: 2.0.0 + humanize-ms: 1.2.1 + transitivePeerDependencies: + - supports-color - /@types/yargs@17.0.24: - resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} dependencies: - '@types/yargs-parser': 21.0.0 + clean-stack: 2.2.0 + indent-string: 4.0.0 - /@typescript-eslint/eslint-plugin@5.58.0(@typescript-eslint/parser@5.58.0)(eslint@8.55.0)(typescript@5.3.3): - resolution: {integrity: sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /ajv-formats@2.1.1(ajv@8.12.0): + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' + ajv: ^8.0.0 peerDependenciesMeta: - typescript: + ajv: optional: true dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 5.58.0(eslint@8.55.0)(typescript@5.3.3) - '@typescript-eslint/scope-manager': 5.58.0 - '@typescript-eslint/type-utils': 5.58.0(eslint@8.55.0)(typescript@5.3.3) - '@typescript-eslint/utils': 5.58.0(eslint@8.55.0)(typescript@5.3.3) - debug: 4.3.4 - eslint: 8.55.0 - grapheme-splitter: 1.0.4 - ignore: 5.2.4 - natural-compare-lite: 1.4.0 - semver: 7.5.4 - tsutils: 3.21.0(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: false + ajv: 8.12.0 - /@typescript-eslint/eslint-plugin@6.13.1(@typescript-eslint/parser@6.13.1)(eslint@8.55.0)(typescript@5.3.3): - resolution: {integrity: sha512-5bQDGkXaxD46bPvQt08BUz9YSaO4S0fB1LB5JHQuXTfkGPI3+UUeS387C/e9jRie5GqT8u5kFTrMvAjtX4O5kA==} - engines: {node: ^16.0.0 || >=18.0.0} + /ajv-keywords@3.5.2(ajv@6.12.6): + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + ajv: ^6.9.1 dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.13.1(eslint@8.55.0)(typescript@5.3.3) - '@typescript-eslint/scope-manager': 6.13.1 - '@typescript-eslint/type-utils': 6.13.1(eslint@8.55.0)(typescript@5.3.3) - '@typescript-eslint/utils': 6.13.1(eslint@8.55.0)(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 6.13.1 - debug: 4.3.4 - eslint: 8.55.0 - graphemer: 1.4.0 - ignore: 5.2.4 - natural-compare: 1.4.0 - semver: 7.5.4 - ts-api-utils: 1.2.1(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: true + ajv: 6.12.6 - /@typescript-eslint/experimental-utils@5.58.0(eslint@8.55.0)(typescript@5.3.3): - resolution: {integrity: sha512-LA/sRPaynZlrlYxdefrZbMx8dqs/1Kc0yNG+XOk5CwwZx7tTv263ix3AJNioF0YBVt7hADpAUR20owl6pv4MIQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /ajv-keywords@5.1.0(ajv@8.12.0): + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + ajv: ^8.8.2 dependencies: - '@typescript-eslint/utils': 5.58.0(eslint@8.55.0)(typescript@5.3.3) - eslint: 8.55.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: false + ajv: 8.12.0 + fast-deep-equal: 3.1.3 - /@typescript-eslint/parser@5.58.0(eslint@8.24.0)(typescript@5.3.3): - resolution: {integrity: sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: - '@typescript-eslint/scope-manager': 5.58.0 - '@typescript-eslint/types': 5.58.0 - '@typescript-eslint/typescript-estree': 5.58.0(typescript@5.3.3) - debug: 4.3.4 - eslint: 8.24.0 - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + /ajv@8.6.3: + resolution: {integrity: sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 dev: true - /@typescript-eslint/parser@5.58.0(eslint@8.29.0)(typescript@5.3.3): - resolution: {integrity: sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /alphanum-sort@1.0.2: + resolution: {integrity: sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==} + dev: true + + /analytics-utils@1.0.12(@types/dlv@1.1.4): + resolution: {integrity: sha512-WvV2YWgsnXLxaY0QYux0crpBAg/0JA763NmbMVz22jKhMPo7dpTBet8G2IlF7ixTjLDzGlkHk1ZaKqqQmjJ+4w==} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@types/dlv': ^1.0.0 dependencies: - '@typescript-eslint/scope-manager': 5.58.0 - '@typescript-eslint/types': 5.58.0 - '@typescript-eslint/typescript-estree': 5.58.0(typescript@5.3.3) - debug: 4.3.4 - eslint: 8.29.0 - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color + '@analytics/type-utils': 0.6.2 + '@types/dlv': 1.1.4 + dlv: 1.1.3 dev: false - /@typescript-eslint/parser@5.58.0(eslint@8.55.0)(typescript@5.3.3): - resolution: {integrity: sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + /analytics@0.8.9(@types/dlv@1.1.4): + resolution: {integrity: sha512-oTbUzQpncMTslakqfK70GgB6bopk5hY+uuekwnadMkDyqNLgcD02KRzteTnO7q5Ko6wDECVtT8xi/6OuAMZykA==} dependencies: - '@typescript-eslint/scope-manager': 5.58.0 - '@typescript-eslint/types': 5.58.0 - '@typescript-eslint/typescript-estree': 5.58.0(typescript@5.3.3) - debug: 4.3.4 - eslint: 8.55.0 - typescript: 5.3.3 + '@analytics/core': 0.12.15(@types/dlv@1.1.4) + '@analytics/storage-utils': 0.4.2 transitivePeerDependencies: - - supports-color + - '@types/dlv' dev: false - /@typescript-eslint/parser@6.13.1(eslint@8.55.0)(typescript@5.3.3): - resolution: {integrity: sha512-fs2XOhWCzRhqMmQf0eicLa/CWSaYss2feXsy7xBD/pLyWke/jCIVc2s1ikEAtSW7ina1HNhv7kONoEfVNEcdDQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + /ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} dependencies: - '@typescript-eslint/scope-manager': 6.13.1 - '@typescript-eslint/types': 6.13.1 - '@typescript-eslint/typescript-estree': 6.13.1(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 6.13.1 - debug: 4.3.4 - eslint: 8.55.0 - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: true + string-width: 4.2.3 + dev: false - /@typescript-eslint/scope-manager@5.58.0: - resolution: {integrity: sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.58.0 - '@typescript-eslint/visitor-keys': 5.58.0 + /ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + dev: false - /@typescript-eslint/scope-manager@6.13.1: - resolution: {integrity: sha512-BW0kJ7ceiKi56GbT2KKzZzN+nDxzQK2DS6x0PiSMPjciPgd/JRQGMibyaN2cPt2cAvuoH0oNvn2fwonHI+4QUQ==} - engines: {node: ^16.0.0 || >=18.0.0} + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} dependencies: - '@typescript-eslint/types': 6.13.1 - '@typescript-eslint/visitor-keys': 6.13.1 - dev: true + type-fest: 0.21.3 - /@typescript-eslint/type-utils@5.58.0(eslint@8.55.0)(typescript@5.3.3): - resolution: {integrity: sha512-FF5vP/SKAFJ+LmR9PENql7fQVVgGDOS+dq3j+cKl9iW/9VuZC/8CFmzIP0DLKXfWKpRHawJiG70rVH+xZZbp8w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 5.58.0(typescript@5.3.3) - '@typescript-eslint/utils': 5.58.0(eslint@8.55.0)(typescript@5.3.3) - debug: 4.3.4 - eslint: 8.55.0 - tsutils: 3.21.0(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color + /ansi-html-community@0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.0} + hasBin: true dev: false - /@typescript-eslint/type-utils@6.13.1(eslint@8.55.0)(typescript@5.3.3): - resolution: {integrity: sha512-A2qPlgpxx2v//3meMqQyB1qqTg1h1dJvzca7TugM3Yc2USDY+fsRBiojAEo92HO7f5hW5mjAUF6qobOPzlBCBQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 6.13.1(typescript@5.3.3) - '@typescript-eslint/utils': 6.13.1(eslint@8.55.0)(typescript@5.3.3) - debug: 4.3.4 - eslint: 8.55.0 - ts-api-utils: 1.2.1(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: true + /ansi-html@0.0.9: + resolution: {integrity: sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==} + engines: {'0': node >= 0.8.0} + hasBin: true + dev: false - /@typescript-eslint/types@5.58.0: - resolution: {integrity: sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} - /@typescript-eslint/types@6.13.1: - resolution: {integrity: sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg==} - engines: {node: ^16.0.0 || >=18.0.0} + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + /ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} dev: true - /@typescript-eslint/typescript-estree@5.58.0(typescript@5.3.3): - resolution: {integrity: sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} dependencies: - '@typescript-eslint/types': 5.58.0 - '@typescript-eslint/visitor-keys': 5.58.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - tsutils: 3.21.0(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color + color-convert: 1.9.3 - /@typescript-eslint/typescript-estree@6.13.1(typescript@5.3.3): - resolution: {integrity: sha512-sBLQsvOC0Q7LGcUHO5qpG1HxRgePbT6wwqOiGLpR8uOJvPJbfs0mW3jPA3ujsDvfiVwVlWUDESNXv44KtINkUQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} dependencies: - '@typescript-eslint/types': 6.13.1 - '@typescript-eslint/visitor-keys': 6.13.1 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - ts-api-utils: 1.2.1(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: true + color-convert: 2.0.1 - /@typescript-eslint/utils@5.58.0(eslint@8.55.0)(typescript@5.3.3): - resolution: {integrity: sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + /ansi-to-html@0.7.2: + resolution: {integrity: sha512-v6MqmEpNlxF+POuyhKkidusCHWWkaLcGRURzivcU3I9tv7k4JVhFcnukrM5Rlk2rUywdZuzYAZ+kbZqWCnfN3g==} + engines: {node: '>=8.0.0'} + hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.6 - '@typescript-eslint/scope-manager': 5.58.0 - '@typescript-eslint/types': 5.58.0 - '@typescript-eslint/typescript-estree': 5.58.0(typescript@5.3.3) - eslint: 8.55.0 - eslint-scope: 5.1.1 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - dev: false + entities: 2.2.0 + dev: true - /@typescript-eslint/utils@6.13.1(eslint@8.55.0)(typescript@5.3.3): - resolution: {integrity: sha512-ouPn/zVoan92JgAegesTXDB/oUp6BP1v8WpfYcqh649ejNc9Qv+B4FF2Ff626kO1xg0wWwwG48lAJ4JuesgdOw==} - engines: {node: ^16.0.0 || >=18.0.0} + /antd@5.19.4(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-bhSNzeScfaeN85LrQXZh5fD26y6uB+6c5cgoPUmW7lkC5oDN4mnT04yYcpqHpZD8p227AmycE+ZrcnilJH9log==} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.6 - '@typescript-eslint/scope-manager': 6.13.1 - '@typescript-eslint/types': 6.13.1 - '@typescript-eslint/typescript-estree': 6.13.1(typescript@5.3.3) - eslint: 8.55.0 - semver: 7.5.4 + '@ant-design/colors': 7.1.0 + '@ant-design/cssinjs': 1.21.0(react-dom@18.3.1)(react@18.3.1) + '@ant-design/cssinjs-utils': 1.0.3(react-dom@18.3.1)(react@18.3.1) + '@ant-design/icons': 5.4.0(react-dom@18.3.1)(react@18.3.1) + '@ant-design/react-slick': 1.1.2(react@18.3.1) + '@babel/runtime': 7.25.0 + '@ctrl/tinycolor': 3.6.1 + '@rc-component/color-picker': 1.5.3(react-dom@18.3.1)(react@18.3.1) + '@rc-component/mutate-observer': 1.1.0(react-dom@18.3.1)(react@18.3.1) + '@rc-component/qrcode': 1.0.0(react-dom@18.3.1)(react@18.3.1) + '@rc-component/tour': 1.15.0(react-dom@18.3.1)(react@18.3.1) + '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + copy-to-clipboard: 3.3.3 + dayjs: 1.11.12 + rc-cascader: 3.27.0(react-dom@18.3.1)(react@18.3.1) + rc-checkbox: 3.3.0(react-dom@18.3.1)(react@18.3.1) + rc-collapse: 3.7.3(react-dom@18.3.1)(react@18.3.1) + rc-dialog: 9.5.2(react-dom@18.3.1)(react@18.3.1) + rc-drawer: 7.2.0(react-dom@18.3.1)(react@18.3.1) + rc-dropdown: 4.2.0(react-dom@18.3.1)(react@18.3.1) + rc-field-form: 2.2.1(react-dom@18.3.1)(react@18.3.1) + rc-image: 7.9.0(react-dom@18.3.1)(react@18.3.1) + rc-input: 1.5.1(react-dom@18.3.1)(react@18.3.1) + rc-input-number: 9.1.0(react-dom@18.3.1)(react@18.3.1) + rc-mentions: 2.14.0(react-dom@18.3.1)(react@18.3.1) + rc-menu: 9.14.1(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) + rc-notification: 5.6.0(react-dom@18.3.1)(react@18.3.1) + rc-pagination: 4.2.0(react-dom@18.3.1)(react@18.3.1) + rc-picker: 4.6.10(dayjs@1.11.12)(react-dom@18.3.1)(react@18.3.1) + rc-progress: 4.0.0(react-dom@18.3.1)(react@18.3.1) + rc-rate: 2.13.0(react-dom@18.3.1)(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) + rc-segmented: 2.3.0(react-dom@18.3.1)(react@18.3.1) + rc-select: 14.15.1(react-dom@18.3.1)(react@18.3.1) + rc-slider: 10.6.2(react-dom@18.3.1)(react@18.3.1) + rc-steps: 6.0.1(react-dom@18.3.1)(react@18.3.1) + rc-switch: 4.1.0(react-dom@18.3.1)(react@18.3.1) + rc-table: 7.45.7(react-dom@18.3.1)(react@18.3.1) + rc-tabs: 15.1.1(react-dom@18.3.1)(react@18.3.1) + rc-textarea: 1.7.0(react-dom@18.3.1)(react@18.3.1) + rc-tooltip: 6.2.0(react-dom@18.3.1)(react@18.3.1) + rc-tree: 5.8.8(react-dom@18.3.1)(react@18.3.1) + rc-tree-select: 5.22.1(react-dom@18.3.1)(react@18.3.1) + rc-upload: 4.6.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + scroll-into-view-if-needed: 3.1.0 + throttle-debounce: 5.0.2 transitivePeerDependencies: - - supports-color - - typescript - dev: true + - date-fns + - luxon + - moment - /@typescript-eslint/visitor-keys@5.58.0: - resolution: {integrity: sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.58.0 - eslint-visitor-keys: 3.4.3 + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - /@typescript-eslint/visitor-keys@6.13.1: - resolution: {integrity: sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ==} - engines: {node: ^16.0.0 || >=18.0.0} + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} dependencies: - '@typescript-eslint/types': 6.13.1 - eslint-visitor-keys: 3.4.3 - dev: true + normalize-path: 3.0.0 + picomatch: 2.3.1 - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + /aproba@1.2.0: + resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} + dev: false - /@vercel/build-utils@7.2.1: - resolution: {integrity: sha512-WCqSBCPNlANEOsmroCzCZq6ZxArV20RHBbdaZzhZjkGtEReSZx5BSOsrnkewFJFuu5pNGYegAaVi0VCkA1irZQ==} - dev: true + /aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - /@vercel/error-utils@2.0.1: - resolution: {integrity: sha512-ZUVpRFArh5eyKpJmdfEuCaMpZKQvZgUq0pQ7PdK8m5FgRYEvF4I0TMJH3JnkbYaMMUH82aYWZr+/hFJtEBcmTQ==} + /archiver-utils@2.1.0: + resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} + engines: {node: '>= 6'} + dependencies: + glob: 7.2.3 + graceful-fs: 4.2.11 + lazystream: 1.0.1 + lodash.defaults: 4.2.0 + lodash.difference: 4.5.0 + lodash.flatten: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.union: 4.6.0 + normalize-path: 3.0.0 + readable-stream: 2.3.8 dev: true - /@vercel/fun@1.1.0: - resolution: {integrity: sha512-SpuPAo+MlAYMtcMcC0plx7Tv4Mp7SQhJJj1iIENlOnABL24kxHpL09XLQMGzZIzIW7upR8c3edwgfpRtp+dhVw==} + /archiver-utils@3.0.4: + resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==} engines: {node: '>= 10'} dependencies: - '@tootallnate/once': 2.0.0 - async-listen: 1.2.0 - debug: 4.1.1 - execa: 3.2.0 - fs-extra: 8.1.0 - generic-pool: 3.4.2 - micro: 9.3.5-canary.3 - ms: 2.1.1 - node-fetch: 2.6.7 - path-match: 1.2.4 - promisepipe: 3.0.0 - semver: 7.3.5 - stat-mode: 0.3.0 - stream-to-promise: 2.2.0 - tar: 4.4.18 - tree-kill: 1.2.2 - uid-promise: 1.0.0 - uuid: 3.3.2 - xdg-app-paths: 5.1.0 - yauzl-promise: 2.1.3 - transitivePeerDependencies: - - encoding - - supports-color + glob: 7.2.3 + graceful-fs: 4.2.11 + lazystream: 1.0.1 + lodash.defaults: 4.2.0 + lodash.difference: 4.5.0 + lodash.flatten: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.union: 4.6.0 + normalize-path: 3.0.0 + readable-stream: 3.6.2 dev: true - /@vercel/gatsby-plugin-vercel-analytics@1.0.11: - resolution: {integrity: sha512-iTEA0vY6RBPuEzkwUTVzSHDATo1aF6bdLLspI68mQ/BTbi5UQEGjpjyzdKOVcSYApDtFU6M6vypZ1t4vIEnHvw==} + /archiver@5.3.2: + resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==} + engines: {node: '>= 10'} dependencies: - web-vitals: 0.2.4 + archiver-utils: 2.1.0 + async: 3.2.5 + buffer-crc32: 0.2.13 + readable-stream: 3.6.2 + readdir-glob: 1.1.3 + tar-stream: 2.2.0 + zip-stream: 4.1.1 dev: true - /@vercel/gatsby-plugin-vercel-builder@2.0.6: - resolution: {integrity: sha512-ne6Xkqm/Naxc6KON3RwhE3irJVevCRwdMp+VMSXgC8ik+q9tWxtmMa4tbdnregKWEk1cw3ToHN6MkXRdcchpYA==} + /are-we-there-yet@1.1.7: + resolution: {integrity: sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==} + deprecated: This package is no longer supported. dependencies: - '@sinclair/typebox': 0.25.24 - '@vercel/build-utils': 7.2.1 - '@vercel/routing-utils': 3.0.0 - esbuild: 0.14.47 - etag: 1.8.1 - fs-extra: 11.1.0 - dev: true - - /@vercel/go@3.0.2: - resolution: {integrity: sha512-g1i1X/h6SfIiCj+wVfNPZPqxhoOQbQXDximoGywTgKpRWZD40ReAjYIL4siemsHHX26ihhaJX2eHX8vWyQ57EQ==} - dev: true + delegates: 1.0.0 + readable-stream: 2.3.8 + dev: false - /@vercel/hydrogen@1.0.1: - resolution: {integrity: sha512-4PYk4LeIWPTjGtgnxvB0Hdw7aqCau843/96K2xX3z9pa0Hn//pUnZBMz2jrs5MRseCm1Li1LdQAK3u8/vaUnVQ==} + /are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. dependencies: - '@vercel/static-config': 3.0.0 - ts-morph: 12.0.0 - dev: true + delegates: 1.0.0 + readable-stream: 3.6.2 - /@vercel/next@4.0.8: - resolution: {integrity: sha512-rKP63aGivXyw6ihNL+P67qxIQ0de5OTzGV5s650GzkF1RwNLs3coy1NSWlspWL3SlaAXwqWJSIQmhcA8EYaSKA==} + /are-we-there-yet@3.0.1: + resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. dependencies: - '@vercel/nft': 0.24.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: true + delegates: 1.0.0 + readable-stream: 3.6.2 - /@vercel/nft@0.24.1: - resolution: {integrity: sha512-bGYrA/w98LNl9edxXcAezKs+Ixa2a+RkAvxXK38gH3815v+WkNa2AGY+wQv59vu2f9il9+zIKj6YrnlYIbh+jA==} - engines: {node: '>=16'} - hasBin: true - dependencies: - '@mapbox/node-pre-gyp': 1.0.10 - '@rollup/pluginutils': 4.2.1 - acorn: 8.11.3 - async-sema: 3.1.1 - bindings: 1.5.0 - estree-walker: 2.0.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - micromatch: 4.0.5 - node-gyp-build: 4.6.0 - resolve-from: 5.0.0 - transitivePeerDependencies: - - encoding - - supports-color + /arg@4.1.0: + resolution: {integrity: sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==} dev: true - /@vercel/node@3.0.6: - resolution: {integrity: sha512-QYsmc5rtuyjSAryAo4qRwsEw9NXhapAbF/OBM0Fdq3kPiwHDfbElJpb7UbeQH19u3q4d+E7Z6wZTbO6bsrzw4g==} - dependencies: - '@edge-runtime/node-utils': 2.2.1 - '@edge-runtime/primitives': 3.1.1 - '@edge-runtime/vm': 3.1.1 - '@types/node': 14.18.33 - '@vercel/build-utils': 7.2.1 - '@vercel/error-utils': 2.0.1 - '@vercel/nft': 0.24.1 - '@vercel/static-config': 3.0.0 - async-listen: 3.0.0 - edge-runtime: 2.5.1 - esbuild: 0.14.47 - etag: 1.8.1 - exit-hook: 2.2.1 - node-fetch: 2.6.9 - path-to-regexp: 6.2.1 - ts-morph: 12.0.0 - ts-node: 10.9.1(@types/node@14.18.33)(typescript@4.9.5) - typescript: 4.9.5 - undici: 5.23.0 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - encoding - - supports-color - dev: true + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - /@vercel/python@4.0.2: - resolution: {integrity: sha512-mmUeR3GBuDnaJK3IIHRoPl3bNevcWO3N/YrNAx+zxLPSHzfzmCLZbFVVXbzoKBi/cALiOPcApVhlQXwU26y7xg==} - dev: true + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - /@vercel/redwood@2.0.3: - resolution: {integrity: sha512-efUqJjRxRhB+nw6OpYw3ptQyXAoWKA/qnzz1UKWfcL2yunCDrdvh2IL3O+Kjt2YqixJAH6DTK1B8lc6NhMoY/g==} + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: - '@vercel/nft': 0.24.1 - '@vercel/routing-utils': 3.0.0 - semver: 6.3.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: true + sprintf-js: 1.0.3 - /@vercel/remix-builder@2.0.8: - resolution: {integrity: sha512-PQA4Iu47qKOEyOa0WqS3u9lSnVEGfq/9ZVY6+IlZfR1+bmCVx7c2PW7BOSBucwhn1qMD6TF2kka0fz48UXpVXQ==} - dependencies: - '@vercel/nft': 0.24.1 - '@vercel/static-config': 3.0.0 - ts-morph: 12.0.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: true + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - /@vercel/routing-utils@3.0.0: - resolution: {integrity: sha512-u+SoHnL+RzRQIRP+YxvigzzKXQcbgYQF9qCTIuWuoLw5h9thIYWcDJvz3KxrUzxjGZ3dWboXA29KAlT6eeaeFw==} + /aria-query@5.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} dependencies: - path-to-regexp: 6.1.0 - optionalDependencies: - ajv: 6.12.6 - dev: true - - /@vercel/ruby@2.0.2: - resolution: {integrity: sha512-MqFynhtZ905L210DWAbgkiEQEK39LTtp9eL2Nm6PjzhjNzU6hV0UfK8Z24vU9CC6J4mrUTTZx396fH7XTYJWqg==} - dev: true + deep-equal: 2.2.3 - /@vercel/static-build@2.0.7: - resolution: {integrity: sha512-MjEgxf9HaK7tjVqS/bSlVSGBxFw3hNHdrVEoGJNwMZEfocgBiFxFGaw0Vxki8FTs+F3cciXdxwi6+O1bjj91GA==} + /aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} dependencies: - '@vercel/gatsby-plugin-vercel-analytics': 1.0.11 - '@vercel/gatsby-plugin-vercel-builder': 2.0.6 - '@vercel/static-config': 3.0.0 - ts-morph: 12.0.0 + dequal: 2.0.3 dev: true - /@vercel/static-config@3.0.0: - resolution: {integrity: sha512-2qtvcBJ1bGY0dYGYh3iM7yGKkk971FujLEDXzuW5wcZsPr1GSEjO/w2iSr3qve6nDDtBImsGoDEnus5FI4+fIw==} + /array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} dependencies: - ajv: 8.6.3 - json-schema-to-ts: 1.6.4 - ts-morph: 12.0.0 - dev: true + call-bind: 1.0.7 + is-array-buffer: 3.0.4 - /@webassemblyjs/ast@1.12.1: - resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} - dependencies: - '@webassemblyjs/helper-numbers': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + /array-differ@3.0.0: + resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} + engines: {node: '>=8'} - /@webassemblyjs/floating-point-hex-parser@1.11.6: - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + /array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - /@webassemblyjs/helper-api-error@1.11.6: - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + /array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + is-string: 1.0.7 - /@webassemblyjs/helper-buffer@1.12.1: - resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + /array-tree-filter@2.1.0: + resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==} - /@webassemblyjs/helper-numbers@1.11.6: - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + /array-union@1.0.2: + resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} + engines: {node: '>=0.10.0'} dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.11.6 - '@webassemblyjs/helper-api-error': 1.11.6 - '@xtuc/long': 4.2.2 + array-uniq: 1.0.3 + dev: true - /@webassemblyjs/helper-wasm-bytecode@1.11.6: - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} - /@webassemblyjs/helper-wasm-section@1.12.1: - resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} - dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/wasm-gen': 1.12.1 + /array-uniq@1.0.3: + resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} + engines: {node: '>=0.10.0'} + dev: true - /@webassemblyjs/ieee754@1.11.6: - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + /array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} dependencies: - '@xtuc/ieee754': 1.2.0 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 - /@webassemblyjs/leb128@1.11.6: - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + /array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} dependencies: - '@xtuc/long': 4.2.2 - - /@webassemblyjs/utf8@1.11.6: - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 - /@webassemblyjs/wasm-edit@1.12.1: - resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + /array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/helper-wasm-section': 1.12.1 - '@webassemblyjs/wasm-gen': 1.12.1 - '@webassemblyjs/wasm-opt': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 - '@webassemblyjs/wast-printer': 1.12.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 - /@webassemblyjs/wasm-gen@1.12.1: - resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + /array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 - /@webassemblyjs/wasm-opt@1.12.1: - resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + /array.prototype.reduce@1.0.7: + resolution: {integrity: sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==} + engines: {node: '>= 0.4'} dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 - '@webassemblyjs/wasm-gen': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-array-method-boxes-properly: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + is-string: 1.0.7 - /@webassemblyjs/wasm-parser@1.12.1: - resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + /array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-api-error': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-shim-unscopables: 1.0.2 - /@webassemblyjs/wast-printer@1.12.1: - resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + /arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} dependencies: - '@webassemblyjs/ast': 1.12.1 - '@xtuc/long': 4.2.2 + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 - /@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.91.0): - resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - dependencies: - webpack: 5.91.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.91.0) + /arrify@2.0.1: + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} - /@webpack-cli/generators@3.0.7(mem-fs-editor@9.7.0)(mem-fs@2.3.0)(prettier@2.8.7)(webpack-cli@5.1.4)(webpack@5.91.0): - resolution: {integrity: sha512-H4dlEX8CzO5EHBYYZQop9x4w6lG9FenSF/1spLRlvRAULDgTs0VfmwOuwp03tTLml9jpMsouuVw6vEN8KpwE/w==} - engines: {node: '>=14.15.0'} - peerDependencies: - prettier: '*' - webpack: 5.x.x - webpack-cli: 5.x.x - peerDependenciesMeta: - prettier: - optional: true - dependencies: - prettier: 2.8.7 - webpack: 5.91.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.91.0) - yeoman-environment: 3.15.1(mem-fs-editor@9.7.0)(mem-fs@2.3.0) - yeoman-generator: 5.8.0(mem-fs@2.3.0)(yeoman-environment@3.15.1) - transitivePeerDependencies: - - bluebird - - encoding - - mem-fs - - mem-fs-editor - - supports-color + /asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - /@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.91.0): - resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x + /asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} dependencies: - webpack: 5.91.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.91.0) + safer-buffer: 2.1.2 + dev: true - /@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.91.0): - resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - webpack-dev-server: '*' - peerDependenciesMeta: - webpack-dev-server: - optional: true - dependencies: - webpack: 5.91.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.91.0) - - /@xobotyi/scrollbar-width@1.9.5: - resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} + /assert-options@0.8.1: + resolution: {integrity: sha512-5lNGRB5g5i2bGIzb+J1QQE1iKU/WEMVBReFIc5pPDWjcPj23otPL0eI6PB2v7QPi0qU6Mhym5D3y0ZiSIOf3GA==} + engines: {node: '>=10.0.0'} dev: false - /@xtuc/ieee754@1.2.0: - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + /assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + dev: false - /@xtuc/long@4.2.2: - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + /ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - /abab@2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - dev: false + /async-listen@1.2.0: + resolution: {integrity: sha512-CcEtRh/oc9Jc4uWeUwdpG/+Mb2YUHKmdaTf0gUr7Wa+bfp4xx70HOb3RuSTJMvqKNB1TkdTfjLdrcz2X4rkkZA==} + dev: true - /abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + /async-listen@3.0.0: + resolution: {integrity: sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg==} + engines: {node: '>= 14'} + dev: true - /abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - dependencies: - event-target-shim: 5.0.1 - dev: false + /async-listen@3.0.1: + resolution: {integrity: sha512-cWMaNwUJnf37C/S5TfCkk/15MwbPRwVYALA2jtjkbHjCmAPiDXyNJy2q3p1KAZzDLHAWyarUWSujUoHR4pEgrA==} + engines: {node: '>= 14'} + dev: true - /accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 + /async-lock@1.4.1: + resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==} + dev: true - /acorn-globals@6.0.0: - resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} + /async-retry@1.3.3: + resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + requiresBuild: true dependencies: - acorn: 7.4.1 - acorn-walk: 7.2.0 + retry: 0.13.1 dev: false + optional: true - /acorn-import-assertions@1.9.0(acorn@8.11.3): - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} - peerDependencies: - acorn: ^8 - dependencies: - acorn: 8.11.3 + /async-sema@3.1.1: + resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + dev: true - /acorn-jsx@5.3.2(acorn@8.11.3): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.11.3 + /async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} - /acorn-walk@7.2.0: - resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} - engines: {node: '>=0.4.0'} + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: false - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} + /asyncro@3.0.0: + resolution: {integrity: sha512-nEnWYfrBmA3taTiuiOoZYmgJ/CNrSoQLeLs29SeLcPu60yaw/mHDBHV0iOZ051fTvsTHxpCY+gXibqT9wbQYfg==} + dev: true - /acorn@7.4.1: - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} - engines: {node: '>=0.4.0'} - hasBin: true + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: false - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} + /autoprefixer@10.4.19(postcss@8.4.40): + resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} + engines: {node: ^10 || ^12 || >=14} hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.23.2 + caniuse-lite: 1.0.30001645 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.1 + postcss: 8.4.40 + postcss-value-parser: 4.2.0 - /acorn@8.8.2: - resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} - engines: {node: '>=0.4.0'} + /autoprefixer@9.8.8: + resolution: {integrity: sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==} hasBin: true + dependencies: + browserslist: 4.23.2 + caniuse-lite: 1.0.30001645 + normalize-range: 0.1.2 + num2fraction: 1.2.2 + picocolors: 0.2.1 + postcss: 7.0.39 + postcss-value-parser: 4.2.0 + dev: true - /address@1.2.2: - resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} - engines: {node: '>= 10.0.0'} - dev: false + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.0.0 - /adjust-sourcemap-loader@4.0.0: - resolution: {integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==} - engines: {node: '>=8.9'} + /axe-core@4.10.0: + resolution: {integrity: sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==} + engines: {node: '>=4'} + + /axios@0.24.0: + resolution: {integrity: sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==} dependencies: - loader-utils: 2.0.4 - regex-parser: 2.2.11 + follow-redirects: 1.15.6 + transitivePeerDependencies: + - debug dev: false - /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} + /axios@0.27.2: + resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} dependencies: - debug: 4.3.4 + follow-redirects: 1.15.6 + form-data: 4.0.0 transitivePeerDependencies: - - supports-color + - debug + dev: false - /agent-base@7.1.0: - resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} - engines: {node: '>= 14'} + /axios@1.7.2: + resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} dependencies: - debug: 4.3.4 + follow-redirects: 1.15.6 + form-data: 4.0.0 + proxy-from-env: 1.1.0 transitivePeerDependencies: - - supports-color + - debug dev: false - /agentkeepalive@4.3.0: - resolution: {integrity: sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==} - engines: {node: '>= 8.0.0'} + /axobject-query@3.1.1: + resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} dependencies: - debug: 4.3.4 - depd: 2.0.0 - humanize-ms: 1.2.1 + deep-equal: 2.2.3 + + /babel-jest@27.5.1(@babel/core@7.25.2): + resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.25.2 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 27.5.1(@babel/core@7.25.2) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 transitivePeerDependencies: - supports-color + dev: false - /aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} + /babel-jest@28.1.3(@babel/core@7.25.2): + resolution: {integrity: sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + '@babel/core': ^7.8.0 dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 + '@babel/core': 7.25.2 + '@jest/transform': 28.1.3 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 28.1.3(@babel/core@7.25.2) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true - /ajv-formats@2.1.1(ajv@8.12.0): - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + /babel-jest@29.7.0(@babel/core@7.25.2): + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true + '@babel/core': ^7.8.0 dependencies: - ajv: 8.12.0 + '@babel/core': 7.25.2 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.25.2) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color - /ajv-keywords@3.5.2(ajv@6.12.6): - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + /babel-loader@8.3.0(@babel/core@7.25.2)(webpack@5.93.0): + resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} + engines: {node: '>= 8.9'} peerDependencies: - ajv: ^6.9.1 + '@babel/core': ^7.0.0 + webpack: '>=2' dependencies: - ajv: 6.12.6 + '@babel/core': 7.25.2 + find-cache-dir: 3.3.2 + loader-utils: 2.0.4 + make-dir: 3.1.0 + schema-utils: 2.7.1 + webpack: 5.93.0(webpack-cli@5.1.4) + dev: false - /ajv-keywords@5.1.0(ajv@8.12.0): - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + /babel-loader@9.1.3(@babel/core@7.25.2)(webpack@5.93.0): + resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} + engines: {node: '>= 14.15.0'} peerDependencies: - ajv: ^8.8.2 + '@babel/core': ^7.12.0 + webpack: '>=5' dependencies: - ajv: 8.12.0 - fast-deep-equal: 3.1.3 + '@babel/core': 7.25.2 + find-cache-dir: 4.0.0 + schema-utils: 4.2.0 + webpack: 5.93.0(webpack-cli@5.1.4) + dev: true - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - requiresBuild: true + /babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 + '@babel/helper-plugin-utils': 7.24.8 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color - /ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + /babel-plugin-jest-hoist@27.5.1: + resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.6 + dev: false - /ajv@8.6.3: - resolution: {integrity: sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==} + /babel-plugin-jest-hoist@28.1.3: + resolution: {integrity: sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.6 dev: true - /alphanum-sort@1.0.2: - resolution: {integrity: sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==} - dev: true + /babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.6 - /analytics-utils@1.0.12(@types/dlv@1.1.2): - resolution: {integrity: sha512-WvV2YWgsnXLxaY0QYux0crpBAg/0JA763NmbMVz22jKhMPo7dpTBet8G2IlF7ixTjLDzGlkHk1ZaKqqQmjJ+4w==} - peerDependencies: - '@types/dlv': ^1.0.0 + /babel-plugin-macros@2.8.0: + resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==} dependencies: - '@analytics/type-utils': 0.6.2 - '@types/dlv': 1.1.2 - dlv: 1.1.3 - dev: false + '@babel/runtime': 7.25.0 + cosmiconfig: 6.0.0 + resolve: 1.22.8 + dev: true - /analytics@0.8.9(@types/dlv@1.1.2): - resolution: {integrity: sha512-oTbUzQpncMTslakqfK70GgB6bopk5hY+uuekwnadMkDyqNLgcD02KRzteTnO7q5Ko6wDECVtT8xi/6OuAMZykA==} + /babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} dependencies: - '@analytics/core': 0.12.7(@types/dlv@1.1.2) - '@analytics/storage-utils': 0.4.2 - transitivePeerDependencies: - - '@types/dlv' + '@babel/runtime': 7.25.0 + cosmiconfig: 7.1.0 + resolve: 1.22.8 dev: false - /ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + /babel-plugin-named-asset-import@0.3.8(@babel/core@7.25.2): + resolution: {integrity: sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==} + peerDependencies: + '@babel/core': ^7.1.0 dependencies: - string-width: 4.2.3 - dev: false - - /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} + '@babel/core': 7.25.2 dev: false - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + /babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.25.2): + resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - type-fest: 0.21.3 - - /ansi-html-community@0.0.8: - resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} - engines: {'0': node >= 0.8.0} - hasBin: true - dev: false - - /ansi-regex@2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} - engines: {node: '>=0.10.0'} - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: false - - /ansi-styles@2.2.1: - resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} - engines: {node: '>=0.10.0'} - dev: true + '@babel/compat-data': 7.25.2 + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + /babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.25.2): + resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - color-convert: 1.9.3 + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) + core-js-compat: 3.37.1 + transitivePeerDependencies: + - supports-color - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + /babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.25.2): + resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - color-convert: 2.0.1 + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} + /babel-plugin-transform-async-to-promises@0.8.18: + resolution: {integrity: sha512-WpOrF76nUHijnNn10eBGOHZmXQC8JYRME9rOLxStOga7Av2VO53ehVFvVNImMksVtQuL2/7ZNxEgxnx7oo/3Hw==} + dev: true - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} + /babel-plugin-transform-react-remove-prop-types@0.4.24: + resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==} dev: false - /ansi-to-html@0.7.2: - resolution: {integrity: sha512-v6MqmEpNlxF+POuyhKkidusCHWWkaLcGRURzivcU3I9tv7k4JVhFcnukrM5Rlk2rUywdZuzYAZ+kbZqWCnfN3g==} - engines: {node: '>=8.0.0'} - hasBin: true + /babel-plugin-transform-replace-expressions@0.2.0(@babel/core@7.25.2): + resolution: {integrity: sha512-Eh1rRd9hWEYgkgoA3D0kGp7xJ/wgVshgsqmq60iC4HVWD+Lux+fNHSHBa2v1Hsv+dHflShC71qKhiH40OiPtDA==} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - entities: 2.2.0 + '@babel/core': 7.25.2 + '@babel/parser': 7.25.0 dev: true - /antd@5.4.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-OxXZ7joFf6Um4zeXm07tyJ9WV6eMwUw1KUmewfM/BDceUFVtJVf7YbBTBfX3JTl+jOuSpMSb4naFhOCgVwtyFw==} + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.25.2): + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + '@babel/core': ^7.0.0 dependencies: - '@ant-design/colors': 7.0.0 - '@ant-design/cssinjs': 1.8.1(react-dom@18.2.0)(react@18.2.0) - '@ant-design/icons': 5.0.1(react-dom@18.2.0)(react@18.2.0) - '@ant-design/react-slick': 1.0.0(react@18.2.0) - '@babel/runtime': 7.21.0 - '@ctrl/tinycolor': 3.6.0 - '@rc-component/mutate-observer': 1.0.0(react-dom@18.2.0)(react@18.2.0) - '@rc-component/tour': 1.8.0(react-dom@18.2.0)(react@18.2.0) - '@rc-component/trigger': 1.8.0(react-dom@18.2.0)(react@18.2.0) - classnames: 2.3.2 - copy-to-clipboard: 3.3.3 - dayjs: 1.11.10 - qrcode.react: 3.1.0(react@18.2.0) - rc-cascader: 3.10.1(react-dom@18.2.0)(react@18.2.0) - rc-checkbox: 3.0.0(react-dom@18.2.0)(react@18.2.0) - rc-collapse: 3.5.2(react-dom@18.2.0)(react@18.2.0) - rc-dialog: 9.1.0(react-dom@18.2.0)(react@18.2.0) - rc-drawer: 6.1.5(react-dom@18.2.0)(react@18.2.0) - rc-dropdown: 4.0.1(react-dom@18.2.0)(react@18.2.0) - rc-field-form: 1.29.2(react-dom@18.2.0)(react@18.2.0) - rc-image: 5.16.0(react-dom@18.2.0)(react@18.2.0) - rc-input: 1.0.4(react-dom@18.2.0)(react@18.2.0) - rc-input-number: 7.4.2(react-dom@18.2.0)(react@18.2.0) - rc-mentions: 2.2.0(react-dom@18.2.0)(react@18.2.0) - rc-menu: 9.8.4(react-dom@18.2.0)(react@18.2.0) - rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) - rc-notification: 5.0.3(react-dom@18.2.0)(react@18.2.0) - rc-pagination: 3.3.1(react-dom@18.2.0)(react@18.2.0) - rc-picker: 3.6.2(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) - rc-progress: 3.4.1(react-dom@18.2.0)(react@18.2.0) - rc-rate: 2.10.0(react-dom@18.2.0)(react@18.2.0) - rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) - rc-segmented: 2.1.2(react-dom@18.2.0)(react@18.2.0) - rc-select: 14.4.3(react-dom@18.2.0)(react@18.2.0) - rc-slider: 10.1.1(react-dom@18.2.0)(react@18.2.0) - rc-steps: 6.0.0(react-dom@18.2.0)(react@18.2.0) - rc-switch: 4.0.0(react-dom@18.2.0)(react@18.2.0) - rc-table: 7.31.1(react-dom@18.2.0)(react@18.2.0) - rc-tabs: 12.5.10(react-dom@18.2.0)(react@18.2.0) - rc-textarea: 1.2.2(react-dom@18.2.0)(react@18.2.0) - rc-tooltip: 6.0.1(react-dom@18.2.0)(react@18.2.0) - rc-tree: 5.7.3(react-dom@18.2.0)(react@18.2.0) - rc-tree-select: 5.8.0(react-dom@18.2.0)(react@18.2.0) - rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0) - rc-upload: 4.3.4(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - scroll-into-view-if-needed: 3.0.10 - throttle-debounce: 5.0.0 - transitivePeerDependencies: - - date-fns - - luxon - - moment - - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + '@babel/core': 7.25.2 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) + + /babel-preset-jest@27.5.1(@babel/core@7.25.2): + resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - /aproba@1.2.0: - resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} + '@babel/core': 7.25.2 + babel-plugin-jest-hoist: 27.5.1 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.25.2) dev: false - /aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - - /archiver-utils@2.1.0: - resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} - engines: {node: '>= 6'} + /babel-preset-jest@28.1.3(@babel/core@7.25.2): + resolution: {integrity: sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: - glob: 7.2.3 - graceful-fs: 4.2.11 - lazystream: 1.0.1 - lodash.defaults: 4.2.0 - lodash.difference: 4.5.0 - lodash.flatten: 4.4.0 - lodash.isplainobject: 4.0.6 - lodash.union: 4.6.0 - normalize-path: 3.0.0 - readable-stream: 2.3.8 + '@babel/core': 7.25.2 + babel-plugin-jest-hoist: 28.1.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.25.2) dev: true - /archiver@5.3.1: - resolution: {integrity: sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==} - engines: {node: '>= 10'} + /babel-preset-jest@29.6.3(@babel/core@7.25.2): + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: - archiver-utils: 2.1.0 - async: 3.2.4 - buffer-crc32: 0.2.13 - readable-stream: 3.6.2 - readdir-glob: 1.1.3 - tar-stream: 2.2.0 - zip-stream: 4.1.0 - dev: true + '@babel/core': 7.25.2 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.25.2) - /are-we-there-yet@1.1.7: - resolution: {integrity: sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==} + /babel-preset-react-app@10.0.1: + resolution: {integrity: sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==} dependencies: - delegates: 1.0.0 - readable-stream: 2.3.8 + '@babel/core': 7.25.2 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-proposal-decorators': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.25.2) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.25.2) + '@babel/plugin-transform-flow-strip-types': 7.25.2(@babel/core@7.25.2) + '@babel/plugin-transform-react-display-name': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-runtime': 7.24.7(@babel/core@7.25.2) + '@babel/preset-env': 7.25.2(@babel/core@7.25.2) + '@babel/preset-react': 7.24.7(@babel/core@7.25.2) + '@babel/preset-typescript': 7.24.7(@babel/core@7.25.2) + '@babel/runtime': 7.25.0 + babel-plugin-macros: 3.1.0 + babel-plugin-transform-react-remove-prop-types: 0.4.24 + transitivePeerDependencies: + - supports-color dev: false - /are-we-there-yet@2.0.0: - resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} - engines: {node: '>=10'} + /babel-runtime@6.25.0: + resolution: {integrity: sha512-zeCYxDePWYAT/DfmQWIHsMSFW2vv45UIwIAMjGvQVsTd47RwsiRH0uK1yzyWZ7LDBKdhnGDPM6NYEO5CZyhPrg==} dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 + core-js: 2.6.12 + regenerator-runtime: 0.10.5 + dev: false - /are-we-there-yet@3.0.1: - resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This package is no longer supported. - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - /arg@4.1.0: - resolution: {integrity: sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==} - dev: true + /base16@1.0.0: + resolution: {integrity: sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==} + dev: false - /arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - /arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + /batch@0.6.1: + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + dev: false - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + /bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} dependencies: - sprintf-js: 1.0.3 + tweetnacl: 0.14.5 + dev: true - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + /before-after-hook@2.2.3: + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} - /aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + /bfj@7.1.0: + resolution: {integrity: sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==} + engines: {node: '>= 8.0.0'} dependencies: - deep-equal: 2.2.0 + bluebird: 3.7.2 + check-types: 11.2.3 + hoopy: 0.1.4 + jsonpath: 1.1.1 + tryer: 1.0.1 + dev: false - /array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} - dependencies: - call-bind: 1.0.2 - is-array-buffer: 3.0.2 + /big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + dev: false - /array-differ@3.0.0: - resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} - engines: {node: '>=8'} + /big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - /array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + /big.js@6.2.1: + resolution: {integrity: sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==} + dev: true - /array-flatten@2.1.2: - resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} + /bignumber.js@9.1.2: + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} dev: false - /array-includes@3.1.6: - resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} - engines: {node: '>= 0.4'} + /bin-links@3.0.3: + resolution: {integrity: sha512-zKdnMPWEdh4F5INR07/eBrodC7QrF5JKvqskjz/ZZRXg5YSAZIbn8zGhbhUrElzHBZ2fvEQdOU59RHcTG3GiwA==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - get-intrinsic: 1.2.0 - is-string: 1.0.7 + cmd-shim: 5.0.0 + mkdirp-infer-owner: 2.0.0 + npm-normalize-package-bin: 2.0.0 + read-cmd-shim: 3.0.1 + rimraf: 3.0.2 + write-file-atomic: 4.0.2 - /array-tree-filter@2.1.0: - resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==} + /binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} - /array-union@1.0.2: - resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} - engines: {node: '>=0.10.0'} + /binaryextensions@4.19.0: + resolution: {integrity: sha512-DRxnVbOi/1OgA5pA9EDiRT8gvVYeqfuN7TmPfLyt6cyho3KbHCi3EtDQf39TTmGDrR5dZ9CspdXhPkL/j/WGbg==} + engines: {node: '>=0.8'} + + /bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} dependencies: - array-uniq: 1.0.3 + file-uri-to-path: 1.0.0 dev: true - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} + /bintrees@1.0.2: + resolution: {integrity: sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==} + dev: false - /array-uniq@1.0.3: - resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} - engines: {node: '>=0.10.0'} - dev: true - - /array.prototype.flat@1.3.1: - resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} - engines: {node: '>= 0.4'} + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - es-shim-unscopables: 1.0.0 + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 - /array.prototype.flatmap@1.3.1: - resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - es-shim-unscopables: 1.0.0 + /bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + dev: false - /array.prototype.reduce@1.0.5: - resolution: {integrity: sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==} - engines: {node: '>= 0.4'} + /body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - es-array-method-boxes-properly: 1.0.0 - is-string: 1.0.7 + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color - /array.prototype.tosorted@1.1.1: - resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} + /bonjour-service@1.2.1: + resolution: {integrity: sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - es-shim-unscopables: 1.0.0 - get-intrinsic: 1.2.0 - - /arrify@2.0.1: - resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} - engines: {node: '>=8'} + fast-deep-equal: 3.1.3 + multicast-dns: 7.2.5 + dev: false - /asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - /asn1@0.2.6: - resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} - dependencies: - safer-buffer: 2.1.2 - dev: true + /bottleneck@2.19.5: + resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} + dev: false - /assert-options@0.8.1: - resolution: {integrity: sha512-5lNGRB5g5i2bGIzb+J1QQE1iKU/WEMVBReFIc5pPDWjcPj23otPL0eI6PB2v7QPi0qU6Mhym5D3y0ZiSIOf3GA==} - engines: {node: '>=10.0.0'} + /bowser@2.11.0: + resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} dev: false - /assert-plus@1.0.0: - resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} - engines: {node: '>=0.8'} + /boxen@7.1.1: + resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} + engines: {node: '>=14.16'} + dependencies: + ansi-align: 3.0.1 + camelcase: 7.0.1 + chalk: 5.3.0 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 dev: false - /ast-types-flow@0.0.7: - resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 - /async-listen@1.2.0: - resolution: {integrity: sha512-CcEtRh/oc9Jc4uWeUwdpG/+Mb2YUHKmdaTf0gUr7Wa+bfp4xx70HOb3RuSTJMvqKNB1TkdTfjLdrcz2X4rkkZA==} - dev: true + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 - /async-listen@3.0.0: - resolution: {integrity: sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg==} - engines: {node: '>= 14'} - dev: true + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.1.1 - /async-listen@3.0.1: - resolution: {integrity: sha512-cWMaNwUJnf37C/S5TfCkk/15MwbPRwVYALA2jtjkbHjCmAPiDXyNJy2q3p1KAZzDLHAWyarUWSujUoHR4pEgrA==} - engines: {node: '>= 14'} + /brotli-size@4.0.0: + resolution: {integrity: sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==} + engines: {node: '>= 10.16.0'} + dependencies: + duplexer: 0.1.1 dev: true - /async-lock@1.4.0: - resolution: {integrity: sha512-coglx5yIWuetakm3/1dsX9hxCNox22h7+V80RQOu2XUUMidtArxKoZoOtHUPuR84SycKTXzgGzAUR5hJxujyJQ==} - dev: true + /browser-process-hrtime@1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + dev: false - /async-retry@1.3.3: - resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} - requiresBuild: true + /browserslist@4.23.2: + resolution: {integrity: sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true dependencies: - retry: 0.13.1 - dev: false - optional: true + caniuse-lite: 1.0.30001645 + electron-to-chromium: 1.5.4 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.2) - /async-sema@3.1.1: - resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + /bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + dependencies: + fast-json-stable-stringify: 2.1.0 dev: true - /async-validator@4.2.5: - resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} - - /async@3.2.4: - resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} + /bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + /bson@6.8.0: + resolution: {integrity: sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ==} + engines: {node: '>=16.20.1'} dev: false - /asyncro@3.0.0: - resolution: {integrity: sha512-nEnWYfrBmA3taTiuiOoZYmgJ/CNrSoQLeLs29SeLcPu60yaw/mHDBHV0iOZ051fTvsTHxpCY+gXibqT9wbQYfg==} + /buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} dev: true - /at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} + /buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} dev: false - /autoprefixer@10.4.14(postcss@8.4.30): - resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: - browserslist: 4.21.5 - caniuse-lite: 1.0.30001478 - fraction.js: 4.2.0 - normalize-range: 0.1.2 - picocolors: 1.0.0 - postcss: 8.4.30 - postcss-value-parser: 4.2.0 + base64-js: 1.5.1 + ieee754: 1.2.1 - /autoprefixer@9.8.8: - resolution: {integrity: sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==} - hasBin: true + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} dependencies: - browserslist: 4.21.10 - caniuse-lite: 1.0.30001534 - normalize-range: 0.1.2 - num2fraction: 1.2.2 - picocolors: 0.2.1 - postcss: 7.0.39 - postcss-value-parser: 4.2.0 + base64-js: 1.5.1 + ieee754: 1.2.1 + + /buildcheck@0.0.6: + resolution: {integrity: sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==} + engines: {node: '>=10.0.0'} + requiresBuild: true dev: true + optional: true - /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} + /builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} - /axe-core@4.6.3: - resolution: {integrity: sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg==} - engines: {node: '>=4'} + /builtins@1.0.3: + resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} - /axios@0.24.0: - resolution: {integrity: sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==} + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} dependencies: - follow-redirects: 1.15.5 - transitivePeerDependencies: - - debug + streamsearch: 1.1.0 dev: false - /axios@0.27.2: - resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} - dependencies: - follow-redirects: 1.15.5 - form-data: 4.0.0 - transitivePeerDependencies: - - debug - dev: false + /byline@5.0.0: + resolution: {integrity: sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==} + engines: {node: '>=0.10.0'} + dev: true - /axios@1.6.7: - resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} - dependencies: - follow-redirects: 1.15.5 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug + /bytes@3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} dev: false - /axobject-query@3.1.1: - resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} - dependencies: - deep-equal: 2.2.0 + /bytes@3.1.0: + resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==} + engines: {node: '>= 0.8'} + dev: true - /babel-jest@27.5.1(@babel/core@7.21.4): - resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - peerDependencies: - '@babel/core': ^7.8.0 - dependencies: - '@babel/core': 7.21.4 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - '@types/babel__core': 7.20.0 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 27.5.1(@babel/core@7.21.4) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: false + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} - /babel-jest@28.1.3(@babel/core@7.21.4): - resolution: {integrity: sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - peerDependencies: - '@babel/core': ^7.8.0 + /cacache@15.3.0: + resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} + engines: {node: '>= 10'} dependencies: - '@babel/core': 7.21.4 - '@jest/transform': 28.1.3 - '@types/babel__core': 7.20.0 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 28.1.3(@babel/core@7.21.4) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 + '@npmcli/fs': 1.1.1 + '@npmcli/move-file': 1.1.2 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 7.2.3 + infer-owner: 1.0.4 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1 + rimraf: 3.0.2 + ssri: 8.0.1 + tar: 6.2.1 + unique-filename: 1.1.1 transitivePeerDependencies: - - supports-color - dev: true + - bluebird - /babel-jest@29.7.0(@babel/core@7.21.4): - resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.8.0 - dependencies: - '@babel/core': 7.21.4 - '@jest/transform': 29.7.0 - '@types/babel__core': 7.20.0 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.21.4) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - - /babel-loader@8.3.0(@babel/core@7.21.4)(webpack@5.91.0): - resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} - engines: {node: '>= 8.9'} - peerDependencies: - '@babel/core': ^7.0.0 - webpack: '>=2' - dependencies: - '@babel/core': 7.21.4 - find-cache-dir: 3.3.2 - loader-utils: 2.0.4 - make-dir: 3.1.0 - schema-utils: 2.7.1 - webpack: 5.91.0(webpack-cli@5.1.4) - dev: false - - /babel-loader@9.1.3(@babel/core@7.21.4)(webpack@5.91.0): - resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} - engines: {node: '>= 14.15.0'} - peerDependencies: - '@babel/core': ^7.12.0 - webpack: '>=5' + /cacache@16.1.3: + resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: - '@babel/core': 7.21.4 - find-cache-dir: 4.0.0 - schema-utils: 4.0.0 - webpack: 5.91.0(webpack-cli@5.1.4) - dev: true + '@npmcli/fs': 2.1.2 + '@npmcli/move-file': 2.0.1 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 8.1.0 + infer-owner: 1.0.4 + lru-cache: 7.18.3 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1 + rimraf: 3.0.2 + ssri: 9.0.1 + tar: 6.2.1 + unique-filename: 2.0.1 + transitivePeerDependencies: + - bluebird - /babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} + /cacache@17.1.4: + resolution: {integrity: sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - '@babel/helper-plugin-utils': 7.22.5 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color + '@npmcli/fs': 3.1.1 + fs-minipass: 3.0.3 + glob: 10.4.5 + lru-cache: 7.18.3 + minipass: 7.1.2 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 4.0.0 + ssri: 10.0.6 + tar: 6.2.1 + unique-filename: 3.0.0 - /babel-plugin-jest-hoist@27.5.1: - resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + /call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.0 - '@types/babel__core': 7.20.0 - '@types/babel__traverse': 7.18.3 - dev: false + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 - /babel-plugin-jest-hoist@28.1.3: - resolution: {integrity: sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /caller-callsite@2.0.0: + resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} + engines: {node: '>=4'} dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.0 - '@types/babel__core': 7.20.0 - '@types/babel__traverse': 7.18.3 + callsites: 2.0.0 dev: true - /babel-plugin-jest-hoist@29.6.3: - resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /caller-path@2.0.0: + resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} + engines: {node: '>=4'} dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.0 - '@types/babel__core': 7.20.0 - '@types/babel__traverse': 7.18.3 + caller-callsite: 2.0.0 + dev: true - /babel-plugin-macros@2.8.0: - resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==} - dependencies: - '@babel/runtime': 7.21.0 - cosmiconfig: 6.0.0 - resolve: 1.22.2 + /callsites@2.0.0: + resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} + engines: {node: '>=4'} dev: true - /babel-plugin-macros@3.1.0: - resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} - engines: {node: '>=10', npm: '>=6'} - dependencies: - '@babel/runtime': 7.21.0 - cosmiconfig: 7.1.0 - resolve: 1.22.2 - dev: false + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} - /babel-plugin-named-asset-import@0.3.8(@babel/core@7.21.4): - resolution: {integrity: sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==} - peerDependencies: - '@babel/core': ^7.1.0 + /camel-case@3.0.0: + resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} dependencies: - '@babel/core': 7.21.4 + no-case: 2.3.2 + upper-case: 1.1.3 dev: false - /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.21.4): - resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 + /camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} dependencies: - '@babel/compat-data': 7.23.2 - '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color + pascal-case: 3.1.2 + tslib: 2.6.3 dev: false - /babel-plugin-polyfill-corejs2@0.4.6(@babel/core@7.21.4): - resolution: {integrity: sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/compat-data': 7.23.2 - '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.21.4) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} - /babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.21.4): - resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) - core-js-compat: 3.32.2 - transitivePeerDependencies: - - supports-color - dev: false + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} - /babel-plugin-polyfill-corejs3@0.8.5(@babel/core@7.21.4): - resolution: {integrity: sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.21.4) - core-js-compat: 3.32.2 - transitivePeerDependencies: - - supports-color + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} - /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.21.4): - resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) - transitivePeerDependencies: - - supports-color + /camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} dev: false - /babel-plugin-polyfill-regenerator@0.5.3(@babel/core@7.21.4): - resolution: {integrity: sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + /caniuse-api@3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: - '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.21.4) - transitivePeerDependencies: - - supports-color + browserslist: 4.23.2 + caniuse-lite: 1.0.30001645 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 - /babel-plugin-transform-async-to-promises@0.8.18: - resolution: {integrity: sha512-WpOrF76nUHijnNn10eBGOHZmXQC8JYRME9rOLxStOga7Av2VO53ehVFvVNImMksVtQuL2/7ZNxEgxnx7oo/3Hw==} - dev: true + /caniuse-lite@1.0.30001645: + resolution: {integrity: sha512-GFtY2+qt91kzyMk6j48dJcwJVq5uTkk71XxE3RtScx7XWRLsO7bU44LOFkOZYR8w9YMS0UhPSYpN/6rAMImmLw==} - /babel-plugin-transform-react-remove-prop-types@0.4.24: - resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==} + /case-sensitive-paths-webpack-plugin@2.4.0: + resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} + engines: {node: '>=4'} dev: false - /babel-plugin-transform-replace-expressions@0.2.0(@babel/core@7.21.4): - resolution: {integrity: sha512-Eh1rRd9hWEYgkgoA3D0kGp7xJ/wgVshgsqmq60iC4HVWD+Lux+fNHSHBa2v1Hsv+dHflShC71qKhiH40OiPtDA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/parser': 7.22.16 - dev: true - - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.21.4): - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.21.4) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.21.4) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.21.4) - - /babel-preset-jest@27.5.1(@babel/core@7.21.4): - resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - peerDependencies: - '@babel/core': ^7.0.0 + /catharsis@0.9.0: + resolution: {integrity: sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==} + engines: {node: '>= 10'} + requiresBuild: true dependencies: - '@babel/core': 7.21.4 - babel-plugin-jest-hoist: 27.5.1 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.4) + lodash: 4.17.21 dev: false + optional: true - /babel-preset-jest@28.1.3(@babel/core@7.21.4): - resolution: {integrity: sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - peerDependencies: - '@babel/core': ^7.0.0 + /chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} dependencies: - '@babel/core': 7.21.4 - babel-plugin-jest-hoist: 28.1.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.4) + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 dev: true - /babel-preset-jest@29.6.3(@babel/core@7.21.4): - resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.0.0 + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} dependencies: - '@babel/core': 7.21.4 - babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.4) + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 - /babel-preset-react-app@10.0.1: - resolution: {integrity: sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==} + /chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} dependencies: - '@babel/core': 7.21.4 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-decorators': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-private-property-in-object': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-transform-flow-strip-types': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-transform-react-display-name': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-runtime': 7.21.4(@babel/core@7.21.4) - '@babel/preset-env': 7.23.2(@babel/core@7.21.4) - '@babel/preset-react': 7.22.15(@babel/core@7.21.4) - '@babel/preset-typescript': 7.23.2(@babel/core@7.21.4) - '@babel/runtime': 7.21.0 - babel-plugin-macros: 3.1.0 - babel-plugin-transform-react-remove-prop-types: 0.4.24 - transitivePeerDependencies: - - supports-color - dev: false + ansi-styles: 4.3.0 + supports-color: 7.2.0 - /babel-runtime@6.25.0: - resolution: {integrity: sha512-zeCYxDePWYAT/DfmQWIHsMSFW2vv45UIwIAMjGvQVsTd47RwsiRH0uK1yzyWZ7LDBKdhnGDPM6NYEO5CZyhPrg==} + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} dependencies: - core-js: 2.6.12 - regenerator-runtime: 0.10.5 - dev: false + ansi-styles: 4.3.0 + supports-color: 7.2.0 - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - /base16@1.0.0: - resolution: {integrity: sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==} + /char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + /char-regex@2.0.1: + resolution: {integrity: sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==} + engines: {node: '>=12.20'} dev: false - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + /chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - /batch@0.6.1: - resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + /chart.js@4.4.3: + resolution: {integrity: sha512-qK1gkGSRYcJzqrrzdR6a+I0vQ4/R+SoODXyAjscQ/4mzuNzySaMCd+hyVxitSY1+L2fjPD1Gbn+ibNqRmwQeLw==} + engines: {pnpm: '>=8'} + dependencies: + '@kurkle/color': 0.3.2 dev: false - /bcrypt-pbkdf@1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} - dependencies: - tweetnacl: 0.14.5 - dev: true - - /before-after-hook@2.2.3: - resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + /check-types@11.2.3: + resolution: {integrity: sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==} + dev: false - /bfj@7.0.2: - resolution: {integrity: sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==} - engines: {node: '>= 8.0.0'} + /cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} dependencies: - bluebird: 3.7.2 - check-types: 11.2.2 - hoopy: 0.1.4 - tryer: 1.0.1 + boolbase: 1.0.0 + css-select: 5.1.0 + css-what: 6.1.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 dev: false - /big-integer@1.6.51: - resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} - engines: {node: '>=0.6'} + /cheerio@1.0.0-rc.12: + resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} + engines: {node: '>= 6'} + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.1.0 + htmlparser2: 8.0.2 + parse5: 7.1.2 + parse5-htmlparser2-tree-adapter: 7.0.0 dev: false - /big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - - /big.js@6.2.1: - resolution: {integrity: sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==} + /chokidar@3.3.1: + resolution: {integrity: sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.3.0 + optionalDependencies: + fsevents: 2.1.3 dev: true - /bignumber.js@9.1.1: - resolution: {integrity: sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==} - dev: false - - /bin-links@3.0.3: - resolution: {integrity: sha512-zKdnMPWEdh4F5INR07/eBrodC7QrF5JKvqskjz/ZZRXg5YSAZIbn8zGhbhUrElzHBZ2fvEQdOU59RHcTG3GiwA==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + /chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} dependencies: - cmd-shim: 5.0.0 - mkdirp-infer-owner: 2.0.0 - npm-normalize-package-bin: 2.0.0 - read-cmd-shim: 3.0.1 - rimraf: 3.0.2 - write-file-atomic: 4.0.2 + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - /binaryextensions@4.18.0: - resolution: {integrity: sha512-PQu3Kyv9dM4FnwB7XGj1+HucW+ShvJzJqjuw1JkKVs1mWdwOKVcRjOi+pV9X52A0tNvrPCsPkbFFQb+wE1EAXw==} - engines: {node: '>=0.8'} + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} - /bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - dependencies: - file-uri-to-path: 1.0.0 - dev: true + /chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} - /bintrees@1.0.2: - resolution: {integrity: sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==} + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + /circ-json@1.0.4: + resolution: {integrity: sha512-/2NljkKlOCvNgs8jsIlJcCFhUfF6C1JJKM8PdJQ6HqIrqhJBouMcWFdeDJLNLZAadeTj0K9FMziH74hpEtAr1g==} dev: false - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 + /cjs-module-lexer@1.3.1: + resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} - /bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - dev: false + /classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} - /body-parser@1.20.1: - resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + /clean-css@4.2.4: + resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} + engines: {node: '>= 4.0'} dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.1 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color + source-map: 0.6.1 + dev: false - /bonjour-service@1.1.1: - resolution: {integrity: sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==} + /clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} dependencies: - array-flatten: 2.1.2 - dns-equal: 1.0.0 - fast-deep-equal: 3.1.3 - multicast-dns: 7.2.5 + source-map: 0.6.1 dev: false - /boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} - /bottleneck@2.19.5: - resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} - dev: false + /clean-webpack-plugin@4.0.0(webpack@5.93.0): + resolution: {integrity: sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==} + engines: {node: '>=10.0.0'} + peerDependencies: + webpack: '>=4.0.0 <6.0.0' + dependencies: + del: 4.1.1 + webpack: 5.93.0(webpack-cli@5.1.4) + dev: true - /bowser@2.11.0: - resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + /cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} dev: false - /boxen@7.1.1: - resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} - engines: {node: '>=14.16'} + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} dependencies: - ansi-align: 3.0.1 - camelcase: 7.0.1 - chalk: 5.3.0 - cli-boxes: 3.0.0 - string-width: 5.1.2 - type-fest: 2.19.0 - widest-line: 4.0.1 - wrap-ansi: 8.1.0 - dev: false + restore-cursor: 3.1.0 - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 + /cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + /cli-table@0.3.11: + resolution: {integrity: sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==} + engines: {node: '>= 0.2.0'} dependencies: - balanced-match: 1.0.2 + colors: 1.0.3 - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 + /cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} - /brotli-size@4.0.0: - resolution: {integrity: sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==} - engines: {node: '>= 10.16.0'} - dependencies: - duplexer: 0.1.1 + /cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} dev: true - /browser-process-hrtime@1.0.0: - resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + /client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} dev: false - /browserslist@4.21.10: - resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} dependencies: - caniuse-lite: 1.0.30001534 - electron-to-chromium: 1.4.520 - node-releases: 2.0.13 - update-browserslist-db: 1.0.11(browserslist@4.21.10) + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: false - /browserslist@4.21.5: - resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} dependencies: - caniuse-lite: 1.0.30001534 - electron-to-chromium: 1.4.520 - node-releases: 2.0.13 - update-browserslist-db: 1.0.11(browserslist@4.21.5) + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 - /bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} - dependencies: - fast-json-stable-stringify: 2.1.0 - dev: true + /clone-buffer@1.0.0: + resolution: {integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==} + engines: {node: '>= 0.10'} - /bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + /clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} dependencies: - node-int64: 0.4.0 - - /bson@6.7.0: - resolution: {integrity: sha512-w2IquM5mYzYZv6rs3uN2DZTOBe2a0zXLj53TGDqwF4l6Sz/XsISrisXOJihArF9+BZ6Cq/GjVht7Sjfmri7ytQ==} - engines: {node: '>=16.20.1'} - dev: false - - /buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - dev: true + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 - /buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - dev: false + /clone-stats@1.0.0: + resolution: {integrity: sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==} - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} - /buffer-writer@2.0.0: - resolution: {integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==} - engines: {node: '>=4'} + /clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + /cloneable-readable@1.1.3: + resolution: {integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==} dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - /buildcheck@0.0.5: - resolution: {integrity: sha512-jYWpRy8eedl/JZqkOeq0X0bNcaK04hXKhIi4gYsDKZUJWRjJJWViYfsMXO0BJQ40zSLcdLoa+iqe48Kz2PtQag==} - engines: {node: '>=10.0.0'} - requiresBuild: true - dev: true - optional: true + inherits: 2.0.4 + process-nextick-args: 2.0.1 + readable-stream: 2.3.8 - /builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + /clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} + dev: false - /builtins@1.0.3: - resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} - - /busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - dependencies: - streamsearch: 1.1.0 - - /byline@5.0.0: - resolution: {integrity: sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==} + /cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} engines: {node: '>=0.10.0'} - dev: true - - /bytes@3.0.0: - resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} - engines: {node: '>= 0.8'} - dev: false - - /bytes@3.1.0: - resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==} - engines: {node: '>= 0.8'} - dev: true - - /bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - - /cacache@15.3.0: - resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} - engines: {node: '>= 10'} - dependencies: - '@npmcli/fs': 1.1.1 - '@npmcli/move-file': 1.1.2 - chownr: 2.0.0 - fs-minipass: 2.1.0 - glob: 7.2.3 - infer-owner: 1.0.4 - lru-cache: 6.0.0 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - mkdirp: 1.0.4 - p-map: 4.0.0 - promise-inflight: 1.0.1 - rimraf: 3.0.2 - ssri: 8.0.1 - tar: 6.2.0 - unique-filename: 1.1.1 - transitivePeerDependencies: - - bluebird - /cacache@16.1.3: - resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} + /cmd-shim@5.0.0: + resolution: {integrity: sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: - '@npmcli/fs': 2.1.2 - '@npmcli/move-file': 2.0.1 - chownr: 2.0.0 - fs-minipass: 2.1.0 - glob: 8.1.0 - infer-owner: 1.0.4 - lru-cache: 7.18.3 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - mkdirp: 1.0.4 - p-map: 4.0.0 - promise-inflight: 1.0.1 - rimraf: 3.0.2 - ssri: 9.0.1 - tar: 6.2.0 - unique-filename: 2.0.1 - transitivePeerDependencies: - - bluebird + mkdirp-infer-owner: 2.0.0 - /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} - dependencies: - function-bind: 1.1.2 - get-intrinsic: 1.2.0 + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - /caller-callsite@2.0.0: - resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} - engines: {node: '>=4'} + /coa@2.0.2: + resolution: {integrity: sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==} + engines: {node: '>= 4.0'} dependencies: - callsites: 2.0.0 - dev: true + '@types/q': 1.5.8 + chalk: 2.4.2 + q: 1.5.1 - /caller-path@2.0.0: - resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} - engines: {node: '>=4'} - dependencies: - caller-callsite: 2.0.0 + /code-block-writer@10.1.1: + resolution: {integrity: sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==} dev: true - /callsites@2.0.0: - resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} - engines: {node: '>=4'} + /code-block-writer@11.0.3: + resolution: {integrity: sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==} dev: true - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + /code-point-at@1.1.0: + resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} + engines: {node: '>=0.10.0'} + dev: false - /camel-case@3.0.0: - resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} + /collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: - no-case: 2.3.2 - upper-case: 1.1.3 - dev: false + color-name: 1.1.3 - /camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} dependencies: - pascal-case: 3.1.2 - tslib: 2.6.2 - dev: false + color-name: 1.1.4 - /camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} + /color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 - /camelcase@7.0.1: - resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} - engines: {node: '>=14.16'} - dev: false + /color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true - /caniuse-api@3.0.0: - resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + /color@3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} dependencies: - browserslist: 4.21.10 - caniuse-lite: 1.0.30001534 - lodash.memoize: 4.1.2 - lodash.uniq: 4.5.0 + color-convert: 1.9.3 + color-string: 1.9.1 - /caniuse-lite@1.0.30001478: - resolution: {integrity: sha512-gMhDyXGItTHipJj2ApIvR+iVB5hd0KP3svMWWXDvZOmjzJJassGLMfxRkQCSYgGd2gtdL/ReeiyvMSFD1Ss6Mw==} + /colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + dev: false - /caniuse-lite@1.0.30001534: - resolution: {integrity: sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==} + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - /case-sensitive-paths-webpack-plugin@2.4.0: - resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} - engines: {node: '>=4'} - dev: false + /colors@1.0.3: + resolution: {integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==} + engines: {node: '>=0.1.90'} - /catharsis@0.9.0: - resolution: {integrity: sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==} - engines: {node: '>= 10'} - requiresBuild: true + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} dependencies: - lodash: 4.17.21 + delayed-stream: 1.0.0 dev: false - optional: true - /chalk@1.1.3: - resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-styles: 2.2.1 - escape-string-regexp: 1.0.5 - has-ansi: 2.0.0 - strip-ansi: 3.0.1 - supports-color: 2.0.0 + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + /commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} dev: true - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - /chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 + /commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} + dev: false - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + /commander@7.1.0: + resolution: {integrity: sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==} + engines: {node: '>= 10'} - /char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: false - /char-regex@2.0.1: - resolution: {integrity: sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==} - engines: {node: '>=12.20'} + /commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} dev: false - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + /common-ancestor-path@1.0.1: + resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} - /chart.js@4.4.1: - resolution: {integrity: sha512-C74QN1bxwV1v2PEujhmKjOZ7iUM4w6BWs23Md/6aOZZSlwMzeCIDGuZay++rBgChYru7/+QFeoQW0fQoP534Dg==} - engines: {pnpm: '>=7'} - dependencies: - '@kurkle/color': 0.3.2 - dev: false + /common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + dev: true - /check-types@11.2.2: - resolution: {integrity: sha512-HBiYvXvn9Z70Z88XKjz3AEKd4HJhBXsa3j7xFnITAzoS8+q6eIGi8qDB8FKPBAjtuxjI/zFpwuiCb8oDtKOYrA==} + /common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} dev: false - /cheerio-select@2.1.0: - resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} - dependencies: - boolbase: 1.0.0 - css-select: 5.1.0 - css-what: 6.1.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.0.1 - dev: false - - /cheerio@1.0.0-rc.12: - resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} - engines: {node: '>= 6'} - dependencies: - cheerio-select: 2.1.0 - dom-serializer: 2.0.0 - domhandler: 5.0.3 - domutils: 3.0.1 - htmlparser2: 8.0.2 - parse5: 7.1.2 - parse5-htmlparser2-tree-adapter: 7.0.0 - dev: false + /commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - /chokidar@3.3.1: - resolution: {integrity: sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==} - engines: {node: '>= 8.10.0'} + /compress-commons@4.1.2: + resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} + engines: {node: '>= 10'} dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 + buffer-crc32: 0.2.13 + crc32-stream: 4.0.3 normalize-path: 3.0.0 - readdirp: 3.3.0 - optionalDependencies: - fsevents: 2.1.3 + readable-stream: 3.6.2 dev: true - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} + /compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - - /chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} + mime-db: 1.53.0 + dev: false - /chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} - engines: {node: '>=6.0'} + /compression@1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.8 + bytes: 3.0.0 + compressible: 2.0.18 + debug: 2.6.9 + on-headers: 1.0.2 + safe-buffer: 5.1.2 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: false - /ci-info@3.8.0: - resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} - engines: {node: '>=8'} + /compute-gcd@1.2.1: + resolution: {integrity: sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg==} + dependencies: + validate.io-array: 1.0.6 + validate.io-function: 1.0.2 + validate.io-integer-array: 1.0.0 + dev: false - /circ-json@1.0.4: - resolution: {integrity: sha512-/2NljkKlOCvNgs8jsIlJcCFhUfF6C1JJKM8PdJQ6HqIrqhJBouMcWFdeDJLNLZAadeTj0K9FMziH74hpEtAr1g==} + /compute-lcm@1.1.2: + resolution: {integrity: sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ==} + dependencies: + compute-gcd: 1.2.1 + validate.io-array: 1.0.6 + validate.io-function: 1.0.2 + validate.io-integer-array: 1.0.0 dev: false - /cjs-module-lexer@1.2.2: - resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} + /compute-scroll-into-view@3.1.0: + resolution: {integrity: sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==} - /classnames@2.3.2: - resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - /clean-css@4.2.4: - resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} - engines: {node: '>= 4.0'} + /concat-with-sourcemaps@1.1.0: + resolution: {integrity: sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==} dependencies: source-map: 0.6.1 - dev: false + dev: true - /clean-css@5.3.2: - resolution: {integrity: sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==} - engines: {node: '>= 10.0'} + /config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} dependencies: - source-map: 0.6.1 + ini: 1.3.8 + proto-list: 1.2.4 dev: false - /clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} + /confusing-browser-globals@1.0.11: + resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} + dev: false - /clean-webpack-plugin@4.0.0(webpack@5.91.0): - resolution: {integrity: sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==} - engines: {node: '>=10.0.0'} - peerDependencies: - webpack: '>=4.0.0 <6.0.0' + /connect-history-api-fallback@2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} + dev: false + + /console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} dependencies: - del: 4.1.1 - webpack: 5.91.0(webpack-cli@5.1.4) + safe-buffer: 5.2.1 + + /content-type@1.0.4: + resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} + engines: {node: '>= 0.6'} dev: true - /cli-boxes@3.0.0: - resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} - engines: {node: '>=10'} - dev: false + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + /convert-hrtime@3.0.0: + resolution: {integrity: sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==} engines: {node: '>=8'} - dependencies: - restore-cursor: 3.1.0 + dev: true - /cli-spinners@2.8.0: - resolution: {integrity: sha512-/eG5sJcvEIwxcdYM86k5tPwn0MUzkX5YY3eImTGpJOZgVe4SdTMY14vQpcxgBzJ0wXwAYrS8E+c3uHeK4JNyzQ==} - engines: {node: '>=6'} + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - /cli-table@0.3.11: - resolution: {integrity: sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==} - engines: {node: '>= 0.2.0'} + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + /cookie-parser@1.4.6: + resolution: {integrity: sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==} + engines: {node: '>= 0.8.0'} dependencies: - colors: 1.0.3 + cookie: 0.4.1 + cookie-signature: 1.0.6 + dev: true - /cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} + /cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - /cli-width@4.1.0: - resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} - engines: {node: '>= 12'} + /cookie@0.4.1: + resolution: {integrity: sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==} + engines: {node: '>= 0.6'} dev: true - /client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} dev: false - /cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: false + /cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + /copy-anything@2.0.6: + resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 + is-what: 3.14.1 + dev: true - /clone-buffer@1.0.0: - resolution: {integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==} - engines: {node: '>= 0.10'} + /copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + dependencies: + toggle-selection: 1.0.6 - /clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} + /copy-webpack-plugin@12.0.2(webpack@5.93.0): + resolution: {integrity: sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.1.0 dependencies: - is-plain-object: 2.0.4 - kind-of: 6.0.3 - shallow-clone: 3.0.1 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + globby: 14.0.2 + normalize-path: 3.0.0 + schema-utils: 4.2.0 + serialize-javascript: 6.0.2 + webpack: 5.93.0(webpack-cli@5.1.4) + dev: true - /clone-stats@1.0.0: - resolution: {integrity: sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==} + /core-js-compat@3.37.1: + resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==} + dependencies: + browserslist: 4.23.2 - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} + /core-js-pure@3.37.1: + resolution: {integrity: sha512-J/r5JTHSmzTxbiYYrzXg9w1VpqrYt+gexenBE9pugeyhwPZTAEJddyiReJWsLO6uNQ8xJZFbod6XC7KKwatCiA==} + requiresBuild: true + dev: false - /clone@2.1.2: - resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} - engines: {node: '>=0.8'} + /core-js@2.6.12: + resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} + deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. + requiresBuild: true + dev: false - /cloneable-readable@1.1.3: - resolution: {integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==} - dependencies: - inherits: 2.0.4 - process-nextick-args: 2.0.1 - readable-stream: 2.3.8 + /core-js@3.37.1: + resolution: {integrity: sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==} + requiresBuild: true + dev: false - /clsx@2.1.0: - resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} - engines: {node: '>=6'} + /core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} dev: false - /cluster-key-slot@1.1.2: - resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} - engines: {node: '>=0.10.0'} + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - /cmd-shim@5.0.0: - resolution: {integrity: sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + /cosmiconfig@5.2.1: + resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} + engines: {node: '>=4'} dependencies: - mkdirp-infer-owner: 2.0.0 - - /co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - - /coa@2.0.2: - resolution: {integrity: sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==} - engines: {node: '>= 4.0'} - dependencies: - '@types/q': 1.5.5 - chalk: 2.4.2 - q: 1.5.1 - - /code-block-writer@10.1.1: - resolution: {integrity: sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==} - dev: true - - /code-block-writer@11.0.3: - resolution: {integrity: sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==} + import-fresh: 2.0.0 + is-directory: 0.3.1 + js-yaml: 3.14.1 + parse-json: 4.0.0 dev: true - /code-point-at@1.1.0: - resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} - engines: {node: '>=0.10.0'} - dev: false - - /collect-v8-coverage@1.0.1: - resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} - - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + /cosmiconfig@6.0.0: + resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} + engines: {node: '>=8'} dependencies: - color-name: 1.1.3 + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + /cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} dependencies: - color-name: 1.1.4 - - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 - /color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + /cpu-features@0.0.10: + resolution: {integrity: sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==} + engines: {node: '>=10.0.0'} + requiresBuild: true dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 + buildcheck: 0.0.6 + nan: 2.20.0 + dev: true + optional: true - /color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + /crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} hasBin: true + dev: true - /color@3.2.1: - resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + /crc32-stream@4.0.3: + resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} + engines: {node: '>= 10'} dependencies: - color-convert: 1.9.3 - color-string: 1.9.1 - - /colord@2.9.3: - resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} - dev: false + crc-32: 1.2.2 + readable-stream: 3.6.2 + dev: true - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + /create-jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2): + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node - /colors@1.0.3: - resolution: {integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==} - engines: {node: '>=0.1.90'} + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + /cross-fetch@3.1.8: + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} dependencies: - delayed-stream: 1.0.0 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding dev: false - /commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} - - /commander@11.0.0: - resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} - engines: {node: '>=16'} + /cross-fetch@4.0.0: + resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding dev: true - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - - /commander@6.2.1: - resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} - engines: {node: '>= 6'} - dev: false - - /commander@7.1.0: - resolution: {integrity: sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==} - engines: {node: '>= 10'} + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 - /commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} + /crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} dev: false - /commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} + /crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} dev: false - /common-ancestor-path@1.0.1: - resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} - - /common-path-prefix@3.0.0: - resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} - - /common-tags@1.8.2: - resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} - engines: {node: '>=4.0.0'} + /css-blank-pseudo@3.0.3(postcss@8.4.40): + resolution: {integrity: sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==} + engines: {node: ^12 || ^14 || >=16} + hasBin: true + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.40 + postcss-selector-parser: 6.1.1 dev: false - /commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + /css-color-names@0.0.4: + resolution: {integrity: sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==} + dev: true - /compress-commons@4.1.1: - resolution: {integrity: sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==} - engines: {node: '>= 10'} + /css-declaration-sorter@4.0.1: + resolution: {integrity: sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==} + engines: {node: '>4'} dependencies: - buffer-crc32: 0.2.13 - crc32-stream: 4.0.2 - normalize-path: 3.0.0 - readable-stream: 3.6.2 + postcss: 7.0.39 + timsort: 0.3.0 dev: true - /compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} + /css-declaration-sorter@6.4.1(postcss@8.4.40): + resolution: {integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==} + engines: {node: ^10 || ^12 || >=14} + peerDependencies: + postcss: ^8.0.9 dependencies: - mime-db: 1.52.0 + postcss: 8.4.40 dev: false - /compression@1.7.4: - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} - engines: {node: '>= 0.8.0'} + /css-has-pseudo@3.0.4(postcss@8.4.40): + resolution: {integrity: sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==} + engines: {node: ^12 || ^14 || >=16} + hasBin: true + peerDependencies: + postcss: ^8.4 dependencies: - accepts: 1.3.8 - bytes: 3.0.0 - compressible: 2.0.18 - debug: 2.6.9 - on-headers: 1.0.2 - safe-buffer: 5.1.2 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color + postcss: 8.4.40 + postcss-selector-parser: 6.1.1 dev: false - /compute-gcd@1.2.1: - resolution: {integrity: sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg==} + /css-in-js-utils@3.1.0: + resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} dependencies: - validate.io-array: 1.0.6 - validate.io-function: 1.0.2 - validate.io-integer-array: 1.0.0 + hyphenate-style-name: 1.1.0 dev: false - /compute-lcm@1.1.2: - resolution: {integrity: sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ==} + /css-loader@6.11.0(webpack@5.93.0): + resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==} + engines: {node: '>= 12.13.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + webpack: ^5.0.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true dependencies: - compute-gcd: 1.2.1 - validate.io-array: 1.0.6 - validate.io-function: 1.0.2 - validate.io-integer-array: 1.0.0 + icss-utils: 5.1.0(postcss@8.4.40) + postcss: 8.4.40 + postcss-modules-extract-imports: 3.1.0(postcss@8.4.40) + postcss-modules-local-by-default: 4.0.5(postcss@8.4.40) + postcss-modules-scope: 3.2.0(postcss@8.4.40) + postcss-modules-values: 4.0.0(postcss@8.4.40) + postcss-value-parser: 4.2.0 + semver: 7.6.3 + webpack: 5.93.0(webpack-cli@5.1.4) dev: false - /compute-scroll-into-view@3.0.3: - resolution: {integrity: sha512-nadqwNxghAGTamwIqQSG433W6OADZx2vCo3UXHNrzTRHK/htu+7+L0zhjEoaeaQVNAi3YgqWDv8+tzf0hRfR+A==} - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - /concat-with-sourcemaps@1.1.0: - resolution: {integrity: sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==} + /css-minimizer-webpack-plugin@3.4.1(webpack@5.93.0): + resolution: {integrity: sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==} + engines: {node: '>= 12.13.0'} + peerDependencies: + '@parcel/css': '*' + clean-css: '*' + csso: '*' + esbuild: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + '@parcel/css': + optional: true + clean-css: + optional: true + csso: + optional: true + esbuild: + optional: true dependencies: + cssnano: 5.1.15(postcss@8.4.40) + jest-worker: 27.5.1 + postcss: 8.4.40 + schema-utils: 4.2.0 + serialize-javascript: 6.0.2 source-map: 0.6.1 - dev: true + webpack: 5.93.0(webpack-cli@5.1.4) + dev: false - /config-chain@1.1.13: - resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} - dependencies: - ini: 1.3.8 - proto-list: 1.2.4 + /css-modules-loader-core@1.1.0: + resolution: {integrity: sha512-XWOBwgy5nwBn76aA+6ybUGL/3JBnCtBX9Ay9/OWIpzKYWlVHMazvJ+WtHumfi+xxdPF440cWK7JCYtt8xDifew==} + dependencies: + icss-replace-symbols: 1.1.0 + postcss: 6.0.1 + postcss-modules-extract-imports: 1.1.0 + postcss-modules-local-by-default: 1.2.0 + postcss-modules-scope: 1.1.0 + postcss-modules-values: 1.3.0 + dev: true + + /css-prefers-color-scheme@6.0.3(postcss@8.4.40): + resolution: {integrity: sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==} + engines: {node: ^12 || ^14 || >=16} + hasBin: true + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.40 dev: false - /confusing-browser-globals@1.0.11: - resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} + /css-select-base-adapter@0.1.1: + resolution: {integrity: sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==} + + /css-select@2.1.0: + resolution: {integrity: sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==} + dependencies: + boolbase: 1.0.0 + css-what: 3.4.2 + domutils: 1.7.0 + nth-check: 1.0.2 + + /css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 dev: false - /connect-history-api-fallback@2.0.0: - resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} - engines: {node: '>=0.8'} + /css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 dev: false - /console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + /css-selector-tokenizer@0.7.3: + resolution: {integrity: sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==} + dependencies: + cssesc: 3.0.0 + fastparse: 1.1.2 + dev: true - /content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + /css-tree@1.0.0-alpha.37: + resolution: {integrity: sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==} + engines: {node: '>=8.0.0'} dependencies: - safe-buffer: 5.2.1 + mdn-data: 2.0.4 + source-map: 0.6.1 - /content-type@1.0.4: - resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} - engines: {node: '>= 0.6'} - dev: true + /css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 - /content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} + /css-what@3.4.2: + resolution: {integrity: sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==} + engines: {node: '>= 6'} - /convert-hrtime@3.0.0: - resolution: {integrity: sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==} - engines: {node: '>=8'} + /css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + dev: false + + /css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} dev: true - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + /cssdb@7.11.2: + resolution: {integrity: sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==} + dev: false - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true - /cookie-parser@1.4.6: - resolution: {integrity: sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==} - engines: {node: '>= 0.8.0'} + /cssnano-preset-default@4.0.8: + resolution: {integrity: sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==} + engines: {node: '>=6.9.0'} dependencies: - cookie: 0.4.1 - cookie-signature: 1.0.6 + css-declaration-sorter: 4.0.1 + cssnano-util-raw-cache: 4.0.1 + postcss: 7.0.39 + postcss-calc: 7.0.5 + postcss-colormin: 4.0.3 + postcss-convert-values: 4.0.1 + postcss-discard-comments: 4.0.2 + postcss-discard-duplicates: 4.0.2 + postcss-discard-empty: 4.0.1 + postcss-discard-overridden: 4.0.1 + postcss-merge-longhand: 4.0.11 + postcss-merge-rules: 4.0.3 + postcss-minify-font-values: 4.0.2 + postcss-minify-gradients: 4.0.2 + postcss-minify-params: 4.0.2 + postcss-minify-selectors: 4.0.2 + postcss-normalize-charset: 4.0.1 + postcss-normalize-display-values: 4.0.2 + postcss-normalize-positions: 4.0.2 + postcss-normalize-repeat-style: 4.0.2 + postcss-normalize-string: 4.0.2 + postcss-normalize-timing-functions: 4.0.2 + postcss-normalize-unicode: 4.0.1 + postcss-normalize-url: 4.0.1 + postcss-normalize-whitespace: 4.0.2 + postcss-ordered-values: 4.1.2 + postcss-reduce-initial: 4.0.3 + postcss-reduce-transforms: 4.0.2 + postcss-svgo: 4.0.3 + postcss-unique-selectors: 4.0.1 dev: true - /cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + /cssnano-preset-default@5.2.14(postcss@8.4.40): + resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + css-declaration-sorter: 6.4.1(postcss@8.4.40) + cssnano-utils: 3.1.0(postcss@8.4.40) + postcss: 8.4.40 + postcss-calc: 8.2.4(postcss@8.4.40) + postcss-colormin: 5.3.1(postcss@8.4.40) + postcss-convert-values: 5.1.3(postcss@8.4.40) + postcss-discard-comments: 5.1.2(postcss@8.4.40) + postcss-discard-duplicates: 5.1.0(postcss@8.4.40) + postcss-discard-empty: 5.1.1(postcss@8.4.40) + postcss-discard-overridden: 5.1.0(postcss@8.4.40) + postcss-merge-longhand: 5.1.7(postcss@8.4.40) + postcss-merge-rules: 5.1.4(postcss@8.4.40) + postcss-minify-font-values: 5.1.0(postcss@8.4.40) + postcss-minify-gradients: 5.1.1(postcss@8.4.40) + postcss-minify-params: 5.1.4(postcss@8.4.40) + postcss-minify-selectors: 5.2.1(postcss@8.4.40) + postcss-normalize-charset: 5.1.0(postcss@8.4.40) + postcss-normalize-display-values: 5.1.0(postcss@8.4.40) + postcss-normalize-positions: 5.1.1(postcss@8.4.40) + postcss-normalize-repeat-style: 5.1.1(postcss@8.4.40) + postcss-normalize-string: 5.1.0(postcss@8.4.40) + postcss-normalize-timing-functions: 5.1.0(postcss@8.4.40) + postcss-normalize-unicode: 5.1.1(postcss@8.4.40) + postcss-normalize-url: 5.1.0(postcss@8.4.40) + postcss-normalize-whitespace: 5.1.1(postcss@8.4.40) + postcss-ordered-values: 5.1.3(postcss@8.4.40) + postcss-reduce-initial: 5.1.2(postcss@8.4.40) + postcss-reduce-transforms: 5.1.0(postcss@8.4.40) + postcss-svgo: 5.1.0(postcss@8.4.40) + postcss-unique-selectors: 5.1.1(postcss@8.4.40) + dev: false - /cookie@0.4.1: - resolution: {integrity: sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==} - engines: {node: '>= 0.6'} + /cssnano-util-get-arguments@4.0.0: + resolution: {integrity: sha512-6RIcwmV3/cBMG8Aj5gucQRsJb4vv4I4rn6YjPbVWd5+Pn/fuG+YseGvXGk00XLkoZkaj31QOD7vMUpNPC4FIuw==} + engines: {node: '>=6.9.0'} dev: true - /cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} + /cssnano-util-get-match@4.0.0: + resolution: {integrity: sha512-JPMZ1TSMRUPVIqEalIBNoBtAYbi8okvcFns4O0YIhcdGebeYZK7dMyHJiQ6GqNBA9kE0Hym4Aqym5rPdsV/4Cw==} + engines: {node: '>=6.9.0'} + dev: true - /copy-anything@2.0.6: - resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + /cssnano-util-raw-cache@4.0.1: + resolution: {integrity: sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==} + engines: {node: '>=6.9.0'} dependencies: - is-what: 3.14.1 + postcss: 7.0.39 dev: true - /copy-to-clipboard@3.3.3: - resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} - dependencies: - toggle-selection: 1.0.6 + /cssnano-util-same-parent@4.0.1: + resolution: {integrity: sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==} + engines: {node: '>=6.9.0'} + dev: true - /copy-webpack-plugin@12.0.2(webpack@5.91.0): - resolution: {integrity: sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==} - engines: {node: '>= 18.12.0'} + /cssnano-utils@3.1.0(postcss@8.4.40): + resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: - webpack: ^5.1.0 + postcss: ^8.2.15 dependencies: - fast-glob: 3.3.2 - glob-parent: 6.0.2 - globby: 14.0.1 - normalize-path: 3.0.0 - schema-utils: 4.2.0 - serialize-javascript: 6.0.2 - webpack: 5.91.0(webpack-cli@5.1.4) - dev: true + postcss: 8.4.40 + dev: false - /core-js-compat@3.32.2: - resolution: {integrity: sha512-+GjlguTDINOijtVRUxrQOv3kfu9rl+qPNdX2LTbJ/ZyVTuxK+ksVSAGX1nHstu4hrv1En/uPTtWgq2gI5wt4AQ==} + /cssnano@4.1.11: + resolution: {integrity: sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==} + engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.21.10 + cosmiconfig: 5.2.1 + cssnano-preset-default: 4.0.8 + is-resolvable: 1.1.0 + postcss: 7.0.39 + dev: true - /core-js-pure@3.30.0: - resolution: {integrity: sha512-+2KbMFGeBU0ln/csoPqTe0i/yfHbrd2EUhNMObsGtXMKS/RTtlkYyi+/3twLcevbgNR0yM/r0Psa3TEoQRpFMQ==} - requiresBuild: true + /cssnano@5.1.15(postcss@8.4.40): + resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-preset-default: 5.2.14(postcss@8.4.40) + lilconfig: 2.1.0 + postcss: 8.4.40 + yaml: 1.10.2 dev: false - /core-js@2.6.12: - resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} - deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. - requiresBuild: true + /csso@4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + dependencies: + css-tree: 1.1.3 + + /cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} dev: false - /core-js@3.30.0: - resolution: {integrity: sha512-hQotSSARoNh1mYPi9O2YaWeiq/cEB95kOrFb4NCrO4RIFt1qqNpKsaE+vy/L3oiqvND5cThqXzUU3r9F7Efztg==} - requiresBuild: true + /cssom@0.4.4: + resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} dev: false - /core-util-is@1.0.2: - resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + /cssstyle@2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} + dependencies: + cssom: 0.3.8 dev: false - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - /cosmiconfig@5.2.1: - resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} - engines: {node: '>=4'} - dependencies: - import-fresh: 2.0.0 - is-directory: 0.3.1 - js-yaml: 3.14.1 - parse-json: 4.0.0 - dev: true + /cuid@2.1.8: + resolution: {integrity: sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg==} + deprecated: Cuid and other k-sortable and non-cryptographic ids (Ulid, ObjectId, KSUID, all UUIDs) are all insecure. Use @paralleldrive/cuid2 instead. - /cosmiconfig@6.0.0: - resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} - engines: {node: '>=8'} + /currency-codes@1.5.1: + resolution: {integrity: sha512-hqy8vtlIYKzO6pe2TE0V4/riZALIc7nhtE9cvxk5FDRCvfGplgzUvpTmZlMsyO+NeK5U41j+sQXJOo8l8v9kdg==} dependencies: - '@types/parse-json': 4.0.0 - import-fresh: 3.3.0 - parse-json: 5.2.0 - path-type: 4.0.0 - yaml: 1.10.2 + first-match: 0.0.1 + nub: 0.0.0 + dev: false - /cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} - dependencies: - '@types/parse-json': 4.0.0 - import-fresh: 3.3.0 - parse-json: 5.2.0 - path-type: 4.0.0 - yaml: 1.10.2 - - /cpu-features@0.0.6: - resolution: {integrity: sha512-Rj33pk//oVNh25YjsBaKtOkXNW7IARYxejWJosJkXqVPpbK+FrdpThPk6f4m3d+CEh2qMlkGx/SFt2Y1XSWN6g==} - engines: {node: '>=10.0.0'} - requiresBuild: true + /d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} dependencies: - buildcheck: 0.0.5 - nan: 2.17.0 - dev: true - optional: true + internmap: 2.0.3 + dev: false - /crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} - hasBin: true - dev: true + /d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + dev: false - /crc32-stream@4.0.2: - resolution: {integrity: sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==} - engines: {node: '>= 10'} - dependencies: - crc-32: 1.2.2 - readable-stream: 3.6.2 - dev: true + /d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + dev: false - /create-jest@29.7.0(@types/node@18.15.11)(ts-node@10.8.2): - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - dev: true + /d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + dev: false - /create-jest@29.7.0(@types/node@18.15.11)(ts-node@10.9.1): - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true + /d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.15.11)(ts-node@10.9.1) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - dev: true + d3-color: 3.1.0 + dev: false - /create-jest@29.7.0(@types/node@18.15.11)(ts-node@10.9.2): - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.15.11)(ts-node@10.9.2) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node + /d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + dev: false - /create-jest@29.7.0(@types/node@20.14.2)(ts-node@10.8.2): - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true + /d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.14.2)(ts-node@10.8.2) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - dev: true - - /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + dev: false - /cross-fetch@3.1.5: - resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} + /d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} dependencies: - node-fetch: 2.6.7 - transitivePeerDependencies: - - encoding + d3-path: 3.1.0 dev: false - /cross-fetch@4.0.0: - resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + /d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} dependencies: - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - dev: true + d3-time: 3.1.0 + dev: false - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + /d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 + d3-array: 3.2.4 + dev: false - /crypto-js@4.1.1: - resolution: {integrity: sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==} + /d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} dev: false - /crypto-random-string@2.0.0: - resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + /damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + + /dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} engines: {node: '>=8'} - dev: false - /css-blank-pseudo@3.0.3(postcss@8.4.30): - resolution: {integrity: sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==} - engines: {node: ^12 || ^14 || >=16} - hasBin: true - peerDependencies: - postcss: ^8.4 + /data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + dev: true + + /data-urls@2.0.0: + resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} + engines: {node: '>=10'} dependencies: - postcss: 8.4.30 - postcss-selector-parser: 6.0.11 + abab: 2.0.6 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 dev: false - /css-color-names@0.0.4: - resolution: {integrity: sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==} - dev: true - - /css-declaration-sorter@4.0.1: - resolution: {integrity: sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==} - engines: {node: '>4'} + /data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} dependencies: - postcss: 7.0.39 - timsort: 0.3.0 - dev: true + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 - /css-declaration-sorter@6.4.0(postcss@8.4.31): - resolution: {integrity: sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew==} - engines: {node: ^10 || ^12 || >=14} - peerDependencies: - postcss: ^8.0.9 + /data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} dependencies: - postcss: 8.4.31 - dev: false + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 - /css-has-pseudo@3.0.4(postcss@8.4.30): - resolution: {integrity: sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==} - engines: {node: ^12 || ^14 || >=16} - hasBin: true - peerDependencies: - postcss: ^8.4 + /data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} dependencies: - postcss: 8.4.30 - postcss-selector-parser: 6.0.11 - dev: false + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 - /css-in-js-utils@3.1.0: - resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} + /date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} dependencies: - hyphenate-style-name: 1.0.4 + '@babel/runtime': 7.25.0 dev: false - /css-loader@6.7.3(webpack@5.91.0): - resolution: {integrity: sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==} - engines: {node: '>= 12.13.0'} + /dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + + /dayjs@1.11.12: + resolution: {integrity: sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg==} + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: - webpack: ^5.0.0 + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true dependencies: - icss-utils: 5.1.0(postcss@8.4.31) - postcss: 8.4.31 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.31) - postcss-modules-local-by-default: 4.0.0(postcss@8.4.31) - postcss-modules-scope: 3.0.0(postcss@8.4.31) - postcss-modules-values: 4.0.0(postcss@8.4.31) - postcss-value-parser: 4.2.0 - semver: 7.5.4 - webpack: 5.91.0(webpack-cli@5.1.4) - dev: false + ms: 2.0.0 - /css-minimizer-webpack-plugin@3.4.1(webpack@5.91.0): - resolution: {integrity: sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==} - engines: {node: '>= 12.13.0'} + /debug@3.2.7(supports-color@5.5.0): + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: - '@parcel/css': '*' - clean-css: '*' - csso: '*' - esbuild: '*' - webpack: ^5.0.0 + supports-color: '*' peerDependenciesMeta: - '@parcel/css': - optional: true - clean-css: - optional: true - csso: - optional: true - esbuild: + supports-color: optional: true dependencies: - cssnano: 5.1.15(postcss@8.4.31) - jest-worker: 27.5.1 - postcss: 8.4.31 - schema-utils: 4.0.0 - serialize-javascript: 6.0.1 - source-map: 0.6.1 - webpack: 5.91.0(webpack-cli@5.1.4) - dev: false + ms: 2.1.3 + supports-color: 5.5.0 - /css-modules-loader-core@1.1.0: - resolution: {integrity: sha512-XWOBwgy5nwBn76aA+6ybUGL/3JBnCtBX9Ay9/OWIpzKYWlVHMazvJ+WtHumfi+xxdPF440cWK7JCYtt8xDifew==} + /debug@4.1.1: + resolution: {integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==} + deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true dependencies: - icss-replace-symbols: 1.1.0 - postcss: 6.0.1 - postcss-modules-extract-imports: 1.1.0 - postcss-modules-local-by-default: 1.2.0 - postcss-modules-scope: 1.1.0 - postcss-modules-values: 1.3.0 + ms: 2.1.1 dev: true - /css-prefers-color-scheme@6.0.3(postcss@8.4.30): - resolution: {integrity: sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==} - engines: {node: ^12 || ^14 || >=16} - hasBin: true + /debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + engines: {node: '>=6.0'} peerDependencies: - postcss: ^8.4 + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true dependencies: - postcss: 8.4.30 - dev: false - - /css-select-base-adapter@0.1.1: - resolution: {integrity: sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==} + ms: 2.1.2 - /css-select@2.1.0: - resolution: {integrity: sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==} - dependencies: - boolbase: 1.0.0 - css-what: 3.4.2 - domutils: 1.7.0 - nth-check: 1.0.2 + /debuglog@1.0.1: + resolution: {integrity: sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - /css-select@4.3.0: - resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} - dependencies: - boolbase: 1.0.0 - css-what: 6.1.0 - domhandler: 4.3.1 - domutils: 2.8.0 - nth-check: 2.1.1 + /decimal.js-light@2.5.1: + resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} dev: false - /css-select@5.1.0: - resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} - dependencies: - boolbase: 1.0.0 - css-what: 6.1.0 - domhandler: 5.0.3 - domutils: 3.0.1 - nth-check: 2.1.1 + /decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} dev: false - /css-selector-tokenizer@0.7.3: - resolution: {integrity: sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==} - dependencies: - cssesc: 3.0.0 - fastparse: 1.1.2 + /declaration-bundler-webpack-plugin@1.0.3: + resolution: {integrity: sha512-bgeoSOZYTOOdiNUZd/U8K6Z+6IrM/X+DgUcm3/VI1l130lzOBeL+ObetjIkKksxcj0zUJbLaFRFumFGYDOQ9fg==} dev: true - /css-tree@1.0.0-alpha.37: - resolution: {integrity: sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==} - engines: {node: '>=8.0.0'} + /decompress-response@4.2.1: + resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} + engines: {node: '>=8'} dependencies: - mdn-data: 2.0.4 - source-map: 0.6.1 + mimic-response: 2.1.0 + dev: false - /css-tree@1.1.3: - resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} - engines: {node: '>=8.0.0'} + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} dependencies: - mdn-data: 2.0.14 - source-map: 0.6.1 + mimic-response: 3.1.0 + dev: false - /css-what@3.4.2: - resolution: {integrity: sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==} - engines: {node: '>= 6'} + /dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - /css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} - dev: false + /dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true - /css.escape@1.5.1: - resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - dev: true + /deep-equal@2.2.3: + resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + es-get-iterator: 1.1.3 + get-intrinsic: 1.2.4 + is-arguments: 1.1.1 + is-array-buffer: 3.0.4 + is-date-object: 1.0.5 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + isarray: 2.0.5 + object-is: 1.1.6 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + side-channel: 1.0.6 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.2 + which-typed-array: 1.1.15 - /cssdb@7.5.4: - resolution: {integrity: sha512-fGD+J6Jlq+aurfE1VDXlLS4Pt0VtNlu2+YgfGOdMxRyl/HQ9bDiHTwSck1Yz8A97Dt/82izSK6Bp/4nVqacOsg==} - dev: false + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} - /cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - /cssnano-preset-default@4.0.8: - resolution: {integrity: sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==} - engines: {node: '>=6.9.0'} - dependencies: - css-declaration-sorter: 4.0.1 - cssnano-util-raw-cache: 4.0.1 - postcss: 7.0.39 - postcss-calc: 7.0.5 - postcss-colormin: 4.0.3 - postcss-convert-values: 4.0.1 - postcss-discard-comments: 4.0.2 - postcss-discard-duplicates: 4.0.2 - postcss-discard-empty: 4.0.1 - postcss-discard-overridden: 4.0.1 - postcss-merge-longhand: 4.0.11 - postcss-merge-rules: 4.0.3 - postcss-minify-font-values: 4.0.2 - postcss-minify-gradients: 4.0.2 - postcss-minify-params: 4.0.2 - postcss-minify-selectors: 4.0.2 - postcss-normalize-charset: 4.0.1 - postcss-normalize-display-values: 4.0.2 - postcss-normalize-positions: 4.0.2 - postcss-normalize-repeat-style: 4.0.2 - postcss-normalize-string: 4.0.2 - postcss-normalize-timing-functions: 4.0.2 - postcss-normalize-unicode: 4.0.1 - postcss-normalize-url: 4.0.1 - postcss-normalize-whitespace: 4.0.2 - postcss-ordered-values: 4.1.2 - postcss-reduce-initial: 4.0.3 - postcss-reduce-transforms: 4.0.2 - postcss-svgo: 4.0.3 - postcss-unique-selectors: 4.0.1 - dev: true + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} - /cssnano-preset-default@5.2.14(postcss@8.4.31): - resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /default-gateway@6.0.3: + resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} + engines: {node: '>= 10'} dependencies: - css-declaration-sorter: 6.4.0(postcss@8.4.31) - cssnano-utils: 3.1.0(postcss@8.4.31) - postcss: 8.4.31 - postcss-calc: 8.2.4(postcss@8.4.31) - postcss-colormin: 5.3.1(postcss@8.4.31) - postcss-convert-values: 5.1.3(postcss@8.4.31) - postcss-discard-comments: 5.1.2(postcss@8.4.31) - postcss-discard-duplicates: 5.1.0(postcss@8.4.31) - postcss-discard-empty: 5.1.1(postcss@8.4.31) - postcss-discard-overridden: 5.1.0(postcss@8.4.31) - postcss-merge-longhand: 5.1.7(postcss@8.4.31) - postcss-merge-rules: 5.1.4(postcss@8.4.31) - postcss-minify-font-values: 5.1.0(postcss@8.4.31) - postcss-minify-gradients: 5.1.1(postcss@8.4.31) - postcss-minify-params: 5.1.4(postcss@8.4.31) - postcss-minify-selectors: 5.2.1(postcss@8.4.31) - postcss-normalize-charset: 5.1.0(postcss@8.4.31) - postcss-normalize-display-values: 5.1.0(postcss@8.4.31) - postcss-normalize-positions: 5.1.1(postcss@8.4.31) - postcss-normalize-repeat-style: 5.1.1(postcss@8.4.31) - postcss-normalize-string: 5.1.0(postcss@8.4.31) - postcss-normalize-timing-functions: 5.1.0(postcss@8.4.31) - postcss-normalize-unicode: 5.1.1(postcss@8.4.31) - postcss-normalize-url: 5.1.0(postcss@8.4.31) - postcss-normalize-whitespace: 5.1.1(postcss@8.4.31) - postcss-ordered-values: 5.1.3(postcss@8.4.31) - postcss-reduce-initial: 5.1.2(postcss@8.4.31) - postcss-reduce-transforms: 5.1.0(postcss@8.4.31) - postcss-svgo: 5.1.0(postcss@8.4.31) - postcss-unique-selectors: 5.1.1(postcss@8.4.31) + execa: 5.1.1 dev: false - /cssnano-util-get-arguments@4.0.0: - resolution: {integrity: sha512-6RIcwmV3/cBMG8Aj5gucQRsJb4vv4I4rn6YjPbVWd5+Pn/fuG+YseGvXGk00XLkoZkaj31QOD7vMUpNPC4FIuw==} - engines: {node: '>=6.9.0'} - dev: true - - /cssnano-util-get-match@4.0.0: - resolution: {integrity: sha512-JPMZ1TSMRUPVIqEalIBNoBtAYbi8okvcFns4O0YIhcdGebeYZK7dMyHJiQ6GqNBA9kE0Hym4Aqym5rPdsV/4Cw==} - engines: {node: '>=6.9.0'} - dev: true + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 - /cssnano-util-raw-cache@4.0.1: - resolution: {integrity: sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==} - engines: {node: '>=6.9.0'} + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} dependencies: - postcss: 7.0.39 - dev: true + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 - /cssnano-util-same-parent@4.0.1: - resolution: {integrity: sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==} - engines: {node: '>=6.9.0'} - dev: true + /define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: false - /cssnano-utils@3.1.0(postcss@8.4.31): - resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} dependencies: - postcss: 8.4.31 - dev: false + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 - /cssnano@4.1.11: - resolution: {integrity: sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==} - engines: {node: '>=6.9.0'} + /del@4.1.1: + resolution: {integrity: sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==} + engines: {node: '>=6'} dependencies: - cosmiconfig: 5.2.1 - cssnano-preset-default: 4.0.8 - is-resolvable: 1.1.0 - postcss: 7.0.39 + '@types/glob': 7.2.0 + globby: 6.1.0 + is-path-cwd: 2.2.0 + is-path-in-cwd: 2.1.0 + p-map: 2.1.0 + pify: 4.0.1 + rimraf: 2.7.1 dev: true - /cssnano@5.1.15(postcss@8.4.31): - resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - cssnano-preset-default: 5.2.14(postcss@8.4.31) - lilconfig: 2.1.0 - postcss: 8.4.31 - yaml: 1.10.2 + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} dev: false - /csso@4.2.0: - resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} - engines: {node: '>=8.0.0'} - dependencies: - css-tree: 1.1.3 + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - /cssom@0.3.8: - resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} - dev: false + /denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} - /cssom@0.4.4: - resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} - dev: false + /depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} - /cssstyle@2.3.0: - resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} - engines: {node: '>=8'} - dependencies: - cssom: 0.3.8 - dev: false + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} - /csstype@3.1.2: - resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + /deprecation@2.3.1: + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} - /cuid@2.1.8: - resolution: {integrity: sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg==} - deprecated: Cuid and other k-sortable and non-cryptographic ids (Ulid, ObjectId, KSUID, all UUIDs) are all insecure. Use @paralleldrive/cuid2 instead. + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: true - /currency-codes@1.5.1: - resolution: {integrity: sha512-hqy8vtlIYKzO6pe2TE0V4/riZALIc7nhtE9cvxk5FDRCvfGplgzUvpTmZlMsyO+NeK5U41j+sQXJOo8l8v9kdg==} - dependencies: - first-match: 0.0.1 - nub: 0.0.0 - dev: false + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - /d3-array@3.2.4: - resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} - engines: {node: '>=12'} - dependencies: - internmap: 2.0.3 + /detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true dev: false - /d3-color@3.1.0: - resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} - engines: {node: '>=12'} - dev: false + /detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} - /d3-ease@3.0.1: - resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} - engines: {node: '>=12'} - dev: false + /detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} - /d3-format@3.1.0: - resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} - engines: {node: '>=12'} + /detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} dev: false - /d3-interpolate@3.0.1: - resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} - engines: {node: '>=12'} + /detect-port-alt@1.1.6: + resolution: {integrity: sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==} + engines: {node: '>= 4.2.1'} + hasBin: true dependencies: - d3-color: 3.1.0 - dev: false - - /d3-path@3.1.0: - resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} - engines: {node: '>=12'} + address: 1.2.2 + debug: 2.6.9 + transitivePeerDependencies: + - supports-color dev: false - /d3-scale@4.0.2: - resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} - engines: {node: '>=12'} + /dezalgo@1.0.4: + resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} dependencies: - d3-array: 3.2.4 - d3-format: 3.1.0 - d3-interpolate: 3.0.1 - d3-time: 3.1.0 - d3-time-format: 4.1.0 - dev: false + asap: 2.0.6 + wrappy: 1.0.2 - /d3-shape@3.2.0: - resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} - engines: {node: '>=12'} - dependencies: - d3-path: 3.1.0 - dev: false + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - /d3-time-format@4.1.0: - resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} - engines: {node: '>=12'} - dependencies: - d3-time: 3.1.0 + /diff-match-patch@1.0.5: + resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} dev: false - /d3-time@3.1.0: - resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} - engines: {node: '>=12'} - dependencies: - d3-array: 3.2.4 + /diff-sequences@27.5.1: + resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dev: false - /d3-timer@3.0.1: - resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} - engines: {node: '>=12'} - dev: false + /diff-sequences@28.1.1: + resolution: {integrity: sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dev: true - /damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - /dargs@7.0.0: - resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} - engines: {node: '>=8'} + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} - /data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - dev: true + /diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} - /data-urls@2.0.0: - resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} - engines: {node: '>=10'} + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} dependencies: - abab: 2.0.6 - whatwg-mimetype: 2.3.0 - whatwg-url: 8.7.0 - dev: false + path-type: 4.0.0 - /date-fns@2.29.3: - resolution: {integrity: sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==} - engines: {node: '>=0.11'} + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + /dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + dependencies: + '@leichtgewicht/ip-codec': 2.0.5 dev: false - /dateformat@4.6.3: - resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + /docker-compose@0.24.8: + resolution: {integrity: sha512-plizRs/Vf15H+GCVxq2EUvyPK7ei9b/cVesHvjnX4xaXjM9spHe2Ytq0BitndFgvTJ3E3NljPNUEl7BAN43iZw==} + engines: {node: '>= 6.0.0'} + dependencies: + yaml: 2.5.0 + dev: true - /dayjs@1.11.10: - resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} + /docker-modem@3.0.8: + resolution: {integrity: sha512-f0ReSURdM3pcKPNS30mxOHSbaFLcknGmQjwSfmbcdOw1XWKXVhukM3NJHhr7NpY9BIyyWQb0EBo3KQvvuU5egQ==} + engines: {node: '>= 8.0'} + dependencies: + debug: 4.3.6 + readable-stream: 3.6.2 + split-ca: 1.0.1 + ssh2: 1.15.0 + transitivePeerDependencies: + - supports-color + dev: true - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + /dockerode@3.3.5: + resolution: {integrity: sha512-/0YNa3ZDNeLr/tSckmD69+Gq+qVNhvKfAHNeZJBnp7EOP6RGKV8ORrJHkUn20So5wU+xxT7+1n5u8PjHbfjbSA==} + engines: {node: '>= 8.0'} dependencies: - ms: 2.0.0 + '@balena/dockerignore': 1.0.2 + docker-modem: 3.0.8 + tar-fs: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: true - /debug@3.2.7(supports-color@5.5.0): - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} dependencies: - ms: 2.1.3 - supports-color: 5.5.0 + esutils: 2.0.3 - /debug@4.1.1: - resolution: {integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==} - deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} dependencies: - ms: 2.1.3 + esutils: 2.0.3 + + /dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} dev: true - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 + /dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + dev: true - /debuglog@1.0.1: - resolution: {integrity: sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==} + /dom-align@1.12.4: + resolution: {integrity: sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==} + dev: false - /decimal.js-light@2.5.1: - resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + /dom-converter@0.2.0: + resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} + dependencies: + utila: 0.4.0 dev: false - /decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + /dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + dependencies: + '@babel/runtime': 7.25.0 + csstype: 3.1.3 dev: false - /declaration-bundler-webpack-plugin@1.0.3: - resolution: {integrity: sha512-bgeoSOZYTOOdiNUZd/U8K6Z+6IrM/X+DgUcm3/VI1l130lzOBeL+ObetjIkKksxcj0zUJbLaFRFumFGYDOQ9fg==} - dev: true + /dom-serializer@0.2.2: + resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} + dependencies: + domelementtype: 2.3.0 + entities: 2.2.0 - /decompress-response@4.2.1: - resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} - engines: {node: '>=8'} + /dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} dependencies: - mimic-response: 2.1.0 + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 dev: false - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} + /dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} dependencies: - mimic-response: 3.1.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 dev: false - /dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + /domelementtype@1.3.1: + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} - /dedent@1.5.1: - resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - /deep-equal@2.2.0: - resolution: {integrity: sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==} - dependencies: - call-bind: 1.0.2 - es-get-iterator: 1.1.3 - get-intrinsic: 1.2.0 - is-arguments: 1.1.1 - is-array-buffer: 3.0.2 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - isarray: 2.0.5 - object-is: 1.1.5 - object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.4.3 - side-channel: 1.0.4 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.9 - - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - - /default-gateway@6.0.3: - resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} - engines: {node: '>= 10'} - dependencies: - execa: 5.1.1 - dev: false - - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - dependencies: - clone: 1.0.4 - - /define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - - /define-properties@1.2.0: - resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} - engines: {node: '>= 0.4'} - dependencies: - has-property-descriptors: 1.0.0 - object-keys: 1.1.1 - - /del@4.1.1: - resolution: {integrity: sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==} - engines: {node: '>=6'} - dependencies: - '@types/glob': 7.2.0 - globby: 6.1.0 - is-path-cwd: 2.2.0 - is-path-in-cwd: 2.1.0 - p-map: 2.1.0 - pify: 4.0.1 - rimraf: 2.7.1 - dev: true - - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: false - - /delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - - /denque@2.1.0: - resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} - engines: {node: '>=0.10'} - - /depd@1.1.2: - resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} - engines: {node: '>= 0.6'} - - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - - /deprecation@2.3.1: - resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} - - /destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - - /detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} - hasBin: true - dev: false - - /detect-libc@2.0.1: - resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} - engines: {node: '>=8'} - - /detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} - - /detect-node@2.0.4: - resolution: {integrity: sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==} - dev: false - - /detect-node@2.1.0: - resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} - dev: false - - /detect-port-alt@1.1.6: - resolution: {integrity: sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==} - engines: {node: '>= 4.2.1'} - hasBin: true - dependencies: - address: 1.2.2 - debug: 2.6.9 - transitivePeerDependencies: - - supports-color - dev: false - - /dezalgo@1.0.4: - resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} - dependencies: - asap: 2.0.6 - wrappy: 1.0.2 - - /didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - - /diff-match-patch@1.0.5: - resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} - dev: false - - /diff-sequences@27.5.1: - resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dev: false - - /diff-sequences@28.1.1: - resolution: {integrity: sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - dev: true - - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - - /diff@5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} - engines: {node: '>=0.3.1'} - - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - - /dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - - /dns-equal@1.0.0: - resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} - dev: false - - /dns-packet@5.5.0: - resolution: {integrity: sha512-USawdAUzRkV6xrqTjiAEp6M9YagZEzWcSUaZTcIFAiyQWW1SoI6KyId8y2+/71wbgHKQAKd+iupLv4YvEwYWvA==} - engines: {node: '>=6'} - dependencies: - '@leichtgewicht/ip-codec': 2.0.4 - dev: false - - /docker-compose@0.23.19: - resolution: {integrity: sha512-v5vNLIdUqwj4my80wxFDkNH+4S85zsRuH29SO7dCWVWPCMt/ohZBsGN6g6KXWifT0pzQ7uOxqEKCYCDPJ8Vz4g==} - engines: {node: '>= 6.0.0'} - dependencies: - yaml: 1.10.2 - dev: true - - /docker-modem@3.0.8: - resolution: {integrity: sha512-f0ReSURdM3pcKPNS30mxOHSbaFLcknGmQjwSfmbcdOw1XWKXVhukM3NJHhr7NpY9BIyyWQb0EBo3KQvvuU5egQ==} - engines: {node: '>= 8.0'} - dependencies: - debug: 4.3.4 - readable-stream: 3.6.2 - split-ca: 1.0.1 - ssh2: 1.11.0 - transitivePeerDependencies: - - supports-color - dev: true - - /dockerode@3.3.5: - resolution: {integrity: sha512-/0YNa3ZDNeLr/tSckmD69+Gq+qVNhvKfAHNeZJBnp7EOP6RGKV8ORrJHkUn20So5wU+xxT7+1n5u8PjHbfjbSA==} - engines: {node: '>= 8.0'} - dependencies: - '@balena/dockerignore': 1.0.2 - docker-modem: 3.0.8 - tar-fs: 2.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - dependencies: - esutils: 2.0.3 - - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - - /dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - dev: true - - /dom-align@1.12.4: - resolution: {integrity: sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==} - - /dom-converter@0.2.0: - resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} - dependencies: - utila: 0.4.0 - dev: false - - /dom-helpers@3.4.0: - resolution: {integrity: sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==} - dependencies: - '@babel/runtime': 7.21.0 - dev: false - - /dom-serializer@0.2.2: - resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} - dependencies: - domelementtype: 2.3.0 - entities: 2.2.0 - - /dom-serializer@1.4.1: - resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - entities: 2.2.0 - dev: false - - /dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.4.0 - dev: false - - /domelementtype@1.3.1: - resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} - - /domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - - /domexception@2.0.1: - resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} - engines: {node: '>=8'} + /domexception@2.0.1: + resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} + engines: {node: '>=8'} + deprecated: Use your platform's native DOMException instead dependencies: webidl-conversions: 5.0.0 dev: false @@ -13999,8 +11953,8 @@ packages: domhandler: 4.3.1 dev: false - /domutils@3.0.1: - resolution: {integrity: sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==} + /domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 @@ -14011,7 +11965,7 @@ packages: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dependencies: no-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /dot-prop@5.3.0: @@ -14026,7 +11980,7 @@ packages: hasBin: true dependencies: cross-spawn: 7.0.3 - dotenv: 16.3.1 + dotenv: 16.4.5 dotenv-expand: 8.0.3 minimist: 1.2.8 dev: true @@ -14045,13 +11999,13 @@ packages: engines: {node: '>=10'} dev: false - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + /dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} dev: true - /dset@3.1.2: - resolution: {integrity: sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q==} + /dset@3.1.3: + resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==} engines: {node: '>=4'} dev: true @@ -14062,13 +12016,13 @@ packages: /duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - /duplexify@4.1.2: - resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==} + /duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} dependencies: end-of-stream: 1.4.4 inherits: 2.0.4 readable-stream: 3.6.2 - stream-shift: 1.0.1 + stream-shift: 1.0.3 dev: false /dynamic-dedupe@0.3.0: @@ -14079,7 +12033,6 @@ packages: /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: false /ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} @@ -14087,44 +12040,45 @@ packages: safe-buffer: 5.2.1 dev: false - /edge-runtime@2.5.1: - resolution: {integrity: sha512-E0kY1Dqvwvk9yh7dvR56KnCjXf/dlbrrGjO5Sjnz9Ja3WqYT3csv2B8O4erxJiOWfWy9NTukBk4Kb3yrR66gBw==} + /edge-runtime@2.5.7: + resolution: {integrity: sha512-gA4qSVP0sNwJlkdQ2nahDPASlSl8twUd17o+JolPa1EtXpLTGzIpOETvodgJwXIxa+zaD8bnAXCdsWrx2PhlVQ==} engines: {node: '>=16'} hasBin: true dependencies: '@edge-runtime/format': 2.2.0 - '@edge-runtime/vm': 3.1.1 + '@edge-runtime/ponyfill': 2.4.1 + '@edge-runtime/vm': 3.1.7 async-listen: 3.0.1 mri: 1.2.0 picocolors: 1.0.0 - pretty-bytes: 5.6.0 pretty-ms: 7.0.1 signal-exit: 4.0.2 time-span: 4.0.0 dev: true - /editorconfig@0.15.3: - resolution: {integrity: sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==} + /editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} hasBin: true dependencies: - commander: 2.20.3 - lru-cache: 4.1.5 - semver: 5.7.1 - sigmund: 1.0.1 + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.6.3 dev: false /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - /ejs@3.1.9: - resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} + /ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} hasBin: true dependencies: - jake: 10.8.5 + jake: 10.9.2 - /electron-to-chromium@1.4.520: - resolution: {integrity: sha512-Frfus2VpYADsrh1lB3v/ft/WVFlVzOIm+Q0p7U7VqHI6qr7NWHYKe+Wif3W50n7JAFoBsWVsoU0+qDks6WQ60g==} + /electron-to-chromium@1.5.4: + resolution: {integrity: sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==} /emittery@0.10.2: resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} @@ -14175,54 +12129,27 @@ packages: dependencies: once: 1.4.0 - /enhanced-resolve@5.12.0: - resolution: {integrity: sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==} + /enhanced-resolve@5.17.1: + resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} engines: {node: '>=10.13.0'} dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 - dev: true - /enhanced-resolve@5.13.0: - resolution: {integrity: sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==} - engines: {node: '>=10.13.0'} + /ent@2.2.1: + resolution: {integrity: sha512-QHuXVeZx9d+tIQAz/XztU0ZwZf2Agg9CcXcgE1rurqvdBeDBrpSwjl8/6XUqMg7tw2Y7uAdKb2sRv+bSEFqQ5A==} + engines: {node: '>= 0.4'} + requiresBuild: true dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - dev: true + punycode: 1.4.1 + dev: false + optional: true - /enhanced-resolve@5.15.0: - resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} - engines: {node: '>=10.13.0'} - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - dev: true + /entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - /enhanced-resolve@5.17.0: - resolution: {integrity: sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==} - engines: {node: '>=10.13.0'} - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - - /ent@2.2.0: - resolution: {integrity: sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==} - requiresBuild: true - dev: false - optional: true - - /entities@2.1.0: - resolution: {integrity: sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==} - requiresBuild: true - dev: false - optional: true - - /entities@2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - - /entities@4.4.0: - resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} dev: false @@ -14230,8 +12157,8 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} - /envinfo@7.8.1: - resolution: {integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==} + /envinfo@7.13.0: + resolution: {integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==} engines: {node: '>=4'} hasBin: true @@ -14261,76 +12188,123 @@ packages: /error@10.4.0: resolution: {integrity: sha512-YxIFEJuhgcICugOUvRx5th0UM+ActZ9sjY0QJmeVwsQdvosZ7kYzc9QqS0Da3R5iUmgU5meGIxh0xBeZpMVeLw==} - /es-abstract@1.21.2: - resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} + /es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} engines: {node: '>= 0.4'} dependencies: - array-buffer-byte-length: 1.0.0 - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - es-set-tostringtag: 2.0.1 + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 es-to-primitive: 1.2.1 - function.prototype.name: 1.1.5 - get-intrinsic: 1.2.0 - get-symbol-description: 1.0.0 - globalthis: 1.0.3 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.4 gopd: 1.0.1 - has: 1.0.3 - has-property-descriptors: 1.0.0 - has-proto: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 has-symbols: 1.0.3 - internal-slot: 1.0.5 - is-array-buffer: 3.0.2 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 is-callable: 1.2.7 - is-negative-zero: 2.0.2 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 + is-shared-array-buffer: 1.0.3 is-string: 1.0.7 - is-typed-array: 1.1.10 + is-typed-array: 1.1.13 is-weakref: 1.0.2 - object-inspect: 1.12.3 + object-inspect: 1.13.2 object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.4.3 - safe-regex-test: 1.0.0 - string.prototype.trim: 1.2.7 - string.prototype.trimend: 1.0.6 - string.prototype.trimstart: 1.0.6 - typed-array-length: 1.0.4 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 unbox-primitive: 1.0.2 - which-typed-array: 1.1.9 + which-typed-array: 1.1.15 /es-array-method-boxes-properly@1.0.0: resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + /es-get-iterator@1.1.3: resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 has-symbols: 1.0.3 is-arguments: 1.1.1 - is-map: 2.0.2 - is-set: 2.0.2 + is-map: 2.0.3 + is-set: 2.0.3 is-string: 1.0.7 isarray: 2.0.5 stop-iteration-iterator: 1.0.0 - /es-module-lexer@1.2.1: - resolution: {integrity: sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==} + /es-iterator-helpers@1.0.19: + resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-set-tostringtag: 2.0.3 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + globalthis: 1.0.4 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + iterator.prototype: 1.1.2 + safe-array-concat: 1.1.2 + + /es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + + /es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 - /es-set-tostringtag@2.0.1: - resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + /es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.0 - has: 1.0.3 - has-tostringtag: 1.0.0 + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 - /es-shim-unscopables@1.0.0: - resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + /es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} dependencies: - has: 1.0.3 + hasown: 2.0.2 /es-to-primitive@1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} @@ -14556,8 +12530,8 @@ packages: esbuild-windows-arm64: 0.14.47 dev: true - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} /escape-goat@3.0.0: @@ -14580,16 +12554,10 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - /escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - dev: true - /escodegen@1.14.3: resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} engines: {node: '>=4.0'} hasBin: true - requiresBuild: true dependencies: esprima: 4.0.1 estraverse: 4.3.0 @@ -14598,23 +12566,21 @@ packages: optionalDependencies: source-map: 0.6.1 dev: false - optional: true - /escodegen@2.0.0: - resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} + /escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} engines: {node: '>=6.0'} hasBin: true dependencies: esprima: 4.0.1 estraverse: 5.3.0 esutils: 2.0.3 - optionator: 0.8.3 optionalDependencies: source-map: 0.6.1 dev: false - /eslint-config-next@13.0.0(eslint@8.29.0)(typescript@5.3.3): - resolution: {integrity: sha512-y2nqWS2tycWySdVhb+rhp6CuDmDazGySqkzzQZf3UTyfHyC7og1m5m/AtMFwCo5mtvDqvw1BENin52kV9733lg==} + /eslint-config-next@14.2.5(eslint@8.24.0)(typescript@5.5.4): + resolution: {integrity: sha512-zogs9zlOiZ7ka+wgUnmcM0KBEDjo4Jis7kxN1jvC0N4wynQ2MIx/KBkg4mVF63J5EK4W0QMCn7xO3vNisjaAoA==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 typescript: '>=3.3.1' @@ -14622,24 +12588,24 @@ packages: typescript: optional: true dependencies: - '@next/eslint-plugin-next': 13.0.0 - '@rushstack/eslint-patch': 1.2.0 - '@typescript-eslint/parser': 5.58.0(eslint@8.29.0)(typescript@5.3.3) - eslint: 8.29.0 - eslint-import-resolver-node: 0.3.7 - eslint-import-resolver-typescript: 2.7.1(eslint-plugin-import@2.27.5)(eslint@8.29.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.29.0) - eslint-plugin-jsx-a11y: 6.7.1(eslint@8.29.0) - eslint-plugin-react: 7.32.2(eslint@8.29.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.29.0) - typescript: 5.3.3 + '@next/eslint-plugin-next': 14.2.5 + '@rushstack/eslint-patch': 1.10.4 + '@typescript-eslint/parser': 6.21.0(eslint@8.24.0)(typescript@5.5.4) + eslint: 8.24.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.24.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.24.0) + eslint-plugin-jsx-a11y: 6.9.0(eslint@8.24.0) + eslint-plugin-react: 7.35.0(eslint@8.24.0) + eslint-plugin-react-hooks: 4.6.2(eslint@8.24.0) + typescript: 5.5.4 transitivePeerDependencies: - eslint-import-resolver-webpack - supports-color - dev: false + dev: true - /eslint-config-next@13.3.0(eslint@8.24.0)(typescript@5.3.3): - resolution: {integrity: sha512-6YEwmFBX0VjBd3ODGW9df0Is0FLaRFdMN8eAahQG9CN6LjQ28J8AFr19ngxqMSg7Qv6Uca/3VeeBosJh1bzu0w==} + /eslint-config-next@14.2.5(eslint@8.29.0)(typescript@5.5.4): + resolution: {integrity: sha512-zogs9zlOiZ7ka+wgUnmcM0KBEDjo4Jis7kxN1jvC0N4wynQ2MIx/KBkg4mVF63J5EK4W0QMCn7xO3vNisjaAoA==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 typescript: '>=3.3.1' @@ -14647,32 +12613,32 @@ packages: typescript: optional: true dependencies: - '@next/eslint-plugin-next': 13.3.0 - '@rushstack/eslint-patch': 1.2.0 - '@typescript-eslint/parser': 5.58.0(eslint@8.24.0)(typescript@5.3.3) - eslint: 8.24.0 - eslint-import-resolver-node: 0.3.7 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.24.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.24.0) - eslint-plugin-jsx-a11y: 6.7.1(eslint@8.24.0) - eslint-plugin-react: 7.32.2(eslint@8.24.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.24.0) - typescript: 5.3.3 + '@next/eslint-plugin-next': 14.2.5 + '@rushstack/eslint-patch': 1.10.4 + '@typescript-eslint/parser': 6.21.0(eslint@8.29.0)(typescript@5.5.4) + eslint: 8.29.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.29.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.29.0) + eslint-plugin-jsx-a11y: 6.9.0(eslint@8.29.0) + eslint-plugin-react: 7.35.0(eslint@8.29.0) + eslint-plugin-react-hooks: 4.6.2(eslint@8.29.0) + typescript: 5.5.4 transitivePeerDependencies: - eslint-import-resolver-webpack - supports-color - dev: true + dev: false - /eslint-config-prettier@9.1.0(eslint@8.55.0): + /eslint-config-prettier@9.1.0(eslint@8.57.0): resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.55.0 + eslint: 8.57.0 dev: true - /eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.55.0)(jest@27.5.1)(typescript@5.3.3): + /eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0)(jest@27.5.1)(typescript@5.5.4): resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -14682,22 +12648,22 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.21.4 - '@babel/eslint-parser': 7.21.3(@babel/core@7.21.4)(eslint@8.55.0) - '@rushstack/eslint-patch': 1.2.0 - '@typescript-eslint/eslint-plugin': 5.58.0(@typescript-eslint/parser@5.58.0)(eslint@8.55.0)(typescript@5.3.3) - '@typescript-eslint/parser': 5.58.0(eslint@8.55.0)(typescript@5.3.3) + '@babel/core': 7.25.2 + '@babel/eslint-parser': 7.25.1(@babel/core@7.25.2)(eslint@8.57.0) + '@rushstack/eslint-patch': 1.10.4 + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 - eslint: 8.55.0 - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.55.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint@8.55.0) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.58.0)(eslint@8.55.0)(jest@27.5.1)(typescript@5.3.3) - eslint-plugin-jsx-a11y: 6.7.1(eslint@8.55.0) - eslint-plugin-react: 7.32.2(eslint@8.55.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.55.0) - eslint-plugin-testing-library: 5.10.2(eslint@8.55.0)(typescript@5.3.3) - typescript: 5.3.3 + eslint: 8.57.0 + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0)(eslint@8.57.0) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.57.0)(jest@27.5.1)(typescript@5.5.4) + eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) + eslint-plugin-react: 7.35.0(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) + eslint-plugin-testing-library: 5.11.1(eslint@8.57.0)(typescript@5.5.4) + typescript: 5.5.4 transitivePeerDependencies: - '@babel/plugin-syntax-flow' - '@babel/plugin-transform-react-jsx' @@ -14707,59 +12673,63 @@ packages: - supports-color dev: false - /eslint-import-resolver-node@0.3.7: - resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} dependencies: debug: 3.2.7(supports-color@5.5.0) - is-core-module: 2.12.0 - resolve: 1.22.2 + is-core-module: 2.15.0 + resolve: 1.22.8 transitivePeerDependencies: - supports-color - /eslint-import-resolver-typescript@2.7.1(eslint-plugin-import@2.27.5)(eslint@8.29.0): - resolution: {integrity: sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==} - engines: {node: '>=4'} + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.24.0): + resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '*' eslint-plugin-import: '*' dependencies: - debug: 4.3.4 - eslint: 8.29.0 - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.29.0) - glob: 7.2.3 + debug: 4.3.6 + enhanced-resolve: 5.17.1 + eslint: 8.24.0 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.24.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.24.0) + fast-glob: 3.3.2 + get-tsconfig: 4.7.6 + is-core-module: 2.15.0 is-glob: 4.0.3 - resolve: 1.22.2 - tsconfig-paths: 3.14.2 transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack - supports-color - dev: false + dev: true - /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.24.0): - resolution: {integrity: sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==} + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.29.0): + resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '*' eslint-plugin-import: '*' dependencies: - debug: 4.3.4 - enhanced-resolve: 5.15.0 - eslint: 8.24.0 - eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.24.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.24.0) - get-tsconfig: 4.5.0 - globby: 13.1.4 - is-core-module: 2.12.0 + debug: 4.3.6 + enhanced-resolve: 5.17.1 + eslint: 8.29.0 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.29.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.29.0) + fast-glob: 3.3.2 + get-tsconfig: 4.7.6 + is-core-module: 2.15.0 is-glob: 4.0.3 - synckit: 0.8.5 transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - dev: true + dev: false - /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@2.7.1)(eslint@8.29.0): - resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} + /eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -14779,17 +12749,16 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.58.0(eslint@8.29.0)(typescript@5.3.3) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) debug: 3.2.7(supports-color@5.5.0) - eslint: 8.29.0 - eslint-import-resolver-node: 0.3.7 - eslint-import-resolver-typescript: 2.7.1(eslint-plugin-import@2.27.5)(eslint@8.29.0) + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color dev: false - /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.24.0): - resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} + /eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.24.0): + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -14809,17 +12778,17 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.58.0(eslint@8.24.0)(typescript@5.3.3) + '@typescript-eslint/parser': 6.21.0(eslint@8.24.0)(typescript@5.5.4) debug: 3.2.7(supports-color@5.5.0) eslint: 8.24.0 - eslint-import-resolver-node: 0.3.7 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.24.0) + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.24.0) transitivePeerDependencies: - supports-color dev: true - /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint@8.55.0): - resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} + /eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.29.0): + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -14839,15 +12808,16 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.58.0(eslint@8.55.0)(typescript@5.3.3) + '@typescript-eslint/parser': 6.21.0(eslint@8.29.0)(typescript@5.5.4) debug: 3.2.7(supports-color@5.5.0) - eslint: 8.55.0 - eslint-import-resolver-node: 0.3.7 + eslint: 8.29.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.29.0) transitivePeerDependencies: - supports-color dev: false - /eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.55.0): + /eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0): resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -14855,15 +12825,15 @@ packages: '@babel/plugin-transform-react-jsx': ^7.14.9 eslint: ^8.1.0 dependencies: - '@babel/plugin-syntax-flow': 7.21.4(@babel/core@7.21.4) - '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.21.4) - eslint: 8.55.0 + '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2) + eslint: 8.57.0 lodash: 4.17.21 string-natural-compare: 3.0.1 dev: false - /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.29.0): - resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0)(eslint@8.57.0): + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -14872,31 +12842,33 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.58.0(eslint@8.29.0)(typescript@5.3.3) - array-includes: 3.1.6 - array.prototype.flat: 1.3.1 - array.prototype.flatmap: 1.3.1 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 debug: 3.2.7(supports-color@5.5.0) doctrine: 2.1.0 - eslint: 8.29.0 - eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@2.7.1)(eslint@8.29.0) - has: 1.0.3 - is-core-module: 2.12.0 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + hasown: 2.0.2 + is-core-module: 2.15.0 is-glob: 4.0.3 minimatch: 3.1.2 - object.values: 1.1.6 - resolve: 1.22.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 semver: 6.3.1 - tsconfig-paths: 3.14.2 + tsconfig-paths: 3.15.0 transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color dev: false - /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.24.0): - resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.24.0): + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -14905,31 +12877,33 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.58.0(eslint@8.24.0)(typescript@5.3.3) - array-includes: 3.1.6 - array.prototype.flat: 1.3.1 - array.prototype.flatmap: 1.3.1 + '@typescript-eslint/parser': 6.21.0(eslint@8.24.0)(typescript@5.5.4) + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 debug: 3.2.7(supports-color@5.5.0) doctrine: 2.1.0 eslint: 8.24.0 - eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.24.0) - has: 1.0.3 - is-core-module: 2.12.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.24.0) + hasown: 2.0.2 + is-core-module: 2.15.0 is-glob: 4.0.3 minimatch: 3.1.2 - object.values: 1.1.6 - resolve: 1.22.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 semver: 6.3.1 - tsconfig-paths: 3.14.2 + tsconfig-paths: 3.15.0 transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color dev: true - /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.58.0)(eslint@8.55.0): - resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.29.0): + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -14938,30 +12912,32 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.58.0(eslint@8.55.0)(typescript@5.3.3) - array-includes: 3.1.6 - array.prototype.flat: 1.3.1 - array.prototype.flatmap: 1.3.1 + '@typescript-eslint/parser': 6.21.0(eslint@8.29.0)(typescript@5.5.4) + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 debug: 3.2.7(supports-color@5.5.0) doctrine: 2.1.0 - eslint: 8.55.0 - eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint@8.55.0) - has: 1.0.3 - is-core-module: 2.12.0 + eslint: 8.29.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.29.0) + hasown: 2.0.2 + is-core-module: 2.15.0 is-glob: 4.0.3 minimatch: 3.1.2 - object.values: 1.1.6 - resolve: 1.22.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 semver: 6.3.1 - tsconfig-paths: 3.14.2 + tsconfig-paths: 3.15.0 transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color dev: false - /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.58.0)(eslint@8.55.0)(jest@27.5.1)(typescript@5.3.3): + /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.57.0)(jest@27.5.1)(typescript@5.5.4): resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} peerDependencies: @@ -14974,92 +12950,92 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.58.0(@typescript-eslint/parser@5.58.0)(eslint@8.55.0)(typescript@5.3.3) - '@typescript-eslint/experimental-utils': 5.58.0(eslint@8.55.0)(typescript@5.3.3) - eslint: 8.55.0 - jest: 27.5.1(ts-node@10.8.2) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + eslint: 8.57.0 + jest: 27.5.1(ts-node@10.9.2) transitivePeerDependencies: - supports-color - typescript dev: false - /eslint-plugin-jsx-a11y@6.7.1(eslint@8.24.0): - resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} + /eslint-plugin-jsx-a11y@6.9.0(eslint@8.24.0): + resolution: {integrity: sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==} engines: {node: '>=4.0'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - '@babel/runtime': 7.21.0 aria-query: 5.1.3 - array-includes: 3.1.6 - array.prototype.flatmap: 1.3.1 - ast-types-flow: 0.0.7 - axe-core: 4.6.3 + array-includes: 3.1.8 + array.prototype.flatmap: 1.3.2 + ast-types-flow: 0.0.8 + axe-core: 4.10.0 axobject-query: 3.1.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 + es-iterator-helpers: 1.0.19 eslint: 8.24.0 - has: 1.0.3 - jsx-ast-utils: 3.3.3 - language-tags: 1.0.5 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 minimatch: 3.1.2 - object.entries: 1.1.6 - object.fromentries: 2.0.6 - semver: 6.3.1 + object.fromentries: 2.0.8 + safe-regex-test: 1.0.3 + string.prototype.includes: 2.0.0 dev: true - /eslint-plugin-jsx-a11y@6.7.1(eslint@8.29.0): - resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} + /eslint-plugin-jsx-a11y@6.9.0(eslint@8.29.0): + resolution: {integrity: sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==} engines: {node: '>=4.0'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - '@babel/runtime': 7.21.0 aria-query: 5.1.3 - array-includes: 3.1.6 - array.prototype.flatmap: 1.3.1 - ast-types-flow: 0.0.7 - axe-core: 4.6.3 + array-includes: 3.1.8 + array.prototype.flatmap: 1.3.2 + ast-types-flow: 0.0.8 + axe-core: 4.10.0 axobject-query: 3.1.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 + es-iterator-helpers: 1.0.19 eslint: 8.29.0 - has: 1.0.3 - jsx-ast-utils: 3.3.3 - language-tags: 1.0.5 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 minimatch: 3.1.2 - object.entries: 1.1.6 - object.fromentries: 2.0.6 - semver: 6.3.1 + object.fromentries: 2.0.8 + safe-regex-test: 1.0.3 + string.prototype.includes: 2.0.0 dev: false - /eslint-plugin-jsx-a11y@6.7.1(eslint@8.55.0): - resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} + /eslint-plugin-jsx-a11y@6.9.0(eslint@8.57.0): + resolution: {integrity: sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==} engines: {node: '>=4.0'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - '@babel/runtime': 7.21.0 aria-query: 5.1.3 - array-includes: 3.1.6 - array.prototype.flatmap: 1.3.1 - ast-types-flow: 0.0.7 - axe-core: 4.6.3 + array-includes: 3.1.8 + array.prototype.flatmap: 1.3.2 + ast-types-flow: 0.0.8 + axe-core: 4.10.0 axobject-query: 3.1.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 8.55.0 - has: 1.0.3 - jsx-ast-utils: 3.3.3 - language-tags: 1.0.5 + es-iterator-helpers: 1.0.19 + eslint: 8.57.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 minimatch: 3.1.2 - object.entries: 1.1.6 - object.fromentries: 2.0.6 - semver: 6.3.1 + object.fromentries: 2.0.8 + safe-regex-test: 1.0.3 + string.prototype.includes: 2.0.0 dev: false - /eslint-plugin-react-hooks@4.6.0(eslint@8.24.0): - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + /eslint-plugin-react-hooks@4.6.2(eslint@8.24.0): + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 @@ -15067,8 +13043,8 @@ packages: eslint: 8.24.0 dev: true - /eslint-plugin-react-hooks@4.6.0(eslint@8.29.0): - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + /eslint-plugin-react-hooks@4.6.2(eslint@8.29.0): + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 @@ -15076,95 +13052,104 @@ packages: eslint: 8.29.0 dev: false - /eslint-plugin-react-hooks@4.6.0(eslint@8.55.0): - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + /eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: - eslint: 8.55.0 + eslint: 8.57.0 dev: false - /eslint-plugin-react@7.32.2(eslint@8.24.0): - resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} + /eslint-plugin-react@7.35.0(eslint@8.24.0): + resolution: {integrity: sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==} engines: {node: '>=4'} peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 dependencies: - array-includes: 3.1.6 - array.prototype.flatmap: 1.3.1 - array.prototype.tosorted: 1.1.1 + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.2 + array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 + es-iterator-helpers: 1.0.19 eslint: 8.24.0 estraverse: 5.3.0 - jsx-ast-utils: 3.3.3 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 minimatch: 3.1.2 - object.entries: 1.1.6 - object.fromentries: 2.0.6 - object.hasown: 1.1.2 - object.values: 1.1.6 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.values: 1.2.0 prop-types: 15.8.1 - resolve: 2.0.0-next.4 + resolve: 2.0.0-next.5 semver: 6.3.1 - string.prototype.matchall: 4.0.8 + string.prototype.matchall: 4.0.11 + string.prototype.repeat: 1.0.0 dev: true - /eslint-plugin-react@7.32.2(eslint@8.29.0): - resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} + /eslint-plugin-react@7.35.0(eslint@8.29.0): + resolution: {integrity: sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==} engines: {node: '>=4'} peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 dependencies: - array-includes: 3.1.6 - array.prototype.flatmap: 1.3.1 - array.prototype.tosorted: 1.1.1 + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.2 + array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 + es-iterator-helpers: 1.0.19 eslint: 8.29.0 estraverse: 5.3.0 - jsx-ast-utils: 3.3.3 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 minimatch: 3.1.2 - object.entries: 1.1.6 - object.fromentries: 2.0.6 - object.hasown: 1.1.2 - object.values: 1.1.6 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.values: 1.2.0 prop-types: 15.8.1 - resolve: 2.0.0-next.4 + resolve: 2.0.0-next.5 semver: 6.3.1 - string.prototype.matchall: 4.0.8 + string.prototype.matchall: 4.0.11 + string.prototype.repeat: 1.0.0 dev: false - /eslint-plugin-react@7.32.2(eslint@8.55.0): - resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} + /eslint-plugin-react@7.35.0(eslint@8.57.0): + resolution: {integrity: sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==} engines: {node: '>=4'} peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 dependencies: - array-includes: 3.1.6 - array.prototype.flatmap: 1.3.1 - array.prototype.tosorted: 1.1.1 + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.2 + array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 - eslint: 8.55.0 + es-iterator-helpers: 1.0.19 + eslint: 8.57.0 estraverse: 5.3.0 - jsx-ast-utils: 3.3.3 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 minimatch: 3.1.2 - object.entries: 1.1.6 - object.fromentries: 2.0.6 - object.hasown: 1.1.2 - object.values: 1.1.6 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.values: 1.2.0 prop-types: 15.8.1 - resolve: 2.0.0-next.4 + resolve: 2.0.0-next.5 semver: 6.3.1 - string.prototype.matchall: 4.0.8 + string.prototype.matchall: 4.0.11 + string.prototype.repeat: 1.0.0 dev: false - /eslint-plugin-testing-library@5.10.2(eslint@8.55.0)(typescript@5.3.3): - resolution: {integrity: sha512-f1DmDWcz5SDM+IpCkEX0lbFqrrTs8HRsEElzDEqN/EBI0hpRj8Cns5+IVANXswE8/LeybIJqPAOQIFu2j5Y5sw==} + /eslint-plugin-testing-library@5.11.1(eslint@8.57.0)(typescript@5.5.4): + resolution: {integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} peerDependencies: eslint: ^7.5.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.58.0(eslint@8.55.0)(typescript@5.3.3) - eslint: 8.55.0 + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + eslint: 8.57.0 transitivePeerDependencies: - supports-color - typescript @@ -15196,13 +13181,6 @@ packages: esrecurse: 4.3.0 estraverse: 4.3.0 - /eslint-scope@7.1.1: - resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - /eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -15234,28 +13212,24 @@ packages: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} - /eslint-visitor-keys@3.4.0: - resolution: {integrity: sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /eslint-webpack-plugin@3.2.0(eslint@8.55.0)(webpack@5.91.0): + /eslint-webpack-plugin@3.2.0(eslint@8.57.0)(webpack@5.93.0): resolution: {integrity: sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==} engines: {node: '>= 12.13.0'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 webpack: ^5.0.0 dependencies: - '@types/eslint': 8.37.0 - eslint: 8.55.0 + '@types/eslint': 8.56.11 + eslint: 8.57.0 jest-worker: 28.1.3 - micromatch: 4.0.5 + micromatch: 4.0.7 normalize-path: 3.0.0 - schema-utils: 4.0.0 - webpack: 5.91.0(webpack-cli@5.1.4) + schema-utils: 4.2.0 + webpack: 5.93.0(webpack-cli@5.1.4) dev: false /eslint@8.24.0: @@ -15270,34 +13244,34 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4 + debug: 4.3.6 doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.1.1 + eslint-scope: 7.2.2 eslint-utils: 3.0.0(eslint@8.24.0) - eslint-visitor-keys: 3.4.0 - espree: 9.5.1 - esquery: 1.5.0 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.20.0 + globals: 13.24.0 globby: 11.1.0 grapheme-splitter: 1.0.4 - ignore: 5.2.4 + ignore: 5.3.1 import-fresh: 3.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 - js-sdsl: 4.4.0 + js-sdsl: 4.4.2 js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.1 + optionator: 0.9.4 regexpp: 3.2.0 strip-ansi: 6.0.1 strip-json-comments: 3.1.1 @@ -15312,40 +13286,40 @@ packages: hasBin: true dependencies: '@eslint/eslintrc': 1.4.1 - '@humanwhocodes/config-array': 0.11.8 + '@humanwhocodes/config-array': 0.11.14 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4 + debug: 4.3.6 doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.1.1 + eslint-scope: 7.2.2 eslint-utils: 3.0.0(eslint@8.29.0) - eslint-visitor-keys: 3.4.0 - espree: 9.5.1 - esquery: 1.5.0 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.20.0 + globals: 13.24.0 grapheme-splitter: 1.0.4 - ignore: 5.2.4 + ignore: 5.3.1 import-fresh: 3.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 - js-sdsl: 4.4.0 + js-sdsl: 4.4.2 js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.1 + optionator: 0.9.4 regexpp: 3.2.0 strip-ansi: 6.0.1 strip-json-comments: 3.1.1 @@ -15354,15 +13328,15 @@ packages: - supports-color dev: false - /eslint@8.55.0: - resolution: {integrity: sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==} + /eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) - '@eslint-community/regexpp': 4.10.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.11.0 '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.55.0 + '@eslint/js': 8.57.0 '@humanwhocodes/config-array': 0.11.14 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 @@ -15370,21 +13344,21 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4 + debug: 4.3.6 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - esquery: 1.5.0 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.20.0 + globals: 13.24.0 graphemer: 1.4.0 - ignore: 5.2.4 + ignore: 5.3.1 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -15394,35 +13368,33 @@ packages: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.3 + optionator: 0.9.4 strip-ansi: 6.0.1 text-table: 0.2.0 transitivePeerDependencies: - supports-color - /espree@9.5.1: - resolution: {integrity: sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) - eslint-visitor-keys: 3.4.3 - /espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) eslint-visitor-keys: 3.4.3 + /esprima@1.2.2: + resolution: {integrity: sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + /esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 @@ -15462,7 +13434,6 @@ packages: /event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} - dev: false /eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} @@ -15540,17 +13511,6 @@ packages: jest-util: 28.1.3 dev: true - /expect@29.5.0: - resolution: {integrity: sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/expect-utils': 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - dev: true - /expect@29.7.0: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -15561,16 +13521,19 @@ packages: jest-message-util: 29.7.0 jest-util: 29.7.0 - /express@4.18.2: - resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + /exponential-backoff@3.1.1: + resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} + + /express@4.19.2: + resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} engines: {node: '>= 0.10.0'} dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.1 + body-parser: 1.20.2 content-disposition: 0.5.4 content-type: 1.0.5 - cookie: 0.5.0 + cookie: 0.6.0 cookie-signature: 1.0.6 debug: 2.6.9 depd: 2.0.0 @@ -15616,10 +13579,10 @@ packages: engines: {'0': node >=0.6.0} dev: false - /facebook-nodejs-business-sdk@19.0.0: - resolution: {integrity: sha512-/e8MoXj7gI5xdNQzq454QdCrPs1WWa0Bo1ovKo9927mrFNGiMugoJeXvzXxqEu0Iabm02ZFpIRCpdODj0LUL2g==} + /facebook-nodejs-business-sdk@19.0.3: + resolution: {integrity: sha512-u594CNtN3ypU+VOSvwIm7tUpHZj67jt06EDbSaAyOvbIawg1gUnSCDtaZscypydrjJXBZuQVd5ltPqftSMn8fQ==} dependencies: - axios: 1.6.7 + axios: 1.7.2 currency-codes: 1.5.1 iso-3166-1: 2.1.1 js-sha256: 0.9.0 @@ -15636,16 +13599,6 @@ packages: engines: {node: '>=6.0.0'} dev: false - /fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - /fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -15654,8 +13607,7 @@ packages: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 - dev: true + micromatch: 4.0.7 /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -15663,10 +13615,6 @@ packages: /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - /fast-loops@1.1.3: - resolution: {integrity: sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g==} - dev: false - /fast-shallow-equal@1.0.0: resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==} dev: false @@ -15675,8 +13623,8 @@ packages: resolution: {integrity: sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==} dev: false - /fast-xml-parser@4.2.5: - resolution: {integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==} + /fast-xml-parser@4.4.1: + resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} hasBin: true dependencies: strnum: 1.0.5 @@ -15694,8 +13642,8 @@ packages: resolution: {integrity: sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==} dev: true - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + /fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} dependencies: reusify: 1.0.4 @@ -15713,7 +13661,7 @@ packages: /fbemitter@3.0.0: resolution: {integrity: sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==} dependencies: - fbjs: 3.0.4 + fbjs: 3.0.5 transitivePeerDependencies: - encoding dev: false @@ -15722,16 +13670,16 @@ packages: resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} dev: false - /fbjs@3.0.4: - resolution: {integrity: sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==} + /fbjs@3.0.5: + resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} dependencies: - cross-fetch: 3.1.5 + cross-fetch: 3.1.8 fbjs-css-vars: 1.0.2 loose-envify: 1.4.0 object-assign: 4.1.1 promise: 7.3.1 setimmediate: 1.0.5 - ua-parser-js: 0.7.35 + ua-parser-js: 1.0.38 transitivePeerDependencies: - encoding dev: false @@ -15747,10 +13695,11 @@ packages: engines: {node: ^12.20 || >= 14.13} dependencies: node-domexception: 1.0.0 - web-streams-polyfill: 3.2.1 + web-streams-polyfill: 3.3.3 + dev: true - /figlet@1.6.0: - resolution: {integrity: sha512-31EQGhCEITv6+hi2ORRPyn3bulaV9Fl4xOdR169cBzH/n1UqcxsiSB/noo6SJdD7Kfb1Ljit+IgR1USvF/XbdA==} + /figlet@1.7.0: + resolution: {integrity: sha512-gO8l3wvqo0V7wEFLXPbkX83b7MVjRrk1oRLfYlZXol8nEpb/ON9pcKLI4qpBv5YtOTfrINtqb7b40iYY2FTWFg==} engines: {node: '>= 0.4.0'} hasBin: true dev: false @@ -15769,21 +13718,13 @@ packages: dependencies: escape-string-regexp: 1.0.5 - /figures@5.0.0: - resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} - engines: {node: '>=14'} - dependencies: - escape-string-regexp: 5.0.0 - is-unicode-supported: 1.3.0 - dev: true - /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flat-cache: 3.0.4 + flat-cache: 3.2.0 - /file-loader@6.2.0(webpack@5.91.0): + /file-loader@6.2.0(webpack@5.93.0): resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -15791,7 +13732,7 @@ packages: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.91.0(webpack-cli@5.1.4) + webpack: 5.93.0(webpack-cli@5.1.4) dev: false /file-uri-to-path@1.0.0: @@ -15813,8 +13754,8 @@ packages: engines: {node: '>= 0.4.0'} dev: false - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 @@ -15885,61 +13826,61 @@ packages: /find-yarn-workspace-root2@1.2.16: resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} dependencies: - micromatch: 4.0.5 + micromatch: 4.0.7 pkg-dir: 4.2.0 - /firebase-admin@11.11.0: - resolution: {integrity: sha512-lp784gXFAJgUEtjSdYNZGTWZqltqjBkoaPSQhDKnmWXJP/MCbWdiDY1hsdkl/6O4O4KFovTjUDLu26sojwdQvw==} + /firebase-admin@11.11.1: + resolution: {integrity: sha512-UyEbq+3u6jWzCYbUntv/HuJiTixwh36G1R9j0v71mSvGAx/YZEWEW7uSGLYxBYE6ckVRQoKMr40PYUEzrm/4dg==} engines: {node: '>=14'} dependencies: '@fastify/busboy': 1.2.1 '@firebase/database-compat': 0.3.4 '@firebase/database-types': 0.10.4 - '@types/node': 20.14.2 + '@types/node': 18.19.42 jsonwebtoken: 9.0.2 - jwks-rsa: 3.0.1 + jwks-rsa: 3.1.0 node-forge: 1.3.1 - uuid: 9.0.0 + uuid: 9.0.1 optionalDependencies: - '@google-cloud/firestore': 6.7.0 - '@google-cloud/storage': 6.9.5 + '@google-cloud/firestore': 6.8.0 + '@google-cloud/storage': 6.12.0 transitivePeerDependencies: - encoding - supports-color dev: false - /firebase@10.4.0: - resolution: {integrity: sha512-3Z8WsNwA7kbcKGZ+nrTZ/ES518pk0K440ZJYD8nUNKN5hV6ll+unhUw30t1msedN6yIFjhsC/9OwT4Z0ohwO2w==} - dependencies: - '@firebase/analytics': 0.10.0(@firebase/app@0.9.19) - '@firebase/analytics-compat': 0.2.6(@firebase/app-compat@0.2.19)(@firebase/app@0.9.19) - '@firebase/app': 0.9.19 - '@firebase/app-check': 0.8.0(@firebase/app@0.9.19) - '@firebase/app-check-compat': 0.3.7(@firebase/app-compat@0.2.19)(@firebase/app@0.9.19) - '@firebase/app-compat': 0.2.19 - '@firebase/app-types': 0.9.0 - '@firebase/auth': 1.3.0(@firebase/app@0.9.19) - '@firebase/auth-compat': 0.4.6(@firebase/app-compat@0.2.19)(@firebase/app-types@0.9.0)(@firebase/app@0.9.19) - '@firebase/database': 1.0.1 - '@firebase/database-compat': 1.0.1 - '@firebase/firestore': 4.2.0(@firebase/app@0.9.19) - '@firebase/firestore-compat': 0.3.18(@firebase/app-compat@0.2.19)(@firebase/app-types@0.9.0)(@firebase/app@0.9.19) - '@firebase/functions': 0.10.0(@firebase/app@0.9.19) - '@firebase/functions-compat': 0.3.5(@firebase/app-compat@0.2.19)(@firebase/app@0.9.19) - '@firebase/installations': 0.6.4(@firebase/app@0.9.19) - '@firebase/installations-compat': 0.2.4(@firebase/app-compat@0.2.19)(@firebase/app-types@0.9.0)(@firebase/app@0.9.19) - '@firebase/messaging': 0.12.4(@firebase/app@0.9.19) - '@firebase/messaging-compat': 0.2.4(@firebase/app-compat@0.2.19)(@firebase/app@0.9.19) - '@firebase/performance': 0.6.4(@firebase/app@0.9.19) - '@firebase/performance-compat': 0.2.4(@firebase/app-compat@0.2.19)(@firebase/app@0.9.19) - '@firebase/remote-config': 0.4.4(@firebase/app@0.9.19) - '@firebase/remote-config-compat': 0.2.4(@firebase/app-compat@0.2.19)(@firebase/app@0.9.19) - '@firebase/storage': 0.11.2(@firebase/app@0.9.19) - '@firebase/storage-compat': 0.3.2(@firebase/app-compat@0.2.19)(@firebase/app-types@0.9.0)(@firebase/app@0.9.19) - '@firebase/util': 1.9.3 + /firebase@10.12.4: + resolution: {integrity: sha512-SQz49NMpwG4MLTPZ9C8jBp7IyS2haTvsIvjclgu+v/jvzNtjZoxIcoF6A13EIfBHmJ5eiuVlvttxElOf7LnJew==} + dependencies: + '@firebase/analytics': 0.10.6(@firebase/app@0.10.7) + '@firebase/analytics-compat': 0.2.12(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7) + '@firebase/app': 0.10.7 + '@firebase/app-check': 0.8.6(@firebase/app@0.10.7) + '@firebase/app-check-compat': 0.3.13(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7) + '@firebase/app-compat': 0.2.37 + '@firebase/app-types': 0.9.2 + '@firebase/auth': 1.7.5(@firebase/app@0.10.7) + '@firebase/auth-compat': 0.5.10(@firebase/app-compat@0.2.37)(@firebase/app-types@0.9.2)(@firebase/app@0.10.7) + '@firebase/database': 1.0.6 + '@firebase/database-compat': 1.0.6 + '@firebase/firestore': 4.6.4(@firebase/app@0.10.7) + '@firebase/firestore-compat': 0.3.33(@firebase/app-compat@0.2.37)(@firebase/app-types@0.9.2)(@firebase/app@0.10.7) + '@firebase/functions': 0.11.6(@firebase/app@0.10.7) + '@firebase/functions-compat': 0.3.12(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7) + '@firebase/installations': 0.6.8(@firebase/app@0.10.7) + '@firebase/installations-compat': 0.2.8(@firebase/app-compat@0.2.37)(@firebase/app-types@0.9.2)(@firebase/app@0.10.7) + '@firebase/messaging': 0.12.10(@firebase/app@0.10.7) + '@firebase/messaging-compat': 0.2.10(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7) + '@firebase/performance': 0.6.8(@firebase/app@0.10.7) + '@firebase/performance-compat': 0.2.8(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7) + '@firebase/remote-config': 0.4.8(@firebase/app@0.10.7) + '@firebase/remote-config-compat': 0.2.8(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7) + '@firebase/storage': 0.12.6(@firebase/app@0.10.7) + '@firebase/storage-compat': 0.3.9(@firebase/app-compat@0.2.37)(@firebase/app-types@0.9.2)(@firebase/app@0.10.7) + '@firebase/util': 1.9.7 + '@firebase/vertexai-preview': 0.0.3(@firebase/app-types@0.9.2)(@firebase/app@0.10.7) transitivePeerDependencies: - '@react-native-async-storage/async-storage' - - encoding /first-chunk-stream@2.0.0: resolution: {integrity: sha512-X8Z+b/0L4lToKYq+lwnKqi9X/Zek0NibLpsJgVsSxpoYq7JtiCtRb5HqKVEjEw/qAb/4AKKRLOwwKHlWNpm2Eg==} @@ -15951,30 +13892,35 @@ packages: resolution: {integrity: sha512-VvKbnaxrC0polTFDC+teKPTdl2mn6B/KUW+WB3C9RzKDeNwbzfLdnUz3FxC+tnjvus6bI0jWrWicQyVIPdS37A==} dev: false - /flat-cache@3.0.4: - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flatted: 3.2.7 + flatted: 3.3.1 + keyv: 4.5.4 rimraf: 3.0.2 - /flatted@3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + /flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + /flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - /flux@4.0.4(react@18.2.0): + /flux@4.0.4(react@18.3.1): resolution: {integrity: sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==} peerDependencies: react: ^15.0.2 || ^16.0.0 || ^17.0.0 dependencies: fbemitter: 3.0.0 - fbjs: 3.0.4 - react: 18.2.0 + fbjs: 3.0.5 + react: 18.3.1 transitivePeerDependencies: - encoding dev: false - /follow-redirects@1.15.5: - resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + /follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -15988,7 +13934,14 @@ packages: dependencies: is-callable: 1.2.7 - /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.55.0)(typescript@5.3.3)(webpack@5.91.0): + /foreground-child@3.2.1: + resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.0)(typescript@5.5.4)(webpack@5.93.0): resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} engines: {node: '>=10', yarn: '>=1.0.0'} peerDependencies: @@ -16002,22 +13955,22 @@ packages: vue-template-compiler: optional: true dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.7 '@types/json-schema': 7.0.15 chalk: 4.1.2 - chokidar: 3.5.3 + chokidar: 3.6.0 cosmiconfig: 6.0.0 deepmerge: 4.3.1 - eslint: 8.55.0 + eslint: 8.57.0 fs-extra: 9.1.0 glob: 7.2.3 - memfs: 3.5.0 + memfs: 3.5.3 minimatch: 3.1.2 schema-utils: 2.7.0 - semver: 7.5.4 + semver: 7.6.3 tapable: 1.1.3 - typescript: 5.3.3 - webpack: 5.91.0(webpack-cli@5.1.4) + typescript: 5.5.4 + webpack: 5.93.0(webpack-cli@5.1.4) dev: false /form-data@2.5.1: @@ -16052,13 +14005,14 @@ packages: engines: {node: '>=12.20.0'} dependencies: fetch-blob: 3.2.0 + dev: true /forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} - /fraction.js@4.2.0: - resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} /fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} @@ -16073,7 +14027,7 @@ packages: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 - universalify: 2.0.0 + universalify: 2.0.1 dev: false /fs-extra@11.1.0: @@ -16082,7 +14036,7 @@ packages: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 - universalify: 2.0.0 + universalify: 2.0.1 dev: true /fs-extra@8.1.0: @@ -16101,7 +14055,7 @@ packages: at-least-node: 1.0.0 graceful-fs: 4.2.11 jsonfile: 6.1.0 - universalify: 2.0.0 + universalify: 2.0.1 dev: false /fs-minipass@1.2.7: @@ -16116,8 +14070,14 @@ packages: dependencies: minipass: 3.3.6 - /fs-monkey@1.0.3: - resolution: {integrity: sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==} + /fs-minipass@3.0.3: + resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minipass: 7.1.2 + + /fs-monkey@1.0.6: + resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==} dev: false /fs.realpath@1.0.0: @@ -16139,16 +14099,23 @@ packages: requiresBuild: true optional: true + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + /function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - /function.prototype.name@1.1.5: - resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 functions-have-names: 1.2.3 /functional-red-black-tree@1.0.1: @@ -16162,6 +14129,7 @@ packages: /gauge@2.7.4: resolution: {integrity: sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==} + deprecated: This package is no longer supported. dependencies: aproba: 1.2.0 console-control-strings: 1.1.0 @@ -16176,6 +14144,7 @@ packages: /gauge@3.0.2: resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} engines: {node: '>=10'} + deprecated: This package is no longer supported. dependencies: aproba: 2.0.0 color-support: 1.1.3 @@ -16190,6 +14159,7 @@ packages: /gauge@4.0.4: resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. dependencies: aproba: 2.0.0 color-support: 1.1.3 @@ -16214,8 +14184,8 @@ packages: - supports-color dev: false - /gaxios@5.1.0: - resolution: {integrity: sha512-aezGIjb+/VfsJtIcHGcBSerNEDdfdHeMros+RbYbGpmonKWQCOVOes0LVZhn1lDtIgq55qq0HaxymIoae3Fl/A==} + /gaxios@5.1.3: + resolution: {integrity: sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==} engines: {node: '>=12'} requiresBuild: true dependencies: @@ -16229,28 +14199,15 @@ packages: dev: false optional: true - /gaxios@6.0.4: - resolution: {integrity: sha512-mwKfHJn7f3pLRfahdEPNyvygXRwjwgsgDPaIIoBRIDkgP4SFyezkYGWQ2aLCfrAnzimSrP+mAg1aSUj5gidXvw==} - engines: {node: '>=14'} - dependencies: - extend: 3.0.2 - https-proxy-agent: 7.0.1 - is-stream: 2.0.1 - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /gaxios@6.6.0: - resolution: {integrity: sha512-bpOZVQV5gthH/jVCSuYuokRo2bTKOcuBiVWpjmTn6C5Agl5zclGfTljuGsQZxwwDBkli+YhZhP4TdlqTnhOezQ==} + /gaxios@6.7.0: + resolution: {integrity: sha512-DSrkyMTfAnAm4ks9Go20QGOcXEyW/NmZhvTYBU2rb4afBB393WIMQPWPEDMl/k8xqiNN9HYq2zao3oWXsdl2Tg==} engines: {node: '>=14'} dependencies: extend: 3.0.2 - https-proxy-agent: 7.0.1 + https-proxy-agent: 7.0.5 is-stream: 2.0.1 node-fetch: 2.7.0 - uuid: 9.0.1 + uuid: 10.0.0 transitivePeerDependencies: - encoding - supports-color @@ -16267,12 +14224,12 @@ packages: - supports-color dev: false - /gcp-metadata@5.2.0: - resolution: {integrity: sha512-aFhhvvNycky2QyhG+dcfEdHBF0FRbYcf39s6WNHUDysKSrbJ5vuFbjydxBcmewtXeV248GP8dWT3ByPNxsyHCw==} + /gcp-metadata@5.3.0: + resolution: {integrity: sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==} engines: {node: '>=12'} requiresBuild: true dependencies: - gaxios: 5.1.0 + gaxios: 5.1.3 json-bigint: 1.0.0 transitivePeerDependencies: - encoding @@ -16280,22 +14237,11 @@ packages: dev: false optional: true - /gcp-metadata@6.0.0: - resolution: {integrity: sha512-Ozxyi23/1Ar51wjUT2RDklK+3HxqDr8TLBNK8rBBFQ7T85iIGnXnVusauj06QyqCXRFZig8LZC+TUddWbndlpQ==} - engines: {node: '>=14'} - dependencies: - gaxios: 6.0.4 - json-bigint: 1.0.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - /gcp-metadata@6.1.0: resolution: {integrity: sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==} engines: {node: '>=14'} dependencies: - gaxios: 6.6.0 + gaxios: 6.7.0 json-bigint: 1.0.0 transitivePeerDependencies: - encoding @@ -16326,12 +14272,15 @@ packages: engines: {node: '>=18'} dev: false - /get-intrinsic@1.2.0: - resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} dependencies: + es-errors: 1.3.0 function-bind: 1.1.2 - has: 1.0.3 + has-proto: 1.0.3 has-symbols: 1.0.3 + hasown: 2.0.2 /get-own-enumerable-property-symbols@3.0.2: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} @@ -16357,16 +14306,18 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - /get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + /get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 - /get-tsconfig@4.5.0: - resolution: {integrity: sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==} - dev: true + /get-tsconfig@4.7.6: + resolution: {integrity: sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==} + dependencies: + resolve-pkg-maps: 1.0.0 /github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} @@ -16395,28 +14346,31 @@ packages: /glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - /glob@7.1.6: - resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 + foreground-child: 3.2.1 + jackspeak: 2.3.6 + minimatch: 9.0.5 + minipass: 7.1.2 + path-scurry: 1.11.1 - /glob@7.1.7: - resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + /glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 + foreground-child: 3.2.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -16428,6 +14382,7 @@ packages: /glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -16455,17 +14410,18 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - /globals@13.20.0: - resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + /globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} dependencies: - define-properties: 1.2.0 + define-properties: 1.2.1 + gopd: 1.0.1 /globalyzer@0.1.0: resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} @@ -16477,29 +14433,18 @@ packages: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.12 - ignore: 5.2.4 + fast-glob: 3.3.2 + ignore: 5.3.1 merge2: 1.4.1 slash: 3.0.0 - /globby@13.1.4: - resolution: {integrity: sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - dir-glob: 3.0.1 - fast-glob: 3.2.12 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 4.0.0 - dev: true - - /globby@14.0.1: - resolution: {integrity: sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==} + /globby@14.0.2: + resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} engines: {node: '>=18'} dependencies: '@sindresorhus/merge-streams': 2.3.0 fast-glob: 3.3.2 - ignore: 5.2.4 + ignore: 5.3.1 path-type: 5.0.0 slash: 5.1.0 unicorn-magic: 0.1.0 @@ -16524,11 +14469,11 @@ packages: resolution: {integrity: sha512-0XdXmlycfoWxTOg/Sr2djdUepNYojvx+MHJXKT0TKRyhH5a2V/lGqtht1H3QktOpjIGFuAdcXSHB46AIxZg+9g==} dependencies: '@isaacs/ttlcache': 1.4.1 - axios: 1.6.7 + axios: 1.7.2 circ-json: 1.0.4 google-ads-node: 13.0.0 google-auth-library: 7.14.1 - google-gax: 4.3.7 + google-gax: 4.3.8 long: 4.0.0 map-obj: 4.3.0 stream-json: 1.8.0 @@ -16541,8 +14486,8 @@ packages: /google-ads-node@13.0.0: resolution: {integrity: sha512-A8g+58gJrSQqN88OTlg3Y3x7JTMUT62ZMUMtfznEs3RKKNQFnz8cv077031NVpmgS1eSXbcdYTDtaCGkhWSv2g==} dependencies: - google-gax: 4.3.7 - lru-cache: 10.2.2 + google-gax: 4.3.8 + lru-cache: 10.4.3 transitivePeerDependencies: - encoding - supports-color @@ -16566,8 +14511,8 @@ packages: - supports-color dev: false - /google-auth-library@8.7.0: - resolution: {integrity: sha512-1M0NG5VDIvJZEnstHbRdckLZESoJwguinwN8Dhae0j2ZKIQFIV63zxm6Fo6nM4xkgqUr2bbMtV5Dgo+Hy6oo0Q==} + /google-auth-library@8.9.0: + resolution: {integrity: sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg==} engines: {node: '>=12'} requiresBuild: true dependencies: @@ -16575,8 +14520,8 @@ packages: base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 fast-text-encoding: 1.0.6 - gaxios: 5.1.0 - gcp-metadata: 5.2.0 + gaxios: 5.1.3 + gcp-metadata: 5.3.0 gtoken: 6.1.2 jws: 4.0.0 lru-cache: 6.0.0 @@ -16586,57 +14531,41 @@ packages: dev: false optional: true - /google-auth-library@9.0.0: - resolution: {integrity: sha512-IQGjgQoVUAfOk6khqTVMLvWx26R+yPw9uLyb1MNyMQpdKiKt0Fd9sp4NWoINjyGHR8S3iw12hMTYK7O8J07c6Q==} - engines: {node: '>=14'} - dependencies: - base64-js: 1.5.1 - ecdsa-sig-formatter: 1.0.11 - gaxios: 6.0.4 - gcp-metadata: 6.0.0 - gtoken: 7.0.1 - jws: 4.0.0 - lru-cache: 6.0.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /google-auth-library@9.11.0: - resolution: {integrity: sha512-epX3ww/mNnhl6tL45EQ/oixsY8JLEgUFoT4A5E/5iAR4esld9Kqv6IJGk7EmGuOgDvaarwF95hU2+v7Irql9lw==} + /google-auth-library@9.12.0: + resolution: {integrity: sha512-5pWjpxJMNJ5UTuhK7QPD5KFPsbosWkX4ajMDeZwXllTtwwqeiIzPWbHIddkLBkkn0mUPboTmukT5rd30Ec9igQ==} engines: {node: '>=14'} dependencies: base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 - gaxios: 6.6.0 + gaxios: 6.7.0 gcp-metadata: 6.1.0 - gtoken: 7.0.1 + gtoken: 7.1.0 jws: 4.0.0 transitivePeerDependencies: - encoding - supports-color dev: false - /google-gax@3.6.0: - resolution: {integrity: sha512-2fyb61vWxUonHiArRNJQmE4tx5oY1ni8VPo08fzII409vDSCWG7apDX4qNOQ2GXXT82gLBn3d3P1Dydh7pWjyw==} + /google-gax@3.6.1: + resolution: {integrity: sha512-g/lcUjGcB6DSw2HxgEmCDOrI/CByOwqRvsuUvNalHUK2iPPPlmAIpbMbl62u0YufGMr8zgE3JL7th6dCb1Ry+w==} engines: {node: '>=12'} hasBin: true requiresBuild: true dependencies: - '@grpc/grpc-js': 1.8.13 - '@grpc/proto-loader': 0.7.10 + '@grpc/grpc-js': 1.8.22 + '@grpc/proto-loader': 0.7.13 '@types/long': 4.0.2 '@types/rimraf': 3.0.2 abort-controller: 3.0.0 - duplexify: 4.1.2 + duplexify: 4.1.3 fast-text-encoding: 1.0.6 - google-auth-library: 8.7.0 + google-auth-library: 8.9.0 is-stream-ended: 0.1.4 node-fetch: 2.7.0 object-hash: 3.0.0 proto3-json-serializer: 1.1.1 - protobufjs: 7.2.3 - protobufjs-cli: 1.1.1(protobufjs@7.2.3) + protobufjs: 7.2.4 + protobufjs-cli: 1.1.1(protobufjs@7.2.4) retry-request: 5.0.2 transitivePeerDependencies: - encoding @@ -16644,36 +14573,16 @@ packages: dev: false optional: true - /google-gax@4.0.3: - resolution: {integrity: sha512-gllHYRhZvpz0LcVN+xtyzBeUa/ZYiLGF4JNBECrvL/LxDkaJc09hHoQ+KzRBI2Ewqgrjj7V3QrOC2pGno5ropw==} - engines: {node: '>=14'} - dependencies: - '@grpc/grpc-js': 1.8.13 - '@grpc/proto-loader': 0.7.10 - '@types/long': 4.0.2 - abort-controller: 3.0.0 - duplexify: 4.1.2 - google-auth-library: 9.0.0 - node-fetch: 2.7.0 - object-hash: 3.0.0 - proto3-json-serializer: 1.1.1 - protobufjs: 7.2.4 - retry-request: 6.0.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /google-gax@4.3.7: - resolution: {integrity: sha512-3bnD8RASQyaxOYTdWLgwpQco/aytTxFavoI/UN5QN5txDLp8QRrBHNtCUJ5+Ago+551GD92jG8jJduwvmaneUw==} + /google-gax@4.3.8: + resolution: {integrity: sha512-SKAQKtvdjtNW3PMOhmKEqpQP+2C5ZqNKfwWxy70efpSwxvRYuAcgMJs6aRHTBPJjz3SO6ZbiXwM6WIuGYFZ7LQ==} engines: {node: '>=14'} dependencies: - '@grpc/grpc-js': 1.10.10 + '@grpc/grpc-js': 1.11.1 '@grpc/proto-loader': 0.7.13 '@types/long': 4.0.2 abort-controller: 3.0.0 - duplexify: 4.1.2 - google-auth-library: 9.11.0 + duplexify: 4.1.3 + google-auth-library: 9.12.0 node-fetch: 2.7.0 object-hash: 3.0.0 proto3-json-serializer: 2.0.2 @@ -16688,6 +14597,7 @@ packages: /google-p12-pem@3.1.4: resolution: {integrity: sha512-HHuHmkLgwjdmVRngf5+gSmpkyaRI6QmOg77J8tkNBHhNEI62sGHyw4/+UkgyZEI7h84NbWprXDJ+sa3xOYFvTg==} engines: {node: '>=10'} + deprecated: Package is no longer maintained hasBin: true dependencies: node-forge: 1.3.1 @@ -16696,6 +14606,7 @@ packages: /google-p12-pem@4.0.1: resolution: {integrity: sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==} engines: {node: '>=12.0.0'} + deprecated: Package is no longer maintained hasBin: true requiresBuild: true dependencies: @@ -16703,16 +14614,16 @@ packages: dev: false optional: true - /googleapis-common@7.0.0: - resolution: {integrity: sha512-58iSybJPQZ8XZNMpjrklICefuOuyJ0lMxfKmBqmaC0/xGT4SiOs4BE60LAOOGtBURy1n8fHa2X2YUNFEWWbXyQ==} + /googleapis-common@7.2.0: + resolution: {integrity: sha512-/fhDZEJZvOV3X5jmD+fKxMqma5q2Q9nZNSF3kn1F18tpxmA86BcTxAGBQdM0N89Z3bEaIs+HVznSmFJEAmMTjA==} engines: {node: '>=14.0.0'} dependencies: extend: 3.0.2 - gaxios: 6.0.4 - google-auth-library: 9.0.0 - qs: 6.11.1 + gaxios: 6.7.0 + google-auth-library: 9.12.0 + qs: 6.12.3 url-template: 2.0.8 - uuid: 9.0.0 + uuid: 9.0.1 transitivePeerDependencies: - encoding - supports-color @@ -16722,8 +14633,8 @@ packages: resolution: {integrity: sha512-4N8LLi+hj6ytK3PhE52KcM8iSGhJjtXnCDYB4fp6l+GdLbYz4FoDmx074WqMbl7iYMDN87vqD/8drJkhxW92mQ==} engines: {node: '>=14.0.0'} dependencies: - google-auth-library: 9.0.0 - googleapis-common: 7.0.0 + google-auth-library: 9.12.0 + googleapis-common: 7.2.0 transitivePeerDependencies: - encoding - supports-color @@ -16732,7 +14643,7 @@ packages: /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.4 /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -16764,7 +14675,7 @@ packages: engines: {node: '>=12.0.0'} requiresBuild: true dependencies: - gaxios: 5.1.0 + gaxios: 5.1.3 google-p12-pem: 4.0.1 jws: 4.0.0 transitivePeerDependencies: @@ -16773,11 +14684,11 @@ packages: dev: false optional: true - /gtoken@7.0.1: - resolution: {integrity: sha512-KcFVtoP1CVFtQu0aSk3AyAt2og66PFhZAlkUOuWKwzMLoulHXG5W5wE5xAnHb+yl3/wEFoqGW7/cDGMU8igDZQ==} + /gtoken@7.1.0: + resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} engines: {node: '>=14.0.0'} dependencies: - gaxios: 6.6.0 + gaxios: 6.7.0 jws: 4.0.0 transitivePeerDependencies: - encoding @@ -16837,21 +14748,21 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - /has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} dependencies: - get-intrinsic: 1.2.0 + es-define-property: 1.0.0 - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + /has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} engines: {node: '>= 0.4'} /has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} - /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 @@ -16859,9 +14770,14 @@ packages: /has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + /has@1.0.4: + resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} engines: {node: '>= 0.4.0'} + dev: true + + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 @@ -16874,8 +14790,8 @@ packages: resolution: {integrity: sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==} dev: true - /highlight.js@11.7.0: - resolution: {integrity: sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ==} + /highlight.js@11.10.0: + resolution: {integrity: sha512-SYVnVFswQER+zu1laSya563s+F8VDGt7o35d4utbamowvUNLLMovFqwCLSocpZTz3MgaSRA1IbqRWZv97dtErQ==} engines: {node: '>=12.0.0'} dev: false @@ -16899,6 +14815,12 @@ packages: dependencies: lru-cache: 6.0.0 + /hosted-git-info@6.1.1: + resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + lru-cache: 7.18.3 + /hpack.js@2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} dependencies: @@ -16923,8 +14845,8 @@ packages: whatwg-encoding: 1.0.5 dev: false - /html-entities@2.3.3: - resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} + /html-entities@2.5.2: + resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==} dev: false /html-escaper@2.0.2: @@ -16936,12 +14858,12 @@ packages: hasBin: true dependencies: camel-case: 4.1.2 - clean-css: 5.3.2 + clean-css: 5.3.3 commander: 8.3.0 he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.19.4 + terser: 5.31.3 dev: false /html-minifier@4.0.0: @@ -16955,21 +14877,27 @@ packages: he: 1.2.0 param-case: 2.1.1 relateurl: 0.2.7 - uglify-js: 3.17.4 + uglify-js: 3.19.1 dev: false - /html-webpack-plugin@5.5.0(webpack@5.91.0): - resolution: {integrity: sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==} + /html-webpack-plugin@5.6.0(webpack@5.93.0): + resolution: {integrity: sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==} engines: {node: '>=10.13.0'} peerDependencies: + '@rspack/core': 0.x || 1.x webpack: ^5.20.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.91.0(webpack-cli@5.1.4) + webpack: 5.93.0(webpack-cli@5.1.4) dev: false /htmlencode@0.0.4: @@ -16999,8 +14927,17 @@ packages: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 - domutils: 3.0.1 - entities: 4.4.0 + domutils: 3.1.0 + entities: 4.5.0 + dev: false + + /htmlparser2@9.1.0: + resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 dev: false /http-cache-semantics@4.1.1: @@ -17058,7 +14995,7 @@ packages: dependencies: '@tootallnate/once': 1.1.2 agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.3.6 transitivePeerDependencies: - supports-color @@ -17068,11 +15005,11 @@ packages: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.3.6 transitivePeerDependencies: - supports-color - /http-proxy-middleware@2.0.6(@types/express@4.17.17): + /http-proxy-middleware@2.0.6(@types/express@4.17.21): resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} engines: {node: '>=12.0.0'} peerDependencies: @@ -17081,12 +15018,12 @@ packages: '@types/express': optional: true dependencies: - '@types/express': 4.17.17 - '@types/http-proxy': 1.17.10 + '@types/express': 4.17.21 + '@types/http-proxy': 1.17.14 http-proxy: 1.18.1 is-glob: 4.0.3 is-plain-obj: 3.0.0 - micromatch: 4.0.5 + micromatch: 4.0.7 transitivePeerDependencies: - debug dev: false @@ -17096,7 +15033,7 @@ packages: engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.5 + follow-redirects: 1.15.6 requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -17107,16 +15044,16 @@ packages: engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.3.6 transitivePeerDependencies: - supports-color - /https-proxy-agent@7.0.1: - resolution: {integrity: sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ==} + /https-proxy-agent@7.0.5: + resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} engines: {node: '>= 14'} dependencies: - agent-base: 7.1.0 - debug: 4.3.4 + agent-base: 7.1.1 + debug: 4.3.6 transitivePeerDependencies: - supports-color dev: false @@ -17141,8 +15078,8 @@ packages: hasBin: true dev: true - /hyphenate-style-name@1.0.4: - resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==} + /hyphenate-style-name@1.1.0: + resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==} dev: false /iconv-lite@0.4.24: @@ -17161,18 +15098,15 @@ packages: resolution: {integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==} dev: true - /icss-utils@5.1.0(postcss@8.4.31): + /icss-utils@5.1.0(postcss@8.4.40): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.31 + postcss: 8.4.40 dev: false - /idb@7.0.1: - resolution: {integrity: sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==} - /idb@7.1.1: resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} @@ -17196,8 +15130,14 @@ packages: dependencies: minimatch: 3.1.2 - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + /ignore-walk@6.0.5: + resolution: {integrity: sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minimatch: 9.0.5 + + /ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} /image-size@0.5.5: @@ -17259,8 +15199,8 @@ packages: resolve-from: 5.0.0 dev: true - /import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + /import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} engines: {node: '>=8'} hasBin: true dependencies: @@ -17284,6 +15224,7 @@ packages: /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. dependencies: once: 1.4.0 wrappy: 1.0.2 @@ -17303,15 +15244,14 @@ packages: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} dev: false - /inline-style-prefixer@6.0.4: - resolution: {integrity: sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg==} + /inline-style-prefixer@7.0.1: + resolution: {integrity: sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==} dependencies: css-in-js-utils: 3.1.0 - fast-loops: 1.1.3 dev: false - /inquirer@8.2.5: - resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} + /inquirer@8.2.6: + resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} engines: {node: '>=12.0.0'} dependencies: ansi-escapes: 4.3.2 @@ -17328,20 +15268,16 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 through: 2.3.8 - wrap-ansi: 7.0.0 + wrap-ansi: 6.2.0 - /inquirer@9.2.11: - resolution: {integrity: sha512-B2LafrnnhbRzCWfAdOXisUzL89Kg8cVJlYmhqoi3flSiV/TveO+nsXwgKr9h9PIo+J1hz7nBSk6gegRIMBBf7g==} - engines: {node: '>=14.18.0'} + /inquirer@9.3.6: + resolution: {integrity: sha512-riK/iQB2ctwkpWYgjjWIRv3MBLt2gzb2Sj0JNQNbyTXgyXsLWcDPJ5WS5ZDTCx7BRFnJsARtYh+58fjP5M2Y0Q==} + engines: {node: '>=18'} dependencies: - '@ljharb/through': 2.3.9 + '@inquirer/figures': 1.0.5 ansi-escapes: 4.3.2 - chalk: 5.3.0 - cli-cursor: 3.1.0 cli-width: 4.1.0 external-editor: 3.1.0 - figures: 5.0.0 - lodash: 4.17.21 mute-stream: 1.0.0 ora: 5.4.1 run-async: 3.0.0 @@ -17349,6 +15285,7 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 dev: true /intercom-client@4.0.0: @@ -17362,13 +15299,13 @@ packages: - debug dev: false - /internal-slot@1.0.5: - resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + /internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.0 - has: 1.0.3 - side-channel: 1.0.4 + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 /internmap@2.0.3: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} @@ -17383,13 +15320,13 @@ packages: resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} engines: {node: '>=10.13.0'} - /ioredis@5.3.2: - resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} + /ioredis@5.4.1: + resolution: {integrity: sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==} engines: {node: '>=12.22.0'} dependencies: '@ioredis/commands': 1.2.0 cluster-key-slot: 1.1.2 - debug: 4.3.4 + debug: 4.3.6 denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -17399,6 +15336,13 @@ packages: transitivePeerDependencies: - supports-color + /ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 + /ip6addr@0.2.5: resolution: {integrity: sha512-9RGGSB6Zc9Ox5DpDGFnJdIeF0AsqXzdH+FspCfPPaU/L/4tI6P+5lIoFUFm9JXs9IrJv1boqAaNCQmoDADTSKQ==} dependencies: @@ -17406,15 +15350,12 @@ packages: jsprim: 2.0.2 dev: false - /ip@2.0.0: - resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} - /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - /ipaddr.js@2.0.1: - resolution: {integrity: sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==} + /ipaddr.js@2.2.0: + resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} engines: {node: '>= 10'} dev: false @@ -17427,15 +15368,15 @@ packages: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 + call-bind: 1.0.7 + has-tostringtag: 1.0.2 - /is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + /is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - is-typed-array: 1.1.10 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -17443,6 +15384,12 @@ packages: /is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + /is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: @@ -17452,14 +15399,14 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: - binary-extensions: 2.2.0 + binary-extensions: 2.3.0 /is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 + call-bind: 1.0.7 + has-tostringtag: 1.0.2 /is-builtin-module@3.2.1: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} @@ -17483,16 +15430,23 @@ packages: rgba-regex: 1.0.0 dev: true - /is-core-module@2.12.0: - resolution: {integrity: sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==} + /is-core-module@2.15.0: + resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 + + /is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} dependencies: - has: 1.0.3 + is-typed-array: 1.1.13 /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 /is-directory@0.3.1: resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} @@ -17503,11 +15457,17 @@ packages: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} hasBin: true + dev: false /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + /is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + dependencies: + call-bind: 1.0.7 + /is-fullwidth-code-point@1.0.0: resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} engines: {node: '>=0.10.0'} @@ -17523,7 +15483,13 @@ packages: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} - /is-glob@4.0.3: + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} dependencies: @@ -17536,21 +15502,22 @@ packages: /is-lambda@1.0.1: resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} - /is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + /is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} /is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - /is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + /is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} /is-number-object@1.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} @@ -17615,14 +15582,14 @@ packages: /is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.5 /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 + call-bind: 1.0.7 + has-tostringtag: 1.0.2 /is-regexp@1.0.0: resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} @@ -17644,13 +15611,15 @@ packages: dependencies: scoped-regex: 2.1.0 - /is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + /is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} - /is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + /is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.7 /is-stream-ended@0.1.4: resolution: {integrity: sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==} @@ -17666,7 +15635,7 @@ packages: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 /is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} @@ -17674,15 +15643,11 @@ packages: dependencies: has-symbols: 1.0.3 - /is-typed-array@1.1.10: - resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} + /is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 + which-typed-array: 1.1.15 /is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} @@ -17692,33 +15657,30 @@ packages: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - /is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} - dev: true - /is-utf8@0.2.1: resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} /is-valid-domain@0.1.6: resolution: {integrity: sha512-ZKtq737eFkZr71At8NxOFcP9O1K89gW3DkdrGMpp1upr/ueWjj+Weh4l9AI4rN0Gt8W2M1w7jrG2b/Yv83Ljpg==} dependencies: - punycode: 2.3.0 + punycode: 2.3.1 dev: false - /is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + /is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.7 - /is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + /is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 /is-what@3.14.1: resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} @@ -17729,6 +15691,7 @@ packages: engines: {node: '>=8'} dependencies: is-docker: 2.2.1 + dev: false /isarray@0.0.1: resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} @@ -17744,9 +15707,9 @@ packages: resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} engines: {node: '>= 8.0.0'} - /isbinaryfile@5.0.0: - resolution: {integrity: sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==} - engines: {node: '>= 14.0.0'} + /isbinaryfile@5.0.2: + resolution: {integrity: sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==} + engines: {node: '>= 18.0.0'} /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -17764,68 +15727,92 @@ packages: engines: {node: '>=18.0.0'} requiresBuild: true dependencies: - prebuild-install: 7.1.1 + prebuild-install: 7.1.2 dev: false - /istanbul-lib-coverage@3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + /istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} /istanbul-lib-instrument@5.2.1: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.21.4 - '@babel/parser': 7.22.16 + '@babel/core': 7.25.2 + '@babel/parser': 7.25.0 '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 + istanbul-lib-coverage: 3.2.2 semver: 6.3.1 transitivePeerDependencies: - supports-color - /istanbul-lib-instrument@6.0.0: - resolution: {integrity: sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==} + /istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.21.4 - '@babel/parser': 7.22.16 + '@babel/core': 7.25.2 + '@babel/parser': 7.25.0 '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 7.5.4 + istanbul-lib-coverage: 3.2.2 + semver: 7.6.3 transitivePeerDependencies: - supports-color - /istanbul-lib-report@3.0.0: - resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} - engines: {node: '>=8'} + /istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} dependencies: - istanbul-lib-coverage: 3.2.0 - make-dir: 3.1.0 + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 supports-color: 7.2.0 /istanbul-lib-source-maps@4.0.1: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.3.4 - istanbul-lib-coverage: 3.2.0 + debug: 4.3.6 + istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: - supports-color - /istanbul-reports@3.1.5: - resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} + /istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} dependencies: html-escaper: 2.0.2 - istanbul-lib-report: 3.0.0 + istanbul-lib-report: 3.0.1 - /jake@10.8.5: - resolution: {integrity: sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==} + /iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + dependencies: + define-properties: 1.2.1 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + reflect.getprototypeof: 1.0.6 + set-function-name: 2.0.2 + + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + /jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + /jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} engines: {node: '>=10'} hasBin: true dependencies: - async: 3.2.4 + async: 3.2.5 chalk: 4.1.2 filelist: 1.0.4 minimatch: 3.1.2 @@ -17847,14 +15834,6 @@ packages: p-limit: 3.1.0 dev: true - /jest-changed-files@29.5.0: - resolution: {integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - execa: 5.1.1 - p-limit: 3.1.0 - dev: true - /jest-changed-files@29.7.0: resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -17866,582 +15845,214 @@ packages: /jest-circus@27.5.1: resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/environment': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 20.14.2 - chalk: 4.1.2 - co: 4.6.0 - dedent: 0.7.0 - expect: 27.5.1 - is-generator-fn: 2.1.0 - jest-each: 27.5.1 - jest-matcher-utils: 27.5.1 - jest-message-util: 27.5.1 - jest-runtime: 27.5.1 - jest-snapshot: 27.5.1 - jest-util: 27.5.1 - pretty-format: 27.5.1 - slash: 3.0.0 - stack-utils: 2.0.6 - throat: 6.0.2 - transitivePeerDependencies: - - supports-color - dev: false - - /jest-circus@28.1.3: - resolution: {integrity: sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - dependencies: - '@jest/environment': 28.1.3 - '@jest/expect': 28.1.3 - '@jest/test-result': 28.1.3 - '@jest/types': 28.1.3 - '@types/node': 20.14.2 - chalk: 4.1.2 - co: 4.6.0 - dedent: 0.7.0 - is-generator-fn: 2.1.0 - jest-each: 28.1.3 - jest-matcher-utils: 28.1.3 - jest-message-util: 28.1.3 - jest-runtime: 28.1.3 - jest-snapshot: 28.1.3 - jest-util: 28.1.3 - p-limit: 3.1.0 - pretty-format: 28.1.3 - slash: 3.0.0 - stack-utils: 2.0.6 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-circus@29.7.0: - resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.14.2 - chalk: 4.1.2 - co: 4.6.0 - dedent: 1.5.1 - is-generator-fn: 2.1.0 - jest-each: 29.7.0 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - p-limit: 3.1.0 - pretty-format: 29.7.0 - pure-rand: 6.0.1 - slash: 3.0.0 - stack-utils: 2.0.6 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - /jest-cli@27.5.1(ts-node@10.8.2): - resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 27.5.1(ts-node@10.8.2) - '@jest/test-result': 27.5.1 - '@jest/types': 27.5.1 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - import-local: 3.1.0 - jest-config: 27.5.1(ts-node@10.8.2) - jest-util: 27.5.1 - jest-validate: 27.5.1 - prompts: 2.4.2 - yargs: 16.2.0 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - ts-node - - utf-8-validate - dev: false - - /jest-cli@28.1.3(@types/node@18.15.11)(ts-node@10.8.2): - resolution: {integrity: sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 28.1.3(ts-node@10.8.2) - '@jest/test-result': 28.1.3 - '@jest/types': 28.1.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - import-local: 3.1.0 - jest-config: 28.1.3(@types/node@18.15.11)(ts-node@10.8.2) - jest-util: 28.1.3 - jest-validate: 28.1.3 - prompts: 2.4.2 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jest-cli@29.7.0(@types/node@18.15.11)(ts-node@10.8.2): - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.7.0(ts-node@10.8.2) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) - exit: 0.1.2 - import-local: 3.1.0 - jest-config: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - dev: true - - /jest-cli@29.7.0(@types/node@18.15.11)(ts-node@10.9.1): - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.1) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.15.11)(ts-node@10.9.1) - exit: 0.1.2 - import-local: 3.1.0 - jest-config: 29.7.0(@types/node@18.15.11)(ts-node@10.9.1) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - dev: true - - /jest-cli@29.7.0(@types/node@18.15.11)(ts-node@10.9.2): - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.15.11)(ts-node@10.9.2) - exit: 0.1.2 - import-local: 3.1.0 - jest-config: 29.7.0(@types/node@18.15.11)(ts-node@10.9.2) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - /jest-cli@29.7.0(@types/node@20.14.2)(ts-node@10.8.2): - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.7.0(ts-node@10.8.2) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.14.2)(ts-node@10.8.2) - exit: 0.1.2 - import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.14.2)(ts-node@10.8.2) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - dev: true - - /jest-config@27.5.1(ts-node@10.8.2): - resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - peerDependencies: - ts-node: '>=9.0.0' - peerDependenciesMeta: - ts-node: - optional: true - dependencies: - '@babel/core': 7.21.4 - '@jest/test-sequencer': 27.5.1 - '@jest/types': 27.5.1 - babel-jest: 27.5.1(@babel/core@7.21.4) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 27.5.1 - jest-environment-jsdom: 27.5.1 - jest-environment-node: 27.5.1 - jest-get-type: 27.5.1 - jest-jasmine2: 27.5.1 - jest-regex-util: 27.5.1 - jest-resolve: 27.5.1 - jest-runner: 27.5.1 - jest-util: 27.5.1 - jest-validate: 27.5.1 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 27.5.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 10.8.2(@types/node@20.14.2)(typescript@5.3.3) - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - dev: false - - /jest-config@28.1.3(@types/node@18.15.11)(ts-node@10.8.2): - resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.21.4 - '@jest/test-sequencer': 28.1.3 - '@jest/types': 28.1.3 - '@types/node': 18.15.11 - babel-jest: 28.1.3(@babel/core@7.21.4) + dependencies: + '@jest/environment': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 18.19.42 chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 28.1.3 - jest-environment-node: 28.1.3 - jest-get-type: 28.0.2 - jest-regex-util: 28.0.2 - jest-resolve: 28.1.3 - jest-runner: 28.1.3 - jest-util: 28.1.3 - jest-validate: 28.1.3 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 28.1.3 + co: 4.6.0 + dedent: 0.7.0 + expect: 27.5.1 + is-generator-fn: 2.1.0 + jest-each: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 10.8.2(@types/node@18.15.11)(typescript@5.3.3) + stack-utils: 2.0.6 + throat: 6.0.2 transitivePeerDependencies: - supports-color - dev: true + dev: false - /jest-config@28.1.3(@types/node@20.14.2)(ts-node@10.8.2): - resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==} + /jest-circus@28.1.3: + resolution: {integrity: sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true dependencies: - '@babel/core': 7.21.4 - '@jest/test-sequencer': 28.1.3 + '@jest/environment': 28.1.3 + '@jest/expect': 28.1.3 + '@jest/test-result': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 20.14.2 - babel-jest: 28.1.3(@babel/core@7.21.4) + '@types/node': 18.19.42 chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 28.1.3 - jest-environment-node: 28.1.3 - jest-get-type: 28.0.2 - jest-regex-util: 28.0.2 - jest-resolve: 28.1.3 - jest-runner: 28.1.3 + co: 4.6.0 + dedent: 0.7.0 + is-generator-fn: 2.1.0 + jest-each: 28.1.3 + jest-matcher-utils: 28.1.3 + jest-message-util: 28.1.3 + jest-runtime: 28.1.3 + jest-snapshot: 28.1.3 jest-util: 28.1.3 - jest-validate: 28.1.3 - micromatch: 4.0.5 - parse-json: 5.2.0 + p-limit: 3.1.0 pretty-format: 28.1.3 slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 10.8.2(@types/node@18.15.11)(typescript@5.3.3) + stack-utils: 2.0.6 transitivePeerDependencies: - supports-color dev: true - /jest-config@29.5.0(@types/node@20.14.2)(ts-node@10.8.2): - resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} + /jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true dependencies: - '@babel/core': 7.21.4 - '@jest/test-sequencer': 29.7.0 + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.2 - babel-jest: 29.7.0(@babel/core@7.21.4) + '@types/node': 18.19.42 chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 + co: 4.6.0 + dedent: 1.5.3 + is-generator-fn: 2.1.0 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.5 - parse-json: 5.2.0 + p-limit: 3.1.0 pretty-format: 29.7.0 + pure-rand: 6.1.0 slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 10.8.2(@types/node@20.14.2)(typescript@5.3.3) + stack-utils: 2.0.6 transitivePeerDependencies: - babel-plugin-macros - supports-color - dev: true - /jest-config@29.7.0(@types/node@18.15.11)(ts-node@10.8.2): - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /jest-cli@27.5.1(ts-node@10.9.2): + resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: - '@types/node': - optional: true - ts-node: + node-notifier: optional: true dependencies: - '@babel/core': 7.21.4 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.15.11 - babel-jest: 29.7.0(@babel/core@7.21.4) + '@jest/core': 27.5.1(ts-node@10.9.2) + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 + exit: 0.1.2 graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 10.8.2(@types/node@20.14.2)(typescript@5.3.3) + import-local: 3.2.0 + jest-config: 27.5.1(ts-node@10.9.2) + jest-util: 27.5.1 + jest-validate: 27.5.1 + prompts: 2.4.2 + yargs: 16.2.0 transitivePeerDependencies: - - babel-plugin-macros + - bufferutil + - canvas - supports-color - dev: true + - ts-node + - utf-8-validate + dev: false - /jest-config@29.7.0(@types/node@18.15.11)(ts-node@10.9.1): - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /jest-cli@28.1.3(@types/node@18.19.42)(ts-node@10.9.2): + resolution: {integrity: sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + hasBin: true peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: - '@types/node': - optional: true - ts-node: + node-notifier: optional: true dependencies: - '@babel/core': 7.21.4 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.15.11 - babel-jest: 29.7.0(@babel/core@7.21.4) + '@jest/core': 28.1.3(ts-node@10.9.2) + '@jest/test-result': 28.1.3 + '@jest/types': 28.1.3 chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 + exit: 0.1.2 graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 10.9.1(@types/node@18.15.11)(typescript@5.3.3) + import-local: 3.2.0 + jest-config: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2) + jest-util: 28.1.3 + jest-validate: 28.1.3 + prompts: 2.4.2 + yargs: 17.7.2 transitivePeerDependencies: - - babel-plugin-macros + - '@types/node' - supports-color + - ts-node dev: true - /jest-config@29.7.0(@types/node@18.15.11)(ts-node@10.9.2): - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + /jest-cli@29.7.0(@types/node@18.19.42)(ts-node@10.9.2): + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: - '@types/node': - optional: true - ts-node: + node-notifier: optional: true dependencies: - '@babel/core': 7.21.4 - '@jest/test-sequencer': 29.7.0 + '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.15.11 - babel-jest: 29.7.0(@babel/core@7.21.4) chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 + create-jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) jest-util: 29.7.0 jest-validate: 29.7.0 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 10.9.2(@types/node@18.15.11)(typescript@5.4.5) + yargs: 17.7.2 transitivePeerDependencies: + - '@types/node' - babel-plugin-macros - supports-color + - ts-node - /jest-config@29.7.0(@types/node@20.14.2)(ts-node@10.8.2): - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /jest-config@27.5.1(ts-node@10.9.2): + resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: - '@types/node': '*' ts-node: '>=9.0.0' peerDependenciesMeta: - '@types/node': - optional: true ts-node: optional: true dependencies: - '@babel/core': 7.21.4 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.14.2 - babel-jest: 29.7.0(@babel/core@7.21.4) + '@babel/core': 7.25.2 + '@jest/test-sequencer': 27.5.1 + '@jest/types': 27.5.1 + babel-jest: 27.5.1(@babel/core@7.25.2) chalk: 4.1.2 - ci-info: 3.8.0 + ci-info: 3.9.0 deepmerge: 4.3.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.5 + jest-circus: 27.5.1 + jest-environment-jsdom: 27.5.1 + jest-environment-node: 27.5.1 + jest-get-type: 27.5.1 + jest-jasmine2: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-runner: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + micromatch: 4.0.7 parse-json: 5.2.0 - pretty-format: 29.7.0 + pretty-format: 27.5.1 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.8.2(@types/node@20.14.2)(typescript@5.3.3) + ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) transitivePeerDependencies: - - babel-plugin-macros + - bufferutil + - canvas - supports-color - dev: true + - utf-8-validate + dev: false - /jest-config@29.7.0(@types/node@20.14.2)(ts-node@10.9.1): - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /jest-config@28.1.3(@types/node@18.19.42)(ts-node@10.9.2): + resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} peerDependencies: '@types/node': '*' ts-node: '>=9.0.0' @@ -18451,36 +16062,35 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.21.4 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.14.2 - babel-jest: 29.7.0(@babel/core@7.21.4) + '@babel/core': 7.25.2 + '@jest/test-sequencer': 28.1.3 + '@jest/types': 28.1.3 + '@types/node': 18.19.42 + babel-jest: 28.1.3(@babel/core@7.25.2) chalk: 4.1.2 - ci-info: 3.8.0 + ci-info: 3.9.0 deepmerge: 4.3.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.5 + jest-circus: 28.1.3 + jest-environment-node: 28.1.3 + jest-get-type: 28.0.2 + jest-regex-util: 28.0.2 + jest-resolve: 28.1.3 + jest-runner: 28.1.3 + jest-util: 28.1.3 + jest-validate: 28.1.3 + micromatch: 4.0.7 parse-json: 5.2.0 - pretty-format: 29.7.0 + pretty-format: 28.1.3 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1(@types/node@18.15.11)(typescript@5.3.3) + ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) transitivePeerDependencies: - - babel-plugin-macros - supports-color dev: true - /jest-config@29.7.0(@types/node@20.14.2)(ts-node@10.9.2): + /jest-config@29.7.0(@types/node@18.19.42)(ts-node@10.9.2): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -18492,13 +16102,13 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.25.2 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.2 - babel-jest: 29.7.0(@babel/core@7.21.4) + '@types/node': 18.19.42 + babel-jest: 29.7.0(@babel/core@7.25.2) chalk: 4.1.2 - ci-info: 3.8.0 + ci-info: 3.9.0 deepmerge: 4.3.1 glob: 7.2.3 graceful-fs: 4.2.11 @@ -18510,12 +16120,12 @@ packages: jest-runner: 29.7.0 jest-util: 29.7.0 jest-validate: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.7 parse-json: 5.2.0 pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.2(@types/node@18.15.11)(typescript@5.4.5) + ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -18608,7 +16218,7 @@ packages: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.14.2 + '@types/node': 18.19.42 jest-mock: 27.5.1 jest-util: 27.5.1 jsdom: 16.7.0 @@ -18626,7 +16236,7 @@ packages: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.14.2 + '@types/node': 18.19.42 jest-mock: 27.5.1 jest-util: 27.5.1 dev: false @@ -18638,7 +16248,7 @@ packages: '@jest/environment': 28.1.3 '@jest/fake-timers': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 20.14.2 + '@types/node': 18.19.42 jest-mock: 28.1.3 jest-util: 28.1.3 dev: true @@ -18650,7 +16260,7 @@ packages: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.2 + '@types/node': 18.19.42 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -18673,8 +16283,8 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/graceful-fs': 4.1.6 - '@types/node': 20.14.2 + '@types/graceful-fs': 4.1.9 + '@types/node': 18.19.42 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -18682,10 +16292,10 @@ packages: jest-serializer: 27.5.1 jest-util: 27.5.1 jest-worker: 27.5.1 - micromatch: 4.0.5 + micromatch: 4.0.7 walker: 1.0.8 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: false /jest-haste-map@28.1.3: @@ -18693,37 +16303,18 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@jest/types': 28.1.3 - '@types/graceful-fs': 4.1.6 - '@types/node': 20.14.2 + '@types/graceful-fs': 4.1.9 + '@types/node': 18.19.42 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 jest-regex-util: 28.0.2 jest-util: 28.1.3 jest-worker: 28.1.3 - micromatch: 4.0.5 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /jest-haste-map@29.5.0: - resolution: {integrity: sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@types/graceful-fs': 4.1.6 - '@types/node': 20.14.2 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - jest-worker: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.7 walker: 1.0.8 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /jest-haste-map@29.7.0: @@ -18731,18 +16322,18 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/graceful-fs': 4.1.6 - '@types/node': 20.14.2 + '@types/graceful-fs': 4.1.9 + '@types/node': 18.19.42 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 jest-regex-util: 29.6.3 jest-util: 29.7.0 jest-worker: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.7 walker: 1.0.8 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 /jest-jasmine2@27.5.1: resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} @@ -18752,7 +16343,7 @@ packages: '@jest/source-map': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.14.2 + '@types/node': 18.19.42 chalk: 4.1.2 co: 4.6.0 expect: 27.5.1 @@ -18825,12 +16416,12 @@ packages: resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.7 '@jest/types': 27.5.1 - '@types/stack-utils': 2.0.1 + '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 - micromatch: 4.0.5 + micromatch: 4.0.7 pretty-format: 27.5.1 slash: 3.0.0 stack-utils: 2.0.6 @@ -18840,12 +16431,12 @@ packages: resolution: {integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.7 '@jest/types': 28.1.3 - '@types/stack-utils': 2.0.1 + '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 - micromatch: 4.0.5 + micromatch: 4.0.7 pretty-format: 28.1.3 slash: 3.0.0 stack-utils: 2.0.6 @@ -18854,12 +16445,12 @@ packages: resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.7 '@jest/types': 29.6.3 - '@types/stack-utils': 2.0.1 + '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 - micromatch: 4.0.5 + micromatch: 4.0.7 pretty-format: 29.7.0 slash: 3.0.0 stack-utils: 2.0.6 @@ -18869,7 +16460,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 20.14.2 + '@types/node': 18.19.42 dev: false /jest-mock@28.1.3: @@ -18877,16 +16468,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@jest/types': 28.1.3 - '@types/node': 20.14.2 - dev: true - - /jest-mock@29.5.0: - resolution: {integrity: sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.14.2 - jest-util: 29.7.0 + '@types/node': 18.19.42 dev: true /jest-mock@29.7.0: @@ -18894,7 +16476,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.14.2 + '@types/node': 18.19.42 jest-util: 29.7.0 /jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): @@ -18921,18 +16503,6 @@ packages: jest-resolve: 28.1.3 dev: true - /jest-pnp-resolver@1.2.3(jest-resolve@29.5.0): - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - dependencies: - jest-resolve: 29.5.0 - dev: true - /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} @@ -18953,11 +16523,6 @@ packages: resolution: {integrity: sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - /jest-regex-util@29.4.3: - resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - /jest-regex-util@29.6.3: resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -18983,16 +16548,6 @@ packages: - supports-color dev: true - /jest-resolve-dependencies@29.5.0: - resolution: {integrity: sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-regex-util: 29.6.3 - jest-snapshot: 29.7.0 - transitivePeerDependencies: - - supports-color - dev: true - /jest-resolve-dependencies@29.7.0: resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -19013,7 +16568,7 @@ packages: jest-pnp-resolver: 1.2.3(jest-resolve@27.5.1) jest-util: 27.5.1 jest-validate: 27.5.1 - resolve: 1.22.2 + resolve: 1.22.8 resolve.exports: 1.1.1 slash: 3.0.0 dev: false @@ -19028,26 +16583,11 @@ packages: jest-pnp-resolver: 1.2.3(jest-resolve@28.1.3) jest-util: 28.1.3 jest-validate: 28.1.3 - resolve: 1.22.2 + resolve: 1.22.8 resolve.exports: 1.1.1 slash: 3.0.0 dev: true - /jest-resolve@29.5.0: - resolution: {integrity: sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-pnp-resolver: 1.2.3(jest-resolve@29.5.0) - jest-util: 29.7.0 - jest-validate: 29.7.0 - resolve: 1.22.2 - resolve.exports: 2.0.2 - slash: 3.0.0 - dev: true - /jest-resolve@29.7.0: resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -19058,7 +16598,7 @@ packages: jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) jest-util: 29.7.0 jest-validate: 29.7.0 - resolve: 1.22.2 + resolve: 1.22.8 resolve.exports: 2.0.2 slash: 3.0.0 @@ -19071,7 +16611,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.14.2 + '@types/node': 18.19.42 chalk: 4.1.2 emittery: 0.8.1 graceful-fs: 4.2.11 @@ -19103,7 +16643,7 @@ packages: '@jest/test-result': 28.1.3 '@jest/transform': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 20.14.2 + '@types/node': 18.19.42 chalk: 4.1.2 emittery: 0.10.2 graceful-fs: 4.2.11 @@ -19123,35 +16663,6 @@ packages: - supports-color dev: true - /jest-runner@29.5.0: - resolution: {integrity: sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/console': 29.7.0 - '@jest/environment': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.14.2 - chalk: 4.1.2 - emittery: 0.13.1 - graceful-fs: 4.2.11 - jest-docblock: 29.7.0 - jest-environment-node: 29.7.0 - jest-haste-map: 29.7.0 - jest-leak-detector: 29.7.0 - jest-message-util: 29.7.0 - jest-resolve: 29.7.0 - jest-runtime: 29.7.0 - jest-util: 29.7.0 - jest-watcher: 29.7.0 - jest-worker: 29.7.0 - p-limit: 3.1.0 - source-map-support: 0.5.13 - transitivePeerDependencies: - - supports-color - dev: true - /jest-runner@29.7.0: resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -19161,7 +16672,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.2 + '@types/node': 18.19.42 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -19192,8 +16703,8 @@ packages: '@jest/transform': 27.5.1 '@jest/types': 27.5.1 chalk: 4.1.2 - cjs-module-lexer: 1.2.2 - collect-v8-coverage: 1.0.1 + cjs-module-lexer: 1.3.1 + collect-v8-coverage: 1.0.2 execa: 5.1.1 glob: 7.2.3 graceful-fs: 4.2.11 @@ -19222,8 +16733,8 @@ packages: '@jest/transform': 28.1.3 '@jest/types': 28.1.3 chalk: 4.1.2 - cjs-module-lexer: 1.2.2 - collect-v8-coverage: 1.0.1 + cjs-module-lexer: 1.3.1 + collect-v8-coverage: 1.0.2 execa: 5.1.1 glob: 7.2.3 graceful-fs: 4.2.11 @@ -19240,36 +16751,6 @@ packages: - supports-color dev: true - /jest-runtime@29.5.0: - resolution: {integrity: sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/globals': 29.7.0 - '@jest/source-map': 29.6.3 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.14.2 - chalk: 4.1.2 - cjs-module-lexer: 1.2.2 - collect-v8-coverage: 1.0.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - /jest-runtime@29.7.0: resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -19281,10 +16762,10 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.2 + '@types/node': 18.19.42 chalk: 4.1.2 - cjs-module-lexer: 1.2.2 - collect-v8-coverage: 1.0.1 + cjs-module-lexer: 1.3.1 + collect-v8-coverage: 1.0.2 glob: 7.2.3 graceful-fs: 4.2.11 jest-haste-map: 29.7.0 @@ -19303,7 +16784,7 @@ packages: resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@types/node': 20.14.2 + '@types/node': 18.19.42 graceful-fs: 4.2.11 dev: false @@ -19311,16 +16792,16 @@ packages: resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/core': 7.21.4 - '@babel/generator': 7.21.4 - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.21.4) - '@babel/traverse': 7.21.4 - '@babel/types': 7.23.0 + '@babel/core': 7.25.2 + '@babel/generator': 7.25.0 + '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.25.2) + '@babel/traverse': 7.25.2 + '@babel/types': 7.25.2 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/babel__traverse': 7.18.3 - '@types/prettier': 2.7.2 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.4) + '@types/babel__traverse': 7.20.6 + '@types/prettier': 2.7.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.25.2) chalk: 4.1.2 expect: 27.5.1 graceful-fs: 4.2.11 @@ -19332,7 +16813,7 @@ packages: jest-util: 27.5.1 natural-compare: 1.4.0 pretty-format: 27.5.1 - semver: 7.5.4 + semver: 7.6.3 transitivePeerDependencies: - supports-color dev: false @@ -19341,17 +16822,17 @@ packages: resolution: {integrity: sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - '@babel/core': 7.21.4 - '@babel/generator': 7.21.4 - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.21.4) - '@babel/traverse': 7.21.4 - '@babel/types': 7.23.0 + '@babel/core': 7.25.2 + '@babel/generator': 7.25.0 + '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.25.2) + '@babel/traverse': 7.25.2 + '@babel/types': 7.25.2 '@jest/expect-utils': 28.1.3 '@jest/transform': 28.1.3 '@jest/types': 28.1.3 - '@types/babel__traverse': 7.18.3 - '@types/prettier': 2.7.2 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.4) + '@types/babel__traverse': 7.20.6 + '@types/prettier': 2.7.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.25.2) chalk: 4.1.2 expect: 28.1.3 graceful-fs: 4.2.11 @@ -19363,38 +16844,7 @@ packages: jest-util: 28.1.3 natural-compare: 1.4.0 pretty-format: 28.1.3 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-snapshot@29.5.0: - resolution: {integrity: sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/core': 7.21.4 - '@babel/generator': 7.21.4 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.21.4) - '@babel/traverse': 7.21.4 - '@babel/types': 7.23.0 - '@jest/expect-utils': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/babel__traverse': 7.18.3 - '@types/prettier': 2.7.2 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.4) - chalk: 4.1.2 - expect: 29.7.0 - graceful-fs: 4.2.11 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - natural-compare: 1.4.0 - pretty-format: 29.7.0 - semver: 7.5.4 + semver: 7.6.3 transitivePeerDependencies: - supports-color dev: true @@ -19403,15 +16853,15 @@ packages: resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.21.4 - '@babel/generator': 7.21.4 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.21.4) - '@babel/types': 7.23.0 + '@babel/core': 7.25.2 + '@babel/generator': 7.25.0 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.25.2) + '@babel/types': 7.25.2 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.4) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.25.2) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -19422,7 +16872,7 @@ packages: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.5.4 + semver: 7.6.3 transitivePeerDependencies: - supports-color @@ -19431,9 +16881,9 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 20.14.2 + '@types/node': 18.19.42 chalk: 4.1.2 - ci-info: 3.8.0 + ci-info: 3.9.0 graceful-fs: 4.2.11 picomatch: 2.3.1 dev: false @@ -19443,32 +16893,20 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@jest/types': 28.1.3 - '@types/node': 20.14.2 - chalk: 4.1.2 - ci-info: 3.8.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - - /jest-util@29.5.0: - resolution: {integrity: sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.14.2 + '@types/node': 18.19.42 chalk: 4.1.2 - ci-info: 3.8.0 + ci-info: 3.9.0 graceful-fs: 4.2.11 picomatch: 2.3.1 - dev: true /jest-util@29.7.0: resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.14.2 + '@types/node': 18.19.42 chalk: 4.1.2 - ci-info: 3.8.0 + ci-info: 3.9.0 graceful-fs: 4.2.11 picomatch: 2.3.1 @@ -19496,18 +16934,6 @@ packages: pretty-format: 28.1.3 dev: true - /jest-validate@29.5.0: - resolution: {integrity: sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 29.6.3 - leven: 3.1.0 - pretty-format: 29.7.0 - dev: true - /jest-validate@29.7.0: resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -19527,7 +16953,7 @@ packages: dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 - jest: 27.5.1(ts-node@10.8.2) + jest: 27.5.1(ts-node@10.9.2) jest-regex-util: 28.0.2 jest-watcher: 28.1.3 slash: 4.0.0 @@ -19541,7 +16967,7 @@ packages: dependencies: '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.14.2 + '@types/node': 18.19.42 ansi-escapes: 4.3.2 chalk: 4.1.2 jest-util: 27.5.1 @@ -19554,34 +16980,20 @@ packages: dependencies: '@jest/test-result': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 20.14.2 + '@types/node': 18.19.42 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.10.2 jest-util: 28.1.3 string-length: 4.0.2 - /jest-watcher@29.5.0: - resolution: {integrity: sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.14.2 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.13.1 - jest-util: 29.7.0 - string-length: 4.0.2 - dev: true - /jest-watcher@29.7.0: resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.2 + '@types/node': 18.19.42 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -19596,147 +17008,43 @@ packages: supports-color: 6.1.0 dev: true - /jest-worker@26.6.2: - resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} - engines: {node: '>= 10.13.0'} - dependencies: - '@types/node': 20.14.2 - merge-stream: 2.0.0 - supports-color: 7.2.0 - dev: false - - /jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} - dependencies: - '@types/node': 20.14.2 - merge-stream: 2.0.0 - supports-color: 8.1.1 - - /jest-worker@28.1.3: - resolution: {integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - dependencies: - '@types/node': 20.14.2 - merge-stream: 2.0.0 - supports-color: 8.1.1 - - /jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@types/node': 20.14.2 - jest-util: 29.7.0 - merge-stream: 2.0.0 - supports-color: 8.1.1 - - /jest@27.5.1(ts-node@10.8.2): - resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 27.5.1(ts-node@10.8.2) - import-local: 3.1.0 - jest-cli: 27.5.1(ts-node@10.8.2) - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - ts-node - - utf-8-validate - dev: false - - /jest@28.1.3(@types/node@18.15.11)(ts-node@10.8.2): - resolution: {integrity: sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 28.1.3(ts-node@10.8.2) - '@jest/types': 28.1.3 - import-local: 3.1.0 - jest-cli: 28.1.3(@types/node@18.15.11)(ts-node@10.8.2) - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jest@29.5.0(@types/node@18.15.11)(ts-node@10.8.2): - resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.5.0(ts-node@10.8.2) - '@jest/types': 29.5.0 - import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - dev: true - - /jest@29.5.0(@types/node@20.14.2)(ts-node@10.8.2): - resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + /jest-worker@26.6.2: + resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} + engines: {node: '>= 10.13.0'} dependencies: - '@jest/core': 29.5.0(ts-node@10.8.2) - '@jest/types': 29.5.0 - import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.14.2)(ts-node@10.8.2) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - dev: true + '@types/node': 18.19.42 + merge-stream: 2.0.0 + supports-color: 7.2.0 + dev: false - /jest@29.7.0(@types/node@18.15.11)(ts-node@10.8.2): - resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + /jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} dependencies: - '@jest/core': 29.7.0(ts-node@10.8.2) - '@jest/types': 29.6.3 - import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - dev: true + '@types/node': 18.19.42 + merge-stream: 2.0.0 + supports-color: 8.1.1 - /jest@29.7.0(@types/node@18.15.11)(ts-node@10.9.1): - resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + /jest-worker@28.1.3: + resolution: {integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@types/node': 18.19.42 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + /jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@types/node': 18.19.42 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + /jest@27.5.1(ts-node@10.9.2): + resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -19744,20 +17052,20 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.7.0(ts-node@10.9.1) - '@jest/types': 29.6.3 - import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@18.15.11)(ts-node@10.9.1) + '@jest/core': 27.5.1(ts-node@10.9.2) + import-local: 3.2.0 + jest-cli: 27.5.1(ts-node@10.9.2) transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros + - bufferutil + - canvas - supports-color - ts-node - dev: true + - utf-8-validate + dev: false - /jest@29.7.0(@types/node@18.15.11)(ts-node@10.9.2): - resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /jest@28.1.3(@types/node@18.19.42)(ts-node@10.9.2): + resolution: {integrity: sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -19765,18 +17073,17 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2) - '@jest/types': 29.6.3 - import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@18.15.11)(ts-node@10.9.2) + '@jest/core': 28.1.3(ts-node@10.9.2) + '@jest/types': 28.1.3 + import-local: 3.2.0 + jest-cli: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2) transitivePeerDependencies: - '@types/node' - - babel-plugin-macros - supports-color - ts-node dev: true - /jest@29.7.0(@types/node@20.14.2)(ts-node@10.8.2): + /jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2): resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -19786,10 +17093,10 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.7.0(ts-node@10.8.2) + '@jest/core': 29.7.0(ts-node@10.9.2) '@jest/types': 29.6.3 - import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.14.2)(ts-node@10.8.2) + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -19797,23 +17104,24 @@ packages: - ts-node dev: true - /jiti@1.18.2: - resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==} + /jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true - /jose@4.13.1: - resolution: {integrity: sha512-MSJQC5vXco5Br38mzaQKiq9mwt7lwj2eXpgpRyQYNHYt2lq1PjkWa7DLXX0WVcQLE9HhMh3jPiufS7fhJf+CLQ==} + /jose@4.15.9: + resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} dev: false - /js-beautify@1.14.7: - resolution: {integrity: sha512-5SOX1KXPFKx+5f6ZrPsIPEY7NwKeQz47n3jm2i+XeHx9MoRsfQenlOP13FQhWvg8JRS0+XLO6XYUQ2GX+q+T9A==} - engines: {node: '>=10'} + /js-beautify@1.15.1: + resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} + engines: {node: '>=14'} hasBin: true dependencies: config-chain: 1.1.13 - editorconfig: 0.15.3 - glob: 8.1.0 - nopt: 6.0.0 + editorconfig: 1.0.4 + glob: 10.4.5 + js-cookie: 3.0.5 + nopt: 7.2.1 dev: false /js-cookie@2.2.1: @@ -19825,8 +17133,13 @@ packages: engines: {node: '>=12'} dev: true - /js-sdsl@4.4.0: - resolution: {integrity: sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==} + /js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + dev: false + + /js-sdsl@4.4.2: + resolution: {integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==} /js-sha256@0.9.0: resolution: {integrity: sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==} @@ -19856,27 +17169,30 @@ packages: dev: false optional: true - /jsdoc@4.0.2: - resolution: {integrity: sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==} + /jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + + /jsdoc@4.0.3: + resolution: {integrity: sha512-Nu7Sf35kXJ1MWDZIMAuATRQTg1iIPdzh7tqJ6jjvaU/GfDf+qi5UV8zJR3Mo+/pYFvm8mzay4+6O5EWigaQBQw==} engines: {node: '>=12.0.0'} hasBin: true requiresBuild: true dependencies: - '@babel/parser': 7.22.16 - '@jsdoc/salty': 0.2.5 - '@types/markdown-it': 12.2.3 + '@babel/parser': 7.25.0 + '@jsdoc/salty': 0.2.8 + '@types/markdown-it': 14.1.2 bluebird: 3.7.2 catharsis: 0.9.0 escape-string-regexp: 2.0.0 js2xmlparser: 4.0.2 klaw: 3.0.0 - markdown-it: 12.3.2 - markdown-it-anchor: 8.6.7(@types/markdown-it@12.2.3)(markdown-it@12.3.2) + markdown-it: 14.1.0 + markdown-it-anchor: 8.6.7(@types/markdown-it@14.1.2)(markdown-it@14.1.0) marked: 4.3.0 mkdirp: 1.0.4 requizzle: 0.2.4 strip-json-comments: 3.1.1 - underscore: 1.13.6 + underscore: 1.13.7 dev: false optional: true @@ -19890,31 +17206,31 @@ packages: optional: true dependencies: abab: 2.0.6 - acorn: 8.11.3 + acorn: 8.12.1 acorn-globals: 6.0.0 cssom: 0.4.4 cssstyle: 2.3.0 data-urls: 2.0.0 decimal.js: 10.4.3 domexception: 2.0.1 - escodegen: 2.0.0 + escodegen: 2.1.0 form-data: 3.0.1 html-encoding-sniffer: 2.0.1 http-proxy-agent: 4.0.1 https-proxy-agent: 5.0.1 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.3 + nwsapi: 2.2.12 parse5: 6.0.1 saxes: 5.0.1 symbol-tree: 3.2.4 - tough-cookie: 4.1.2 + tough-cookie: 4.1.4 w3c-hr-time: 1.0.2 w3c-xmlserializer: 2.0.0 webidl-conversions: 6.1.0 whatwg-encoding: 1.0.5 whatwg-mimetype: 2.3.0 whatwg-url: 8.7.0 - ws: 7.5.9 + ws: 7.5.10 xml-name-validator: 3.0.0 transitivePeerDependencies: - bufferutil @@ -19934,9 +17250,12 @@ packages: /json-bigint@1.0.0: resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} dependencies: - bignumber.js: 9.1.1 + bignumber.js: 9.1.2 dev: false + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + /json-grab@0.1.0-alpha.2: resolution: {integrity: sha512-9aoAuQ+32pyfOhsLbPfAY9cYg0XuUkhTw8FDDX2SS+9gsz+Z0VtnMjE0SLIlarfdJ9uVN+xTPoDeuWLNnWKQxw==} engines: {node: 16.x} @@ -19949,6 +17268,10 @@ packages: /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + /json-parse-even-better-errors@3.0.2: + resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + /json-schema-compare@0.2.2: resolution: {integrity: sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ==} dependencies: @@ -20022,7 +17345,7 @@ packages: /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: - universalify: 2.0.0 + universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 @@ -20030,6 +17353,14 @@ packages: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} + /jsonpath@1.1.1: + resolution: {integrity: sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==} + dependencies: + esprima: 1.2.2 + static-eval: 2.0.2 + underscore: 1.12.1 + dev: false + /jsonpointer@5.0.1: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} @@ -20048,7 +17379,7 @@ packages: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.5.4 + semver: 7.6.3 dev: false /jsprim@2.0.2: @@ -20061,15 +17392,17 @@ packages: verror: 1.10.0 dev: false - /jsx-ast-utils@3.3.3: - resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==} + /jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} dependencies: - array-includes: 3.1.6 - object.assign: 4.1.4 + array-includes: 3.1.8 + array.prototype.flat: 1.3.2 + object.assign: 4.1.5 + object.values: 1.2.0 - /juice@9.0.0: - resolution: {integrity: sha512-s/IwgQ4caZq3bSnQZlKfdGUqJWy9WzTzB12WSPko9G8uK74H8BJEQvX7GLmFAQ6SLFgAppqC/TUYepKZZaV+JA==} + /juice@10.0.0: + resolution: {integrity: sha512-9f68xmhGrnIi6DBkiiP3rUrQN33SEuaKu1+njX6VgMP+jwZAsnT33WIzlrWICL9matkhYu3OyrqSUP55YTIdGg==} engines: {node: '>=10.0.0'} hasBin: true dependencies: @@ -20104,16 +17437,16 @@ packages: safe-buffer: 5.2.1 dev: false - /jwks-rsa@3.0.1: - resolution: {integrity: sha512-UUOZ0CVReK1QVU3rbi9bC7N5/le8ziUj0A2ef1Q0M7OPD2KvjEYizptqIxGIo6fSLYDkqBrazILS18tYuRc8gw==} + /jwks-rsa@3.1.0: + resolution: {integrity: sha512-v7nqlfezb9YfHHzYII3ef2a2j1XnGeSE/bK3WfumaYCqONAIstJbrEGapz4kadScZzEt7zYCN7bucj8C0Mv/Rg==} engines: {node: '>=14'} dependencies: - '@types/express': 4.17.17 - '@types/jsonwebtoken': 9.0.3 - debug: 4.3.4 - jose: 4.13.1 + '@types/express': 4.17.21 + '@types/jsonwebtoken': 9.0.6 + debug: 4.3.6 + jose: 4.15.9 limiter: 1.1.5 - lru-memoizer: 2.2.0 + lru-memoizer: 2.3.0 transitivePeerDependencies: - supports-color dev: false @@ -20144,6 +17477,11 @@ packages: engines: {node: '>=14.0.0'} dev: false + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + /kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -20164,18 +17502,19 @@ packages: resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} engines: {node: '>= 8'} - /language-subtag-registry@0.3.22: - resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} + /language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} - /language-tags@1.0.5: - resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} + /language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} dependencies: - language-subtag-registry: 0.3.22 + language-subtag-registry: 0.3.23 - /launch-editor@2.6.0: - resolution: {integrity: sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==} + /launch-editor@2.8.0: + resolution: {integrity: sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==} dependencies: - picocolors: 1.0.0 + picocolors: 1.0.1 shell-quote: 1.8.1 dev: false @@ -20186,7 +17525,7 @@ packages: readable-stream: 2.3.8 dev: true - /less-loader@10.2.0(less@4.1.3)(webpack@5.91.0): + /less-loader@10.2.0(less@4.2.0)(webpack@5.93.0): resolution: {integrity: sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -20194,28 +17533,26 @@ packages: webpack: ^5.0.0 dependencies: klona: 2.0.6 - less: 4.1.3 - webpack: 5.91.0(webpack-cli@5.1.4) + less: 4.2.0 + webpack: 5.93.0(webpack-cli@5.1.4) dev: true - /less@4.1.3: - resolution: {integrity: sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==} + /less@4.2.0: + resolution: {integrity: sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==} engines: {node: '>=6'} hasBin: true dependencies: copy-anything: 2.0.6 parse-node-version: 1.0.1 - tslib: 2.6.2 + tslib: 2.6.3 optionalDependencies: errno: 0.1.8 graceful-fs: 4.2.11 image-size: 0.5.5 make-dir: 2.1.0 mime: 1.6.0 - needle: 3.2.0 + needle: 3.3.1 source-map: 0.6.1 - transitivePeerDependencies: - - supports-color dev: true /leven@3.1.0: @@ -20225,7 +17562,6 @@ packages: /levn@0.3.0: resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} engines: {node: '>= 0.8.0'} - requiresBuild: true dependencies: prelude-ls: 1.1.2 type-check: 0.3.2 @@ -20248,6 +17584,10 @@ packages: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} + /lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + /limiter@1.1.5: resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==} dev: false @@ -20255,11 +17595,11 @@ packages: /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - /linkify-it@3.0.3: - resolution: {integrity: sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==} + /linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} requiresBuild: true dependencies: - uc.micro: 1.0.6 + uc.micro: 2.1.0 dev: false optional: true @@ -20293,8 +17633,8 @@ packages: emojis-list: 3.0.0 json5: 2.2.3 - /loader-utils@3.2.1: - resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==} + /loader-utils@3.3.1: + resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} engines: {node: '>= 12.13.0'} dev: false @@ -20433,8 +17773,8 @@ packages: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} dev: false - /long@5.2.1: - resolution: {integrity: sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==} + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} @@ -20449,27 +17789,11 @@ packages: /lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} dependencies: - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} - engines: {node: 14 || >=16.14} - dev: false - - /lru-cache@4.0.2: - resolution: {integrity: sha512-uQw9OqphAGiZhkuPlpFGmdTU2tEuhxTourM/19qGJrxBPHAr/f8BT1a0i/lOclESnGatdJG/UCkP9kZB/Lh1iw==} - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - dev: false - - /lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - dev: false + /lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -20486,23 +17810,19 @@ packages: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} - /lru-memoizer@2.2.0: - resolution: {integrity: sha512-QfOZ6jNkxCcM/BkIPnFsqDhtrazLRsghi9mBwFAzol5GCvj4EkFT899Za3+QwikCg5sRX8JstioBDwOxEyzaNw==} + /lru-memoizer@2.3.0: + resolution: {integrity: sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==} dependencies: lodash.clonedeep: 4.5.0 - lru-cache: 4.0.2 - dev: false - - /lru_map@0.3.3: - resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} + lru-cache: 6.0.0 dev: false - /lucide-react@0.263.1(react@18.2.0): + /lucide-react@0.263.1(react@18.3.1): resolution: {integrity: sha512-keqxAx97PlaEN89PXZ6ki1N8nRjGWtDa4021GFYLNj0RgruM5odbpl8GHTExj0hhPq3sF6Up0gnxt6TSHu+ovw==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 dependencies: - react: 18.2.0 + react: 18.3.1 dev: false /lz-string@1.5.0: @@ -20525,7 +17845,13 @@ packages: resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} engines: {node: '>=12'} dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 + + /magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + dev: true /make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} @@ -20533,7 +17859,7 @@ packages: requiresBuild: true dependencies: pify: 4.0.1 - semver: 5.7.1 + semver: 5.7.2 dev: true optional: true @@ -20543,6 +17869,12 @@ packages: dependencies: semver: 6.3.1 + /make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + dependencies: + semver: 7.6.3 + /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} @@ -20570,6 +17902,28 @@ packages: - bluebird - supports-color + /make-fetch-happen@11.1.1: + resolution: {integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + agentkeepalive: 4.3.0 + cacache: 17.1.4 + http-cache-semantics: 4.1.1 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 7.18.3 + minipass: 5.0.0 + minipass-fetch: 3.0.5 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + socks-proxy-agent: 7.0.0 + ssri: 10.0.6 + transitivePeerDependencies: + - supports-color + /make-fetch-happen@9.1.0: resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} engines: {node: '>= 10'} @@ -20604,38 +17958,39 @@ packages: engines: {node: '>=8'} dev: false - /markdown-it-anchor@8.6.7(@types/markdown-it@12.2.3)(markdown-it@12.3.2): + /markdown-it-anchor@8.6.7(@types/markdown-it@14.1.2)(markdown-it@14.1.0): resolution: {integrity: sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==} requiresBuild: true peerDependencies: '@types/markdown-it': '*' markdown-it: '*' dependencies: - '@types/markdown-it': 12.2.3 - markdown-it: 12.3.2 + '@types/markdown-it': 14.1.2 + markdown-it: 14.1.0 dev: false optional: true - /markdown-it@12.3.2: - resolution: {integrity: sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==} + /markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true requiresBuild: true dependencies: argparse: 2.0.1 - entities: 2.1.0 - linkify-it: 3.0.3 - mdurl: 1.0.1 - uc.micro: 1.0.6 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 dev: false optional: true - /markdown-to-jsx@7.2.1(react@18.2.0): - resolution: {integrity: sha512-9HrdzBAo0+sFz9ZYAGT5fB8ilzTW+q6lPocRxrIesMO+aB40V9MgFfbfMXxlGjf22OpRy+IXlvVaQenicdpgbg==} + /markdown-to-jsx@7.4.7(react@18.3.1): + resolution: {integrity: sha512-0+ls1IQZdU6cwM1yu0ZjjiVWYtkbExSyUIFU2ZeDIFuZM1W42Mh4OlJ4nb4apX4H8smxDHRdFaoIVJGwfv5hkg==} engines: {node: '>= 10'} peerDependencies: react: '>= 0.14.0' dependencies: - react: 18.2.0 + react: 18.3.1 dev: false /marked@4.3.0: @@ -20664,12 +18019,12 @@ packages: pretty-bytes: 3.0.1 dev: true - /maxmind@4.3.18: - resolution: {integrity: sha512-5b9utU7ZxcGYTBaO7hCF0FXyfw3IpankLn+FnLW4RZS1zi97RBeSdfXJFJlk5UxNsMiFZlsdMT3lzvD+bD8MLQ==} + /maxmind@4.3.20: + resolution: {integrity: sha512-xwnLGghs96DyNK3ANs1jzW8+JwS6pBQ3eTh3kNsi23n5wySZb9FgqCghmde5JZFOv23bxGehcyh6lT522llNKw==} engines: {node: '>=12', npm: '>=6'} dependencies: - mmdb-lib: 2.1.0 - tiny-lru: 11.2.5 + mmdb-lib: 2.1.1 + tiny-lru: 11.2.6 dev: false /mdn-data@2.0.14: @@ -20678,8 +18033,8 @@ packages: /mdn-data@2.0.4: resolution: {integrity: sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==} - /mdurl@1.0.1: - resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + /mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} requiresBuild: true dev: false optional: true @@ -20697,32 +18052,32 @@ packages: mem-fs: optional: true dependencies: - binaryextensions: 4.18.0 + binaryextensions: 4.19.0 commondir: 1.0.1 deep-extend: 0.6.0 - ejs: 3.1.9 + ejs: 3.1.10 globby: 11.1.0 - isbinaryfile: 5.0.0 + isbinaryfile: 5.0.2 mem-fs: 2.3.0 minimatch: 7.4.6 multimatch: 5.0.0 normalize-path: 3.0.0 - textextensions: 5.15.0 + textextensions: 5.16.0 /mem-fs@2.3.0: resolution: {integrity: sha512-GftCCBs6EN8sz3BoWO1bCj8t7YBtT713d8bUgbhg9Iel5kFSqnSvCK06TYIDJAtJ51cSiWkM/YemlT0dfoFycw==} engines: {node: '>=12'} dependencies: '@types/node': 15.14.9 - '@types/vinyl': 2.0.7 + '@types/vinyl': 2.0.12 vinyl: 2.2.1 vinyl-file: 3.0.0 - /memfs@3.5.0: - resolution: {integrity: sha512-yK6o8xVJlQerz57kvPROwTMgx5WtGwC2ZxDtOUsnGl49rHjYkfQoPNZPCKH73VdLE1BwBu/+Fx/NL8NYMUw2aA==} + /memfs@3.5.3: + resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} engines: {node: '>= 4.0.0'} dependencies: - fs-monkey: 1.0.3 + fs-monkey: 1.0.6 dev: false /memory-pager@1.5.0: @@ -20761,15 +18116,15 @@ packages: resolution: {integrity: sha512-3roSSgtJdIvvIOJdhefWD8BoEjHkbInkJzUoSE+ER6NGcpTuPWXNFyAbXamCL9Qg8rTU4urbYtXusk/d1ZpteA==} hasBin: true dependencies: - '@babel/core': 7.21.4 - '@babel/plugin-proposal-class-properties': 7.7.4(@babel/core@7.21.4) - '@babel/plugin-proposal-decorators': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.21.4) - '@babel/plugin-transform-flow-strip-types': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-transform-react-jsx': 7.21.0(@babel/core@7.21.4) - '@babel/preset-env': 7.23.2(@babel/core@7.21.4) - '@babel/preset-flow': 7.21.4(@babel/core@7.21.4) + '@babel/core': 7.25.2 + '@babel/plugin-proposal-class-properties': 7.7.4(@babel/core@7.25.2) + '@babel/plugin-proposal-decorators': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.25.2) + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-flow-strip-types': 7.25.2(@babel/core@7.25.2) + '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2) + '@babel/preset-env': 7.25.2(@babel/core@7.25.2) + '@babel/preset-flow': 7.24.7(@babel/core@7.25.2) '@rollup/plugin-alias': 3.1.9(rollup@1.32.1) '@rollup/plugin-commonjs': 11.1.0(rollup@1.32.1) '@rollup/plugin-json': 4.1.0(rollup@1.32.1) @@ -20779,7 +18134,7 @@ packages: autoprefixer: 9.8.8 babel-plugin-macros: 2.8.0 babel-plugin-transform-async-to-promises: 0.8.18 - babel-plugin-transform-replace-expressions: 0.2.0(@babel/core@7.21.4) + babel-plugin-transform-replace-expressions: 0.2.0(@babel/core@7.25.2) brotli-size: 4.0.0 camelcase: 5.3.1 cssnano: 4.1.11 @@ -20791,7 +18146,7 @@ packages: module-details-from-path: 1.0.3 pretty-bytes: 5.6.0 rollup: 1.32.1 - rollup-plugin-babel: 4.4.0(@babel/core@7.21.4)(rollup@1.32.1) + rollup-plugin-babel: 4.4.0(@babel/core@7.25.2)(rollup@1.32.1) rollup-plugin-bundle-size: 1.0.3 rollup-plugin-es3: 1.1.0 rollup-plugin-postcss: 2.9.0 @@ -20806,17 +18161,22 @@ packages: - supports-color dev: true - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + /micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} engines: {node: '>=8.6'} dependencies: - braces: 3.0.2 + braces: 3.0.3 picomatch: 2.3.1 /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} + /mime-db@1.53.0: + resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} + engines: {node: '>= 0.6'} + dev: false + /mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} @@ -20860,14 +18220,15 @@ packages: engines: {node: '>=4'} dev: true - /mini-css-extract-plugin@2.7.5(webpack@5.91.0): - resolution: {integrity: sha512-9HaR++0mlgom81s95vvNjxkg52n2b5s//3ZTI1EtzFb98awsLSivs2LMsVqnQ3ay0PVhqWcGNyDaTE961FOcjQ==} + /mini-css-extract-plugin@2.9.0(webpack@5.93.0): + resolution: {integrity: sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 dependencies: - schema-utils: 4.0.0 - webpack: 5.91.0(webpack-cli@5.1.4) + schema-utils: 4.2.0 + tapable: 2.2.1 + webpack: 5.93.0(webpack-cli@5.1.4) dev: false /minimalistic-assert@1.0.1: @@ -20891,6 +18252,25 @@ packages: dependencies: brace-expansion: 2.0.1 + /minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: false + + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + + /minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -20920,14 +18300,24 @@ packages: optionalDependencies: encoding: 0.1.13 + /minipass-fetch@3.0.5: + resolution: {integrity: sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minipass: 7.1.2 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + /minipass-flush@1.0.5: resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} engines: {node: '>= 8'} dependencies: minipass: 3.3.6 - /minipass-json-stream@1.0.1: - resolution: {integrity: sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==} + /minipass-json-stream@1.0.2: + resolution: {integrity: sha512-myxeeTm57lYs8pH2nxPzmEEg8DGIgW+9mv6D4JZD2pa81I/OBjeU7PtICXV6c9eRGTA5JMDsuIPUZRCyBMYNhg==} dependencies: jsonparse: 1.3.1 minipass: 3.3.6 @@ -20961,6 +18351,10 @@ packages: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} + /minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + /minizlib@1.3.3: resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} dependencies: @@ -20978,381 +18372,382 @@ packages: resolution: {integrity: sha512-DQsf/liljH/9e+94jR+xfK8vlKceeKdOM9H9UEXLwGuvEEpO6debNtJ9yt1ZKzPKPrwqGxzMdu0BR1fnQb6i4A==} dev: false - /mjml-accordion@4.14.1: - resolution: {integrity: sha512-dpNXyjnhYwhM75JSjD4wFUa9JgHm86M2pa0CoTzdv1zOQz67ilc4BoK5mc2S0gOjJpjBShM5eOJuCyVIuAPC6w==} + /mjml-accordion@4.15.3: + resolution: {integrity: sha512-LPNVSj1LyUVYT9G1gWwSw3GSuDzDsQCu0tPB2uDsq4VesYNnU6v3iLCQidMiR6azmIt13OEozG700ygAUuA6Ng==} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.14.1 + mjml-core: 4.15.3 transitivePeerDependencies: - encoding dev: false - /mjml-body@4.14.1: - resolution: {integrity: sha512-YpXcK3o2o1U+fhI8f60xahrhXuHmav6BZez9vIN3ZEJOxPFSr+qgr1cT2iyFz50L5+ZsLIVj2ZY+ALQjdsg8ig==} + /mjml-body@4.15.3: + resolution: {integrity: sha512-7pfUOVPtmb0wC+oUOn4xBsAw4eT5DyD6xqaxj/kssu6RrFXOXgJaVnDPAI9AzIvXJ/5as9QrqRGYAddehwWpHQ==} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.14.1 + mjml-core: 4.15.3 transitivePeerDependencies: - encoding dev: false - /mjml-button@4.14.1: - resolution: {integrity: sha512-V1Tl1vQ3lXYvvqHJHvGcc8URr7V1l/ZOsv7iLV4QRrh7kjKBXaRS7uUJtz6/PzEbNsGQCiNtXrODqcijLWlgaw==} + /mjml-button@4.15.3: + resolution: {integrity: sha512-79qwn9AgdGjJR1vLnrcm2rq2AsAZkKC5JPwffTMG+Nja6zGYpTDZFZ56ekHWr/r1b5WxkukcPj2PdevUug8c+Q==} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.14.1 + mjml-core: 4.15.3 transitivePeerDependencies: - encoding dev: false - /mjml-carousel@4.14.1: - resolution: {integrity: sha512-Ku3MUWPk/TwHxVgKEUtzspy/ePaWtN/3z6/qvNik0KIn0ZUIZ4zvR2JtaVL5nd30LHSmUaNj30XMPkCjYiKkFA==} + /mjml-carousel@4.15.3: + resolution: {integrity: sha512-3ju6I4l7uUhPRrJfN3yK9AMsfHvrYbRkcJ1GRphFHzUj37B2J6qJOQUpzA547Y4aeh69TSb7HFVf1t12ejQxVw==} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.14.1 + mjml-core: 4.15.3 transitivePeerDependencies: - encoding dev: false - /mjml-cli@4.14.1: - resolution: {integrity: sha512-Gy6MnSygFXs0U1qOXTHqBg2vZX2VL/fAacgQzD4MHq4OuybWaTNSzXRwxBXYCxT3IJB874n2Q0Mxp+Xka+tnZg==} + /mjml-cli@4.15.3: + resolution: {integrity: sha512-+V2TDw3tXUVEptFvLSerz125C2ogYl8klIBRY1m5BHd4JvGVf3yhx8N3PngByCzA6PGcv/eydGQN+wy34SHf0Q==} hasBin: true dependencies: - '@babel/runtime': 7.21.0 - chokidar: 3.5.3 - glob: 7.2.3 + '@babel/runtime': 7.25.0 + chokidar: 3.6.0 + glob: 10.4.5 html-minifier: 4.0.0 - js-beautify: 1.14.7 + js-beautify: 1.15.1 lodash: 4.17.21 - mjml-core: 4.14.1 - mjml-migrate: 4.14.1 - mjml-parser-xml: 4.14.1 - mjml-validator: 4.13.0 - yargs: 16.2.0 + minimatch: 9.0.5 + mjml-core: 4.15.3 + mjml-migrate: 4.15.3 + mjml-parser-xml: 4.15.3 + mjml-validator: 4.15.3 + yargs: 17.7.2 transitivePeerDependencies: - encoding dev: false - /mjml-column@4.14.1: - resolution: {integrity: sha512-iixVCIX1YJtpQuwG2WbDr7FqofQrlTtGQ4+YAZXGiLThs0En3xNIJFQX9xJ8sgLEGGltyooHiNICBRlzSp9fDg==} + /mjml-column@4.15.3: + resolution: {integrity: sha512-hYdEFdJGHPbZJSEysykrevEbB07yhJGSwfDZEYDSbhQQFjV2tXrEgYcFD5EneMaowjb55e3divSJxU4c5q4Qgw==} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.14.1 + mjml-core: 4.15.3 transitivePeerDependencies: - encoding dev: false - /mjml-core@4.14.1: - resolution: {integrity: sha512-di88rSfX+8r4r+cEqlQCO7CRM4mYZrfe2wSCu2je38i+ujjkLpF72cgLnjBlSG5aOUCZgYvlsZ85stqIz9LQfA==} + /mjml-core@4.15.3: + resolution: {integrity: sha512-Dmwk+2cgSD9L9GmTbEUNd8QxkTZtW9P7FN/ROZW/fGZD6Hq6/4TB0zEspg2Ow9eYjZXO2ofOJ3PaQEEShKV0kQ==} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 cheerio: 1.0.0-rc.12 detect-node: 2.1.0 html-minifier: 4.0.0 - js-beautify: 1.14.7 - juice: 9.0.0 + js-beautify: 1.15.1 + juice: 10.0.0 lodash: 4.17.21 - mjml-migrate: 4.14.1 - mjml-parser-xml: 4.14.1 - mjml-validator: 4.13.0 + mjml-migrate: 4.15.3 + mjml-parser-xml: 4.15.3 + mjml-validator: 4.15.3 transitivePeerDependencies: - encoding dev: false - /mjml-divider@4.14.1: - resolution: {integrity: sha512-agqWY0aW2xaMiUOhYKDvcAAfOLalpbbtjKZAl1vWmNkURaoK4L7MgDilKHSJDFUlHGm2ZOArTrq8i6K0iyThBQ==} + /mjml-divider@4.15.3: + resolution: {integrity: sha512-vh27LQ9FG/01y0b9ntfqm+GT5AjJnDSDY9hilss2ixIUh0FemvfGRfsGVeV5UBVPBKK7Ffhvfqc7Rciob9Spzw==} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.14.1 + mjml-core: 4.15.3 transitivePeerDependencies: - encoding dev: false - /mjml-group@4.14.1: - resolution: {integrity: sha512-dJt5batgEJ7wxlxzqOfHOI94ABX+8DZBvAlHuddYO4CsLFHYv6XRIArLAMMnAKU76r6p3X8JxYeOjKZXdv49kg==} + /mjml-group@4.15.3: + resolution: {integrity: sha512-HSu/rKnGZVKFq3ciT46vi1EOy+9mkB0HewO4+P6dP/Y0UerWkN6S3UK11Cxsj0cAp0vFwkPDCdOeEzRdpFEkzA==} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.14.1 + mjml-core: 4.15.3 transitivePeerDependencies: - encoding dev: false - /mjml-head-attributes@4.14.1: - resolution: {integrity: sha512-XdUNOp2csK28kBDSistInOyzWNwmu5HDNr4y1Z7vSQ1PfkmiuS6jWG7jHUjdoMhs27e6Leuyyc6a8gWSpqSWrg==} + /mjml-head-attributes@4.15.3: + resolution: {integrity: sha512-2ISo0r5ZKwkrvJgDou9xVPxxtXMaETe2AsAA02L89LnbB2KC0N5myNsHV0sEysTw9+CfCmgjAb0GAI5QGpxKkQ==} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.14.1 + mjml-core: 4.15.3 transitivePeerDependencies: - encoding dev: false - /mjml-head-breakpoint@4.14.1: - resolution: {integrity: sha512-Qw9l/W/I5Z9p7I4ShgnEpAL9if4472ejcznbBnp+4Gq+sZoPa7iYoEPsa9UCGutlaCh3N3tIi2qKhl9qD8DFxA==} + /mjml-head-breakpoint@4.15.3: + resolution: {integrity: sha512-Eo56FA5C2v6ucmWQL/JBJ2z641pLOom4k0wP6CMZI2utfyiJ+e2Uuinj1KTrgDcEvW4EtU9HrfAqLK9UosLZlg==} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.14.1 + mjml-core: 4.15.3 transitivePeerDependencies: - encoding dev: false - /mjml-head-font@4.14.1: - resolution: {integrity: sha512-oBYm1gaOdEMjE5BoZouRRD4lCNZ1jcpz92NR/F7xDyMaKCGN6T/+r4S5dq1gOLm9zWqClRHaECdFJNEmrDpZqA==} + /mjml-head-font@4.15.3: + resolution: {integrity: sha512-CzV2aDPpiNIIgGPHNcBhgyedKY4SX3BJoTwOobSwZVIlEA6TAWB4Z9WwFUmQqZOgo1AkkiTHPZQvGcEhFFXH6g==} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.14.1 + mjml-core: 4.15.3 transitivePeerDependencies: - encoding dev: false - /mjml-head-html-attributes@4.14.1: - resolution: {integrity: sha512-vlJsJc1Sm4Ml2XvLmp01zsdmWmzm6+jNCO7X3eYi9ngEh8LjMCLIQOncnOgjqm9uGpQu2EgUhwvYFZP2luJOVg==} + /mjml-head-html-attributes@4.15.3: + resolution: {integrity: sha512-MDNDPMBOgXUZYdxhosyrA2kudiGO8aogT0/cODyi2Ed9o/1S7W+je11JUYskQbncqhWKGxNyaP4VWa+6+vUC/g==} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.14.1 + mjml-core: 4.15.3 transitivePeerDependencies: - encoding dev: false - /mjml-head-preview@4.14.1: - resolution: {integrity: sha512-89gQtt3fhl2dkYpHLF5HDQXz/RLpzecU6wmAIT7Dz6etjLGE1dgq2Ay6Bu/OeHjDcT1gbM131zvBwuXw8OydNw==} + /mjml-head-preview@4.15.3: + resolution: {integrity: sha512-J2PxCefUVeFwsAExhrKo4lwxDevc5aKj888HBl/wN4EuWOoOg06iOGCxz4Omd8dqyFsrqvbBuPqRzQ+VycGmaA==} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.14.1 + mjml-core: 4.15.3 transitivePeerDependencies: - encoding dev: false - /mjml-head-style@4.14.1: - resolution: {integrity: sha512-XryOuf32EDuUCBT2k99C1+H87IOM919oY6IqxKFJCDkmsbywKIum7ibhweJdcxiYGONKTC6xjuibGD3fQTTYNQ==} + /mjml-head-style@4.15.3: + resolution: {integrity: sha512-9J+JuH+mKrQU65CaJ4KZegACUgNIlYmWQYx3VOBR/tyz+8kDYX7xBhKJCjQ1I4wj2Tvga3bykd89Oc2kFZ5WOw==} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.14.1 + mjml-core: 4.15.3 transitivePeerDependencies: - encoding dev: false - /mjml-head-title@4.14.1: - resolution: {integrity: sha512-aIfpmlQdf1eJZSSrFodmlC4g5GudBti2eMyG42M7/3NeLM6anEWoe+UkF/6OG4Zy0tCQ40BDJ5iBZlMsjQICzw==} + /mjml-head-title@4.15.3: + resolution: {integrity: sha512-IM59xRtsxID4DubQ0iLmoCGXguEe+9BFG4z6y2xQDrscIa4QY3KlfqgKGT69ojW+AVbXXJPEVqrAi4/eCsLItQ==} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.14.1 + mjml-core: 4.15.3 transitivePeerDependencies: - encoding dev: false - /mjml-head@4.14.1: - resolution: {integrity: sha512-KoCbtSeTAhx05Ugn9TB2UYt5sQinSCb7RGRer5iPQ3CrXj8hT5B5Svn6qvf/GACPkWl4auExHQh+XgLB+r3OEA==} + /mjml-head@4.15.3: + resolution: {integrity: sha512-o3mRuuP/MB5fZycjD3KH/uXsnaPl7Oo8GtdbJTKtH1+O/3pz8GzGMkscTKa97l03DAG2EhGrzzLcU2A6eshwFw==} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.14.1 + mjml-core: 4.15.3 transitivePeerDependencies: - encoding dev: false - /mjml-hero@4.14.1: - resolution: {integrity: sha512-TQJ3yfjrKYGkdEWjHLHhL99u/meKFYgnfJvlo9xeBvRjSM696jIjdqaPHaunfw4CP6d2OpCIMuacgOsvqQMWOA==} + /mjml-hero@4.15.3: + resolution: {integrity: sha512-9cLAPuc69yiuzNrMZIN58j+HMK1UWPaq2i3/Fg2ZpimfcGFKRcPGCbEVh0v+Pb6/J0+kf8yIO0leH20opu3AyQ==} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.14.1 + mjml-core: 4.15.3 transitivePeerDependencies: - encoding dev: false - /mjml-image@4.14.1: - resolution: {integrity: sha512-jfKLPHXuFq83okwlNM1Um/AEWeVDgs2JXIOsWp2TtvXosnRvGGMzA5stKLYdy1x6UfKF4c1ovpMS162aYGp+xQ==} + /mjml-image@4.15.3: + resolution: {integrity: sha512-g1OhSdofIytE9qaOGdTPmRIp7JsCtgO0zbsn1Fk6wQh2gEL55Z40j/VoghslWAWTgT2OHFdBKnMvWtN6U5+d2Q==} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.14.1 + mjml-core: 4.15.3 transitivePeerDependencies: - encoding dev: false - /mjml-migrate@4.14.1: - resolution: {integrity: sha512-d+9HKQOhZi3ZFAaFSDdjzJX9eDQGjMf3BArLWNm2okC4ZgfJSpOc77kgCyFV8ugvwc8fFegPnSV60Jl4xtvK2A==} + /mjml-migrate@4.15.3: + resolution: {integrity: sha512-sr/+35RdxZroNQVegjpfRHJ5hda9XCgaS4mK2FGO+Mb1IUevKfeEPII3F/cHDpNwFeYH3kAgyqQ22ClhGLWNBA==} hasBin: true dependencies: - '@babel/runtime': 7.21.0 - js-beautify: 1.14.7 + '@babel/runtime': 7.25.0 + js-beautify: 1.15.1 lodash: 4.17.21 - mjml-core: 4.14.1 - mjml-parser-xml: 4.14.1 - yargs: 16.2.0 + mjml-core: 4.15.3 + mjml-parser-xml: 4.15.3 + yargs: 17.7.2 transitivePeerDependencies: - encoding dev: false - /mjml-navbar@4.14.1: - resolution: {integrity: sha512-rNy1Kw8CR3WQ+M55PFBAUDz2VEOjz+sk06OFnsnmNjoMVCjo1EV7OFLDAkmxAwqkC8h4zQWEOFY0MBqqoAg7+A==} + /mjml-navbar@4.15.3: + resolution: {integrity: sha512-VsKH/Jdlf8Yu3y7GpzQV5n7JMdpqvZvTSpF6UQXL0PWOm7k6+LX+sCZimOfpHJ+wCaaybpxokjWZ71mxOoCWoA==} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.14.1 + mjml-core: 4.15.3 transitivePeerDependencies: - encoding dev: false - /mjml-parser-xml@4.14.1: - resolution: {integrity: sha512-9WQVeukbXfq9DUcZ8wOsHC6BTdhaVwTAJDYMIQglXLwKwN7I4pTCguDDHy5d0kbbzK5OCVxCdZe+bfVI6XANOQ==} + /mjml-parser-xml@4.15.3: + resolution: {integrity: sha512-Tz0UX8/JVYICLjT+U8J1f/TFxIYVYjzZHeh4/Oyta0pLpRLeZlxEd71f3u3kdnulCKMP4i37pFRDmyLXAlEuLw==} dependencies: - '@babel/runtime': 7.21.0 - detect-node: 2.0.4 - htmlparser2: 8.0.2 + '@babel/runtime': 7.25.0 + detect-node: 2.1.0 + htmlparser2: 9.1.0 lodash: 4.17.21 dev: false - /mjml-preset-core@4.14.1: - resolution: {integrity: sha512-uUCqK9Z9d39rwB/+JDV2KWSZGB46W7rPQpc9Xnw1DRP7wD7qAfJwK6AZFCwfTgWdSxw0PwquVNcrUS9yBa9uhw==} - dependencies: - '@babel/runtime': 7.21.0 - mjml-accordion: 4.14.1 - mjml-body: 4.14.1 - mjml-button: 4.14.1 - mjml-carousel: 4.14.1 - mjml-column: 4.14.1 - mjml-divider: 4.14.1 - mjml-group: 4.14.1 - mjml-head: 4.14.1 - mjml-head-attributes: 4.14.1 - mjml-head-breakpoint: 4.14.1 - mjml-head-font: 4.14.1 - mjml-head-html-attributes: 4.14.1 - mjml-head-preview: 4.14.1 - mjml-head-style: 4.14.1 - mjml-head-title: 4.14.1 - mjml-hero: 4.14.1 - mjml-image: 4.14.1 - mjml-navbar: 4.14.1 - mjml-raw: 4.14.1 - mjml-section: 4.14.1 - mjml-social: 4.14.1 - mjml-spacer: 4.14.1 - mjml-table: 4.14.1 - mjml-text: 4.14.1 - mjml-wrapper: 4.14.1 + /mjml-preset-core@4.15.3: + resolution: {integrity: sha512-1zZS8P4O0KweWUqNS655+oNnVMPQ1Rq1GaZq5S9JfwT1Vh/m516lSmiTW9oko6gGHytt5s6Yj6oOeu5Zm8FoLw==} + dependencies: + '@babel/runtime': 7.25.0 + mjml-accordion: 4.15.3 + mjml-body: 4.15.3 + mjml-button: 4.15.3 + mjml-carousel: 4.15.3 + mjml-column: 4.15.3 + mjml-divider: 4.15.3 + mjml-group: 4.15.3 + mjml-head: 4.15.3 + mjml-head-attributes: 4.15.3 + mjml-head-breakpoint: 4.15.3 + mjml-head-font: 4.15.3 + mjml-head-html-attributes: 4.15.3 + mjml-head-preview: 4.15.3 + mjml-head-style: 4.15.3 + mjml-head-title: 4.15.3 + mjml-hero: 4.15.3 + mjml-image: 4.15.3 + mjml-navbar: 4.15.3 + mjml-raw: 4.15.3 + mjml-section: 4.15.3 + mjml-social: 4.15.3 + mjml-spacer: 4.15.3 + mjml-table: 4.15.3 + mjml-text: 4.15.3 + mjml-wrapper: 4.15.3 transitivePeerDependencies: - encoding dev: false - /mjml-raw@4.14.1: - resolution: {integrity: sha512-9+4wzoXnCtfV6QPmjfJkZ50hxFB4Z8QZnl2Ac0D1Cn3dUF46UkmO5NLMu7UDIlm5DdFyycZrMOwvZS4wv9ksPw==} + /mjml-raw@4.15.3: + resolution: {integrity: sha512-IGyHheOYyRchBLiAEgw3UM11kFNmBSMupu2BDdejC6ZiDhEAdG+tyERlsCwDPYtXanvFpGWULIu3XlsUPc+RZw==} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.14.1 + mjml-core: 4.15.3 transitivePeerDependencies: - encoding dev: false - /mjml-react@2.0.8(mjml@4.14.1)(react-dom@18.2.0)(react@18.2.0): + /mjml-react@2.0.8(mjml@4.15.3)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-3wtHZZs1Y7e7Tl+ImojD/+aPE8Z0xshMww7MKSQlD9A1E/92amWQilGZN3T+WjWWaDueKcH2Gc1RJ72PLGSRGA==} peerDependencies: mjml: ^4.7.0 react: ^16.0.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 babel-runtime: 6.25.0 color: 3.2.1 - mjml: 4.14.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-reconciler: 0.26.2(react@18.2.0) + mjml: 4.15.3 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-reconciler: 0.26.2(react@18.3.1) dev: false - /mjml-section@4.14.1: - resolution: {integrity: sha512-Ik5pTUhpT3DOfB3hEmAWp8rZ0ilWtIivnL8XdUJRfgYE9D+MCRn+reIO+DAoJHxiQoI6gyeKkIP4B9OrQ7cHQw==} + /mjml-section@4.15.3: + resolution: {integrity: sha512-JfVPRXH++Hd933gmQfG8JXXCBCR6fIzC3DwiYycvanL/aW1cEQ2EnebUfQkt5QzlYjOkJEH+JpccAsq3ln6FZQ==} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.14.1 + mjml-core: 4.15.3 transitivePeerDependencies: - encoding dev: false - /mjml-social@4.14.1: - resolution: {integrity: sha512-G44aOZXgZHukirjkeQWTTV36UywtE2YvSwWGNfo/8d+k5JdJJhCIrlwaahyKEAyH63G1B0Zt8b2lEWx0jigYUw==} + /mjml-social@4.15.3: + resolution: {integrity: sha512-7sD5FXrESOxpT9Z4Oh36bS6u/geuUrMP1aCg2sjyAwbPcF1aWa2k9OcatQfpRf6pJEhUZ18y6/WBBXmMVmSzXg==} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.14.1 + mjml-core: 4.15.3 transitivePeerDependencies: - encoding dev: false - /mjml-spacer@4.14.1: - resolution: {integrity: sha512-5SfQCXTd3JBgRH1pUy6NVZ0lXBiRqFJPVHBdtC3OFvUS3q1w16eaAXlIUWMKTfy8CKhQrCiE6m65kc662ZpYxA==} + /mjml-spacer@4.15.3: + resolution: {integrity: sha512-3B7Qj+17EgDdAtZ3NAdMyOwLTX1jfmJuY7gjyhS2HtcZAmppW+cxqHUBwCKfvSRgTQiccmEvtNxaQK+tfyrZqA==} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.14.1 + mjml-core: 4.15.3 transitivePeerDependencies: - encoding dev: false - /mjml-table@4.14.1: - resolution: {integrity: sha512-aVBdX3WpyKVGh/PZNn2KgRem+PQhWlvnD00DKxDejRBsBSKYSwZ0t3EfFvZOoJ9DzfHsN0dHuwd6Z18Ps44NFQ==} + /mjml-table@4.15.3: + resolution: {integrity: sha512-FLx7DcRKTdKdcOCbMyBaeudeHaHpwPveRrBm6WyQe3LXx6FfdmOh59i71/16LFQMgBOD3N4/UJkzxLzlTJzMqQ==} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.14.1 + mjml-core: 4.15.3 transitivePeerDependencies: - encoding dev: false - /mjml-text@4.14.1: - resolution: {integrity: sha512-yZuvf5z6qUxEo5CqOhCUltJlR6oySKVcQNHwoV5sneMaKdmBiaU4VDnlYFera9gMD9o3KBHIX6kUg7EHnCwBRQ==} + /mjml-text@4.15.3: + resolution: {integrity: sha512-+C0hxCmw9kg0XzT6vhE5mFkK6y225nC8UEQcN94K0fBCjPKkM+HqZMwGX205fzdGRi+Bxa55b/VhrIVwdv+8vw==} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.14.1 + mjml-core: 4.15.3 transitivePeerDependencies: - encoding dev: false - /mjml-validator@4.13.0: - resolution: {integrity: sha512-uURYfyQYtHJ6Qz/1A7/+E9ezfcoISoLZhYK3olsxKRViwaA2Mm8gy/J3yggZXnsUXWUns7Qymycm5LglLEIiQg==} + /mjml-validator@4.15.3: + resolution: {integrity: sha512-Xb72KdqRwjv/qM2rJpV22syyP2N3cRQ9VVDrN6u2FSzLq02buFNxmSPJ7CKhat3PrUNdVHU75KZwOf/tz4UEhA==} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 dev: false - /mjml-wrapper@4.14.1: - resolution: {integrity: sha512-aA5Xlq6d0hZ5LY+RvSaBqmVcLkvPvdhyAv3vQf3G41Gfhel4oIPmkLnVpHselWhV14A0KwIOIAKVxHtSAxyOTQ==} + /mjml-wrapper@4.15.3: + resolution: {integrity: sha512-ditsCijeHJrmBmObtJmQ18ddLxv5oPyMTdPU8Di8APOnD2zPk7Z4UAuJSl7HXB45oFiivr3MJf4koFzMUSZ6Gg==} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.14.1 - mjml-section: 4.14.1 + mjml-core: 4.15.3 + mjml-section: 4.15.3 transitivePeerDependencies: - encoding dev: false - /mjml@4.14.1: - resolution: {integrity: sha512-f/wnWWIVbeb/ge3ff7c/KYYizI13QbGIp03odwwkCThsJsacw4gpZZAU7V4gXY3HxSXP2/q3jxOfaHVbkfNpOQ==} + /mjml@4.15.3: + resolution: {integrity: sha512-bW2WpJxm6HS+S3Yu6tq1DUPFoTxU9sPviUSmnL7Ua+oVO3WA5ILFWqvujUlz+oeuM+HCwEyMiP5xvKNPENVjYA==} hasBin: true dependencies: - '@babel/runtime': 7.21.0 - mjml-cli: 4.14.1 - mjml-core: 4.14.1 - mjml-migrate: 4.14.1 - mjml-preset-core: 4.14.1 - mjml-validator: 4.13.0 + '@babel/runtime': 7.25.0 + mjml-cli: 4.15.3 + mjml-core: 4.15.3 + mjml-migrate: 4.15.3 + mjml-preset-core: 4.15.3 + mjml-validator: 4.15.3 transitivePeerDependencies: - encoding dev: false @@ -21379,8 +18774,8 @@ packages: engines: {node: '>=10'} hasBin: true - /mmdb-lib@2.1.0: - resolution: {integrity: sha512-tdDTZmnI5G4UoSctv2KxM/3VQt2XRj4CmR5R4VsAWsOUcS3LysHR34wtixWm/pXxXdkBDuN92auxkC0T2+qd1Q==} + /mmdb-lib@2.1.1: + resolution: {integrity: sha512-yx8H/1H5AfnufiLnzzPqPf4yr/dKU9IFT1rPVwSkrKWHsQEeVVd6+X+L0nUbXhlEFTu3y/7hu38CFmEVgzvyeg==} engines: {node: '>=10', npm: '>=6'} dev: false @@ -21388,23 +18783,23 @@ packages: resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} dev: true - /moment@2.29.4: - resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} + /moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} dev: false /monaco-editor@0.50.0: resolution: {integrity: sha512-8CclLCmrRRh+sul7C08BmPBP3P8wVWfBHomsTcndxg5NRCEPfu/mc2AGU8k37ajjDVXcXFc12ORAMUkmk+lkFA==} dev: false - /mongodb-connection-string-url@3.0.0: - resolution: {integrity: sha512-t1Vf+m1I5hC2M5RJx/7AtxgABy1cZmIPQRMXw+gEIPn/cZNF3Oiy+l0UIypUwVB5trcWHq3crg2g3uAR9aAwsQ==} + /mongodb-connection-string-url@3.0.1: + resolution: {integrity: sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==} dependencies: - '@types/whatwg-url': 11.0.4 + '@types/whatwg-url': 11.0.5 whatwg-url: 13.0.0 dev: false - /mongodb@6.7.0(@mongodb-js/zstd@1.2.0): - resolution: {integrity: sha512-TMKyHdtMcO0fYBNORiYdmM25ijsHs+Njs963r4Tro4OQZzqYigAzYQouwWRg4OIaiLRUEGUh/1UAcH5lxdSLIA==} + /mongodb@6.8.0(@mongodb-js/zstd@1.2.0): + resolution: {integrity: sha512-HGQ9NWDle5WvwMnrvUxsFYPd3JEbqD3RgABHBQRuoCEND0qzhsd0iH5ypHsf1eJ+sXmvmyKpP+FLOKY8Il7jMw==} engines: {node: '>=16.20.1'} peerDependencies: '@aws-sdk/credential-providers': ^3.188.0 @@ -21430,10 +18825,10 @@ packages: socks: optional: true dependencies: - '@mongodb-js/saslprep': 1.1.5 + '@mongodb-js/saslprep': 1.1.8 '@mongodb-js/zstd': 1.2.0 - bson: 6.7.0 - mongodb-connection-string-url: 3.0.0 + bson: 6.8.0 + mongodb-connection-string-url: 3.0.1 dev: false /monorel@0.4.2: @@ -21441,7 +18836,7 @@ packages: hasBin: true dependencies: minimist: 1.2.8 - tslib: 2.6.2 + tslib: 2.6.3 dev: true /mri@1.2.0: @@ -21466,7 +18861,7 @@ packages: resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} hasBin: true dependencies: - dns-packet: 5.5.0 + dns-packet: 5.6.1 thunky: 1.1.0 dev: false @@ -21495,32 +18890,32 @@ packages: object-assign: 4.1.1 thenify-all: 1.6.0 - /nan@2.17.0: - resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==} + /nan@2.20.0: + resolution: {integrity: sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==} requiresBuild: true dev: true optional: true - /nano-css@5.3.5(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-vSB9X12bbNu4ALBu7nigJgRViZ6ja3OU7CeuiV1zMIbXOdmkLahgtPmh3GBOlDxbKY0CitqlPdOReGlBLSp+yg==} + /nano-css@5.6.2(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-+6bHaC8dSDGALM1HJjOHVXpuastdu2xFoZlC77Jh4cg+33Zcgm+Gxd+1xsnpZK14eyHObSp82+ll5y3SX75liw==} peerDependencies: react: '*' react-dom: '*' dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 css-tree: 1.1.3 - csstype: 3.1.2 + csstype: 3.1.3 fastest-stable-stringify: 2.0.2 - inline-style-prefixer: 6.0.4 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + inline-style-prefixer: 7.0.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) rtl-css-js: 1.16.1 - sourcemap-codec: 1.4.8 stacktrace-js: 2.0.2 - stylis: 4.1.3 + stylis: 4.3.2 dev: false - /nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -21535,17 +18930,14 @@ packages: /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - /needle@3.2.0: - resolution: {integrity: sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==} + /needle@3.3.1: + resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} engines: {node: '>= 4.4.x'} hasBin: true requiresBuild: true dependencies: - debug: 3.2.7(supports-color@5.5.0) iconv-lite: 0.6.3 - sax: 1.2.4 - transitivePeerDependencies: - - supports-color + sax: 1.4.1 dev: true optional: true @@ -21562,10 +18954,10 @@ packages: '@segment/isodate': 1.0.3 dev: true - /next-auth@4.23.2(next@13.5.6)(nodemailer@6.9.1)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-VRmInu0r/yZNFQheDFeOKtiugu3bt90Po3owAQDnFQ3YLQFmUKgFjcE2+3L0ny5jsJpBXaKbm7j7W2QTc6Ye2A==} + /next-auth@4.24.7(next@14.2.5)(nodemailer@6.9.14)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-iChjE8ov/1K/z98gdKbn2Jw+2vLgJtVV39X+rCP5SGnVQuco7QOr19FRNGMIrD8d3LYhHWV9j9sKLzq1aDWWQQ==} peerDependencies: - next: ^12.2.5 || ^13 + next: ^12.2.5 || ^13 || ^14 nodemailer: ^6.6.5 react: ^17.0.2 || ^18 react-dom: ^17.0.2 || ^18 @@ -21573,61 +18965,65 @@ packages: nodemailer: optional: true dependencies: - '@babel/runtime': 7.21.0 - '@panva/hkdf': 1.0.4 + '@babel/runtime': 7.25.0 + '@panva/hkdf': 1.2.1 cookie: 0.5.0 - jose: 4.13.1 - next: 13.5.6(@babel/core@7.21.4)(react-dom@18.2.0)(react@18.2.0) - nodemailer: 6.9.1 + jose: 4.15.9 + next: 14.2.5(@babel/core@7.25.2)(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1) + nodemailer: 6.9.14 oauth: 0.9.15 - openid-client: 5.4.0 - preact: 10.13.2 - preact-render-to-string: 5.2.6(preact@10.13.2) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + openid-client: 5.6.5 + preact: 10.23.1 + preact-render-to-string: 5.2.6(preact@10.23.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) uuid: 8.3.2 dev: false /next-transpile-modules@10.0.1: resolution: {integrity: sha512-4VX/LCMofxIYAVV58UmD+kr8jQflpLWvas/BQ4Co0qWLWzVh06FoZkECkrX5eEZT6oJFqie6+kfbTA3EZCVtdQ==} dependencies: - enhanced-resolve: 5.15.0 + enhanced-resolve: 5.17.1 dev: true - /next@13.5.6(@babel/core@7.21.4)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Y2wTcTbO4WwEsVb4A8VSnOsG1I9ok+h74q0ZdxkwM3EODqrs4pasq7O0iUxbcS9VtWMicG7f3+HAj0r1+NtKSw==} - engines: {node: '>=16.14.0'} + /next@14.2.5(@babel/core@7.25.2)(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-0f8aRfBVL+mpzfBjYfQuLWh2WyAwtJXCRfkPF4UJ5qd2YwrHczsrSzXU4tRMV0OAxR8ZJZWPFn6uhSC56UTsLA==} + engines: {node: '>=18.17.0'} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 react: ^18.2.0 react-dom: ^18.2.0 sass: ^1.3.0 peerDependenciesMeta: '@opentelemetry/api': optional: true + '@playwright/test': + optional: true sass: optional: true dependencies: - '@next/env': 13.5.6 - '@swc/helpers': 0.5.2 + '@next/env': 14.2.5 + '@playwright/test': 1.39.0 + '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001534 + caniuse-lite: 1.0.30001645 + graceful-fs: 4.2.11 postcss: 8.4.31 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.1(@babel/core@7.21.4)(react@18.2.0) - watchpack: 2.4.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.25.2)(react@18.3.1) optionalDependencies: - '@next/swc-darwin-arm64': 13.5.6 - '@next/swc-darwin-x64': 13.5.6 - '@next/swc-linux-arm64-gnu': 13.5.6 - '@next/swc-linux-arm64-musl': 13.5.6 - '@next/swc-linux-x64-gnu': 13.5.6 - '@next/swc-linux-x64-musl': 13.5.6 - '@next/swc-win32-arm64-msvc': 13.5.6 - '@next/swc-win32-ia32-msvc': 13.5.6 - '@next/swc-win32-x64-msvc': 13.5.6 + '@next/swc-darwin-arm64': 14.2.5 + '@next/swc-darwin-x64': 14.2.5 + '@next/swc-linux-arm64-gnu': 14.2.5 + '@next/swc-linux-arm64-musl': 14.2.5 + '@next/swc-linux-x64-gnu': 14.2.5 + '@next/swc-linux-x64-musl': 14.2.5 + '@next/swc-win32-arm64-msvc': 14.2.5 + '@next/swc-win32-ia32-msvc': 14.2.5 + '@next/swc-win32-x64-msvc': 14.2.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -21643,20 +19039,20 @@ packages: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: lower-case: 2.0.2 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /node-abi@2.30.1: resolution: {integrity: sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==} dependencies: - semver: 5.7.1 + semver: 5.7.2 dev: false - /node-abi@3.47.0: - resolution: {integrity: sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==} + /node-abi@3.65.0: + resolution: {integrity: sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==} engines: {node: '>=10'} dependencies: - semver: 7.5.4 + semver: 7.6.3 dev: false /node-addon-api@2.0.2: @@ -21674,19 +19070,12 @@ packages: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} - /node-fetch-commonjs@3.2.4: - resolution: {integrity: sha512-bZW7+ldcuuMPLTJk8DufhT6qHDRdljYD0jqBjmrYfcInaYcReX5kK42SQsu/jvtit/tER28yYjnk63PEEmNPtg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - formdata-polyfill: 4.0.10 - web-streams-polyfill: 3.2.1 - - /node-fetch-commonjs@3.3.1: - resolution: {integrity: sha512-kN5TfyrGRWJOZEAx7GvDu7kjvMKjmt4VmaE3dVeDWwzqzNFYgYroRLvTRJAEQ9/Ka3TumTwDrCZ5u3FJUqFb8A==} + /node-fetch-commonjs@3.3.2: + resolution: {integrity: sha512-VBlAiynj3VMLrotgwOS3OyECFxas5y7ltLcK4t41lMUZeaK15Ym4QRkqN0EQKAFL42q9i21EPKjzLUPfltR72A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - formdata-polyfill: 4.0.10 - web-streams-polyfill: 3.2.1 + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 /node-fetch@2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} @@ -21698,6 +19087,7 @@ packages: optional: true dependencies: whatwg-url: 5.0.0 + dev: true /node-fetch@2.6.9: resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} @@ -21735,8 +19125,8 @@ packages: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} - /node-gyp-build@4.6.0: - resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==} + /node-gyp-build@4.8.1: + resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} hasBin: true dev: true @@ -21752,8 +19142,28 @@ packages: nopt: 5.0.0 npmlog: 6.0.2 rimraf: 3.0.2 - semver: 7.5.4 - tar: 6.2.0 + semver: 7.6.3 + tar: 6.2.1 + which: 2.0.2 + transitivePeerDependencies: + - bluebird + - supports-color + + /node-gyp@9.4.1: + resolution: {integrity: sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==} + engines: {node: ^12.13 || ^14.13 || >=16} + hasBin: true + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + make-fetch-happen: 10.2.1 + nopt: 6.0.0 + npmlog: 6.0.2 + rimraf: 3.0.2 + semver: 7.6.3 + tar: 6.2.1 which: 2.0.2 transitivePeerDependencies: - bluebird @@ -21762,49 +19172,49 @@ packages: /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - /node-loader@2.0.0(webpack@5.91.0): + /node-loader@2.0.0(webpack@5.93.0): resolution: {integrity: sha512-I5VN34NO4/5UYJaUBtkrODPWxbobrE4hgDqPrjB25yPkonFhCmZ146vTH+Zg417E9Iwoh1l/MbRs1apc5J295Q==} engines: {node: '>= 10.13.0'} peerDependencies: webpack: ^5.0.0 dependencies: loader-utils: 2.0.4 - webpack: 5.91.0(webpack-cli@5.1.4) + webpack: 5.93.0(webpack-cli@5.1.4) dev: true /node-postgres@0.6.2: resolution: {integrity: sha512-wjaW+KutPOFemtBDuogyy6OMMOs2vpSOwuqbUhFUbrDEOTk66K2lmRyvOdO4t26qGtnPyZXQ4bAuF17cBhi5aQ==} dev: true - /node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + /node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} - /node-sql-parser@4.6.6: - resolution: {integrity: sha512-zpash5xnRY6+0C9HFru32iRJV1LTkwtrVpO90i385tYVF6efyXK/B3Nsq/15Fuv2utxrqHNjKtL55OHb8sl+eQ==} + /node-sql-parser@4.18.0: + resolution: {integrity: sha512-2YEOR5qlI1zUFbGMLKNfsrR5JUvFg9LxIRVE+xJe962pfVLH0rnItqLzv96XVs1Y1UIR8FxsXAuvX/lYAWZ2BQ==} engines: {node: '>=8'} dependencies: - big-integer: 1.6.51 + big-integer: 1.6.52 dev: false - /nodemailer@6.9.1: - resolution: {integrity: sha512-qHw7dOiU5UKNnQpXktdgQ1d3OFgRAekuvbJLcdG5dnEo/GtcTHRYM7+UfJARdOFU9WUQO8OiIamgWPmiSFHYAA==} + /nodemailer@6.9.14: + resolution: {integrity: sha512-Dobp/ebDKBvz91sbtRKhcznLThrKxKt97GI2FAlAyy+fk19j73Uz3sBXolVtmcXjaorivqsbbbjDY+Jkt4/bQA==} engines: {node: '>=6.0.0'} dev: false - /nodemon@2.0.20: - resolution: {integrity: sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==} + /nodemon@2.0.22: + resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} engines: {node: '>=8.10.0'} hasBin: true dependencies: - chokidar: 3.5.3 + chokidar: 3.6.0 debug: 3.2.7(supports-color@5.5.0) ignore-by-default: 1.0.1 minimatch: 3.1.2 pstree.remy: 1.1.8 - semver: 5.7.1 + semver: 5.7.2 simple-update-notifier: 1.1.0 supports-color: 5.5.0 - touch: 3.1.0 + touch: 3.1.1 undefsafe: 2.0.5 dev: true @@ -21812,13 +19222,6 @@ packages: resolution: {integrity: sha512-6kM8CLXvuW5crTxsAtva2YLrRrDaiTIkIePWs9moLHqbFWT94WpNFjwS/5dfLfECg5i/lkmw3aoqVidxt23TEQ==} dev: false - /nopt@1.0.10: - resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} - hasBin: true - dependencies: - abbrev: 1.1.1 - dev: true - /nopt@5.0.0: resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} engines: {node: '>=6'} @@ -21832,14 +19235,30 @@ packages: hasBin: true dependencies: abbrev: 1.1.1 + + /nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + abbrev: 2.0.0 dev: false /normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.2 - semver: 5.7.1 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + + /normalize-package-data@5.0.0: + resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + hosted-git-info: 6.1.1 + is-core-module: 2.15.0 + semver: 7.6.3 validate-npm-package-license: 3.0.4 /normalize-path@3.0.0: @@ -21865,11 +19284,23 @@ packages: dependencies: npm-normalize-package-bin: 1.0.1 + /npm-bundled@3.0.1: + resolution: {integrity: sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + npm-normalize-package-bin: 3.0.1 + /npm-install-checks@4.0.0: resolution: {integrity: sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==} engines: {node: '>=10'} dependencies: - semver: 7.5.4 + semver: 7.6.3 + + /npm-install-checks@6.3.0: + resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + semver: 7.6.3 /npm-normalize-package-bin@1.0.1: resolution: {integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==} @@ -21878,12 +19309,25 @@ packages: resolution: {integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + /npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + /npm-package-arg@10.1.0: + resolution: {integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + hosted-git-info: 6.1.1 + proc-log: 3.0.0 + semver: 7.6.3 + validate-npm-package-name: 5.0.1 + /npm-package-arg@8.1.5: resolution: {integrity: sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==} engines: {node: '>=10'} dependencies: hosted-git-info: 4.1.0 - semver: 7.5.4 + semver: 7.6.3 validate-npm-package-name: 3.0.0 /npm-packlist@3.0.0: @@ -21896,13 +19340,28 @@ packages: npm-bundled: 1.1.2 npm-normalize-package-bin: 1.0.1 + /npm-packlist@7.0.4: + resolution: {integrity: sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + ignore-walk: 6.0.5 + /npm-pick-manifest@6.1.1: resolution: {integrity: sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==} dependencies: npm-install-checks: 4.0.0 npm-normalize-package-bin: 1.0.1 npm-package-arg: 8.1.5 - semver: 7.5.4 + semver: 7.6.3 + + /npm-pick-manifest@8.0.2: + resolution: {integrity: sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + npm-install-checks: 6.3.0 + npm-normalize-package-bin: 3.0.1 + npm-package-arg: 10.1.0 + semver: 7.6.3 /npm-registry-fetch@12.0.2: resolution: {integrity: sha512-Df5QT3RaJnXYuOwtXBXS9BWs+tHH2olvkCLh6jcR/b/u3DvPMlp3J0TvvYwplPKxHMOwfg287PYih9QqaVFoKA==} @@ -21911,13 +19370,27 @@ packages: make-fetch-happen: 10.2.1 minipass: 3.3.6 minipass-fetch: 1.4.1 - minipass-json-stream: 1.0.1 + minipass-json-stream: 1.0.2 minizlib: 2.1.2 npm-package-arg: 8.1.5 transitivePeerDependencies: - bluebird - supports-color + /npm-registry-fetch@14.0.5: + resolution: {integrity: sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + make-fetch-happen: 11.1.1 + minipass: 5.0.0 + minipass-fetch: 3.0.5 + minipass-json-stream: 1.0.2 + minizlib: 2.1.2 + npm-package-arg: 10.1.0 + proc-log: 3.0.0 + transitivePeerDependencies: + - supports-color + /npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -21926,6 +19399,7 @@ packages: /npmlog@4.1.2: resolution: {integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==} + deprecated: This package is no longer supported. dependencies: are-we-there-yet: 1.1.7 console-control-strings: 1.1.0 @@ -21935,6 +19409,7 @@ packages: /npmlog@5.0.1: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + deprecated: This package is no longer supported. dependencies: are-we-there-yet: 2.0.0 console-control-strings: 1.1.0 @@ -21944,6 +19419,7 @@ packages: /npmlog@6.0.2: resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. dependencies: are-we-there-yet: 3.0.1 console-control-strings: 1.1.0 @@ -21973,8 +19449,8 @@ packages: resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} engines: {node: '>=0.10.0'} - /nwsapi@2.2.3: - resolution: {integrity: sha512-jscxIO4/VKScHlbmFBdV1Z6LXnLO+ZR4VMtypudUdfwtKxUN3TQcNFIHLwKtrUbDyHN4/GycY9+oRGZ2XMXYPw==} + /nwsapi@2.2.12: + resolution: {integrity: sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==} dev: false /oauth@0.9.15: @@ -21998,74 +19474,80 @@ packages: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} - /object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + /object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} - /object-is@1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + /object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 + call-bind: 1.0.7 + define-properties: 1.2.1 /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - /object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 + call-bind: 1.0.7 + define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 - /object.entries@1.1.6: - resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} + /object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 - /object.fromentries@2.0.6: - resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} + /object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 - /object.getownpropertydescriptors@2.1.5: - resolution: {integrity: sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==} + /object.getownpropertydescriptors@2.1.8: + resolution: {integrity: sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==} engines: {node: '>= 0.8'} dependencies: - array.prototype.reduce: 1.0.5 - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 + array.prototype.reduce: 1.0.7 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + gopd: 1.0.1 + safe-array-concat: 1.1.2 - /object.hasown@1.1.2: - resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} + /object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} dependencies: - define-properties: 1.2.0 - es-abstract: 1.21.2 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 - /object.values@1.1.6: - resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + /object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 /obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - dev: false - /oidc-token-hash@5.0.2: - resolution: {integrity: sha512-U91Ba78GtVBxcExLI7U+hC2AwJQqXQEW/D3fjmJC4hhSVIgdl954KO4Gu95WqAlgDKJdLATxkmuxraWLT0fVRQ==} + /oidc-token-hash@5.0.3: + resolution: {integrity: sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==} engines: {node: ^10.13.0 || >=12.0.0} dev: false @@ -22104,14 +19586,15 @@ packages: define-lazy-prop: 2.0.0 is-docker: 2.2.1 is-wsl: 2.2.0 + dev: false - /openid-client@5.4.0: - resolution: {integrity: sha512-hgJa2aQKcM2hn3eyVtN12tEA45ECjTJPXCgUh5YzTzy9qwapCvmDTVPWOcWVL0d34zeQoQ/hbG9lJhl3AYxJlQ==} + /openid-client@5.6.5: + resolution: {integrity: sha512-5P4qO9nGJzB5PI0LFlhj4Dzg3m4odt0qsJTfyEtZyOlkgpILwEioOhVVJOrS1iVH494S4Ee5OCjjg6Bf5WOj3w==} dependencies: - jose: 4.13.1 + jose: 4.15.9 lru-cache: 6.0.0 object-hash: 2.2.0 - oidc-token-hash: 5.0.2 + oidc-token-hash: 5.0.3 dev: false /optionator@0.8.3: @@ -22123,30 +19606,19 @@ packages: levn: 0.3.0 prelude-ls: 1.1.2 type-check: 0.3.2 - word-wrap: 1.2.3 + word-wrap: 1.2.5 dev: false - /optionator@0.9.1: - resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} - engines: {node: '>= 0.8.0'} - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.3 - - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + /optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 + word-wrap: 1.2.5 /ora@5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} @@ -22155,7 +19627,7 @@ packages: bl: 4.1.0 chalk: 4.1.2 cli-cursor: 3.1.0 - cli-spinners: 2.8.0 + cli-spinners: 2.9.2 is-interactive: 1.0.0 is-unicode-supported: 0.1.0 log-symbols: 4.1.0 @@ -22196,7 +19668,7 @@ packages: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - yocto-queue: 1.0.0 + yocto-queue: 1.1.1 dev: true /p-locate@3.0.0: @@ -22261,7 +19733,7 @@ packages: resolution: {integrity: sha512-UJKdSzgd3KOnXXAtqN5+/eeHcvTn1hBkesEmElVgvO/NAYcxAvmjzIGmnNd3Tb/gRAvMBdNRFD4qAWdHxY6QXg==} engines: {node: '>=12.10.0'} dependencies: - debug: 4.3.4 + debug: 4.3.6 p-queue: 6.6.2 transitivePeerDependencies: - supports-color @@ -22270,8 +19742,8 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - /packet-reader@1.0.0: - resolution: {integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==} + /package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} /pacote@12.0.3: resolution: {integrity: sha512-CdYEl03JDrRO3x18uHjBYA9TyoW8gy+ThVcypcDkxPtKlw76e4ejhYB6i9lJ+/cebbjpqPW/CijjqxwDTts8Ow==} @@ -22296,7 +19768,34 @@ packages: read-package-json-fast: 2.0.3 rimraf: 3.0.2 ssri: 8.0.1 - tar: 6.2.0 + tar: 6.2.1 + transitivePeerDependencies: + - bluebird + - supports-color + + /pacote@15.2.0: + resolution: {integrity: sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + '@npmcli/git': 4.1.0 + '@npmcli/installed-package-contents': 2.1.0 + '@npmcli/promise-spawn': 6.0.2 + '@npmcli/run-script': 6.0.2 + cacache: 17.1.4 + fs-minipass: 3.0.3 + minipass: 5.0.0 + npm-package-arg: 10.1.0 + npm-packlist: 7.0.4 + npm-pick-manifest: 8.0.2 + npm-registry-fetch: 14.0.5 + proc-log: 3.0.0 + promise-retry: 2.0.1 + read-package-json: 6.0.4 + read-package-json-fast: 3.0.2 + sigstore: 1.9.0 + ssri: 10.0.6 + tar: 6.2.1 transitivePeerDependencies: - bluebird - supports-color @@ -22311,7 +19810,7 @@ packages: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} dependencies: dot-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /parent-module@1.0.1: @@ -22348,7 +19847,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.7 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -22377,7 +19876,7 @@ packages: /parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} dependencies: - entities: 4.4.0 + entities: 4.5.0 dev: false /parseurl@1.3.3: @@ -22388,7 +19887,7 @@ packages: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} dependencies: no-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /path-browserify@1.0.1: @@ -22431,6 +19930,13 @@ packages: /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + /path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + /path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} @@ -22470,62 +19976,75 @@ packages: requiresBuild: true optional: true - /pg-connection-string@2.6.2: - resolution: {integrity: sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==} + /pg-connection-string@2.6.4: + resolution: {integrity: sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==} + + /pg-cursor@2.10.6(pg@8.11.6): + resolution: {integrity: sha512-yxQGjy1GJl6BROtA4mq62Xd2izqhoGco6NYUgKXY9GMBKXfh7tGSGOhIy5K2ULerqOlJ4+3EKKj4Fog0OEKCyA==} + peerDependencies: + pg: ^8 + dependencies: + pg: 8.11.6 + dev: false - /pg-cursor@2.10.1(pg@8.11.3): - resolution: {integrity: sha512-t4bjqL/gtohsNoByFcD4EKjHVppOuJipBYVhunVUm25TnaS2xEEr2jy3vumOX2z44SHROaf4K7QWPY9xnKT3HA==} + /pg-cursor@2.11.0(pg@8.11.6): + resolution: {integrity: sha512-TLCOCtu+rqMarzjUi+/Ffc2DV5ZqO/27y5GqnK9Z3w51rWXMwC8FcO96Uf9/ORo5o+qRXEVJxM9Ts3K2K31MLg==} peerDependencies: pg: ^8 dependencies: - pg: 8.11.3 + pg: 8.11.6 + dev: true /pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} - /pg-minify@1.6.3: - resolution: {integrity: sha512-NoSsPqXxbkD8RIe+peQCqiea4QzXgosdTKY8p7PsbbGsh2F8TifDj/vJxfuR8qJwNYrijdSs7uf0tAe6WOyCsQ==} - engines: {node: '>=12.0.0'} + /pg-minify@1.6.5: + resolution: {integrity: sha512-u0UE8veaCnMfJmoklqneeBBopOAPG3/6DHqGVHYAhz8DkJXh9dnjPlz25fRxn4e+6XVzdOp7kau63Rp52fZ3WQ==} + engines: {node: '>=14.0.0'} dev: false - /pg-pool@3.6.1(pg@8.10.0): - resolution: {integrity: sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==} + /pg-numeric@1.0.2: + resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==} + engines: {node: '>=4'} + + /pg-pool@3.6.2(pg@8.11.6): + resolution: {integrity: sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==} peerDependencies: pg: '>=8.0' dependencies: - pg: 8.10.0 - dev: false + pg: 8.11.6 - /pg-pool@3.6.1(pg@8.11.3): - resolution: {integrity: sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==} + /pg-pool@3.6.2(pg@8.12.0): + resolution: {integrity: sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==} peerDependencies: pg: '>=8.0' dependencies: - pg: 8.11.3 + pg: 8.12.0 + dev: false - /pg-promise@11.4.3: - resolution: {integrity: sha512-b4wuukB+pkrLRZ53Z+3L9IONlIhOUSM/VlLQV2SnQzNJPJmDZj6ticgcMtZMDanAUEj+zX1FJOBrSpSR9TumXg==} + /pg-promise@11.9.1: + resolution: {integrity: sha512-qvMmyDvWd64X0a25hCuWV40GLMbgeYf4z7ZmzxQqGHtUIlzMtxcMtaBHAMr7XVOL62wFv2ZVKW5pFruD/4ZAOg==} engines: {node: '>=14.0'} dependencies: assert-options: 0.8.1 - pg: 8.10.0 - pg-minify: 1.6.3 + pg: 8.12.0 + pg-minify: 1.6.5 spex: 3.3.0 transitivePeerDependencies: - pg-native dev: false - /pg-protocol@1.6.0: - resolution: {integrity: sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==} + /pg-protocol@1.6.1: + resolution: {integrity: sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==} - /pg-query-stream@4.4.0(pg@8.11.3): - resolution: {integrity: sha512-shmP973/ruBw3exSmIEBW9iubWvyyZMzp6oWfcHgvlqAe4LtaRyVqPGxgnuorbRqksK03mjOC9PU+Ohz3b0GkQ==} + /pg-query-stream@4.6.0(pg@8.11.6): + resolution: {integrity: sha512-sg2Hewe6ge6osEY07zGu7Z8djrsQBvyiTy5ZjQffoSatEgnNNVsV3EWDm9Px/8R9oaAL1YnfnP8AXPMmfzujZg==} peerDependencies: pg: ^8 dependencies: - pg: 8.11.3 - pg-cursor: 2.10.1(pg@8.11.3) + pg: 8.11.6 + pg-cursor: 2.11.0(pg@8.11.6) dev: true /pg-types@2.2.0: @@ -22538,8 +20057,20 @@ packages: postgres-date: 1.0.7 postgres-interval: 1.2.0 - /pg@8.10.0: - resolution: {integrity: sha512-ke7o7qSTMb47iwzOSaZMfeR7xToFdkE71ifIipOAAaLIM0DYzfOAXlgFFmYUIE2BcJtvnVlGCID84ZzCegE8CQ==} + /pg-types@4.0.2: + resolution: {integrity: sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==} + engines: {node: '>=10'} + dependencies: + pg-int8: 1.0.1 + pg-numeric: 1.0.2 + postgres-array: 3.0.2 + postgres-bytea: 3.0.0 + postgres-date: 2.1.0 + postgres-interval: 3.0.0 + postgres-range: 1.1.4 + + /pg@8.11.6: + resolution: {integrity: sha512-6CyL4F0j3vPmakU9rWdeRY8qF5Cjc3OE86y6YpgDI6YtKHhNyCjGEIE8U5ZRfBjKTZikwolKIFWh3I22MeRnoA==} engines: {node: '>= 8.0.0'} peerDependencies: pg-native: '>=3.0.1' @@ -22547,17 +20078,16 @@ packages: pg-native: optional: true dependencies: - buffer-writer: 2.0.0 - packet-reader: 1.0.0 - pg-connection-string: 2.6.2 - pg-pool: 3.6.1(pg@8.10.0) - pg-protocol: 1.6.0 + pg-connection-string: 2.6.4 + pg-pool: 3.6.2(pg@8.11.6) + pg-protocol: 1.6.1 pg-types: 2.2.0 pgpass: 1.0.5 - dev: false + optionalDependencies: + pg-cloudflare: 1.1.1 - /pg@8.11.3: - resolution: {integrity: sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==} + /pg@8.12.0: + resolution: {integrity: sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==} engines: {node: '>= 8.0.0'} peerDependencies: pg-native: '>=3.0.1' @@ -22565,15 +20095,14 @@ packages: pg-native: optional: true dependencies: - buffer-writer: 2.0.0 - packet-reader: 1.0.0 - pg-connection-string: 2.6.2 - pg-pool: 3.6.1(pg@8.11.3) - pg-protocol: 1.6.0 + pg-connection-string: 2.6.4 + pg-pool: 3.6.2(pg@8.12.0) + pg-protocol: 1.6.1 pg-types: 2.2.0 pgpass: 1.0.5 optionalDependencies: pg-cloudflare: 1.1.1 + dev: false /pgpass@1.0.5: resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} @@ -22585,6 +20114,10 @@ packages: /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -22615,8 +20148,8 @@ packages: engines: {node: '>=0.10.0'} dev: true - /pirates@4.0.5: - resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} /pkg-dir@4.2.0: @@ -22643,7 +20176,6 @@ packages: resolution: {integrity: sha512-+k4pdZgs1qiM+OUkSjx96YiKsXsmb59evFoqv8SKO067qBA+Z2s/dCzJij/ZhdQcs2zlTAgRKfeiiLm8PQ2qvw==} engines: {node: '>=16'} hasBin: true - dev: true /playwright@1.39.0: resolution: {integrity: sha512-naE5QT11uC/Oiq0BwZ50gDmy8c8WLPRTEWuSSFVG2egBka/1qMoSqYQcROMT9zLwJ86oPofcTH2jBY/5wWOgIw==} @@ -22653,84 +20185,87 @@ packages: playwright-core: 1.39.0 optionalDependencies: fsevents: 2.3.2 - dev: true - /postcss-attribute-case-insensitive@5.0.2(postcss@8.4.30): + /possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + /postcss-attribute-case-insensitive@5.0.2(postcss@8.4.40): resolution: {integrity: sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.30 - postcss-selector-parser: 6.0.11 + postcss: 8.4.40 + postcss-selector-parser: 6.1.1 dev: false - /postcss-browser-comments@4.0.0(browserslist@4.21.10)(postcss@8.4.30): + /postcss-browser-comments@4.0.0(browserslist@4.23.2)(postcss@8.4.40): resolution: {integrity: sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==} engines: {node: '>=8'} peerDependencies: browserslist: '>=4' postcss: '>=8' dependencies: - browserslist: 4.21.10 - postcss: 8.4.30 + browserslist: 4.23.2 + postcss: 8.4.40 dev: false /postcss-calc@7.0.5: resolution: {integrity: sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==} dependencies: postcss: 7.0.39 - postcss-selector-parser: 6.0.11 + postcss-selector-parser: 6.1.1 postcss-value-parser: 4.2.0 dev: true - /postcss-calc@8.2.4(postcss@8.4.31): + /postcss-calc@8.2.4(postcss@8.4.40): resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} peerDependencies: postcss: ^8.2.2 dependencies: - postcss: 8.4.31 - postcss-selector-parser: 6.0.11 + postcss: 8.4.40 + postcss-selector-parser: 6.1.1 postcss-value-parser: 4.2.0 dev: false - /postcss-clamp@4.1.0(postcss@8.4.30): + /postcss-clamp@4.1.0(postcss@8.4.40): resolution: {integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==} engines: {node: '>=7.6.0'} peerDependencies: postcss: ^8.4.6 dependencies: - postcss: 8.4.30 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false - /postcss-color-functional-notation@4.2.4(postcss@8.4.30): + /postcss-color-functional-notation@4.2.4(postcss@8.4.40): resolution: {integrity: sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.30 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false - /postcss-color-hex-alpha@8.0.4(postcss@8.4.30): + /postcss-color-hex-alpha@8.0.4(postcss@8.4.40): resolution: {integrity: sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.30 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false - /postcss-color-rebeccapurple@7.1.1(postcss@8.4.30): + /postcss-color-rebeccapurple@7.1.1(postcss@8.4.40): resolution: {integrity: sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.30 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false @@ -22738,23 +20273,23 @@ packages: resolution: {integrity: sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.21.10 + browserslist: 4.23.2 color: 3.2.1 - has: 1.0.3 + has: 1.0.4 postcss: 7.0.39 postcss-value-parser: 3.3.1 dev: true - /postcss-colormin@5.3.1(postcss@8.4.31): + /postcss-colormin@5.3.1(postcss@8.4.40): resolution: {integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.10 + browserslist: 4.23.2 caniuse-api: 3.0.0 colord: 2.9.3 - postcss: 8.4.31 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false @@ -22766,55 +20301,55 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-convert-values@5.1.3(postcss@8.4.31): + /postcss-convert-values@5.1.3(postcss@8.4.40): resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.10 - postcss: 8.4.31 + browserslist: 4.23.2 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false - /postcss-custom-media@8.0.2(postcss@8.4.30): + /postcss-custom-media@8.0.2(postcss@8.4.40): resolution: {integrity: sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.3 dependencies: - postcss: 8.4.30 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false - /postcss-custom-properties@12.1.11(postcss@8.4.30): + /postcss-custom-properties@12.1.11(postcss@8.4.40): resolution: {integrity: sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.30 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false - /postcss-custom-selectors@6.0.3(postcss@8.4.30): + /postcss-custom-selectors@6.0.3(postcss@8.4.40): resolution: {integrity: sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.3 dependencies: - postcss: 8.4.30 - postcss-selector-parser: 6.0.11 + postcss: 8.4.40 + postcss-selector-parser: 6.1.1 dev: false - /postcss-dir-pseudo-class@6.0.5(postcss@8.4.30): + /postcss-dir-pseudo-class@6.0.5(postcss@8.4.40): resolution: {integrity: sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.30 - postcss-selector-parser: 6.0.11 + postcss: 8.4.40 + postcss-selector-parser: 6.1.1 dev: false /postcss-discard-comments@4.0.2: @@ -22824,13 +20359,13 @@ packages: postcss: 7.0.39 dev: true - /postcss-discard-comments@5.1.2(postcss@8.4.31): + /postcss-discard-comments@5.1.2(postcss@8.4.40): resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.40 dev: false /postcss-discard-duplicates@4.0.2: @@ -22840,13 +20375,13 @@ packages: postcss: 7.0.39 dev: true - /postcss-discard-duplicates@5.1.0(postcss@8.4.31): + /postcss-discard-duplicates@5.1.0(postcss@8.4.40): resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.40 dev: false /postcss-discard-empty@4.0.1: @@ -22856,13 +20391,13 @@ packages: postcss: 7.0.39 dev: true - /postcss-discard-empty@5.1.1(postcss@8.4.31): + /postcss-discard-empty@5.1.1(postcss@8.4.40): resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.40 dev: false /postcss-discard-overridden@4.0.1: @@ -22872,149 +20407,127 @@ packages: postcss: 7.0.39 dev: true - /postcss-discard-overridden@5.1.0(postcss@8.4.31): + /postcss-discard-overridden@5.1.0(postcss@8.4.40): resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.40 dev: false - /postcss-double-position-gradients@3.1.2(postcss@8.4.30): + /postcss-double-position-gradients@3.1.2(postcss@8.4.40): resolution: {integrity: sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.30) - postcss: 8.4.30 + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.40) + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false - /postcss-env-function@4.0.6(postcss@8.4.30): + /postcss-env-function@4.0.6(postcss@8.4.40): resolution: {integrity: sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.30 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false - /postcss-flexbugs-fixes@5.0.2(postcss@8.4.30): + /postcss-flexbugs-fixes@5.0.2(postcss@8.4.40): resolution: {integrity: sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==} peerDependencies: postcss: ^8.1.4 dependencies: - postcss: 8.4.30 + postcss: 8.4.40 dev: false - /postcss-focus-visible@6.0.4(postcss@8.4.30): + /postcss-focus-visible@6.0.4(postcss@8.4.40): resolution: {integrity: sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.30 - postcss-selector-parser: 6.0.11 + postcss: 8.4.40 + postcss-selector-parser: 6.1.1 dev: false - /postcss-focus-within@5.0.4(postcss@8.4.30): + /postcss-focus-within@5.0.4(postcss@8.4.40): resolution: {integrity: sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.30 - postcss-selector-parser: 6.0.11 + postcss: 8.4.40 + postcss-selector-parser: 6.1.1 dev: false - /postcss-font-variant@5.0.0(postcss@8.4.30): + /postcss-font-variant@5.0.0(postcss@8.4.40): resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.30 + postcss: 8.4.40 dev: false - /postcss-gap-properties@3.0.5(postcss@8.4.30): + /postcss-gap-properties@3.0.5(postcss@8.4.40): resolution: {integrity: sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.30 + postcss: 8.4.40 dev: false - /postcss-image-set-function@4.0.7(postcss@8.4.30): + /postcss-image-set-function@4.0.7(postcss@8.4.40): resolution: {integrity: sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.30 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false - /postcss-import@14.1.0(postcss@8.4.30): - resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} - engines: {node: '>=10.0.0'} - peerDependencies: - postcss: ^8.0.0 - dependencies: - postcss: 8.4.30 - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.2 - - /postcss-import@14.1.0(postcss@8.4.31): - resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} - engines: {node: '>=10.0.0'} + /postcss-import@15.1.0(postcss@8.4.40): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.31 + postcss: 8.4.40 postcss-value-parser: 4.2.0 read-cache: 1.0.0 - resolve: 1.22.2 - dev: true + resolve: 1.22.8 - /postcss-initial@4.0.1(postcss@8.4.30): + /postcss-initial@4.0.1(postcss@8.4.40): resolution: {integrity: sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.30 + postcss: 8.4.40 dev: false - /postcss-js@4.0.1(postcss@8.4.30): - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 - dependencies: - camelcase-css: 2.0.1 - postcss: 8.4.30 - - /postcss-js@4.0.1(postcss@8.4.31): + /postcss-js@4.0.1(postcss@8.4.40): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: postcss: ^8.4.21 dependencies: camelcase-css: 2.0.1 - postcss: 8.4.31 - dev: true + postcss: 8.4.40 - /postcss-lab-function@4.2.1(postcss@8.4.30): + /postcss-lab-function@4.2.1(postcss@8.4.40): resolution: {integrity: sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.30) - postcss: 8.4.30 + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.40) + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false @@ -23026,26 +20539,9 @@ packages: import-cwd: 2.1.0 dev: true - /postcss-load-config@3.1.4(postcss@8.4.30)(ts-node@10.8.2): - resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} - engines: {node: '>= 10'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - dependencies: - lilconfig: 2.1.0 - postcss: 8.4.30 - ts-node: 10.8.2(@types/node@18.15.11)(typescript@5.3.3) - yaml: 1.10.2 - - /postcss-load-config@3.1.4(postcss@8.4.31)(ts-node@10.8.2): - resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} - engines: {node: '>= 10'} + /postcss-load-config@4.0.2(postcss@8.4.40)(ts-node@10.9.2): + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} peerDependencies: postcss: '>=8.0.9' ts-node: '>=9.0.0' @@ -23055,13 +20551,12 @@ packages: ts-node: optional: true dependencies: - lilconfig: 2.1.0 - postcss: 8.4.31 - ts-node: 10.8.2(@types/node@20.14.2)(typescript@5.3.3) - yaml: 1.10.2 - dev: true + lilconfig: 3.1.2 + postcss: 8.4.40 + ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) + yaml: 2.5.0 - /postcss-loader@6.2.1(postcss@8.4.30)(webpack@5.91.0): + /postcss-loader@6.2.1(postcss@8.4.40)(webpack@5.93.0): resolution: {integrity: sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -23070,27 +20565,27 @@ packages: dependencies: cosmiconfig: 7.1.0 klona: 2.0.6 - postcss: 8.4.30 - semver: 7.5.4 - webpack: 5.91.0(webpack-cli@5.1.4) + postcss: 8.4.40 + semver: 7.6.3 + webpack: 5.93.0(webpack-cli@5.1.4) dev: false - /postcss-logical@5.0.4(postcss@8.4.30): + /postcss-logical@5.0.4(postcss@8.4.40): resolution: {integrity: sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.30 + postcss: 8.4.40 dev: false - /postcss-media-minmax@5.0.0(postcss@8.4.30): + /postcss-media-minmax@5.0.0(postcss@8.4.40): resolution: {integrity: sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==} engines: {node: '>=10.0.0'} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.30 + postcss: 8.4.40 dev: false /postcss-merge-longhand@4.0.11: @@ -23103,22 +20598,22 @@ packages: stylehacks: 4.0.3 dev: true - /postcss-merge-longhand@5.1.7(postcss@8.4.31): + /postcss-merge-longhand@5.1.7(postcss@8.4.40): resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.40 postcss-value-parser: 4.2.0 - stylehacks: 5.1.1(postcss@8.4.31) + stylehacks: 5.1.1(postcss@8.4.40) dev: false /postcss-merge-rules@4.0.3: resolution: {integrity: sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.21.10 + browserslist: 4.23.2 caniuse-api: 3.0.0 cssnano-util-same-parent: 4.0.1 postcss: 7.0.39 @@ -23126,17 +20621,17 @@ packages: vendors: 1.0.4 dev: true - /postcss-merge-rules@5.1.4(postcss@8.4.31): + /postcss-merge-rules@5.1.4(postcss@8.4.40): resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.10 + browserslist: 4.23.2 caniuse-api: 3.0.0 - cssnano-utils: 3.1.0(postcss@8.4.31) - postcss: 8.4.31 - postcss-selector-parser: 6.0.11 + cssnano-utils: 3.1.0(postcss@8.4.40) + postcss: 8.4.40 + postcss-selector-parser: 6.1.1 dev: false /postcss-minify-font-values@4.0.2: @@ -23147,13 +20642,13 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-minify-font-values@5.1.0(postcss@8.4.31): + /postcss-minify-font-values@5.1.0(postcss@8.4.40): resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false @@ -23167,15 +20662,15 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-minify-gradients@5.1.1(postcss@8.4.31): + /postcss-minify-gradients@5.1.1(postcss@8.4.40): resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: colord: 2.9.3 - cssnano-utils: 3.1.0(postcss@8.4.31) - postcss: 8.4.31 + cssnano-utils: 3.1.0(postcss@8.4.40) + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false @@ -23184,22 +20679,22 @@ packages: engines: {node: '>=6.9.0'} dependencies: alphanum-sort: 1.0.2 - browserslist: 4.21.10 + browserslist: 4.23.2 cssnano-util-get-arguments: 4.0.0 postcss: 7.0.39 postcss-value-parser: 3.3.1 uniqs: 2.0.0 dev: true - /postcss-minify-params@5.1.4(postcss@8.4.31): + /postcss-minify-params@5.1.4(postcss@8.4.40): resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.10 - cssnano-utils: 3.1.0(postcss@8.4.31) - postcss: 8.4.31 + browserslist: 4.23.2 + cssnano-utils: 3.1.0(postcss@8.4.40) + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false @@ -23208,19 +20703,19 @@ packages: engines: {node: '>=6.9.0'} dependencies: alphanum-sort: 1.0.2 - has: 1.0.3 + has: 1.0.4 postcss: 7.0.39 postcss-selector-parser: 3.1.2 dev: true - /postcss-minify-selectors@5.2.1(postcss@8.4.31): + /postcss-minify-selectors@5.2.1(postcss@8.4.40): resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 - postcss-selector-parser: 6.0.11 + postcss: 8.4.40 + postcss-selector-parser: 6.1.1 dev: false /postcss-modules-extract-imports@1.1.0: @@ -23229,13 +20724,13 @@ packages: postcss: 6.0.1 dev: true - /postcss-modules-extract-imports@3.0.0(postcss@8.4.31): - resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} + /postcss-modules-extract-imports@3.1.0(postcss@8.4.40): + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.31 + postcss: 8.4.40 dev: false /postcss-modules-local-by-default@1.2.0: @@ -23245,15 +20740,15 @@ packages: postcss: 6.0.1 dev: true - /postcss-modules-local-by-default@4.0.0(postcss@8.4.31): - resolution: {integrity: sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==} + /postcss-modules-local-by-default@4.0.5(postcss@8.4.40): + resolution: {integrity: sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.31) - postcss: 8.4.31 - postcss-selector-parser: 6.0.11 + icss-utils: 5.1.0(postcss@8.4.40) + postcss: 8.4.40 + postcss-selector-parser: 6.1.1 postcss-value-parser: 4.2.0 dev: false @@ -23264,14 +20759,14 @@ packages: postcss: 6.0.1 dev: true - /postcss-modules-scope@3.0.0(postcss@8.4.31): - resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} + /postcss-modules-scope@3.2.0(postcss@8.4.40): + resolution: {integrity: sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.31 - postcss-selector-parser: 6.0.11 + postcss: 8.4.40 + postcss-selector-parser: 6.1.1 dev: false /postcss-modules-values@1.3.0: @@ -23281,14 +20776,14 @@ packages: postcss: 6.0.1 dev: true - /postcss-modules-values@4.0.0(postcss@8.4.31): + /postcss-modules-values@4.0.0(postcss@8.4.40): resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.31) - postcss: 8.4.31 + icss-utils: 5.1.0(postcss@8.4.40) + postcss: 8.4.40 dev: false /postcss-modules@2.0.0: @@ -23301,34 +20796,24 @@ packages: string-hash: 1.1.3 dev: true - /postcss-nested@6.0.0(postcss@8.4.30): - resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - dependencies: - postcss: 8.4.30 - postcss-selector-parser: 6.0.11 - - /postcss-nested@6.0.0(postcss@8.4.31): - resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==} + /postcss-nested@6.2.0(postcss@8.4.40): + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 dependencies: - postcss: 8.4.31 - postcss-selector-parser: 6.0.11 - dev: true + postcss: 8.4.40 + postcss-selector-parser: 6.1.1 - /postcss-nesting@10.2.0(postcss@8.4.30): + /postcss-nesting@10.2.0(postcss@8.4.40): resolution: {integrity: sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.0.11) - postcss: 8.4.30 - postcss-selector-parser: 6.0.11 + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.1) + postcss: 8.4.40 + postcss-selector-parser: 6.1.1 dev: false /postcss-normalize-charset@4.0.1: @@ -23338,13 +20823,13 @@ packages: postcss: 7.0.39 dev: true - /postcss-normalize-charset@5.1.0(postcss@8.4.31): + /postcss-normalize-charset@5.1.0(postcss@8.4.40): resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.40 dev: false /postcss-normalize-display-values@4.0.2: @@ -23356,13 +20841,13 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-display-values@5.1.0(postcss@8.4.31): + /postcss-normalize-display-values@5.1.0(postcss@8.4.40): resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false @@ -23371,18 +20856,18 @@ packages: engines: {node: '>=6.9.0'} dependencies: cssnano-util-get-arguments: 4.0.0 - has: 1.0.3 + has: 1.0.4 postcss: 7.0.39 postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-positions@5.1.1(postcss@8.4.31): + /postcss-normalize-positions@5.1.1(postcss@8.4.40): resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false @@ -23396,13 +20881,13 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-repeat-style@5.1.1(postcss@8.4.31): + /postcss-normalize-repeat-style@5.1.1(postcss@8.4.40): resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false @@ -23410,18 +20895,18 @@ packages: resolution: {integrity: sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==} engines: {node: '>=6.9.0'} dependencies: - has: 1.0.3 + has: 1.0.4 postcss: 7.0.39 postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-string@5.1.0(postcss@8.4.31): + /postcss-normalize-string@5.1.0(postcss@8.4.40): resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false @@ -23434,13 +20919,13 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-timing-functions@5.1.0(postcss@8.4.31): + /postcss-normalize-timing-functions@5.1.0(postcss@8.4.40): resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false @@ -23448,19 +20933,19 @@ packages: resolution: {integrity: sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.21.10 + browserslist: 4.23.2 postcss: 7.0.39 postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-unicode@5.1.1(postcss@8.4.31): + /postcss-normalize-unicode@5.1.1(postcss@8.4.40): resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.10 - postcss: 8.4.31 + browserslist: 4.23.2 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false @@ -23474,14 +20959,14 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-url@5.1.0(postcss@8.4.31): + /postcss-normalize-url@5.1.0(postcss@8.4.40): resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: normalize-url: 6.1.0 - postcss: 8.4.31 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false @@ -23493,37 +20978,37 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-whitespace@5.1.1(postcss@8.4.31): + /postcss-normalize-whitespace@5.1.1(postcss@8.4.40): resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize@10.0.1(browserslist@4.21.10)(postcss@8.4.30): + /postcss-normalize@10.0.1(browserslist@4.23.2)(postcss@8.4.40): resolution: {integrity: sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==} engines: {node: '>= 12'} peerDependencies: browserslist: '>= 4' postcss: '>= 8' dependencies: - '@csstools/normalize.css': 12.0.0 - browserslist: 4.21.10 - postcss: 8.4.30 - postcss-browser-comments: 4.0.0(browserslist@4.21.10)(postcss@8.4.30) + '@csstools/normalize.css': 12.1.1 + browserslist: 4.23.2 + postcss: 8.4.40 + postcss-browser-comments: 4.0.0(browserslist@4.23.2)(postcss@8.4.40) sanitize.css: 13.0.0 dev: false - /postcss-opacity-percentage@1.1.3(postcss@8.4.30): + /postcss-opacity-percentage@1.1.3(postcss@8.4.40): resolution: {integrity: sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.30 + postcss: 8.4.40 dev: false /postcss-ordered-values@4.1.2: @@ -23535,132 +21020,132 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-ordered-values@5.1.3(postcss@8.4.31): + /postcss-ordered-values@5.1.3(postcss@8.4.40): resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-utils: 3.1.0(postcss@8.4.31) - postcss: 8.4.31 + cssnano-utils: 3.1.0(postcss@8.4.40) + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false - /postcss-overflow-shorthand@3.0.4(postcss@8.4.30): + /postcss-overflow-shorthand@3.0.4(postcss@8.4.40): resolution: {integrity: sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.30 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false - /postcss-page-break@3.0.4(postcss@8.4.30): + /postcss-page-break@3.0.4(postcss@8.4.40): resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==} peerDependencies: postcss: ^8 dependencies: - postcss: 8.4.30 + postcss: 8.4.40 dev: false - /postcss-place@7.0.5(postcss@8.4.30): + /postcss-place@7.0.5(postcss@8.4.40): resolution: {integrity: sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.30 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false - /postcss-preset-env@7.8.3(postcss@8.4.30): + /postcss-preset-env@7.8.3(postcss@8.4.40): resolution: {integrity: sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/postcss-cascade-layers': 1.1.1(postcss@8.4.30) - '@csstools/postcss-color-function': 1.1.1(postcss@8.4.30) - '@csstools/postcss-font-format-keywords': 1.0.1(postcss@8.4.30) - '@csstools/postcss-hwb-function': 1.0.2(postcss@8.4.30) - '@csstools/postcss-ic-unit': 1.0.1(postcss@8.4.30) - '@csstools/postcss-is-pseudo-class': 2.0.7(postcss@8.4.30) - '@csstools/postcss-nested-calc': 1.0.0(postcss@8.4.30) - '@csstools/postcss-normalize-display-values': 1.0.1(postcss@8.4.30) - '@csstools/postcss-oklab-function': 1.1.1(postcss@8.4.30) - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.30) - '@csstools/postcss-stepped-value-functions': 1.0.1(postcss@8.4.30) - '@csstools/postcss-text-decoration-shorthand': 1.0.0(postcss@8.4.30) - '@csstools/postcss-trigonometric-functions': 1.0.2(postcss@8.4.30) - '@csstools/postcss-unset-value': 1.0.2(postcss@8.4.30) - autoprefixer: 10.4.14(postcss@8.4.30) - browserslist: 4.21.10 - css-blank-pseudo: 3.0.3(postcss@8.4.30) - css-has-pseudo: 3.0.4(postcss@8.4.30) - css-prefers-color-scheme: 6.0.3(postcss@8.4.30) - cssdb: 7.5.4 - postcss: 8.4.30 - postcss-attribute-case-insensitive: 5.0.2(postcss@8.4.30) - postcss-clamp: 4.1.0(postcss@8.4.30) - postcss-color-functional-notation: 4.2.4(postcss@8.4.30) - postcss-color-hex-alpha: 8.0.4(postcss@8.4.30) - postcss-color-rebeccapurple: 7.1.1(postcss@8.4.30) - postcss-custom-media: 8.0.2(postcss@8.4.30) - postcss-custom-properties: 12.1.11(postcss@8.4.30) - postcss-custom-selectors: 6.0.3(postcss@8.4.30) - postcss-dir-pseudo-class: 6.0.5(postcss@8.4.30) - postcss-double-position-gradients: 3.1.2(postcss@8.4.30) - postcss-env-function: 4.0.6(postcss@8.4.30) - postcss-focus-visible: 6.0.4(postcss@8.4.30) - postcss-focus-within: 5.0.4(postcss@8.4.30) - postcss-font-variant: 5.0.0(postcss@8.4.30) - postcss-gap-properties: 3.0.5(postcss@8.4.30) - postcss-image-set-function: 4.0.7(postcss@8.4.30) - postcss-initial: 4.0.1(postcss@8.4.30) - postcss-lab-function: 4.2.1(postcss@8.4.30) - postcss-logical: 5.0.4(postcss@8.4.30) - postcss-media-minmax: 5.0.0(postcss@8.4.30) - postcss-nesting: 10.2.0(postcss@8.4.30) - postcss-opacity-percentage: 1.1.3(postcss@8.4.30) - postcss-overflow-shorthand: 3.0.4(postcss@8.4.30) - postcss-page-break: 3.0.4(postcss@8.4.30) - postcss-place: 7.0.5(postcss@8.4.30) - postcss-pseudo-class-any-link: 7.1.6(postcss@8.4.30) - postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.30) - postcss-selector-not: 6.0.1(postcss@8.4.30) + '@csstools/postcss-cascade-layers': 1.1.1(postcss@8.4.40) + '@csstools/postcss-color-function': 1.1.1(postcss@8.4.40) + '@csstools/postcss-font-format-keywords': 1.0.1(postcss@8.4.40) + '@csstools/postcss-hwb-function': 1.0.2(postcss@8.4.40) + '@csstools/postcss-ic-unit': 1.0.1(postcss@8.4.40) + '@csstools/postcss-is-pseudo-class': 2.0.7(postcss@8.4.40) + '@csstools/postcss-nested-calc': 1.0.0(postcss@8.4.40) + '@csstools/postcss-normalize-display-values': 1.0.1(postcss@8.4.40) + '@csstools/postcss-oklab-function': 1.1.1(postcss@8.4.40) + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.40) + '@csstools/postcss-stepped-value-functions': 1.0.1(postcss@8.4.40) + '@csstools/postcss-text-decoration-shorthand': 1.0.0(postcss@8.4.40) + '@csstools/postcss-trigonometric-functions': 1.0.2(postcss@8.4.40) + '@csstools/postcss-unset-value': 1.0.2(postcss@8.4.40) + autoprefixer: 10.4.19(postcss@8.4.40) + browserslist: 4.23.2 + css-blank-pseudo: 3.0.3(postcss@8.4.40) + css-has-pseudo: 3.0.4(postcss@8.4.40) + css-prefers-color-scheme: 6.0.3(postcss@8.4.40) + cssdb: 7.11.2 + postcss: 8.4.40 + postcss-attribute-case-insensitive: 5.0.2(postcss@8.4.40) + postcss-clamp: 4.1.0(postcss@8.4.40) + postcss-color-functional-notation: 4.2.4(postcss@8.4.40) + postcss-color-hex-alpha: 8.0.4(postcss@8.4.40) + postcss-color-rebeccapurple: 7.1.1(postcss@8.4.40) + postcss-custom-media: 8.0.2(postcss@8.4.40) + postcss-custom-properties: 12.1.11(postcss@8.4.40) + postcss-custom-selectors: 6.0.3(postcss@8.4.40) + postcss-dir-pseudo-class: 6.0.5(postcss@8.4.40) + postcss-double-position-gradients: 3.1.2(postcss@8.4.40) + postcss-env-function: 4.0.6(postcss@8.4.40) + postcss-focus-visible: 6.0.4(postcss@8.4.40) + postcss-focus-within: 5.0.4(postcss@8.4.40) + postcss-font-variant: 5.0.0(postcss@8.4.40) + postcss-gap-properties: 3.0.5(postcss@8.4.40) + postcss-image-set-function: 4.0.7(postcss@8.4.40) + postcss-initial: 4.0.1(postcss@8.4.40) + postcss-lab-function: 4.2.1(postcss@8.4.40) + postcss-logical: 5.0.4(postcss@8.4.40) + postcss-media-minmax: 5.0.0(postcss@8.4.40) + postcss-nesting: 10.2.0(postcss@8.4.40) + postcss-opacity-percentage: 1.1.3(postcss@8.4.40) + postcss-overflow-shorthand: 3.0.4(postcss@8.4.40) + postcss-page-break: 3.0.4(postcss@8.4.40) + postcss-place: 7.0.5(postcss@8.4.40) + postcss-pseudo-class-any-link: 7.1.6(postcss@8.4.40) + postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.40) + postcss-selector-not: 6.0.1(postcss@8.4.40) postcss-value-parser: 4.2.0 dev: false - /postcss-pseudo-class-any-link@7.1.6(postcss@8.4.30): + /postcss-pseudo-class-any-link@7.1.6(postcss@8.4.40): resolution: {integrity: sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.30 - postcss-selector-parser: 6.0.11 + postcss: 8.4.40 + postcss-selector-parser: 6.1.1 dev: false /postcss-reduce-initial@4.0.3: resolution: {integrity: sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.21.10 + browserslist: 4.23.2 caniuse-api: 3.0.0 - has: 1.0.3 + has: 1.0.4 postcss: 7.0.39 dev: true - /postcss-reduce-initial@5.1.2(postcss@8.4.31): + /postcss-reduce-initial@5.1.2(postcss@8.4.40): resolution: {integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.10 + browserslist: 4.23.2 caniuse-api: 3.0.0 - postcss: 8.4.31 + postcss: 8.4.40 dev: false /postcss-reduce-transforms@4.0.2: @@ -23668,37 +21153,37 @@ packages: engines: {node: '>=6.9.0'} dependencies: cssnano-util-get-match: 4.0.0 - has: 1.0.3 + has: 1.0.4 postcss: 7.0.39 postcss-value-parser: 3.3.1 dev: true - /postcss-reduce-transforms@5.1.0(postcss@8.4.31): + /postcss-reduce-transforms@5.1.0(postcss@8.4.40): resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.40 postcss-value-parser: 4.2.0 dev: false - /postcss-replace-overflow-wrap@4.0.0(postcss@8.4.30): + /postcss-replace-overflow-wrap@4.0.0(postcss@8.4.40): resolution: {integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==} peerDependencies: postcss: ^8.0.3 dependencies: - postcss: 8.4.30 + postcss: 8.4.40 dev: false - /postcss-selector-not@6.0.1(postcss@8.4.30): + /postcss-selector-not@6.0.1(postcss@8.4.40): resolution: {integrity: sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.30 - postcss-selector-parser: 6.0.11 + postcss: 8.4.40 + postcss-selector-parser: 6.1.1 dev: false /postcss-selector-parser@3.1.2: @@ -23718,8 +21203,8 @@ packages: util-deprecate: 1.0.2 dev: true - /postcss-selector-parser@6.0.11: - resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==} + /postcss-selector-parser@6.1.1: + resolution: {integrity: sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==} engines: {node: '>=4'} dependencies: cssesc: 3.0.0 @@ -23734,13 +21219,13 @@ packages: svgo: 1.3.2 dev: true - /postcss-svgo@5.1.0(postcss@8.4.31): + /postcss-svgo@5.1.0(postcss@8.4.40): resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.40 postcss-value-parser: 4.2.0 svgo: 2.8.0 dev: false @@ -23754,14 +21239,14 @@ packages: uniqs: 2.0.0 dev: true - /postcss-unique-selectors@5.1.1(postcss@8.4.31): + /postcss-unique-selectors@5.1.1(postcss@8.4.40): resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 - postcss-selector-parser: 6.0.11 + postcss: 8.4.40 + postcss-selector-parser: 6.1.1 dev: false /postcss-value-parser@3.3.1: @@ -23787,40 +21272,62 @@ packages: picocolors: 0.2.1 source-map: 0.6.1 - /postcss@8.4.30: - resolution: {integrity: sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==} + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} dependencies: - nanoid: 3.3.6 - picocolors: 1.0.0 - source-map-js: 1.0.2 + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + dev: false - /postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + /postcss@8.4.40: + resolution: {integrity: sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==} engines: {node: ^10 || ^12 || >=14} dependencies: - nanoid: 3.3.6 - picocolors: 1.0.0 - source-map-js: 1.0.2 + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 /postgres-array@2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} + /postgres-array@3.0.2: + resolution: {integrity: sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==} + engines: {node: '>=12'} + /postgres-bytea@1.0.0: resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} engines: {node: '>=0.10.0'} + /postgres-bytea@3.0.0: + resolution: {integrity: sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==} + engines: {node: '>= 6'} + dependencies: + obuf: 1.1.2 + /postgres-date@1.0.7: resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} engines: {node: '>=0.10.0'} + /postgres-date@2.1.0: + resolution: {integrity: sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==} + engines: {node: '>=12'} + /postgres-interval@1.2.0: resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} engines: {node: '>=0.10.0'} dependencies: xtend: 4.0.2 + /postgres-interval@3.0.0: + resolution: {integrity: sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==} + engines: {node: '>=12'} + + /postgres-range@1.1.4: + resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==} + /posthog-node@2.6.0: resolution: {integrity: sha512-/BiFw/jwdP0uJSRAIoYqLoBTjZ612xv74b1L/a3T/p1nJVL8e0OrHuxbJW56c6WVW/IKm9gBF/zhbqfaz0XgJQ==} engines: {node: '>=15.0.0'} @@ -23830,17 +21337,17 @@ packages: - debug dev: false - /preact-render-to-string@5.2.6(preact@10.13.2): + /preact-render-to-string@5.2.6(preact@10.23.1): resolution: {integrity: sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==} peerDependencies: preact: '>=10' dependencies: - preact: 10.13.2 + preact: 10.23.1 pretty-format: 3.8.0 dev: false - /preact@10.13.2: - resolution: {integrity: sha512-q44QFLhOhty2Bd0Y46fnYW0gD/cbVM9dUVtNTDKPcdXSMA7jfY+Jpd6rk3GB0lcQss0z5s/6CmVP0Z/hV+g6pw==} + /preact@10.23.1: + resolution: {integrity: sha512-O5UdRsNh4vdZaTieWe3XOgSpdMAmkIYBCT3VhQDlKrzyCm8lUYsk0fmVEvoQQifoOjFRTaHZO69ylrzTW2BH+A==} dev: false /prebuild-install@5.3.6: @@ -23865,18 +21372,18 @@ packages: which-pm-runs: 1.1.0 dev: false - /prebuild-install@7.1.1: - resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + /prebuild-install@7.1.2: + resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} engines: {node: '>=10'} hasBin: true dependencies: - detect-libc: 2.0.1 + detect-libc: 2.0.3 expand-template: 2.0.3 github-from-package: 0.0.0 minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 1.0.2 - node-abi: 3.47.0 + node-abi: 3.65.0 pump: 3.0.0 rc: 1.2.8 simple-get: 4.0.1 @@ -23884,27 +21391,26 @@ packages: tunnel-agent: 0.6.0 dev: false - /preferred-pm@3.0.3: - resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==} + /preferred-pm@3.1.4: + resolution: {integrity: sha512-lEHd+yEm22jXdCphDrkvIJQU66EuLojPPtvZkpKIkiD+l0DMThF/niqZKJSoU8Vl7iuvtmzyMhir9LdVy5WMnA==} engines: {node: '>=10'} dependencies: find-up: 5.0.0 find-yarn-workspace-root2: 1.2.16 path-exists: 4.0.0 - which-pm: 2.0.0 + which-pm: 2.2.0 /prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} - requiresBuild: true dev: false /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - /prettier@2.8.7: - resolution: {integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==} + /prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} hasBin: true @@ -23941,16 +21447,7 @@ packages: '@jest/schemas': 28.1.3 ansi-regex: 5.0.1 ansi-styles: 5.2.0 - react-is: 18.2.0 - - /pretty-format@29.5.0: - resolution: {integrity: sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.4.3 - ansi-styles: 5.2.0 - react-is: 18.2.0 - dev: true + react-is: 18.3.1 /pretty-format@29.7.0: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} @@ -23958,7 +21455,7 @@ packages: dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 - react-is: 18.2.0 + react-is: 18.3.1 /pretty-format@3.8.0: resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} @@ -23971,13 +21468,13 @@ packages: parse-ms: 2.1.0 dev: true - /prisma@5.7.1: - resolution: {integrity: sha512-ekho7ziH0WEJvC4AxuJz+ewRTMskrebPcrKuBwcNzVDniYxx+dXOGcorNeIb9VEMO5vrKzwNYvhD271Ui2jnNw==} + /prisma@5.17.0: + resolution: {integrity: sha512-m4UWkN5lBE6yevqeOxEvmepnL5cNPEjzMw2IqDB59AcEV6w7D8vGljDLd1gPFH+W6gUxw9x7/RmN5dCS/WTPxA==} engines: {node: '>=16.13'} hasBin: true requiresBuild: true dependencies: - '@prisma/engines': 5.7.1 + '@prisma/engines': 5.17.0 /prismjs@1.29.0: resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} @@ -23987,9 +21484,17 @@ packages: /proc-log@1.0.0: resolution: {integrity: sha512-aCk8AO51s+4JyuYGg3Q/a6gnrlDO09NpVWePtjp7xwphcoQ04x5WAfCyugcsbLooWcMJ87CLkD4+604IckEdhg==} + /proc-log@3.0.0: + resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + /progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} @@ -24058,9 +21563,17 @@ packages: object-assign: 4.1.1 react-is: 16.13.1 - /properties-reader@2.2.0: - resolution: {integrity: sha512-CgVcr8MwGoBKK24r9TwHfZkLLaNFHQ6y4wgT9w/XzdpacOOi5ciH4hcuLechSDAwXsfrGQtI2JTutY2djOx2Ow==} - engines: {node: '>=10'} + /proper-lockfile@4.1.2: + resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + dependencies: + graceful-fs: 4.2.11 + retry: 0.12.0 + signal-exit: 3.0.7 + dev: true + + /properties-reader@2.3.0: + resolution: {integrity: sha512-z597WicA7nDZxK12kZqHr2TcvwNU1GCfA5UwfDY/HDp3hXPoPlb5rlEx9bwGTiJnc0OqbBTkU975jDToth8Gxw==} + engines: {node: '>=14'} dependencies: mkdirp: 1.0.4 dev: true @@ -24072,9 +21585,11 @@ packages: /proto3-json-serializer@1.1.1: resolution: {integrity: sha512-AwAuY4g9nxx0u52DnSMkqqgyLHaW/XaPLtaAo3y/ZCfeaQB/g4YDH4kb8Wc/mWzWvu0YjOznVnfn373MVZZrgw==} engines: {node: '>=12.0.0'} + requiresBuild: true dependencies: - protobufjs: 7.2.5 + protobufjs: 7.3.2 dev: false + optional: true /proto3-json-serializer@2.0.2: resolution: {integrity: sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==} @@ -24083,7 +21598,7 @@ packages: protobufjs: 7.3.2 dev: false - /protobufjs-cli@1.1.1(protobufjs@7.2.3): + /protobufjs-cli@1.1.1(protobufjs@7.2.4): resolution: {integrity: sha512-VPWMgIcRNyQwWUv8OLPyGQ/0lQY/QTQAVN5fh+XzfDwsVw1FZ2L3DM/bcBf8WPiRz2tNpaov9lPZfNcmNo6LXA==} engines: {node: '>=12.0.0'} hasBin: true @@ -24096,32 +21611,12 @@ packages: espree: 9.6.1 estraverse: 5.3.0 glob: 8.1.0 - jsdoc: 4.0.2 + jsdoc: 4.0.3 minimist: 1.2.8 - protobufjs: 7.2.3 - semver: 7.5.4 - tmp: 0.2.1 - uglify-js: 3.17.4 - dev: false - optional: true - - /protobufjs@7.2.3: - resolution: {integrity: sha512-TtpvOqwB5Gdz/PQmOjgsrGH1nHjAQVCN7JG4A6r1sXRWESL5rNMAiRcBQlCAdKxZcAbstExQePYG8xof/JVRgg==} - engines: {node: '>=12.0.0'} - requiresBuild: true - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 - '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 - '@protobufjs/path': 1.1.2 - '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 - '@types/node': 20.14.2 - long: 5.2.1 + protobufjs: 7.2.4 + semver: 7.6.3 + tmp: 0.2.3 + uglify-js: 3.19.1 dev: false optional: true @@ -24140,27 +21635,10 @@ packages: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 20.14.2 - long: 5.2.1 + '@types/node': 18.19.42 + long: 5.2.3 dev: false - - /protobufjs@7.2.5: - resolution: {integrity: sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==} - engines: {node: '>=12.0.0'} - requiresBuild: true - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 - '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 - '@protobufjs/path': 1.1.2 - '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 - '@types/node': 20.14.2 - long: 5.2.1 + optional: true /protobufjs@7.3.2: resolution: {integrity: sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==} @@ -24177,9 +21655,8 @@ packages: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 20.14.2 - long: 5.2.1 - dev: false + '@types/node': 18.19.42 + long: 5.2.3 /proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} @@ -24198,10 +21675,6 @@ packages: dev: true optional: true - /pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - dev: false - /psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} dev: false @@ -24216,39 +21689,49 @@ packages: end-of-stream: 1.4.4 once: 1.4.0 - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + /punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + requiresBuild: true + dev: false + optional: true + + /punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + requiresBuild: true + dev: false + optional: true + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} /pure-color@1.3.0: resolution: {integrity: sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==} dev: false - /pure-rand@6.0.1: - resolution: {integrity: sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==} + /pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} /q@1.5.1: resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + deprecated: |- + You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. - /qrcode.react@3.1.0(react@18.2.0): - resolution: {integrity: sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - react: 18.2.0 + (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) /qs@6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} dependencies: - side-channel: 1.0.4 + side-channel: 1.0.6 - /qs@6.11.1: - resolution: {integrity: sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==} + /qs@6.12.3: + resolution: {integrity: sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ==} engines: {node: '>=0.6'} dependencies: - side-channel: 1.0.4 + side-channel: 1.0.6 /querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} @@ -24257,10 +21740,6 @@ packages: /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - /quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - /raf@3.4.1: resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} dependencies: @@ -24286,8 +21765,8 @@ packages: unpipe: 1.0.0 dev: true - /raw-body@2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + /raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} dependencies: bytes: 3.1.2 @@ -24295,267 +21774,270 @@ packages: iconv-lite: 0.4.24 unpipe: 1.0.0 - /raw-loader@4.0.2(webpack@5.91.0): + /raw-loader@4.0.2(webpack@5.93.0): resolution: {integrity: sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==} engines: {node: '>= 10.13.0'} peerDependencies: webpack: ^4.0.0 || ^5.0.0 dependencies: loader-utils: 2.0.4 - schema-utils: 3.1.1 - webpack: 5.91.0(webpack-cli@5.1.4) + schema-utils: 3.3.0 + webpack: 5.93.0(webpack-cli@5.1.4) dev: true - /rc-align@4.0.15(react-dom@18.2.0)(react@18.2.0): + /rc-align@4.0.15(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - classnames: 2.3.2 + '@babel/runtime': 7.25.0 + classnames: 2.5.1 dom-align: 1.12.4 - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) resize-observer-polyfill: 1.5.1 + dev: false - /rc-cascader@3.10.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-tImBYEAqLlIZ+jnRmfQQEm5gOXa09N9aGV9AKxriXlCvsNEfdZMIRyY0p74sEZIUn0ycXHo8VcOlqsgLcgFknQ==} + /rc-cascader@3.27.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-z5uq8VvQadFUBiuZJ7YF5UAUGNkZtdEtcEYiIA94N/Kc2MIKr6lEbN5HyVddvYSgwWlKqnL6pH5bFXFuIK3MNg==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 array-tree-filter: 2.1.0 - classnames: 2.3.2 - rc-select: 14.4.3(react-dom@18.2.0)(react@18.2.0) - rc-tree: 5.7.3(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + classnames: 2.5.1 + rc-select: 14.15.1(react-dom@18.3.1)(react@18.3.1) + rc-tree: 5.8.8(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /rc-checkbox@3.0.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-tOEs1+wWDUei7DuP2EsJCZfam5vxMjKTCGcZdXVgsiOcNszc41Esycbo31P0/jFwUAPmd5oPYFWkcnFUCTLZxA==} + /rc-checkbox@3.3.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Ih3ZaAcoAiFKJjifzwsGiT/f/quIkxJoklW4yKGho14Olulwn8gN7hOBve0/WGDg5o/l/5mL0w7ff7/YGvefVw==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - classnames: 2.3.2 - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /rc-collapse@3.5.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-/TNiT3DW1t3sUCiVD/DPUYooJZ3BLA93/2rZsB3eM2bGJCCla2X9D2E4tgm7LGMQGy5Atb2lMUn2FQuvQNvavQ==} + /rc-collapse@3.7.3(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-60FJcdTRn0X5sELF18TANwtVi7FtModq649H11mYF1jh83DniMoM4MqY627sEKRCTm4+WXfGDcB7hY5oW6xhyw==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - classnames: 2.3.2 - rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + classnames: 2.5.1 + rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /rc-dialog@9.1.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-5ry+JABAWEbaKyYsmITtrJbZbJys8CtMyzV8Xn4LYuXMeUx5XVHNyJRoqLFE4AzBuXXzOWeaC49cg+XkxK6kHA==} + /rc-dialog@9.5.2(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-qVUjc8JukG+j/pNaHVSRa2GO2/KbV2thm7yO4hepQ902eGdYK913sGkwg/fh9yhKYV1ql3BKIN2xnud3rEXAPw==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - '@rc-component/portal': 1.1.1(react-dom@18.2.0)(react@18.2.0) - classnames: 2.3.2 - rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /rc-drawer@6.1.5(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-MDRomQXFi+tvDuwsRAddJ2Oy2ayLCZ29weMzp3rJFO9UNEVLEVV7nuyx5lEgNJIdM//tE6wWQV95cTUiMVqD6w==} + /rc-drawer@7.2.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-9lOQ7kBekEJRdEpScHvtmEtXnAsy+NGDXiRWc2ZVC7QXAazNVbeT4EraQKYwCME8BJLa8Bxqxvs5swwyOepRwg==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - '@rc-component/portal': 1.1.1(react-dom@18.2.0)(react@18.2.0) - classnames: 2.3.2 - rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /rc-dropdown@4.0.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g==} + /rc-dropdown@4.2.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-odM8Ove+gSh0zU27DUj5cG1gNKg7mLWBYzB5E4nNLrLwBmYEgYP43vHKDGOVZcJSVElQBI0+jTQgjnq0NfLjng==} peerDependencies: react: '>=16.11.0' react-dom: '>=16.11.0' dependencies: - '@babel/runtime': 7.21.0 - classnames: 2.3.2 - rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /rc-field-form@1.29.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-gXNkthHMUjJ7gDKYmD/lJWJrpMqAjiEPQE4QmlOuZoiHF51LybCL/y+iAmLXpdEjPfJ41WtZBH5hZMUEnEnHXA==} + /rc-field-form@2.2.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-uoNqDoR7A4tn4QTSqoWPAzrR7ZwOK5I+vuZ/qdcHtbKx+ZjEsTg7QXm2wk/jalDiSksAQmATxL0T5LJkRREdIA==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - async-validator: 4.2.5 - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + '@rc-component/async-validator': 5.0.4 + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /rc-image@5.16.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-11DOye57IgTXh2yTsmxFNynZJG3tdx8RZnnaqb38eYWrBPPyhVHIuURxyiSZ8B68lEUAggR7SBA0Zb95KP/CyQ==} + /rc-image@7.9.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-l4zqO5E0quuLMCtdKfBgj4Suv8tIS011F5k1zBBlK25iMjjiNHxA0VeTzGFtUZERSA45gvpXDg8/P6qNLjR25g==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - '@rc-component/portal': 1.1.1(react-dom@18.2.0)(react@18.2.0) - classnames: 2.3.2 - rc-dialog: 9.1.0(react-dom@18.2.0)(react@18.2.0) - rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + rc-dialog: 9.5.2(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /rc-input-number@7.4.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-yGturTw7WGP+M1GbJ+UTAO7L4buxeW6oilhL9Sq3DezsRS8/9qec4UiXUbeoiX9bzvRXH11JvgskBtxSp4YSNg==} + /rc-input-number@9.1.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-NqJ6i25Xn/AgYfVxynlevIhX3FuKlMwIFpucGG1h98SlK32wQwDK0zhN9VY32McOmuaqzftduNYWWooWz8pXQA==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - '@rc-component/mini-decimal': 1.0.1 - classnames: 2.3.2 - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + '@rc-component/mini-decimal': 1.1.0 + classnames: 2.5.1 + rc-input: 1.5.1(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /rc-input@1.0.4(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-clY4oneVHRtKHYf/HCxT/MO+4BGzCIywSNLosXWOm7fcQAS0jQW7n0an8Raa8JMB8kpxc8m28p7SNwFZmlMj6g==} + /rc-input@1.5.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-+nOzQJDeIfIpNP/SgY45LXSKbuMlp4Yap2y8c+ZpU7XbLmNzUd6+d5/S75sA/52jsVE6S/AkhkkDEAOjIu7i6g==} peerDependencies: react: '>=16.0.0' react-dom: '>=16.0.0' dependencies: - '@babel/runtime': 7.21.0 - classnames: 2.3.2 - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /rc-mentions@2.2.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-R7ncCldr02uKgJBBPlXdtnOGQIjZ9C3uoIMi4fabU3CPFdmefYlNF6QM4u2AzgcGt8V0KkoHTN5T6HPdUpet8g==} + /rc-mentions@2.14.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-qKR59FMuF8PK4ZqsbWX3UuA5P1M/snzyqV6Yt3y1DCFbCEdqUGIBgQp6vEfLCO6Z0RoRFlzXtCeSlBTcDDpg1A==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - '@rc-component/trigger': 1.8.0(react-dom@18.2.0)(react@18.2.0) - classnames: 2.3.2 - rc-input: 1.0.4(react-dom@18.2.0)(react@18.2.0) - rc-menu: 9.8.4(react-dom@18.2.0)(react@18.2.0) - rc-textarea: 1.2.2(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + rc-input: 1.5.1(react-dom@18.3.1)(react@18.3.1) + rc-menu: 9.14.1(react-dom@18.3.1)(react@18.3.1) + rc-textarea: 1.7.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /rc-menu@9.8.4(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-lmw2j8I2fhdIzHmC9ajfImfckt0WDb2KVJJBBRIsxPEw2kGkEfjLMUoB1NgiNT/Q5cC8PdjGOGQjHJIJMwyNMw==} + /rc-menu@9.14.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-5wlRb3M8S4yGlWhSoEYJ7ZVRElyScdcpUHxgiLxkeig1tEdyKrnED3B2fhpN0Rrpdp9jyhnmZR/Lwq2fH5VvDQ==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - classnames: 2.3.2 - rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) - rc-overflow: 1.3.0(react-dom@18.2.0)(react@18.2.0) - rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) + rc-overflow: 1.3.2(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /rc-motion@2.6.3(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-xFLkes3/7VL/J+ah9jJruEW/Akbx5F6jVa2wG5o/ApGKQKSOd5FR3rseHLL9+xtJg4PmCwo6/1tqhDO/T+jFHA==} + /rc-motion@2.9.2(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-fUAhHKLDdkAXIDLH0GYwof3raS58dtNUmzLF2MeiR8o6n4thNpSDQhOqQzWE4WfFZDCi9VEN8n7tiB7czREcyw==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - classnames: 2.3.2 - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /rc-notification@5.0.3(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-+wHbHu6RiTNtsZYx42WxWA+tC5m0qyKvJAauO4/6LIEyJspK8fRlFQz+OCFgFwGuNs3cOdo9tLs+cPfztSZwbQ==} + /rc-notification@5.6.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-TGQW5T7waOxLwgJG7fXcw8l7AQiFOjaZ7ISF5PrU526nunHRNcTMuzKihQHaF4E/h/KfOCDk3Mv8eqzbu2e28w==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - classnames: 2.3.2 - rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + classnames: 2.5.1 + rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /rc-overflow@1.3.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-p2Qt4SWPTHAYl4oAao1THy669Fm5q8pYBDBHRaFOekCvcdcrgIx0ByXQMEkyPm8wUDX4BK6aARWecvCRc/7CTA==} + /rc-overflow@1.3.2(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - classnames: 2.3.2 - rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + classnames: 2.5.1 + rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /rc-pagination@3.3.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-eI4dSeB3OrFxll7KzWa3ZH63LV2tHxt0AUmZmDwuI6vc3CK5lZhaKUYq0fRowb5586hN+L26j5WZoSz9cwEfjg==} + /rc-pagination@4.2.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-V6qeANJsT6tmOcZ4XiUmj8JXjRLbkusuufpuoBw2GiAn94fIixYjFLmbruD1Sbhn8fPLDnWawPp4CN37zQorvw==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - classnames: 2.3.2 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /rc-picker@2.7.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-KbUKgbzgWVN5L+V9xhZDKSmseHIyFneBlmuMtMrZ9fU7Oypw6D+owS5kuUicIEV08Y17oXt8dUqauMeC5IFBPg==} + /rc-picker@2.7.6(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-H9if/BUJUZBOhPfWcPeT15JUI3/ntrG9muzERrXDkSoWmDj4yzmBvumozpxYrHwjcKnjyDGAke68d+whWwvhHA==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - classnames: 2.3.2 - date-fns: 2.29.3 - dayjs: 1.11.10 - moment: 2.29.4 - rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + classnames: 2.5.1 + date-fns: 2.30.0 + dayjs: 1.11.12 + moment: 2.30.1 + rc-trigger: 5.3.4(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) shallowequal: 1.1.0 dev: false - /rc-picker@3.6.2(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-acLNCi2WTNAuvTtcEzKp72mU15ni0sqrIKVlEcj04KgLZxhlVPMabCS+Sc8VuOCPJbOcW0XeOydbNnJbWTvzxg==} + /rc-picker@4.6.10(dayjs@1.11.12)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-wNtbwAalqqSmBco+VSxU0ggR9YgvdzdMUTm9bFYn+l3hXmAFyFikBN8xN/iSn3Bwdf6chhh+ANOZKEEIBiq/Fw==} engines: {node: '>=8.x'} peerDependencies: date-fns: '>= 2.x' @@ -24574,258 +22056,262 @@ packages: moment: optional: true dependencies: - '@babel/runtime': 7.21.0 - '@rc-component/trigger': 1.8.0(react-dom@18.2.0)(react@18.2.0) - classnames: 2.3.2 - dayjs: 1.11.10 - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + dayjs: 1.11.12 + rc-overflow: 1.3.2(react-dom@18.3.1)(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /rc-progress@3.4.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-eAFDHXlk8aWpoXl0llrenPMt9qKHQXphxcVsnKs0FHC6eCSk1ebJtyaVjJUzKe0233ogiLDeEFK1Uihz3s67hw==} + /rc-progress@4.0.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - classnames: 2.3.2 - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /rc-rate@2.10.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-TCjEpKPeN1m0EnGDDbb1KyxjNTJRzoReiPdtbrBJEey4Ryf/UGOQ6vqmz2yC6DJdYVDVUoZPdoz043ryh0t/nQ==} + /rc-rate@2.13.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-oxvx1Q5k5wD30sjN5tqAyWTvJfLNNJn7Oq3IeS4HxWfAiC4BOXMITNAsw7u/fzdtO4MS8Ki8uRLOzcnEuoQiAw==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - classnames: 2.3.2 - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /rc-resize-observer@1.3.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-iFUdt3NNhflbY3mwySv5CA1TC06zdJ+pfo0oc27xpf4PIOvfZwZGtD9Kz41wGYqC4SLio93RVAirSSpYlV/uYg==} + /rc-resize-observer@1.4.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - classnames: 2.3.2 - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) resize-observer-polyfill: 1.5.1 - /rc-segmented@2.1.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-qGo1bCr83ESXpXVOCXjFe1QJlCAQXyi9KCiy8eX3rIMYlTeJr/ftySIaTnYsitL18SvWf5ZEHsfqIWoX0EMfFQ==} + /rc-segmented@2.3.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-I3FtM5Smua/ESXutFfb8gJ8ZPcvFR+qUgeeGFQHBOvRiRKyAk4aBE5nfqrxXx+h8/vn60DQjOt6i4RNtrbOobg==} peerDependencies: react: '>=16.0.0' react-dom: '>=16.0.0' dependencies: - '@babel/runtime': 7.21.0 - classnames: 2.3.2 - rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + classnames: 2.5.1 + rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /rc-select@14.4.3(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-qoz4gNqm3SN+4dYKSCRiRkxKSEEdbS3jC6gdFYoYwEjDZ9sdQFo5jHlfQbF+hhai01HOoj1Hf8Gq6tpUvU+Gmw==} + /rc-select@14.15.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-mGvuwW1RMm1NCSI8ZUoRoLRK51R2Nb+QJnmiAvbDRcjh2//ulCkxeV6ZRFTECPpE1t2DPfyqZMPw90SVJzQ7wQ==} engines: {node: '>=8.x'} peerDependencies: react: '*' react-dom: '*' dependencies: - '@babel/runtime': 7.21.0 - '@rc-component/trigger': 1.8.0(react-dom@18.2.0)(react@18.2.0) - classnames: 2.3.2 - rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) - rc-overflow: 1.3.0(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - rc-virtual-list: 3.4.13(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - /rc-slider@10.1.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-gn8oXazZISEhnmRinI89Z/JD/joAaM35jp+gDtIVSTD/JJMCCBqThqLk1SVJmvtfeiEF/kKaFY0+qt4SDHFUDw==} + '@babel/runtime': 7.25.0 + '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) + rc-overflow: 1.3.2(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-virtual-list: 3.14.5(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + /rc-slider@10.6.2(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-FjkoFjyvUQWcBo1F3RgSglky3ar0+qHLM41PlFVYB4Bj3RD8E/Mv7kqMouLFBU+3aFglMzzctAIWRwajEuueSw==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - classnames: 2.3.2 - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /rc-steps@6.0.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-+KfMZIty40mYCQSDvYbZ1jwnuObLauTiIskT1hL4FFOBHP6ZOr8LK0m143yD3kEN5XKHSEX1DIwCj3AYZpoeNQ==} + /rc-steps@6.0.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - classnames: 2.3.2 - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /rc-switch@4.0.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-IfrYC99vN0gKaTyjQdqYuADU0eH00SAFHg3jOp8HrmUpJruhV1SohJzrCbPqPraZeX/6X/QKkdLfkdnUub05WA==} + /rc-switch@4.1.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - classnames: 2.3.2 - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /rc-table@7.31.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-KZPi35aGpv2VaL1Jbc58FBJo063HtKyVjhOFWX4AkBV7tjHHQokMdUoua5E+GPJh6QZUpK/a8PjKa9IZzPLIEA==} + /rc-table@7.45.7(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-wi9LetBL1t1csxyGkMB2p3mCiMt+NDexMlPbXHvQFmBBAsMxrgNSAPwUci2zDLUq9m8QdWc1Nh8suvrpy9mXrg==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - '@rc-component/context': 1.3.0(react-dom@18.2.0)(react@18.2.0) - classnames: 2.3.2 - rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - /rc-tabs@12.5.10(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Ay0l0jtd4eXepFH9vWBvinBjqOpqzcsJTerBGwJy435P2S90Uu38q8U/mvc1sxUEVOXX5ZCFbxcWPnfG3dH+tQ==} + '@babel/runtime': 7.25.0 + '@rc-component/context': 1.4.0(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-virtual-list: 3.14.5(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + /rc-tabs@15.1.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Tc7bJvpEdkWIVCUL7yQrMNBJY3j44NcyWS48jF/UKMXuUlzaXK+Z/pEL5LjGcTadtPvVmNqA40yv7hmr+tCOAw==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - classnames: 2.3.2 - rc-dropdown: 4.0.1(react-dom@18.2.0)(react@18.2.0) - rc-menu: 9.8.4(react-dom@18.2.0)(react@18.2.0) - rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) - rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + classnames: 2.5.1 + rc-dropdown: 4.2.0(react-dom@18.3.1)(react@18.3.1) + rc-menu: 9.14.1(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /rc-textarea@1.2.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-S9fkiek5VezfwJe2McEs/NH63xgnnZ4iDh6a8n01mIfzyNJj0HkS0Uz6boyR3/eONYjmKaqhrpuJJuEClRDEBw==} + /rc-textarea@1.7.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-UxizYJkWkmxP3zofXgc487QiGyDmhhheDLLjIWbFtDmiru1ls30KpO8odDaPyqNUIy9ugj5djxTEuezIn6t3Jg==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - classnames: 2.3.2 - rc-input: 1.0.4(react-dom@18.2.0)(react@18.2.0) - rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + classnames: 2.5.1 + rc-input: 1.5.1(react-dom@18.3.1)(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /rc-tooltip@6.0.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-MdvPlsD1fDSxKp9+HjXrc/CxLmA/s11QYIh1R7aExxfodKP7CZA++DG1AjrW80F8IUdHYcR43HAm0Y2BYPelHA==} + /rc-tooltip@6.2.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-iS/3iOAvtDh9GIx1ulY7EFUXUtktFccNLsARo3NPgLf0QW9oT0w3dA9cYWlhqAKmD+uriEwdWz1kH0Qs4zk2Aw==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - '@rc-component/trigger': 1.8.0(react-dom@18.2.0)(react@18.2.0) - classnames: 2.3.2 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /rc-tree-select@5.8.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-NozrkVLR8k3cpx8R5/YFmJMptgOacR5zEQHZGMQg31bD6jEgGiJeOn2cGRI6x0Xdyvi1CSqCbUsIoqiej74wzw==} + /rc-tree-select@5.22.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-b8mAK52xEpRgS+b2PTapCt29GoIrO5cO8jB7AfHttFsIJfcnynY9FCtnYzURsKXJkGHbFY6UzSEB2I3TETtdWg==} peerDependencies: react: '*' react-dom: '*' dependencies: - '@babel/runtime': 7.21.0 - classnames: 2.3.2 - rc-select: 14.4.3(react-dom@18.2.0)(react@18.2.0) - rc-tree: 5.7.3(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + classnames: 2.5.1 + rc-select: 14.15.1(react-dom@18.3.1)(react@18.3.1) + rc-tree: 5.8.8(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /rc-tree@5.7.3(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Oql2S9+ZmT+mfTp5SNo1XM0QvkENjc0mPRFsHWRFSPuKird0OYMZZKmLznUJ+0aGDeFFWN42wiUZJtMFhrLgLw==} + /rc-tree@5.8.8(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-S+mCMWo91m5AJqjz3PdzKilGgbFm7fFJRFiTDOcoRbD7UfMOPnerXwMworiga0O2XIo383UoWuEfeHs1WOltag==} engines: {node: '>=10.x'} peerDependencies: react: '*' react-dom: '*' dependencies: - '@babel/runtime': 7.21.0 - classnames: 2.3.2 - rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - rc-virtual-list: 3.4.13(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + classnames: 2.5.1 + rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-virtual-list: 3.14.5(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /rc-trigger@5.3.4(react-dom@18.2.0)(react@18.2.0): + /rc-trigger@5.3.4(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-mQv+vas0TwKcjAO2izNPkqR4j86OemLRmvL2nOzdP9OWNWA1ivoTt5hzFqYNW9zACwmTezRiN8bttrC7cZzYSw==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - classnames: 2.3.2 - rc-align: 4.0.15(react-dom@18.2.0)(react@18.2.0) - rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + classnames: 2.5.1 + rc-align: 4.0.15(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false - /rc-upload@4.3.4(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-uVbtHFGNjHG/RyAfm9fluXB6pvArAGyAx8z7XzXXyorEgVIWj6mOlriuDm0XowDHYz4ycNK0nE0oP3cbFnzxiQ==} + /rc-upload@4.6.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Zr0DT1NHw/ApxrP7UAoxOtGaVYuzarrrCVr0ld7RiEFsKX07uFhE1EpCBxwL11ruFn89GMcshOKWp+s6FLyAlA==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - classnames: 2.3.2 - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /rc-util@5.29.3(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-wX6ZwQTzY2v7phJBquN4mSEIFR0E0qumlENx0zjENtDvoVSq2s7cR95UidKRO1hOHfDsecsfM9D1gO4Kebs7fA==} + /rc-util@5.43.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-AzC7KKOXFqAdIBqdGWepL9Xn7cm3vnAmjlHqUnoQaTMZYhM4VlXGLkkHHxj/BZ7Td0+SOPKB4RGPboBVKT9htw==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-is: 16.13.1 + '@babel/runtime': 7.25.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 18.3.1 - /rc-virtual-list@3.4.13(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-cPOVDmcNM7rH6ANotanMDilW/55XnFPw0Jh/GQYtrzZSy3AmWvCnqVNyNC/pgg3lfVmX2994dlzAhuUrd4jG7w==} + /rc-virtual-list@3.14.5(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-ZMOnkCLv2wUN8Jz7yI4XiSLa9THlYvf00LuMhb1JlsQCewuU7ydPuHw1rGVPhe9VZYl/5UqODtNd7QKJ2DMGfg==} engines: {node: '>=8.x'} peerDependencies: - react: '*' - react-dom: '*' + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.21.0 - classnames: 2.3.2 - rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.25.0 + classnames: 2.5.1 + rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} @@ -24841,12 +22327,12 @@ packages: resolution: {integrity: sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==} engines: {node: '>=14'} dependencies: - core-js: 3.30.0 + core-js: 3.37.1 object-assign: 4.1.1 promise: 8.3.0 raf: 3.4.1 regenerator-runtime: 0.13.11 - whatwg-fetch: 3.6.2 + whatwg-fetch: 3.6.20 dev: false /react-base16-styling@0.6.0: @@ -24858,7 +22344,7 @@ packages: pure-color: 1.3.0 dev: false - /react-dev-utils@12.0.1(eslint@8.55.0)(typescript@5.3.3)(webpack@5.91.0): + /react-dev-utils@12.0.1(eslint@8.57.0)(typescript@5.5.4)(webpack@5.93.0): resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} engines: {node: '>=14'} peerDependencies: @@ -24868,22 +22354,22 @@ packages: typescript: optional: true dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.7 address: 1.2.2 - browserslist: 4.21.10 + browserslist: 4.23.2 chalk: 4.1.2 cross-spawn: 7.0.3 detect-port-alt: 1.1.6 escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.55.0)(typescript@5.3.3)(webpack@5.91.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.0)(typescript@5.5.4)(webpack@5.93.0) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 immer: 9.0.21 is-root: 2.1.0 - loader-utils: 3.2.1 + loader-utils: 3.3.1 open: 8.4.2 pkg-up: 3.1.0 prompts: 2.4.2 @@ -24892,33 +22378,33 @@ packages: shell-quote: 1.8.1 strip-ansi: 6.0.1 text-table: 0.2.0 - typescript: 5.3.3 - webpack: 5.91.0(webpack-cli@5.1.4) + typescript: 5.5.4 + webpack: 5.93.0(webpack-cli@5.1.4) transitivePeerDependencies: - eslint - supports-color - vue-template-compiler dev: false - /react-dom@18.2.0(react@18.2.0): - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + /react-dom@18.3.1(react@18.3.1): + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} peerDependencies: - react: ^18.2.0 + react: ^18.3.1 dependencies: loose-envify: 1.4.0 - react: 18.2.0 - scheduler: 0.23.0 + react: 18.3.1 + scheduler: 0.23.2 /react-error-overlay@6.0.11: resolution: {integrity: sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==} dev: false - /react-icons@4.10.1(react@18.2.0): - resolution: {integrity: sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw==} + /react-icons@4.12.0(react@18.3.1): + resolution: {integrity: sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==} peerDependencies: react: '*' dependencies: - react: 18.2.0 + react: 18.3.1 dev: false /react-is@16.13.1: @@ -24927,21 +22413,21 @@ packages: /react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + /react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - /react-json-view@1.21.3(@types/react@18.0.28)(react-dom@18.2.0)(react@18.2.0): + /react-json-view@1.21.3(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==} peerDependencies: react: ^17.0.0 || ^16.3.0 || ^15.5.4 react-dom: ^17.0.0 || ^16.3.0 || ^15.5.4 dependencies: - flux: 4.0.4(react@18.2.0) - react: 18.2.0 + flux: 4.0.4(react@18.3.1) + react: 18.3.1 react-base16-styling: 0.6.0 - react-dom: 18.2.0(react@18.2.0) + react-dom: 18.3.1(react@18.3.1) react-lifecycles-compat: 3.0.4 - react-textarea-autosize: 8.4.1(@types/react@18.0.28)(react@18.2.0) + react-textarea-autosize: 8.5.3(@types/react@18.3.3)(react@18.3.1) transitivePeerDependencies: - '@types/react' - encoding @@ -24951,7 +22437,7 @@ packages: resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} dev: false - /react-reconciler@0.26.2(react@18.2.0): + /react-reconciler@0.26.2(react@18.3.1): resolution: {integrity: sha512-nK6kgY28HwrMNwDnMui3dvm3rCFjZrcGiuwLc5COUipBK5hWHLOxMJhSnSomirqWwjPBJKV1QcbkI0VJr7Gl1Q==} engines: {node: '>=0.10.0'} peerDependencies: @@ -24959,7 +22445,7 @@ packages: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 - react: 18.2.0 + react: 18.3.1 scheduler: 0.20.2 dev: false @@ -24968,30 +22454,30 @@ packages: engines: {node: '>=0.10.0'} dev: false - /react-router-dom@6.10.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-E5dfxRPuXKJqzwSe/qGcqdwa18QiWC6f3H3cWXM24qj4N0/beCIf/CWTipop2xm7mR0RCS99NnaqPNjHtrAzCg==} - engines: {node: '>=14'} + /react-router-dom@6.25.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-0tUDpbFvk35iv+N89dWNrJp+afLgd+y4VtorJZuOCXK0kkCWjEvb3vTJM++SYvMEpbVwXKf3FjeVveVEb6JpDQ==} + engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' react-dom: '>=16.8' dependencies: - '@remix-run/router': 1.5.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-router: 6.10.0(react@18.2.0) + '@remix-run/router': 1.18.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-router: 6.25.1(react@18.3.1) dev: false - /react-router@6.10.0(react@18.2.0): - resolution: {integrity: sha512-Nrg0BWpQqrC3ZFFkyewrflCud9dio9ME3ojHCF/WLsprJVzkq3q3UeEhMCAW1dobjeGbWgjNn/PVF6m46ANxXQ==} - engines: {node: '>=14'} + /react-router@6.25.1(react@18.3.1): + resolution: {integrity: sha512-u8ELFr5Z6g02nUtpPAggP73Jigj1mRePSwhS/2nkTrlPU5yEkH1vYzWNyvSnSzeeE2DNqWdH+P8OhIh9wuXhTw==} + engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' dependencies: - '@remix-run/router': 1.5.0 - react: 18.2.0 + '@remix-run/router': 1.18.0 + react: 18.3.1 dev: false - /react-scripts@5.0.1(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.55.0)(react@18.2.0)(ts-node@10.8.2)(typescript@5.3.3): + /react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0)(react@18.3.1)(ts-node@10.9.2)(typescript@5.5.4): resolution: {integrity: sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==} engines: {node: '>=14.0.0'} hasBin: true @@ -25003,61 +22489,62 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.21.4 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(webpack-dev-server@4.13.2)(webpack@5.91.0) + '@babel/core': 7.25.2 + '@pmmmwh/react-refresh-webpack-plugin': 0.5.15(react-refresh@0.11.0)(webpack-dev-server@4.15.2)(webpack@5.93.0) '@svgr/webpack': 5.5.0 - babel-jest: 27.5.1(@babel/core@7.21.4) - babel-loader: 8.3.0(@babel/core@7.21.4)(webpack@5.91.0) - babel-plugin-named-asset-import: 0.3.8(@babel/core@7.21.4) + babel-jest: 27.5.1(@babel/core@7.25.2) + babel-loader: 8.3.0(@babel/core@7.25.2)(webpack@5.93.0) + babel-plugin-named-asset-import: 0.3.8(@babel/core@7.25.2) babel-preset-react-app: 10.0.1 - bfj: 7.0.2 - browserslist: 4.21.10 + bfj: 7.1.0 + browserslist: 4.23.2 camelcase: 6.3.0 case-sensitive-paths-webpack-plugin: 2.4.0 - css-loader: 6.7.3(webpack@5.91.0) - css-minimizer-webpack-plugin: 3.4.1(webpack@5.91.0) + css-loader: 6.11.0(webpack@5.93.0) + css-minimizer-webpack-plugin: 3.4.1(webpack@5.93.0) dotenv: 10.0.0 dotenv-expand: 5.1.0 - eslint: 8.55.0 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.55.0)(jest@27.5.1)(typescript@5.3.3) - eslint-webpack-plugin: 3.2.0(eslint@8.55.0)(webpack@5.91.0) - file-loader: 6.2.0(webpack@5.91.0) + eslint: 8.57.0 + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0)(jest@27.5.1)(typescript@5.5.4) + eslint-webpack-plugin: 3.2.0(eslint@8.57.0)(webpack@5.93.0) + file-loader: 6.2.0(webpack@5.93.0) fs-extra: 10.1.0 - html-webpack-plugin: 5.5.0(webpack@5.91.0) + html-webpack-plugin: 5.6.0(webpack@5.93.0) identity-obj-proxy: 3.0.0 - jest: 27.5.1(ts-node@10.8.2) + jest: 27.5.1(ts-node@10.9.2) jest-resolve: 27.5.1 jest-watch-typeahead: 1.1.0(jest@27.5.1) - mini-css-extract-plugin: 2.7.5(webpack@5.91.0) - postcss: 8.4.30 - postcss-flexbugs-fixes: 5.0.2(postcss@8.4.30) - postcss-loader: 6.2.1(postcss@8.4.30)(webpack@5.91.0) - postcss-normalize: 10.0.1(browserslist@4.21.10)(postcss@8.4.30) - postcss-preset-env: 7.8.3(postcss@8.4.30) + mini-css-extract-plugin: 2.9.0(webpack@5.93.0) + postcss: 8.4.40 + postcss-flexbugs-fixes: 5.0.2(postcss@8.4.40) + postcss-loader: 6.2.1(postcss@8.4.40)(webpack@5.93.0) + postcss-normalize: 10.0.1(browserslist@4.23.2)(postcss@8.4.40) + postcss-preset-env: 7.8.3(postcss@8.4.40) prompts: 2.4.2 - react: 18.2.0 + react: 18.3.1 react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@8.55.0)(typescript@5.3.3)(webpack@5.91.0) + react-dev-utils: 12.0.1(eslint@8.57.0)(typescript@5.5.4)(webpack@5.93.0) react-refresh: 0.11.0 - resolve: 1.22.2 + resolve: 1.22.8 resolve-url-loader: 4.0.0 - sass-loader: 12.6.0(webpack@5.91.0) - semver: 7.5.4 - source-map-loader: 3.0.2(webpack@5.91.0) - style-loader: 3.3.2(webpack@5.91.0) - tailwindcss: 3.3.1(postcss@8.4.30)(ts-node@10.8.2) - terser-webpack-plugin: 5.3.7(webpack@5.91.0) - typescript: 5.3.3 - webpack: 5.91.0(webpack-cli@5.1.4) - webpack-dev-server: 4.13.2(webpack@5.91.0) - webpack-manifest-plugin: 4.1.1(webpack@5.91.0) - workbox-webpack-plugin: 6.5.4(webpack@5.91.0) + sass-loader: 12.6.0(webpack@5.93.0) + semver: 7.6.3 + source-map-loader: 3.0.2(webpack@5.93.0) + style-loader: 3.3.4(webpack@5.93.0) + tailwindcss: 3.4.7(ts-node@10.9.2) + terser-webpack-plugin: 5.3.10(webpack@5.93.0) + typescript: 5.5.4 + webpack: 5.93.0(webpack-cli@5.1.4) + webpack-dev-server: 4.15.2(webpack@5.93.0) + webpack-manifest-plugin: 4.1.1(webpack@5.93.0) + workbox-webpack-plugin: 6.6.0(webpack@5.93.0) optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 transitivePeerDependencies: - '@babel/plugin-syntax-flow' - '@babel/plugin-transform-react-jsx' - '@parcel/css' + - '@rspack/core' - '@swc/core' - '@types/babel__core' - '@types/webpack' @@ -25088,63 +22575,62 @@ packages: - webpack-plugin-serve dev: false - /react-smooth@2.0.5(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-BMP2Ad42tD60h0JW6BFaib+RJuV5dsXJK9Baxiv/HlNFjvRLqA9xrNKxVWnUIZPQfzUwGXIlU/dSYLU+54YGQA==} + /react-smooth@4.0.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-OE4hm7XqR0jNOq3Qmk9mFLyd6p2+j6bvbPJ7qlB7+oo0eNcL2l7WQzG6MBnT3EXY6xzkLMUBec3AfewJdA0J8w==} peerDependencies: - prop-types: ^15.6.0 - react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: fast-equals: 5.0.1 prop-types: 15.8.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-transition-group: 2.9.0(react-dom@18.2.0)(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-transition-group: 4.4.5(react-dom@18.3.1)(react@18.3.1) dev: false - /react-textarea-autosize@8.4.1(@types/react@18.0.28)(react@18.2.0): - resolution: {integrity: sha512-aD2C+qK6QypknC+lCMzteOdIjoMbNlgSFmJjCV+DrfTPwp59i/it9mMNf2HDzvRjQgKAyBDPyLJhcrzElf2U4Q==} + /react-textarea-autosize@8.5.3(@types/react@18.3.3)(react@18.3.1): + resolution: {integrity: sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==} engines: {node: '>=10'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@babel/runtime': 7.21.0 - react: 18.2.0 - use-composed-ref: 1.3.0(react@18.2.0) - use-latest: 1.2.1(@types/react@18.0.28)(react@18.2.0) + '@babel/runtime': 7.25.0 + react: 18.3.1 + use-composed-ref: 1.3.0(react@18.3.1) + use-latest: 1.2.1(@types/react@18.3.3)(react@18.3.1) transitivePeerDependencies: - '@types/react' dev: false - /react-transition-group@2.9.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==} + /react-transition-group@4.4.5(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} peerDependencies: - react: '>=15.0.0' - react-dom: '>=15.0.0' + react: '>=16.6.0' + react-dom: '>=16.6.0' dependencies: - dom-helpers: 3.4.0 + '@babel/runtime': 7.25.0 + dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-lifecycles-compat: 3.0.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) dev: false - /react-universal-interface@0.6.2(react@18.2.0)(tslib@2.6.2): + /react-universal-interface@0.6.2(react@18.3.1)(tslib@2.6.3): resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==} peerDependencies: react: '*' tslib: '*' dependencies: - react: 18.2.0 - tslib: 2.6.2 + react: 18.3.1 + tslib: 2.6.3 dev: false - /react-use@17.4.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-TgbNTCA33Wl7xzIJegn1HndB4qTS9u03QUwyNycUnXaweZkE4Kq2SB+Yoxx8qbshkZGYBDvUXbXWRUmQDcZZ/Q==} + /react-use@17.5.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-LG/uPEVRflLWMwi3j/sZqR00nF6JGqTTDblkXK2nzXsIvij06hXl1V/MZIlwj1OKIQUtlh1l9jK8gLsRyCQxMg==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: '*' + react-dom: '*' dependencies: '@types/js-cookie': 2.2.7 '@xobotyi/scrollbar-width': 1.9.5 @@ -25152,20 +22638,20 @@ packages: fast-deep-equal: 3.1.3 fast-shallow-equal: 1.0.0 js-cookie: 2.2.1 - nano-css: 5.3.5(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-universal-interface: 0.6.2(react@18.2.0)(tslib@2.6.2) + nano-css: 5.6.2(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-universal-interface: 0.6.2(react@18.3.1)(tslib@2.6.3) resize-observer-polyfill: 1.5.1 screenfull: 5.2.0 set-harmonic-interval: 1.0.1 throttle-debounce: 3.0.1 ts-easing: 0.2.0 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + /react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 @@ -25186,6 +22672,23 @@ packages: json-parse-even-better-errors: 2.3.1 npm-normalize-package-bin: 1.0.1 + /read-package-json-fast@3.0.2: + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + json-parse-even-better-errors: 3.0.2 + npm-normalize-package-bin: 3.0.1 + + /read-package-json@6.0.4: + resolution: {integrity: sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + deprecated: This package is no longer supported. Please use @npmcli/package-json instead. + dependencies: + glob: 10.4.5 + json-parse-even-better-errors: 3.0.2 + normalize-package-data: 5.0.0 + npm-normalize-package-bin: 3.0.1 + /read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} @@ -25198,7 +22701,7 @@ packages: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} dependencies: - '@types/normalize-package-data': 2.4.1 + '@types/normalize-package-data': 2.4.4 normalize-package-data: 2.5.0 parse-json: 5.2.0 type-fest: 0.6.0 @@ -25222,6 +22725,16 @@ packages: string_decoder: 1.3.0 util-deprecate: 1.0.2 + /readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + /readdir-glob@1.1.3: resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} dependencies: @@ -25256,38 +22769,36 @@ packages: decimal.js-light: 2.5.1 dev: false - /recharts@2.10.4(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-/Q7/wdf8bW91lN3NEeCjL9RWfaiXQViJFgdnas4Eix/I8B9HAI3tHHK/CW/zDfgRMh4fzW1zlfjoz1IAapLO1Q==} + /recharts@2.12.7(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-hlLJMhPQfv4/3NBSAyq3gzGg4h2v69RJh6KU7b3pXYNNAELs9kEoXOjbkxdXpALqKBoVmVptGfLpxdaVYqjmXQ==} engines: {node: '>=14'} peerDependencies: - prop-types: ^15.6.0 react: ^16.0.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 dependencies: - clsx: 2.1.0 + clsx: 2.1.1 eventemitter3: 4.0.7 lodash: 4.17.21 - prop-types: 15.8.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) react-is: 16.13.1 - react-smooth: 2.0.5(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0) + react-smooth: 4.0.1(react-dom@18.3.1)(react@18.3.1) recharts-scale: 0.4.5 - tiny-invariant: 1.3.1 - victory-vendor: 36.8.2 + tiny-invariant: 1.3.3 + victory-vendor: 36.9.2 dev: false /rechoir@0.6.2: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} engines: {node: '>= 0.10'} dependencies: - resolve: 1.22.2 + resolve: 1.22.8 /rechoir@0.8.0: resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} engines: {node: '>= 10.13.0'} dependencies: - resolve: 1.22.2 + resolve: 1.22.8 /recursive-readdir@2.2.3: resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} @@ -25314,8 +22825,20 @@ packages: dependencies: redis-errors: 1.2.0 - /regenerate-unicode-properties@10.1.0: - resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} + /reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + globalthis: 1.0.4 + which-builtin-type: 1.1.4 + + /regenerate-unicode-properties@10.1.1: + resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} engines: {node: '>=4'} dependencies: regenerate: 1.4.2 @@ -25329,23 +22852,28 @@ packages: /regenerator-runtime@0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + dev: false + + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} /regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 - /regex-parser@2.2.11: - resolution: {integrity: sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==} + /regex-parser@2.3.0: + resolution: {integrity: sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==} dev: false - /regexp.prototype.flags@1.4.3: - resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} + /regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - functions-have-names: 1.2.3 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 /regexpp@3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} @@ -25357,7 +22885,7 @@ packages: dependencies: '@babel/regjsgen': 0.8.0 regenerate: 1.4.2 - regenerate-unicode-properties: 10.1.0 + regenerate-unicode-properties: 10.1.1 regjsparser: 0.9.1 unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.1.0 @@ -25432,6 +22960,9 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + /resolve-url-loader@4.0.0: resolution: {integrity: sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==} engines: {node: '>=8.9'} @@ -25465,19 +22996,19 @@ packages: path-parse: 1.0.7 dev: true - /resolve@1.22.2: - resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true dependencies: - is-core-module: 2.12.0 + is-core-module: 2.15.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - /resolve@2.0.0-next.4: - resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} + /resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true dependencies: - is-core-module: 2.12.0 + is-core-module: 2.15.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -25493,23 +23024,13 @@ packages: engines: {node: '>=12'} requiresBuild: true dependencies: - debug: 4.3.4 + debug: 4.3.6 extend: 3.0.2 transitivePeerDependencies: - supports-color dev: false optional: true - /retry-request@6.0.0: - resolution: {integrity: sha512-24kaFMd3wCnT3n4uPnsQh90ZSV8OISpfTFXJ00Wi+/oD2OPrp63EQ8hznk6rhxdlpwx2QBhQSDz2Fg46ki852g==} - engines: {node: '>=14'} - dependencies: - debug: 4.3.4 - extend: 3.0.2 - transitivePeerDependencies: - - supports-color - dev: false - /retry-request@7.0.2: resolution: {integrity: sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==} engines: {node: '>=14'} @@ -25545,6 +23066,7 @@ packages: /rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true dependencies: glob: 7.2.3 @@ -25552,21 +23074,24 @@ packages: /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true dependencies: glob: 7.2.3 - /rollup-plugin-babel@4.4.0(@babel/core@7.21.4)(rollup@1.32.1): + /rollup-plugin-babel@4.4.0(@babel/core@7.25.2)(rollup@1.32.1): resolution: {integrity: sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==} deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-babel. peerDependencies: '@babel/core': 7 || ^7.0.0-rc.2 rollup: '>=0.60.0 <3' dependencies: - '@babel/core': 7.21.4 - '@babel/helper-module-imports': 7.22.15 + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 rollup: 1.32.1 rollup-pluginutils: 2.8.2 + transitivePeerDependencies: + - supports-color dev: true /rollup-plugin-bundle-size@1.0.3: @@ -25596,7 +23121,7 @@ packages: postcss-load-config: 2.1.2 postcss-modules: 2.0.0 promise.series: 0.2.0 - resolve: 1.22.2 + resolve: 1.22.8 rollup-pluginutils: 2.8.2 safe-identifier: 0.4.2 style-inject: 0.3.0 @@ -25621,7 +23146,7 @@ packages: peerDependencies: rollup: '>=0.66.0 <3' dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.7 jest-worker: 24.9.0 rollup: 1.32.1 rollup-pluginutils: 2.8.2 @@ -25635,11 +23160,11 @@ packages: peerDependencies: rollup: ^2.0.0 dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.7 jest-worker: 26.6.2 rollup: 2.79.1 serialize-javascript: 4.0.0 - terser: 5.19.4 + terser: 5.31.3 dev: false /rollup-plugin-typescript2@0.25.3(rollup@1.32.1)(typescript@3.9.10): @@ -25673,8 +23198,8 @@ packages: resolution: {integrity: sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==} hasBin: true dependencies: - '@types/estree': 1.0.1 - '@types/node': 20.14.2 + '@types/estree': 1.0.5 + '@types/node': 18.19.42 acorn: 7.4.1 dev: true @@ -25683,7 +23208,7 @@ packages: engines: {node: '>=10.0.0'} hasBin: true optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: false /rollup@2.79.1: @@ -25691,49 +23216,47 @@ packages: engines: {node: '>=10.0.0'} hasBin: true optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: false - /rollup@3.20.2: - resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /rollup@3.29.1: - resolution: {integrity: sha512-c+ebvQz0VIH4KhhCpDsI+Bik0eT8ZFEVZEYw0cGMVqIP8zc+gnwl7iXCamTw7vzv2MeuZFZfdx5JJIq+ehzDlg==} + /rollup@3.29.4: + resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true - /rollup@4.1.4: - resolution: {integrity: sha512-U8Yk1lQRKqCkDBip/pMYT+IKaN7b7UesK3fLSTuHBoBJacCE+oBqo/dfG/gkUdQNNB2OBmRP98cn2C2bkYZkyw==} + /rollup@4.19.1: + resolution: {integrity: sha512-K5vziVlg7hTpYfFBI+91zHBEMo6jafYXpkMlqZjg7/zhIG9iHqazBf4xz9AVdjS9BruRn280ROqLI7G3OFRIlw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + dependencies: + '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.1.4 - '@rollup/rollup-android-arm64': 4.1.4 - '@rollup/rollup-darwin-arm64': 4.1.4 - '@rollup/rollup-darwin-x64': 4.1.4 - '@rollup/rollup-linux-arm-gnueabihf': 4.1.4 - '@rollup/rollup-linux-arm64-gnu': 4.1.4 - '@rollup/rollup-linux-arm64-musl': 4.1.4 - '@rollup/rollup-linux-x64-gnu': 4.1.4 - '@rollup/rollup-linux-x64-musl': 4.1.4 - '@rollup/rollup-win32-arm64-msvc': 4.1.4 - '@rollup/rollup-win32-ia32-msvc': 4.1.4 - '@rollup/rollup-win32-x64-msvc': 4.1.4 - fsevents: 2.3.2 + '@rollup/rollup-android-arm-eabi': 4.19.1 + '@rollup/rollup-android-arm64': 4.19.1 + '@rollup/rollup-darwin-arm64': 4.19.1 + '@rollup/rollup-darwin-x64': 4.19.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.19.1 + '@rollup/rollup-linux-arm-musleabihf': 4.19.1 + '@rollup/rollup-linux-arm64-gnu': 4.19.1 + '@rollup/rollup-linux-arm64-musl': 4.19.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.19.1 + '@rollup/rollup-linux-riscv64-gnu': 4.19.1 + '@rollup/rollup-linux-s390x-gnu': 4.19.1 + '@rollup/rollup-linux-x64-gnu': 4.19.1 + '@rollup/rollup-linux-x64-musl': 4.19.1 + '@rollup/rollup-win32-arm64-msvc': 4.19.1 + '@rollup/rollup-win32-ia32-msvc': 4.19.1 + '@rollup/rollup-win32-x64-msvc': 4.19.1 + fsevents: 2.3.3 dev: true /rtl-css-js@1.16.1: resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.25.0 dev: false /run-async@2.4.1: @@ -25750,16 +23273,10 @@ packages: dependencies: queue-microtask: 1.2.3 - /rxjs@7.8.0: - resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==} - dependencies: - tslib: 2.6.2 - dev: true - /rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: - tslib: 2.6.2 + tslib: 2.6.3 /sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} @@ -25768,6 +23285,15 @@ packages: mri: 1.2.0 dev: true + /safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -25778,21 +23304,25 @@ packages: resolution: {integrity: sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==} dev: true - /safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + /safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 + call-bind: 1.0.7 + es-errors: 1.3.0 is-regex: 1.1.4 /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + /safevalues@0.6.0: + resolution: {integrity: sha512-MZ7DcTOcIoPXN36/UONVE9BT0pmwlCr9WcS7Pj/q4FxOwr33FkWC0CUWj/THQXYWxf/F7urbhaHaOeFPSqGqHA==} + /sanitize.css@13.0.0: resolution: {integrity: sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==} dev: false - /sass-loader@12.6.0(webpack@5.91.0): + /sass-loader@12.6.0(webpack@5.93.0): resolution: {integrity: sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -25813,12 +23343,18 @@ packages: dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.91.0(webpack-cli@5.1.4) + webpack: 5.93.0(webpack-cli@5.1.4) dev: false /sax@1.2.4: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + /sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + requiresBuild: true + dev: true + optional: true + /saxes@5.0.1: resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} engines: {node: '>=10'} @@ -25833,8 +23369,8 @@ packages: object-assign: 4.1.1 dev: false - /scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + /scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} dependencies: loose-envify: 1.4.0 @@ -25856,15 +23392,6 @@ packages: ajv-keywords: 3.5.2(ajv@6.12.6) dev: false - /schema-utils@3.1.1: - resolution: {integrity: sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==} - engines: {node: '>= 10.13.0'} - dependencies: - '@types/json-schema': 7.0.11 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - dev: true - /schema-utils@3.3.0: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} @@ -25873,15 +23400,6 @@ packages: ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - /schema-utils@4.0.0: - resolution: {integrity: sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==} - engines: {node: '>= 12.13.0'} - dependencies: - '@types/json-schema': 7.0.11 - ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) - ajv-keywords: 5.1.0(ajv@8.12.0) - /schema-utils@4.2.0: resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} engines: {node: '>= 12.13.0'} @@ -25890,7 +23408,6 @@ packages: ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) ajv-keywords: 5.1.0(ajv@8.12.0) - dev: true /scoped-regex@2.1.0: resolution: {integrity: sha512-g3WxHrqSWCZHGHlSrF51VXFdjImhwvH8ZO/pryFH56Qi0cDsZfylQa/t0jCzVQFNbNvM00HfHjkDPEuarKDSWQ==} @@ -25901,24 +23418,25 @@ packages: engines: {node: '>=0.10.0'} dev: false - /scroll-into-view-if-needed@3.0.10: - resolution: {integrity: sha512-t44QCeDKAPf1mtQH3fYpWz8IM/DyvHLjs8wUvvwMYxk5moOqCzrMSxK6HQVD0QVmVjXFavoFIPRVrMuJPKAvtg==} + /scroll-into-view-if-needed@3.1.0: + resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} dependencies: - compute-scroll-into-view: 3.0.3 + compute-scroll-into-view: 3.1.0 /select-hose@2.0.0: resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} dev: false - /selfsigned@2.1.1: - resolution: {integrity: sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==} + /selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} engines: {node: '>=10'} dependencies: + '@types/node-forge': 1.3.11 node-forge: 1.3.1 dev: false - /semver@5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true /semver@6.3.1: @@ -25938,12 +23456,10 @@ packages: lru-cache: 6.0.0 dev: true - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + /semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} hasBin: true - dependencies: - lru-cache: 6.0.0 /send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} @@ -25970,16 +23486,10 @@ packages: dependencies: randombytes: 2.1.0 - /serialize-javascript@6.0.1: - resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} - dependencies: - randombytes: 2.1.0 - /serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} dependencies: randombytes: 2.1.0 - dev: true /serve-index@1.9.1: resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} @@ -26010,6 +23520,26 @@ packages: /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + /set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + /set-harmonic-interval@1.0.1: resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==} engines: {node: '>=6.9'} @@ -26063,16 +23593,14 @@ packages: interpret: 1.4.0 rechoir: 0.6.2 - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + /side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - object-inspect: 1.12.3 - - /sigmund@1.0.1: - resolution: {integrity: sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==} - dev: false + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.2 /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -26082,6 +23610,23 @@ packages: engines: {node: '>=14'} dev: true + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + /sigstore@1.9.0: + resolution: {integrity: sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + '@sigstore/bundle': 1.1.0 + '@sigstore/protobuf-specs': 0.2.1 + '@sigstore/sign': 1.0.0 + '@sigstore/tuf': 1.0.3 + make-fetch-happen: 11.1.1 + transitivePeerDependencies: + - supports-color + /simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} dev: false @@ -26102,12 +23647,12 @@ packages: simple-concat: 1.0.1 dev: false - /simple-git@3.22.0: - resolution: {integrity: sha512-6JujwSs0ac82jkGjMHiCnTifvf1crOiY/+tfs/Pqih6iow7VrpNKRRNdWm6RtaXpvvv/JGNYhlUtLhGFqHF+Yw==} + /simple-git@3.25.0: + resolution: {integrity: sha512-KIY5sBnzc4yEcJXW7Tdv4viEz8KyG+nU0hay+DWZasvdFOYKeUZ6Xc25LUHHjw0tinPT7O1eY6pzX7pRT1K8rw==} dependencies: '@kwsites/file-exists': 1.1.1 '@kwsites/promise-deferred': 1.1.1 - debug: 4.3.4 + debug: 4.3.6 transitivePeerDependencies: - supports-color dev: false @@ -26134,6 +23679,7 @@ packages: /slash@4.0.0: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} engines: {node: '>=12'} + dev: false /slash@5.1.0: resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} @@ -26148,8 +23694,8 @@ packages: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - /smob@1.4.0: - resolution: {integrity: sha512-MqR3fVulhjWuRNSMydnTlweu38UhQ0HXM4buStD/S3mc/BzX3CuM9OmhyQpmtYCvoYdl5ris6TI0ZqH355Ymqg==} + /smob@1.5.0: + resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} dev: true /snappyjs@0.6.1: @@ -26169,8 +23715,8 @@ packages: engines: {node: '>= 10'} dependencies: agent-base: 6.0.2 - debug: 4.3.4 - socks: 2.7.1 + debug: 4.3.6 + socks: 2.8.3 transitivePeerDependencies: - supports-color @@ -26179,16 +23725,16 @@ packages: engines: {node: '>= 10'} dependencies: agent-base: 6.0.2 - debug: 4.3.4 - socks: 2.7.1 + debug: 4.3.6 + socks: 2.8.3 transitivePeerDependencies: - supports-color - /socks@2.7.1: - resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} - engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + /socks@2.8.3: + resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} dependencies: - ip: 2.0.0 + ip-address: 9.0.5 smart-buffer: 4.2.0 /sort-keys@4.2.0: @@ -26201,11 +23747,11 @@ packages: resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} dev: false - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} - /source-map-loader@3.0.2(webpack@5.91.0): + /source-map-loader@3.0.2(webpack@5.93.0): resolution: {integrity: sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -26213,8 +23759,8 @@ packages: dependencies: abab: 2.0.6 iconv-lite: 0.6.3 - source-map-js: 1.0.2 - webpack: 5.91.0(webpack-cli@5.1.4) + source-map-js: 1.2.0 + webpack: 5.93.0(webpack-cli@5.1.4) dev: false /source-map-support@0.5.13: @@ -26246,7 +23792,6 @@ packages: /source-map@0.7.4: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} - dev: false /source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} @@ -26259,10 +23804,6 @@ packages: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} deprecated: Please use @jridgewell/sourcemap-codec instead - /spark-md5@3.0.2: - resolution: {integrity: sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==} - dev: true - /sparse-bitfield@3.0.3: resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} dependencies: @@ -26273,24 +23814,24 @@ packages: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.13 + spdx-license-ids: 3.0.18 - /spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + /spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} /spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.13 + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.18 - /spdx-license-ids@3.0.13: - resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + /spdx-license-ids@3.0.18: + resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==} /spdy-transport@3.0.0: resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} dependencies: - debug: 4.3.4 + debug: 4.3.6 detect-node: 2.1.0 hpack.js: 2.1.6 obuf: 1.1.2 @@ -26304,7 +23845,7 @@ packages: resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} engines: {node: '>=6.0.0'} dependencies: - debug: 4.3.4 + debug: 4.3.6 handle-thing: 2.0.1 http-deceiver: 1.2.7 select-hose: 2.0.0 @@ -26329,25 +23870,34 @@ packages: /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + /sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + /ssh-remote-port-forward@1.0.4: resolution: {integrity: sha512-x0LV1eVDwjf1gmG7TTnfqIzf+3VPRz7vrNIjX6oYLbeCrf/PeVY6hkT68Mg+q02qXxQhrLjB0jfgvhevoCRmLQ==} dependencies: '@types/ssh2': 0.5.52 - ssh2: 1.11.0 + ssh2: 1.15.0 dev: true - /ssh2@1.11.0: - resolution: {integrity: sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw==} + /ssh2@1.15.0: + resolution: {integrity: sha512-C0PHgX4h6lBxYx7hcXwu3QWdh4tg6tZZsTfXcdvc5caW/EMxaB4H9dWsl7qk+F7LAW762hp8VbXOX7x4xUYvEw==} engines: {node: '>=10.16.0'} requiresBuild: true dependencies: asn1: 0.2.6 bcrypt-pbkdf: 1.0.2 optionalDependencies: - cpu-features: 0.0.6 - nan: 2.17.0 + cpu-features: 0.0.10 + nan: 2.20.0 dev: true + /ssri@10.0.6: + resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minipass: 7.1.2 + /ssri@8.0.1: resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} engines: {node: '>= 8'} @@ -26417,6 +23967,12 @@ packages: resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} dev: false + /static-eval@2.0.2: + resolution: {integrity: sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==} + dependencies: + escodegen: 1.14.3 + dev: false + /statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} @@ -26429,7 +23985,7 @@ packages: resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} engines: {node: '>= 0.4'} dependencies: - internal-slot: 1.0.5 + internal-slot: 1.0.7 /stopwatch-node@1.1.0: resolution: {integrity: sha512-TpRTztFjiq/B5wn84oKK0YHHtprgrC8pLOUkqVU+MN+2DgdBMaEIeSyGeAn2n+7mT9zrfJyhM33Yw4j/rRV2Bg==} @@ -26441,7 +23997,6 @@ packages: /stream-events@1.0.5: resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==} - requiresBuild: true dependencies: stubs: 3.0.0 dev: false @@ -26452,8 +24007,8 @@ packages: stream-chain: 2.2.5 dev: false - /stream-shift@1.0.1: - resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} + /stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} dev: false /stream-to-array@2.3.0: @@ -26473,6 +24028,7 @@ packages: /streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} + dev: false /string-convert@0.2.1: resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==} @@ -26523,11 +24079,10 @@ packages: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.0.1 - dev: false + strip-ansi: 7.1.0 - /string-width@7.0.0: - resolution: {integrity: sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==} + /string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} dependencies: emoji-regex: 10.3.0 @@ -26535,39 +24090,58 @@ packages: strip-ansi: 7.1.0 dev: false - /string.prototype.matchall@4.0.8: - resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} + /string.prototype.includes@2.0.0: + resolution: {integrity: sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - get-intrinsic: 1.2.0 + define-properties: 1.2.1 + es-abstract: 1.23.3 + + /string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + gopd: 1.0.1 has-symbols: 1.0.3 - internal-slot: 1.0.5 - regexp.prototype.flags: 1.4.3 - side-channel: 1.0.4 + internal-slot: 1.0.7 + regexp.prototype.flags: 1.5.2 + set-function-name: 2.0.2 + side-channel: 1.0.6 - /string.prototype.trim@1.2.7: - resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + /string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + dependencies: + define-properties: 1.2.1 + es-abstract: 1.23.3 + + /string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 - /string.prototype.trimend@1.0.6: - resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + /string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 - /string.prototype.trimstart@1.0.6: - resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + /string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 /string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -26600,19 +24174,11 @@ packages: dependencies: ansi-regex: 5.0.1 - /strip-ansi@7.0.1: - resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} - engines: {node: '>=12'} - dependencies: - ansi-regex: 6.0.1 - dev: false - /strip-ansi@7.1.0: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 - dev: false /strip-bom-buf@1.0.0: resolution: {integrity: sha512-1sUIL1jck0T1mhOLP2c696BIznzT525Lkub+n4jjMHjhjhoAQA6Ye659DxdlZBr0aLDMQoTxKIpnlqxgtwjsuQ==} @@ -26669,8 +24235,8 @@ packages: resolution: {integrity: sha512-OUA32uhNoSoM6wOodyFbV+3IBCoO140uzdXmBArQ0S88D4EbH91xl2v+Ml1sKalcFKUBadHLeHfU/p9AbsOfGw==} engines: {node: '>=12.*'} dependencies: - '@types/node': 20.14.2 - qs: 6.11.1 + '@types/node': 18.19.42 + qs: 6.12.3 /strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} @@ -26678,23 +24244,22 @@ packages: /stubs@3.0.0: resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} - requiresBuild: true dev: false /style-inject@0.3.0: resolution: {integrity: sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==} dev: true - /style-loader@3.3.2(webpack@5.91.0): - resolution: {integrity: sha512-RHs/vcrKdQK8wZliteNK4NKzxvLBzpuHMqYmUVWeKa6MkaIQ97ZTOS0b+zapZhy6GcrgWnvWYCMHRirC3FsUmw==} + /style-loader@3.3.4(webpack@5.93.0): + resolution: {integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 dependencies: - webpack: 5.91.0(webpack-cli@5.1.4) + webpack: 5.93.0(webpack-cli@5.1.4) dev: false - /styled-jsx@5.1.1(@babel/core@7.21.4)(react@18.2.0): + /styled-jsx@5.1.1(@babel/core@7.25.2)(react@18.3.1): resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} engines: {node: '>= 12.0.0'} peerDependencies: @@ -26707,45 +24272,45 @@ packages: babel-plugin-macros: optional: true dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.25.2 client-only: 0.0.1 - react: 18.2.0 + react: 18.3.1 dev: false /stylehacks@4.0.3: resolution: {integrity: sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.21.10 + browserslist: 4.23.2 postcss: 7.0.39 postcss-selector-parser: 3.1.2 dev: true - /stylehacks@5.1.1(postcss@8.4.31): + /stylehacks@5.1.1(postcss@8.4.40): resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.10 - postcss: 8.4.31 - postcss-selector-parser: 6.0.11 + browserslist: 4.23.2 + postcss: 8.4.40 + postcss-selector-parser: 6.1.1 dev: false - /stylis@4.1.3: - resolution: {integrity: sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==} + /stylis@4.3.2: + resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==} - /sucrase@3.32.0: - resolution: {integrity: sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==} - engines: {node: '>=8'} + /sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} hasBin: true dependencies: - '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/gen-mapping': 0.3.5 commander: 4.1.1 - glob: 7.1.6 + glob: 10.4.5 lines-and-columns: 1.2.4 mz: 2.7.0 - pirates: 4.0.5 + pirates: 4.0.6 ts-interface-checker: 0.1.13 /supports-color@2.0.0: @@ -26813,7 +24378,7 @@ packages: csso: 4.2.0 js-yaml: 3.14.1 mkdirp: 0.5.6 - object.values: 1.1.6 + object.values: 1.2.0 sax: 1.2.4 stable: 0.1.8 unquote: 1.1.1 @@ -26829,7 +24394,7 @@ packages: css-select: 4.3.0 css-tree: 1.1.3 csso: 4.2.0 - picocolors: 1.0.0 + picocolors: 1.0.1 stable: 0.1.8 dev: false @@ -26837,82 +24402,35 @@ packages: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: false - /synckit@0.8.5: - resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} - engines: {node: ^14.18.0 || >=16.0.0} - dependencies: - '@pkgr/utils': 2.3.1 - tslib: 2.6.2 - dev: true - - /tailwindcss@3.3.1(postcss@8.4.30)(ts-node@10.8.2): - resolution: {integrity: sha512-Vkiouc41d4CEq0ujXl6oiGFQ7bA3WEhUZdTgXAhtKxSy49OmKs8rEfQmupsfF0IGW8fv2iQkp1EVUuapCFrZ9g==} - engines: {node: '>=12.13.0'} - hasBin: true - peerDependencies: - postcss: ^8.0.9 - dependencies: - arg: 5.0.2 - chokidar: 3.5.3 - color-name: 1.1.4 - didyoumean: 1.2.2 - dlv: 1.1.3 - fast-glob: 3.2.12 - glob-parent: 6.0.2 - is-glob: 4.0.3 - jiti: 1.18.2 - lilconfig: 2.1.0 - micromatch: 4.0.5 - normalize-path: 3.0.0 - object-hash: 3.0.0 - picocolors: 1.0.0 - postcss: 8.4.30 - postcss-import: 14.1.0(postcss@8.4.30) - postcss-js: 4.0.1(postcss@8.4.30) - postcss-load-config: 3.1.4(postcss@8.4.30)(ts-node@10.8.2) - postcss-nested: 6.0.0(postcss@8.4.30) - postcss-selector-parser: 6.0.11 - postcss-value-parser: 4.2.0 - quick-lru: 5.1.1 - resolve: 1.22.2 - sucrase: 3.32.0 - transitivePeerDependencies: - - ts-node - - /tailwindcss@3.3.1(postcss@8.4.31)(ts-node@10.8.2): - resolution: {integrity: sha512-Vkiouc41d4CEq0ujXl6oiGFQ7bA3WEhUZdTgXAhtKxSy49OmKs8rEfQmupsfF0IGW8fv2iQkp1EVUuapCFrZ9g==} - engines: {node: '>=12.13.0'} + /tailwindcss@3.4.7(ts-node@10.9.2): + resolution: {integrity: sha512-rxWZbe87YJb4OcSopb7up2Ba4U82BoiSGUdoDr3Ydrg9ckxFS/YWsvhN323GMcddgU65QRy7JndC7ahhInhvlQ==} + engines: {node: '>=14.0.0'} hasBin: true - peerDependencies: - postcss: ^8.0.9 dependencies: + '@alloc/quick-lru': 5.2.0 arg: 5.0.2 - chokidar: 3.5.3 - color-name: 1.1.4 + chokidar: 3.6.0 didyoumean: 1.2.2 dlv: 1.1.3 - fast-glob: 3.2.12 + fast-glob: 3.3.2 glob-parent: 6.0.2 is-glob: 4.0.3 - jiti: 1.18.2 + jiti: 1.21.6 lilconfig: 2.1.0 - micromatch: 4.0.5 + micromatch: 4.0.7 normalize-path: 3.0.0 object-hash: 3.0.0 - picocolors: 1.0.0 - postcss: 8.4.31 - postcss-import: 14.1.0(postcss@8.4.31) - postcss-js: 4.0.1(postcss@8.4.31) - postcss-load-config: 3.1.4(postcss@8.4.31)(ts-node@10.8.2) - postcss-nested: 6.0.0(postcss@8.4.31) - postcss-selector-parser: 6.0.11 - postcss-value-parser: 4.2.0 - quick-lru: 5.1.1 - resolve: 1.22.2 - sucrase: 3.32.0 + picocolors: 1.0.1 + postcss: 8.4.40 + postcss-import: 15.1.0(postcss@8.4.40) + postcss-js: 4.0.1(postcss@8.4.40) + postcss-load-config: 4.0.2(postcss@8.4.40)(ts-node@10.9.2) + postcss-nested: 6.2.0(postcss@8.4.40) + postcss-selector-parser: 6.1.1 + resolve: 1.22.8 + sucrase: 3.35.0 transitivePeerDependencies: - ts-node - dev: true /tapable@1.1.3: resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} @@ -26963,8 +24481,8 @@ packages: yallist: 3.1.1 dev: true - /tar@6.2.0: - resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} + /tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} dependencies: chownr: 2.0.0 @@ -26989,7 +24507,7 @@ packages: https-proxy-agent: 5.0.1 node-fetch: 2.7.0 stream-events: 1.0.5 - uuid: 9.0.0 + uuid: 9.0.1 transitivePeerDependencies: - encoding - supports-color @@ -27032,7 +24550,7 @@ packages: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - /terser-webpack-plugin@5.3.10(webpack@5.91.0): + /terser-webpack-plugin@5.3.10(webpack@5.93.0): resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -27051,73 +24569,28 @@ packages: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 - serialize-javascript: 6.0.1 - terser: 5.31.1 - webpack: 5.91.0(webpack-cli@5.1.4) - - /terser-webpack-plugin@5.3.7(webpack@5.91.0): - resolution: {integrity: sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - dependencies: - '@jridgewell/trace-mapping': 0.3.18 - jest-worker: 27.5.1 - schema-utils: 3.3.0 - serialize-javascript: 6.0.1 - terser: 5.19.4 - webpack: 5.91.0(webpack-cli@5.1.4) - dev: false + serialize-javascript: 6.0.2 + terser: 5.31.3 + webpack: 5.93.0(webpack-cli@5.1.4) /terser@4.8.1: resolution: {integrity: sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - acorn: 8.11.3 + acorn: 8.12.1 commander: 2.20.3 source-map: 0.6.1 source-map-support: 0.5.21 dev: true - /terser@5.16.9: - resolution: {integrity: sha512-HPa/FdTB9XGI2H1/keLFZHxl6WNvAI4YalHGtDQTlMnJcoqSab1UwL4l1hGEhs6/GmLHBZIg/YgB++jcbzoOEg==} + /terser@5.31.3: + resolution: {integrity: sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==} engines: {node: '>=10'} hasBin: true dependencies: - '@jridgewell/source-map': 0.3.3 - acorn: 8.11.3 - commander: 2.20.3 - source-map-support: 0.5.21 - dev: true - - /terser@5.19.4: - resolution: {integrity: sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==} - engines: {node: '>=10'} - hasBin: true - dependencies: - '@jridgewell/source-map': 0.3.3 - acorn: 8.8.2 - commander: 2.20.3 - source-map-support: 0.5.21 - - /terser@5.31.1: - resolution: {integrity: sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==} - engines: {node: '>=10'} - hasBin: true - dependencies: - '@jridgewell/source-map': 0.3.3 - acorn: 8.11.3 + '@jridgewell/source-map': 0.3.6 + acorn: 8.12.1 commander: 2.20.3 source-map-support: 0.5.21 @@ -27129,24 +24602,26 @@ packages: glob: 7.2.3 minimatch: 3.1.2 - /testcontainers@9.4.0: - resolution: {integrity: sha512-Mg7GMYENWd4U6KavKZ8XUTqYeW7dAJRYxltEmNid+4YcFNanG2qqUhrqIUvW4sZsjuH+kfjtlTUoOaEDavRJYw==} + /testcontainers@9.12.0: + resolution: {integrity: sha512-zmjLTAUqCiDvhDq7TCwcyhI3m/cXXKGnhyLLJ9pgh53VgG9O+P+opX1pIx28aYTUQ7Yu6b5sJf0xoIuxoiclWg==} engines: {node: '>= 10.16'} dependencies: '@balena/dockerignore': 1.0.2 - '@types/archiver': 5.3.2 - '@types/dockerode': 3.3.16 - archiver: 5.3.1 - async-lock: 1.4.0 + '@types/archiver': 5.3.4 + '@types/dockerode': 3.3.31 + archiver: 5.3.2 + async-lock: 1.4.1 byline: 5.0.0 - debug: 4.3.4 - docker-compose: 0.23.19 + debug: 4.3.6 + docker-compose: 0.24.8 dockerode: 3.3.5 get-port: 5.1.1 node-fetch: 2.7.0 - properties-reader: 2.2.0 + proper-lockfile: 4.1.2 + properties-reader: 2.3.0 ssh-remote-port-forward: 1.0.4 tar-fs: 2.1.1 + tmp: 0.2.3 transitivePeerDependencies: - encoding - supports-color @@ -27159,8 +24634,8 @@ packages: /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - /textextensions@5.15.0: - resolution: {integrity: sha512-MeqZRHLuaGamUXGuVn2ivtU3LA3mLCCIO5kUGoohTCoGmCBg/+8yPhWVX9WSl9telvVd8erftjFk9Fwb2dD6rw==} + /textextensions@5.16.0: + resolution: {integrity: sha512-7D/r3s6uPZyU//MCYrX6I14nzauDwJ5CxazouuRGNuvSCihW87ufN6VLoROLCrHg6FblLuJrT6N2BVaPVzqElw==} engines: {node: '>=0.8'} /thenify-all@1.6.0: @@ -27183,8 +24658,8 @@ packages: engines: {node: '>=10'} dev: false - /throttle-debounce@5.0.0: - resolution: {integrity: sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==} + /throttle-debounce@5.0.2: + resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==} engines: {node: '>=12.22'} /through@2.3.8: @@ -27201,8 +24676,8 @@ packages: convert-hrtime: 3.0.0 dev: true - /timezones-list@3.0.2: - resolution: {integrity: sha512-I698hm6Jp/xxkwyTSOr39pZkYKETL8LDJeSIhjxXBfPUAHM5oZNuQ4o9UK3PSkDBOkjATecSOBb3pR1IkIBUsg==} + /timezones-list@3.0.3: + resolution: {integrity: sha512-C+Vdvvj2c1xB6pu81pOX8geo6mrk/QsudFVlTVQET7QQwu8WAIyhDNeCrK5grU7EMzmbKLWqz7uU6dN8fvQvPQ==} dev: false /timsort@0.3.0: @@ -27216,16 +24691,12 @@ packages: globrex: 0.1.2 dev: true - /tiny-hashes@1.0.1: - resolution: {integrity: sha512-knIN5zj4fl7kW4EBU5sLP20DWUvi/rVouvJezV0UAym2DkQaqm365Nyc8F3QEiOvunNDMxR8UhcXd1d5g+Wg1g==} - dev: true - - /tiny-invariant@1.3.1: - resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} + /tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} dev: false - /tiny-lru@11.2.5: - resolution: {integrity: sha512-JpqM0K33lG6iQGKiigcwuURAKZlq6rHXfrgeL4/I8/REoyJTGU+tEMszvT/oTRVHG2OiylhGDjqPp1jWMlr3bw==} + /tiny-lru@11.2.6: + resolution: {integrity: sha512-0PU3c9PjMnltZaFo2sGYv/nnJsMjG0Cxx8X6FXHPPGjFyoo1SJDxvUXW1207rdiSxYizf31roo+GrkIByQeZoA==} engines: {node: '>=12'} dev: false @@ -27235,14 +24706,9 @@ packages: dependencies: os-tmpdir: 1.0.2 - /tmp@0.2.1: - resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} - engines: {node: '>=8.17.0'} - requiresBuild: true - dependencies: - rimraf: 3.0.2 - dev: false - optional: true + /tmp@0.2.3: + resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} + engines: {node: '>=14.14'} /tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} @@ -27269,19 +24735,17 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - /touch@3.1.0: - resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + /touch@3.1.1: + resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} hasBin: true - dependencies: - nopt: 1.0.10 dev: true - /tough-cookie@4.1.2: - resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==} + /tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} engines: {node: '>=6'} dependencies: psl: 1.9.0 - punycode: 2.3.0 + punycode: 2.3.1 universalify: 0.2.0 url-parse: 1.5.10 dev: false @@ -27292,190 +24756,52 @@ packages: /tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} dependencies: - punycode: 2.3.0 + punycode: 2.3.1 dev: false /tr46@2.1.0: resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} engines: {node: '>=8'} dependencies: - punycode: 2.3.0 + punycode: 2.3.1 dev: false /tr46@4.1.1: - resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} - engines: {node: '>=14'} - dependencies: - punycode: 2.3.0 - dev: false - - /tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - dev: true - - /treeverse@1.0.4: - resolution: {integrity: sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==} - - /tryer@1.0.1: - resolution: {integrity: sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==} - dev: false - - /ts-api-utils@1.2.1(typescript@5.3.3): - resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' - dependencies: - typescript: 5.3.3 - dev: true - - /ts-easing@0.2.0: - resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==} - dev: false - - /ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - - /ts-jest@29.0.5(@babel/core@7.21.4)(jest@29.5.0)(typescript@5.3.3): - resolution: {integrity: sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - dependencies: - '@babel/core': 7.21.4 - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - jest: 29.5.0(@types/node@18.15.11)(ts-node@10.8.2) - jest-util: 29.5.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.5.4 - typescript: 5.3.3 - yargs-parser: 21.1.1 - dev: true - - /ts-jest@29.0.5(@babel/core@7.21.4)(jest@29.5.0)(typescript@5.4.5): - resolution: {integrity: sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - dependencies: - '@babel/core': 7.21.4 - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - jest: 29.5.0(@types/node@20.14.2)(ts-node@10.8.2) - jest-util: 29.5.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.5.4 - typescript: 5.4.5 - yargs-parser: 21.1.1 - dev: true - - /ts-jest@29.0.5(@babel/core@7.21.4)(jest@29.7.0)(typescript@5.4.5): - resolution: {integrity: sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true + resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} + engines: {node: '>=14'} dependencies: - '@babel/core': 7.21.4 - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.15.11)(ts-node@10.8.2) - jest-util: 29.5.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.5.4 - typescript: 5.4.5 - yargs-parser: 21.1.1 - dev: true + punycode: 2.3.1 + dev: false - /ts-jest@29.1.1(@babel/core@7.21.4)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.3.3): - resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true + dev: true + + /treeverse@1.0.4: + resolution: {integrity: sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==} + + /tryer@1.0.1: + resolution: {integrity: sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==} + dev: false + + /ts-api-utils@1.3.0(typescript@5.5.4): + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true + typescript: '>=4.2.0' dependencies: - '@babel/core': 7.21.4 - '@jest/types': 29.6.3 - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.15.11)(ts-node@10.9.1) - jest-util: 29.5.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.5.4 - typescript: 5.3.3 - yargs-parser: 21.1.1 - dev: true + typescript: 5.5.4 + + /ts-easing@0.2.0: + resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==} + dev: false + + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - /ts-jest@29.1.1(@babel/core@7.21.4)(jest@29.7.0)(typescript@5.3.3): - resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} + /ts-jest@29.0.5(@babel/core@7.25.2)(jest@29.7.0)(typescript@5.5.4): + resolution: {integrity: sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -27484,7 +24810,7 @@ packages: babel-jest: ^29.0.0 esbuild: '*' jest: ^29.0.0 - typescript: '>=4.3 <6' + typescript: '>=4.3' peerDependenciesMeta: '@babel/core': optional: true @@ -27495,25 +24821,26 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.25.2 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.14.2)(ts-node@10.8.2) - jest-util: 29.5.0 + jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.5.4 - typescript: 5.3.3 + semver: 7.6.3 + typescript: 5.5.4 yargs-parser: 21.1.1 dev: true - /ts-jest@29.1.1(@babel/core@7.21.4)(jest@29.7.0)(typescript@5.4.5): - resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /ts-jest@29.2.3(@babel/core@7.25.2)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.5.4): + resolution: {integrity: sha512-yCcfVdiBFngVz9/keHin9EnsrQtQtEu3nRykNy9RVp+FiPFFbPJ3Sg6Qg4+TkmH0vMP5qsTKgXSsk80HRwvdgQ==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/transform': ^29.0.0 '@jest/types': ^29.0.0 babel-jest: ^29.0.0 esbuild: '*' @@ -27522,6 +24849,8 @@ packages: peerDependenciesMeta: '@babel/core': optional: true + '@jest/transform': + optional: true '@jest/types': optional: true babel-jest: @@ -27529,47 +24858,35 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.25.2 + '@jest/types': 29.6.3 bs-logger: 0.2.6 + ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.15.11)(ts-node@10.9.2) - jest-util: 29.5.0 + jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.5.4 - typescript: 5.4.5 + semver: 7.6.3 + typescript: 5.5.4 yargs-parser: 21.1.1 dev: true - /ts-loader@9.4.2(typescript@5.3.3)(webpack@5.91.0): - resolution: {integrity: sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==} - engines: {node: '>=12.0.0'} - peerDependencies: - typescript: '*' - webpack: ^5.0.0 - dependencies: - chalk: 4.1.2 - enhanced-resolve: 5.12.0 - micromatch: 4.0.5 - semver: 7.5.4 - typescript: 5.3.3 - webpack: 5.91.0(webpack-cli@5.1.4) - dev: true - - /ts-loader@9.4.4(typescript@5.4.5)(webpack@5.91.0): - resolution: {integrity: sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==} + /ts-loader@9.5.1(typescript@5.5.4)(webpack@5.93.0): + resolution: {integrity: sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==} engines: {node: '>=12.0.0'} peerDependencies: typescript: '*' webpack: ^5.0.0 dependencies: chalk: 4.1.2 - enhanced-resolve: 5.13.0 - micromatch: 4.0.5 - semver: 7.5.4 - typescript: 5.4.5 - webpack: 5.91.0(webpack-cli@5.1.4) + enhanced-resolve: 5.17.1 + micromatch: 4.0.7 + semver: 7.6.3 + source-map: 0.7.4 + typescript: 5.5.4 + webpack: 5.93.0(webpack-cli@5.1.4) dev: true /ts-morph@12.0.0: @@ -27586,7 +24903,7 @@ packages: code-block-writer: 11.0.3 dev: true - /ts-node-dev@2.0.0(@types/node@18.15.11)(typescript@5.3.3): + /ts-node-dev@2.0.0(@types/node@18.19.42)(typescript@5.5.4): resolution: {integrity: sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==} engines: {node: '>=0.8.0'} hasBin: true @@ -27597,83 +24914,23 @@ packages: node-notifier: optional: true dependencies: - chokidar: 3.5.3 + chokidar: 3.6.0 dynamic-dedupe: 0.3.0 minimist: 1.2.8 mkdirp: 1.0.4 - resolve: 1.22.2 + resolve: 1.22.8 rimraf: 2.7.1 source-map-support: 0.5.21 tree-kill: 1.2.2 - ts-node: 10.9.2(@types/node@18.15.11)(typescript@5.3.3) + ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) tsconfig: 7.0.0 - typescript: 5.3.3 + typescript: 5.5.4 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' - '@types/node' dev: true - /ts-node@10.8.2(@types/node@18.15.11)(typescript@5.3.3): - resolution: {integrity: sha512-LYdGnoGddf1D6v8REPtIH+5iq/gTDuZqv2/UJUU7tKjuEU8xVZorBM+buCGNjj+pGEud+sOoM4CX3/YzINpENA==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.3 - '@types/node': 18.15.11 - acorn: 8.8.2 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.3.3 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - - /ts-node@10.8.2(@types/node@20.14.2)(typescript@5.3.3): - resolution: {integrity: sha512-LYdGnoGddf1D6v8REPtIH+5iq/gTDuZqv2/UJUU7tKjuEU8xVZorBM+buCGNjj+pGEud+sOoM4CX3/YzINpENA==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.3 - '@types/node': 20.14.2 - acorn: 8.8.2 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.3.3 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - /ts-node@10.9.1(@types/node@14.18.33)(typescript@4.9.5): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true @@ -27689,13 +24946,13 @@ packages: optional: true dependencies: '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 + '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.3 + '@tsconfig/node16': 1.0.4 '@types/node': 14.18.33 - acorn: 8.8.2 - acorn-walk: 8.2.0 + acorn: 8.12.1 + acorn-walk: 8.3.3 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 @@ -27705,69 +24962,7 @@ packages: yn: 3.1.1 dev: true - /ts-node@10.9.1(@types/node@18.15.11)(typescript@5.3.3): - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.3 - '@types/node': 18.15.11 - acorn: 8.8.2 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.3.3 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - dev: true - - /ts-node@10.9.2(@types/node@18.15.11)(typescript@5.3.3): - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.3 - '@types/node': 18.15.11 - acorn: 8.8.2 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.3.3 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - dev: true - - /ts-node@10.9.2(@types/node@18.15.11)(typescript@5.4.5): + /ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4): resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: @@ -27782,18 +24977,18 @@ packages: optional: true dependencies: '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 + '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.3 - '@types/node': 18.15.11 - acorn: 8.8.2 - acorn-walk: 8.2.0 + '@tsconfig/node16': 1.0.4 + '@types/node': 18.19.42 + acorn: 8.12.1 + acorn-walk: 8.3.3 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.4.5 + typescript: 5.5.4 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 @@ -27805,8 +25000,8 @@ packages: resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} dev: true - /tsconfig-paths@3.14.2: - resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + /tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} dependencies: '@types/json5': 0.0.29 json5: 1.0.2 @@ -27829,20 +25024,28 @@ packages: /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - /tslib@2.5.0: - resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} - - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + /tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} - /tsutils@3.21.0(typescript@5.3.3): + /tsutils@3.21.0(typescript@5.5.4): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 5.3.3 + typescript: 5.5.4 + dev: false + + /tuf-js@1.1.7: + resolution: {integrity: sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@tufjs/models': 1.0.4 + debug: 4.3.6 + make-fetch-happen: 11.1.1 + transitivePeerDependencies: + - supports-color /tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} @@ -27981,7 +25184,6 @@ packages: /type-check@0.3.2: resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} engines: {node: '>= 0.8.0'} - requiresBuild: true dependencies: prelude-ls: 1.1.2 dev: false @@ -28027,8 +25229,8 @@ packages: engines: {node: '>=12.20'} dev: false - /type-fest@3.8.0: - resolution: {integrity: sha512-FVNSzGQz9Th+/9R6Lvv7WIAkstylfHN2/JYxkyhhmKFYh9At2DST8t6L6Lref9eYO8PXFTfG9Sg1Agg0K3vq3Q==} + /type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} engines: {node: '>=14.16'} dev: true @@ -28039,12 +25241,45 @@ packages: media-typer: 0.3.0 mime-types: 2.1.35 - /typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + /typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + + /typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + /typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + /typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.7 for-each: 0.3.3 - is-typed-array: 1.1.10 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 /typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} @@ -28064,28 +25299,23 @@ packages: hasBin: true dev: true - /typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} - engines: {node: '>=14.17'} - hasBin: true - - /typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + /typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} engines: {node: '>=14.17'} hasBin: true - /ua-parser-js@0.7.35: - resolution: {integrity: sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==} + /ua-parser-js@1.0.38: + resolution: {integrity: sha512-Aq5ppTOfvrCMgAPneW1HfWj66Xi7XL+/mIy996R1/CLS/rcyJQm6QZdsKrUeivDFQ+Oc9Wyuwor8Ze8peEoUoQ==} dev: false - /uc.micro@1.0.6: - resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} + /uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} requiresBuild: true dev: false optional: true - /uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + /uglify-js@3.19.1: + resolution: {integrity: sha512-y/2wiW+ceTYR2TSSptAhfnEtpLaQ4Ups5zrjB2d3kuVxHj16j/QJwPl5PvuGy9uARb39J0+iKxcRPvtpsx4A4A==} engines: {node: '>=0.8.0'} hasBin: true dev: false @@ -28097,7 +25327,7 @@ packages: /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.7 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 @@ -28106,8 +25336,12 @@ packages: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} dev: true - /underscore@1.13.6: - resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} + /underscore@1.12.1: + resolution: {integrity: sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==} + dev: false + + /underscore@1.13.7: + resolution: {integrity: sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==} requiresBuild: true dev: false optional: true @@ -28115,13 +25349,19 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - /undici@5.23.0: - resolution: {integrity: sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==} + /undici@5.26.5: + resolution: {integrity: sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==} engines: {node: '>=14.0'} dependencies: - busboy: 1.6.0 + '@fastify/busboy': 2.1.1 dev: true + /undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + engines: {node: '>=14.0'} + dependencies: + '@fastify/busboy': 2.1.1 + /unfetch@3.1.2: resolution: {integrity: sha512-L0qrK7ZeAudGiKYw6nzFjnJ2D5WHblUBwmHIqtPS6oKUd+Hcpk7/hKsSmcHsTlpd1TbTNsiRBUKRq3bHLNIqIw==} dev: true @@ -28173,6 +25413,12 @@ packages: dependencies: unique-slug: 3.0.0 + /unique-filename@3.0.0: + resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + unique-slug: 4.0.0 + /unique-slug@2.0.2: resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} dependencies: @@ -28184,6 +25430,12 @@ packages: dependencies: imurmurhash: 0.1.4 + /unique-slug@4.0.0: + resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + imurmurhash: 0.1.4 + /unique-string@2.0.0: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} engines: {node: '>=8'} @@ -28191,8 +25443,8 @@ packages: crypto-random-string: 2.0.0 dev: false - /universal-user-agent@6.0.0: - resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==} + /universal-user-agent@6.0.1: + resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} /universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} @@ -28204,8 +25456,8 @@ packages: engines: {node: '>= 4.0.0'} dev: false - /universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} /unpipe@1.0.0: @@ -28224,25 +25476,15 @@ packages: engines: {node: '>=4'} dev: false - /update-browserslist-db@1.0.11(browserslist@4.21.10): - resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.21.10 - escalade: 3.1.1 - picocolors: 1.0.0 - - /update-browserslist-db@1.0.11(browserslist@4.21.5): - resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + /update-browserslist-db@1.1.0(browserslist@4.23.2): + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.21.5 - escalade: 3.1.1 - picocolors: 1.0.0 + browserslist: 4.23.2 + escalade: 3.1.2 + picocolors: 1.0.1 /upper-case@1.1.3: resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==} @@ -28251,7 +25493,7 @@ packages: /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: - punycode: 2.3.0 + punycode: 2.3.1 /url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} @@ -28264,15 +25506,15 @@ packages: resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==} dev: false - /use-composed-ref@1.3.0(react@18.2.0): + /use-composed-ref@1.3.0(react@18.3.1): resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - react: 18.2.0 + react: 18.3.1 dev: false - /use-isomorphic-layout-effect@1.1.2(@types/react@18.0.28)(react@18.2.0): + /use-isomorphic-layout-effect@1.1.2(@types/react@18.3.3)(react@18.3.1): resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} peerDependencies: '@types/react': '*' @@ -28281,11 +25523,11 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.0.28 - react: 18.2.0 + '@types/react': 18.3.3 + react: 18.3.1 dev: false - /use-latest@1.2.1(@types/react@18.0.28)(react@18.2.0): + /use-latest@1.2.1(@types/react@18.3.3)(react@18.3.1): resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} peerDependencies: '@types/react': '*' @@ -28294,17 +25536,17 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.0.28 - react: 18.2.0 - use-isomorphic-layout-effect: 1.1.2(@types/react@18.0.28)(react@18.2.0) + '@types/react': 18.3.3 + react: 18.3.1 + use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.3)(react@18.3.1) dev: false - /use-sync-external-store@1.2.0(react@18.2.0): - resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + /use-sync-external-store@1.2.2(react@18.3.1): + resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - react: 18.2.0 + react: 18.3.1 dev: false /util-deprecate@1.0.2: @@ -28313,10 +25555,10 @@ packages: /util.promisify@1.0.1: resolution: {integrity: sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==} dependencies: - define-properties: 1.2.0 - es-abstract: 1.21.2 + define-properties: 1.2.1 + es-abstract: 1.23.3 has-symbols: 1.0.3 - object.getownpropertydescriptors: 2.1.5 + object.getownpropertydescriptors: 2.1.8 /utila@0.4.0: resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} @@ -28326,6 +25568,11 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} + /uuid@10.0.0: + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + hasBin: true + dev: false + /uuid@3.3.2: resolution: {integrity: sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==} deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. @@ -28337,11 +25584,6 @@ packages: hasBin: true dev: false - /uuid@9.0.0: - resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} - hasBin: true - dev: false - /uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true @@ -28354,18 +25596,18 @@ packages: resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} engines: {node: '>=10.12.0'} dependencies: - '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 1.9.0 source-map: 0.7.4 dev: false - /v8-to-istanbul@9.1.0: - resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} + /v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} dependencies: - '@jridgewell/trace-mapping': 0.3.18 - '@types/istanbul-lib-coverage': 2.0.4 - convert-source-map: 1.9.0 + '@jridgewell/trace-mapping': 0.3.25 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 /valid-data-url@3.0.1: resolution: {integrity: sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA==} @@ -28383,6 +25625,10 @@ packages: dependencies: builtins: 1.0.3 + /validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + /validate.io-array@1.0.6: resolution: {integrity: sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg==} dev: false @@ -28416,22 +25662,22 @@ packages: resolution: {integrity: sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==} dev: true - /vercel@32.3.1: - resolution: {integrity: sha512-XPwkXNbsqyqGy4kNo5T2At9TK71rfT/d9t55bUTkhWCHv62CZrZ+HdKrkZf2knx3mi11zeCWAU+2GvX9G1+3hw==} + /vercel@32.7.2: + resolution: {integrity: sha512-esyeo67OZ/f7usKFCrx6NSjsvpo/BP/C8Mfron2uiCb4vXVcjkwOM7TwliHx6b0DbXjpzomdGVUHKRs34VNn2Q==} engines: {node: '>= 16'} hasBin: true dependencies: - '@vercel/build-utils': 7.2.1 + '@vercel/build-utils': 7.3.0 '@vercel/fun': 1.1.0 - '@vercel/go': 3.0.2 + '@vercel/go': 3.0.4 '@vercel/hydrogen': 1.0.1 - '@vercel/next': 4.0.8 - '@vercel/node': 3.0.6 - '@vercel/python': 4.0.2 - '@vercel/redwood': 2.0.3 - '@vercel/remix-builder': 2.0.8 - '@vercel/ruby': 2.0.2 - '@vercel/static-build': 2.0.7 + '@vercel/next': 4.0.15 + '@vercel/node': 3.0.12 + '@vercel/python': 4.1.0 + '@vercel/redwood': 2.0.5 + '@vercel/remix-builder': 2.0.14 + '@vercel/ruby': 2.0.4 + '@vercel/static-build': 2.0.14 chokidar: 3.3.1 transitivePeerDependencies: - '@swc/core' @@ -28449,8 +25695,8 @@ packages: extsprintf: 1.3.0 dev: false - /victory-vendor@36.8.2: - resolution: {integrity: sha512-NfSQi7ISCdBbDpn3b6rg+8RpFZmWIM9mcks48BbogHE2F6h1XKdA34oiCKP5hP1OGvTotDRzsexiJKzrK4Exuw==} + /victory-vendor@36.9.2: + resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==} dependencies: '@types/d3-array': 3.2.1 '@types/d3-ease': 3.0.2 @@ -28515,14 +25761,6 @@ packages: dependencies: makeerror: 1.0.12 - /watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - dev: false - /watchpack@2.4.1: resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} engines: {node: '>=10.13.0'} @@ -28555,8 +25793,8 @@ packages: - encoding dev: false - /web-streams-polyfill@3.2.1: - resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} + /web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} /web-vitals@0.2.4: @@ -28589,7 +25827,7 @@ packages: engines: {node: '>=12'} dev: false - /webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.91.0): + /webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0): resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} engines: {node: '>=14.15.0'} hasBin: true @@ -28607,37 +25845,37 @@ packages: optional: true dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.91.0) - '@webpack-cli/generators': 3.0.7(mem-fs-editor@9.7.0)(mem-fs@2.3.0)(prettier@2.8.7)(webpack-cli@5.1.4)(webpack@5.91.0) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.91.0) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.91.0) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.93.0) + '@webpack-cli/generators': 3.0.7(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.93.0) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.93.0) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.3 - envinfo: 7.8.1 + envinfo: 7.13.0 fastest-levenshtein: 1.0.16 - import-local: 3.1.0 + import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.91.0(webpack-cli@5.1.4) - webpack-merge: 5.8.0 + webpack: 5.93.0(webpack-cli@5.1.4) + webpack-merge: 5.10.0 - /webpack-dev-middleware@5.3.3(webpack@5.91.0): - resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} + /webpack-dev-middleware@5.3.4(webpack@5.93.0): + resolution: {integrity: sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^4.0.0 || ^5.0.0 dependencies: colorette: 2.0.20 - memfs: 3.5.0 + memfs: 3.5.3 mime-types: 2.1.35 range-parser: 1.2.1 - schema-utils: 4.0.0 - webpack: 5.91.0(webpack-cli@5.1.4) + schema-utils: 4.2.0 + webpack: 5.93.0(webpack-cli@5.1.4) dev: false - /webpack-dev-server@4.13.2(webpack@5.91.0): - resolution: {integrity: sha512-5i6TrGBRxG4vnfDpB6qSQGfnB6skGBXNL5/542w2uRGLimX6qeE5BQMLrzIC3JYV/xlGOv+s+hTleI9AZKUQNw==} + /webpack-dev-server@4.15.2(webpack@5.93.0): + resolution: {integrity: sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==} engines: {node: '>= 12.13.0'} hasBin: true peerDependencies: @@ -28649,37 +25887,37 @@ packages: webpack-cli: optional: true dependencies: - '@types/bonjour': 3.5.10 - '@types/connect-history-api-fallback': 1.3.5 - '@types/express': 4.17.17 - '@types/serve-index': 1.9.1 - '@types/serve-static': 1.15.1 - '@types/sockjs': 0.3.33 - '@types/ws': 8.5.4 + '@types/bonjour': 3.5.13 + '@types/connect-history-api-fallback': 1.5.4 + '@types/express': 4.17.21 + '@types/serve-index': 1.9.4 + '@types/serve-static': 1.15.7 + '@types/sockjs': 0.3.36 + '@types/ws': 8.5.12 ansi-html-community: 0.0.8 - bonjour-service: 1.1.1 - chokidar: 3.5.3 + bonjour-service: 1.2.1 + chokidar: 3.6.0 colorette: 2.0.20 compression: 1.7.4 connect-history-api-fallback: 2.0.0 default-gateway: 6.0.3 - express: 4.18.2 + express: 4.19.2 graceful-fs: 4.2.11 - html-entities: 2.3.3 - http-proxy-middleware: 2.0.6(@types/express@4.17.17) - ipaddr.js: 2.0.1 - launch-editor: 2.6.0 + html-entities: 2.5.2 + http-proxy-middleware: 2.0.6(@types/express@4.17.21) + ipaddr.js: 2.2.0 + launch-editor: 2.8.0 open: 8.4.2 p-retry: 4.6.2 rimraf: 3.0.2 - schema-utils: 4.0.0 - selfsigned: 2.1.1 + schema-utils: 4.2.0 + selfsigned: 2.4.1 serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.91.0(webpack-cli@5.1.4) - webpack-dev-middleware: 5.3.3(webpack@5.91.0) - ws: 8.13.0 + webpack: 5.93.0(webpack-cli@5.1.4) + webpack-dev-middleware: 5.3.4(webpack@5.93.0) + ws: 8.18.0 transitivePeerDependencies: - bufferutil - debug @@ -28687,23 +25925,24 @@ packages: - utf-8-validate dev: false - /webpack-manifest-plugin@4.1.1(webpack@5.91.0): + /webpack-manifest-plugin@4.1.1(webpack@5.93.0): resolution: {integrity: sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==} engines: {node: '>=12.22.0'} peerDependencies: webpack: ^4.44.2 || ^5.47.0 dependencies: tapable: 2.2.1 - webpack: 5.91.0(webpack-cli@5.1.4) + webpack: 5.93.0(webpack-cli@5.1.4) webpack-sources: 2.3.1 dev: false - /webpack-merge@5.8.0: - resolution: {integrity: sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==} + /webpack-merge@5.10.0: + resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} engines: {node: '>=10.0.0'} dependencies: clone-deep: 4.0.1 - wildcard: 2.0.0 + flat: 5.0.2 + wildcard: 2.0.1 /webpack-sources@1.4.3: resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} @@ -28724,8 +25963,8 @@ packages: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - /webpack@5.91.0(webpack-cli@5.1.4): - resolution: {integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==} + /webpack@5.93.0(webpack-cli@5.1.4): + resolution: {integrity: sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -28734,17 +25973,17 @@ packages: webpack-cli: optional: true dependencies: - '@types/eslint-scope': 3.7.4 + '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/wasm-edit': 1.12.1 '@webassemblyjs/wasm-parser': 1.12.1 - acorn: 8.11.3 - acorn-import-assertions: 1.9.0(acorn@8.11.3) - browserslist: 4.21.10 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.17.0 - es-module-lexer: 1.2.1 + acorn: 8.12.1 + acorn-import-attributes: 1.9.5(acorn@8.12.1) + browserslist: 4.23.2 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.1 + es-module-lexer: 1.5.4 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -28755,9 +25994,9 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(webpack@5.91.0) + terser-webpack-plugin: 5.3.10(webpack@5.93.0) watchpack: 2.4.1 - webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.91.0) + webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' @@ -28782,8 +26021,8 @@ packages: iconv-lite: 0.4.24 dev: false - /whatwg-fetch@3.6.2: - resolution: {integrity: sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==} + /whatwg-fetch@3.6.20: + resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} dev: false /whatwg-mimetype@2.3.0: @@ -28830,36 +26069,53 @@ packages: is-string: 1.0.7 is-symbol: 1.0.4 - /which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + /which-builtin-type@1.1.4: + resolution: {integrity: sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==} + engines: {node: '>= 0.4'} + dependencies: + function.prototype.name: 1.1.6 + has-tostringtag: 1.0.2 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.0.10 + is-regex: 1.1.4 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.2 + which-typed-array: 1.1.15 + + /which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.3 /which-pm-runs@1.1.0: resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} engines: {node: '>=4'} dev: false - /which-pm@2.0.0: - resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} + /which-pm@2.2.0: + resolution: {integrity: sha512-MOiaDbA5ZZgUjkeMWM5EkJp4loW5ZRoa5bc3/aeMox/PJelMhE6t7S/mLuiY43DBupyxH+S0U1bTui9kWUlmsw==} engines: {node: '>=8.15'} dependencies: load-yaml-file: 0.2.0 path-exists: 4.0.0 - /which-typed-array@1.1.9: - resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} + /which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} engines: {node: '>= 0.4'} dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 - has-tostringtag: 1.0.0 - is-typed-array: 1.1.10 + has-tostringtag: 1.0.2 /which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} @@ -28875,6 +26131,13 @@ packages: dependencies: isexe: 2.0.0 + /which@3.0.1: + resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + isexe: 2.0.0 + /wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} dependencies: @@ -28887,35 +26150,35 @@ packages: string-width: 5.1.2 dev: false - /wildcard@2.0.0: - resolution: {integrity: sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==} + /wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} - /word-wrap@1.2.3: - resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - /workbox-background-sync@6.5.4: - resolution: {integrity: sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g==} + /workbox-background-sync@6.6.0: + resolution: {integrity: sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==} dependencies: idb: 7.1.1 - workbox-core: 6.5.4 + workbox-core: 6.6.0 dev: false - /workbox-broadcast-update@6.5.4: - resolution: {integrity: sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw==} + /workbox-broadcast-update@6.6.0: + resolution: {integrity: sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==} dependencies: - workbox-core: 6.5.4 + workbox-core: 6.6.0 dev: false - /workbox-build@6.5.4: - resolution: {integrity: sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA==} + /workbox-build@6.6.0: + resolution: {integrity: sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==} engines: {node: '>=10.0.0'} dependencies: '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0) - '@babel/core': 7.21.4 - '@babel/preset-env': 7.23.2(@babel/core@7.21.4) - '@babel/runtime': 7.21.0 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.21.4)(rollup@2.79.1) + '@babel/core': 7.25.2 + '@babel/preset-env': 7.25.2(@babel/core@7.25.2) + '@babel/runtime': 7.25.0 + '@rollup/plugin-babel': 5.3.1(@babel/core@7.25.2)(rollup@2.79.1) '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1) '@rollup/plugin-replace': 2.4.2(rollup@2.79.1) '@surma/rollup-plugin-off-main-thread': 2.2.3 @@ -28933,108 +26196,110 @@ packages: strip-comments: 2.0.1 tempy: 0.6.0 upath: 1.2.0 - workbox-background-sync: 6.5.4 - workbox-broadcast-update: 6.5.4 - workbox-cacheable-response: 6.5.4 - workbox-core: 6.5.4 - workbox-expiration: 6.5.4 - workbox-google-analytics: 6.5.4 - workbox-navigation-preload: 6.5.4 - workbox-precaching: 6.5.4 - workbox-range-requests: 6.5.4 - workbox-recipes: 6.5.4 - workbox-routing: 6.5.4 - workbox-strategies: 6.5.4 - workbox-streams: 6.5.4 - workbox-sw: 6.5.4 - workbox-window: 6.5.4 + workbox-background-sync: 6.6.0 + workbox-broadcast-update: 6.6.0 + workbox-cacheable-response: 6.6.0 + workbox-core: 6.6.0 + workbox-expiration: 6.6.0 + workbox-google-analytics: 6.6.0 + workbox-navigation-preload: 6.6.0 + workbox-precaching: 6.6.0 + workbox-range-requests: 6.6.0 + workbox-recipes: 6.6.0 + workbox-routing: 6.6.0 + workbox-strategies: 6.6.0 + workbox-streams: 6.6.0 + workbox-sw: 6.6.0 + workbox-window: 6.6.0 transitivePeerDependencies: - '@types/babel__core' - supports-color dev: false - /workbox-cacheable-response@6.5.4: - resolution: {integrity: sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug==} + /workbox-cacheable-response@6.6.0: + resolution: {integrity: sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==} + deprecated: workbox-background-sync@6.6.0 dependencies: - workbox-core: 6.5.4 + workbox-core: 6.6.0 dev: false - /workbox-core@6.5.4: - resolution: {integrity: sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q==} + /workbox-core@6.6.0: + resolution: {integrity: sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==} dev: false - /workbox-expiration@6.5.4: - resolution: {integrity: sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ==} + /workbox-expiration@6.6.0: + resolution: {integrity: sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==} dependencies: idb: 7.1.1 - workbox-core: 6.5.4 + workbox-core: 6.6.0 dev: false - /workbox-google-analytics@6.5.4: - resolution: {integrity: sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg==} + /workbox-google-analytics@6.6.0: + resolution: {integrity: sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==} + deprecated: It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained dependencies: - workbox-background-sync: 6.5.4 - workbox-core: 6.5.4 - workbox-routing: 6.5.4 - workbox-strategies: 6.5.4 + workbox-background-sync: 6.6.0 + workbox-core: 6.6.0 + workbox-routing: 6.6.0 + workbox-strategies: 6.6.0 dev: false - /workbox-navigation-preload@6.5.4: - resolution: {integrity: sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng==} + /workbox-navigation-preload@6.6.0: + resolution: {integrity: sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==} dependencies: - workbox-core: 6.5.4 + workbox-core: 6.6.0 dev: false - /workbox-precaching@6.5.4: - resolution: {integrity: sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg==} + /workbox-precaching@6.6.0: + resolution: {integrity: sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==} dependencies: - workbox-core: 6.5.4 - workbox-routing: 6.5.4 - workbox-strategies: 6.5.4 + workbox-core: 6.6.0 + workbox-routing: 6.6.0 + workbox-strategies: 6.6.0 dev: false - /workbox-range-requests@6.5.4: - resolution: {integrity: sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg==} + /workbox-range-requests@6.6.0: + resolution: {integrity: sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==} dependencies: - workbox-core: 6.5.4 + workbox-core: 6.6.0 dev: false - /workbox-recipes@6.5.4: - resolution: {integrity: sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA==} + /workbox-recipes@6.6.0: + resolution: {integrity: sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==} dependencies: - workbox-cacheable-response: 6.5.4 - workbox-core: 6.5.4 - workbox-expiration: 6.5.4 - workbox-precaching: 6.5.4 - workbox-routing: 6.5.4 - workbox-strategies: 6.5.4 + workbox-cacheable-response: 6.6.0 + workbox-core: 6.6.0 + workbox-expiration: 6.6.0 + workbox-precaching: 6.6.0 + workbox-routing: 6.6.0 + workbox-strategies: 6.6.0 dev: false - /workbox-routing@6.5.4: - resolution: {integrity: sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg==} + /workbox-routing@6.6.0: + resolution: {integrity: sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==} dependencies: - workbox-core: 6.5.4 + workbox-core: 6.6.0 dev: false - /workbox-strategies@6.5.4: - resolution: {integrity: sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw==} + /workbox-strategies@6.6.0: + resolution: {integrity: sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==} dependencies: - workbox-core: 6.5.4 + workbox-core: 6.6.0 dev: false - /workbox-streams@6.5.4: - resolution: {integrity: sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg==} + /workbox-streams@6.6.0: + resolution: {integrity: sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==} dependencies: - workbox-core: 6.5.4 - workbox-routing: 6.5.4 + workbox-core: 6.6.0 + workbox-routing: 6.6.0 dev: false - /workbox-sw@6.5.4: - resolution: {integrity: sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA==} + /workbox-sw@6.6.0: + resolution: {integrity: sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==} dev: false - /workbox-webpack-plugin@6.5.4(webpack@5.91.0): - resolution: {integrity: sha512-LmWm/zoaahe0EGmMTrSLUi+BjyR3cdGEfU3fS6PN1zKFYbqAKuQ+Oy/27e4VSXsyIwAw8+QDfk1XHNGtZu9nQg==} + /workbox-webpack-plugin@6.6.0(webpack@5.93.0): + resolution: {integrity: sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==} engines: {node: '>=10.0.0'} peerDependencies: webpack: ^4.4.0 || ^5.9.0 @@ -29042,19 +26307,19 @@ packages: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 - webpack: 5.91.0(webpack-cli@5.1.4) + webpack: 5.93.0(webpack-cli@5.1.4) webpack-sources: 1.4.3 - workbox-build: 6.5.4 + workbox-build: 6.6.0 transitivePeerDependencies: - '@types/babel__core' - supports-color dev: false - /workbox-window@6.5.4: - resolution: {integrity: sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug==} + /workbox-window@6.6.0: + resolution: {integrity: sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==} dependencies: - '@types/trusted-types': 2.0.3 - workbox-core: 6.5.4 + '@types/trusted-types': 2.0.7 + workbox-core: 6.6.0 dev: false /wrap-ansi@6.2.0: @@ -29064,7 +26329,6 @@ packages: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} @@ -29080,8 +26344,7 @@ packages: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 - strip-ansi: 7.0.1 - dev: false + strip-ansi: 7.1.0 /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -29102,8 +26365,8 @@ packages: imurmurhash: 0.1.4 signal-exit: 3.0.7 - /ws@7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + /ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} engines: {node: '>=8.3.0'} peerDependencies: bufferutil: ^4.0.1 @@ -29115,8 +26378,8 @@ packages: optional: true dev: false - /ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + /ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -29164,10 +26427,6 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - /yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - dev: false - /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -29178,6 +26437,11 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} + /yaml@2.5.0: + resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} + engines: {node: '>= 14'} + hasBin: true + /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -29192,7 +26456,7 @@ packages: engines: {node: '>=10'} dependencies: cliui: 7.0.4 - escalade: 3.1.1 + escalade: 3.1.2 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 @@ -29205,7 +26469,7 @@ packages: engines: {node: '>=12'} dependencies: cliui: 8.0.1 - escalade: 3.1.1 + escalade: 3.1.2 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 @@ -29234,31 +26498,28 @@ packages: fd-slicer: 1.1.0 dev: true - /yeoman-environment@3.15.1(mem-fs-editor@9.7.0)(mem-fs@2.3.0): - resolution: {integrity: sha512-P4DTQxqCxNTBD7gph+P+dIckBdx0xyHmvOYgO3vsc9/Sl67KJ6QInz5Qv6tlXET3CFFJ/YxPIdl9rKb0XwTRLg==} + /yeoman-environment@3.19.3: + resolution: {integrity: sha512-/+ODrTUHtlDPRH9qIC0JREH8+7nsRcjDl3Bxn2Xo/rvAaVvixH5275jHwg0C85g4QsF4P6M2ojfScPPAl+pLAg==} engines: {node: '>=12.10.0'} hasBin: true - peerDependencies: - mem-fs: ^1.2.0 || ^2.0.0 - mem-fs-editor: ^8.1.2 || ^9.0.0 dependencies: '@npmcli/arborist': 4.3.1 are-we-there-yet: 2.0.0 arrify: 2.0.1 - binaryextensions: 4.18.0 + binaryextensions: 4.19.0 chalk: 4.1.2 cli-table: 0.3.11 commander: 7.1.0 dateformat: 4.6.3 - debug: 4.3.4 - diff: 5.1.0 + debug: 4.3.6 + diff: 5.2.0 error: 10.4.0 escape-string-regexp: 4.0.0 execa: 5.1.1 find-up: 5.0.0 globby: 11.1.0 grouped-queue: 2.0.0 - inquirer: 8.2.5 + inquirer: 8.2.6 is-scoped: 2.1.0 isbinaryfile: 4.0.10 lodash: 4.17.21 @@ -29270,20 +26531,21 @@ packages: p-queue: 6.6.2 p-transform: 1.3.0 pacote: 12.0.3 - preferred-pm: 3.0.3 + preferred-pm: 3.1.4 pretty-bytes: 5.6.0 - semver: 7.5.4 + readable-stream: 4.5.2 + semver: 7.6.3 slash: 3.0.0 strip-ansi: 6.0.1 text-table: 0.2.0 - textextensions: 5.15.0 + textextensions: 5.16.0 untildify: 4.0.0 transitivePeerDependencies: - bluebird - supports-color - /yeoman-generator@5.8.0(mem-fs@2.3.0)(yeoman-environment@3.15.1): - resolution: {integrity: sha512-dsrwFn9/c2/MOe80sa2nKfbZd/GaPTgmmehdgkFifs1VN/I7qPsW2xcBfvSkHNGK+PZly7uHyH8kaVYSFNUDhQ==} + /yeoman-generator@5.10.0(yeoman-environment@3.19.3): + resolution: {integrity: sha512-iDUKykV7L4nDNzeYSedRmSeJ5eMYFucnKDi6KN1WNASXErgPepKqsQw55TgXPHnmpcyOh2Dd/LAZkyc+f0qaAw==} engines: {node: '>=12.10.0'} peerDependencies: yeoman-environment: ^3.2.0 @@ -29293,20 +26555,22 @@ packages: dependencies: chalk: 4.1.2 dargs: 7.0.0 - debug: 4.3.4 + debug: 4.3.6 execa: 5.1.1 github-username: 6.0.0 lodash: 4.17.21 mem-fs-editor: 9.7.0(mem-fs@2.3.0) minimist: 1.2.8 + pacote: 15.2.0 read-pkg-up: 7.0.1 run-async: 2.4.1 - semver: 7.5.4 + semver: 7.6.3 shelljs: 0.8.5 sort-keys: 4.2.0 text-table: 0.2.0 - yeoman-environment: 3.15.1(mem-fs-editor@9.7.0)(mem-fs@2.3.0) + yeoman-environment: 3.19.3 transitivePeerDependencies: + - bluebird - encoding - mem-fs - supports-color @@ -29319,21 +26583,26 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + /yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} engines: {node: '>=12.20'} dev: true - /zip-stream@4.1.0: - resolution: {integrity: sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==} + /yoctocolors-cjs@2.1.2: + resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + engines: {node: '>=18'} + dev: true + + /zip-stream@4.1.1: + resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} engines: {node: '>= 10'} dependencies: - archiver-utils: 2.1.0 - compress-commons: 4.1.1 + archiver-utils: 3.0.4 + compress-commons: 4.1.2 readable-stream: 3.6.2 dev: true - /zod-prisma@0.5.4(prisma@5.7.1)(zod@3.21.4): + /zod-prisma@0.5.4(prisma@5.17.0)(zod@3.21.4): resolution: {integrity: sha512-5Ca4Qd1a1jy1T/NqCEpbr0c+EsbjJfJ/7euEHob3zDvtUK2rTuD1Rc/vfzH8q8PtaR2TZbysD88NHmrLwpv3Xg==} engines: {node: '>=14'} hasBin: true @@ -29347,7 +26616,7 @@ packages: dependencies: '@prisma/generator-helper': 3.8.1 parenthesis: 3.1.8 - prisma: 5.7.1 + prisma: 5.17.0 ts-morph: 13.0.3 zod: 3.21.4 dev: true @@ -29367,7 +26636,7 @@ packages: resolution: {integrity: sha512-CKYrptAvjMhxQTuC7J42UXdmgKc73piuZHNGg0dya6qYZzPmaH31fXxuFv7B9QGAWX8tBmFlDJo9aXne7bmx3g==} requiresBuild: true dependencies: - '@types/node': 20.14.2 + '@types/node': 18.19.42 node-addon-api: 2.0.2 prebuild-install: 5.3.6 dev: false diff --git a/services/rotor/package.json b/services/rotor/package.json index 99dad1716..d394548b2 100644 --- a/services/rotor/package.json +++ b/services/rotor/package.json @@ -43,23 +43,23 @@ "pg-cursor": "~2.10.1", "prom-client": "^14.2.0", "tar": "^6.2.0", - "tslib": "^2.4.0", + "tslib": "^2.6.3", "jsondiffpatch": "workspace:*", "@clickhouse/client": "^0.2.10", "semver": "^7.5.4" }, "devDependencies": { - "@babel/preset-env": "^7.23.2", - "@babel/preset-react": "^7.22.15", - "@babel/preset-typescript": "^7.23.2", + "@babel/preset-env": "^7.25.2", + "@babel/preset-react": "^7.24.7", + "@babel/preset-typescript": "^7.24.7", "@jitsu/protocols": "workspace:*", "@rollup/plugin-babel": "^6.0.4", - "@rollup/plugin-commonjs": "^23.0.2", - "@rollup/plugin-json": "^5.0.1", - "@rollup/plugin-multi-entry": "^6.0.0", - "@rollup/plugin-node-resolve": "^15.0.1", - "@rollup/plugin-terser": "^0.1.0", - "@rollup/plugin-typescript": "^9.0.2", + "@rollup/plugin-commonjs": "^26.0.1", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-multi-entry": "^6.0.1", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-terser": "^0.4.4", + "@rollup/plugin-typescript": "^11.1.6", "@types/glob": "^8.0.0", "@types/jest": "^29.5.11", "@types/lodash": "^4.14.200", @@ -81,13 +81,13 @@ "lodash": "^4.17.21", "node-loader": "^2.0.0", "nodemon": "^2.0.20", - "rollup": "^3.2.5", - "ts-jest": "^29.1.1", + "rollup": "^4.19.1", + "ts-jest": "^29.2.3", "ts-loader": "^9.4.2", - "ts-node": "~10.9.1", + "ts-node": "^10.9.2", "ts-node-dev": "^2.0.0", - "typescript": "^5.3.3", - "webpack": "^5.91.0", + "typescript": "^5.5.4", + "webpack": "^5.93.0", "webpack-cli": "^5.1.4" } } diff --git a/services/rotor/src/lib/rotor.ts b/services/rotor/src/lib/rotor.ts index 9f6bc99c0..86b204a96 100644 --- a/services/rotor/src/lib/rotor.ts +++ b/services/rotor/src/lib/rotor.ts @@ -53,7 +53,7 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { let producer: Producer; let admin: Admin; let closeQueue: () => Promise; - let interval: NodeJS.Timer; + let interval: any; let metrics: Metrics; return { start: async () => { diff --git a/services/rotor/tsconfig.json b/services/rotor/tsconfig.json index 98118053d..e54b28d99 100644 --- a/services/rotor/tsconfig.json +++ b/services/rotor/tsconfig.json @@ -6,10 +6,10 @@ "allowSyntheticDefaultImports": true, "importHelpers": true, "removeComments": true, - "target": "ES2021", + "target": "ESNext", "module": "commonjs", "lib": [ - "esnext" + "ESNext", "DOM" ], "allowJs": true, "strict": true, diff --git a/webapps/console/components/Billing/BillingManager.tsx b/webapps/console/components/Billing/BillingManager.tsx index bad0d734d..0d04cb52f 100644 --- a/webapps/console/components/Billing/BillingManager.tsx +++ b/webapps/console/components/Billing/BillingManager.tsx @@ -352,7 +352,7 @@ const AvailablePlans: React.FC<{}> = () => { />
    {planId === billing.settings.planId ? ( - } className="w-full" size="large" type="ghost" disabled={true}> + } className="w-full" size="large" ghost disabled={true}> Current plan ) : planId === "free" ? ( diff --git a/webapps/console/components/ButtonGroup/ButtonGroup.tsx b/webapps/console/components/ButtonGroup/ButtonGroup.tsx index 6441dd338..a40b36728 100644 --- a/webapps/console/components/ButtonGroup/ButtonGroup.tsx +++ b/webapps/console/components/ButtonGroup/ButtonGroup.tsx @@ -30,7 +30,7 @@ export const ButtonGroup: React.FC = ({ items, dotsButtonProps .filter(item => item.collapsed) .map((item, i) => ({ label: item.href ? ( - + {item.label} ) : ( @@ -55,6 +55,10 @@ export const ButtonGroup: React.FC = ({ items, dotsButtonProps } + onClick={event => { + event.preventDefault(); + event.stopPropagation(); // stop propagation main button + }} {...dotsButtonProps} /> diff --git a/webapps/console/components/ButtonLabel/ButtonLabel.tsx b/webapps/console/components/ButtonLabel/ButtonLabel.tsx index 427e00d4e..6d9de994f 100644 --- a/webapps/console/components/ButtonLabel/ButtonLabel.tsx +++ b/webapps/console/components/ButtonLabel/ButtonLabel.tsx @@ -4,7 +4,7 @@ export type ButtonLabelProps = { icon?: ReactNode; children?: ReactNode; loading?: boolean; - iconPosition?: "left" | "right"; + iconPosition?: "start" | "end"; className?: string; iconSize?: "default" | "small"; }; @@ -31,7 +31,7 @@ export const ButtonLabel: React.FC = ({ children, icon, loading, - iconPosition = "left", + iconPosition = "start", className, iconSize = "default", }) => { @@ -39,12 +39,12 @@ export const ButtonLabel: React.FC = ({ return (
    - {icon && iconPosition === "left" && !loading && {icon}} + {icon && iconPosition === "start" && !loading && {icon}} {children && ( = ({ {children} )} - {icon && iconPosition === "right" && !loading && {icon}} + {icon && iconPosition === "end" && !loading && {icon}}
    {loading && !icon && (
    diff --git a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx index d61ce1212..2fc788ac6 100644 --- a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx +++ b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx @@ -218,7 +218,7 @@ function AddButton(props: IconButtonProps) { type={"primary"} ghost={true} onClick={e => { - btnProps.onClick && btnProps.onClick(e); + btnProps.onClick && btnProps.onClick(e as any); }} > Add parameter diff --git a/webapps/console/components/JitsuButton/JitsuButton.tsx b/webapps/console/components/JitsuButton/JitsuButton.tsx index 2b8444c21..f512805ab 100644 --- a/webapps/console/components/JitsuButton/JitsuButton.tsx +++ b/webapps/console/components/JitsuButton/JitsuButton.tsx @@ -8,7 +8,6 @@ import { useRouter } from "next/router"; import { useWorkspace } from "../../lib/context"; export type JitsuButtonProps = ButtonProps & { - iconPosition?: "left" | "right"; //set to true if href is relative workspace link ws?: boolean; }; diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index c782bc33d..da585f0ad 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -55,13 +55,13 @@ import { BillingBlockingDialog } from "../Billing/BillingBlockingDialog"; import { signOut } from "next-auth/react"; import { firebaseSignOut } from "../../lib/firebase-client"; import { feedbackError } from "../../lib/ui"; -import { MenuItemType } from "antd/es/menu/hooks/useItems"; import { useClassicProject } from "./ClassicProjectProvider"; import { useJitsu } from "@jitsu/jitsu-react"; import { useSearchParams } from "next/navigation"; import omit from "lodash/omit"; import { useBilling, UseBillingResult } from "../Billing/BillingProvider"; import { useUsage, UseUsageRes } from "../Billing/use-usage"; +import { MenuItemType } from "antd/lib/menu/interface"; export type PageLayoutProps = { fullscreen?: boolean; diff --git a/webapps/console/next.config.js b/webapps/console/next.config.js index e5070fee7..a6492da2a 100644 --- a/webapps/console/next.config.js +++ b/webapps/console/next.config.js @@ -1,5 +1,10 @@ /** @type {import("next").NextConfig} */ -const withTM = require("next-transpile-modules")(["juava", "@jitsu/protocols", "@jitsu/core-functions"]); +const withTM = require("next-transpile-modules")([ + "juava", + "@jitsu/protocols", + "@jitsu/core-functions", + "@ant-design/icons", +]); const nextConfig = withTM({}); const path = require("path"); const { withSentryConfig } = require("@sentry/nextjs"); diff --git a/webapps/console/package.json b/webapps/console/package.json index c739a12ba..a6ad281f0 100644 --- a/webapps/console/package.json +++ b/webapps/console/package.json @@ -40,9 +40,8 @@ "@loadable/component": "^5.15.3", "@monaco-editor/react": "^4.6.0", "@nangohq/frontend": "^0.21.11", - "@prisma/client": "^4.12.0", - "@prisma/extension-read-replicas": "^0.3.0", - "@rjsf/antd": "5.10.0", + "@prisma/client": "^5.17.0", + "@rjsf/antd": "^5.19.4", "@rjsf/core": "5.10.0", "@rjsf/utils": "5.10.0", "@rjsf/validator-ajv6": "5.10.0", @@ -74,7 +73,7 @@ "mjml": "^4.13.0", "mjml-react": "^2.0.8", "monaco-editor": "^0.50.0", - "next": "^13.5.6", + "next": "^14.2.5", "next-auth": "^4.23.2", "node-fetch-commonjs": "^3.2.4", "node-sql-parser": "^4.6.5", @@ -82,9 +81,9 @@ "object-hash": "^3.0.0", "pg": "~8.11.3", "pg-cursor": "~2.10.1", - "prisma": "^5.7.1", - "react": "^18.2.0", - "react-dom": "^18.2.0", + "prisma": "^5.17.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", "react-icons": "^4.10.1", "react-json-view": "^1.19.1", "react-use": "^17.4.0", @@ -92,12 +91,12 @@ "stable-hash": "0.0.3", "stopwatch-node": "^1.1.0", "timezones-list": "^3.0.2", - "tslib": "^2.4.0", + "tslib": "^2.6.3", "zod": "3.21.4", "zod-to-json-schema": "3.21.4" }, "devDependencies": { - "@ant-design/icons": "^5.0.1", + "@ant-design/icons": "^5.4.0", "@tailwindcss/typography": "^0.5.7", "@testing-library/jest-dom": "^6.1.3", "@testing-library/react": "^13.1.1", @@ -109,14 +108,14 @@ "@types/nodemailer": "^6.4.6", "@types/pg": "^8.6.5", "@types/pg-query-stream": "^3.4.0", - "@types/react": "18.0.28", - "@types/react-dom": "18.0.11", + "@types/react": "18.3.3", + "@types/react-dom": "18.3.0", "ansi-to-html": "^0.7.2", - "antd": "^5.2.1", + "antd": "^5.19.4", "autoprefixer": "^10.4.5", "dotenv-cli": "^6.0.0", "eslint": "8.24.0", - "eslint-config-next": "^13.3.0", + "eslint-config-next": "^14.2.5", "eslint-plugin-unused-imports": "^2.0.0", "jest": "^28.0.0", "less": "^4.1.2", @@ -126,9 +125,9 @@ "postcss": "^8.4.30", "raw-loader": "^4.0.2", "tailwindcss": "^3.0.24", - "ts-node": "~10.8.1", + "ts-node": "^10.9.2", "type-fest": "^3.5.7", - "typescript": "^5.3.3", - "zod-prisma": "0.5.4" + "typescript": "^5.5.4", + "zod-prisma": "^0.5.4" } } diff --git a/webapps/console/pages/[workspaceId]/index.tsx b/webapps/console/pages/[workspaceId]/index.tsx index e229aae3a..ab59ba8d8 100644 --- a/webapps/console/pages/[workspaceId]/index.tsx +++ b/webapps/console/pages/[workspaceId]/index.tsx @@ -84,7 +84,7 @@ function Card({ , }} items={actions.map(a => ({ ...a, collapsed: true }))} diff --git a/webapps/console/pages/[workspaceId]/settings/index.tsx b/webapps/console/pages/[workspaceId]/settings/index.tsx index b97e6c5ea..2215c5cb4 100644 --- a/webapps/console/pages/[workspaceId]/settings/index.tsx +++ b/webapps/console/pages/[workspaceId]/settings/index.tsx @@ -240,7 +240,7 @@ const WorkspaceSettingsComponent: React.FC = () => {
    Plans & Billing
    } href={"/settings/billing"} size="large" @@ -261,7 +261,7 @@ const WorkspaceSettingsComponent: React.FC = () => {
    API Access
    } href={"/user"} size="large" diff --git a/webapps/ee-api/package.json b/webapps/ee-api/package.json index b2bda82c5..8782c04f9 100644 --- a/webapps/ee-api/package.json +++ b/webapps/ee-api/package.json @@ -12,12 +12,12 @@ "@aws-sdk/client-s3": "^3.418.0", "@clickhouse/client": "^0.2.10", "@types/node": "^18.15.3", - "@types/react": "18.0.28", - "@types/react-dom": "18.0.11", + "@types/react": "18.3.3", + "@types/react-dom": "18.3.0", "crypto-js": "^4.1.1", "dayjs": "^1.11.10", "eslint": "8.29.0", - "eslint-config-next": "13.0.0", + "eslint-config-next": "14.2.5", "firebase-admin": "^11.11.0", "intercom-client": "^4.0.0", "is-valid-domain": "^0.1.6", @@ -25,13 +25,13 @@ "jsonwebtoken": "^9.0.2", "juava": "workspace:*", "lodash": "^4.17.21", - "next": "^13.5.6", + "next": "^14.2.5", "node-fetch-commonjs": "^3.2.4", "pg": "^8.11.3", - "react": "18.2.0", - "react-dom": "18.2.0", + "react": "18.3.1", + "react-dom": "18.3.1", "stripe": "^11.15.0", - "tslib": "^2.4.0" + "tslib": "^2.6.3" }, "devDependencies": { "@types/crypto-js": "^4.1.1", @@ -39,10 +39,10 @@ "@types/lodash": "^4.14.185", "@types/pg": "^8.6.5", "@types/stripe": "^8.0.417", - "raw-loader": "^4.0.2", "dotenv": "^16.3.1", "next-transpile-modules": "^10.0.1", + "raw-loader": "^4.0.2", "ts-node": "^10.9.2", - "typescript": "^5.3.3" + "typescript": "^5.5.4" } } From 5d22abfdf62b19dbca5bf0d16f247e567aafc4f3 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 31 Jul 2024 13:40:38 +0400 Subject: [PATCH 0827/1353] fix eslint error --- libs/jsondiffpatch/src/processor.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/jsondiffpatch/src/processor.ts b/libs/jsondiffpatch/src/processor.ts index d5a3da7bf..41c9a0dd7 100644 --- a/libs/jsondiffpatch/src/processor.ts +++ b/libs/jsondiffpatch/src/processor.ts @@ -31,6 +31,7 @@ class Processor { let pipe = pipeArg; if (typeof name === "string") { if (typeof pipe === "undefined") { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion return this.pipes[name as keyof typeof this.pipes]!; } else { this.pipes[name as keyof typeof this.pipes] = pipe as Pipe< From b962e51c4ea7388995b2c676e4ae0a84a1ca2709 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 31 Jul 2024 13:54:14 +0400 Subject: [PATCH 0828/1353] upgrade eslint --- libs/jsondiffpatch/package.json | 6 +- pnpm-lock.yaml | 620 ++++++-------------------------- webapps/console/package.json | 4 +- webapps/ee-api/package.json | 2 +- 4 files changed, 122 insertions(+), 510 deletions(-) diff --git a/libs/jsondiffpatch/package.json b/libs/jsondiffpatch/package.json index 2f3f0f25c..359c9f1c3 100644 --- a/libs/jsondiffpatch/package.json +++ b/libs/jsondiffpatch/package.json @@ -33,9 +33,9 @@ }, "devDependencies": { "@types/jest": "^29.5.10", - "@typescript-eslint/eslint-plugin": "^6.13.1", - "@typescript-eslint/parser": "^6.13.1", - "eslint": "^8.55.0", + "@typescript-eslint/eslint-plugin": "^7.18.0", + "@typescript-eslint/parser": "^7.18.0", + "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "jest": "^29.7.0", "ts-jest": "^29.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e899f9227..7274daee1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -541,13 +541,13 @@ importers: specifier: ^29.5.10 version: 29.5.12 '@typescript-eslint/eslint-plugin': - specifier: ^6.13.1 - version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.5.4) + specifier: ^7.18.0 + version: 7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/parser': - specifier: ^6.13.1 - version: 6.21.0(eslint@8.57.0)(typescript@5.5.4) + specifier: ^7.18.0 + version: 7.18.0(eslint@8.57.0)(typescript@5.5.4) eslint: - specifier: ^8.55.0 + specifier: ^8.57.0 version: 8.57.0 eslint-config-prettier: specifier: ^9.1.0 @@ -1071,14 +1071,14 @@ importers: specifier: ^6.0.0 version: 6.0.0 eslint: - specifier: 8.24.0 - version: 8.24.0 + specifier: ^8.57.0 + version: 8.57.0 eslint-config-next: specifier: ^14.2.5 - version: 14.2.5(eslint@8.24.0)(typescript@5.5.4) + version: 14.2.5(eslint@8.57.0)(typescript@5.5.4) eslint-plugin-unused-imports: - specifier: ^2.0.0 - version: 2.0.0(eslint@8.24.0) + specifier: ^4.0.1 + version: 4.0.1(eslint@8.57.0) jest: specifier: ^28.0.0 version: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2) @@ -1140,11 +1140,11 @@ importers: specifier: ^1.11.10 version: 1.11.12 eslint: - specifier: 8.29.0 - version: 8.29.0 + specifier: ^8.57.0 + version: 8.57.0 eslint-config-next: specifier: 14.2.5 - version: 14.2.5(eslint@8.29.0)(typescript@5.5.4) + version: 14.2.5(eslint@8.57.0)(typescript@5.5.4) firebase-admin: specifier: ^11.11.0 version: 11.11.1 @@ -3711,22 +3711,6 @@ packages: resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - /@eslint/eslintrc@1.4.1: - resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.6 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - /@eslint/eslintrc@2.1.4: resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4371,18 +4355,6 @@ packages: - encoding dev: false - /@humanwhocodes/config-array@0.10.7: - resolution: {integrity: sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.6 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - /@humanwhocodes/config-array@0.11.14: resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} @@ -4394,19 +4366,10 @@ packages: transitivePeerDependencies: - supports-color - /@humanwhocodes/gitignore-to-minimatch@1.0.2: - resolution: {integrity: sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==} - dev: true - /@humanwhocodes/module-importer@1.0.1: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - /@humanwhocodes/object-schema@1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - deprecated: Use @eslint/object-schema instead - dev: true - /@humanwhocodes/object-schema@2.0.3: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead @@ -8350,29 +8313,27 @@ packages: - supports-color dev: false - /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.5.4): - resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.0)(typescript@5.5.4): + resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.6 + '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 7.18.0 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - semver: 7.6.3 ts-api-utils: 1.3.0(typescript@5.5.4) typescript: 5.5.4 transitivePeerDependencies: @@ -8412,28 +8373,7 @@ packages: - supports-color dev: false - /@typescript-eslint/parser@6.21.0(eslint@8.24.0)(typescript@5.5.4): - resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.6 - eslint: 8.24.0 - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/parser@6.21.0(eslint@8.29.0)(typescript@5.5.4): + /@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4): resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -8448,26 +8388,25 @@ packages: '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.3.6 - eslint: 8.29.0 + eslint: 8.57.0 typescript: 5.5.4 transitivePeerDependencies: - supports-color - dev: false - /@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4): - resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4): + resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 6.21.0 + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 7.18.0 debug: 4.3.6 eslint: 8.57.0 typescript: 5.5.4 @@ -8490,6 +8429,14 @@ packages: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 + /@typescript-eslint/scope-manager@7.18.0: + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} + engines: {node: ^18.18.0 || >=20.0.0} + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + dev: true + /@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.5.4): resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -8510,18 +8457,18 @@ packages: - supports-color dev: false - /@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.5.4): - resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/type-utils@7.18.0(eslint@8.57.0)(typescript@5.5.4): + resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) debug: 4.3.6 eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.5.4) @@ -8539,6 +8486,11 @@ packages: resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/types@7.18.0: + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} + engines: {node: ^18.18.0 || >=20.0.0} + dev: true + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.5.4): resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -8581,6 +8533,28 @@ packages: transitivePeerDependencies: - supports-color + /@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4): + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.3.6 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.5.4): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -8601,20 +8575,17 @@ packages: - typescript dev: false - /@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.5.4): - resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/utils@7.18.0(eslint@8.57.0)(typescript@5.5.4): + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^8.56.0 dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) eslint: 8.57.0 - semver: 7.6.3 transitivePeerDependencies: - supports-color - typescript @@ -8635,6 +8606,14 @@ packages: '@typescript-eslint/types': 6.21.0 eslint-visitor-keys: 3.4.3 + /@typescript-eslint/visitor-keys@7.18.0: + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} + engines: {node: ^18.18.0 || >=20.0.0} + dependencies: + '@typescript-eslint/types': 7.18.0 + eslint-visitor-keys: 3.4.3 + dev: true + /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -12579,32 +12558,7 @@ packages: source-map: 0.6.1 dev: false - /eslint-config-next@14.2.5(eslint@8.24.0)(typescript@5.5.4): - resolution: {integrity: sha512-zogs9zlOiZ7ka+wgUnmcM0KBEDjo4Jis7kxN1jvC0N4wynQ2MIx/KBkg4mVF63J5EK4W0QMCn7xO3vNisjaAoA==} - peerDependencies: - eslint: ^7.23.0 || ^8.0.0 - typescript: '>=3.3.1' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@next/eslint-plugin-next': 14.2.5 - '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/parser': 6.21.0(eslint@8.24.0)(typescript@5.5.4) - eslint: 8.24.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.24.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.24.0) - eslint-plugin-jsx-a11y: 6.9.0(eslint@8.24.0) - eslint-plugin-react: 7.35.0(eslint@8.24.0) - eslint-plugin-react-hooks: 4.6.2(eslint@8.24.0) - typescript: 5.5.4 - transitivePeerDependencies: - - eslint-import-resolver-webpack - - supports-color - dev: true - - /eslint-config-next@14.2.5(eslint@8.29.0)(typescript@5.5.4): + /eslint-config-next@14.2.5(eslint@8.57.0)(typescript@5.5.4): resolution: {integrity: sha512-zogs9zlOiZ7ka+wgUnmcM0KBEDjo4Jis7kxN1jvC0N4wynQ2MIx/KBkg4mVF63J5EK4W0QMCn7xO3vNisjaAoA==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 @@ -12615,19 +12569,18 @@ packages: dependencies: '@next/eslint-plugin-next': 14.2.5 '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/parser': 6.21.0(eslint@8.29.0)(typescript@5.5.4) - eslint: 8.29.0 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.4) + eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.29.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.29.0) - eslint-plugin-jsx-a11y: 6.9.0(eslint@8.29.0) - eslint-plugin-react: 7.35.0(eslint@8.29.0) - eslint-plugin-react-hooks: 4.6.2(eslint@8.29.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) + eslint-plugin-react: 7.35.0(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) typescript: 5.5.4 transitivePeerDependencies: - eslint-import-resolver-webpack - supports-color - dev: false /eslint-config-prettier@9.1.0(eslint@8.57.0): resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} @@ -12682,7 +12635,7 @@ packages: transitivePeerDependencies: - supports-color - /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.24.0): + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -12691,32 +12644,9 @@ packages: dependencies: debug: 4.3.6 enhanced-resolve: 5.17.1 - eslint: 8.24.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.24.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.24.0) - fast-glob: 3.3.2 - get-tsconfig: 4.7.6 - is-core-module: 2.15.0 - is-glob: 4.0.3 - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-node - - eslint-import-resolver-webpack - - supports-color - dev: true - - /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.29.0): - resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' - dependencies: - debug: 4.3.6 - enhanced-resolve: 5.17.1 - eslint: 8.29.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.29.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.29.0) + eslint: 8.57.0 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.6 is-core-module: 2.15.0 @@ -12726,7 +12656,6 @@ packages: - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - dev: false /eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} @@ -12757,37 +12686,7 @@ packages: - supports-color dev: false - /eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.24.0): - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.24.0)(typescript@5.5.4) - debug: 3.2.7(supports-color@5.5.0) - eslint: 8.24.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.24.0) - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.29.0): + /eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} engines: {node: '>=4'} peerDependencies: @@ -12808,14 +12707,13 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.29.0)(typescript@5.5.4) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.4) debug: 3.2.7(supports-color@5.5.0) - eslint: 8.29.0 + eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.29.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) transitivePeerDependencies: - supports-color - dev: false /eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0): resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} @@ -12867,7 +12765,7 @@ packages: - supports-color dev: false - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.24.0): + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} peerDependencies: @@ -12877,51 +12775,16 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.24.0)(typescript@5.5.4) - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7(supports-color@5.5.0) - doctrine: 2.1.0 - eslint: 8.24.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.24.0) - hasown: 2.0.2 - is-core-module: 2.15.0 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.0 - semver: 6.3.1 - tsconfig-paths: 3.15.0 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: true - - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.29.0): - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.29.0)(typescript@5.5.4) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.4) array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 debug: 3.2.7(supports-color@5.5.0) doctrine: 2.1.0 - eslint: 8.29.0 + eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.29.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.15.0 is-glob: 4.0.3 @@ -12935,7 +12798,6 @@ packages: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - dev: false /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.57.0)(jest@27.5.1)(typescript@5.5.4): resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} @@ -12959,56 +12821,6 @@ packages: - typescript dev: false - /eslint-plugin-jsx-a11y@6.9.0(eslint@8.24.0): - resolution: {integrity: sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - dependencies: - aria-query: 5.1.3 - array-includes: 3.1.8 - array.prototype.flatmap: 1.3.2 - ast-types-flow: 0.0.8 - axe-core: 4.10.0 - axobject-query: 3.1.1 - damerau-levenshtein: 1.0.8 - emoji-regex: 9.2.2 - es-iterator-helpers: 1.0.19 - eslint: 8.24.0 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - language-tags: 1.0.9 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - safe-regex-test: 1.0.3 - string.prototype.includes: 2.0.0 - dev: true - - /eslint-plugin-jsx-a11y@6.9.0(eslint@8.29.0): - resolution: {integrity: sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - dependencies: - aria-query: 5.1.3 - array-includes: 3.1.8 - array.prototype.flatmap: 1.3.2 - ast-types-flow: 0.0.8 - axe-core: 4.10.0 - axobject-query: 3.1.1 - damerau-levenshtein: 1.0.8 - emoji-regex: 9.2.2 - es-iterator-helpers: 1.0.19 - eslint: 8.29.0 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - language-tags: 1.0.9 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - safe-regex-test: 1.0.3 - string.prototype.includes: 2.0.0 - dev: false - /eslint-plugin-jsx-a11y@6.9.0(eslint@8.57.0): resolution: {integrity: sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==} engines: {node: '>=4.0'} @@ -13032,25 +12844,6 @@ packages: object.fromentries: 2.0.8 safe-regex-test: 1.0.3 string.prototype.includes: 2.0.0 - dev: false - - /eslint-plugin-react-hooks@4.6.2(eslint@8.24.0): - resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - dependencies: - eslint: 8.24.0 - dev: true - - /eslint-plugin-react-hooks@4.6.2(eslint@8.29.0): - resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - dependencies: - eslint: 8.29.0 - dev: false /eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} @@ -13059,61 +12852,6 @@ packages: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: eslint: 8.57.0 - dev: false - - /eslint-plugin-react@7.35.0(eslint@8.24.0): - resolution: {integrity: sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - dependencies: - array-includes: 3.1.8 - array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.2 - array.prototype.tosorted: 1.1.4 - doctrine: 2.1.0 - es-iterator-helpers: 1.0.19 - eslint: 8.24.0 - estraverse: 5.3.0 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 - object.entries: 1.1.8 - object.fromentries: 2.0.8 - object.values: 1.2.0 - prop-types: 15.8.1 - resolve: 2.0.0-next.5 - semver: 6.3.1 - string.prototype.matchall: 4.0.11 - string.prototype.repeat: 1.0.0 - dev: true - - /eslint-plugin-react@7.35.0(eslint@8.29.0): - resolution: {integrity: sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - dependencies: - array-includes: 3.1.8 - array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.2 - array.prototype.tosorted: 1.1.4 - doctrine: 2.1.0 - es-iterator-helpers: 1.0.19 - eslint: 8.29.0 - estraverse: 5.3.0 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 - object.entries: 1.1.8 - object.fromentries: 2.0.8 - object.values: 1.2.0 - prop-types: 15.8.1 - resolve: 2.0.0-next.5 - semver: 6.3.1 - string.prototype.matchall: 4.0.11 - string.prototype.repeat: 1.0.0 - dev: false /eslint-plugin-react@7.35.0(eslint@8.57.0): resolution: {integrity: sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==} @@ -13140,7 +12878,6 @@ packages: semver: 6.3.1 string.prototype.matchall: 4.0.11 string.prototype.repeat: 1.0.0 - dev: false /eslint-plugin-testing-library@5.11.1(eslint@8.57.0)(typescript@5.5.4): resolution: {integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==} @@ -13155,17 +12892,17 @@ packages: - typescript dev: false - /eslint-plugin-unused-imports@2.0.0(eslint@8.24.0): - resolution: {integrity: sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /eslint-plugin-unused-imports@4.0.1(eslint@8.57.0): + resolution: {integrity: sha512-rax76s05z64uQgG9YXsWFmXrgjkaK79AvfeAWiSxhPP6RVGxeRaj4+2u+wxxu/mDy2pmJoOy1QTOEALMia2xGQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/eslint-plugin': ^5.0.0 - eslint: ^8.0.0 + '@typescript-eslint/eslint-plugin': ^8.0.0-0 + eslint: ^9.0.0 peerDependenciesMeta: '@typescript-eslint/eslint-plugin': optional: true dependencies: - eslint: 8.24.0 + eslint: 8.57.0 eslint-rule-composer: 0.3.0 dev: true @@ -13188,29 +12925,10 @@ packages: esrecurse: 4.3.0 estraverse: 5.3.0 - /eslint-utils@3.0.0(eslint@8.24.0): - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - dependencies: - eslint: 8.24.0 - eslint-visitor-keys: 2.1.0 - dev: true - - /eslint-utils@3.0.0(eslint@8.29.0): - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - dependencies: - eslint: 8.29.0 - eslint-visitor-keys: 2.1.0 - dev: false - /eslint-visitor-keys@2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} + dev: false /eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} @@ -13232,102 +12950,6 @@ packages: webpack: 5.93.0(webpack-cli@5.1.4) dev: false - /eslint@8.24.0: - resolution: {integrity: sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint/eslintrc': 1.4.1 - '@humanwhocodes/config-array': 0.10.7 - '@humanwhocodes/gitignore-to-minimatch': 1.0.2 - '@humanwhocodes/module-importer': 1.0.1 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.6 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-utils: 3.0.0(eslint@8.24.0) - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - globby: 11.1.0 - grapheme-splitter: 1.0.4 - ignore: 5.3.1 - import-fresh: 3.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - js-sdsl: 4.4.2 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - regexpp: 3.2.0 - strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint@8.29.0: - resolution: {integrity: sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint/eslintrc': 1.4.1 - '@humanwhocodes/config-array': 0.11.14 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.6 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-utils: 3.0.0(eslint@8.29.0) - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - grapheme-splitter: 1.0.4 - ignore: 5.3.1 - import-fresh: 3.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-sdsl: 4.4.2 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - regexpp: 3.2.0 - strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: false - /eslint@8.57.0: resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -14648,9 +14270,6 @@ packages: /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - /grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} @@ -17138,9 +16757,6 @@ packages: engines: {node: '>=14'} dev: false - /js-sdsl@4.4.2: - resolution: {integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==} - /js-sha256@0.9.0: resolution: {integrity: sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==} dev: false @@ -22875,10 +22491,6 @@ packages: es-errors: 1.3.0 set-function-name: 2.0.2 - /regexpp@3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} - /regexpu-core@5.3.2: resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} engines: {node: '>=4'} diff --git a/webapps/console/package.json b/webapps/console/package.json index a6ad281f0..6b39f0cfb 100644 --- a/webapps/console/package.json +++ b/webapps/console/package.json @@ -114,9 +114,9 @@ "antd": "^5.19.4", "autoprefixer": "^10.4.5", "dotenv-cli": "^6.0.0", - "eslint": "8.24.0", + "eslint": "^8.57.0", "eslint-config-next": "^14.2.5", - "eslint-plugin-unused-imports": "^2.0.0", + "eslint-plugin-unused-imports": "^4.0.1", "jest": "^28.0.0", "less": "^4.1.2", "less-loader": "^10.2.0", diff --git a/webapps/ee-api/package.json b/webapps/ee-api/package.json index 8782c04f9..e81d20ccd 100644 --- a/webapps/ee-api/package.json +++ b/webapps/ee-api/package.json @@ -16,7 +16,7 @@ "@types/react-dom": "18.3.0", "crypto-js": "^4.1.1", "dayjs": "^1.11.10", - "eslint": "8.29.0", + "eslint": "^8.57.0", "eslint-config-next": "14.2.5", "firebase-admin": "^11.11.0", "intercom-client": "^4.0.0", From 4cfa986b56fe4a19a1114bef55d3f6688a8b122c Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 31 Jul 2024 14:34:48 +0400 Subject: [PATCH 0829/1353] more deps upgrade --- libs/core-functions/package.json | 10 +- libs/core-functions/tsconfig.json | 7 +- libs/jitsu-js/package.json | 2 +- pnpm-lock.yaml | 591 ++++++++---------- services/rotor/package.json | 51 +- services/rotor/rollup.config.js | 28 - services/rotor/src/lib/clickhouse-logger.ts | 2 +- services/rotor/src/lib/maxmind.ts | 2 +- webapps/console/lib/server/clickhouse.ts | 2 +- webapps/console/package.json | 4 +- .../pages/api/[workspaceId]/sql/query.ts | 2 +- webapps/ee-api/lib/services.ts | 2 +- webapps/ee-api/package.json | 4 +- 13 files changed, 294 insertions(+), 413 deletions(-) delete mode 100644 services/rotor/rollup.config.js diff --git a/libs/core-functions/package.json b/libs/core-functions/package.json index bc9e377e2..d5bbd4e5a 100644 --- a/libs/core-functions/package.json +++ b/libs/core-functions/package.json @@ -23,14 +23,14 @@ "@jitsu/functions-lib": "workspace:*", "@jitsu/protocols": "workspace:*", "@jitsu/sdk-js": "^3.1.3", - "@types/jest": "^29.1.1", + "@types/jest": "^29.5.12", "@types/lodash": "^4.14.185", "@types/node": "^18.15.3", - "express": "^4.18.2", - "jest": "^29.5.0", + "express": "^4.19.2", + "jest": "^29.7.0", "json5": "^2.1.0", - "node-fetch-commonjs": "^3.2.4", - "ts-jest": "29.0.5" + "node-fetch-commonjs": "^3.3.2", + "ts-jest": "^29.2.3" }, "dependencies": { "@amplitude/ua-parser-js": "^0.7.33", diff --git a/libs/core-functions/tsconfig.json b/libs/core-functions/tsconfig.json index 0d8314b10..fbf2dc67c 100644 --- a/libs/core-functions/tsconfig.json +++ b/libs/core-functions/tsconfig.json @@ -5,9 +5,12 @@ "declaration": true, "esModuleInterop": true, "moduleResolution": "node", - "target": "ES2019", + "target": "ESNext", "module": "commonjs", - "lib": ["ES2019", "dom"], + "lib": [ + "ESNext", + "DOM" + ], "noEmit": true }, "exclude": [ diff --git a/libs/jitsu-js/package.json b/libs/jitsu-js/package.json index b29af8ecb..a96100fcb 100644 --- a/libs/jitsu-js/package.json +++ b/libs/jitsu-js/package.json @@ -37,7 +37,7 @@ "ejs": "^3.1.8", "express": "^4.18.2", "jest": "^29.2.2", - "node-fetch-commonjs": "^3.2.4", + "node-fetch-commonjs": "^3.3.2", "node-forge": "^1.3.1", "raw-loader": "^4.0.2", "rollup": "^3.2.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7274daee1..798ed1a2d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -361,7 +361,7 @@ importers: specifier: ^3.1.3 version: 3.1.5 '@types/jest': - specifier: ^29.1.1 + specifier: ^29.5.12 version: 29.5.12 '@types/lodash': specifier: ^4.14.185 @@ -370,20 +370,20 @@ importers: specifier: ^18.15.3 version: 18.19.42 express: - specifier: ^4.18.2 + specifier: ^4.19.2 version: 4.19.2 jest: - specifier: ^29.5.0 + specifier: ^29.7.0 version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) json5: specifier: ^2.1.0 version: 2.2.3 node-fetch-commonjs: - specifier: ^3.2.4 + specifier: ^3.3.2 version: 3.3.2 ts-jest: - specifier: 29.0.5 - version: 29.0.5(@babel/core@7.25.2)(jest@29.7.0)(typescript@5.5.4) + specifier: ^29.2.3 + version: 29.2.3(@babel/core@7.25.2)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.5.4) libs/functions: dependencies: @@ -474,7 +474,7 @@ importers: specifier: workspace:* version: link:../jsondiffpatch node-fetch-commonjs: - specifier: ^3.2.4 + specifier: ^3.3.2 version: 3.3.2 node-forge: specifier: ^1.3.1 @@ -593,11 +593,11 @@ importers: specifier: ^0.7.33 version: 0.7.33 '@aws-sdk/client-s3': - specifier: ^3.614.0 + specifier: ^3.621.0 version: 3.621.0 '@clickhouse/client': - specifier: ^0.2.10 - version: 0.2.10 + specifier: ^1.4.0 + version: 1.4.0 '@jitsu/core-functions': specifier: workspace:* version: link:../../libs/core-functions @@ -605,8 +605,8 @@ importers: specifier: workspace:* version: link:../../libs/functions '@maxmind/geoip2-node': - specifier: 4.2.0 - version: 4.2.0 + specifier: ^5.0.0 + version: 5.0.0 '@sensejs/kafkajs-zstd-support': specifier: ^0.11.0 version: 0.11.0(kafkajs@2.2.4) @@ -614,22 +614,16 @@ importers: specifier: ^2.7.2 version: 2.7.2 dayjs: - specifier: ^1.11.10 + specifier: ^1.11.12 version: 1.11.12 express: - specifier: ^4.18.2 + specifier: ^4.19.2 version: 4.19.2 - glob: - specifier: ^8.0.3 - version: 8.1.0 ioredis: - specifier: ^5.3.2 + specifier: ^5.4.1 version: 5.4.1 - json-grab: - specifier: 0.1.0-alpha.2 - version: 0.1.0-alpha.2 json5: - specifier: ^2.1.0 + specifier: ^2.2.3 version: 2.2.3 jsondiffpatch: specifier: workspace:* @@ -643,14 +637,11 @@ importers: kafkajs-snappy: specifier: ^1.1.0 version: 1.1.0 - minimist: - specifier: ^1.2.7 - version: 1.2.8 node-cache: specifier: ^5.1.2 version: 5.1.2 node-fetch-commonjs: - specifier: ^3.3.1 + specifier: ^3.3.2 version: 3.3.2 object-hash: specifier: ^3.0.0 @@ -659,20 +650,20 @@ importers: specifier: ^6.6.2 version: 6.6.2 pg: - specifier: ^8.11.3 - version: 8.11.6 + specifier: ^8.12.0 + version: 8.12.0 pg-cursor: - specifier: ~2.10.1 - version: 2.10.6(pg@8.11.6) + specifier: ^2.11.0 + version: 2.11.0(pg@8.12.0) prom-client: - specifier: ^14.2.0 - version: 14.2.0 + specifier: ^15.1.3 + version: 15.1.3 semver: - specifier: ^7.5.4 + specifier: ^7.6.3 version: 7.6.3 tar: - specifier: ^6.2.0 - version: 6.2.1 + specifier: ^7.4.3 + version: 7.4.3 tslib: specifier: ^2.6.3 version: 2.6.3 @@ -695,51 +686,24 @@ importers: '@jitsu/protocols': specifier: workspace:* version: link:../../types/protocols - '@rollup/plugin-babel': - specifier: ^6.0.4 - version: 6.0.4(@babel/core@7.25.2)(rollup@4.19.1) - '@rollup/plugin-commonjs': - specifier: ^26.0.1 - version: 26.0.1(rollup@4.19.1) - '@rollup/plugin-json': - specifier: ^6.1.0 - version: 6.1.0(rollup@4.19.1) - '@rollup/plugin-multi-entry': - specifier: ^6.0.1 - version: 6.0.1(rollup@4.19.1) - '@rollup/plugin-node-resolve': - specifier: ^15.2.3 - version: 15.2.3(rollup@4.19.1) - '@rollup/plugin-terser': - specifier: ^0.4.4 - version: 0.4.4(rollup@4.19.1) - '@rollup/plugin-typescript': - specifier: ^11.1.6 - version: 11.1.6(rollup@4.19.1)(tslib@2.6.3)(typescript@5.5.4) '@types/express': - specifier: ^4.17.13 + specifier: ^4.17.21 version: 4.17.21 - '@types/glob': - specifier: ^8.0.0 - version: 8.1.0 '@types/jest': specifier: ^29.5.11 version: 29.5.12 '@types/lodash': - specifier: ^4.14.200 + specifier: ^4.17.7 version: 4.17.7 - '@types/minimist': - specifier: ^1.2.2 - version: 1.2.5 '@types/node': specifier: ^18.15.3 version: 18.19.42 '@types/pg': - specifier: ^8.6.5 + specifier: ^8.11.6 version: 8.11.6 '@types/web': - specifier: 0.0.69 - version: 0.0.69 + specifier: ^0.0.152 + version: 0.0.152 '@types/webpack': specifier: ^5.28.5 version: 5.28.5(webpack-cli@5.1.4) @@ -759,8 +723,8 @@ importers: specifier: ^1.0.3 version: 1.0.3 dotenv-cli: - specifier: ^6.0.0 - version: 6.0.0 + specifier: ^7.4.2 + version: 7.4.2 jest: specifier: ^29.7.0 version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) @@ -771,11 +735,8 @@ importers: specifier: ^2.0.0 version: 2.0.0(webpack@5.93.0) nodemon: - specifier: ^2.0.20 - version: 2.0.22 - rollup: - specifier: ^4.19.1 - version: 4.19.1 + specifier: ^3.1.4 + version: 3.1.4 ts-jest: specifier: ^29.2.3 version: 29.2.3(@babel/core@7.25.2)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.5.4) @@ -806,8 +767,8 @@ importers: specifier: ^1.5.6 version: 1.21.0(react-dom@18.3.1)(react@18.3.1) '@clickhouse/client': - specifier: ^0.2.10 - version: 0.2.10 + specifier: ^1.4.0 + version: 1.4.0 '@dnd-kit/core': specifier: ^6.0.8 version: 6.1.0(react-dom@18.3.1)(react@18.3.1) @@ -959,7 +920,7 @@ importers: specifier: ^4.23.2 version: 4.24.7(next@14.2.5)(nodemailer@6.9.14)(react-dom@18.3.1)(react@18.3.1) node-fetch-commonjs: - specifier: ^3.2.4 + specifier: ^3.3.2 version: 3.3.2 node-sql-parser: specifier: ^4.6.5 @@ -1122,8 +1083,8 @@ importers: specifier: ^3.418.0 version: 3.621.0 '@clickhouse/client': - specifier: ^0.2.10 - version: 0.2.10 + specifier: ^1.4.0 + version: 1.4.0 '@types/node': specifier: ^18.15.3 version: 18.19.42 @@ -1170,7 +1131,7 @@ importers: specifier: ^14.2.5 version: 14.2.5(@babel/core@7.25.2)(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1) node-fetch-commonjs: - specifier: ^3.2.4 + specifier: ^3.3.2 version: 3.3.2 pg: specifier: ^8.11.3 @@ -2014,7 +1975,7 @@ packages: '@babel/traverse': 7.25.2 '@babel/types': 7.25.2 convert-source-map: 2.0.0 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -2105,7 +2066,7 @@ packages: '@babel/core': 7.25.2 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -3401,7 +3362,7 @@ packages: '@babel/parser': 7.25.0 '@babel/template': 7.25.0 '@babel/types': 7.25.2 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -3421,15 +3382,15 @@ packages: /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - /@clickhouse/client-common@0.2.10: - resolution: {integrity: sha512-BvTY0IXS96y9RUeNCpKL4HUzHmY80L0lDcGN0lmUD6zjOqYMn78+xyHYJ/AIAX7JQsc+/KwFt2soZutQTKxoGQ==} + /@clickhouse/client-common@1.4.0: + resolution: {integrity: sha512-kglG8YyWnR1K24RckUf5ZdNTN0U0s+a1j/bpCO4ZjzjO87ICgWlXFVD22pZqSACW7/2IIi1IkzbwtxKI2s/MOw==} dev: false - /@clickhouse/client@0.2.10: - resolution: {integrity: sha512-ZwBgzjEAFN/ogS0ym5KHVbR7Hx/oYCX01qGp2baEyfN2HM73kf/7Vp3GvMHWRy+zUXISONEtFv7UTViOXnmFrg==} + /@clickhouse/client@1.4.0: + resolution: {integrity: sha512-O4mbFPM/wQtFck01ghYI2mnNHv9jSFEiQBsTCH4t6MKeGHNAPkJGaFGv+KycLTv6zjnQNjiUGdXDMVRema5SyA==} engines: {node: '>=16'} dependencies: - '@clickhouse/client-common': 0.2.10 + '@clickhouse/client-common': 1.4.0 dev: false /@cspotcode/source-map-support@0.8.1: @@ -3716,7 +3677,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.1 @@ -4361,7 +4322,7 @@ packages: deprecated: Use @eslint/config-array instead dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -4393,6 +4354,13 @@ packages: wrap-ansi: 8.1.0 wrap-ansi-cjs: /wrap-ansi@7.0.0 + /@isaacs/fs-minipass@4.0.1: + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + dependencies: + minipass: 7.1.2 + dev: false + /@isaacs/string-locale-compare@1.1.0: resolution: {integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==} @@ -5078,7 +5046,7 @@ packages: /@kwsites/file-exists@1.1.1: resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} dependencies: - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) transitivePeerDependencies: - supports-color dev: false @@ -5133,8 +5101,8 @@ packages: - supports-color dev: true - /@maxmind/geoip2-node@4.2.0: - resolution: {integrity: sha512-TIyKmvdIjDtRRRZTM2tgm8vHoKH1Sxr7+r7g2bB+5+Uvho7M9/+gXMZalQMpqMtm2hKFq27qoHpMpqq82ycxQA==} + /@maxmind/geoip2-node@5.0.0: + resolution: {integrity: sha512-ki+q5//oU4tZ3BAhegZJcB5czoZyic5JSTEKbrUAQB/BzAoAiGyLW0immEmQvVVyy2SMlvBTJ3zqyRj8K9BbwQ==} dependencies: ip6addr: 0.2.5 maxmind: 4.3.20 @@ -5653,6 +5621,11 @@ packages: resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} dev: false + /@opentelemetry/api@1.9.0: + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + dev: false + /@panva/hkdf@1.2.1: resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==} dev: false @@ -6005,27 +5978,6 @@ packages: - supports-color dev: false - /@rollup/plugin-babel@6.0.4(@babel/core@7.25.2)(rollup@4.19.1): - resolution: {integrity: sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==} - engines: {node: '>=14.0.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@types/babel__core': ^7.1.9 - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - '@types/babel__core': - optional: true - rollup: - optional: true - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-imports': 7.24.7 - '@rollup/pluginutils': 5.1.0(rollup@4.19.1) - rollup: 4.19.1 - transitivePeerDependencies: - - supports-color - dev: true - /@rollup/plugin-commonjs@11.1.0(rollup@1.32.1): resolution: {integrity: sha512-Ycr12N3ZPN96Fw2STurD21jMqzKwL9QuFhms3SD7KKRK7oaXUsBU9Zt0jL/rOPHiPYisI21/rXGO3jr9BnLHUA==} engines: {node: '>= 8.0.0'} @@ -6096,24 +6048,6 @@ packages: rollup: 3.29.4 dev: true - /@rollup/plugin-commonjs@26.0.1(rollup@4.19.1): - resolution: {integrity: sha512-UnsKoZK6/aGIH6AdkptXhNvhaqftcjq3zZdT+LY5Ftms6JR06nADcDsYp5hTU9E2lbJUEOhdlY5J4DNTneM+jQ==} - engines: {node: '>=16.0.0 || 14 >= 14.17'} - peerDependencies: - rollup: ^2.68.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.19.1) - commondir: 1.0.1 - estree-walker: 2.0.2 - glob: 10.4.5 - is-reference: 1.2.1 - magic-string: 0.30.11 - rollup: 4.19.1 - dev: true - /@rollup/plugin-json@4.1.0(rollup@1.32.1): resolution: {integrity: sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==} peerDependencies: @@ -6149,19 +6083,6 @@ packages: rollup: 3.29.4 dev: true - /@rollup/plugin-json@6.1.0(rollup@4.19.1): - resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.19.1) - rollup: 4.19.1 - dev: true - /@rollup/plugin-multi-entry@6.0.1(rollup@3.29.4): resolution: {integrity: sha512-AXm6toPyTSfbYZWghQGbom1Uh7dHXlrGa+HoiYNhQtDUE3Q7LqoUYdVQx9E1579QWS1uOiu+cZRSE4okO7ySgw==} engines: {node: '>=14.0.0'} @@ -6176,20 +6097,6 @@ packages: rollup: 3.29.4 dev: true - /@rollup/plugin-multi-entry@6.0.1(rollup@4.19.1): - resolution: {integrity: sha512-AXm6toPyTSfbYZWghQGbom1Uh7dHXlrGa+HoiYNhQtDUE3Q7LqoUYdVQx9E1579QWS1uOiu+cZRSE4okO7ySgw==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - dependencies: - '@rollup/plugin-virtual': 3.0.2(rollup@4.19.1) - matched: 5.0.1 - rollup: 4.19.1 - dev: true - /@rollup/plugin-node-resolve@11.2.1(rollup@2.79.1): resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} engines: {node: '>= 10.0.0'} @@ -6223,24 +6130,6 @@ packages: rollup: 3.29.4 dev: true - /@rollup/plugin-node-resolve@15.2.3(rollup@4.19.1): - resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.78.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.19.1) - '@types/resolve': 1.20.2 - deepmerge: 4.3.1 - is-builtin-module: 3.2.1 - is-module: 1.0.0 - resolve: 1.22.8 - rollup: 4.19.1 - dev: true - /@rollup/plugin-node-resolve@6.1.0(rollup@1.32.1): resolution: {integrity: sha512-Cv7PDIvxdE40SWilY5WgZpqfIUEaDxFxs89zCAHjqyRwlTSuql4M5hjIuc5QYJkOH0/vyiyNXKD72O+LhRipGA==} engines: {node: '>= 8.0.0'} @@ -6307,21 +6196,6 @@ packages: terser: 5.31.3 dev: true - /@rollup/plugin-terser@0.4.4(rollup@4.19.1): - resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - dependencies: - rollup: 4.19.1 - serialize-javascript: 6.0.2 - smob: 1.5.0 - terser: 5.31.3 - dev: true - /@rollup/plugin-typescript@11.1.6(rollup@3.29.4)(tslib@2.6.3)(typescript@5.5.4): resolution: {integrity: sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==} engines: {node: '>=14.0.0'} @@ -6374,18 +6248,6 @@ packages: rollup: 3.29.4 dev: true - /@rollup/plugin-virtual@3.0.2(rollup@4.19.1): - resolution: {integrity: sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - dependencies: - rollup: 4.19.1 - dev: true - /@rollup/pluginutils@3.1.0(rollup@1.32.1): resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} engines: {node: '>= 8.0.0'} @@ -7900,9 +7762,12 @@ packages: /@types/glob@8.1.0: resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} + requiresBuild: true dependencies: '@types/minimatch': 5.1.2 '@types/node': 18.19.42 + dev: false + optional: true /@types/graceful-fs@4.1.9: resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} @@ -8006,10 +7871,6 @@ packages: /@types/minimatch@5.1.2: resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - /@types/minimist@1.2.5: - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - dev: true - /@types/ms@0.7.34: resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} dev: true @@ -8238,8 +8099,8 @@ packages: '@types/expect': 1.20.4 '@types/node': 18.19.42 - /@types/web@0.0.69: - resolution: {integrity: sha512-0CqMxeJ+ETljejsVQ5U6gV75C9zz9nmCBXHYqdfnVmWp54VfoJSxUgeO6NI+ezgBl0JQsSiZCs2pkCCT9ERhbA==} + /@types/web@0.0.152: + resolution: {integrity: sha512-Iu1OJ3ahq6/mwSK6jRKj2revI+avfPRWZOADcKeuv1AGCtkwbDl12AkWAl4KjiW2l4s2rkST7WagdhWOVGx9qg==} dev: true /@types/webidl-conversions@7.0.3: @@ -8301,7 +8162,7 @@ packages: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 @@ -8366,36 +8227,37 @@ packages: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) eslint: 8.57.0 typescript: 5.5.4 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4): - resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4): + resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.6 + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.3.6(supports-color@5.5.0) eslint: 8.57.0 typescript: 5.5.4 transitivePeerDependencies: - supports-color + dev: true - /@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4): - resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} - engines: {node: ^18.18.0 || >=20.0.0} + /@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4): + resolution: {integrity: sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^8.56.0 typescript: '*' @@ -8403,16 +8265,15 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.6 + '@typescript-eslint/scope-manager': 7.2.0 + '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 7.2.0 + debug: 4.3.6(supports-color@5.5.0) eslint: 8.57.0 typescript: 5.5.4 transitivePeerDependencies: - supports-color - dev: true /@typescript-eslint/scope-manager@5.62.0: resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} @@ -8422,13 +8283,6 @@ packages: '@typescript-eslint/visitor-keys': 5.62.0 dev: false - /@typescript-eslint/scope-manager@6.21.0: - resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - /@typescript-eslint/scope-manager@7.18.0: resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} engines: {node: ^18.18.0 || >=20.0.0} @@ -8437,6 +8291,13 @@ packages: '@typescript-eslint/visitor-keys': 7.18.0 dev: true + /@typescript-eslint/scope-manager@7.2.0: + resolution: {integrity: sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/visitor-keys': 7.2.0 + /@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.5.4): resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -8449,7 +8310,7 @@ packages: dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) eslint: 8.57.0 tsutils: 3.21.0(typescript@5.5.4) typescript: 5.5.4 @@ -8469,7 +8330,7 @@ packages: dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.5.4) typescript: 5.5.4 @@ -8482,15 +8343,15 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: false - /@typescript-eslint/types@6.21.0: - resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} - engines: {node: ^16.0.0 || >=18.0.0} - /@typescript-eslint/types@7.18.0: resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} dev: true + /@typescript-eslint/types@7.2.0: + resolution: {integrity: sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==} + engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.5.4): resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -8502,7 +8363,7 @@ packages: dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 semver: 7.6.3 @@ -8512,48 +8373,48 @@ packages: - supports-color dev: false - /@typescript-eslint/typescript-estree@6.21.0(typescript@5.5.4): - resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4): + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.6 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.3.6(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 - minimatch: 9.0.3 + minimatch: 9.0.5 semver: 7.6.3 ts-api-utils: 1.3.0(typescript@5.5.4) typescript: 5.5.4 transitivePeerDependencies: - supports-color + dev: true - /@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4): - resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} - engines: {node: ^18.18.0 || >=20.0.0} + /@typescript-eslint/typescript-estree@7.2.0(typescript@5.5.4): + resolution: {integrity: sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.6 + '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/visitor-keys': 7.2.0 + debug: 4.3.6(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 - minimatch: 9.0.5 + minimatch: 9.0.3 semver: 7.6.3 ts-api-utils: 1.3.0(typescript@5.5.4) typescript: 5.5.4 transitivePeerDependencies: - supports-color - dev: true /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.5.4): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} @@ -8599,13 +8460,6 @@ packages: eslint-visitor-keys: 3.4.3 dev: false - /@typescript-eslint/visitor-keys@6.21.0: - resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.21.0 - eslint-visitor-keys: 3.4.3 - /@typescript-eslint/visitor-keys@7.18.0: resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} @@ -8614,6 +8468,13 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /@typescript-eslint/visitor-keys@7.2.0: + resolution: {integrity: sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 7.2.0 + eslint-visitor-keys: 3.4.3 + /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -9038,7 +8899,7 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -9046,7 +8907,7 @@ packages: resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} dependencies: - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) transitivePeerDependencies: - supports-color dev: false @@ -9055,7 +8916,7 @@ packages: resolution: {integrity: sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==} engines: {node: '>= 8.0.0'} dependencies: - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) depd: 2.0.0 humanize-ms: 1.2.1 transitivePeerDependencies: @@ -9251,7 +9112,7 @@ packages: rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) rc-notification: 5.6.0(react-dom@18.3.1)(react@18.3.1) rc-pagination: 4.2.0(react-dom@18.3.1)(react@18.3.1) - rc-picker: 4.6.10(dayjs@1.11.12)(react-dom@18.3.1)(react@18.3.1) + rc-picker: 4.6.11(dayjs@1.11.12)(react-dom@18.3.1)(react@18.3.1) rc-progress: 4.0.0(react-dom@18.3.1)(react@18.3.1) rc-rate: 2.13.0(react-dom@18.3.1)(react@18.3.1) rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) @@ -10468,6 +10329,11 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} + /chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + dev: false + /chrome-trace-event@1.0.4: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} @@ -11527,7 +11393,7 @@ packages: dependencies: ms: 2.0.0 - /debug@3.2.7(supports-color@5.5.0): + /debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: supports-color: '*' @@ -11536,7 +11402,6 @@ packages: optional: true dependencies: ms: 2.1.3 - supports-color: 5.5.0 /debug@4.1.1: resolution: {integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==} @@ -11550,7 +11415,7 @@ packages: ms: 2.1.1 dev: true - /debug@4.3.6: + /debug@4.3.6(supports-color@5.5.0): resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} engines: {node: '>=6.0'} peerDependencies: @@ -11560,6 +11425,7 @@ packages: optional: true dependencies: ms: 2.1.2 + supports-color: 5.5.0 /debuglog@1.0.1: resolution: {integrity: sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==} @@ -11805,7 +11671,7 @@ packages: resolution: {integrity: sha512-f0ReSURdM3pcKPNS30mxOHSbaFLcknGmQjwSfmbcdOw1XWKXVhukM3NJHhr7NpY9BIyyWQb0EBo3KQvvuU5egQ==} engines: {node: '>= 8.0'} dependencies: - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) readable-stream: 3.6.2 split-ca: 1.0.1 ssh2: 1.15.0 @@ -11964,6 +11830,21 @@ packages: minimist: 1.2.8 dev: true + /dotenv-cli@7.4.2: + resolution: {integrity: sha512-SbUj8l61zIbzyhIbg0FwPJq6+wjbzdn9oEtozQpZ6kW2ihCcapKVZj49oCT3oPM+mgQm+itgvUQcG5szxVrZTA==} + hasBin: true + dependencies: + cross-spawn: 7.0.3 + dotenv: 16.4.5 + dotenv-expand: 10.0.0 + minimist: 1.2.8 + dev: true + + /dotenv-expand@10.0.0: + resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + engines: {node: '>=12'} + dev: true + /dotenv-expand@5.1.0: resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} dev: false @@ -12569,11 +12450,11 @@ packages: dependencies: '@next/eslint-plugin-next': 14.2.5 '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) @@ -12629,24 +12510,24 @@ packages: /eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} dependencies: - debug: 3.2.7(supports-color@5.5.0) + debug: 3.2.7 is-core-module: 2.15.0 resolve: 1.22.8 transitivePeerDependencies: - supports-color - /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '*' eslint-plugin-import: '*' dependencies: - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) enhanced-resolve: 5.17.1 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.6 is-core-module: 2.15.0 @@ -12679,14 +12560,14 @@ packages: optional: true dependencies: '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) - debug: 3.2.7(supports-color@5.5.0) + debug: 3.2.7 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color dev: false - /eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} engines: {node: '>=4'} peerDependencies: @@ -12707,11 +12588,11 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.4) - debug: 3.2.7(supports-color@5.5.0) + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4) + debug: 3.2.7 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) transitivePeerDependencies: - supports-color @@ -12745,7 +12626,7 @@ packages: array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 - debug: 3.2.7(supports-color@5.5.0) + debug: 3.2.7 doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 @@ -12765,7 +12646,7 @@ packages: - supports-color dev: false - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} peerDependencies: @@ -12775,16 +12656,16 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4) array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 - debug: 3.2.7(supports-color@5.5.0) + debug: 3.2.7 doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.15.0 is-glob: 4.0.3 @@ -12966,7 +12847,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -14614,7 +14495,7 @@ packages: dependencies: '@tootallnate/once': 1.1.2 agent-base: 6.0.2 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -14624,7 +14505,7 @@ packages: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -14663,7 +14544,7 @@ packages: engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -14672,7 +14553,7 @@ packages: engines: {node: '>= 14'} dependencies: agent-base: 7.1.1 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) transitivePeerDependencies: - supports-color dev: false @@ -14945,7 +14826,7 @@ packages: dependencies: '@ioredis/commands': 1.2.0 cluster-key-slot: 1.1.2 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -15389,7 +15270,7 @@ packages: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -16872,11 +16753,6 @@ packages: /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - /json-grab@0.1.0-alpha.2: - resolution: {integrity: sha512-9aoAuQ+32pyfOhsLbPfAY9cYg0XuUkhTw8FDDX2SS+9gsz+Z0VtnMjE0SLIlarfdJ9uVN+xTPoDeuWLNnWKQxw==} - engines: {node: 16.x} - dev: false - /json-parse-better-errors@1.0.2: resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} dev: true @@ -17059,7 +16935,7 @@ packages: dependencies: '@types/express': 4.17.21 '@types/jsonwebtoken': 9.0.6 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) jose: 4.15.9 limiter: 1.1.5 lru-memoizer: 2.3.0 @@ -17984,6 +17860,14 @@ packages: minipass: 3.3.6 yallist: 4.0.0 + /minizlib@3.0.1: + resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} + engines: {node: '>= 18'} + dependencies: + minipass: 7.1.2 + rimraf: 5.0.9 + dev: false + /mixwith@0.1.1: resolution: {integrity: sha512-DQsf/liljH/9e+94jR+xfK8vlKceeKdOM9H9UEXLwGuvEEpO6debNtJ9yt1ZKzPKPrwqGxzMdu0BR1fnQb6i4A==} dev: false @@ -18390,6 +18274,12 @@ packages: engines: {node: '>=10'} hasBin: true + /mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + dev: false + /mmdb-lib@2.1.1: resolution: {integrity: sha512-yx8H/1H5AfnufiLnzzPqPf4yr/dKU9IFT1rPVwSkrKWHsQEeVVd6+X+L0nUbXhlEFTu3y/7hu38CFmEVgzvyeg==} engines: {node: '>=10', npm: '>=6'} @@ -18817,18 +18707,18 @@ packages: engines: {node: '>=6.0.0'} dev: false - /nodemon@2.0.22: - resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} - engines: {node: '>=8.10.0'} + /nodemon@3.1.4: + resolution: {integrity: sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==} + engines: {node: '>=10'} hasBin: true dependencies: chokidar: 3.6.0 - debug: 3.2.7(supports-color@5.5.0) + debug: 4.3.6(supports-color@5.5.0) ignore-by-default: 1.0.1 minimatch: 3.1.2 pstree.remy: 1.1.8 - semver: 5.7.2 - simple-update-notifier: 1.1.0 + semver: 7.6.3 + simple-update-notifier: 2.0.0 supports-color: 5.5.0 touch: 3.1.1 undefsafe: 2.0.5 @@ -19349,7 +19239,7 @@ packages: resolution: {integrity: sha512-UJKdSzgd3KOnXXAtqN5+/eeHcvTn1hBkesEmElVgvO/NAYcxAvmjzIGmnNd3Tb/gRAvMBdNRFD4qAWdHxY6QXg==} engines: {node: '>=12.10.0'} dependencies: - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) p-queue: 6.6.2 transitivePeerDependencies: - supports-color @@ -19611,6 +19501,14 @@ packages: pg: 8.11.6 dev: true + /pg-cursor@2.11.0(pg@8.12.0): + resolution: {integrity: sha512-TLCOCtu+rqMarzjUi+/Ffc2DV5ZqO/27y5GqnK9Z3w51rWXMwC8FcO96Uf9/ORo5o+qRXEVJxM9Ts3K2K31MLg==} + peerDependencies: + pg: ^8 + dependencies: + pg: 8.12.0 + dev: false + /pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} @@ -21116,10 +21014,11 @@ packages: engines: {node: '>=0.4.0'} dev: false - /prom-client@14.2.0: - resolution: {integrity: sha512-sF308EhTenb/pDRPakm+WgiN+VdM/T1RaHj1x+MvAuT8UiQP8JmOEbxVqtkbfR4LrvOg5n7ic01kRBDGXjYikA==} - engines: {node: '>=10'} + /prom-client@15.1.3: + resolution: {integrity: sha512-6ZiOBfCywsD4k1BN9IX0uZhF+tJkV8q8llP64G5Hajs4JOeVLPCwpPVcpXy3BwYiUGgyJzsJJQeOIv7+hDSq8g==} + engines: {node: ^16 || ^18 || >=20} dependencies: + '@opentelemetry/api': 1.9.0 tdigest: 0.1.2 dev: false @@ -21652,8 +21551,8 @@ packages: shallowequal: 1.1.0 dev: false - /rc-picker@4.6.10(dayjs@1.11.12)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-wNtbwAalqqSmBco+VSxU0ggR9YgvdzdMUTm9bFYn+l3hXmAFyFikBN8xN/iSn3Bwdf6chhh+ANOZKEEIBiq/Fw==} + /rc-picker@4.6.11(dayjs@1.11.12)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-PEVH5MMTUrdvTTxCmPndsXiJL7TFLSu8q0cDdZrhdcjn8en3NbuhOFacWqKTvdnfG53RPPhiBssXCUHYyc3R/Q==} engines: {node: '>=8.x'} peerDependencies: date-fns: '>= 2.x' @@ -22636,7 +22535,7 @@ packages: engines: {node: '>=12'} requiresBuild: true dependencies: - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) extend: 3.0.2 transitivePeerDependencies: - supports-color @@ -22691,6 +22590,14 @@ packages: dependencies: glob: 7.2.3 + /rimraf@5.0.9: + resolution: {integrity: sha512-3i7b8OcswU6CpU8Ej89quJD4O98id7TtVM5U4Mybh84zQXdrFmDLouWBEEaD/QfO3gDDfH+AGFCGsR7kngzQnA==} + engines: {node: 14 >=14.20 || 16 >=16.20 || >=18} + hasBin: true + dependencies: + glob: 10.4.5 + dev: false + /rollup-plugin-babel@4.4.0(@babel/core@7.25.2)(rollup@1.32.1): resolution: {integrity: sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==} deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-babel. @@ -23055,11 +22962,6 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - /semver@7.0.0: - resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} - hasBin: true - dev: true - /semver@7.3.5: resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} engines: {node: '>=10'} @@ -23264,7 +23166,7 @@ packages: dependencies: '@kwsites/file-exists': 1.1.1 '@kwsites/promise-deferred': 1.1.1 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) transitivePeerDependencies: - supports-color dev: false @@ -23274,11 +23176,11 @@ packages: dependencies: is-arrayish: 0.3.2 - /simple-update-notifier@1.1.0: - resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} - engines: {node: '>=8.10.0'} + /simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} dependencies: - semver: 7.0.0 + semver: 7.6.3 dev: true /sisteransi@1.0.5: @@ -23327,7 +23229,7 @@ packages: engines: {node: '>= 10'} dependencies: agent-base: 6.0.2 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) socks: 2.8.3 transitivePeerDependencies: - supports-color @@ -23337,7 +23239,7 @@ packages: engines: {node: '>= 10'} dependencies: agent-base: 6.0.2 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) socks: 2.8.3 transitivePeerDependencies: - supports-color @@ -23443,7 +23345,7 @@ packages: /spdy-transport@3.0.0: resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} dependencies: - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) detect-node: 2.1.0 hpack.js: 2.1.6 obuf: 1.1.2 @@ -23457,7 +23359,7 @@ packages: resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} engines: {node: '>=6.0.0'} dependencies: - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) handle-thing: 2.0.1 http-deceiver: 1.2.7 select-hose: 2.0.0 @@ -24104,6 +24006,18 @@ packages: mkdirp: 1.0.4 yallist: 4.0.0 + /tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.1 + mkdirp: 3.0.1 + yallist: 5.0.0 + dev: false + /tdigest@0.1.2: resolution: {integrity: sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==} dependencies: @@ -24224,7 +24138,7 @@ packages: archiver: 5.3.2 async-lock: 1.4.1 byline: 5.0.0 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) docker-compose: 0.24.8 dockerode: 3.3.5 get-port: 5.1.1 @@ -24654,7 +24568,7 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: '@tufjs/models': 1.0.4 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) make-fetch-happen: 11.1.1 transitivePeerDependencies: - supports-color @@ -26045,6 +25959,11 @@ packages: /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + /yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + dev: false + /yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} @@ -26123,7 +26042,7 @@ packages: cli-table: 0.3.11 commander: 7.1.0 dateformat: 4.6.3 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) diff: 5.2.0 error: 10.4.0 escape-string-regexp: 4.0.0 @@ -26167,7 +26086,7 @@ packages: dependencies: chalk: 4.1.2 dargs: 7.0.0 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) execa: 5.1.1 github-username: 6.0.0 lodash: 4.17.21 diff --git a/services/rotor/package.json b/services/rotor/package.json index d394548b2..a150a121c 100644 --- a/services/rotor/package.json +++ b/services/rotor/package.json @@ -21,67 +21,54 @@ "@amplitude/ua-parser-js": "^0.7.33", "@jitsu/core-functions": "workspace:*", "@jitsu/functions-lib": "workspace:*", - "@maxmind/geoip2-node": "4.2.0", + "@maxmind/geoip2-node": "^5.0.0", "@sensejs/kafkajs-zstd-support": "^0.11.0", "@types/pg-cursor": "^2.7.2", - "@aws-sdk/client-s3": "^3.614.0", - "dayjs": "^1.11.10", - "express": "^4.18.2", - "glob": "^8.0.3", - "ioredis": "^5.3.2", - "json-grab": "0.1.0-alpha.2", - "json5": "^2.1.0", + "@aws-sdk/client-s3": "^3.621.0", + "dayjs": "^1.11.12", + "express": "^4.19.2", + "ioredis": "^5.4.1", + "json5": "^2.2.3", "juava": "workspace:*", "kafkajs": "^2.2.4", "kafkajs-snappy": "^1.1.0", - "minimist": "^1.2.7", "node-cache": "^5.1.2", - "node-fetch-commonjs": "^3.3.1", + "node-fetch-commonjs": "^3.3.2", "object-hash": "^3.0.0", "p-queue": "^6.6.2", - "pg": "^8.11.3", - "pg-cursor": "~2.10.1", - "prom-client": "^14.2.0", - "tar": "^6.2.0", + "pg": "^8.12.0", + "pg-cursor": "^2.11.0", + "prom-client": "^15.1.3", + "tar": "^7.4.3", "tslib": "^2.6.3", "jsondiffpatch": "workspace:*", - "@clickhouse/client": "^0.2.10", - "semver": "^7.5.4" + "@clickhouse/client": "^1.4.0", + "semver": "^7.6.3" }, "devDependencies": { "@babel/preset-env": "^7.25.2", "@babel/preset-react": "^7.24.7", "@babel/preset-typescript": "^7.24.7", "@jitsu/protocols": "workspace:*", - "@rollup/plugin-babel": "^6.0.4", - "@rollup/plugin-commonjs": "^26.0.1", - "@rollup/plugin-json": "^6.1.0", - "@rollup/plugin-multi-entry": "^6.0.1", - "@rollup/plugin-node-resolve": "^15.2.3", - "@rollup/plugin-terser": "^0.4.4", - "@rollup/plugin-typescript": "^11.1.6", - "@types/glob": "^8.0.0", "@types/jest": "^29.5.11", - "@types/lodash": "^4.14.200", - "@types/minimist": "^1.2.2", + "@types/lodash": "^4.17.7", "@types/node": "^18.15.3", - "@types/pg": "^8.6.5", - "@types/web": "0.0.69", + "@types/pg": "^8.11.6", + "@types/web": "^0.0.152", "@types/webpack": "^5.28.5", - "@types/express": "^4.17.13", + "@types/express": "^4.17.21", "@webpack-cli/generators": "^3.0.7", "babel-loader": "^9.1.3", "clean-webpack-plugin": "^4.0.0", "copy-webpack-plugin": "^12.0.2", "declaration-bundler-webpack-plugin": "^1.0.3", - "dotenv-cli": "^6.0.0", + "dotenv-cli": "^7.4.2", "jest": "^29.7.0", "@jest/globals": "^29.7.0", "@jest/types": "^29.6.3", "lodash": "^4.17.21", "node-loader": "^2.0.0", - "nodemon": "^2.0.20", - "rollup": "^4.19.1", + "nodemon": "^3.1.4", "ts-jest": "^29.2.3", "ts-loader": "^9.4.2", "ts-node": "^10.9.2", diff --git a/services/rotor/rollup.config.js b/services/rotor/rollup.config.js deleted file mode 100644 index 210c385be..000000000 --- a/services/rotor/rollup.config.js +++ /dev/null @@ -1,28 +0,0 @@ -const multi = require("@rollup/plugin-multi-entry"); -const resolve = require("@rollup/plugin-node-resolve"); -const commonjs = require("@rollup/plugin-commonjs"); -const rollupJson = require("@rollup/plugin-json"); -const babel = require("@rollup/plugin-babel"); -const typescript = require("@rollup/plugin-typescript"); - -module.exports = [ - { - plugins: [ - multi(), - resolve({ preferBuiltins: false }), - commonjs(), - rollupJson(), - babel({ - babelHelpers: "inline", - babelrc: false, - extensions: [".js", ".ts"], - }), - ], - input: "./compiled/index.js", - output: { - file: `dist/rotor.js`, - format: "iife", - sourcemap: true, - }, - }, -]; diff --git a/services/rotor/src/lib/clickhouse-logger.ts b/services/rotor/src/lib/clickhouse-logger.ts index 11baa7384..d5d54ded5 100644 --- a/services/rotor/src/lib/clickhouse-logger.ts +++ b/services/rotor/src/lib/clickhouse-logger.ts @@ -27,7 +27,7 @@ export function createClickhouseLogger(): EventsStore { const metricsSchema = process.env.CLICKHOUSE_METRICS_SCHEMA || process.env.CLICKHOUSE_DATABASE || "newjitsu_metrics"; const clickhouse = createClient({ - host: clickhouseHost(), + url: clickhouseHost(), username: process.env.CLICKHOUSE_USERNAME || "default", password: requireDefined(process.env.CLICKHOUSE_PASSWORD, `env CLICKHOUSE_PASSWORD is not defined`), clickhouse_settings: { diff --git a/services/rotor/src/lib/maxmind.ts b/services/rotor/src/lib/maxmind.ts index be9618f80..6254bd2bb 100644 --- a/services/rotor/src/lib/maxmind.ts +++ b/services/rotor/src/lib/maxmind.ts @@ -288,7 +288,7 @@ async function loadFromURL(url: string): Promise { async function untar(b: Buffer): Promise { return new Promise((resolve, reject) => { const gunzip = zlib.createGunzip(); - const tarParser = new tar.Parse(); + const tarParser = new tar.Parser(); tarParser.on("entry", entry => { if (entry.type === "File" && entry.path.endsWith(".mmdb")) { const chunks: Buffer[] = []; diff --git a/webapps/console/lib/server/clickhouse.ts b/webapps/console/lib/server/clickhouse.ts index 12764cefb..4d08ac8cb 100644 --- a/webapps/console/lib/server/clickhouse.ts +++ b/webapps/console/lib/server/clickhouse.ts @@ -12,7 +12,7 @@ function clickhouseHost() { } export const clickhouse = createClient({ - host: clickhouseHost(), + url: clickhouseHost(), username: process.env.CLICKHOUSE_USERNAME || "default", password: requireDefined(process.env.CLICKHOUSE_PASSWORD, `env CLICKHOUSE_PASSWORD is not defined`), }); diff --git a/webapps/console/package.json b/webapps/console/package.json index 6b39f0cfb..b2d7105f5 100644 --- a/webapps/console/package.json +++ b/webapps/console/package.json @@ -24,7 +24,7 @@ }, "dependencies": { "@ant-design/cssinjs": "^1.5.6", - "@clickhouse/client": "^0.2.10", + "@clickhouse/client": "^1.4.0", "@dnd-kit/core": "^6.0.8", "@dnd-kit/modifiers": "^6.0.1", "@dnd-kit/sortable": "^7.0.2", @@ -75,7 +75,7 @@ "monaco-editor": "^0.50.0", "next": "^14.2.5", "next-auth": "^4.23.2", - "node-fetch-commonjs": "^3.2.4", + "node-fetch-commonjs": "^3.3.2", "node-sql-parser": "^4.6.5", "nodemailer": "^6.8.0", "object-hash": "^3.0.0", diff --git a/webapps/console/pages/api/[workspaceId]/sql/query.ts b/webapps/console/pages/api/[workspaceId]/sql/query.ts index 7b482b633..c96f36cc6 100644 --- a/webapps/console/pages/api/[workspaceId]/sql/query.ts +++ b/webapps/console/pages/api/[workspaceId]/sql/query.ts @@ -15,7 +15,7 @@ export const getClickhouseClient = (workspaceId: string, cred: ClickhouseCredent const url = `https://${host}:${port}/`; log.atDebug().log(`Connecting to ${url} with ${cred.username}`); return createClient({ - host: url, + url: url, database: cred.database, username: cred.username, password: cred.password, diff --git a/webapps/ee-api/lib/services.ts b/webapps/ee-api/lib/services.ts index 4d8d8775b..354acf749 100644 --- a/webapps/ee-api/lib/services.ts +++ b/webapps/ee-api/lib/services.ts @@ -12,7 +12,7 @@ export const store = getPostgresStore(pg, { tableName: "newjitsuee.kvstore" }); export const telemetryDb = createPg(process.env.TELEMETRY_DATABASE_URL || dbUrl, { connectionName: "telemetry" }); export const clickhouse = createClient({ - host: requireDefined(process.env.CLICKHOUSE_URL, `env CLICKHOUSE_URL is not defined`), + url: requireDefined(process.env.CLICKHOUSE_URL, `env CLICKHOUSE_URL is not defined`), username: process.env.CLICKHOUSE_USERNAME || "default", password: requireDefined(process.env.CLICKHOUSE_PASSWORD, `env CLICKHOUSE_PASSWORD is not defined`), }); diff --git a/webapps/ee-api/package.json b/webapps/ee-api/package.json index e81d20ccd..0b8f6168c 100644 --- a/webapps/ee-api/package.json +++ b/webapps/ee-api/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "@aws-sdk/client-s3": "^3.418.0", - "@clickhouse/client": "^0.2.10", + "@clickhouse/client": "^1.4.0", "@types/node": "^18.15.3", "@types/react": "18.3.3", "@types/react-dom": "18.3.0", @@ -26,7 +26,7 @@ "juava": "workspace:*", "lodash": "^4.17.21", "next": "^14.2.5", - "node-fetch-commonjs": "^3.2.4", + "node-fetch-commonjs": "^3.3.2", "pg": "^8.11.3", "react": "18.3.1", "react-dom": "18.3.1", From 03eaf77fb26e5eba035973752ef41e928947eed4 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 6 Aug 2024 13:45:11 +0400 Subject: [PATCH 0830/1353] more deps upgrade --- libs/core-functions/package.json | 4 +- .../src/functions/posthog-destination.ts | 2 +- package.json | 2 +- pnpm-lock.yaml | 1328 ++++++----------- .../Billing/BillingBlockingDialog.tsx | 6 +- .../ConfigObjectEditor/ConfigEditor.tsx | 2 - webapps/console/lib/modal.tsx | 2 +- webapps/console/package.json | 14 +- .../pages/[workspaceId]/destinations.tsx | 12 +- .../console/pages/[workspaceId]/services.tsx | 16 +- webapps/ee-api/package.json | 4 +- 11 files changed, 502 insertions(+), 890 deletions(-) diff --git a/libs/core-functions/package.json b/libs/core-functions/package.json index d5bbd4e5a..dec52bc0b 100644 --- a/libs/core-functions/package.json +++ b/libs/core-functions/package.json @@ -46,8 +46,8 @@ "mongodb": "^6.7.0", "node-cache": "^5.1.2", "parse-duration": "^1.1.0", - "posthog-node": "^2.4.0", + "posthog-node": "^4.0.1", "tslib": "^2.6.3", - "zod": "3.21.4" + "zod": "^3.23.8" } } diff --git a/libs/core-functions/src/functions/posthog-destination.ts b/libs/core-functions/src/functions/posthog-destination.ts index c40d139f2..06e64d712 100644 --- a/libs/core-functions/src/functions/posthog-destination.ts +++ b/libs/core-functions/src/functions/posthog-destination.ts @@ -150,7 +150,7 @@ const PosthogDestination: JitsuFunction=1000", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 798ed1a2d..185cfaa3c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,8 +33,8 @@ importers: specifier: ^5.5.4 version: 5.5.4 vercel: - specifier: ^32.3.1 - version: 32.7.2 + specifier: ^35.2.3 + version: 35.2.3 cli/build-scripts: dependencies: @@ -342,14 +342,14 @@ importers: specifier: ^1.1.0 version: 1.1.0 posthog-node: - specifier: ^2.4.0 - version: 2.6.0 + specifier: ^4.0.1 + version: 4.0.1 tslib: specifier: ^2.6.3 version: 2.6.3 zod: - specifier: 3.21.4 - version: 3.21.4 + specifier: ^3.23.8 + version: 3.23.8 devDependencies: '@jitsu/functions-lib': specifier: workspace:* @@ -866,11 +866,11 @@ importers: specifier: ^19.0.0 version: 19.0.3 firebase: - specifier: ^10.4.0 - version: 10.12.4 + specifier: ^10.12.5 + version: 10.12.5 firebase-admin: - specifier: ^11.11.0 - version: 11.11.1 + specifier: ^12.3.0 + version: 12.3.0 google-ads-api: specifier: ^16.0.0-rest-beta3 version: 16.0.0-rest-beta3 @@ -905,7 +905,7 @@ importers: specifier: ^0.263.1 version: 0.263.1(react@18.3.1) mjml: - specifier: ^4.13.0 + specifier: ^4.15.3 version: 4.15.3 mjml-react: specifier: ^2.0.8 @@ -971,11 +971,11 @@ importers: specifier: ^2.6.3 version: 2.6.3 zod: - specifier: 3.21.4 - version: 3.21.4 + specifier: ^3.23.8 + version: 3.23.8 zod-to-json-schema: - specifier: 3.21.4 - version: 3.21.4(zod@3.21.4) + specifier: ^3.23.2 + version: 3.23.2(zod@3.23.8) devDependencies: '@ant-design/icons': specifier: ^5.4.0 @@ -1026,8 +1026,8 @@ importers: specifier: ^5.19.4 version: 5.19.4(react-dom@18.3.1)(react@18.3.1) autoprefixer: - specifier: ^10.4.5 - version: 10.4.19(postcss@8.4.40) + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.41) dotenv-cli: specifier: ^6.0.0 version: 6.0.0 @@ -1056,8 +1056,8 @@ importers: specifier: ^10.0.1 version: 10.0.1 postcss: - specifier: ^8.4.30 - version: 8.4.40 + specifier: ^8.4.41 + version: 8.4.41 raw-loader: specifier: ^4.0.2 version: 4.0.2(webpack@5.93.0) @@ -1075,7 +1075,7 @@ importers: version: 5.5.4 zod-prisma: specifier: ^0.5.4 - version: 0.5.4(prisma@5.17.0)(zod@3.21.4) + version: 0.5.4(prisma@5.17.0)(zod@3.23.8) webapps/ee-api: dependencies: @@ -1107,11 +1107,11 @@ importers: specifier: 14.2.5 version: 14.2.5(eslint@8.57.0)(typescript@5.5.4) firebase-admin: - specifier: ^11.11.0 - version: 11.11.1 + specifier: ^12.3.0 + version: 12.3.0 intercom-client: - specifier: ^4.0.0 - version: 4.0.0 + specifier: ^5.0.0 + version: 5.0.0 is-valid-domain: specifier: ^0.1.6 version: 0.1.6 @@ -3619,38 +3619,31 @@ packages: tslib: 2.6.3 dev: false - /@edge-runtime/cookies@3.4.1: - resolution: {integrity: sha512-z27BvgPxI73CgSlxU/NAUf1Q/shnqi6cobHEowf6VuLdSjGR3NjI2Y5dZUIBbK2zOJVZbXcHsVzJjz8LklteFQ==} + /@edge-runtime/format@2.2.1: + resolution: {integrity: sha512-JQTRVuiusQLNNLe2W9tnzBlV/GvSVcozLl4XZHk5swnRZ/v6jp8TqR8P7sqmJsQqblDZ3EztcWmLDbhRje/+8g==} engines: {node: '>=16'} dev: true - /@edge-runtime/format@2.2.0: - resolution: {integrity: sha512-gPrS6AVw/qJJL0vcxMXv4kFXCU3ZTCD1uuJpwX15YxHV8BgU9OG5v9LrkkXcr96PBT/9epypfNJMhlWADuEziw==} + /@edge-runtime/node-utils@2.3.0: + resolution: {integrity: sha512-uUtx8BFoO1hNxtHjp3eqVPC/mWImGb2exOfGjMLUoipuWgjej+f4o/VP4bUI8U40gu7Teogd5VTeZUkGvJSPOQ==} engines: {node: '>=16'} dev: true - /@edge-runtime/node-utils@2.2.1: - resolution: {integrity: sha512-RUl/439BHKshkhSGFRlZ1kzy68wL4mn8VNKDSZr3p0tciyZ33Mjfpl+vofqnHqXRmDI6nLnZpfJvhY3D88o0pA==} + /@edge-runtime/ponyfill@2.4.2: + resolution: {integrity: sha512-oN17GjFr69chu6sDLvXxdhg0Qe8EZviGSuqzR9qOiKh4MhFYGdBBcqRNzdmYeAdeRzOW2mM9yil4RftUQ7sUOA==} engines: {node: '>=16'} - dependencies: - '@edge-runtime/cookies': 3.4.1 dev: true - /@edge-runtime/ponyfill@2.4.1: - resolution: {integrity: sha512-ZbR/EViY3gg2rmEAQTKPa6mXl4aR1/+cFcQe4r1segCjEbTAxT6PWu40odbu/KlZKSysEb2O/BWIC2lJgSJOMQ==} + /@edge-runtime/primitives@4.1.0: + resolution: {integrity: sha512-Vw0lbJ2lvRUqc7/soqygUX216Xb8T3WBZ987oywz6aJqRxcwSVWwr9e+Nqo2m9bxobA9mdbWNNoRY6S9eko1EQ==} engines: {node: '>=16'} dev: true - /@edge-runtime/primitives@4.0.5: - resolution: {integrity: sha512-t7QiN5d/KpXgCvIfSt6Nm9Hj3WVdNgc5CpOD73jasY+9EvTI7Ngdj5cXvjcHrPcmYWJZMySPgeEeoL/1N/Llag==} - engines: {node: '>=16'} - dev: true - - /@edge-runtime/vm@3.1.7: - resolution: {integrity: sha512-hUMFbDQ/nZN+1TLMi6iMO1QFz9RSV8yGG8S42WFPFma1d7VSNE0eMdJUmwjmtav22/iQkzHMmu6oTSfAvRGS8g==} + /@edge-runtime/vm@3.2.0: + resolution: {integrity: sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw==} engines: {node: '>=16'} dependencies: - '@edge-runtime/primitives': 4.0.5 + '@edge-runtime/primitives': 4.1.0 dev: true /@emotion/hash@0.8.0: @@ -3692,25 +3685,22 @@ packages: resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /@fastify/busboy@1.2.1: - resolution: {integrity: sha512-7PQA7EH43S0CxcOa9OeAnaeA0oQ+e/DHNPZwSQM9CQHW76jle5+OvLdibRp/Aafs9KXbLhxyjOTkRjWUbQEd3Q==} - engines: {node: '>=14'} - dependencies: - text-decoding: 1.0.0 - dev: false - /@fastify/busboy@2.1.1: resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} - /@firebase/analytics-compat@0.2.12(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7): - resolution: {integrity: sha512-rXWnOAdEHbvBPLNjFLu3U0yDZVIAi+C0DL+RkUEOirfSqAeQaKzBCATeBw6+K7FVpEnknhm4tZrvVUVtJjShMw==} + /@fastify/busboy@3.0.0: + resolution: {integrity: sha512-83rnH2nCvclWaPQQKvkJ2pdOjG4TZyEVuFDnlOF6KP08lDaaceVyw/W63mDuafQT+MKHCvXIPpE5uYWeM0rT4w==} + dev: false + + /@firebase/analytics-compat@0.2.13(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8): + resolution: {integrity: sha512-aZ4wGfNDMsCxhKzDbK2g1aV0JKsdQ9FbeIsjpNJPzhahV0XYj+z36Y4RNLPpG/6hHU4gxnezxs+yn3HhHkNL8w==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/analytics': 0.10.6(@firebase/app@0.10.7) + '@firebase/analytics': 0.10.7(@firebase/app@0.10.8) '@firebase/analytics-types': 0.8.2 - '@firebase/app-compat': 0.2.37 + '@firebase/app-compat': 0.2.38 '@firebase/component': 0.6.8 '@firebase/util': 1.9.7 tslib: 2.6.3 @@ -3720,27 +3710,26 @@ packages: /@firebase/analytics-types@0.8.2: resolution: {integrity: sha512-EnzNNLh+9/sJsimsA/FGqzakmrAUKLeJvjRHlg8df1f97NLUlFidk9600y0ZgWOp3CAxn6Hjtk+08tixlUOWyw==} - /@firebase/analytics@0.10.6(@firebase/app@0.10.7): - resolution: {integrity: sha512-sB59EwcAvLt0fINGfMWmcRKcdUiYhE4AJNdDXSCSDo4D/ZXFRmb6qwX9YesKHXFB59XTLT03mAjqQcDrdym9qA==} + /@firebase/analytics@0.10.7(@firebase/app@0.10.8): + resolution: {integrity: sha512-GE29uTT6y/Jv2EP0OjpTezeTQZ5FTCTaZXKrrdVGjb/t35AU4u/jiU+hUwUPpuK8fqhhiHkS/AawE3a3ZK/a9Q==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.10.7 + '@firebase/app': 0.10.8 '@firebase/component': 0.6.8 - '@firebase/installations': 0.6.8(@firebase/app@0.10.7) + '@firebase/installations': 0.6.8(@firebase/app@0.10.8) '@firebase/logger': 0.4.2 '@firebase/util': 1.9.7 - safevalues: 0.6.0 tslib: 2.6.3 - /@firebase/app-check-compat@0.3.13(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7): - resolution: {integrity: sha512-1sbS5Apq7dLys1KYdNQsmZLFIjJoFP9Mv4bzIcdXuTkWQjr3X2qAvwiTslC6prVAUMiTV0eM9eicdQIXVsiSRw==} + /@firebase/app-check-compat@0.3.14(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8): + resolution: {integrity: sha512-kK3bPfojAfXE53W+20rxMqIxrloFswXG9vh4kEdYL6Wa2IB3sD5++2dPiK3yGxl8oQiqS8qL2wcKB5/xLpEVEg==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-check': 0.8.6(@firebase/app@0.10.7) + '@firebase/app-check': 0.8.7(@firebase/app@0.10.8) '@firebase/app-check-types': 0.5.2 - '@firebase/app-compat': 0.2.37 + '@firebase/app-compat': 0.2.38 '@firebase/component': 0.6.8 '@firebase/logger': 0.4.2 '@firebase/util': 1.9.7 @@ -3754,36 +3743,31 @@ packages: /@firebase/app-check-types@0.5.2: resolution: {integrity: sha512-FSOEzTzL5bLUbD2co3Zut46iyPWML6xc4x+78TeaXMSuJap5QObfb+rVvZJtla3asN4RwU7elaQaduP+HFizDA==} - /@firebase/app-check@0.8.6(@firebase/app@0.10.7): - resolution: {integrity: sha512-uSzl0/SDw54hwuORWHDtldb9kK/QEVZOcoPn2mlIjMrJOLDug/6kcqnIN3IHzwmPyf23Epg0AGBktvG2FugW4w==} + /@firebase/app-check@0.8.7(@firebase/app@0.10.8): + resolution: {integrity: sha512-EkOeJcMKVR0zZ6z/jqcFTqHb/xq+TVIRIuBNGHdpcIuFU1czhSlegvqv2+nC+nFrkD8M6Xvd3tAlUOkdbMeS6A==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.10.7 + '@firebase/app': 0.10.8 '@firebase/component': 0.6.8 '@firebase/logger': 0.4.2 '@firebase/util': 1.9.7 - safevalues: 0.6.0 tslib: 2.6.3 - /@firebase/app-compat@0.2.37: - resolution: {integrity: sha512-yiQLYT9LYQHuJGu/msuBLFtdWWTJ3Pz04E9gSeWykSB+8s0XXJJqfqQlghH7CcQ3KnJZR+Wuc3zSMcY3a+dn6Q==} + /@firebase/app-compat@0.2.38: + resolution: {integrity: sha512-36ZrSvkYLW7QR01Sii2X+IY18ErMpRg6e2B2f/DVTtJBolthwXOnNBps+wvaVBvegdvdVPspgDXZUV0ppqh45w==} dependencies: - '@firebase/app': 0.10.7 + '@firebase/app': 0.10.8 '@firebase/component': 0.6.8 '@firebase/logger': 0.4.2 '@firebase/util': 1.9.7 tslib: 2.6.3 - /@firebase/app-types@0.9.0: - resolution: {integrity: sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==} - dev: false - /@firebase/app-types@0.9.2: resolution: {integrity: sha512-oMEZ1TDlBz479lmABwWsWjzHwheQKiAgnuKxE0pz0IXCVx7/rtlkx1fQ6GfgK24WCrxDKMplZrT50Kh04iMbXQ==} - /@firebase/app@0.10.7: - resolution: {integrity: sha512-7OCd53B+wnk/onbMLn/vM10pDjw97zzWUD8m3swtLYKJIrL+gDZ7HZ4xcbBLw7OB8ikzu8k1ORNjRe2itgAy4g==} + /@firebase/app@0.10.8: + resolution: {integrity: sha512-xSLmW0/RShcnUEXH7l+wC0AFWaUtty4tUFF2loIgbtXTRmra0UH/SqYDf/IcfreUninRrCsusNmvoTidGkXJPw==} dependencies: '@firebase/component': 0.6.8 '@firebase/logger': 0.4.2 @@ -3791,13 +3775,13 @@ packages: idb: 7.1.1 tslib: 2.6.3 - /@firebase/auth-compat@0.5.10(@firebase/app-compat@0.2.37)(@firebase/app-types@0.9.2)(@firebase/app@0.10.7): - resolution: {integrity: sha512-epDhgNIXmhl9DPuTW9Ec5NDJJKMFIdXBXiQI9O0xNHveow/ETtBCY86srzF7iCacqsd30CcpLwwXlhk8Y19Olg==} + /@firebase/auth-compat@0.5.11(@firebase/app-compat@0.2.38)(@firebase/app-types@0.9.2)(@firebase/app@0.10.8): + resolution: {integrity: sha512-7rE3MkQDoWwI2qd8qsra4/QZCO2GzQSbCL6AVQpult9+Nbimg+5A+YeHxpLTcYAxUV6HDg2CqTDQreFLhcm1CQ==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.2.37 - '@firebase/auth': 1.7.5(@firebase/app@0.10.7) + '@firebase/app-compat': 0.2.38 + '@firebase/auth': 1.7.6(@firebase/app@0.10.8) '@firebase/auth-types': 0.12.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.7) '@firebase/component': 0.6.8 '@firebase/util': 1.9.7 @@ -3808,10 +3792,6 @@ packages: - '@firebase/app-types' - '@react-native-async-storage/async-storage' - /@firebase/auth-interop-types@0.2.1: - resolution: {integrity: sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==} - dev: false - /@firebase/auth-interop-types@0.2.3: resolution: {integrity: sha512-Fc9wuJGgxoxQeavybiuwgyi+0rssr76b+nHpj+eGhXFYAdudMWyfBHvFL/I5fEHniUM/UQdFzi9VXJK2iZF7FQ==} @@ -3824,8 +3804,8 @@ packages: '@firebase/app-types': 0.9.2 '@firebase/util': 1.9.7 - /@firebase/auth@1.7.5(@firebase/app@0.10.7): - resolution: {integrity: sha512-DMFR1OA/f1/voeuFbSORg9AP36pMgOoSb/DRgiDalLmIJsDTlQNMCu+givjMP4s/XL85+tBk2MerYnK/AscJjw==} + /@firebase/auth@1.7.6(@firebase/app@0.10.8): + resolution: {integrity: sha512-T+lA5xoug9CByGYkD5WkfTh2ujEYq/frGZPbk0H+fNU6fNl7nqg88KcsmzsC6Fsqbjm3LLEb/i6wJvF6NSNEig==} peerDependencies: '@firebase/app': 0.x '@react-native-async-storage/async-storage': ^1.18.1 @@ -3833,37 +3813,19 @@ packages: '@react-native-async-storage/async-storage': optional: true dependencies: - '@firebase/app': 0.10.7 + '@firebase/app': 0.10.8 '@firebase/component': 0.6.8 '@firebase/logger': 0.4.2 '@firebase/util': 1.9.7 tslib: 2.6.3 undici: 5.28.4 - /@firebase/component@0.6.4: - resolution: {integrity: sha512-rLMyrXuO9jcAUCaQXCMjCMUsWrba5fzHlNK24xz5j2W6A/SRmK8mZJ/hn7V0fViLbxC0lPMtrK1eYzk6Fg03jA==} - dependencies: - '@firebase/util': 1.9.3 - tslib: 2.6.3 - dev: false - /@firebase/component@0.6.8: resolution: {integrity: sha512-LcNvxGLLGjBwB0dJUsBGCej2fqAepWyBubs4jt1Tiuns7QLbXHuyObZ4aMeBjZjWx4m8g1LoVI9QFpSaq/k4/g==} dependencies: '@firebase/util': 1.9.7 tslib: 2.6.3 - /@firebase/database-compat@0.3.4: - resolution: {integrity: sha512-kuAW+l+sLMUKBThnvxvUZ+Q1ZrF/vFJ58iUY9kAcbX48U03nVzIF6Tmkf0p3WVQwMqiXguSgtOPIB6ZCeF+5Gg==} - dependencies: - '@firebase/component': 0.6.4 - '@firebase/database': 0.14.4 - '@firebase/database-types': 0.10.4 - '@firebase/logger': 0.4.0 - '@firebase/util': 1.9.3 - tslib: 2.6.3 - dev: false - /@firebase/database-compat@1.0.6: resolution: {integrity: sha512-1OGA0sLY47mkXjhICCrUTXEYFnSSXoiXWm1SHsN62b+Lzs5aKA3aWTjTUmYIoK93kDAMPkYpulSv8jcbH4Hwew==} dependencies: @@ -3873,13 +3835,17 @@ packages: '@firebase/logger': 0.4.2 '@firebase/util': 1.9.7 tslib: 2.6.3 + dev: false - /@firebase/database-types@0.10.4: - resolution: {integrity: sha512-dPySn0vJ/89ZeBac70T+2tWWPiJXWbmRygYv0smT5TfE3hDrQ09eKMF3Y+vMlTdrMWq7mUdYW5REWPSGH4kAZQ==} + /@firebase/database-compat@1.0.7: + resolution: {integrity: sha512-R/3B+VVzEFN5YcHmfWns3eitA8fHLTL03io+FIoMcTYkajFnrBdS3A+g/KceN9omP7FYYYGTQWF9lvbEx6eMEg==} dependencies: - '@firebase/app-types': 0.9.0 - '@firebase/util': 1.9.3 - dev: false + '@firebase/component': 0.6.8 + '@firebase/database': 1.0.7 + '@firebase/database-types': 1.0.4 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.9.7 + tslib: 2.6.3 /@firebase/database-types@1.0.4: resolution: {integrity: sha512-mz9ZzbH6euFXbcBo+enuJ36I5dR5w+enJHHjy9Y5ThCdKUseqfDjW3vCp1YxE9zygFCSjJJ/z1cQ+zodvUcwPQ==} @@ -3887,19 +3853,20 @@ packages: '@firebase/app-types': 0.9.2 '@firebase/util': 1.9.7 - /@firebase/database@0.14.4: - resolution: {integrity: sha512-+Ea/IKGwh42jwdjCyzTmeZeLM3oy1h0mFPsTy6OqCWzcu/KFqRAr5Tt1HRCOBlNOdbh84JPZC47WLU18n2VbxQ==} + /@firebase/database@1.0.6: + resolution: {integrity: sha512-nrexUEG/fpVlHtWKkyfhTC3834kZ1WS7voNyqbBsBCqHXQOvznN5Z0L3nxBqdXSJyltNAf4ndFlQqm5gZiEczQ==} dependencies: - '@firebase/auth-interop-types': 0.2.1 - '@firebase/component': 0.6.4 - '@firebase/logger': 0.4.0 - '@firebase/util': 1.9.3 + '@firebase/app-check-interop-types': 0.3.2 + '@firebase/auth-interop-types': 0.2.3 + '@firebase/component': 0.6.8 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.9.7 faye-websocket: 0.11.4 tslib: 2.6.3 dev: false - /@firebase/database@1.0.6: - resolution: {integrity: sha512-nrexUEG/fpVlHtWKkyfhTC3834kZ1WS7voNyqbBsBCqHXQOvznN5Z0L3nxBqdXSJyltNAf4ndFlQqm5gZiEczQ==} + /@firebase/database@1.0.7: + resolution: {integrity: sha512-wjXr5AO8RPxVVg7rRCYffT7FMtBjHRfJ9KMwi19MbOf0vBf0H9YqW3WCgcnLpXI6ehiUcU3z3qgPnnU0nK6SnA==} dependencies: '@firebase/app-check-interop-types': 0.3.2 '@firebase/auth-interop-types': 0.2.3 @@ -3909,14 +3876,14 @@ packages: faye-websocket: 0.11.4 tslib: 2.6.3 - /@firebase/firestore-compat@0.3.33(@firebase/app-compat@0.2.37)(@firebase/app-types@0.9.2)(@firebase/app@0.10.7): - resolution: {integrity: sha512-i42a2l31N95CwYEB7zmfK0FS1mrO6pwOLwxavCrwu1BCFrVVVQhUheTPIda/iGguK/2Nog0RaIR1bo7QkZEz3g==} + /@firebase/firestore-compat@0.3.34(@firebase/app-compat@0.2.38)(@firebase/app-types@0.9.2)(@firebase/app@0.10.8): + resolution: {integrity: sha512-OBP2F/Ccydl2U2j8XIfpKBxf0EnQHEhbZ4LTwbSS2QlG9+8TwhvKFkKk/ZljWYqaype+qFKPuXZ5flCqYEETeA==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.2.37 + '@firebase/app-compat': 0.2.38 '@firebase/component': 0.6.8 - '@firebase/firestore': 4.6.4(@firebase/app@0.10.7) + '@firebase/firestore': 4.6.5(@firebase/app@0.10.8) '@firebase/firestore-types': 3.0.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.7) '@firebase/util': 1.9.7 tslib: 2.6.3 @@ -3933,13 +3900,13 @@ packages: '@firebase/app-types': 0.9.2 '@firebase/util': 1.9.7 - /@firebase/firestore@4.6.4(@firebase/app@0.10.7): - resolution: {integrity: sha512-vk2MoH5HxYEhiNg1l+yBXq1Fkhue/11bFg4HdlTv6BJHcTnnAj2a+/afPpatcW4MOdYA3Tv+d5nGzWbbOC1SHw==} + /@firebase/firestore@4.6.5(@firebase/app@0.10.8): + resolution: {integrity: sha512-0+Ascaht4qUzj4pCopMPWmoAujk8HKjwCpaNYOOjbYMZ65RVfZPsfZwwbWi/zWMXj6xvPsai5oBiErUUkrLwNw==} engines: {node: '>=10.10.0'} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.10.7 + '@firebase/app': 0.10.8 '@firebase/component': 0.6.8 '@firebase/logger': 0.4.2 '@firebase/util': 1.9.7 @@ -3949,14 +3916,14 @@ packages: tslib: 2.6.3 undici: 5.28.4 - /@firebase/functions-compat@0.3.12(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7): + /@firebase/functions-compat@0.3.12(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8): resolution: {integrity: sha512-r3XUb5VlITWpML46JymfJPkK6I9j4SNlO7qWIXUc0TUmkv0oAfVoiIt1F83/NuMZXaGr4YWA/794nVSy4GV8tw==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.2.37 + '@firebase/app-compat': 0.2.38 '@firebase/component': 0.6.8 - '@firebase/functions': 0.11.6(@firebase/app@0.10.7) + '@firebase/functions': 0.11.6(@firebase/app@0.10.8) '@firebase/functions-types': 0.6.2 '@firebase/util': 1.9.7 tslib: 2.6.3 @@ -3966,12 +3933,12 @@ packages: /@firebase/functions-types@0.6.2: resolution: {integrity: sha512-0KiJ9lZ28nS2iJJvimpY4nNccV21rkQyor5Iheu/nq8aKXJqtJdeSlZDspjPSBBiHRzo7/GMUttegnsEITqR+w==} - /@firebase/functions@0.11.6(@firebase/app@0.10.7): + /@firebase/functions@0.11.6(@firebase/app@0.10.8): resolution: {integrity: sha512-GPfIBPtpwQvsC7SQbgaUjLTdja0CsNwMoKSgrzA1FGGRk4NX6qO7VQU6XCwBiAFWbpbQex6QWkSMsCzLx1uibQ==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.10.7 + '@firebase/app': 0.10.8 '@firebase/app-check-interop-types': 0.3.2 '@firebase/auth-interop-types': 0.2.3 '@firebase/component': 0.6.8 @@ -3980,14 +3947,14 @@ packages: tslib: 2.6.3 undici: 5.28.4 - /@firebase/installations-compat@0.2.8(@firebase/app-compat@0.2.37)(@firebase/app-types@0.9.2)(@firebase/app@0.10.7): + /@firebase/installations-compat@0.2.8(@firebase/app-compat@0.2.38)(@firebase/app-types@0.9.2)(@firebase/app@0.10.8): resolution: {integrity: sha512-pI2q8JFHB7yIq/szmhzGSWXtOvtzl6tCUmyykv5C8vvfOVJUH6mP4M4iwjbK8S1JotKd/K70+JWyYlxgQ0Kpyw==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.2.37 + '@firebase/app-compat': 0.2.38 '@firebase/component': 0.6.8 - '@firebase/installations': 0.6.8(@firebase/app@0.10.7) + '@firebase/installations': 0.6.8(@firebase/app@0.10.8) '@firebase/installations-types': 0.5.2(@firebase/app-types@0.9.2) '@firebase/util': 1.9.7 tslib: 2.6.3 @@ -4002,36 +3969,30 @@ packages: dependencies: '@firebase/app-types': 0.9.2 - /@firebase/installations@0.6.8(@firebase/app@0.10.7): + /@firebase/installations@0.6.8(@firebase/app@0.10.8): resolution: {integrity: sha512-57V374qdb2+wT5v7+ntpLXBjZkO6WRgmAUbVkRfFTM/4t980p0FesbqTAcOIiM8U866UeuuuF8lYH70D3jM/jQ==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.10.7 + '@firebase/app': 0.10.8 '@firebase/component': 0.6.8 '@firebase/util': 1.9.7 idb: 7.1.1 tslib: 2.6.3 - /@firebase/logger@0.4.0: - resolution: {integrity: sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==} - dependencies: - tslib: 2.6.3 - dev: false - /@firebase/logger@0.4.2: resolution: {integrity: sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==} dependencies: tslib: 2.6.3 - /@firebase/messaging-compat@0.2.10(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7): + /@firebase/messaging-compat@0.2.10(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8): resolution: {integrity: sha512-FXQm7rcowkDm8kFLduHV35IRYCRo+Ng0PIp/t1+EBuEbyplaKkGjZ932pE+owf/XR+G/60ku2QRBptRGLXZydg==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.2.37 + '@firebase/app-compat': 0.2.38 '@firebase/component': 0.6.8 - '@firebase/messaging': 0.12.10(@firebase/app@0.10.7) + '@firebase/messaging': 0.12.10(@firebase/app@0.10.8) '@firebase/util': 1.9.7 tslib: 2.6.3 transitivePeerDependencies: @@ -4040,28 +4001,28 @@ packages: /@firebase/messaging-interop-types@0.2.2: resolution: {integrity: sha512-l68HXbuD2PPzDUOFb3aG+nZj5KA3INcPwlocwLZOzPp9rFM9yeuI9YLl6DQfguTX5eAGxO0doTR+rDLDvQb5tA==} - /@firebase/messaging@0.12.10(@firebase/app@0.10.7): + /@firebase/messaging@0.12.10(@firebase/app@0.10.8): resolution: {integrity: sha512-fGbxJPKpl2DIKNJGhbk4mYPcM+qE2gl91r6xPoiol/mN88F5Ym6UeRdMVZah+pijh9WxM55alTYwXuW40r1Y2Q==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.10.7 + '@firebase/app': 0.10.8 '@firebase/component': 0.6.8 - '@firebase/installations': 0.6.8(@firebase/app@0.10.7) + '@firebase/installations': 0.6.8(@firebase/app@0.10.8) '@firebase/messaging-interop-types': 0.2.2 '@firebase/util': 1.9.7 idb: 7.1.1 tslib: 2.6.3 - /@firebase/performance-compat@0.2.8(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7): + /@firebase/performance-compat@0.2.8(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8): resolution: {integrity: sha512-o7TFClRVJd3VIBoY7KZQqtCeW0PC6v9uBzM6Lfw3Nc9D7hM6OonqecYvh7NwJ6R14k+xM27frLS4BcCvFHKw2A==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.2.37 + '@firebase/app-compat': 0.2.38 '@firebase/component': 0.6.8 '@firebase/logger': 0.4.2 - '@firebase/performance': 0.6.8(@firebase/app@0.10.7) + '@firebase/performance': 0.6.8(@firebase/app@0.10.8) '@firebase/performance-types': 0.2.2 '@firebase/util': 1.9.7 tslib: 2.6.3 @@ -4071,27 +4032,27 @@ packages: /@firebase/performance-types@0.2.2: resolution: {integrity: sha512-gVq0/lAClVH5STrIdKnHnCo2UcPLjJlDUoEB/tB4KM+hAeHUxWKnpT0nemUPvxZ5nbdY/pybeyMe8Cs29gEcHA==} - /@firebase/performance@0.6.8(@firebase/app@0.10.7): + /@firebase/performance@0.6.8(@firebase/app@0.10.8): resolution: {integrity: sha512-F+alziiIZ6Yn8FG47mxwljq+4XkgkT2uJIFRlkyViUQRLzrogaUJW6u/+6ZrePXnouKlKIwzqos3PVJraPEcCA==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.10.7 + '@firebase/app': 0.10.8 '@firebase/component': 0.6.8 - '@firebase/installations': 0.6.8(@firebase/app@0.10.7) + '@firebase/installations': 0.6.8(@firebase/app@0.10.8) '@firebase/logger': 0.4.2 '@firebase/util': 1.9.7 tslib: 2.6.3 - /@firebase/remote-config-compat@0.2.8(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7): + /@firebase/remote-config-compat@0.2.8(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8): resolution: {integrity: sha512-UxSFOp6dzFj2AHB8Bq/BYtbq5iFyizKx4Rd6WxAdaKYM8cnPMeK+l2v+Oogtjae+AeyHRI+MfL2acsfVe5cd2A==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.2.37 + '@firebase/app-compat': 0.2.38 '@firebase/component': 0.6.8 '@firebase/logger': 0.4.2 - '@firebase/remote-config': 0.4.8(@firebase/app@0.10.7) + '@firebase/remote-config': 0.4.8(@firebase/app@0.10.8) '@firebase/remote-config-types': 0.3.2 '@firebase/util': 1.9.7 tslib: 2.6.3 @@ -4101,26 +4062,26 @@ packages: /@firebase/remote-config-types@0.3.2: resolution: {integrity: sha512-0BC4+Ud7y2aPTyhXJTMTFfrGGLqdYXrUB9sJVAB8NiqJswDTc4/2qrE/yfUbnQJhbSi6ZaTTBKyG3n1nplssaA==} - /@firebase/remote-config@0.4.8(@firebase/app@0.10.7): + /@firebase/remote-config@0.4.8(@firebase/app@0.10.8): resolution: {integrity: sha512-AMLqe6wfIRnjc6FkCWOSUjhc1fSTEf8o+cv1NolFvbiJ/tU+TqN4pI7pT+MIKQzNiq5fxLehkOx+xtAQBxPJKQ==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.10.7 + '@firebase/app': 0.10.8 '@firebase/component': 0.6.8 - '@firebase/installations': 0.6.8(@firebase/app@0.10.7) + '@firebase/installations': 0.6.8(@firebase/app@0.10.8) '@firebase/logger': 0.4.2 '@firebase/util': 1.9.7 tslib: 2.6.3 - /@firebase/storage-compat@0.3.9(@firebase/app-compat@0.2.37)(@firebase/app-types@0.9.2)(@firebase/app@0.10.7): + /@firebase/storage-compat@0.3.9(@firebase/app-compat@0.2.38)(@firebase/app-types@0.9.2)(@firebase/app@0.10.8): resolution: {integrity: sha512-WWgAp5bTW961oIsCc9+98m4MIVKpEqztAlIngfHfwO/x3DYoBPRl/awMRG3CAXyVxG+7B7oHC5IsnqM+vTwx2A==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.2.37 + '@firebase/app-compat': 0.2.38 '@firebase/component': 0.6.8 - '@firebase/storage': 0.12.6(@firebase/app@0.10.7) + '@firebase/storage': 0.12.6(@firebase/app@0.10.8) '@firebase/storage-types': 0.8.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.7) '@firebase/util': 1.9.7 tslib: 2.6.3 @@ -4137,36 +4098,30 @@ packages: '@firebase/app-types': 0.9.2 '@firebase/util': 1.9.7 - /@firebase/storage@0.12.6(@firebase/app@0.10.7): + /@firebase/storage@0.12.6(@firebase/app@0.10.8): resolution: {integrity: sha512-Zgb9WuehJxzhj7pGXUvkAEaH+3HvLjD9xSZ9nepuXf5f8378xME7oGJtREr/RnepdDA5YW0XIxe0QQBNHpe1nw==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.10.7 + '@firebase/app': 0.10.8 '@firebase/component': 0.6.8 '@firebase/util': 1.9.7 tslib: 2.6.3 undici: 5.28.4 - /@firebase/util@1.9.3: - resolution: {integrity: sha512-DY02CRhOZwpzO36fHpuVysz6JZrscPiBXD0fXp6qSrL9oNOx5KWICKdR95C0lSITzxp0TZosVyHqzatE8JbcjA==} - dependencies: - tslib: 2.6.3 - dev: false - /@firebase/util@1.9.7: resolution: {integrity: sha512-fBVNH/8bRbYjqlbIhZ+lBtdAAS4WqZumx03K06/u7fJSpz1TGjEMm1ImvKD47w+xaFKIP2ori6z8BrbakRfjJA==} dependencies: tslib: 2.6.3 - /@firebase/vertexai-preview@0.0.3(@firebase/app-types@0.9.2)(@firebase/app@0.10.7): + /@firebase/vertexai-preview@0.0.3(@firebase/app-types@0.9.2)(@firebase/app@0.10.8): resolution: {integrity: sha512-KVtUWLp+ScgiwkDKAvNkVucAyhLVQp6C6lhnVEuIg4mWhWcS3oerjAeVhZT4uNofKwWxRsOaB2Yec7DMTXlQPQ==} engines: {node: '>=18.0.0'} peerDependencies: '@firebase/app': 0.x '@firebase/app-types': 0.x dependencies: - '@firebase/app': 0.10.7 + '@firebase/app': 0.10.8 '@firebase/app-check-interop-types': 0.3.2 '@firebase/app-types': 0.9.2 '@firebase/component': 0.6.8 @@ -4188,14 +4143,14 @@ packages: /@gar/promisify@1.1.3: resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} - /@google-cloud/firestore@6.8.0: - resolution: {integrity: sha512-JRpk06SmZXLGz0pNx1x7yU3YhkUXheKgH5hbDZ4kMsdhtfV5qPLJLRI4wv69K0cZorIk+zTMOwptue7hizo0eA==} - engines: {node: '>=12.0.0'} + /@google-cloud/firestore@7.9.0: + resolution: {integrity: sha512-c4ALHT3G08rV7Zwv8Z2KG63gZh66iKdhCBeDfCpIkLrjX6EAjTD/szMdj14M+FnQuClZLFfW5bAgoOjfNmLtJg==} + engines: {node: '>=14.0.0'} requiresBuild: true dependencies: fast-deep-equal: 3.1.3 functional-red-black-tree: 1.0.1 - google-gax: 3.6.1 + google-gax: 4.3.8 protobufjs: 7.3.2 transitivePeerDependencies: - encoding @@ -4203,9 +4158,9 @@ packages: dev: false optional: true - /@google-cloud/paginator@3.0.7: - resolution: {integrity: sha512-jJNutk0arIQhmpUUQJPJErsojqo834KcyB6X7a1mxuic8i1tKXxde8E69IZxNZawRIlZdIK2QY4WALvlK5MzYQ==} - engines: {node: '>=10'} + /@google-cloud/paginator@5.0.2: + resolution: {integrity: sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==} + engines: {node: '>=14.0.0'} requiresBuild: true dependencies: arrify: 2.0.1 @@ -4213,16 +4168,16 @@ packages: dev: false optional: true - /@google-cloud/projectify@3.0.0: - resolution: {integrity: sha512-HRkZsNmjScY6Li8/kb70wjGlDDyLkVk3KvoEo9uIoxSjYLJasGiCch9+PqRVDOCGUFvEIqyogl+BeqILL4OJHA==} - engines: {node: '>=12.0.0'} + /@google-cloud/projectify@4.0.0: + resolution: {integrity: sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==} + engines: {node: '>=14.0.0'} requiresBuild: true dev: false optional: true - /@google-cloud/promisify@3.0.1: - resolution: {integrity: sha512-z1CjRjtQyBOYL+5Qr9DdYIfrdLBe746jRTYfaYU6MeXkqp7UfYs/jX16lFFVzZ7PGEJvqZNqYUEtb1mvDww4pA==} - engines: {node: '>=12'} + /@google-cloud/promisify@4.0.0: + resolution: {integrity: sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==} + engines: {node: '>=14'} requiresBuild: true dev: false optional: true @@ -4237,28 +4192,25 @@ packages: - supports-color dev: false - /@google-cloud/storage@6.12.0: - resolution: {integrity: sha512-78nNAY7iiZ4O/BouWMWTD/oSF2YtYgYB3GZirn0To6eBOugjXVoK+GXgUXOl+HlqbAOyHxAVXOlsj3snfbQ1dw==} - engines: {node: '>=12'} + /@google-cloud/storage@7.12.0: + resolution: {integrity: sha512-122Ui67bhnf8MkRnxQAC5lf7wPGkPP5hL3+J5s9HHDw2J9RpaMmnV8iahn+RUn9BH70W6uRe6nMZLXiRaJM/3g==} + engines: {node: '>=14'} requiresBuild: true dependencies: - '@google-cloud/paginator': 3.0.7 - '@google-cloud/projectify': 3.0.0 - '@google-cloud/promisify': 3.0.1 + '@google-cloud/paginator': 5.0.2 + '@google-cloud/projectify': 4.0.0 + '@google-cloud/promisify': 4.0.0 abort-controller: 3.0.0 async-retry: 1.3.3 - compressible: 2.0.18 duplexify: 4.1.3 - ent: 2.2.1 - extend: 3.0.2 fast-xml-parser: 4.4.1 - gaxios: 5.1.3 - google-auth-library: 8.9.0 + gaxios: 6.7.0 + google-auth-library: 9.12.0 + html-entities: 2.5.2 mime: 3.0.0 - mime-types: 2.1.35 p-limit: 3.1.0 - retry-request: 5.0.2 - teeny-request: 8.0.3 + retry-request: 7.0.2 + teeny-request: 9.0.0 uuid: 8.3.2 transitivePeerDependencies: - encoding @@ -4274,16 +4226,6 @@ packages: '@js-sdsl/ordered-map': 4.4.2 dev: false - /@grpc/grpc-js@1.8.22: - resolution: {integrity: sha512-oAjDdN7fzbUi+4hZjKG96MR6KTEubAeMpQEb+77qy+3r0Ua5xTFuie6JOLr4ZZgl5g+W5/uRTS2M1V8mVAFPuA==} - engines: {node: ^8.13.0 || >=10.10.0} - requiresBuild: true - dependencies: - '@grpc/proto-loader': 0.7.13 - '@types/node': 18.19.42 - dev: false - optional: true - /@grpc/grpc-js@1.9.15: resolution: {integrity: sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ==} engines: {node: ^8.13.0 || >=10.10.0} @@ -5030,15 +4972,6 @@ packages: resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} dev: false - /@jsdoc/salty@0.2.8: - resolution: {integrity: sha512-5e+SFVavj1ORKlKaKr2BmTOekmXbelU7dC0cDkQLqag7xfuTPuGMUFx7KWJuv4bYZrTsoL2Z18VVCOKYxzoHcg==} - engines: {node: '>=v12.0.0'} - requiresBuild: true - dependencies: - lodash: 4.17.21 - dev: false - optional: true - /@kurkle/color@0.3.2: resolution: {integrity: sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==} dev: false @@ -7748,7 +7681,7 @@ packages: resolution: {integrity: sha512-G8XgHMu2jHlElfc2xVNaYP50F0qrqeTCjgeG1v5b4SRwWG4XKC4fCuEdVZuZaMRmVygcnbRZBAo9O7RsDvmkGQ==} deprecated: This is a stub types definition for Firebase API (https://www.firebase.com/docs/javascript/firebase). Firebase API provides its own type definitions, so you don't need @types/firebase installed! dependencies: - firebase: 10.12.4 + firebase: 10.12.5 transitivePeerDependencies: - '@react-native-async-storage/async-storage' dev: true @@ -7760,15 +7693,6 @@ packages: '@types/node': 18.19.42 dev: true - /@types/glob@8.1.0: - resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} - requiresBuild: true - dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 18.19.42 - dev: false - optional: true - /@types/graceful-fs@4.1.9: resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} dependencies: @@ -7833,12 +7757,6 @@ packages: dependencies: '@types/node': 18.19.42 - /@types/linkify-it@5.0.0: - resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} - requiresBuild: true - dev: false - optional: true - /@types/lodash@4.17.7: resolution: {integrity: sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==} dev: true @@ -7847,21 +7765,6 @@ packages: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} dev: false - /@types/markdown-it@14.1.2: - resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} - requiresBuild: true - dependencies: - '@types/linkify-it': 5.0.0 - '@types/mdurl': 2.0.0 - dev: false - optional: true - - /@types/mdurl@2.0.0: - resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} - requiresBuild: true - dev: false - optional: true - /@types/mime@1.3.5: resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} @@ -7870,6 +7773,7 @@ packages: /@types/minimatch@5.1.2: resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + dev: true /@types/ms@0.7.34: resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} @@ -7888,18 +7792,24 @@ packages: '@types/node': 18.19.42 dev: false - /@types/node@14.18.33: - resolution: {integrity: sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==} - dev: true - /@types/node@15.14.9: resolution: {integrity: sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==} + /@types/node@16.18.11: + resolution: {integrity: sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==} + dev: true + /@types/node@18.19.42: resolution: {integrity: sha512-d2ZFc/3lnK2YCYhos8iaNIYu9Vfhr92nHiyJHRltXWjXUBjEE+A4I58Tdbnw4VhggSW+2j5y5gTrLs4biNnubg==} dependencies: undici-types: 5.26.5 + /@types/node@20.14.14: + resolution: {integrity: sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==} + dependencies: + undici-types: 5.26.5 + dev: false + /@types/nodemailer@6.4.15: resolution: {integrity: sha512-0EBJxawVNjPkng1zm2vopRctuWVCxk34JcIlRuXSf54habUWdz1FB7wHDqOqvDa8Mtpt0Q3LTXQkAs2LNyK5jQ==} dependencies: @@ -8005,15 +7915,6 @@ packages: resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} dev: false - /@types/rimraf@3.0.2: - resolution: {integrity: sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==} - requiresBuild: true - dependencies: - '@types/glob': 8.1.0 - '@types/node': 18.19.42 - dev: false - optional: true - /@types/semver@7.5.8: resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} @@ -8478,8 +8379,8 @@ packages: /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - /@vercel/build-utils@7.3.0: - resolution: {integrity: sha512-RJwqrGYSk75auHZqWmlSL+a5JsWv+4SF1AxNQJ+KpF3XWZ/8yThkN/jHBfNxMmW6VvNczSVtMaXI0/2Sess6Eg==} + /@vercel/build-utils@8.3.6: + resolution: {integrity: sha512-EPwr8tXu41aoXg9QBiF98clu5AHbKtwbp3SeX/W6c8L0fhLwiT+H/s3WDuOL/UMz0TT3B8JAdY4PZioWNEAf6g==} dev: true /@vercel/error-utils@2.0.2: @@ -8521,45 +8422,46 @@ packages: web-vitals: 0.2.4 dev: true - /@vercel/gatsby-plugin-vercel-builder@2.0.12: - resolution: {integrity: sha512-S1RkywrUItewqg06T3L4cgYfiwi2BFngHIIerhOYhVuD9A+yfMgxnH5dkbu6nujmV1SEws+Q92wSiPfLPmO0eA==} + /@vercel/gatsby-plugin-vercel-builder@2.0.40: + resolution: {integrity: sha512-j3pZch8Qk2jfM87+dXX+xZXtdD+T2cMOmHhQWzO4oX3issxfBkkk2mAmY4o3Cxry5Xxe5iDQo6VsvY2IrWpCuA==} dependencies: '@sinclair/typebox': 0.25.24 - '@vercel/build-utils': 7.3.0 + '@vercel/build-utils': 8.3.6 '@vercel/routing-utils': 3.1.0 esbuild: 0.14.47 etag: 1.8.1 fs-extra: 11.1.0 dev: true - /@vercel/go@3.0.4: - resolution: {integrity: sha512-hMIJm2xwU1HT56YRNF8HNOnIFNH7WnGl1l2D6lc6UJk7XdCCh1Dm0nsqLqki2SprTUh3I+53pTQaqgRsFGf06A==} + /@vercel/go@3.1.1: + resolution: {integrity: sha512-mrzomNYltxkjvtUmaYry5YEyvwTz6c/QQHE5Gr/pPGRIniUiP6T6OFOJ49RBN7e6pRXaNzHPVuidiuBhvHh5+Q==} dev: true - /@vercel/hydrogen@1.0.1: - resolution: {integrity: sha512-4PYk4LeIWPTjGtgnxvB0Hdw7aqCau843/96K2xX3z9pa0Hn//pUnZBMz2jrs5MRseCm1Li1LdQAK3u8/vaUnVQ==} + /@vercel/hydrogen@1.0.4: + resolution: {integrity: sha512-Sc0lpmI/J6O3o2cL75k8klL7ir2gi6kYI92O5+MrR3hh4fwz/atUIL9UWsTGuFjKTm69VAoJrmn3VKf0/0SGLw==} dependencies: '@vercel/static-config': 3.0.0 ts-morph: 12.0.0 dev: true - /@vercel/next@4.0.15: - resolution: {integrity: sha512-BxMxIJrya7MS6IWrQIaQaYHPmq7WoZFLX909RBpNoAG5wgzrTrW756d2EsibBwGo7sQYBv2atyI5GqBIHzYbWg==} + /@vercel/next@4.3.6: + resolution: {integrity: sha512-qUHp79xX07qYtz7DGSogyWgEMrf+eu/IGV/92YnVA1xzDBogIFc8XFvMlN8QwDrsWWsR+I2eMSiGD+P8znlsaA==} dependencies: - '@vercel/nft': 0.24.2 + '@vercel/nft': 0.27.3 transitivePeerDependencies: - encoding - supports-color dev: true - /@vercel/nft@0.24.2: - resolution: {integrity: sha512-KhY3Ky/lCqE+fHpOXiKOLnXYJ49PZh1dyDSfVtZhmYtmica0NQgyO6kPOAGDNWqD9IOBx8hb65upxxjfnfa1JA==} + /@vercel/nft@0.27.3: + resolution: {integrity: sha512-oySTdDSzUAFDXpsSLk9Q943o+/Yu/+TCFxnehpFQEf/3khi2stMpTHPVNwFdvZq/Z4Ky93lE+MGHpXCRpMkSCA==} engines: {node: '>=16'} hasBin: true dependencies: '@mapbox/node-pre-gyp': 1.0.11 '@rollup/pluginutils': 4.2.1 acorn: 8.12.1 + acorn-import-attributes: 1.9.5(acorn@8.12.1) async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 @@ -8573,28 +8475,29 @@ packages: - supports-color dev: true - /@vercel/node@3.0.12: - resolution: {integrity: sha512-OiNHiUe1LX/CfDrQ07ntPsoYhJiC38mEeErYeqA6YNVAz3QGdX3pthiaIig2KPqeeYkEx5bSkVIqQtQOTJBuLQ==} + /@vercel/node@3.2.8: + resolution: {integrity: sha512-mINg3ab1FHIqupZlLVpmCvyqGtkafnyNesgs7ZoCbNxqbb4ZrHtPj1kHv9cvTrFlDkFapkV/Ez8nbSsHeAxtOw==} dependencies: - '@edge-runtime/node-utils': 2.2.1 - '@edge-runtime/primitives': 4.0.5 - '@edge-runtime/vm': 3.1.7 - '@types/node': 14.18.33 - '@vercel/build-utils': 7.3.0 + '@edge-runtime/node-utils': 2.3.0 + '@edge-runtime/primitives': 4.1.0 + '@edge-runtime/vm': 3.2.0 + '@types/node': 16.18.11 + '@vercel/build-utils': 8.3.6 '@vercel/error-utils': 2.0.2 - '@vercel/nft': 0.24.2 + '@vercel/nft': 0.27.3 '@vercel/static-config': 3.0.0 async-listen: 3.0.0 - edge-runtime: 2.5.7 + cjs-module-lexer: 1.2.3 + edge-runtime: 2.5.9 + es-module-lexer: 1.4.1 esbuild: 0.14.47 etag: 1.8.1 - exit-hook: 2.2.1 node-fetch: 2.6.9 path-to-regexp: 6.2.1 ts-morph: 12.0.0 - ts-node: 10.9.1(@types/node@14.18.33)(typescript@4.9.5) + ts-node: 10.9.1(@types/node@16.18.11)(typescript@4.9.5) typescript: 4.9.5 - undici: 5.26.5 + undici: 5.28.4 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -8602,25 +8505,28 @@ packages: - supports-color dev: true - /@vercel/python@4.1.0: - resolution: {integrity: sha512-EIQXK5zL6fce0Barh74gc7xyLtRyvgmLZDIVQ8yJLtFxPlPCRY3GXkdJ7Jdcw8Pd0uuVF0vIHatv18xSLbcwtg==} + /@vercel/python@4.3.1: + resolution: {integrity: sha512-pWRApBwUsAQJS8oZ7eKMiaBGbYJO71qw2CZqDFvkTj34FNBZtNIUcWSmqGfJJY5m2pU/9wt8z1CnKIyT9dstog==} dev: true - /@vercel/redwood@2.0.5: - resolution: {integrity: sha512-9iWTxfMkC7yNnwN2xxOdptiIDAgXe1V1fh3aw92MWt5PBRcFY9RqgIPF7Q3Qa7yzQFgpbHwCnSTqWO+HCEuFtw==} + /@vercel/redwood@2.1.3: + resolution: {integrity: sha512-lpsdQSHS2hvSX29/rJNm4q38dVXKstS4MVg875KE6zyXpACwviXuet0Cadyv0E60w7f2B6Ra+nJMpwKz6oJ5xg==} dependencies: - '@vercel/nft': 0.24.2 + '@vercel/nft': 0.27.3 '@vercel/routing-utils': 3.1.0 + '@vercel/static-config': 3.0.0 semver: 6.3.1 + ts-morph: 12.0.0 transitivePeerDependencies: - encoding - supports-color dev: true - /@vercel/remix-builder@2.0.14: - resolution: {integrity: sha512-c+ILERSRq404sf6kt0qWhYhuxWkkoTEm2FdLoUnVs21K6kzGtJMJbUExEHoPZvN9a0tq86ZU86jVvRZV6WL0cQ==} + /@vercel/remix-builder@2.2.3: + resolution: {integrity: sha512-rXb0cgCIe8xCSl6gw+j5cjMEcmgQc5nbnpyMuaQ8+lRBSN0eEl8RkufkVQ4FblGQbnPnPFBCmraUx58HxKxfZw==} dependencies: - '@vercel/nft': 0.24.2 + '@vercel/error-utils': 2.0.2 + '@vercel/nft': 0.27.3 '@vercel/static-config': 3.0.0 ts-morph: 12.0.0 transitivePeerDependencies: @@ -8636,15 +8542,15 @@ packages: ajv: 6.12.6 dev: true - /@vercel/ruby@2.0.4: - resolution: {integrity: sha512-EpZyfF6wFGzFDmubFIh/EZtYpKindmXx/69xSfKEBTVU0afgljyOOICbyZePe5tvigfOEBLSLgrt/2nN+MlLtA==} + /@vercel/ruby@2.1.0: + resolution: {integrity: sha512-UZYwlSEEfVnfzTmgkD+kxex9/gkZGt7unOWNyWFN7V/ZnZSsGBUgv6hXLnwejdRi3EztgRQEBd1kUKlXdIeC0Q==} dev: true - /@vercel/static-build@2.0.14: - resolution: {integrity: sha512-l5eQtJbk5Pc+P8XARDnpcbX4LnK3bGy7uf6S1aFOD4h6F8iBdg0agWTufZnq5BI91pcPVICPazM5BYhigIEznQ==} + /@vercel/static-build@2.5.18: + resolution: {integrity: sha512-UgF/wrx5j07PMidvCVTjlTw1C47Ly+tpWihQyAH42xzf9BHtM+8S9UwOPdM5GYhtBuq2fmpPxFi9DCQ5sg4g7Q==} dependencies: '@vercel/gatsby-plugin-vercel-analytics': 1.0.11 - '@vercel/gatsby-plugin-vercel-builder': 2.0.12 + '@vercel/gatsby-plugin-vercel-builder': 2.0.40 '@vercel/static-config': 3.0.0 ts-morph: 12.0.0 dev: true @@ -9444,20 +9350,37 @@ packages: engines: {node: '>= 4.0.0'} dev: false - /autoprefixer@10.4.19(postcss@8.4.40): - resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} + /autoprefixer@10.4.20(postcss@8.4.40): + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.23.2 - caniuse-lite: 1.0.30001645 + browserslist: 4.23.3 + caniuse-lite: 1.0.30001649 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.1 postcss: 8.4.40 postcss-value-parser: 4.2.0 + dev: false + + /autoprefixer@10.4.20(postcss@8.4.41): + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.23.3 + caniuse-lite: 1.0.30001649 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.1 + postcss: 8.4.41 + postcss-value-parser: 4.2.0 + dev: true /autoprefixer@9.8.8: resolution: {integrity: sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==} @@ -9482,23 +9405,6 @@ packages: resolution: {integrity: sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==} engines: {node: '>=4'} - /axios@0.24.0: - resolution: {integrity: sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==} - dependencies: - follow-redirects: 1.15.6 - transitivePeerDependencies: - - debug - dev: false - - /axios@0.27.2: - resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} - dependencies: - follow-redirects: 1.15.6 - form-data: 4.0.0 - transitivePeerDependencies: - - debug - dev: false - /axios@1.7.2: resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} dependencies: @@ -9973,6 +9879,16 @@ packages: node-releases: 2.0.18 update-browserslist-db: 1.1.0(browserslist@4.23.2) + /browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001649 + electron-to-chromium: 1.5.4 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) + /bs-logger@0.2.6: resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} engines: {node: '>= 6'} @@ -10195,20 +10111,14 @@ packages: /caniuse-lite@1.0.30001645: resolution: {integrity: sha512-GFtY2+qt91kzyMk6j48dJcwJVq5uTkk71XxE3RtScx7XWRLsO7bU44LOFkOZYR8w9YMS0UhPSYpN/6rAMImmLw==} + /caniuse-lite@1.0.30001649: + resolution: {integrity: sha512-fJegqZZ0ZX8HOWr6rcafGr72+xcgJKI9oWfDW5DrD7ExUtgZC7a7R7ZYmZqplh7XDocFdGeIFn7roAxhOeYrPQ==} + /case-sensitive-paths-webpack-plugin@2.4.0: resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} engines: {node: '>=4'} dev: false - /catharsis@0.9.0: - resolution: {integrity: sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==} - engines: {node: '>= 10'} - requiresBuild: true - dependencies: - lodash: 4.17.21 - dev: false - optional: true - /chalk@1.1.3: resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} engines: {node: '>=0.10.0'} @@ -10346,6 +10256,10 @@ packages: resolution: {integrity: sha512-/2NljkKlOCvNgs8jsIlJcCFhUfF6C1JJKM8PdJQ6HqIrqhJBouMcWFdeDJLNLZAadeTj0K9FMziH74hpEtAr1g==} dev: false + /cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + dev: true + /cjs-module-lexer@1.3.1: resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} @@ -10920,13 +10834,13 @@ packages: timsort: 0.3.0 dev: true - /css-declaration-sorter@6.4.1(postcss@8.4.40): + /css-declaration-sorter@6.4.1(postcss@8.4.41): resolution: {integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==} engines: {node: ^10 || ^12 || >=14} peerDependencies: postcss: ^8.0.9 dependencies: - postcss: 8.4.40 + postcss: 8.4.41 dev: false /css-has-pseudo@3.0.4(postcss@8.4.40): @@ -10958,12 +10872,12 @@ packages: webpack: optional: true dependencies: - icss-utils: 5.1.0(postcss@8.4.40) - postcss: 8.4.40 - postcss-modules-extract-imports: 3.1.0(postcss@8.4.40) - postcss-modules-local-by-default: 4.0.5(postcss@8.4.40) - postcss-modules-scope: 3.2.0(postcss@8.4.40) - postcss-modules-values: 4.0.0(postcss@8.4.40) + icss-utils: 5.1.0(postcss@8.4.41) + postcss: 8.4.41 + postcss-modules-extract-imports: 3.1.0(postcss@8.4.41) + postcss-modules-local-by-default: 4.0.5(postcss@8.4.41) + postcss-modules-scope: 3.2.0(postcss@8.4.41) + postcss-modules-values: 4.0.0(postcss@8.4.41) postcss-value-parser: 4.2.0 semver: 7.6.3 webpack: 5.93.0(webpack-cli@5.1.4) @@ -10988,9 +10902,9 @@ packages: esbuild: optional: true dependencies: - cssnano: 5.1.15(postcss@8.4.40) + cssnano: 5.1.15(postcss@8.4.41) jest-worker: 27.5.1 - postcss: 8.4.40 + postcss: 8.4.41 schema-utils: 4.2.0 serialize-javascript: 6.0.2 source-map: 0.6.1 @@ -11128,42 +11042,42 @@ packages: postcss-unique-selectors: 4.0.1 dev: true - /cssnano-preset-default@5.2.14(postcss@8.4.40): + /cssnano-preset-default@5.2.14(postcss@8.4.41): resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - css-declaration-sorter: 6.4.1(postcss@8.4.40) - cssnano-utils: 3.1.0(postcss@8.4.40) - postcss: 8.4.40 - postcss-calc: 8.2.4(postcss@8.4.40) - postcss-colormin: 5.3.1(postcss@8.4.40) - postcss-convert-values: 5.1.3(postcss@8.4.40) - postcss-discard-comments: 5.1.2(postcss@8.4.40) - postcss-discard-duplicates: 5.1.0(postcss@8.4.40) - postcss-discard-empty: 5.1.1(postcss@8.4.40) - postcss-discard-overridden: 5.1.0(postcss@8.4.40) - postcss-merge-longhand: 5.1.7(postcss@8.4.40) - postcss-merge-rules: 5.1.4(postcss@8.4.40) - postcss-minify-font-values: 5.1.0(postcss@8.4.40) - postcss-minify-gradients: 5.1.1(postcss@8.4.40) - postcss-minify-params: 5.1.4(postcss@8.4.40) - postcss-minify-selectors: 5.2.1(postcss@8.4.40) - postcss-normalize-charset: 5.1.0(postcss@8.4.40) - postcss-normalize-display-values: 5.1.0(postcss@8.4.40) - postcss-normalize-positions: 5.1.1(postcss@8.4.40) - postcss-normalize-repeat-style: 5.1.1(postcss@8.4.40) - postcss-normalize-string: 5.1.0(postcss@8.4.40) - postcss-normalize-timing-functions: 5.1.0(postcss@8.4.40) - postcss-normalize-unicode: 5.1.1(postcss@8.4.40) - postcss-normalize-url: 5.1.0(postcss@8.4.40) - postcss-normalize-whitespace: 5.1.1(postcss@8.4.40) - postcss-ordered-values: 5.1.3(postcss@8.4.40) - postcss-reduce-initial: 5.1.2(postcss@8.4.40) - postcss-reduce-transforms: 5.1.0(postcss@8.4.40) - postcss-svgo: 5.1.0(postcss@8.4.40) - postcss-unique-selectors: 5.1.1(postcss@8.4.40) + css-declaration-sorter: 6.4.1(postcss@8.4.41) + cssnano-utils: 3.1.0(postcss@8.4.41) + postcss: 8.4.41 + postcss-calc: 8.2.4(postcss@8.4.41) + postcss-colormin: 5.3.1(postcss@8.4.41) + postcss-convert-values: 5.1.3(postcss@8.4.41) + postcss-discard-comments: 5.1.2(postcss@8.4.41) + postcss-discard-duplicates: 5.1.0(postcss@8.4.41) + postcss-discard-empty: 5.1.1(postcss@8.4.41) + postcss-discard-overridden: 5.1.0(postcss@8.4.41) + postcss-merge-longhand: 5.1.7(postcss@8.4.41) + postcss-merge-rules: 5.1.4(postcss@8.4.41) + postcss-minify-font-values: 5.1.0(postcss@8.4.41) + postcss-minify-gradients: 5.1.1(postcss@8.4.41) + postcss-minify-params: 5.1.4(postcss@8.4.41) + postcss-minify-selectors: 5.2.1(postcss@8.4.41) + postcss-normalize-charset: 5.1.0(postcss@8.4.41) + postcss-normalize-display-values: 5.1.0(postcss@8.4.41) + postcss-normalize-positions: 5.1.1(postcss@8.4.41) + postcss-normalize-repeat-style: 5.1.1(postcss@8.4.41) + postcss-normalize-string: 5.1.0(postcss@8.4.41) + postcss-normalize-timing-functions: 5.1.0(postcss@8.4.41) + postcss-normalize-unicode: 5.1.1(postcss@8.4.41) + postcss-normalize-url: 5.1.0(postcss@8.4.41) + postcss-normalize-whitespace: 5.1.1(postcss@8.4.41) + postcss-ordered-values: 5.1.3(postcss@8.4.41) + postcss-reduce-initial: 5.1.2(postcss@8.4.41) + postcss-reduce-transforms: 5.1.0(postcss@8.4.41) + postcss-svgo: 5.1.0(postcss@8.4.41) + postcss-unique-selectors: 5.1.1(postcss@8.4.41) dev: false /cssnano-util-get-arguments@4.0.0: @@ -11188,13 +11102,13 @@ packages: engines: {node: '>=6.9.0'} dev: true - /cssnano-utils@3.1.0(postcss@8.4.40): + /cssnano-utils@3.1.0(postcss@8.4.41): resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.40 + postcss: 8.4.41 dev: false /cssnano@4.1.11: @@ -11207,15 +11121,15 @@ packages: postcss: 7.0.39 dev: true - /cssnano@5.1.15(postcss@8.4.40): + /cssnano@5.1.15(postcss@8.4.41): resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-preset-default: 5.2.14(postcss@8.4.40) + cssnano-preset-default: 5.2.14(postcss@8.4.41) lilconfig: 2.1.0 - postcss: 8.4.40 + postcss: 8.4.41 yaml: 1.10.2 dev: false @@ -11412,7 +11326,7 @@ packages: supports-color: optional: true dependencies: - ms: 2.1.1 + ms: 2.1.3 dev: true /debug@4.3.6(supports-color@5.5.0): @@ -11900,14 +11814,14 @@ packages: safe-buffer: 5.2.1 dev: false - /edge-runtime@2.5.7: - resolution: {integrity: sha512-gA4qSVP0sNwJlkdQ2nahDPASlSl8twUd17o+JolPa1EtXpLTGzIpOETvodgJwXIxa+zaD8bnAXCdsWrx2PhlVQ==} + /edge-runtime@2.5.9: + resolution: {integrity: sha512-pk+k0oK0PVXdlT4oRp4lwh+unuKB7Ng4iZ2HB+EZ7QCEQizX360Rp/F4aRpgpRgdP2ufB35N+1KppHmYjqIGSg==} engines: {node: '>=16'} hasBin: true dependencies: - '@edge-runtime/format': 2.2.0 - '@edge-runtime/ponyfill': 2.4.1 - '@edge-runtime/vm': 3.1.7 + '@edge-runtime/format': 2.2.1 + '@edge-runtime/ponyfill': 2.4.2 + '@edge-runtime/vm': 3.2.0 async-listen: 3.0.1 mri: 1.2.0 picocolors: 1.0.0 @@ -11996,15 +11910,6 @@ packages: graceful-fs: 4.2.11 tapable: 2.2.1 - /ent@2.2.1: - resolution: {integrity: sha512-QHuXVeZx9d+tIQAz/XztU0ZwZf2Agg9CcXcgE1rurqvdBeDBrpSwjl8/6XUqMg7tw2Y7uAdKb2sRv+bSEFqQ5A==} - engines: {node: '>= 0.4'} - requiresBuild: true - dependencies: - punycode: 1.4.1 - dev: false - optional: true - /entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} @@ -12144,6 +12049,10 @@ packages: iterator.prototype: 1.1.2 safe-array-concat: 1.1.2 + /es-module-lexer@1.4.1: + resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + dev: true + /es-module-lexer@1.5.4: resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} @@ -12979,11 +12888,6 @@ packages: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - /exit-hook@2.2.1: - resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} - engines: {node: '>=6'} - dev: true - /exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} @@ -13094,6 +12998,11 @@ packages: - debug dev: false + /farmhash-modern@1.1.0: + resolution: {integrity: sha512-6ypT4XfgqJk/F3Yuv4SX26I3doUjt0GTG4a+JgWxXQpxXzTBq8fPUeGHfcYMMDPHJHm3yPOSjaeBwBGAHWXCdA==} + engines: {node: '>=18.0.0'} + dev: false + /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -13332,56 +13241,57 @@ packages: micromatch: 4.0.7 pkg-dir: 4.2.0 - /firebase-admin@11.11.1: - resolution: {integrity: sha512-UyEbq+3u6jWzCYbUntv/HuJiTixwh36G1R9j0v71mSvGAx/YZEWEW7uSGLYxBYE6ckVRQoKMr40PYUEzrm/4dg==} + /firebase-admin@12.3.0: + resolution: {integrity: sha512-AKJcFbOZ7W8Fwcqh6Ba7FThXVoXwPdsf+E9vyjk5Z1vN1Z9mnTw88EQWfIsR91YglQ0KvWu1rvMhW65bcB4sog==} engines: {node: '>=14'} dependencies: - '@fastify/busboy': 1.2.1 - '@firebase/database-compat': 0.3.4 - '@firebase/database-types': 0.10.4 - '@types/node': 18.19.42 + '@fastify/busboy': 3.0.0 + '@firebase/database-compat': 1.0.6 + '@firebase/database-types': 1.0.4 + '@types/node': 20.14.14 + farmhash-modern: 1.1.0 jsonwebtoken: 9.0.2 jwks-rsa: 3.1.0 node-forge: 1.3.1 - uuid: 9.0.1 + uuid: 10.0.0 optionalDependencies: - '@google-cloud/firestore': 6.8.0 - '@google-cloud/storage': 6.12.0 + '@google-cloud/firestore': 7.9.0 + '@google-cloud/storage': 7.12.0 transitivePeerDependencies: - encoding - supports-color dev: false - /firebase@10.12.4: - resolution: {integrity: sha512-SQz49NMpwG4MLTPZ9C8jBp7IyS2haTvsIvjclgu+v/jvzNtjZoxIcoF6A13EIfBHmJ5eiuVlvttxElOf7LnJew==} + /firebase@10.12.5: + resolution: {integrity: sha512-J0yL3yh12CfFprTkSOQ9HqBugERyqvWwOuOoo1j1QHmYe9cYLKnBmtNCvGIYInDcsVUnJoRXCM+hxbGf48oVhg==} dependencies: - '@firebase/analytics': 0.10.6(@firebase/app@0.10.7) - '@firebase/analytics-compat': 0.2.12(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7) - '@firebase/app': 0.10.7 - '@firebase/app-check': 0.8.6(@firebase/app@0.10.7) - '@firebase/app-check-compat': 0.3.13(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7) - '@firebase/app-compat': 0.2.37 + '@firebase/analytics': 0.10.7(@firebase/app@0.10.8) + '@firebase/analytics-compat': 0.2.13(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8) + '@firebase/app': 0.10.8 + '@firebase/app-check': 0.8.7(@firebase/app@0.10.8) + '@firebase/app-check-compat': 0.3.14(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8) + '@firebase/app-compat': 0.2.38 '@firebase/app-types': 0.9.2 - '@firebase/auth': 1.7.5(@firebase/app@0.10.7) - '@firebase/auth-compat': 0.5.10(@firebase/app-compat@0.2.37)(@firebase/app-types@0.9.2)(@firebase/app@0.10.7) - '@firebase/database': 1.0.6 - '@firebase/database-compat': 1.0.6 - '@firebase/firestore': 4.6.4(@firebase/app@0.10.7) - '@firebase/firestore-compat': 0.3.33(@firebase/app-compat@0.2.37)(@firebase/app-types@0.9.2)(@firebase/app@0.10.7) - '@firebase/functions': 0.11.6(@firebase/app@0.10.7) - '@firebase/functions-compat': 0.3.12(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7) - '@firebase/installations': 0.6.8(@firebase/app@0.10.7) - '@firebase/installations-compat': 0.2.8(@firebase/app-compat@0.2.37)(@firebase/app-types@0.9.2)(@firebase/app@0.10.7) - '@firebase/messaging': 0.12.10(@firebase/app@0.10.7) - '@firebase/messaging-compat': 0.2.10(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7) - '@firebase/performance': 0.6.8(@firebase/app@0.10.7) - '@firebase/performance-compat': 0.2.8(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7) - '@firebase/remote-config': 0.4.8(@firebase/app@0.10.7) - '@firebase/remote-config-compat': 0.2.8(@firebase/app-compat@0.2.37)(@firebase/app@0.10.7) - '@firebase/storage': 0.12.6(@firebase/app@0.10.7) - '@firebase/storage-compat': 0.3.9(@firebase/app-compat@0.2.37)(@firebase/app-types@0.9.2)(@firebase/app@0.10.7) + '@firebase/auth': 1.7.6(@firebase/app@0.10.8) + '@firebase/auth-compat': 0.5.11(@firebase/app-compat@0.2.38)(@firebase/app-types@0.9.2)(@firebase/app@0.10.8) + '@firebase/database': 1.0.7 + '@firebase/database-compat': 1.0.7 + '@firebase/firestore': 4.6.5(@firebase/app@0.10.8) + '@firebase/firestore-compat': 0.3.34(@firebase/app-compat@0.2.38)(@firebase/app-types@0.9.2)(@firebase/app@0.10.8) + '@firebase/functions': 0.11.6(@firebase/app@0.10.8) + '@firebase/functions-compat': 0.3.12(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8) + '@firebase/installations': 0.6.8(@firebase/app@0.10.8) + '@firebase/installations-compat': 0.2.8(@firebase/app-compat@0.2.38)(@firebase/app-types@0.9.2)(@firebase/app@0.10.8) + '@firebase/messaging': 0.12.10(@firebase/app@0.10.8) + '@firebase/messaging-compat': 0.2.10(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8) + '@firebase/performance': 0.6.8(@firebase/app@0.10.8) + '@firebase/performance-compat': 0.2.8(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8) + '@firebase/remote-config': 0.4.8(@firebase/app@0.10.8) + '@firebase/remote-config-compat': 0.2.8(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8) + '@firebase/storage': 0.12.6(@firebase/app@0.10.8) + '@firebase/storage-compat': 0.3.9(@firebase/app-compat@0.2.38)(@firebase/app-types@0.9.2)(@firebase/app@0.10.8) '@firebase/util': 1.9.7 - '@firebase/vertexai-preview': 0.0.3(@firebase/app-types@0.9.2)(@firebase/app@0.10.7) + '@firebase/vertexai-preview': 0.0.3(@firebase/app-types@0.9.2)(@firebase/app@0.10.8) transitivePeerDependencies: - '@react-native-async-storage/async-storage' @@ -13687,21 +13597,6 @@ packages: - supports-color dev: false - /gaxios@5.1.3: - resolution: {integrity: sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==} - engines: {node: '>=12'} - requiresBuild: true - dependencies: - extend: 3.0.2 - https-proxy-agent: 5.0.1 - is-stream: 2.0.1 - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - optional: true - /gaxios@6.7.0: resolution: {integrity: sha512-DSrkyMTfAnAm4ks9Go20QGOcXEyW/NmZhvTYBU2rb4afBB393WIMQPWPEDMl/k8xqiNN9HYq2zao3oWXsdl2Tg==} engines: {node: '>=14'} @@ -13727,19 +13622,6 @@ packages: - supports-color dev: false - /gcp-metadata@5.3.0: - resolution: {integrity: sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==} - engines: {node: '>=12'} - requiresBuild: true - dependencies: - gaxios: 5.1.3 - json-bigint: 1.0.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - optional: true - /gcp-metadata@6.1.0: resolution: {integrity: sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==} engines: {node: '>=14'} @@ -14014,26 +13896,6 @@ packages: - supports-color dev: false - /google-auth-library@8.9.0: - resolution: {integrity: sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg==} - engines: {node: '>=12'} - requiresBuild: true - dependencies: - arrify: 2.0.1 - base64-js: 1.5.1 - ecdsa-sig-formatter: 1.0.11 - fast-text-encoding: 1.0.6 - gaxios: 5.1.3 - gcp-metadata: 5.3.0 - gtoken: 6.1.2 - jws: 4.0.0 - lru-cache: 6.0.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - optional: true - /google-auth-library@9.12.0: resolution: {integrity: sha512-5pWjpxJMNJ5UTuhK7QPD5KFPsbosWkX4ajMDeZwXllTtwwqeiIzPWbHIddkLBkkn0mUPboTmukT5rd30Ec9igQ==} engines: {node: '>=14'} @@ -14049,33 +13911,6 @@ packages: - supports-color dev: false - /google-gax@3.6.1: - resolution: {integrity: sha512-g/lcUjGcB6DSw2HxgEmCDOrI/CByOwqRvsuUvNalHUK2iPPPlmAIpbMbl62u0YufGMr8zgE3JL7th6dCb1Ry+w==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - dependencies: - '@grpc/grpc-js': 1.8.22 - '@grpc/proto-loader': 0.7.13 - '@types/long': 4.0.2 - '@types/rimraf': 3.0.2 - abort-controller: 3.0.0 - duplexify: 4.1.3 - fast-text-encoding: 1.0.6 - google-auth-library: 8.9.0 - is-stream-ended: 0.1.4 - node-fetch: 2.7.0 - object-hash: 3.0.0 - proto3-json-serializer: 1.1.1 - protobufjs: 7.2.4 - protobufjs-cli: 1.1.1(protobufjs@7.2.4) - retry-request: 5.0.2 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - optional: true - /google-gax@4.3.8: resolution: {integrity: sha512-SKAQKtvdjtNW3PMOhmKEqpQP+2C5ZqNKfwWxy70efpSwxvRYuAcgMJs6aRHTBPJjz3SO6ZbiXwM6WIuGYFZ7LQ==} engines: {node: '>=14'} @@ -14106,17 +13941,6 @@ packages: node-forge: 1.3.1 dev: false - /google-p12-pem@4.0.1: - resolution: {integrity: sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==} - engines: {node: '>=12.0.0'} - deprecated: Package is no longer maintained - hasBin: true - requiresBuild: true - dependencies: - node-forge: 1.3.1 - dev: false - optional: true - /googleapis-common@7.2.0: resolution: {integrity: sha512-/fhDZEJZvOV3X5jmD+fKxMqma5q2Q9nZNSF3kn1F18tpxmA86BcTxAGBQdM0N89Z3bEaIs+HVznSmFJEAmMTjA==} engines: {node: '>=14.0.0'} @@ -14170,20 +13994,6 @@ packages: - supports-color dev: false - /gtoken@6.1.2: - resolution: {integrity: sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==} - engines: {node: '>=12.0.0'} - requiresBuild: true - dependencies: - gaxios: 5.1.3 - google-p12-pem: 4.0.1 - jws: 4.0.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - optional: true - /gtoken@7.1.0: resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} engines: {node: '>=14.0.0'} @@ -14598,13 +14408,13 @@ packages: resolution: {integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==} dev: true - /icss-utils@5.1.0(postcss@8.4.40): + /icss-utils@5.1.0(postcss@8.4.41): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.40 + postcss: 8.4.41 dev: false /idb@7.1.1: @@ -14788,11 +14598,11 @@ packages: yoctocolors-cjs: 2.1.2 dev: true - /intercom-client@4.0.0: - resolution: {integrity: sha512-xtAsO0wnyd46JNRP98/JK0BXIfWNTO/tUk+1op4rnZ+N/DSdhAaBw8ZaJD8bL8ePNhyAMl/Vd6h7kYI/h9riaw==} + /intercom-client@5.0.0: + resolution: {integrity: sha512-fEzM9w+apUwK6roDyZPvfXqmI9mrdM5Nz0QmCeDTM/8G2I0464SzJDfLTDRvz+ZkY6EIeTHEaQnK09DmYgqRhA==} engines: {node: '>= v8.0.0'} dependencies: - axios: 0.24.0 + axios: 1.7.2 htmlencode: 0.0.4 lodash: 4.17.21 transitivePeerDependencies: @@ -15121,12 +14931,6 @@ packages: dependencies: call-bind: 1.0.7 - /is-stream-ended@0.1.4: - resolution: {integrity: sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==} - requiresBuild: true - dev: false - optional: true - /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -16658,41 +16462,9 @@ packages: dependencies: argparse: 2.0.1 - /js2xmlparser@4.0.2: - resolution: {integrity: sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==} - requiresBuild: true - dependencies: - xmlcreate: 2.0.4 - dev: false - optional: true - /jsbn@1.1.0: resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - /jsdoc@4.0.3: - resolution: {integrity: sha512-Nu7Sf35kXJ1MWDZIMAuATRQTg1iIPdzh7tqJ6jjvaU/GfDf+qi5UV8zJR3Mo+/pYFvm8mzay4+6O5EWigaQBQw==} - engines: {node: '>=12.0.0'} - hasBin: true - requiresBuild: true - dependencies: - '@babel/parser': 7.25.0 - '@jsdoc/salty': 0.2.8 - '@types/markdown-it': 14.1.2 - bluebird: 3.7.2 - catharsis: 0.9.0 - escape-string-regexp: 2.0.0 - js2xmlparser: 4.0.2 - klaw: 3.0.0 - markdown-it: 14.1.0 - markdown-it-anchor: 8.6.7(@types/markdown-it@14.1.2)(markdown-it@14.1.0) - marked: 4.3.0 - mkdirp: 1.0.4 - requizzle: 0.2.4 - strip-json-comments: 3.1.1 - underscore: 1.13.7 - dev: false - optional: true - /jsdom@16.7.0: resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} engines: {node: '>=10'} @@ -16978,14 +16750,6 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - /klaw@3.0.0: - resolution: {integrity: sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==} - requiresBuild: true - dependencies: - graceful-fs: 4.2.11 - dev: false - optional: true - /kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} @@ -17087,14 +16851,6 @@ packages: /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - /linkify-it@5.0.0: - resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - requiresBuild: true - dependencies: - uc.micro: 2.1.0 - dev: false - optional: true - /load-yaml-file@0.2.0: resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} engines: {node: '>=6'} @@ -17450,32 +17206,6 @@ packages: engines: {node: '>=8'} dev: false - /markdown-it-anchor@8.6.7(@types/markdown-it@14.1.2)(markdown-it@14.1.0): - resolution: {integrity: sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==} - requiresBuild: true - peerDependencies: - '@types/markdown-it': '*' - markdown-it: '*' - dependencies: - '@types/markdown-it': 14.1.2 - markdown-it: 14.1.0 - dev: false - optional: true - - /markdown-it@14.1.0: - resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} - hasBin: true - requiresBuild: true - dependencies: - argparse: 2.0.1 - entities: 4.5.0 - linkify-it: 5.0.0 - mdurl: 2.0.0 - punycode.js: 2.3.1 - uc.micro: 2.1.0 - dev: false - optional: true - /markdown-to-jsx@7.4.7(react@18.3.1): resolution: {integrity: sha512-0+ls1IQZdU6cwM1yu0ZjjiVWYtkbExSyUIFU2ZeDIFuZM1W42Mh4OlJ4nb4apX4H8smxDHRdFaoIVJGwfv5hkg==} engines: {node: '>= 10'} @@ -17485,14 +17215,6 @@ packages: react: 18.3.1 dev: false - /marked@4.3.0: - resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} - engines: {node: '>= 12'} - hasBin: true - requiresBuild: true - dev: false - optional: true - /matched@5.0.1: resolution: {integrity: sha512-E1fhSTPRyhAlNaNvGXAgZQlq1hL0bgYMTk/6bktVlIhzUnX/SZs7296ACdVeNJE8xFNGSuvd9IpI7vSnmcqLvw==} engines: {node: '>=10'} @@ -17525,12 +17247,6 @@ packages: /mdn-data@2.0.4: resolution: {integrity: sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==} - /mdurl@2.0.0: - resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - requiresBuild: true - dev: false - optional: true - /media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -19733,12 +19449,12 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-calc@8.2.4(postcss@8.4.40): + /postcss-calc@8.2.4(postcss@8.4.41): resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} peerDependencies: postcss: ^8.2.2 dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-selector-parser: 6.1.1 postcss-value-parser: 4.2.0 dev: false @@ -19794,7 +19510,7 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-colormin@5.3.1(postcss@8.4.40): + /postcss-colormin@5.3.1(postcss@8.4.41): resolution: {integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -19803,7 +19519,7 @@ packages: browserslist: 4.23.2 caniuse-api: 3.0.0 colord: 2.9.3 - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 dev: false @@ -19815,14 +19531,14 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-convert-values@5.1.3(postcss@8.4.40): + /postcss-convert-values@5.1.3(postcss@8.4.41): resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: browserslist: 4.23.2 - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 dev: false @@ -19873,13 +19589,13 @@ packages: postcss: 7.0.39 dev: true - /postcss-discard-comments@5.1.2(postcss@8.4.40): + /postcss-discard-comments@5.1.2(postcss@8.4.41): resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.40 + postcss: 8.4.41 dev: false /postcss-discard-duplicates@4.0.2: @@ -19889,13 +19605,13 @@ packages: postcss: 7.0.39 dev: true - /postcss-discard-duplicates@5.1.0(postcss@8.4.40): + /postcss-discard-duplicates@5.1.0(postcss@8.4.41): resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.40 + postcss: 8.4.41 dev: false /postcss-discard-empty@4.0.1: @@ -19905,13 +19621,13 @@ packages: postcss: 7.0.39 dev: true - /postcss-discard-empty@5.1.1(postcss@8.4.40): + /postcss-discard-empty@5.1.1(postcss@8.4.41): resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.40 + postcss: 8.4.41 dev: false /postcss-discard-overridden@4.0.1: @@ -19921,13 +19637,13 @@ packages: postcss: 7.0.39 dev: true - /postcss-discard-overridden@5.1.0(postcss@8.4.40): + /postcss-discard-overridden@5.1.0(postcss@8.4.41): resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.40 + postcss: 8.4.41 dev: false /postcss-double-position-gradients@3.1.2(postcss@8.4.40): @@ -20112,15 +19828,15 @@ packages: stylehacks: 4.0.3 dev: true - /postcss-merge-longhand@5.1.7(postcss@8.4.40): + /postcss-merge-longhand@5.1.7(postcss@8.4.41): resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 - stylehacks: 5.1.1(postcss@8.4.40) + stylehacks: 5.1.1(postcss@8.4.41) dev: false /postcss-merge-rules@4.0.3: @@ -20135,7 +19851,7 @@ packages: vendors: 1.0.4 dev: true - /postcss-merge-rules@5.1.4(postcss@8.4.40): + /postcss-merge-rules@5.1.4(postcss@8.4.41): resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -20143,8 +19859,8 @@ packages: dependencies: browserslist: 4.23.2 caniuse-api: 3.0.0 - cssnano-utils: 3.1.0(postcss@8.4.40) - postcss: 8.4.40 + cssnano-utils: 3.1.0(postcss@8.4.41) + postcss: 8.4.41 postcss-selector-parser: 6.1.1 dev: false @@ -20156,13 +19872,13 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-minify-font-values@5.1.0(postcss@8.4.40): + /postcss-minify-font-values@5.1.0(postcss@8.4.41): resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 dev: false @@ -20176,15 +19892,15 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-minify-gradients@5.1.1(postcss@8.4.40): + /postcss-minify-gradients@5.1.1(postcss@8.4.41): resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: colord: 2.9.3 - cssnano-utils: 3.1.0(postcss@8.4.40) - postcss: 8.4.40 + cssnano-utils: 3.1.0(postcss@8.4.41) + postcss: 8.4.41 postcss-value-parser: 4.2.0 dev: false @@ -20200,15 +19916,15 @@ packages: uniqs: 2.0.0 dev: true - /postcss-minify-params@5.1.4(postcss@8.4.40): + /postcss-minify-params@5.1.4(postcss@8.4.41): resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: browserslist: 4.23.2 - cssnano-utils: 3.1.0(postcss@8.4.40) - postcss: 8.4.40 + cssnano-utils: 3.1.0(postcss@8.4.41) + postcss: 8.4.41 postcss-value-parser: 4.2.0 dev: false @@ -20222,13 +19938,13 @@ packages: postcss-selector-parser: 3.1.2 dev: true - /postcss-minify-selectors@5.2.1(postcss@8.4.40): + /postcss-minify-selectors@5.2.1(postcss@8.4.41): resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-selector-parser: 6.1.1 dev: false @@ -20238,13 +19954,13 @@ packages: postcss: 6.0.1 dev: true - /postcss-modules-extract-imports@3.1.0(postcss@8.4.40): + /postcss-modules-extract-imports@3.1.0(postcss@8.4.41): resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.40 + postcss: 8.4.41 dev: false /postcss-modules-local-by-default@1.2.0: @@ -20254,14 +19970,14 @@ packages: postcss: 6.0.1 dev: true - /postcss-modules-local-by-default@4.0.5(postcss@8.4.40): + /postcss-modules-local-by-default@4.0.5(postcss@8.4.41): resolution: {integrity: sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.40) - postcss: 8.4.40 + icss-utils: 5.1.0(postcss@8.4.41) + postcss: 8.4.41 postcss-selector-parser: 6.1.1 postcss-value-parser: 4.2.0 dev: false @@ -20273,13 +19989,13 @@ packages: postcss: 6.0.1 dev: true - /postcss-modules-scope@3.2.0(postcss@8.4.40): + /postcss-modules-scope@3.2.0(postcss@8.4.41): resolution: {integrity: sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-selector-parser: 6.1.1 dev: false @@ -20290,14 +20006,14 @@ packages: postcss: 6.0.1 dev: true - /postcss-modules-values@4.0.0(postcss@8.4.40): + /postcss-modules-values@4.0.0(postcss@8.4.41): resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.40) - postcss: 8.4.40 + icss-utils: 5.1.0(postcss@8.4.41) + postcss: 8.4.41 dev: false /postcss-modules@2.0.0: @@ -20337,13 +20053,13 @@ packages: postcss: 7.0.39 dev: true - /postcss-normalize-charset@5.1.0(postcss@8.4.40): + /postcss-normalize-charset@5.1.0(postcss@8.4.41): resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.40 + postcss: 8.4.41 dev: false /postcss-normalize-display-values@4.0.2: @@ -20355,13 +20071,13 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-display-values@5.1.0(postcss@8.4.40): + /postcss-normalize-display-values@5.1.0(postcss@8.4.41): resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 dev: false @@ -20375,13 +20091,13 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-positions@5.1.1(postcss@8.4.40): + /postcss-normalize-positions@5.1.1(postcss@8.4.41): resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 dev: false @@ -20395,13 +20111,13 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-repeat-style@5.1.1(postcss@8.4.40): + /postcss-normalize-repeat-style@5.1.1(postcss@8.4.41): resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 dev: false @@ -20414,13 +20130,13 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-string@5.1.0(postcss@8.4.40): + /postcss-normalize-string@5.1.0(postcss@8.4.41): resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 dev: false @@ -20433,13 +20149,13 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-timing-functions@5.1.0(postcss@8.4.40): + /postcss-normalize-timing-functions@5.1.0(postcss@8.4.41): resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 dev: false @@ -20452,14 +20168,14 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-unicode@5.1.1(postcss@8.4.40): + /postcss-normalize-unicode@5.1.1(postcss@8.4.41): resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: browserslist: 4.23.2 - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 dev: false @@ -20473,14 +20189,14 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-url@5.1.0(postcss@8.4.40): + /postcss-normalize-url@5.1.0(postcss@8.4.41): resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: normalize-url: 6.1.0 - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 dev: false @@ -20492,13 +20208,13 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-whitespace@5.1.1(postcss@8.4.40): + /postcss-normalize-whitespace@5.1.1(postcss@8.4.41): resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 dev: false @@ -20534,14 +20250,14 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-ordered-values@5.1.3(postcss@8.4.40): + /postcss-ordered-values@5.1.3(postcss@8.4.41): resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-utils: 3.1.0(postcss@8.4.40) - postcss: 8.4.40 + cssnano-utils: 3.1.0(postcss@8.4.41) + postcss: 8.4.41 postcss-value-parser: 4.2.0 dev: false @@ -20593,7 +20309,7 @@ packages: '@csstools/postcss-text-decoration-shorthand': 1.0.0(postcss@8.4.40) '@csstools/postcss-trigonometric-functions': 1.0.2(postcss@8.4.40) '@csstools/postcss-unset-value': 1.0.2(postcss@8.4.40) - autoprefixer: 10.4.19(postcss@8.4.40) + autoprefixer: 10.4.20(postcss@8.4.40) browserslist: 4.23.2 css-blank-pseudo: 3.0.3(postcss@8.4.40) css-has-pseudo: 3.0.4(postcss@8.4.40) @@ -20651,7 +20367,7 @@ packages: postcss: 7.0.39 dev: true - /postcss-reduce-initial@5.1.2(postcss@8.4.40): + /postcss-reduce-initial@5.1.2(postcss@8.4.41): resolution: {integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -20659,7 +20375,7 @@ packages: dependencies: browserslist: 4.23.2 caniuse-api: 3.0.0 - postcss: 8.4.40 + postcss: 8.4.41 dev: false /postcss-reduce-transforms@4.0.2: @@ -20672,13 +20388,13 @@ packages: postcss-value-parser: 3.3.1 dev: true - /postcss-reduce-transforms@5.1.0(postcss@8.4.40): + /postcss-reduce-transforms@5.1.0(postcss@8.4.41): resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 dev: false @@ -20733,13 +20449,13 @@ packages: svgo: 1.3.2 dev: true - /postcss-svgo@5.1.0(postcss@8.4.40): + /postcss-svgo@5.1.0(postcss@8.4.41): resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 svgo: 2.8.0 dev: false @@ -20753,13 +20469,13 @@ packages: uniqs: 2.0.0 dev: true - /postcss-unique-selectors@5.1.1(postcss@8.4.40): + /postcss-unique-selectors@5.1.1(postcss@8.4.41): resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-selector-parser: 6.1.1 dev: false @@ -20803,6 +20519,14 @@ packages: picocolors: 1.0.1 source-map-js: 1.2.0 + /postcss@8.4.41: + resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + /postgres-array@2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} @@ -20842,11 +20566,12 @@ packages: /postgres-range@1.1.4: resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==} - /posthog-node@2.6.0: - resolution: {integrity: sha512-/BiFw/jwdP0uJSRAIoYqLoBTjZ612xv74b1L/a3T/p1nJVL8e0OrHuxbJW56c6WVW/IKm9gBF/zhbqfaz0XgJQ==} + /posthog-node@4.0.1: + resolution: {integrity: sha512-rtqm2h22QxLGBrW2bLYzbRhliIrqgZ0k+gF0LkQ1SNdeD06YE5eilV0MxZppFSxC8TfH0+B0cWCuebEnreIDgQ==} engines: {node: '>=15.0.0'} dependencies: - axios: 0.27.2 + axios: 1.7.2 + rusha: 0.8.14 transitivePeerDependencies: - debug dev: false @@ -21097,15 +20822,6 @@ packages: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} dev: false - /proto3-json-serializer@1.1.1: - resolution: {integrity: sha512-AwAuY4g9nxx0u52DnSMkqqgyLHaW/XaPLtaAo3y/ZCfeaQB/g4YDH4kb8Wc/mWzWvu0YjOznVnfn373MVZZrgw==} - engines: {node: '>=12.0.0'} - requiresBuild: true - dependencies: - protobufjs: 7.3.2 - dev: false - optional: true - /proto3-json-serializer@2.0.2: resolution: {integrity: sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==} engines: {node: '>=14.0.0'} @@ -21113,48 +20829,6 @@ packages: protobufjs: 7.3.2 dev: false - /protobufjs-cli@1.1.1(protobufjs@7.2.4): - resolution: {integrity: sha512-VPWMgIcRNyQwWUv8OLPyGQ/0lQY/QTQAVN5fh+XzfDwsVw1FZ2L3DM/bcBf8WPiRz2tNpaov9lPZfNcmNo6LXA==} - engines: {node: '>=12.0.0'} - hasBin: true - requiresBuild: true - peerDependencies: - protobufjs: ^7.0.0 - dependencies: - chalk: 4.1.2 - escodegen: 1.14.3 - espree: 9.6.1 - estraverse: 5.3.0 - glob: 8.1.0 - jsdoc: 4.0.3 - minimist: 1.2.8 - protobufjs: 7.2.4 - semver: 7.6.3 - tmp: 0.2.3 - uglify-js: 3.19.1 - dev: false - optional: true - - /protobufjs@7.2.4: - resolution: {integrity: sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==} - engines: {node: '>=12.0.0'} - requiresBuild: true - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 - '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 - '@protobufjs/path': 1.1.2 - '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 - '@types/node': 18.19.42 - long: 5.2.3 - dev: false - optional: true - /protobufjs@7.3.2: resolution: {integrity: sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==} engines: {node: '>=12.0.0'} @@ -21204,19 +20878,6 @@ packages: end-of-stream: 1.4.4 once: 1.4.0 - /punycode.js@2.3.1: - resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} - engines: {node: '>=6'} - requiresBuild: true - dev: false - optional: true - - /punycode@1.4.1: - resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} - requiresBuild: true - dev: false - optional: true - /punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -22441,14 +22102,6 @@ packages: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} dev: false - /requizzle@0.2.4: - resolution: {integrity: sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==} - requiresBuild: true - dependencies: - lodash: 4.17.21 - dev: false - optional: true - /resize-observer-polyfill@1.5.1: resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} @@ -22530,18 +22183,6 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 - /retry-request@5.0.2: - resolution: {integrity: sha512-wfI3pk7EE80lCIXprqh7ym48IHYdwmAAzESdbU8Q9l7pnRCk9LEhpbOTNKjz6FARLm/Bl5m+4F0ABxOkYUujSQ==} - engines: {node: '>=12'} - requiresBuild: true - dependencies: - debug: 4.3.6(supports-color@5.5.0) - extend: 3.0.2 - transitivePeerDependencies: - - supports-color - dev: false - optional: true - /retry-request@7.0.2: resolution: {integrity: sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==} engines: {node: '>=14'} @@ -22792,6 +22433,10 @@ packages: dependencies: queue-microtask: 1.2.3 + /rusha@0.8.14: + resolution: {integrity: sha512-cLgakCUf6PedEu15t8kbsjnwIFFR2D4RfL+W3iWFJ4iac7z4B0ZI8fxy4R3J956kAI68HclCFGL8MPoUVC3qVA==} + dev: false + /rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: @@ -22834,9 +22479,6 @@ packages: /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - /safevalues@0.6.0: - resolution: {integrity: sha512-MZ7DcTOcIoPXN36/UONVE9BT0pmwlCr9WcS7Pj/q4FxOwr33FkWC0CUWj/THQXYWxf/F7urbhaHaOeFPSqGqHA==} - /sanitize.css@13.0.0: resolution: {integrity: sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==} dev: false @@ -23800,14 +23442,14 @@ packages: postcss-selector-parser: 3.1.2 dev: true - /stylehacks@5.1.1(postcss@8.4.40): + /stylehacks@5.1.1(postcss@8.4.41): resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: browserslist: 4.23.2 - postcss: 8.4.40 + postcss: 8.4.41 postcss-selector-parser: 6.1.1 dev: false @@ -24024,22 +23666,6 @@ packages: bintrees: 1.0.2 dev: false - /teeny-request@8.0.3: - resolution: {integrity: sha512-jJZpA5He2y52yUhA7pyAGZlgQpcB+xLjcN0eUFxr9c8hP/H7uOXbBNVo/O0C/xVfJLJs680jvkFgVJEEvk9+ww==} - engines: {node: '>=12'} - requiresBuild: true - dependencies: - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - node-fetch: 2.7.0 - stream-events: 1.0.5 - uuid: 9.0.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - optional: true - /teeny-request@9.0.0: resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==} engines: {node: '>=14'} @@ -24153,10 +23779,6 @@ packages: - supports-color dev: true - /text-decoding@1.0.0: - resolution: {integrity: sha512-/0TJD42KDnVwKmDK6jj3xP7E2MG7SHAOG4tyTgyUCRPdHwvkquYNLEQltmdMa3owq3TkddCVcTsoctJI8VQNKA==} - dev: false - /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -24235,6 +23857,7 @@ packages: /tmp@0.2.3: resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} engines: {node: '>=14.14'} + dev: true /tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} @@ -24457,7 +24080,7 @@ packages: - '@types/node' dev: true - /ts-node@10.9.1(@types/node@14.18.33)(typescript@4.9.5): + /ts-node@10.9.1(@types/node@16.18.11)(typescript@4.9.5): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -24476,7 +24099,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 14.18.33 + '@types/node': 16.18.11 acorn: 8.12.1 acorn-walk: 8.3.3 arg: 4.1.3 @@ -24834,12 +24457,6 @@ packages: resolution: {integrity: sha512-Aq5ppTOfvrCMgAPneW1HfWj66Xi7XL+/mIy996R1/CLS/rcyJQm6QZdsKrUeivDFQ+Oc9Wyuwor8Ze8peEoUoQ==} dev: false - /uc.micro@2.1.0: - resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - requiresBuild: true - dev: false - optional: true - /uglify-js@3.19.1: resolution: {integrity: sha512-y/2wiW+ceTYR2TSSptAhfnEtpLaQ4Ups5zrjB2d3kuVxHj16j/QJwPl5PvuGy9uARb39J0+iKxcRPvtpsx4A4A==} engines: {node: '>=0.8.0'} @@ -24866,22 +24483,9 @@ packages: resolution: {integrity: sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==} dev: false - /underscore@1.13.7: - resolution: {integrity: sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==} - requiresBuild: true - dev: false - optional: true - /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - /undici@5.26.5: - resolution: {integrity: sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==} - engines: {node: '>=14.0'} - dependencies: - '@fastify/busboy': 2.1.1 - dev: true - /undici@5.28.4: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} @@ -25012,6 +24616,16 @@ packages: escalade: 3.1.2 picocolors: 1.0.1 + /update-browserslist-db@1.1.0(browserslist@4.23.3): + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.23.3 + escalade: 3.1.2 + picocolors: 1.0.1 + /upper-case@1.1.3: resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==} dev: false @@ -25188,22 +24802,22 @@ packages: resolution: {integrity: sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==} dev: true - /vercel@32.7.2: - resolution: {integrity: sha512-esyeo67OZ/f7usKFCrx6NSjsvpo/BP/C8Mfron2uiCb4vXVcjkwOM7TwliHx6b0DbXjpzomdGVUHKRs34VNn2Q==} + /vercel@35.2.3: + resolution: {integrity: sha512-sfDUnP7dmerNZ/2PrUXLC9dJnJASFMy/UGW7Y2W0LVZbMtwH+jdLnViioRUEQaA2zbkkAipKza6w9rvD4sDvrA==} engines: {node: '>= 16'} hasBin: true dependencies: - '@vercel/build-utils': 7.3.0 + '@vercel/build-utils': 8.3.6 '@vercel/fun': 1.1.0 - '@vercel/go': 3.0.4 - '@vercel/hydrogen': 1.0.1 - '@vercel/next': 4.0.15 - '@vercel/node': 3.0.12 - '@vercel/python': 4.1.0 - '@vercel/redwood': 2.0.5 - '@vercel/remix-builder': 2.0.14 - '@vercel/ruby': 2.0.4 - '@vercel/static-build': 2.0.14 + '@vercel/go': 3.1.1 + '@vercel/hydrogen': 1.0.4 + '@vercel/next': 4.3.6 + '@vercel/node': 3.2.8 + '@vercel/python': 4.3.1 + '@vercel/redwood': 2.1.3 + '@vercel/remix-builder': 2.2.3 + '@vercel/ruby': 2.1.0 + '@vercel/static-build': 2.5.18 chokidar: 3.3.1 transitivePeerDependencies: - '@swc/core' @@ -25939,12 +25553,6 @@ packages: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} dev: false - /xmlcreate@2.0.4: - resolution: {integrity: sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==} - requiresBuild: true - dev: false - optional: true - /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} @@ -26133,7 +25741,7 @@ packages: readable-stream: 3.6.2 dev: true - /zod-prisma@0.5.4(prisma@5.17.0)(zod@3.21.4): + /zod-prisma@0.5.4(prisma@5.17.0)(zod@3.23.8): resolution: {integrity: sha512-5Ca4Qd1a1jy1T/NqCEpbr0c+EsbjJfJ/7euEHob3zDvtUK2rTuD1Rc/vfzH8q8PtaR2TZbysD88NHmrLwpv3Xg==} engines: {node: '>=14'} hasBin: true @@ -26149,19 +25757,19 @@ packages: parenthesis: 3.1.8 prisma: 5.17.0 ts-morph: 13.0.3 - zod: 3.21.4 + zod: 3.23.8 dev: true - /zod-to-json-schema@3.21.4(zod@3.21.4): - resolution: {integrity: sha512-fjUZh4nQ1s6HMccgIeE0VP4QG/YRGPmyjO9sAh890aQKPEk3nqbfUXhMFaC+Dr5KvYBm8BCyvfpZf2jY9aGSsw==} + /zod-to-json-schema@3.23.2(zod@3.23.8): + resolution: {integrity: sha512-uSt90Gzc/tUfyNqxnjlfBs8W6WSGpNBv0rVsNxP/BVSMHMKGdthPYff4xtCHYloJGM0CFxFsb3NbC0eqPhfImw==} peerDependencies: - zod: ^3.21.4 + zod: ^3.23.3 dependencies: - zod: 3.21.4 + zod: 3.23.8 dev: false - /zod@3.21.4: - resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} + /zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} /zstd-napi@0.0.6: resolution: {integrity: sha512-CKYrptAvjMhxQTuC7J42UXdmgKc73piuZHNGg0dya6qYZzPmaH31fXxuFv7B9QGAWX8tBmFlDJo9aXne7bmx3g==} diff --git a/webapps/console/components/Billing/BillingBlockingDialog.tsx b/webapps/console/components/Billing/BillingBlockingDialog.tsx index 5853da095..432fec0ce 100644 --- a/webapps/console/components/Billing/BillingBlockingDialog.tsx +++ b/webapps/console/components/Billing/BillingBlockingDialog.tsx @@ -6,11 +6,13 @@ import { upgradeRequired } from "./copy"; import { AlertTriangle, ArrowRight } from "lucide-react"; import { WJitsuButton } from "../JitsuButton/JitsuButton"; import { useWorkspace, WorkspaceContext } from "../../lib/context"; +import { useApi } from "../../lib/useApi"; const log = getLog("billing"); function LoadAndBlockIfNeed() { const billing = useBilling(); + const { data } = useApi(`/api/user/properties`); assertTrue(billing.enabled); assertFalse(billing.loading); @@ -37,7 +39,7 @@ function LoadAndBlockIfNeed() {

    Your subscription is past-due.

    } - closable={false} + closable={!!data?.admin} footer={
    Upgrade required
    } - closable={false} + closable={!!data?.admin} footer={
    actions?: { title: ReactNode; icon?: ReactNode; - hideLabel?: boolean; collapsed?: boolean; key?: string; action?: (o: T) => void; @@ -705,7 +704,6 @@ const ObjectsList: React.FC<{ objects: any[]; onDelete: (id: string) => Promise< disabled: !!(action.disabled && action.disabled(record)), href: action.link ? action.link(record) : undefined, label: action.title, - hideLabel: action.hideLabel, collapsed: action.collapsed, onClick: action.action ? () => { diff --git a/webapps/console/lib/modal.tsx b/webapps/console/lib/modal.tsx index e49c040c8..4433dff02 100644 --- a/webapps/console/lib/modal.tsx +++ b/webapps/console/lib/modal.tsx @@ -49,7 +49,7 @@ const PromptModal: React.FC<{ footer={<>} destroyOnClose={true} onCancel={() => handleResult(null)} - maskStyle={{ backdropFilter: "blur(10px)" }} + styles={{ mask: { backdropFilter: "blur(10px)" } }} >

    {question || "Dummy question. Would you mind providing an answer?"}

    diff --git a/webapps/console/package.json b/webapps/console/package.json index b2d7105f5..5e7728579 100644 --- a/webapps/console/package.json +++ b/webapps/console/package.json @@ -57,8 +57,8 @@ "cuid": "^2.1.8", "dayjs": "^1.11.10", "facebook-nodejs-business-sdk": "^19.0.0", - "firebase": "^10.4.0", - "firebase-admin": "^11.11.0", + "firebase": "^10.12.5", + "firebase-admin": "^12.3.0", "google-ads-api": "^16.0.0-rest-beta3", "googleapis": "^126.0.1", "highlight.js": "^11.6.0", @@ -70,7 +70,7 @@ "juava": "workspace:*", "lodash": "^4.17.21", "lucide-react": "^0.263.1", - "mjml": "^4.13.0", + "mjml": "^4.15.3", "mjml-react": "^2.0.8", "monaco-editor": "^0.50.0", "next": "^14.2.5", @@ -92,8 +92,8 @@ "stopwatch-node": "^1.1.0", "timezones-list": "^3.0.2", "tslib": "^2.6.3", - "zod": "3.21.4", - "zod-to-json-schema": "3.21.4" + "zod": "^3.23.8", + "zod-to-json-schema": "^3.23.2" }, "devDependencies": { "@ant-design/icons": "^5.4.0", @@ -112,7 +112,7 @@ "@types/react-dom": "18.3.0", "ansi-to-html": "^0.7.2", "antd": "^5.19.4", - "autoprefixer": "^10.4.5", + "autoprefixer": "^10.4.20", "dotenv-cli": "^6.0.0", "eslint": "^8.57.0", "eslint-config-next": "^14.2.5", @@ -122,7 +122,7 @@ "less-loader": "^10.2.0", "minimist": "^1.2.7", "next-transpile-modules": "^10.0.1", - "postcss": "^8.4.30", + "postcss": "^8.4.41", "raw-loader": "^4.0.2", "tailwindcss": "^3.0.24", "ts-node": "^10.9.2", diff --git a/webapps/console/pages/[workspaceId]/destinations.tsx b/webapps/console/pages/[workspaceId]/destinations.tsx index d7936c272..fb7136fd7 100644 --- a/webapps/console/pages/[workspaceId]/destinations.tsx +++ b/webapps/console/pages/[workspaceId]/destinations.tsx @@ -787,11 +787,13 @@ const DestinationsList: React.FC<{ type?: string }> = ({ type }) => { return ( <> = () => { return ( <> Date: Tue, 6 Aug 2024 14:14:22 +0400 Subject: [PATCH 0831/1353] console: admin can close billing block dialog --- .../console/components/Billing/BillingBlockingDialog.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/webapps/console/components/Billing/BillingBlockingDialog.tsx b/webapps/console/components/Billing/BillingBlockingDialog.tsx index 432fec0ce..d976543f2 100644 --- a/webapps/console/components/Billing/BillingBlockingDialog.tsx +++ b/webapps/console/components/Billing/BillingBlockingDialog.tsx @@ -7,12 +7,14 @@ import { AlertTriangle, ArrowRight } from "lucide-react"; import { WJitsuButton } from "../JitsuButton/JitsuButton"; import { useWorkspace, WorkspaceContext } from "../../lib/context"; import { useApi } from "../../lib/useApi"; +import { useState } from "react"; const log = getLog("billing"); function LoadAndBlockIfNeed() { const billing = useBilling(); const { data } = useApi(`/api/user/properties`); + const [showModal, setShowModal] = useState(true); assertTrue(billing.enabled); assertFalse(billing.loading); @@ -32,7 +34,7 @@ function LoadAndBlockIfNeed() { return ( @@ -40,6 +42,8 @@ function LoadAndBlockIfNeed() {
    } closable={!!data?.admin} + onOk={() => setShowModal(false)} + maskClosable={false} footer={
    Date: Tue, 6 Aug 2024 14:14:52 +0400 Subject: [PATCH 0832/1353] console: admin can close billing block dialog --- webapps/console/components/Billing/BillingBlockingDialog.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/components/Billing/BillingBlockingDialog.tsx b/webapps/console/components/Billing/BillingBlockingDialog.tsx index d976543f2..bbbe73dcf 100644 --- a/webapps/console/components/Billing/BillingBlockingDialog.tsx +++ b/webapps/console/components/Billing/BillingBlockingDialog.tsx @@ -42,7 +42,7 @@ function LoadAndBlockIfNeed() {
    } closable={!!data?.admin} - onOk={() => setShowModal(false)} + onCancel={() => setShowModal(false)} maskClosable={false} footer={
    From 19506af07bdf4931bb7a49e99616d19938134de8 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 6 Aug 2024 14:15:24 +0400 Subject: [PATCH 0833/1353] console: admin can close billing block dialog --- webapps/console/components/Billing/BillingBlockingDialog.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/webapps/console/components/Billing/BillingBlockingDialog.tsx b/webapps/console/components/Billing/BillingBlockingDialog.tsx index bbbe73dcf..db0f72c20 100644 --- a/webapps/console/components/Billing/BillingBlockingDialog.tsx +++ b/webapps/console/components/Billing/BillingBlockingDialog.tsx @@ -75,6 +75,8 @@ function LoadAndBlockIfNeed() {
    } closable={!!data?.admin} + onCancel={() => setShowModal(false)} + maskClosable={false} footer={
    Date: Sun, 11 Aug 2024 11:02:39 +0400 Subject: [PATCH 0834/1353] @jitsu/js User Privacy settings (#1116) @jitsu/js User Privacy settings --- libs/jitsu-js/__tests__/node/nodejs.test.ts | 291 +++++++++++++----- .../playwright/cases/disable-user-ids.html | 23 ++ .../__tests__/playwright/cases/dont-send.html | 22 ++ .../__tests__/playwright/cases/ip-policy.html | 22 ++ .../__tests__/playwright/integration.test.ts | 172 ++++++++++- libs/jitsu-js/package.json | 1 + libs/jitsu-js/src/analytics-plugin.ts | 191 +++++++++--- libs/jitsu-js/src/browser.ts | 61 +++- .../jitsu-js/src/destination-plugins/index.ts | 1 - libs/jitsu-js/src/index.ts | 85 +++-- libs/jitsu-js/src/jitsu.ts | 93 ------ pnpm-lock.yaml | 9 +- types/protocols/analytics.d.ts | 108 ++++++- webapps/console/lib/server/telemetry.ts | 2 +- .../console/pages/[workspaceId]/streams.tsx | 3 +- 15 files changed, 812 insertions(+), 272 deletions(-) create mode 100644 libs/jitsu-js/__tests__/playwright/cases/disable-user-ids.html create mode 100644 libs/jitsu-js/__tests__/playwright/cases/dont-send.html create mode 100644 libs/jitsu-js/__tests__/playwright/cases/ip-policy.html delete mode 100644 libs/jitsu-js/src/jitsu.ts diff --git a/libs/jitsu-js/__tests__/node/nodejs.test.ts b/libs/jitsu-js/__tests__/node/nodejs.test.ts index 1dd3a888f..dff336bd2 100644 --- a/libs/jitsu-js/__tests__/node/nodejs.test.ts +++ b/libs/jitsu-js/__tests__/node/nodejs.test.ts @@ -38,99 +38,234 @@ describe("Test Jitsu NodeJS client", () => { console.log("Server is down " + server.baseUrl); }; - test("setAnonymousId test2", async () => { + beforeAll(async () => { await startServer(); + }); + + beforeEach(() => { + requestLog = []; + }); + + afterAll(async () => { + await shutdownServer(); + }); + + test("setAnonymousId test2", async () => { + const config = { + host: server.baseUrl, + writeKey: "key:secret", + debug: true, + }; + + console.log("[JITSU TEST] Initializing Jitsu"); + const client = jitsuAnalytics(config); + console.log("[JITSU TEST] Jitsu instance", client); + + const anonymousId = "anonymous_id_test"; + console.log("[JITSU TEST] Setting anonymous id to " + anonymousId); + await client.setAnonymousId(anonymousId); + console.log("user state", client.getState("user")); + + expect(requestLog.length).toBe(0); + console.log("[JITSU TEST] Sending event EVENT_1"); + await client.track("EVENT_1"); + await client.track("EVENT_2"); + await client.track("groupId"); + + await new Promise(resolve => setTimeout(resolve, 1000)); + + expect(requestLog.length).toBe(3); + expect(requestLog[1].body.anonymousId).toBe("anonymous_id_test"); + expect(requestLog[0].body.anonymousId).toBe("anonymous_id_test"); + expect(requestLog[2].body.anonymousId).toBe("anonymous_id_test"); + }); + + test("test privacy dontSend", async () => { + const config = { + host: server.baseUrl, + writeKey: "key:secret", + debug: true, + privacy: { + dontSend: true, + }, + }; + const client = jitsuAnalytics(config); + expect(requestLog.length).toBe(0); + await client.identify("myUserId", { email: "myUserId@example.com" }); + await client.group("myGroupId", { name: "myGroupId" }); + await client.track("myEvent", { prop1: "value1" }); + await new Promise(resolve => setTimeout(resolve, 1000)); + expect(requestLog.length).toBe(0); + }); + + test("test privacy dontSend then consent", async () => { + const config = { + host: server.baseUrl, + writeKey: "key:secret", + debug: true, + privacy: { + dontSend: true, + }, + }; + const client = jitsuAnalytics(config); + expect(requestLog.length).toBe(0); + await client.identify("myUserId", { email: "myUserId@example.com" }); + await client.group("myGroupId", { name: "myGroupId" }); + await client.track("myEvent", { prop1: "value1" }); + await new Promise(resolve => setTimeout(resolve, 1000)); + expect(requestLog.length).toBe(0); + client.configure({ + privacy: { + dontSend: false, + consentCategories: { + analytics: true, + }, + }, + }); + await client.identify("myUserId", { email: "myUserId@example.com" }); + await client.group("myGroupId", { name: "myGroupId" }); + await client.track("myEvent", { prop1: "value1" }); + await new Promise(resolve => setTimeout(resolve, 1000)); + + expect(requestLog.length).toBe(3); + const p = requestLog[2]; + expect(p.type).toEqual("track"); + expect(p.body.event).toBe("myEvent"); + expect(p.body.userId).toEqual("myUserId"); + expect(p.body.groupId).toEqual("myGroupId"); + expect(p.body.context?.traits?.email).toEqual("myUserId@example.com"); + expect(p.body.context?.consent?.categoryPreferences).toEqual({ analytics: true }); + expect((p.body.anonymousId ?? "").length).toBeGreaterThan(0); + }); + + test("test privacy disableUserIds", async () => { + const config = { + host: server.baseUrl, + writeKey: "key:secret", + debug: true, + privacy: { + disableUserIds: true, + }, + }; + const client = jitsuAnalytics(config); + expect(requestLog.length).toBe(0); + await client.identify("myUserId", { email: "myUserId@example.com" }); + await client.group("myGroupId", { name: "myGroupId" }); + await client.track("myEvent", { prop1: "value1" }); + await new Promise(resolve => setTimeout(resolve, 1000)); + expect(requestLog.length).toBe(1); + const p = requestLog[0]; + expect(p.type).toEqual("track"); + expect(p.body.event).toBe("myEvent"); + expect(p.body.userId).toBeUndefined(); + expect(p.body.groupId).toBeUndefined(); + expect(p.body.context?.traits?.email).toBeUndefined(); + expect(p.body.anonymousId).toBeUndefined(); + expect(p.body.properties?.prop1).toBe("value1"); + }); + + test("test privacy disableUserIds then consent", async () => { const config = { host: server.baseUrl, writeKey: "key:secret", debug: true, + privacy: { + disableUserIds: true, + }, }; + const client = jitsuAnalytics(config); + expect(requestLog.length).toBe(0); + await client.identify("myUserId", { email: "myUserId@example.com" }); + await client.group("myGroupId", { name: "myGroupId" }); + await client.track("myEvent", { prop1: "value1" }); + await new Promise(resolve => setTimeout(resolve, 1000)); + expect(requestLog.length).toBe(1); + let p = requestLog[0]; + expect(p.type).toEqual("track"); + expect(p.body.event).toBe("myEvent"); + expect(p.body.userId).toBeUndefined(); + expect(p.body.groupId).toBeUndefined(); + expect(p.body.context?.traits?.email).toBeUndefined(); + expect(p.body.anonymousId).toBeUndefined(); + expect(p.body.properties?.prop1).toBe("value1"); - try { - console.log("[JITSU TEST] Initializing Jitsu"); - const client = jitsuAnalytics(config); - console.log("[JITSU TEST] Jitsu instance", client); - - const anonymousId = "anonymous_id_test"; - console.log("[JITSU TEST] Setting anonymous id to " + anonymousId); - await client.setAnonymousId(anonymousId); - console.log("user state", client.getState("user")); - - expect(requestLog.length).toBe(0); - console.log("[JITSU TEST] Sending event EVENT_1"); - await client.track("EVENT_1"); - await client.track("EVENT_2"); - await client.track("groupId"); - - await new Promise(resolve => setTimeout(resolve, 1000)); - - expect(requestLog.length).toBe(3); - expect(requestLog[1].body.anonymousId).toBe("anonymous_id_test"); - expect(requestLog[0].body.anonymousId).toBe("anonymous_id_test"); - expect(requestLog[2].body.anonymousId).toBe("anonymous_id_test"); - } finally { - shutdownServer(); - } + client.configure({ + privacy: { + disableUserIds: false, + consentCategories: { + analytics: true, + }, + }, + }); + await client.identify("myUserId", { email: "myUserId@example.com" }); + await client.group("myGroupId", { name: "myGroupId" }); + await client.track("myEvent", { prop1: "value1" }); + await new Promise(resolve => setTimeout(resolve, 1000)); + + expect(requestLog.length).toBe(4); + p = requestLog[3]; + expect(p.type).toEqual("track"); + expect(p.body.event).toBe("myEvent"); + expect(p.body.userId).toEqual("myUserId"); + expect(p.body.groupId).toEqual("myGroupId"); + expect(p.body.context?.traits?.email).toEqual("myUserId@example.com"); + expect(p.body.context?.consent?.categoryPreferences).toEqual({ analytics: true }); + expect((p.body.anonymousId ?? "").length).toBeGreaterThan(0); }); test("node js", async () => { - await startServer(); - try { - const jitsu: AnalyticsInterface = jitsuAnalytics({ - writeKey: "key:secret", - host: server.baseUrl, - debug: true, - fetch: fetchImpl, - }); - await jitsu.track("testTrack"); + const jitsu: AnalyticsInterface = jitsuAnalytics({ + writeKey: "key:secret", + host: server.baseUrl, + debug: true, + fetch: fetchImpl, + }); + await jitsu.track("testTrack"); - await jitsu.identify("testUser", { - email: "test@test.com", - }); + await jitsu.identify("testUser", { + email: "test@test.com", + }); - await jitsu.group("testGroup", { - name: "Test Group", - }); + await jitsu.group("testGroup", { + name: "Test Group", + }); - await jitsu.page({ - name: "test", - environment: "nodejs", - context: { - page: { - url: "http://server.com", - }, + await jitsu.page({ + name: "test", + environment: "nodejs", + context: { + page: { + url: "http://server.com", }, - }); - await new Promise(resolve => setTimeout(resolve, 1000)); - expect(requestLog.length).toBe(4); - expect(requestLog[0].type).toBe("track"); - expect(requestLog[1].type).toBe("identify"); - expect(requestLog[2].type).toBe("group"); - expect(requestLog[3].type).toBe("page"); - - const track = requestLog[0].body as AnalyticsClientEvent; - const identify = requestLog[1].body as AnalyticsClientEvent; - const group = requestLog[2].body as AnalyticsClientEvent; - const page = requestLog[3].body as AnalyticsClientEvent; - - //expect(track.userId).toBe(undefined); - expect(page.properties.name).toBe("test"); - expect(page.properties?.environment).toBe("nodejs"); - expect(page.context.page.url).toBe("http://server.com"); - expect(page.userId).toBe("testUser"); - expect(identify.traits.email).toBe("test@test.com"); - expect(identify.anonymousId).toBe(page.anonymousId); - expect(group.traits.name).toBe("Test Group"); - expect(group.anonymousId).toBe(page.anonymousId); - expect(group.userId).toBe("testUser"); - expect(group.groupId).toBe("testGroup"); - - const pagePayload = requestLog[0].body; - console.log("pagePayload", pagePayload); - } finally { - await shutdownServer(); - } + }, + }); + await new Promise(resolve => setTimeout(resolve, 1000)); + expect(requestLog.length).toBe(4); + expect(requestLog[0].type).toBe("track"); + expect(requestLog[1].type).toBe("identify"); + expect(requestLog[2].type).toBe("group"); + expect(requestLog[3].type).toBe("page"); + + const track = requestLog[0].body as AnalyticsClientEvent; + const identify = requestLog[1].body as AnalyticsClientEvent; + const group = requestLog[2].body as AnalyticsClientEvent; + const page = requestLog[3].body as AnalyticsClientEvent; + + //expect(track.userId).toBe(undefined); + expect(page.properties.name).toBe("test"); + expect(page.properties?.environment).toBe("nodejs"); + expect(page.context.page.url).toBe("http://server.com"); + expect(page.userId).toBe("testUser"); + expect(identify.traits.email).toBe("test@test.com"); + expect(identify.anonymousId).toBe(page.anonymousId); + expect(group.traits.name).toBe("Test Group"); + expect(group.anonymousId).toBe(page.anonymousId); + expect(group.userId).toBe("testUser"); + expect(group.groupId).toBe("testGroup"); + + const pagePayload = requestLog[0].body; + console.log("pagePayload", pagePayload); }); test("tld", async () => { diff --git a/libs/jitsu-js/__tests__/playwright/cases/disable-user-ids.html b/libs/jitsu-js/__tests__/playwright/cases/disable-user-ids.html new file mode 100644 index 000000000..0557c6159 --- /dev/null +++ b/libs/jitsu-js/__tests__/playwright/cases/disable-user-ids.html @@ -0,0 +1,23 @@ + + + + + + + + Tracking page + + + + + +

    Test

    + + diff --git a/libs/jitsu-js/__tests__/playwright/cases/dont-send.html b/libs/jitsu-js/__tests__/playwright/cases/dont-send.html new file mode 100644 index 000000000..b02bdbf28 --- /dev/null +++ b/libs/jitsu-js/__tests__/playwright/cases/dont-send.html @@ -0,0 +1,22 @@ + + + + + + + + Tracking page + + + + + +

    Test

    + + diff --git a/libs/jitsu-js/__tests__/playwright/cases/ip-policy.html b/libs/jitsu-js/__tests__/playwright/cases/ip-policy.html new file mode 100644 index 000000000..fbe9951b0 --- /dev/null +++ b/libs/jitsu-js/__tests__/playwright/cases/ip-policy.html @@ -0,0 +1,22 @@ + + + + + + + + Tracking page + + + + + +

    Test

    + + diff --git a/libs/jitsu-js/__tests__/playwright/integration.test.ts b/libs/jitsu-js/__tests__/playwright/integration.test.ts index 6bc11b81b..415a4e906 100644 --- a/libs/jitsu-js/__tests__/playwright/integration.test.ts +++ b/libs/jitsu-js/__tests__/playwright/integration.test.ts @@ -5,7 +5,6 @@ import * as path from "path"; import ejs from "ejs"; // import chalk from "chalk"; import * as process from "process"; -import * as console from "console"; import { AnalyticsClientEvent, AnalyticsInterface } from "@jitsu/protocols/analytics.d"; test.use({ @@ -24,7 +23,7 @@ const app = express(); let server: SimpleSyrup; -let requestLog: { type: string; body: AnalyticsClientEvent }[] = []; +let requestLog: { type: string; body: AnalyticsClientEvent; headers: any }[] = []; test.beforeAll(async () => { const testCasesHandlers = fs.readdirSync(path.join(__dirname, "cases")).reduce((res, file) => { @@ -60,6 +59,7 @@ test.beforeAll(async () => { res.send({ ok: true }); requestLog.push({ type: req.params.type, + headers: req.headers, body: req.body, }); }, @@ -279,6 +279,174 @@ test("reset", async ({ browser }) => { expect(secondTrack.body.anonymousId).not.toEqual("john-doe-id-1"); }); +const generateEventsForConsentTests = async () => { + const analytics = window["jitsu"] as AnalyticsInterface; + await analytics.identify("myUserId", { email: "myUserId@example.com" }); + await analytics.group("myGroupId", { name: "myGroupId" }); + await analytics.page("myPage"); +}; + +test("ip-policy", async ({ browser }) => { + clearRequestLog(); + const browserContext = await browser.newContext(); + const { page, uncaughtErrors } = await createLoggingPage(browserContext); + const [pageResult] = await Promise.all([page.goto(`${server.baseUrl}/ip-policy.html`)]); + await page.waitForFunction(() => window["jitsu"] !== undefined, undefined, { + timeout: 1000, + polling: 100, + }); + expect(pageResult?.status()).toBe(200); + //wait for some time since the server has an artificial latency of 30ms + await new Promise(resolve => setTimeout(resolve, 1000)); + expect(uncaughtErrors.length).toEqual(0); + expect(requestLog.length).toBe(1); + const p = requestLog[0]; + expect(p.headers?.["x-ip-policy"]).toEqual("stripLastOctet"); +}); + +test("dont-send", async ({ browser }) => { + clearRequestLog(); + const browserContext = await browser.newContext(); + const { page, uncaughtErrors } = await createLoggingPage(browserContext); + const [pageResult] = await Promise.all([page.goto(`${server.baseUrl}/dont-send.html`)]); + await page.waitForFunction(() => window["jitsu"] !== undefined, undefined, { + timeout: 1000, + polling: 100, + }); + expect(pageResult?.status()).toBe(200); + //wait for some time since the server has an artificial latency of 30ms + await new Promise(resolve => setTimeout(resolve, 1000)); + expect(uncaughtErrors.length).toEqual(0); + expect(requestLog.length).toBe(0); + await page.evaluate(generateEventsForConsentTests); + + const cookies = await browserContext.cookies(); + + expect(uncaughtErrors.length).toEqual(0); + expect(requestLog.length).toBe(0); + expect(cookies.length).toBe(0); +}); + +test("dont-send-then-consent", async ({ browser }) => { + clearRequestLog(); + const browserContext = await browser.newContext(); + const { page, uncaughtErrors } = await createLoggingPage(browserContext); + const [pageResult] = await Promise.all([page.goto(`${server.baseUrl}/dont-send.html`)]); + await page.waitForFunction(() => window["jitsu"] !== undefined, undefined, { + timeout: 1000, + polling: 100, + }); + expect(pageResult?.status()).toBe(200); + //wait for some time since the server has an artificial latency of 30ms + await new Promise(resolve => setTimeout(resolve, 1000)); + expect(uncaughtErrors.length).toEqual(0); + expect(requestLog.length).toBe(0); + + await page.evaluate(async () => { + const analytics = window["jitsu"] as AnalyticsInterface; + analytics.configure({ + privacy: { + dontSend: false, + consentCategories: { + analytics: true, + }, + }, + }); + }); + await page.evaluate(generateEventsForConsentTests); + await new Promise(resolve => setTimeout(resolve, 1000)); + + const cookies = await browserContext.cookies(); + expect(uncaughtErrors.length).toEqual(0); + expect(requestLog.length).toBe(3); + expect(cookies.length).toBe(5); + const p = requestLog[2]; + expect(p.type).toEqual("page"); + expect(p.body.userId).toEqual("myUserId"); + expect(p.body.groupId).toEqual("myGroupId"); + expect(p.body.context?.traits?.email).toEqual("myUserId@example.com"); + expect(p.body.context?.consent?.categoryPreferences).toEqual({ analytics: true }); + expect((p.body.anonymousId ?? "").length).toBeGreaterThan(0); +}); + +test("disable-user-ids", async ({ browser }) => { + clearRequestLog(); + const browserContext = await browser.newContext(); + const { page, uncaughtErrors } = await createLoggingPage(browserContext); + const [pageResult] = await Promise.all([page.goto(`${server.baseUrl}/disable-user-ids.html`)]); + await page.waitForFunction(() => window["jitsu"] !== undefined, undefined, { + timeout: 1000, + polling: 100, + }); + expect(pageResult?.status()).toBe(200); + //wait for some time since the server has an artificial latency of 30ms + await new Promise(resolve => setTimeout(resolve, 1000)); + expect(uncaughtErrors.length).toEqual(0); + + expect(requestLog.length).toBe(0); + await page.evaluate(generateEventsForConsentTests); + + const cookies = await browserContext.cookies(); + + expect(uncaughtErrors.length).toEqual(0); + expect(cookies.length).toBe(0); + expect(requestLog.length).toBe(1); + const p = requestLog[0]; + expect(p.type).toEqual("page"); + expect(p.body.userId).toBeUndefined(); + expect(p.body.groupId).toBeUndefined(); + expect(p.body.context?.traits?.email).toBeUndefined(); + expect(p.body.anonymousId).toBeUndefined(); + expect(p.body.properties?.path).toBe("/disable-user-ids.html"); +}); + +test("disable-user-ids-then-consent", async ({ browser }) => { + clearRequestLog(); + const browserContext = await browser.newContext(); + const { page, uncaughtErrors } = await createLoggingPage(browserContext); + const [pageResult] = await Promise.all([page.goto(`${server.baseUrl}/disable-user-ids.html`)]); + await page.waitForFunction(() => window["jitsu"] !== undefined, undefined, { + timeout: 1000, + polling: 100, + }); + expect(pageResult?.status()).toBe(200); + //wait for some time since the server has an artificial latency of 30ms + await new Promise(resolve => setTimeout(resolve, 1000)); + expect(uncaughtErrors.length).toEqual(0); + expect(requestLog.length).toBe(0); + await page.evaluate(generateEventsForConsentTests); + let cookies = await browserContext.cookies(); + expect(uncaughtErrors.length).toEqual(0); + expect(cookies.length).toBe(0); + expect(requestLog.length).toBe(1); + + await page.evaluate(async () => { + const analytics = window["jitsu"] as AnalyticsInterface; + analytics.configure({ + privacy: { + disableUserIds: false, + consentCategories: { + analytics: true, + }, + }, + }); + }); + await page.evaluate(generateEventsForConsentTests); + await new Promise(resolve => setTimeout(resolve, 1000)); + + cookies = await browserContext.cookies(); + expect(uncaughtErrors.length).toEqual(0); + expect(requestLog.length).toBe(4); + expect(cookies.length).toBe(5); + const p = requestLog[3]; + expect(p.type).toEqual("page"); + expect(p.body.userId).toEqual("myUserId"); + expect(p.body.groupId).toEqual("myGroupId"); + expect(p.body.context?.traits?.email).toEqual("myUserId@example.com"); + expect(p.body.context?.consent?.categoryPreferences).toEqual({ analytics: true }); + expect((p.body.anonymousId ?? "").length).toBeGreaterThan(0); +}); + test("basic", async ({ browser }) => { clearRequestLog(); const browserContext = await browser.newContext(); diff --git a/libs/jitsu-js/package.json b/libs/jitsu-js/package.json index a96100fcb..e935a8923 100644 --- a/libs/jitsu-js/package.json +++ b/libs/jitsu-js/package.json @@ -21,6 +21,7 @@ }, "devDependencies": { "@jitsu/protocols": "workspace:*", + "tslib": "^2.6.3", "@playwright/test": "1.39.0", "@rollup/plugin-commonjs": "^23.0.2", "@rollup/plugin-json": "^5.0.1", diff --git a/libs/jitsu-js/src/analytics-plugin.ts b/libs/jitsu-js/src/analytics-plugin.ts index ee01fed8c..4e40a55f6 100644 --- a/libs/jitsu-js/src/analytics-plugin.ts +++ b/libs/jitsu-js/src/analytics-plugin.ts @@ -1,7 +1,16 @@ /* global analytics */ -import { JitsuOptions, PersistentStorage, RuntimeFacade } from "./jitsu"; -import { AnalyticsClientEvent, Callback, ID, JSONObject, Options } from "@jitsu/protocols/analytics"; +import { + DynamicJitsuOptions, + JitsuOptions, + PersistentStorage, + RuntimeFacade, + AnalyticsClientEvent, + Callback, + ID, + JSONObject, + Options, +} from "@jitsu/protocols/analytics"; import parse from "./index"; import { AnalyticsInstance, AnalyticsPlugin } from "analytics"; @@ -26,6 +35,39 @@ const defaultConfig: Required = { fetchTimeoutMs: undefined, s2s: undefined, idEndpoint: undefined, + privacy: { + dontSend: false, + disableUserIds: false, + ipPolicy: "keep", + consentCategories: undefined, + }, +}; + +// mergeConfig merges newConfig into currentConfig also making sure that all undefined values are replaced with defaultConfig values +const mergeConfig = (current: JitsuOptions, newConfig: JitsuOptions): void => { + for (const key of Object.keys(defaultConfig)) { + const value = newConfig[key]; + if (key === "privacy") { + if (typeof value === "object") { + current.privacy = { + ...defaultConfig.privacy, + ...current.privacy, + ...value, + }; + } else if (newConfig.hasOwnProperty("privacy") && typeof value === "undefined") { + // explicitly set to undefined - reset to default + current.privacy = { ...defaultConfig.privacy }; + } + } else if (typeof value === "undefined") { + if (newConfig.hasOwnProperty(key) || !current.hasOwnProperty(key)) { + // explicitly set to undefined - reset to default + // or was not set at all - set to default + current[key] = defaultConfig[key]; + } + } else { + current[key] = value; + } + } }; export const parseQuery = (qs?: string): Record => { @@ -154,11 +196,20 @@ const defaultCookie2Key = { __anon_id: "__eventn_id", __user_traits: "__eventn_id_usr", __user_id: "__eventn_uid", + __group_id: "__group_id", + __group_traits: "__group_traits", }; const cookieStorage: StorageFactory = (cookieDomain, key2cookie) => { return { setItem(key: string, val: any) { + if (typeof val === "undefined") { + removeCookie(key2cookie[key] || key, { + domain: cookieDomain, + secure: window.location.protocol === "https:", + }); + return; + } const strVal = typeof val === "object" && val !== null ? encodeURIComponent(JSON.stringify(val)) : val; const cookieName = key2cookie[key] || key; setCookie(cookieName, strVal, { @@ -270,7 +321,11 @@ export const emptyRuntime = (config: JitsuOptions): RuntimeFacade => ({ if (config.debug) { console.log(`[JITSU EMPTY RUNTIME] Set storage item ${key}=${JSON.stringify(val)}`); } - storage[key] = val; + if (typeof val === "undefined") { + delete storage[key]; + } else { + storage[key] = val; + } }, getItem(key: string) { const val = storage[key]; @@ -374,6 +429,11 @@ function adjustPayload( version: jitsuVersion, env: s2s ? "node" : "browser", }, + consent: config.privacy?.consentCategories + ? { + categoryPreferences: config.privacy.consentCategories, + } + : undefined, userAgent: runtime.userAgent(), locale: runtime.language(), screen: runtime.screen(), @@ -388,11 +448,13 @@ function adjustPayload( url: properties.url || url, encoding: properties.encoding || runtime.documentEncoding(), }, - clientIds: { - fbc: runtime.getCookie("_fbc"), - fbp: runtime.getCookie("_fbp"), - ...getGa4Ids(runtime), - }, + clientIds: !config.privacy?.disableUserIds + ? { + fbc: runtime.getCookie("_fbc"), + fbp: runtime.getCookie("_fbp"), + ...getGa4Ids(runtime), + } + : undefined, campaign: parseUtms(query), }; const withContext = { @@ -406,6 +468,12 @@ function adjustPayload( }; delete withContext.meta; delete withContext.options; + if (config.privacy?.disableUserIds) { + delete withContext.userId; + delete withContext.anonymousId; + delete withContext.context.traits; + delete withContext.groupId; + } return withContext; } @@ -562,7 +630,7 @@ function maskWriteKey(writeKey?: string): string | undefined { async function send( method, payload, - jitsuConfig: Required, + jitsuConfig: JitsuOptions, instance: AnalyticsInstance, store: PersistentStorage ): Promise { @@ -592,15 +660,19 @@ async function send( : undefined; const authHeader = jitsuConfig.writeKey ? { "X-Write-Key": jitsuConfig.writeKey } : {}; + const ipHeader = + typeof jitsuConfig.privacy?.ipPolicy === "undefined" || jitsuConfig.privacy?.ipPolicy === "keep" + ? {} + : { "X-IP-Policy": jitsuConfig.privacy.ipPolicy }; let fetchResult; try { fetchResult = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json", - ...authHeader, ...debugHeader, + ...ipHeader, }, body: JSON.stringify(adjustedPayload), signal: abortController?.signal, @@ -658,17 +730,12 @@ async function send( return adjustedPayload; } -export type JitsuPluginConfig = JitsuOptions & { - storageWrapper?: (persistentStorage: PersistentStorage) => PersistentStorage; -}; -export const jitsuAnalyticsPlugin = (pluginConfig: JitsuPluginConfig = {}): AnalyticsPlugin => { - const instanceConfig = { - ...defaultConfig, - ...pluginConfig, - }; +export const jitsuAnalyticsPlugin = (jitsuOptions: JitsuOptions = {}, storage: PersistentStorage): AnalyticsPlugin => { + // just to make sure that all undefined values are replaced with defaultConfig values + mergeConfig(jitsuOptions, jitsuOptions); return { name: "jitsu", - config: instanceConfig, + config: jitsuOptions, initialize: async args => { const { config } = args; @@ -706,28 +773,24 @@ export const jitsuAnalyticsPlugin = (pluginConfig: JitsuPluginConfig = {}): Anal }, page: args => { const { payload, config, instance } = args; - return send( - "page", - payload, - config, - instance, - pluginConfig.storageWrapper ? pluginConfig.storageWrapper(instance.storage) : instance.storage - ); + if (config.privacy?.dontSend) { + return; + } + return send("page", payload, config, instance, storage); }, track: args => { const { payload, config, instance } = args; - return send( - "track", - payload, - config, - instance, - pluginConfig.storageWrapper ? pluginConfig.storageWrapper(instance.storage) : instance.storage - ); + if (config.privacy?.dontSend) { + return; + } + return send("track", payload, config, instance, storage); }, identify: args => { const { payload, config, instance } = args; + if (config.privacy?.dontSend || config.privacy?.disableUserIds) { + return; + } // Store traits in cache to be able to use them in page and track events that run asynchronously with current identify. - const storage = pluginConfig.storageWrapper ? pluginConfig.storageWrapper(instance.storage) : instance.storage; storage.setItem("__user_id", payload.userId); if (payload.traits && typeof payload.traits === "object") { storage.setItem("__user_traits", payload.traits); @@ -736,37 +799,54 @@ export const jitsuAnalyticsPlugin = (pluginConfig: JitsuPluginConfig = {}): Anal }, reset: args => { const { config, instance } = args; - const storage = pluginConfig.storageWrapper ? pluginConfig.storageWrapper(instance.storage) : instance.storage; - storage?.reset(); + storage.reset(); if (config.debug) { console.log("[JITSU DEBUG] Resetting Jitsu plugin storage"); } }, methods: { //analytics doesn't support group as a base method, so we need to add it manually + configure(newOptions: DynamicJitsuOptions) { + const idsWasDisabled = jitsuOptions.privacy?.disableUserIds || jitsuOptions.privacy?.dontSend; + mergeConfig(jitsuOptions, newOptions); + const idsDisabledNow = jitsuOptions.privacy?.disableUserIds || jitsuOptions.privacy?.dontSend; + if (!idsDisabledNow && idsWasDisabled) { + if (jitsuOptions.debug) { + console.log("[JITSU] Enabling Anonymous ID. Generating new Id."); + } + const instance = (this as any).instance; + const newAnonymousId = uuid(); + const userState = instance.user(); + if (userState) { + userState.anonymousId = newAnonymousId; + } + storage.setItem("__anon_id", newAnonymousId); + instance.setAnonymousId(newAnonymousId); + } + }, group(groupId?: ID, traits?: JSONObject | null, options?: Options, callback?: Callback) { + if (jitsuOptions.privacy?.dontSend || jitsuOptions.privacy?.disableUserIds) { + return; + } if (typeof groupId === "number") { //fix potential issues with group id being used incorrectly groupId = groupId + ""; } - const analyticsInstance = this.instance; - const cacheWrap = pluginConfig.storageWrapper - ? pluginConfig.storageWrapper(analyticsInstance.storage) - : analyticsInstance.storage; - const user = analyticsInstance.user(); + const instance = (this as any).instance; + const user = instance.user(); const userId = options?.userId || user?.userId; - const anonymousId = options?.anonymousId || user?.anonymousId || cacheWrap.getItem("__anon_id"); - cacheWrap.setItem("__group_id", groupId); + const anonymousId = options?.anonymousId || user?.anonymousId || storage.getItem("__anon_id"); + storage.setItem("__group_id", groupId); if (traits && typeof traits === "object") { - cacheWrap.setItem("__group_traits", traits); + storage.setItem("__group_traits", traits); } return send( "group", { type: "group", groupId, traits, ...(anonymousId ? { anonymousId } : {}), ...(userId ? { userId } : {}) }, - instanceConfig, - analyticsInstance, - cacheWrap + jitsuOptions, + instance, + storage ); }, }, @@ -786,6 +866,23 @@ export function randomId(hashString: string | undefined = ""): string { ); } +export function uuid() { + var u = "", + m = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx", + i = 0, + rb = (Math.random() * 0xffffffff) | 0; + + while (i++ < 36) { + var c = m[i - 1], + r = rb & 0xf, + v = c == "x" ? r : (r & 0x3) | 0x8; + + u += c == "-" || c == "4" ? c : v.toString(16); + rb = i % 8 == 0 ? (Math.random() * 0xffffffff) | 0 : rb >> 4; + } + return u; +} + function hash(str: string, seed: number = 0): number { let h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed; diff --git a/libs/jitsu-js/src/browser.ts b/libs/jitsu-js/src/browser.ts index c6f4c0bbf..7bbd44701 100644 --- a/libs/jitsu-js/src/browser.ts +++ b/libs/jitsu-js/src/browser.ts @@ -1,9 +1,8 @@ -import type { AnalyticsInterface, JitsuOptions } from "./jitsu"; +import type { AnalyticsInterface, JitsuOptions } from "@jitsu/protocols/analytics"; import { jitsuAnalytics } from "./index"; export type JitsuBrowserOptions = { namespace?: string; - userId?: string; onload?: string; initOnly?: boolean; } & JitsuOptions; @@ -14,16 +13,47 @@ function snakeToCamel(s: string) { }); } -export type Parser = (arg: string) => any; -const booleanParser = (arg: string) => arg === "true" || arg === "1" || arg === "yes"; +export type Parser = { + path?: (name: string) => string[]; + parse: (arg: string) => any; +}; +const trimPrefix = (s: string, prefix: string) => s.replace(new RegExp(`^${prefix}`), ""); + +const defaultParser = (nestedPath: string[] = []) => ({ + path: (name: string) => [ + ...nestedPath, + snakeToCamel(nestedPath.length > 0 ? trimPrefix(name, nestedPath.join("-") + "-") : name), + ], + parse: (arg: string) => arg, +}); + +const booleanParser = (nestedPath: string[] = []) => ({ + ...defaultParser(nestedPath), + parse: (arg: string) => arg === "true" || arg === "1" || arg === "yes", +}); -const parsers: Partial> = { - debug: booleanParser, - initOnly: booleanParser, +const parsers: Partial> = { + debug: booleanParser(), + "privacy-disable-user-ids": booleanParser(["privacy"]), + "privacy-dont-send": booleanParser(["privacy"]), + "privacy-ip-policy": defaultParser(["privacy"]), + "echo-events": booleanParser(), + "init-only": booleanParser(), }; -function getParser(name: keyof JitsuBrowserOptions): Parser { - return parsers[name] || (x => x); +function getParser(name: string): Parser { + return parsers[name] || defaultParser(); +} + +function setPath(obj: any, path: string[], value: any) { + let current = obj; + let i = 0; + for (; i < path.length - 1; i++) { + const key = path[i]; + current[key] = current[key] || {}; + current = current[key]; + } + current[path[i]] = value; } function getScriptAttributes(scriptElement: HTMLScriptElement) { @@ -31,13 +61,12 @@ function getScriptAttributes(scriptElement: HTMLScriptElement) { .getAttributeNames() .filter(name => name.indexOf("data-") === 0) .map(name => name.substring("data-".length)) - .reduce( - (res, name) => ({ - ...res, - [snakeToCamel(name)]: getParser(snakeToCamel(name) as any)(scriptElement.getAttribute(`data-${name}`)), - }), - {} - ); + .reduce((res, name) => { + const parser = getParser(name); + const path = parser.path(name); + setPath(res, path, parser.parse(scriptElement.getAttribute(`data-${name}`))); + return res; + }, {}); } function runCallback(callback: any, jitsu: AnalyticsInterface) { diff --git a/libs/jitsu-js/src/destination-plugins/index.ts b/libs/jitsu-js/src/destination-plugins/index.ts index dad9b9f49..08e19fa8e 100644 --- a/libs/jitsu-js/src/destination-plugins/index.ts +++ b/libs/jitsu-js/src/destination-plugins/index.ts @@ -3,7 +3,6 @@ import { tagPlugin } from "./tag"; import { logrocketPlugin } from "./logrocket"; import { gtmPlugin } from "./gtm"; import { ga4Plugin } from "./ga4"; -import type { JitsuOptions } from "../jitsu"; export type InternalPlugin = { id: string; diff --git a/libs/jitsu-js/src/index.ts b/libs/jitsu-js/src/index.ts index b0dd17633..bee7866c5 100644 --- a/libs/jitsu-js/src/index.ts +++ b/libs/jitsu-js/src/index.ts @@ -1,7 +1,17 @@ import Analytics from "analytics"; -import { AnalyticsInterface, JitsuOptions, PersistentStorage, RuntimeFacade } from "./jitsu"; -import { jitsuAnalyticsPlugin, emptyRuntime, isInBrowser, windowRuntime } from "./analytics-plugin"; -import { Callback, DispatchedEvent, ID, JSONObject, Options } from "@jitsu/protocols/analytics"; +import { jitsuAnalyticsPlugin, emptyRuntime, isInBrowser, windowRuntime, uuid } from "./analytics-plugin"; +import { + Callback, + DispatchedEvent, + ID, + JSONObject, + Options, + AnalyticsInterface, + JitsuOptions, + PersistentStorage, + RuntimeFacade, + DynamicJitsuOptions, +} from "@jitsu/protocols/analytics"; export default function parse(input) { let value = input; @@ -31,6 +41,7 @@ export const emptyAnalytics: AnalyticsInterface = { identify: () => Promise.resolve({}), group: () => Promise.resolve({}), reset: () => Promise.resolve({}), + configure: () => {}, }; function createUnderlyingAnalyticsInstance( @@ -38,8 +49,6 @@ function createUnderlyingAnalyticsInstance( rt: RuntimeFacade, plugins: any[] = [] ): AnalyticsInterface { - const storage = rt.store(); - const storageCache: any = {}; // AnalyticsInstance's storage is async somewhere inside. So if we make 'page' call right after 'identify' call @@ -47,6 +56,9 @@ function createUnderlyingAnalyticsInstance( // to avoid that we use in-memory cache for storage const cachingStorageWrapper = (persistentStorage: PersistentStorage) => ({ setItem(key: string, val: any) { + if (opts.privacy?.dontSend || opts.privacy?.disableUserIds) { + return; + } if (opts.debug) { console.log(`[JITSU DEBUG] Caching storage setItem: ${key}=${val}`); } @@ -54,6 +66,9 @@ function createUnderlyingAnalyticsInstance( persistentStorage.setItem(key, val); }, getItem(key: string) { + if (opts.privacy?.dontSend || opts.privacy?.disableUserIds) { + return; + } const value = storageCache[key] || persistentStorage.getItem(key); if (opts.debug) { console.log( @@ -66,7 +81,7 @@ function createUnderlyingAnalyticsInstance( for (const key of [...Object.keys(storageCache)]) { delete storageCache[key]; } - storage.reset(); + persistentStorage.reset(); }, removeItem(key: string) { if (opts.debug) { @@ -76,14 +91,15 @@ function createUnderlyingAnalyticsInstance( persistentStorage.removeItem(key); }, }); + const storage = cachingStorageWrapper(rt.store()); const analytics = Analytics({ debug: !!opts.debug, storage, - plugins: [jitsuAnalyticsPlugin({ ...opts, storageWrapper: cachingStorageWrapper }), ...plugins], + plugins: [jitsuAnalyticsPlugin(opts, storage), ...plugins], } as any); - return { + const a = { ...analytics, page: (...args) => { if (args.length === 2 && typeof args[0] === "string" && typeof args[1] === "object") { @@ -124,7 +140,7 @@ function createUnderlyingAnalyticsInstance( if (opts.debug) { console.log("[JITSU DEBUG] Setting anonymous id to " + id); } - //Workaround for analytics.js bug. Underlying setAnonymousId doesn't work set the id immediately, + //Workaround for analytics.js bug. Underlying setAnonymousId doesn't set the id immediately, //so we got to it manually here. See https://github.com/jitsucom/jitsu/issues/1060 storage.setItem("__anon_id", id); const userState = analytics.user(); @@ -144,6 +160,19 @@ function createUnderlyingAnalyticsInstance( console.log("[JITSU DEBUG] User state after reset", JSON.stringify(analytics.user())); } }, + async configure(options: DynamicJitsuOptions) { + if (opts.debug) { + console.log("[JITSU DEBUG] Update Jitsu config with", JSON.stringify(options)); + } + if (options.privacy?.disableUserIds || options.privacy?.dontSend) { + storage.reset(); + } + for (const plugin of Object.values(analytics.plugins)) { + if (typeof plugin["configure"] === "function") { + plugin["configure"](options); + } + } + }, async group( groupId?: ID, traits?: JSONObject | null, @@ -161,6 +190,10 @@ function createUnderlyingAnalyticsInstance( return results[0]; }, } as AnalyticsInterface; + if (opts.privacy?.disableUserIds || opts.privacy?.dontSend) { + storage.reset(); + } + return a; } /** @@ -171,7 +204,9 @@ function fixOptions(opts: JitsuOptions): JitsuOptions { return { ...opts, host: - opts.host.indexOf("https://") !== 0 && opts.host.indexOf("http://") !== 0 ? `https://${opts.host}` : opts.host, + (opts.host ?? "").indexOf("https://") !== 0 && (opts.host ?? "").indexOf("http://") !== 0 + ? `https://${opts.host}` + : opts.host, }; } @@ -205,22 +240,16 @@ export function jitsuAnalytics(_opts: JitsuOptions): AnalyticsInterface { // } } -function uuid() { - var u = "", - m = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx", - i = 0, - rb = (Math.random() * 0xffffffff) | 0; - - while (i++ < 36) { - var c = m[i - 1], - r = rb & 0xf, - v = c == "x" ? r : (r & 0x3) | 0x8; - - u += c == "-" || c == "4" ? c : v.toString(16); - rb = i % 8 == 0 ? (Math.random() * 0xffffffff) | 0 : rb >> 4; - } - return u; -} - -export * from "./jitsu"; +export { + Callback, + DispatchedEvent, + ID, + JSONObject, + Options, + AnalyticsInterface, + JitsuOptions, + PersistentStorage, + RuntimeFacade, + DynamicJitsuOptions, +}; export * from "./analytics-plugin"; diff --git a/libs/jitsu-js/src/jitsu.ts b/libs/jitsu-js/src/jitsu.ts deleted file mode 100644 index fa9176fba..000000000 --- a/libs/jitsu-js/src/jitsu.ts +++ /dev/null @@ -1,93 +0,0 @@ -import type { AnalyticsInterface } from "@jitsu/protocols/analytics"; - -type JitsuOptions = { - /** - * API Key. Optional. If not set, Jitsu will send event to the server without auth, and server - * will link the call to configured source by domain name - */ - writeKey?: string; - /** - * API Host. Default value: same host as script origin - */ - host?: string; - /** - * To enable debug logging - */ - debug?: boolean; - /** - * Explicitly specify cookie domain. If not set, cookie domain will be set to top level - * of the current domain. Example: if JS lives on "app.example.com", cookie domain will be - * set to ".example.com". If it lives on "example.com", cookie domain will be set to ".example.com" too - */ - cookieDomain?: string; - /** - * Provide fetch implementation. It is required if you want to use Jitsu in NodeJS - */ - fetch?: typeof fetch; - /** - * Which runtime to use. Runtime is used for obtaining context of the event: cookes, - * url, etc. At the moment, Jitsu supports browser runtime and NodeJS runtime, but you - * can provide your own implementation. - * - * If it's not set, the runtime will be detected automatically by presense of `window` object - */ - runtime?: RuntimeFacade; - /** - * If set to true, jitsu will output events in console. In this case you don't need to set - * writeKey / host. It's useful for debugging development environment - */ - echoEvents?: boolean; - - /** - * If true, events will go to s2s endpoints like ${host}/api/s/s2s/{type}. Otherwise they'll go to ${host}/api/s/{type}. - * - * If not set at all, it will be detected automatically by presence of `window` object - */ - s2s?: boolean; - - /** - * Timeout for fetch requests. Default value: 5000 - */ - fetchTimeoutMs?: number; - - /** - * Endpoint that makes sure that Jitsu anonymousId cookie is set as server (httpOnly) cookie. - * Endpoint must be hosted on the same domain as the site where Jitsu code is installed. - * Required to overcome Safari ITP restrictions. - */ - idEndpoint?: string; -}; - -type PersistentStorage = { - getItem: (key: string, options?: any) => any; - setItem: (key: string, value: any, options?: any) => void; - removeItem: (key: string, options?: any) => void; - reset: () => void; -}; - -type RuntimeFacade = { - store(): PersistentStorage; - userAgent(): string | undefined; - language(): string | undefined; - pageUrl(): string | undefined; - documentEncoding(): string | undefined; - getCookie(name: string): string | undefined; - getCookies(): Record; - - timezoneOffset(): number | undefined; - screen(): - | { - width: number; - height: number; - innerWidth: number; - innerHeight: number; - density: number; - } - | undefined; - referrer(): string | undefined; - pageTitle(): string | undefined; -}; - -export declare function jitsuAnalytics(opts: JitsuOptions): AnalyticsInterface; - -export { AnalyticsInterface, JitsuOptions, PersistentStorage, RuntimeFacade }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 185cfaa3c..c84a03272 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -488,6 +488,9 @@ importers: ts-jest: specifier: 29.0.5 version: 29.0.5(@babel/core@7.25.2)(jest@29.7.0)(typescript@5.5.4) + tslib: + specifier: ^2.6.3 + version: 2.6.3 typescript: specifier: ^5.5.4 version: 5.5.4 @@ -4192,8 +4195,8 @@ packages: - supports-color dev: false - /@google-cloud/storage@7.12.0: - resolution: {integrity: sha512-122Ui67bhnf8MkRnxQAC5lf7wPGkPP5hL3+J5s9HHDw2J9RpaMmnV8iahn+RUn9BH70W6uRe6nMZLXiRaJM/3g==} + /@google-cloud/storage@7.12.1: + resolution: {integrity: sha512-Z3ZzOnF3YKLuvpkvF+TjQ6lztxcAyTILp+FjKonmVpEwPa9vFvxpZjubLR4sB6bf19i/8HL2AXRjA0YFgHFRmQ==} engines: {node: '>=14'} requiresBuild: true dependencies: @@ -13256,7 +13259,7 @@ packages: uuid: 10.0.0 optionalDependencies: '@google-cloud/firestore': 7.9.0 - '@google-cloud/storage': 7.12.0 + '@google-cloud/storage': 7.12.1 transitivePeerDependencies: - encoding - supports-color diff --git a/types/protocols/analytics.d.ts b/types/protocols/analytics.d.ts index d1be9da4f..29939291e 100644 --- a/types/protocols/analytics.d.ts +++ b/types/protocols/analytics.d.ts @@ -215,6 +215,11 @@ interface AnalyticsContext { amp?: { id: string; }; + + consent?: { + categoryPreferences?: Record; + }; + /** * Other tracking tools client ids */ @@ -281,6 +286,103 @@ export type DispatchedEvent = Context; export type Callback = (ctx: Context | undefined) => Promise | unknown; +type PersistentStorage = { + getItem: (key: string, options?: any) => any; + setItem: (key: string, value: any, options?: any) => void; + removeItem: (key: string, options?: any) => void; + reset: () => void; +}; + +export type RuntimeFacade = { + store(): PersistentStorage; + userAgent(): string | undefined; + language(): string | undefined; + pageUrl(): string | undefined; + documentEncoding(): string | undefined; + getCookie(name: string): string | undefined; + getCookies(): Record; + + timezoneOffset(): number | undefined; + screen(): + | { + width: number; + height: number; + innerWidth: number; + innerHeight: number; + density: number; + } + | undefined; + referrer(): string | undefined; + pageTitle(): string | undefined; +}; + +export type JitsuOptions = { + /** + * API Key. Optional. If not set, Jitsu will send event to the server without auth, and server + * will link the call to configured source by domain name + */ + writeKey?: string; + /** + * API Host. Default value: same host as script origin + */ + host?: string; + /** + * To enable debug logging + */ + debug?: boolean; + /** + * Explicitly specify cookie domain. If not set, cookie domain will be set to top level + * of the current domain. Example: if JS lives on "app.example.com", cookie domain will be + * set to ".example.com". If it lives on "example.com", cookie domain will be set to ".example.com" too + */ + cookieDomain?: string; + /** + * Provide fetch implementation. It is required if you want to use Jitsu in NodeJS + */ + fetch?: typeof fetch; + /** + * Which runtime to use. Runtime is used for obtaining context of the event: cookies, + * url, etc. At the moment, Jitsu supports browser runtime and NodeJS runtime, but you + * can provide your own implementation. + * + * If it's not set, the runtime will be detected automatically by presence of `window` object + */ + runtime?: RuntimeFacade; + /** + * If set to true, jitsu will output events in console. In this case you don't need to set + * writeKey / host. It's useful for debugging development environment + */ + echoEvents?: boolean; + + /** + * If true, events will go to s2s endpoints like ${host}/api/s/s2s/{type}. Otherwise, they'll go to ${host}/api/s/{type}. + * + * If not set at all, it will be detected automatically by presence of `window` object + */ + s2s?: boolean; + + /** + * Timeout for fetch requests. Default value: 5000 + */ + fetchTimeoutMs?: number; + + /** + * Endpoint that makes sure that Jitsu anonymousId cookie is set as server (httpOnly) cookie. + * Endpoint must be hosted on the same domain as the site where Jitsu code is installed. + * Required to overcome Safari ITP restrictions. + */ + idEndpoint?: string; + + privacy?: { + dontSend?: boolean; + disableUserIds?: boolean; + ipPolicy?: "keep" | "remove" | "stripLastOctet"; + consentCategories?: Record; + }; +}; + +export type DynamicJitsuOptions = Pick; + export interface AnalyticsInterface { track( eventName: string | JSONObject, @@ -310,7 +412,9 @@ export interface AnalyticsInterface { user(): any; - setAnonymousId(id: string): void; + setAnonymousId(id: string | undefined): void; + + configure(options: DynamicJitsuOptions): void; // alias( // to: string | number, @@ -327,3 +431,5 @@ export interface AnalyticsInterface { // callback?: Callback // ): Promise; } + +export declare function jitsuAnalytics(opts: JitsuOptions): AnalyticsInterface; diff --git a/webapps/console/lib/server/telemetry.ts b/webapps/console/lib/server/telemetry.ts index db201b55b..d378bbc36 100644 --- a/webapps/console/lib/server/telemetry.ts +++ b/webapps/console/lib/server/telemetry.ts @@ -107,7 +107,7 @@ function createProductAnalytics(analytics: AnalyticsInterface, req?: NextApiRequ export type TrackedUser = Pick; /** - * Entry point for all analytics events. The method makes sure that all indentify events + * Entry point for all analytics events. The method makes sure that all identify events * are properly sent, and calls a `callback` on configured analytics instance. */ export function withProductAnalytics( diff --git a/webapps/console/pages/[workspaceId]/streams.tsx b/webapps/console/pages/[workspaceId]/streams.tsx index 08d935cdc..b34126479 100644 --- a/webapps/console/pages/[workspaceId]/streams.tsx +++ b/webapps/console/pages/[workspaceId]/streams.tsx @@ -528,8 +528,7 @@ const StreamsList: React.FC<{}> = () => { documentation: ( <> Those keys are publicly accessible. They are used in client-side libraries, such as - JavaScript. For additional security, consider limiting domains where those keys can be used by specifying{" "} - Authorized JavaScript Domains above.
    + JavaScript.
    Using public keys is not necessary, if you're using Custom Domains. In this case, { branding.productName From 2adfa82cb6f17cb9581c46f8312a400bb8b90c1a Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 12 Aug 2024 18:51:56 +0400 Subject: [PATCH 0835/1353] up canary version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d5aaff110..b3dc91ea2 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "lint": "turbo run lint --", "release": "pnpm build && pnpm test && monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/functions --filter ./libs/jitsu-js --filter ./libs/jitsu-react --npm-tag latest --git-tag 'jitsu-js-libs-v{version}' --push-tag", "release:build-scripts": "pnpm build --filter ./cli/build-scripts && monorel --filter ./cli/build-scripts --npm-tag latest --version 0.0.4-dev.{rev}.{time} --publish --git-tag 'jitsu-build-scripts-v{version}'", - "release:canary": "monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/functions --filter ./libs/jitsu-js --filter ./libs/jitsu-react --version '1.9.7-canary.{rev}.{time}' --npm-tag canary --git-tag 'jitsu-js-libs-canary-v{version}' --push-tag" + "release:canary": "monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/functions --filter ./libs/jitsu-js --filter ./libs/jitsu-react --version '1.9.8-canary.{rev}.{time}' --npm-tag canary --git-tag 'jitsu-js-libs-canary-v{version}' --push-tag" }, "devDependencies": { "@playwright/test": "1.39.0", From 1d952f47bdcc52071bdc3e2df1295a55f611eac4 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 14 Aug 2024 10:54:53 +0400 Subject: [PATCH 0836/1353] posthog-destination: fill geo ip properties, better profile aliases --- .../src/functions/posthog-destination.ts | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/libs/core-functions/src/functions/posthog-destination.ts b/libs/core-functions/src/functions/posthog-destination.ts index 06e64d712..7eb013df5 100644 --- a/libs/core-functions/src/functions/posthog-destination.ts +++ b/libs/core-functions/src/functions/posthog-destination.ts @@ -33,6 +33,7 @@ function getEventProperties(event: AnalyticsServerEvent) { const browser = event.context?.userAgent ? parseUserAgentLegacy(event.context?.userAgent, event.context?.userAgentVendor) : undefined; + const geo = event.context?.geo || {}; return { $referrer: event.context?.page?.referrer, $referring_domain: event.context?.page?.referring_domain || getHostFromUrl(event.context?.page?.referrer), @@ -45,6 +46,13 @@ function getEventProperties(event: AnalyticsServerEvent) { $os: browser?.os, $browser_version: browser?.browserVersion, + $geoip_city_name: geo.city?.name, + $geoip_country_name: geo.country?.name, + $geoip_country_code: geo.country?.code, + $geoip_continent_code: geo.continent?.code, + $geoip_postal_code: geo.postalCode, + $geoip_time_zone: geo.location?.timezone, + //implement when it's implemented on a client, doesn't seem like a very important data points $screen_dpi: event.context?.screen?.density, $screen_height: event.context?.screen?.height, @@ -85,16 +93,15 @@ const PosthogDestination: JitsuFunction Date: Wed, 14 Aug 2024 10:57:26 +0400 Subject: [PATCH 0837/1353] posthog-destination: fill geo ip properties, better profile aliases --- libs/core-functions/src/functions/posthog-destination.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libs/core-functions/src/functions/posthog-destination.ts b/libs/core-functions/src/functions/posthog-destination.ts index 7eb013df5..bec7f499b 100644 --- a/libs/core-functions/src/functions/posthog-destination.ts +++ b/libs/core-functions/src/functions/posthog-destination.ts @@ -95,7 +95,10 @@ const PosthogDestination: JitsuFunction Date: Wed, 14 Aug 2024 14:25:54 +0400 Subject: [PATCH 0838/1353] console: fix HTTP api doc --- .../TrackingIntegrationDocumentation/HTTPApi.tsx | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/webapps/console/components/TrackingIntegrationDocumentation/HTTPApi.tsx b/webapps/console/components/TrackingIntegrationDocumentation/HTTPApi.tsx index ebdba9956..ad988c082 100644 --- a/webapps/console/components/TrackingIntegrationDocumentation/HTTPApi.tsx +++ b/webapps/console/components/TrackingIntegrationDocumentation/HTTPApi.tsx @@ -12,8 +12,17 @@ export const HTTPManual: React.FC<{ domain: string; writeKey?: string }> = ({ do

    In case of using HTTP API you may need to manually ad user's IP address and User Agent to the event.

    Ingest endpoint

    This endpoint can be used to send events to Jitsu:

    +

    + For requests from user devices: +

    + {`${domain}/api/s/{event-type}`} +

    + For requests coming from servers: +

    {`${domain}/api/s/s2s/{event-type}`} -

    Event type could be:

    +

    + event-type could be: +

    • page, track, identify or group From c5484e48863576db536a2a43a2ffbaacb6e32fad Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 14 Aug 2024 14:35:06 +0400 Subject: [PATCH 0839/1353] console: fix HTTP api doc --- .../HTTPApi.tsx | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/webapps/console/components/TrackingIntegrationDocumentation/HTTPApi.tsx b/webapps/console/components/TrackingIntegrationDocumentation/HTTPApi.tsx index ad988c082..177d793fd 100644 --- a/webapps/console/components/TrackingIntegrationDocumentation/HTTPApi.tsx +++ b/webapps/console/components/TrackingIntegrationDocumentation/HTTPApi.tsx @@ -10,15 +10,24 @@ export const HTTPManual: React.FC<{ domain: string; writeKey?: string }> = ({ do backend.

      In case of using HTTP API you may need to manually ad user's IP address and User Agent to the event.

      -

      Ingest endpoint

      -

      This endpoint can be used to send events to Jitsu:

      -

      - For requests from user devices: -

      +

      Ingest endpoint (client mode)

      +

      This endpoint can be used to send events to Jitsu from user devices or browsers:

      {`${domain}/api/s/{event-type}`}

      - For requests coming from servers: + event-type could be:

      +
        +
      • + page, track, identify or group +
      • +
      • + Use event as event_type if you want server to take actual event type from{" "} + type field of the event payload +
      • +
      +

      The endpoint accepts POST requests with events payload in JSON format.

      +

      Ingest endpoint (server mode)

      +

      This endpoint can be used to send events to Jitsu from servers:

      {`${domain}/api/s/s2s/{event-type}`}

      event-type could be: From b8cb3295182b98c216b94c37fe1be6a655f981af Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 14 Aug 2024 15:17:28 +0400 Subject: [PATCH 0840/1353] console: fix Postgres source schema --- .../console/components/ConfigObjectEditor/SchemaForm.tsx | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx b/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx index 23ec44cb3..c15fff22c 100644 --- a/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx +++ b/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx @@ -356,6 +356,15 @@ const OneOf: React.FC<{ break; } } + if (selectedIdx === removeIdx) { + for (let i = 0; i < fieldSchema.oneOf.length; i++) { + if (i !== removeIdx) { + selected = fieldSchema.oneOf[i]; + selectedIdx = i; + break; + } + } + } } const filteredOptions = options.filter((o, i) => i !== removeIdx); From 0c4f2ac69b1d0bf897268249cdfb90ca28e76680 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 14 Aug 2024 16:21:02 +0400 Subject: [PATCH 0841/1353] console: Sync: namespace setting --- .../ConnectionEditorPage.tsx | 6 +- .../SyncEditorPage/SyncEditorPage.tsx | 110 ++++++++++++++++-- webapps/console/lib/server/sync.ts | 1 + 3 files changed, 107 insertions(+), 10 deletions(-) diff --git a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx index 55a521afa..8d56c3b8f 100644 --- a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx +++ b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx @@ -110,7 +110,7 @@ const DataLayoutEditor: EditorComponent

      Original
      -
      Keep original event structure.
      +
      Keep original event structure.
      )} @@ -128,7 +128,7 @@ const DataLayoutEditor: EditorComponent
      Segment
      -
      +
      This data layout emulates segment tables: pages, identify, etc
      @@ -136,7 +136,7 @@ const DataLayoutEditor: EditorComponent
      Legacy Jitsu
      -
      +
      Table name events. Field names are as in Jitsu 1.0
      diff --git a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx index d1b7f14db..370a1e216 100644 --- a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx +++ b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx @@ -26,6 +26,7 @@ import timezones from "timezones-list"; import { useBilling } from "../Billing/BillingProvider"; import { WLink } from "../Workspace/WLink"; import { useStoreReload } from "../../lib/store"; +import capitalize from "lodash/capitalize"; const log = getLog("SyncEditorPage"); @@ -67,6 +68,17 @@ const scheduleOptions = [ }, ]; +const namespaceImplementation: Record = { + clickhouse: { name: "database", field: "database" }, + postgres: { name: "schema", field: "defaultSchema" }, + redshift: { name: "schema", field: "defaultSchema" }, + bigquery: { name: "dataset", field: "bqDataset" }, + snowflake: { name: "schema", field: "defaultSchema" }, + mysql: { name: "database", field: "database" }, + s3: { name: "folder", field: "folder" }, + gcs: { name: "folder", field: "folder" }, +}; + type SelectorProps = { enabled: boolean; selected: string; @@ -77,6 +89,7 @@ type SelectorProps = { type SyncOptionsType = { storageKey?: string; streams?: SelectedStreams; + namespace?: string; tableNamePrefix?: string; schedule?: string; timezone?: string; @@ -196,14 +209,37 @@ function SyncEditor({ `Destination ${dstId} not found` ); const destinationType = getCoreDestinationType(destination.destinationType); + const namespaceImpl = namespaceImplementation[destinationType.id] ?? { name: "namespace", filed: "namespace" }; - const [syncOptions, setSyncOptions] = useState(existingLink?.data as SyncOptionsType); + const [syncOptions, setSyncOptions] = useState( + (existingLink?.data || { namespace: "" }) as SyncOptionsType + ); const [catalog, setCatalog] = useState(undefined); const [catalogError, setCatalogError] = useState(undefined); const [loadingCatalog, setLoadingCatalog] = useState(true); const [refreshCatalog, setRefreshCatalog] = useState(0); const reloadStore = useStoreReload(); + function onlyUnique(value, index, array) { + return array.indexOf(value) === index; + } + + const legacyMode = !!existingLink && typeof syncOptions.namespace === "undefined"; + const sourceNamespaces: string[] = catalog?.streams?.map((s: any) => s.namespace).filter(onlyUnique) || []; + const legacyPrefix = + legacyMode && sourceNamespaces?.length > 0 + ? sourceNamespaces?.length === 1 + ? syncOptions?.tableNamePrefix + sourceNamespaces[0] + "_" + : (syncOptions?.tableNamePrefix ?? "") + "${SOURCE_NAMESPACE}_" + : undefined; + + const destinationNamespaces = (sourceNamespaces?.length > 0 ? sourceNamespaces : [""]) + .map(ns => (syncOptions?.namespace ? syncOptions?.namespace.replaceAll("${SOURCE_NAMESPACE}", ns ?? "") : "")) + .map(ns => ns?.trim()) + .map(ns => ns || destination?.[namespaceImpl.field] || "") + .filter(ns => ns !== "") + .filter(onlyUnique); + const [showCustomSchedule, setShowCustomSchedule] = useState( syncOptions?.schedule && !scheduleOptions.find(o => o.value === syncOptions?.schedule) ); @@ -452,17 +488,70 @@ function SyncEditor({ /> ), }, + destinationType.usesBulker + ? { + name: `Destination ${capitalize(namespaceImpl.name)}`, + documentation: ( + <> + {`It is possible to override the default destination ${namespaceImpl.name} with a custom value or a value defined by the source.`} +
      +
      + Source defined: + If the source supports namespaces, you can use the macros {"${SOURCE_NAMESPACE}"} which will + be replaced with the actual namespace of the specific stream. +
      +
      + Default value: + {`Empty value will be replaced with ${capitalize( + namespaceImpl.name + )} setting from the destination config.`} + + ), + component: ( +
      + updateOptions({ namespace: e.target.value })} + /> + {destination && ( +
      + Current value{destinationNamespaces.length > 1 ? "s" : ""}:{" "} + <> + {destinationNamespaces.map((ns, i) => ( + <> + {ns} + {i < destinationNamespaces.length - 1 ? ", " : ""} + + ))} + +
      + )} +
      + ), + } + : undefined, destinationType.usesBulker ? { name: "Table Name Prefix", - documentation: - "Prefix to add to all table names resulting from this sync. E.g. 'mysrc_'. Useful to avoid table names collisions with other syncs.", + documentation: ( + <> + Prefix to add to all table names resulting from this sync. E.g. 'mysrc_'. Useful to avoid table names + collisions with other syncs. +
      +
      + If the source supports namespaces, you can use the macros {"${SOURCE_NAMESPACE}"} which will + be replaced with the actual namespace of the specific stream. + + ), component: (
      updateOptions({ tableNamePrefix: e.target.value })} />
      @@ -598,6 +687,7 @@ function SyncEditor({ } else if (catalog) { for (const stream of catalog.streams ?? []) { const name = stream.namespace ? `${stream.namespace}.${stream.name}` : stream.name; + const tableName = stream.namespace && legacyMode ? `${stream.namespace}_${stream.name}` : stream.name; const syncModeOptions = stream.supported_sync_modes.map(m => ({ value: m, label: createDisplayName(m), @@ -620,10 +710,11 @@ function SyncEditor({ group: "Streams", key: name, name: ( -
      +
      - {name} + {stream.name} + {stream.namespace &&
      {stream.namespace}
      }
      ), component: ( @@ -686,7 +777,12 @@ function SyncEditor({ style={{ minWidth: "15rem" }} disabled={!syncOptions?.streams?.[name]} onChange={e => updateSelectedStream(name, "table_name", e.target.value)} - value={syncOptions?.streams?.[name]?.table_name || (syncOptions?.tableNamePrefix ?? "") + name} + value={ + syncOptions?.streams?.[name]?.table_name || + (syncOptions?.tableNamePrefix + ? syncOptions?.tableNamePrefix.replaceAll("${SOURCE_NAMESPACE}", stream.namespace ?? "") + : "") + tableName + } >
      diff --git a/webapps/console/lib/server/sync.ts b/webapps/console/lib/server/sync.ts index 09c9de155..18d642d98 100644 --- a/webapps/console/lib/server/sync.ts +++ b/webapps/console/lib/server/sync.ts @@ -615,6 +615,7 @@ export async function scheduleSync({ syncId: sync.id, fullSync: fullSync ? "true" : "false", startedBy: JSON.stringify(startedBy), + namespace: typeof sync.data?.["namespace"] !== "undefined" ? sync.data?.["namespace"] : "${LEGACY}", tableNamePrefix: sync.data?.["tableNamePrefix"] ?? "", }, body: { From 54aaa1795926fd49349a8a685afe259a3c238796 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 14 Aug 2024 16:26:36 +0400 Subject: [PATCH 0842/1353] console: Sync: namespace setting --- webapps/console/components/SyncEditorPage/SyncEditorPage.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx index 370a1e216..5c1df8e50 100644 --- a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx +++ b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx @@ -224,7 +224,7 @@ function SyncEditor({ return array.indexOf(value) === index; } - const legacyMode = !!existingLink && typeof syncOptions.namespace === "undefined"; + const legacyMode = !!existingLink && typeof syncOptions?.namespace === "undefined"; const sourceNamespaces: string[] = catalog?.streams?.map((s: any) => s.namespace).filter(onlyUnique) || []; const legacyPrefix = legacyMode && sourceNamespaces?.length > 0 @@ -236,7 +236,7 @@ function SyncEditor({ const destinationNamespaces = (sourceNamespaces?.length > 0 ? sourceNamespaces : [""]) .map(ns => (syncOptions?.namespace ? syncOptions?.namespace.replaceAll("${SOURCE_NAMESPACE}", ns ?? "") : "")) .map(ns => ns?.trim()) - .map(ns => ns || destination?.[namespaceImpl.field] || "") + .map(ns => ns || (destination?.[namespaceImpl.field] as string) || "") .filter(ns => ns !== "") .filter(onlyUnique); From edbc6044153405ea1037970be33b6b6895bf2eb4 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 14 Aug 2024 16:42:56 +0400 Subject: [PATCH 0843/1353] @jitsu/js: don't assume s2s mode based on node.js environment --- libs/jitsu-js/src/analytics-plugin.ts | 4 ++-- types/protocols/analytics.d.ts | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/libs/jitsu-js/src/analytics-plugin.ts b/libs/jitsu-js/src/analytics-plugin.ts index 4e40a55f6..a0e557cd5 100644 --- a/libs/jitsu-js/src/analytics-plugin.ts +++ b/libs/jitsu-js/src/analytics-plugin.ts @@ -427,7 +427,7 @@ function adjustPayload( library: { name: jitsuLibraryName, version: jitsuVersion, - env: s2s ? "node" : "browser", + env: isInBrowser() ? "browser" : "node", }, consent: config.privacy?.consentCategories ? { @@ -638,7 +638,7 @@ async function send( console.log(`[JITSU DEBUG] sending '${method}' event:`, payload); return; } - const s2s = jitsuConfig.s2s === undefined ? !isInBrowser() : jitsuConfig.s2s; + const s2s = !!jitsuConfig.s2s; const url = s2s ? `${jitsuConfig.host}/api/s/s2s/${method}` : `${jitsuConfig.host}/api/s/${method}`; const fetch = jitsuConfig.fetch || globalThis.fetch; if (!fetch) { diff --git a/types/protocols/analytics.d.ts b/types/protocols/analytics.d.ts index 29939291e..5247e41db 100644 --- a/types/protocols/analytics.d.ts +++ b/types/protocols/analytics.d.ts @@ -357,7 +357,6 @@ export type JitsuOptions = { /** * If true, events will go to s2s endpoints like ${host}/api/s/s2s/{type}. Otherwise, they'll go to ${host}/api/s/{type}. * - * If not set at all, it will be detected automatically by presence of `window` object */ s2s?: boolean; From 32c8d114d6cb56eadb765936b9a74287e37d6b95 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 14 Aug 2024 17:11:26 +0400 Subject: [PATCH 0844/1353] posthog-destination: support screen events --- libs/core-functions/src/functions/posthog-destination.ts | 8 +++++--- package.json | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/libs/core-functions/src/functions/posthog-destination.ts b/libs/core-functions/src/functions/posthog-destination.ts index bec7f499b..92b4ecab7 100644 --- a/libs/core-functions/src/functions/posthog-destination.ts +++ b/libs/core-functions/src/functions/posthog-destination.ts @@ -140,19 +140,21 @@ const PosthogDestination: JitsuFunction Date: Wed, 14 Aug 2024 14:18:25 -0400 Subject: [PATCH 0845/1353] feat: more strict auth cookie --- pnpm-lock.yaml | 26759 +++++++++------- webapps/console/lib/server/firebase-server.ts | 2 +- .../pages/api/fb-auth/create-session.ts | 4 +- 3 files changed, 15453 insertions(+), 11312 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c84a03272..222bf26b0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true @@ -1185,83 +1185,12511 @@ importers: packages: - /@adobe/css-tools@4.4.0: + '@adobe/css-tools@4.4.0': resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} - dev: true - /@alloc/quick-lru@5.2.0: + '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - /@amplitude/ua-parser-js@0.7.33: + '@amplitude/ua-parser-js@0.7.33': resolution: {integrity: sha512-wKEtVR4vXuPT9cVEIJkYWnlF++Gx3BdLatPBM+SZ1ztVIvnhdGBZR/mn9x/PzyrMcRlZmyi6L56I2J3doVBnjA==} - dev: false - /@ampproject/remapping@2.3.0: + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + + '@analytics/cookie-utils@0.2.12': + resolution: {integrity: sha512-2h/yuIu3kmu+ZJlKmlT6GoRvUEY2k1BbQBezEv5kGhnn9KpmzPz715Y3GmM2i+m7Y0QmBdVUoA260dQZkofs2A==} + + '@analytics/core@0.12.15': + resolution: {integrity: sha512-Y+zxTNIbONXKxeEUOtcXs4b3uuiGjF5sy1zHl8ZNkIBwrOpTM8ZGNhi0xGL8ZhaQLGbi03BrT6DaoNNG3sBQOg==} + + '@analytics/global-storage-utils@0.1.7': + resolution: {integrity: sha512-V+spzGLZYm4biZT4uefaylm80SrLXf8WOTv9hCgA46cLcyxx3LD4GCpssp1lj+RcWLl/uXJQBRO4Mnn/o1x6Gw==} + + '@analytics/localstorage-utils@0.1.10': + resolution: {integrity: sha512-uJS+Jp1yLG5VFCgA5T82ZODYBS0xuDQx0NtAZrgbqt9j51BX3TcgmOez5LVkrUNu/lpbxjCLq35I4TKj78VmOQ==} + + '@analytics/session-storage-utils@0.0.7': + resolution: {integrity: sha512-PSv40UxG96HVcjY15e3zOqU2n8IqXnH8XvTkg1X43uXNTKVSebiI2kUjA3Q7ESFbw5DPwcLbJhV7GforpuBLDw==} + + '@analytics/storage-utils@0.4.2': + resolution: {integrity: sha512-AXObwyVQw9h2uJh1t2hUgabtVxzYpW+7uKVbdHQK80vr3Td5rrmCxrCxarh7HUuAgSDZ0bZWqmYxVgmwKceaLg==} + + '@analytics/type-utils@0.6.2': + resolution: {integrity: sha512-TD+xbmsBLyYy/IxFimW/YL/9L2IEnM7/EoV9Aeh56U64Ify8o27HJcKjo38XY9Tcn0uOq1AX3thkKgvtWvwFQg==} + + '@ant-design/colors@7.1.0': + resolution: {integrity: sha512-MMoDGWn1y9LdQJQSHiCC20x3uZ3CwQnv9QMz6pCmJOrqdgM9YxsoVVY0wtrdXbmfSgnV0KNk6zi09NAhMR2jvg==} + + '@ant-design/cssinjs-utils@1.0.3': + resolution: {integrity: sha512-BrztZZKuoYcJK8uEH40ylBemf/Mu/QPiDos56g2bv6eUoniQkgQHOCOvA3+pncoFO1TaS8xcUCIqGzDA0I+ZVQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@ant-design/cssinjs@1.21.0': + resolution: {integrity: sha512-gIilraPl+9EoKdYxnupxjHB/Q6IHNRjEXszKbDxZdsgv4sAZ9pjkCq8yanDWNvyfjp4leir2OVAJm0vxwKK8YA==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + + '@ant-design/icons-svg@4.4.2': + resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==} + + '@ant-design/icons@5.4.0': + resolution: {integrity: sha512-QZbWC5xQYexCI5q4/fehSEkchJr5UGtvAJweT743qKUQQGs9IH2DehNLP49DJ3Ii9m9CijD2HN6fNy3WKhIFdA==} + engines: {node: '>=8'} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + + '@ant-design/react-slick@1.1.2': + resolution: {integrity: sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==} + peerDependencies: + react: '>=16.9.0' + + '@apideck/better-ajv-errors@0.3.6': + resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} + engines: {node: '>=10'} + peerDependencies: + ajv: '>=8' + + '@aws-crypto/crc32@5.2.0': + resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/crc32c@5.2.0': + resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==} + + '@aws-crypto/sha1-browser@5.2.0': + resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==} + + '@aws-crypto/sha256-browser@5.2.0': + resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} + + '@aws-crypto/sha256-js@5.2.0': + resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/supports-web-crypto@5.2.0': + resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} + + '@aws-crypto/util@5.2.0': + resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} + + '@aws-sdk/client-s3@3.621.0': + resolution: {integrity: sha512-YhGkd2HQTM4HCYJIAVWvfbUMpOF7XUr1W/e2LN3CFP0WTF4zcCJKesJ2iNHrExqC0Ek1+qarMxiXBK95itfjYQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/client-sso-oidc@3.621.0': + resolution: {integrity: sha512-mMjk3mFUwV2Y68POf1BQMTF+F6qxt5tPu6daEUCNGC9Cenk3h2YXQQoS4/eSyYzuBiYk3vx49VgleRvdvkg8rg==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.621.0 + + '@aws-sdk/client-sso@3.621.0': + resolution: {integrity: sha512-xpKfikN4u0BaUYZA9FGUMkkDmfoIP0Q03+A86WjqDWhcOoqNA1DkHsE4kZ+r064ifkPUfcNuUvlkVTEoBZoFjA==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/client-sts@3.621.0': + resolution: {integrity: sha512-707uiuReSt+nAx6d0c21xLjLm2lxeKc7padxjv92CIrIocnQSlJPxSCM7r5zBhwiahJA6MNQwmTl2xznU67KgA==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/core@3.621.0': + resolution: {integrity: sha512-CtOwWmDdEiINkGXD93iGfXjN0WmCp9l45cDWHHGa8lRgEDyhuL7bwd/pH5aSzj0j8SiQBG2k0S7DHbd5RaqvbQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-env@3.620.1': + resolution: {integrity: sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-http@3.621.0': + resolution: {integrity: sha512-/jc2tEsdkT1QQAI5Dvoci50DbSxtJrevemwFsm0B73pwCcOQZ5ZwwSdVqGsPutzYzUVx3bcXg3LRL7jLACqRIg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-ini@3.621.0': + resolution: {integrity: sha512-0EWVnSc+JQn5HLnF5Xv405M8n4zfdx9gyGdpnCmAmFqEDHA8LmBdxJdpUk1Ovp/I5oPANhjojxabIW5f1uU0RA==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.621.0 + + '@aws-sdk/credential-provider-node@3.621.0': + resolution: {integrity: sha512-4JqpccUgz5Snanpt2+53hbOBbJQrSFq7E1sAAbgY6BKVQUsW5qyXqnjvSF32kDeKa5JpBl3bBWLZl04IadcPHw==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-process@3.620.1': + resolution: {integrity: sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-sso@3.621.0': + resolution: {integrity: sha512-Kza0jcFeA/GEL6xJlzR2KFf1PfZKMFnxfGzJzl5yN7EjoGdMijl34KaRyVnfRjnCWcsUpBWKNIDk9WZVMY9yiw==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.621.0': + resolution: {integrity: sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.621.0 + + '@aws-sdk/middleware-bucket-endpoint@3.620.0': + resolution: {integrity: sha512-eGLL0W6L3HDb3OACyetZYOWpHJ+gLo0TehQKeQyy2G8vTYXqNTeqYhuI6up9HVjBzU9eQiULVQETmgQs7TFaRg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-expect-continue@3.620.0': + resolution: {integrity: sha512-QXeRFMLfyQ31nAHLbiTLtk0oHzG9QLMaof5jIfqcUwnOkO8YnQdeqzakrg1Alpy/VQ7aqzIi8qypkBe2KXZz0A==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-flexible-checksums@3.620.0': + resolution: {integrity: sha512-ftz+NW7qka2sVuwnnO1IzBku5ccP+s5qZGeRTPgrKB7OzRW85gthvIo1vQR2w+OwHFk7WJbbhhWwbCbktnP4UA==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-host-header@3.620.0': + resolution: {integrity: sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-location-constraint@3.609.0': + resolution: {integrity: sha512-xzsdoTkszGVqGVPjUmgoP7TORiByLueMHieI1fhQL888WPdqctwAx3ES6d/bA9Q/i8jnc6hs+Fjhy8UvBTkE9A==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-logger@3.609.0': + resolution: {integrity: sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-recursion-detection@3.620.0': + resolution: {integrity: sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-sdk-s3@3.621.0': + resolution: {integrity: sha512-CJrQrtKylcqvyPkRR16JmPZkHroCkWwLErQrg30ZcBPNNok8xbfX6cYqG16XDTnu4lSYzv2Yqc4w4oOBv8xerQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-signing@3.620.0': + resolution: {integrity: sha512-gxI7rubiaanUXaLfJ4NybERa9MGPNg2Ycl/OqANsozrBnR3Pw8vqy3EuVImQOyn2pJ2IFvl8ZPoSMHf4pX56FQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-ssec@3.609.0': + resolution: {integrity: sha512-GZSD1s7+JswWOTamVap79QiDaIV7byJFssBW68GYjyRS5EBjNfwA/8s+6uE6g39R3ojyTbYOmvcANoZEhSULXg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-user-agent@3.620.0': + resolution: {integrity: sha512-bvS6etn+KsuL32ubY5D3xNof1qkenpbJXf/ugGXbg0n98DvDFQ/F+SMLxHgbnER5dsKYchNnhmtI6/FC3HFu/A==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/region-config-resolver@3.614.0': + resolution: {integrity: sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/signature-v4-multi-region@3.621.0': + resolution: {integrity: sha512-u+ulCaHFveqHaTxgiYrEAyfBVP6GRKjnmDut67CtjhjslshPWYpo/ndtlCW1zc0RDne3uUeK13Pqp7dp7p1d6g==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/token-providers@3.614.0': + resolution: {integrity: sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sso-oidc': ^3.614.0 + + '@aws-sdk/types@3.609.0': + resolution: {integrity: sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/util-arn-parser@3.568.0': + resolution: {integrity: sha512-XUKJWWo+KOB7fbnPP0+g/o5Ulku/X53t7i/h+sPHr5xxYTJJ9CYnbToo95mzxe7xWvkLrsNtJ8L+MnNn9INs2w==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/util-endpoints@3.614.0': + resolution: {integrity: sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/util-locate-window@3.568.0': + resolution: {integrity: sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/util-user-agent-browser@3.609.0': + resolution: {integrity: sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==} + + '@aws-sdk/util-user-agent-node@3.614.0': + resolution: {integrity: sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==} + engines: {node: '>=16.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + + '@aws-sdk/xml-builder@3.609.0': + resolution: {integrity: sha512-l9XxNcA4HX98rwCC2/KoiWcmEiRfZe4G+mYwDbCFT87JIMj6GBhLDkAzr/W8KAaA2IDr8Vc6J8fZPgVulxxfMA==} + engines: {node: '>=16.0.0'} + + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.25.2': + resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.25.2': + resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} + engines: {node: '>=6.9.0'} + + '@babel/eslint-parser@7.25.1': + resolution: {integrity: sha512-Y956ghgTT4j7rKesabkh5WeqgSFZVFwaPR0IWFm7KFHFmmJ4afbG49SmfW4S+GyRPx0Dy5jxEWA5t0rpxfElWg==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + peerDependencies: + '@babel/core': ^7.11.0 + eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 + + '@babel/generator@7.25.0': + resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.24.7': + resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7': + resolution: {integrity: sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.25.2': + resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.25.0': + resolution: {integrity: sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.25.2': + resolution: {integrity: sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.2': + resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + '@babel/helper-member-expression-to-functions@7.24.8': + resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.24.7': + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.25.2': + resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.24.7': + resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.24.8': + resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.25.0': + resolution: {integrity: sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.25.0': + resolution: {integrity: sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-simple-access@7.24.7': + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-skip-transparent-expression-wrappers@7.24.7': + resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.8': + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.24.8': + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.25.0': + resolution: {integrity: sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.25.0': + resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.25.0': + resolution: {integrity: sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.0': + resolution: {integrity: sha512-dG0aApncVQwAUJa8tP1VHTnmU67BeIQvKafd3raEx315H54FfkZSz3B/TT+33ZQAjatGJA79gZqTtqL5QZUKXw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.0': + resolution: {integrity: sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.0': + resolution: {integrity: sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7': + resolution: {integrity: sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.0': + resolution: {integrity: sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-proposal-class-properties@7.18.6': + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-class-properties@7.7.4': + resolution: {integrity: sha512-EcuXeV4Hv1X3+Q1TsuOmyyxeTRiSqurGJ26+I/FW1WbymmRRapVORm6x1Zl3iDIHyRxEs+VXWp6qnlcfcJSbbw==} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-decorators@7.24.7': + resolution: {integrity: sha512-RL9GR0pUG5Kc8BUWLNDm2T5OpYwSX15r98I0IkgmRQTXuELq/OynH8xtMTMvTJFjXbMWFVTKtYkTaYQsuAwQlQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6': + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-numeric-separator@7.18.6': + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-optional-chaining@7.21.0': + resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-private-methods@7.18.6': + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-private-property-in-object@7.21.11': + resolution: {integrity: sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-decorators@7.24.7': + resolution: {integrity: sha512-Ui4uLJJrRV1lb38zg1yYTmRKmiZLiftDEvZN2iq3kd9kUFU+PttmzTbAFC2ucRk/XJmtek6G23gPsuZbhrT8fQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-dynamic-import@7.8.3': + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-export-namespace-from@7.8.3': + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-flow@7.24.7': + resolution: {integrity: sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-assertions@7.24.7': + resolution: {integrity: sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.24.7': + resolution: {integrity: sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.24.7': + resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.24.7': + resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.24.7': + resolution: {integrity: sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-generator-functions@7.25.0': + resolution: {integrity: sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-to-generator@7.24.7': + resolution: {integrity: sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoped-functions@7.24.7': + resolution: {integrity: sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoping@7.25.0': + resolution: {integrity: sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-properties@7.24.7': + resolution: {integrity: sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-static-block@7.24.7': + resolution: {integrity: sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.25.0': + resolution: {integrity: sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-computed-properties@7.24.7': + resolution: {integrity: sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-destructuring@7.24.8': + resolution: {integrity: sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dotall-regex@7.24.7': + resolution: {integrity: sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-keys@7.24.7': + resolution: {integrity: sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.0': + resolution: {integrity: sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-dynamic-import@7.24.7': + resolution: {integrity: sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-exponentiation-operator@7.24.7': + resolution: {integrity: sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-export-namespace-from@7.24.7': + resolution: {integrity: sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-flow-strip-types@7.25.2': + resolution: {integrity: sha512-InBZ0O8tew5V0K6cHcQ+wgxlrjOw1W4wDXLkOTjLRD8GYhTSkxTVBtdy3MMtvYBrbAWa1Qm3hNoTc1620Yj+Mg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-for-of@7.24.7': + resolution: {integrity: sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-function-name@7.25.1': + resolution: {integrity: sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-json-strings@7.24.7': + resolution: {integrity: sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-literals@7.25.2': + resolution: {integrity: sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-logical-assignment-operators@7.24.7': + resolution: {integrity: sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-member-expression-literals@7.24.7': + resolution: {integrity: sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.24.7': + resolution: {integrity: sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.24.8': + resolution: {integrity: sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.25.0': + resolution: {integrity: sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.24.7': + resolution: {integrity: sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.24.7': + resolution: {integrity: sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.24.7': + resolution: {integrity: sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.24.7': + resolution: {integrity: sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.24.7': + resolution: {integrity: sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.24.7': + resolution: {integrity: sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.24.7': + resolution: {integrity: sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.24.7': + resolution: {integrity: sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.24.8': + resolution: {integrity: sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.24.7': + resolution: {integrity: sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.24.7': + resolution: {integrity: sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.24.7': + resolution: {integrity: sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.24.7': + resolution: {integrity: sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-constant-elements@7.25.1': + resolution: {integrity: sha512-SLV/giH/V4SmloZ6Dt40HjTGTAIkxn33TVIHxNGNvo8ezMhrxBkzisj4op1KZYPIOHFLqhv60OHvX+YRu4xbmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-display-name@7.24.7': + resolution: {integrity: sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-development@7.24.7': + resolution: {integrity: sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx@7.25.2': + resolution: {integrity: sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-pure-annotations@7.24.7': + resolution: {integrity: sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.24.7': + resolution: {integrity: sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-reserved-words@7.24.7': + resolution: {integrity: sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-runtime@7.24.7': + resolution: {integrity: sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.24.7': + resolution: {integrity: sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.24.7': + resolution: {integrity: sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.24.7': + resolution: {integrity: sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.24.7': + resolution: {integrity: sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.24.8': + resolution: {integrity: sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.25.2': + resolution: {integrity: sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-escapes@7.24.7': + resolution: {integrity: sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.24.7': + resolution: {integrity: sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.24.7': + resolution: {integrity: sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.24.7': + resolution: {integrity: sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.25.2': + resolution: {integrity: sha512-Y2Vkwy3ITW4id9c6KXshVV/x5yCGK7VdJmKkzOzNsDZMojRKfSA/033rRbLqlRozmhRXCejxWHLSJOg/wUHfzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-flow@7.24.7': + resolution: {integrity: sha512-NL3Lo0NorCU607zU3NwRyJbpaB6E3t0xtd3LfAQKDfkeX4/ggcDXvkmkW42QWT5owUeW/jAe4hn+2qvkV1IbfQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + '@babel/preset-react@7.24.7': + resolution: {integrity: sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.24.7': + resolution: {integrity: sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/regjsgen@0.8.0': + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + + '@babel/runtime@7.25.0': + resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.25.0': + resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.25.2': + resolution: {integrity: sha512-s4/r+a7xTnny2O6FcZzqgT6nE4/GHEdcqj4qAeglbUOh0TeglEfmNJFAd/OLoVtGd6ZhAO8GCVvCNUO5t/VJVQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.25.2': + resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} + engines: {node: '>=6.9.0'} + + '@balena/dockerignore@1.0.2': + resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@clickhouse/client-common@1.4.0': + resolution: {integrity: sha512-kglG8YyWnR1K24RckUf5ZdNTN0U0s+a1j/bpCO4ZjzjO87ICgWlXFVD22pZqSACW7/2IIi1IkzbwtxKI2s/MOw==} + + '@clickhouse/client@1.4.0': + resolution: {integrity: sha512-O4mbFPM/wQtFck01ghYI2mnNHv9jSFEiQBsTCH4t6MKeGHNAPkJGaFGv+KycLTv6zjnQNjiUGdXDMVRema5SyA==} + engines: {node: '>=16'} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@csstools/normalize.css@12.1.1': + resolution: {integrity: sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==} + + '@csstools/postcss-cascade-layers@1.1.1': + resolution: {integrity: sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + + '@csstools/postcss-color-function@1.1.1': + resolution: {integrity: sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + + '@csstools/postcss-font-format-keywords@1.0.1': + resolution: {integrity: sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + + '@csstools/postcss-hwb-function@1.0.2': + resolution: {integrity: sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + + '@csstools/postcss-ic-unit@1.0.1': + resolution: {integrity: sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + + '@csstools/postcss-is-pseudo-class@2.0.7': + resolution: {integrity: sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + + '@csstools/postcss-nested-calc@1.0.0': + resolution: {integrity: sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + + '@csstools/postcss-normalize-display-values@1.0.1': + resolution: {integrity: sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + + '@csstools/postcss-oklab-function@1.1.1': + resolution: {integrity: sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + + '@csstools/postcss-progressive-custom-properties@1.3.0': + resolution: {integrity: sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.3 + + '@csstools/postcss-stepped-value-functions@1.0.1': + resolution: {integrity: sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + + '@csstools/postcss-text-decoration-shorthand@1.0.0': + resolution: {integrity: sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + + '@csstools/postcss-trigonometric-functions@1.0.2': + resolution: {integrity: sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==} + engines: {node: ^14 || >=16} + peerDependencies: + postcss: ^8.2 + + '@csstools/postcss-unset-value@1.0.2': + resolution: {integrity: sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + + '@csstools/selector-specificity@2.2.0': + resolution: {integrity: sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss-selector-parser: ^6.0.10 + + '@ctrl/tinycolor@3.6.1': + resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} + engines: {node: '>=10'} + + '@discoveryjs/json-ext@0.5.7': + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + + '@dnd-kit/accessibility@3.1.0': + resolution: {integrity: sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==} + peerDependencies: + react: '>=16.8.0' + + '@dnd-kit/core@6.1.0': + resolution: {integrity: sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@dnd-kit/modifiers@6.0.1': + resolution: {integrity: sha512-rbxcsg3HhzlcMHVHWDuh9LCjpOVAgqbV78wLGI8tziXY3+qcMQ61qVXIvNKQFuhj75dSfD+o+PYZQ/NUk2A23A==} + peerDependencies: + '@dnd-kit/core': ^6.0.6 + react: '>=16.8.0' + + '@dnd-kit/sortable@7.0.2': + resolution: {integrity: sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA==} + peerDependencies: + '@dnd-kit/core': ^6.0.7 + react: '>=16.8.0' + + '@dnd-kit/utilities@3.2.2': + resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} + peerDependencies: + react: '>=16.8.0' + + '@edge-runtime/format@2.2.1': + resolution: {integrity: sha512-JQTRVuiusQLNNLe2W9tnzBlV/GvSVcozLl4XZHk5swnRZ/v6jp8TqR8P7sqmJsQqblDZ3EztcWmLDbhRje/+8g==} + engines: {node: '>=16'} + + '@edge-runtime/node-utils@2.3.0': + resolution: {integrity: sha512-uUtx8BFoO1hNxtHjp3eqVPC/mWImGb2exOfGjMLUoipuWgjej+f4o/VP4bUI8U40gu7Teogd5VTeZUkGvJSPOQ==} + engines: {node: '>=16'} + + '@edge-runtime/ponyfill@2.4.2': + resolution: {integrity: sha512-oN17GjFr69chu6sDLvXxdhg0Qe8EZviGSuqzR9qOiKh4MhFYGdBBcqRNzdmYeAdeRzOW2mM9yil4RftUQ7sUOA==} + engines: {node: '>=16'} + + '@edge-runtime/primitives@4.1.0': + resolution: {integrity: sha512-Vw0lbJ2lvRUqc7/soqygUX216Xb8T3WBZ987oywz6aJqRxcwSVWwr9e+Nqo2m9bxobA9mdbWNNoRY6S9eko1EQ==} + engines: {node: '>=16'} + + '@edge-runtime/vm@3.2.0': + resolution: {integrity: sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw==} + engines: {node: '>=16'} + + '@emotion/hash@0.8.0': + resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} + + '@emotion/unitless@0.7.5': + resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.11.0': + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + + '@fastify/busboy@3.0.0': + resolution: {integrity: sha512-83rnH2nCvclWaPQQKvkJ2pdOjG4TZyEVuFDnlOF6KP08lDaaceVyw/W63mDuafQT+MKHCvXIPpE5uYWeM0rT4w==} + + '@firebase/analytics-compat@0.2.13': + resolution: {integrity: sha512-aZ4wGfNDMsCxhKzDbK2g1aV0JKsdQ9FbeIsjpNJPzhahV0XYj+z36Y4RNLPpG/6hHU4gxnezxs+yn3HhHkNL8w==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/analytics-types@0.8.2': + resolution: {integrity: sha512-EnzNNLh+9/sJsimsA/FGqzakmrAUKLeJvjRHlg8df1f97NLUlFidk9600y0ZgWOp3CAxn6Hjtk+08tixlUOWyw==} + + '@firebase/analytics@0.10.7': + resolution: {integrity: sha512-GE29uTT6y/Jv2EP0OjpTezeTQZ5FTCTaZXKrrdVGjb/t35AU4u/jiU+hUwUPpuK8fqhhiHkS/AawE3a3ZK/a9Q==} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/app-check-compat@0.3.14': + resolution: {integrity: sha512-kK3bPfojAfXE53W+20rxMqIxrloFswXG9vh4kEdYL6Wa2IB3sD5++2dPiK3yGxl8oQiqS8qL2wcKB5/xLpEVEg==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/app-check-interop-types@0.3.2': + resolution: {integrity: sha512-LMs47Vinv2HBMZi49C09dJxp0QT5LwDzFaVGf/+ITHe3BlIhUiLNttkATSXplc89A2lAaeTqjgqVkiRfUGyQiQ==} + + '@firebase/app-check-types@0.5.2': + resolution: {integrity: sha512-FSOEzTzL5bLUbD2co3Zut46iyPWML6xc4x+78TeaXMSuJap5QObfb+rVvZJtla3asN4RwU7elaQaduP+HFizDA==} + + '@firebase/app-check@0.8.7': + resolution: {integrity: sha512-EkOeJcMKVR0zZ6z/jqcFTqHb/xq+TVIRIuBNGHdpcIuFU1czhSlegvqv2+nC+nFrkD8M6Xvd3tAlUOkdbMeS6A==} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/app-compat@0.2.38': + resolution: {integrity: sha512-36ZrSvkYLW7QR01Sii2X+IY18ErMpRg6e2B2f/DVTtJBolthwXOnNBps+wvaVBvegdvdVPspgDXZUV0ppqh45w==} + + '@firebase/app-types@0.9.2': + resolution: {integrity: sha512-oMEZ1TDlBz479lmABwWsWjzHwheQKiAgnuKxE0pz0IXCVx7/rtlkx1fQ6GfgK24WCrxDKMplZrT50Kh04iMbXQ==} + + '@firebase/app@0.10.8': + resolution: {integrity: sha512-xSLmW0/RShcnUEXH7l+wC0AFWaUtty4tUFF2loIgbtXTRmra0UH/SqYDf/IcfreUninRrCsusNmvoTidGkXJPw==} + + '@firebase/auth-compat@0.5.11': + resolution: {integrity: sha512-7rE3MkQDoWwI2qd8qsra4/QZCO2GzQSbCL6AVQpult9+Nbimg+5A+YeHxpLTcYAxUV6HDg2CqTDQreFLhcm1CQ==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/auth-interop-types@0.2.3': + resolution: {integrity: sha512-Fc9wuJGgxoxQeavybiuwgyi+0rssr76b+nHpj+eGhXFYAdudMWyfBHvFL/I5fEHniUM/UQdFzi9VXJK2iZF7FQ==} + + '@firebase/auth-types@0.12.2': + resolution: {integrity: sha512-qsEBaRMoGvHO10unlDJhaKSuPn4pyoTtlQuP1ghZfzB6rNQPuhp/N/DcFZxm9i4v0SogjCbf9reWupwIvfmH6w==} + peerDependencies: + '@firebase/app-types': 0.x + '@firebase/util': 1.x + + '@firebase/auth@1.7.6': + resolution: {integrity: sha512-T+lA5xoug9CByGYkD5WkfTh2ujEYq/frGZPbk0H+fNU6fNl7nqg88KcsmzsC6Fsqbjm3LLEb/i6wJvF6NSNEig==} + peerDependencies: + '@firebase/app': 0.x + '@react-native-async-storage/async-storage': ^1.18.1 + peerDependenciesMeta: + '@react-native-async-storage/async-storage': + optional: true + + '@firebase/component@0.6.8': + resolution: {integrity: sha512-LcNvxGLLGjBwB0dJUsBGCej2fqAepWyBubs4jt1Tiuns7QLbXHuyObZ4aMeBjZjWx4m8g1LoVI9QFpSaq/k4/g==} + + '@firebase/database-compat@1.0.6': + resolution: {integrity: sha512-1OGA0sLY47mkXjhICCrUTXEYFnSSXoiXWm1SHsN62b+Lzs5aKA3aWTjTUmYIoK93kDAMPkYpulSv8jcbH4Hwew==} + + '@firebase/database-compat@1.0.7': + resolution: {integrity: sha512-R/3B+VVzEFN5YcHmfWns3eitA8fHLTL03io+FIoMcTYkajFnrBdS3A+g/KceN9omP7FYYYGTQWF9lvbEx6eMEg==} + + '@firebase/database-types@1.0.4': + resolution: {integrity: sha512-mz9ZzbH6euFXbcBo+enuJ36I5dR5w+enJHHjy9Y5ThCdKUseqfDjW3vCp1YxE9zygFCSjJJ/z1cQ+zodvUcwPQ==} + + '@firebase/database@1.0.6': + resolution: {integrity: sha512-nrexUEG/fpVlHtWKkyfhTC3834kZ1WS7voNyqbBsBCqHXQOvznN5Z0L3nxBqdXSJyltNAf4ndFlQqm5gZiEczQ==} + + '@firebase/database@1.0.7': + resolution: {integrity: sha512-wjXr5AO8RPxVVg7rRCYffT7FMtBjHRfJ9KMwi19MbOf0vBf0H9YqW3WCgcnLpXI6ehiUcU3z3qgPnnU0nK6SnA==} + + '@firebase/firestore-compat@0.3.34': + resolution: {integrity: sha512-OBP2F/Ccydl2U2j8XIfpKBxf0EnQHEhbZ4LTwbSS2QlG9+8TwhvKFkKk/ZljWYqaype+qFKPuXZ5flCqYEETeA==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/firestore-types@3.0.2': + resolution: {integrity: sha512-wp1A+t5rI2Qc/2q7r2ZpjUXkRVPtGMd6zCLsiWurjsQpqPgFin3AhNibKcIzoF2rnToNa/XYtyWXuifjOOwDgg==} + peerDependencies: + '@firebase/app-types': 0.x + '@firebase/util': 1.x + + '@firebase/firestore@4.6.5': + resolution: {integrity: sha512-0+Ascaht4qUzj4pCopMPWmoAujk8HKjwCpaNYOOjbYMZ65RVfZPsfZwwbWi/zWMXj6xvPsai5oBiErUUkrLwNw==} + engines: {node: '>=10.10.0'} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/functions-compat@0.3.12': + resolution: {integrity: sha512-r3XUb5VlITWpML46JymfJPkK6I9j4SNlO7qWIXUc0TUmkv0oAfVoiIt1F83/NuMZXaGr4YWA/794nVSy4GV8tw==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/functions-types@0.6.2': + resolution: {integrity: sha512-0KiJ9lZ28nS2iJJvimpY4nNccV21rkQyor5Iheu/nq8aKXJqtJdeSlZDspjPSBBiHRzo7/GMUttegnsEITqR+w==} + + '@firebase/functions@0.11.6': + resolution: {integrity: sha512-GPfIBPtpwQvsC7SQbgaUjLTdja0CsNwMoKSgrzA1FGGRk4NX6qO7VQU6XCwBiAFWbpbQex6QWkSMsCzLx1uibQ==} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/installations-compat@0.2.8': + resolution: {integrity: sha512-pI2q8JFHB7yIq/szmhzGSWXtOvtzl6tCUmyykv5C8vvfOVJUH6mP4M4iwjbK8S1JotKd/K70+JWyYlxgQ0Kpyw==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/installations-types@0.5.2': + resolution: {integrity: sha512-que84TqGRZJpJKHBlF2pkvc1YcXrtEDOVGiDjovP/a3s6W4nlbohGXEsBJo0JCeeg/UG9A+DEZVDUV9GpklUzA==} + peerDependencies: + '@firebase/app-types': 0.x + + '@firebase/installations@0.6.8': + resolution: {integrity: sha512-57V374qdb2+wT5v7+ntpLXBjZkO6WRgmAUbVkRfFTM/4t980p0FesbqTAcOIiM8U866UeuuuF8lYH70D3jM/jQ==} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/logger@0.4.2': + resolution: {integrity: sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==} + + '@firebase/messaging-compat@0.2.10': + resolution: {integrity: sha512-FXQm7rcowkDm8kFLduHV35IRYCRo+Ng0PIp/t1+EBuEbyplaKkGjZ932pE+owf/XR+G/60ku2QRBptRGLXZydg==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/messaging-interop-types@0.2.2': + resolution: {integrity: sha512-l68HXbuD2PPzDUOFb3aG+nZj5KA3INcPwlocwLZOzPp9rFM9yeuI9YLl6DQfguTX5eAGxO0doTR+rDLDvQb5tA==} + + '@firebase/messaging@0.12.10': + resolution: {integrity: sha512-fGbxJPKpl2DIKNJGhbk4mYPcM+qE2gl91r6xPoiol/mN88F5Ym6UeRdMVZah+pijh9WxM55alTYwXuW40r1Y2Q==} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/performance-compat@0.2.8': + resolution: {integrity: sha512-o7TFClRVJd3VIBoY7KZQqtCeW0PC6v9uBzM6Lfw3Nc9D7hM6OonqecYvh7NwJ6R14k+xM27frLS4BcCvFHKw2A==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/performance-types@0.2.2': + resolution: {integrity: sha512-gVq0/lAClVH5STrIdKnHnCo2UcPLjJlDUoEB/tB4KM+hAeHUxWKnpT0nemUPvxZ5nbdY/pybeyMe8Cs29gEcHA==} + + '@firebase/performance@0.6.8': + resolution: {integrity: sha512-F+alziiIZ6Yn8FG47mxwljq+4XkgkT2uJIFRlkyViUQRLzrogaUJW6u/+6ZrePXnouKlKIwzqos3PVJraPEcCA==} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/remote-config-compat@0.2.8': + resolution: {integrity: sha512-UxSFOp6dzFj2AHB8Bq/BYtbq5iFyizKx4Rd6WxAdaKYM8cnPMeK+l2v+Oogtjae+AeyHRI+MfL2acsfVe5cd2A==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/remote-config-types@0.3.2': + resolution: {integrity: sha512-0BC4+Ud7y2aPTyhXJTMTFfrGGLqdYXrUB9sJVAB8NiqJswDTc4/2qrE/yfUbnQJhbSi6ZaTTBKyG3n1nplssaA==} + + '@firebase/remote-config@0.4.8': + resolution: {integrity: sha512-AMLqe6wfIRnjc6FkCWOSUjhc1fSTEf8o+cv1NolFvbiJ/tU+TqN4pI7pT+MIKQzNiq5fxLehkOx+xtAQBxPJKQ==} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/storage-compat@0.3.9': + resolution: {integrity: sha512-WWgAp5bTW961oIsCc9+98m4MIVKpEqztAlIngfHfwO/x3DYoBPRl/awMRG3CAXyVxG+7B7oHC5IsnqM+vTwx2A==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/storage-types@0.8.2': + resolution: {integrity: sha512-0vWu99rdey0g53lA7IShoA2Lol1jfnPovzLDUBuon65K7uKG9G+L5uO05brD9pMw+l4HRFw23ah3GwTGpEav6g==} + peerDependencies: + '@firebase/app-types': 0.x + '@firebase/util': 1.x + + '@firebase/storage@0.12.6': + resolution: {integrity: sha512-Zgb9WuehJxzhj7pGXUvkAEaH+3HvLjD9xSZ9nepuXf5f8378xME7oGJtREr/RnepdDA5YW0XIxe0QQBNHpe1nw==} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/util@1.9.7': + resolution: {integrity: sha512-fBVNH/8bRbYjqlbIhZ+lBtdAAS4WqZumx03K06/u7fJSpz1TGjEMm1ImvKD47w+xaFKIP2ori6z8BrbakRfjJA==} + + '@firebase/vertexai-preview@0.0.3': + resolution: {integrity: sha512-KVtUWLp+ScgiwkDKAvNkVucAyhLVQp6C6lhnVEuIg4mWhWcS3oerjAeVhZT4uNofKwWxRsOaB2Yec7DMTXlQPQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + '@firebase/app': 0.x + '@firebase/app-types': 0.x + + '@firebase/webchannel-wrapper@1.0.1': + resolution: {integrity: sha512-jmEnr/pk0yVkA7mIlHNnxCi+wWzOFUg0WyIotgkKAb2u1J7fAeDBcVNSTjTihbAYNusCLQdW5s9IJ5qwnEufcQ==} + + '@fontsource/inter@4.5.15': + resolution: {integrity: sha512-FzleM9AxZQK2nqsTDtBiY0PMEVWvnKnuu2i09+p6DHvrHsuucoV2j0tmw+kAT3L4hvsLdAIDv6MdGehsPIdT+Q==} + + '@fontsource/roboto-mono@4.5.10': + resolution: {integrity: sha512-KrJdmkqz6DszT2wV/bbhXef4r0hV3B0vw2mAqei8A2kRnvq+gcJLmmIeQ94vu9VEXrUQzos5M9lH1TAAXpRphw==} + + '@gar/promisify@1.1.3': + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + + '@google-cloud/firestore@7.9.0': + resolution: {integrity: sha512-c4ALHT3G08rV7Zwv8Z2KG63gZh66iKdhCBeDfCpIkLrjX6EAjTD/szMdj14M+FnQuClZLFfW5bAgoOjfNmLtJg==} + engines: {node: '>=14.0.0'} + + '@google-cloud/paginator@5.0.2': + resolution: {integrity: sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==} + engines: {node: '>=14.0.0'} + + '@google-cloud/projectify@4.0.0': + resolution: {integrity: sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==} + engines: {node: '>=14.0.0'} + + '@google-cloud/promisify@4.0.0': + resolution: {integrity: sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==} + engines: {node: '>=14'} + + '@google-cloud/scheduler@4.3.0': + resolution: {integrity: sha512-3VeVu/YVkJ0NIC0zDRucmY6o4wm7ii5TGHJLKtJUz4osm8f143uJ/FDSJz1vXMAg6GseZ/yzLvBQ5r/Sb+U2Ow==} + engines: {node: '>=14.0.0'} + + '@google-cloud/storage@7.12.1': + resolution: {integrity: sha512-Z3ZzOnF3YKLuvpkvF+TjQ6lztxcAyTILp+FjKonmVpEwPa9vFvxpZjubLR4sB6bf19i/8HL2AXRjA0YFgHFRmQ==} + engines: {node: '>=14'} + + '@grpc/grpc-js@1.11.1': + resolution: {integrity: sha512-gyt/WayZrVPH2w/UTLansS7F9Nwld472JxxaETamrM8HNlsa+jSLNyKAZmhxI2Me4c3mQHFiS1wWHDY1g1Kthw==} + engines: {node: '>=12.10.0'} + + '@grpc/grpc-js@1.9.15': + resolution: {integrity: sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ==} + engines: {node: ^8.13.0 || >=10.10.0} + + '@grpc/proto-loader@0.7.13': + resolution: {integrity: sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==} + engines: {node: '>=6'} + hasBin: true + + '@hubspot/api-client@11.1.0': + resolution: {integrity: sha512-HUkvUJKKvKhED0RZfpjnTX+b5+RNRlFfAllT7ozLP7gEoT5fp5aT148mnBdNZTr1UPfScBdDQa42ixHjgkIlNQ==} + + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@inquirer/figures@1.0.5': + resolution: {integrity: sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==} + engines: {node: '>=18'} + + '@ioredis/commands@1.2.0': + resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@isaacs/string-locale-compare@1.1.0': + resolution: {integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==} + + '@isaacs/ttlcache@1.4.1': + resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==} + engines: {node: '>=12'} + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/console@27.5.1': + resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + '@jest/console@28.1.3': + resolution: {integrity: sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + '@jest/console@29.7.0': + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/core@27.5.1': + resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/core@28.1.3': + resolution: {integrity: sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/core@29.7.0': + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/environment@27.5.1': + resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + '@jest/environment@28.1.3': + resolution: {integrity: sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + '@jest/environment@29.7.0': + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect-utils@28.1.3': + resolution: {integrity: sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + '@jest/expect-utils@29.7.0': + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect@28.1.3': + resolution: {integrity: sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + '@jest/expect@29.7.0': + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/fake-timers@27.5.1': + resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + '@jest/fake-timers@28.1.3': + resolution: {integrity: sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + '@jest/fake-timers@29.7.0': + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/globals@27.5.1': + resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + '@jest/globals@28.1.3': + resolution: {integrity: sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + '@jest/globals@29.7.0': + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/reporters@27.5.1': + resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/reporters@28.1.3': + resolution: {integrity: sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/reporters@29.7.0': + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/schemas@28.1.3': + resolution: {integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/source-map@27.5.1': + resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + '@jest/source-map@28.1.2': + resolution: {integrity: sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + '@jest/source-map@29.6.3': + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-result@27.5.1': + resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + '@jest/test-result@28.1.3': + resolution: {integrity: sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + '@jest/test-result@29.7.0': + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-sequencer@27.5.1': + resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + '@jest/test-sequencer@28.1.3': + resolution: {integrity: sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + '@jest/test-sequencer@29.7.0': + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/transform@27.5.1': + resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + '@jest/transform@28.1.3': + resolution: {integrity: sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + '@jest/transform@29.7.0': + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@27.5.1': + resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + '@jest/types@28.1.3': + resolution: {integrity: sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jitsu/sdk-js@3.1.5': + resolution: {integrity: sha512-e7P8uvGBNwWCC864MItcYSv0IT2+nwYiX8QXZ0lfyG8hutEXXX9Yt2/+MynXuGxMIoIrJ+j0bWVu20k9rrhxSg==} + deprecated: This package is for legacy Jitsu Classic version. For latest version of Jitsu please use @jitsu/js + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + + '@kurkle/color@0.3.2': + resolution: {integrity: sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==} + + '@kwsites/file-exists@1.1.1': + resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} + + '@kwsites/promise-deferred@1.1.1': + resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} + + '@leichtgewicht/ip-codec@2.0.5': + resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + + '@loadable/component@5.16.4': + resolution: {integrity: sha512-fJWxx9b5WHX90QKmizo9B+es2so8DnBthI1mbflwCoOyvzEwxiZ/SVDCTtXEnHG72/kGBdzr297SSIekYtzSOQ==} + engines: {node: '>=8'} + peerDependencies: + react: ^16.3.0 || ^17.0.0 || ^18.0.0 + + '@lukeed/csprng@1.1.0': + resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} + engines: {node: '>=8'} + + '@lukeed/uuid@2.0.1': + resolution: {integrity: sha512-qC72D4+CDdjGqJvkFMMEAtancHUQ7/d/tAiHf64z8MopFDmcrtbcJuerDtFceuAfQJ2pDSfCKCtbqoGBNnwg0w==} + engines: {node: '>=8'} + + '@mapbox/node-pre-gyp@1.0.11': + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} + hasBin: true + + '@maxmind/geoip2-node@5.0.0': + resolution: {integrity: sha512-ki+q5//oU4tZ3BAhegZJcB5czoZyic5JSTEKbrUAQB/BzAoAiGyLW0immEmQvVVyy2SMlvBTJ3zqyRj8K9BbwQ==} + + '@monaco-editor/loader@1.4.0': + resolution: {integrity: sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==} + peerDependencies: + monaco-editor: '>= 0.21.0 < 1' + + '@monaco-editor/react@4.6.0': + resolution: {integrity: sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==} + peerDependencies: + monaco-editor: '>= 0.25.0 < 1' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@mongodb-js/saslprep@1.1.8': + resolution: {integrity: sha512-qKwC/M/nNNaKUBMQ0nuzm47b7ZYWQHN3pcXq4IIcoSBc2hOIrflAxJduIvvqmhoz3gR2TacTAs8vlsCVPkiEdQ==} + + '@mongodb-js/zstd-darwin-arm64@1.2.0': + resolution: {integrity: sha512-QWgW6IkWp3ErBXOvlOj9lw3lwMfey7eXh/p/Srb/7sEiu1e0yEO+LQ8IctmDWh8bfznKXmwUC0h7LKDbYR30yw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@mongodb-js/zstd-darwin-x64@1.2.0': + resolution: {integrity: sha512-VnxYO8P2SWubdnydGId5+6veO6Ki6nxCr/pTaDZd8s4Urn6bDdXSX6YsZ0r42dO3Fa0FVYzrlcVAuNB67e2b6w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@mongodb-js/zstd-linux-arm64-gnu@1.2.0': + resolution: {integrity: sha512-TYF0XgNJW6UrvtY2u4Uuo5HiVWNgWNZ/ae2BhVp8hNsDhwFqb/YNoyiZqBei6whUwr8hecMy0UaHAXm3h+O2+Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@mongodb-js/zstd-linux-arm64-musl@1.2.0': + resolution: {integrity: sha512-e2ClmJI1BvJq23VSLH14hgjjjcMOad3R/Ap7Q7dTa1uiVSJG4xKd2CmrWQgX1Az4/EfUMWEI7pb4yuanbdd2AQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@mongodb-js/zstd-linux-x64-gnu@1.2.0': + resolution: {integrity: sha512-JuoK8lxUlkFPDBfsBUJKnLxpXA5ar+v7G43lIUlBKgjOp5aEWO/qQp5sNgCRnYA7x6PItYqIkEJjsays4N6JOA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@mongodb-js/zstd-linux-x64-musl@1.2.0': + resolution: {integrity: sha512-pSb1iUF3Gc/qrJuP/Mi5ry4YFAUdUVFKNRZh1KTDDhSWyRCLd9gKcNdRnXqJjIdeGGEKf4bhtZAbYw4i/g0foA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@mongodb-js/zstd-win32-x64-msvc@1.2.0': + resolution: {integrity: sha512-iz4Yl+WK3yr/4Yg6F4tKz3X9+yMZDK6pyBMA0CdXydSDZs6o2XQ2I0ZSu3oSk/ACfaZX3SNfRi3XTGgAM1eKZA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@mongodb-js/zstd@1.2.0': + resolution: {integrity: sha512-sKHsJU2MXsp822IFXOHw/4mpFulScNHpZzVy1Zi5k5wBsdiAPx1QramyOXZkpacla+2QPEC/s7TxPlEhG/HuNQ==} + engines: {node: '>= 10'} + + '@nangohq/frontend@0.21.17': + resolution: {integrity: sha512-utnO6JkRIQVqZBo472Yynf0nBl5Pc3QCMlC9L5LsIWApCD1pSkqZCA7cZKIJiX2p3tiB8Hzav31o0lAsnTZ1AQ==} + + '@next/env@14.2.5': + resolution: {integrity: sha512-/zZGkrTOsraVfYjGP8uM0p6r0BDT6xWpkjdVbcz66PJVSpwXX3yNiRycxAuDfBKGWBrZBXRuK/YVlkNgxHGwmA==} + + '@next/eslint-plugin-next@14.2.5': + resolution: {integrity: sha512-LY3btOpPh+OTIpviNojDpUdIbHW9j0JBYBjsIp8IxtDFfYFyORvw3yNq6N231FVqQA7n7lwaf7xHbVJlA1ED7g==} + + '@next/swc-darwin-arm64@14.2.5': + resolution: {integrity: sha512-/9zVxJ+K9lrzSGli1///ujyRfon/ZneeZ+v4ptpiPoOU+GKZnm8Wj8ELWU1Pm7GHltYRBklmXMTUqM/DqQ99FQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@14.2.5': + resolution: {integrity: sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@14.2.5': + resolution: {integrity: sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@14.2.5': + resolution: {integrity: sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-x64-gnu@14.2.5': + resolution: {integrity: sha512-8XFikMSxWleYNryWIjiCX+gU201YS+erTUidKdyOVYi5qUQo/gRxv/3N1oZFCgqpesN6FPeqGM72Zve+nReVXQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@14.2.5': + resolution: {integrity: sha512-6QLwi7RaYiQDcRDSU/os40r5o06b5ue7Jsk5JgdRBGGp8l37RZEh9JsLSM8QF0YDsgcosSeHjglgqi25+m04IQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@14.2.5': + resolution: {integrity: sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-ia32-msvc@14.2.5': + resolution: {integrity: sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@next/swc-win32-x64-msvc@14.2.5': + resolution: {integrity: sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': + resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@npmcli/arborist@4.3.1': + resolution: {integrity: sha512-yMRgZVDpwWjplorzt9SFSaakWx6QIK248Nw4ZFgkrAy/GvJaFRaSZzE6nD7JBK5r8g/+PTxFq5Wj/sfciE7x+A==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16} + hasBin: true + + '@npmcli/fs@1.1.1': + resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} + + '@npmcli/fs@2.1.2': + resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + '@npmcli/fs@3.1.1': + resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/git@2.1.0': + resolution: {integrity: sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==} + + '@npmcli/git@4.1.0': + resolution: {integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/installed-package-contents@1.0.7': + resolution: {integrity: sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==} + engines: {node: '>= 10'} + hasBin: true + + '@npmcli/installed-package-contents@2.1.0': + resolution: {integrity: sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + '@npmcli/map-workspaces@2.0.4': + resolution: {integrity: sha512-bMo0aAfwhVwqoVM5UzX1DJnlvVvzDCHae821jv48L1EsrYwfOZChlqWYXEtto/+BkBXetPbEWgau++/brh4oVg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + '@npmcli/metavuln-calculator@2.0.0': + resolution: {integrity: sha512-VVW+JhWCKRwCTE+0xvD6p3uV4WpqocNYYtzyvenqL/u1Q3Xx6fGTJ+6UoIoii07fbuEO9U3IIyuGY0CYHDv1sg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16} + + '@npmcli/move-file@1.1.2': + resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} + engines: {node: '>=10'} + deprecated: This functionality has been moved to @npmcli/fs + + '@npmcli/move-file@2.0.1': + resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This functionality has been moved to @npmcli/fs + + '@npmcli/name-from-folder@1.0.1': + resolution: {integrity: sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==} + + '@npmcli/node-gyp@1.0.3': + resolution: {integrity: sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==} + + '@npmcli/node-gyp@3.0.0': + resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/package-json@1.0.1': + resolution: {integrity: sha512-y6jnu76E9C23osz8gEMBayZmaZ69vFOIk8vR1FJL/wbEJ54+9aVG9rLTjQKSXfgYZEr50nw1txBBFfBZZe+bYg==} + + '@npmcli/promise-spawn@1.3.2': + resolution: {integrity: sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==} + + '@npmcli/promise-spawn@6.0.2': + resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/run-script@2.0.0': + resolution: {integrity: sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig==} + + '@npmcli/run-script@6.0.2': + resolution: {integrity: sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@octokit/auth-token@2.5.0': + resolution: {integrity: sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==} + + '@octokit/core@3.6.0': + resolution: {integrity: sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==} + + '@octokit/endpoint@6.0.12': + resolution: {integrity: sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==} + + '@octokit/graphql@4.8.0': + resolution: {integrity: sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==} + + '@octokit/openapi-types@12.11.0': + resolution: {integrity: sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==} + + '@octokit/plugin-paginate-rest@2.21.3': + resolution: {integrity: sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==} + peerDependencies: + '@octokit/core': '>=2' + + '@octokit/plugin-request-log@1.0.4': + resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} + peerDependencies: + '@octokit/core': '>=3' + + '@octokit/plugin-rest-endpoint-methods@5.16.2': + resolution: {integrity: sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==} + peerDependencies: + '@octokit/core': '>=3' + + '@octokit/request-error@2.1.0': + resolution: {integrity: sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==} + + '@octokit/request@5.6.3': + resolution: {integrity: sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==} + + '@octokit/rest@18.12.0': + resolution: {integrity: sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==} + + '@octokit/types@6.41.0': + resolution: {integrity: sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==} + + '@one-ini/wasm@0.1.1': + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@panva/hkdf@1.2.1': + resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@playwright/test@1.39.0': + resolution: {integrity: sha512-3u1iFqgzl7zr004bGPYiN/5EZpRUSFddQBra8Rqll5N0/vfpqlP9I9EXqAoGacuAbX6c9Ulg/Cjqglp5VkK6UQ==} + engines: {node: '>=16'} + hasBin: true + + '@pmmmwh/react-refresh-webpack-plugin@0.5.15': + resolution: {integrity: sha512-LFWllMA55pzB9D34w/wXUCf8+c+IYKuJDgxiZ3qMhl64KRMBHYM1I3VdGaD2BV5FNPV2/S2596bppxHbv2ZydQ==} + engines: {node: '>= 10.13'} + peerDependencies: + '@types/webpack': 4.x || 5.x + react-refresh: '>=0.10.0 <1.0.0' + sockjs-client: ^1.4.0 + type-fest: '>=0.17.0 <5.0.0' + webpack: '>=4.43.0 <6.0.0' + webpack-dev-server: 3.x || 4.x || 5.x + webpack-hot-middleware: 2.x + webpack-plugin-serve: 0.x || 1.x + peerDependenciesMeta: + '@types/webpack': + optional: true + sockjs-client: + optional: true + type-fest: + optional: true + webpack-dev-server: + optional: true + webpack-hot-middleware: + optional: true + webpack-plugin-serve: + optional: true + + '@prisma/client@5.17.0': + resolution: {integrity: sha512-N2tnyKayT0Zf7mHjwEyE8iG7FwTmXDHFZ1GnNhQp0pJUObsuel4ZZ1XwfuAYkq5mRIiC/Kot0kt0tGCfLJ70Jw==} + engines: {node: '>=16.13'} + peerDependencies: + prisma: '*' + peerDependenciesMeta: + prisma: + optional: true + + '@prisma/debug@3.8.1': + resolution: {integrity: sha512-ft4VPTYME1UBJ7trfrBuF2w9jX1ipDy786T9fAEskNGb+y26gPDqz5fiEWc2kgHNeVdz/qTI/V3wXILRyEcgxQ==} + + '@prisma/debug@5.17.0': + resolution: {integrity: sha512-l7+AteR3P8FXiYyo496zkuoiJ5r9jLQEdUuxIxNCN1ud8rdbH3GTxm+f+dCyaSv9l9WY+29L9czaVRXz9mULfg==} + + '@prisma/engines-version@5.17.0-31.393aa359c9ad4a4bb28630fb5613f9c281cde053': + resolution: {integrity: sha512-tUuxZZysZDcrk5oaNOdrBnnkoTtmNQPkzINFDjz7eG6vcs9AVDmA/F6K5Plsb2aQc/l5M2EnFqn3htng9FA4hg==} + + '@prisma/engines@5.17.0': + resolution: {integrity: sha512-+r+Nf+JP210Jur+/X8SIPLtz+uW9YA4QO5IXA+KcSOBe/shT47bCcRMTYCbOESw3FFYFTwe7vU6KTWHKPiwvtg==} + + '@prisma/fetch-engine@5.17.0': + resolution: {integrity: sha512-ESxiOaHuC488ilLPnrv/tM2KrPhQB5TRris/IeIV4ZvUuKeaicCl4Xj/JCQeG9IlxqOgf1cCg5h5vAzlewN91Q==} + + '@prisma/generator-helper@3.8.1': + resolution: {integrity: sha512-3zSy+XTEjmjLj6NO+/YPN1Cu7or3xA11TOoOnLRJ9G4pTT67RJXjK0L9Xy5n+3I0Xlb7xrWCgo8MvQQLMWzxPA==} + + '@prisma/get-platform@5.17.0': + resolution: {integrity: sha512-UlDgbRozCP1rfJ5Tlkf3Cnftb6srGrEQ4Nm3og+1Se2gWmCZ0hmPIi+tQikGDUVLlvOWx3Gyi9LzgRP+HTXV9w==} + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + + '@rc-component/async-validator@5.0.4': + resolution: {integrity: sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==} + engines: {node: '>=14.x'} + + '@rc-component/color-picker@1.5.3': + resolution: {integrity: sha512-+tGGH3nLmYXTalVe0L8hSZNs73VTP5ueSHwUlDC77KKRaN7G4DS4wcpG5DTDzdcV/Yas+rzA6UGgIyzd8fS4cw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/context@1.4.0': + resolution: {integrity: sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/mini-decimal@1.1.0': + resolution: {integrity: sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==} + engines: {node: '>=8.x'} + + '@rc-component/mutate-observer@1.1.0': + resolution: {integrity: sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/portal@1.1.2': + resolution: {integrity: sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/qrcode@1.0.0': + resolution: {integrity: sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/tour@1.15.0': + resolution: {integrity: sha512-h6hyILDwL+In9GAgRobwRWihLqqsD7Uft3fZGrJ7L4EiyCoxbnNYwzPXDfz7vNDhWeVyvAWQJj9fJCzpI4+b4g==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/trigger@2.2.0': + resolution: {integrity: sha512-QarBCji02YE9aRFhZgRZmOpXBj0IZutRippsVBv85sxvG4FGk/vRxwAlkn3MS9zK5mwbETd86mAVg2tKqTkdJA==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@remix-run/router@1.18.0': + resolution: {integrity: sha512-L3jkqmqoSVBVKHfpGZmLrex0lxR5SucGA0sUfFzGctehw+S/ggL9L/0NnC5mw6P8HUWpFZ3nQw3cRApjjWx9Sw==} + engines: {node: '>=14.0.0'} + + '@rjsf/antd@5.19.4': + resolution: {integrity: sha512-oWeHkNEWTzNWTNI7fxLRCbWf89aM7Xj3/SQfxVTCYniDQTR6PWQYZ9E6glDpfzbN66gV3E+blvDnxrcq3+pWIA==} + engines: {node: '>=14'} + peerDependencies: + '@ant-design/icons': ^4.0.0 || ^5.0.0 + '@rjsf/core': ^5.19.x + '@rjsf/utils': ^5.19.x + antd: ^4.24.0 || ^5.8.5 + dayjs: ^1.8.0 + react: ^16.14.0 || >=17 + + '@rjsf/core@5.10.0': + resolution: {integrity: sha512-G9KapNurCpP9l/CK4rR3/pQ1rKuaD1BxdzHjaWUWrpUbEqbDTeNu+5630ymUf0y8A04JuSN1guQRVyYl0Dlfxw==} + engines: {node: '>=14'} + peerDependencies: + '@rjsf/utils': ^5.8.x + react: ^16.14.0 || >=17 + + '@rjsf/utils@5.10.0': + resolution: {integrity: sha512-HGytUxCGtV6OCOw4PbjFcksxrPIxUt0y3T9oqCTsP4xiqnLfve4ZfY9FkbHzPSGOXVp57yCNNEZTWiK6tcV9uA==} + engines: {node: '>=14'} + peerDependencies: + react: ^16.14.0 || >=17 + + '@rjsf/validator-ajv6@5.10.0': + resolution: {integrity: sha512-XywXT7Gs8V0mx5xZ5cc95HH73B7kpWma1qozQJC7DeTHoYhbLpfOrZdsYuFYAO4xmGD+hS7zNarsHlOWPUiW2w==} + engines: {node: '>=14'} + peerDependencies: + '@rjsf/utils': ^5.8.x + + '@rollup/plugin-alias@3.1.9': + resolution: {integrity: sha512-QI5fsEvm9bDzt32k39wpOwZhVzRcL5ydcffUHMyLVaVaLeC70I8TJZ17F1z1eMoLu4E/UOcH9BWVkKpIKdrfiw==} + engines: {node: '>=8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + + '@rollup/plugin-babel@5.3.1': + resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} + engines: {node: '>= 10.0.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/babel__core': ^7.1.9 + rollup: ^1.20.0||^2.0.0 + peerDependenciesMeta: + '@types/babel__core': + optional: true + + '@rollup/plugin-commonjs@11.1.0': + resolution: {integrity: sha512-Ycr12N3ZPN96Fw2STurD21jMqzKwL9QuFhms3SD7KKRK7oaXUsBU9Zt0jL/rOPHiPYisI21/rXGO3jr9BnLHUA==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + + '@rollup/plugin-commonjs@23.0.7': + resolution: {integrity: sha512-hsSD5Qzyuat/swzrExGG5l7EuIlPhwTsT7KwKbSCQzIcJWjRxiimi/0tyMYY2bByitNb3i1p+6JWEDGa0NvT0Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.68.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-commonjs@24.0.0': + resolution: {integrity: sha512-0w0wyykzdyRRPHOb0cQt14mIBLujfAv6GgP6g8nvg/iBxEm112t3YPPq+Buqe2+imvElTka+bjNlJ/gB56TD8g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.68.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-commonjs@25.0.8': + resolution: {integrity: sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-json@4.1.0': + resolution: {integrity: sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + + '@rollup/plugin-json@5.0.2': + resolution: {integrity: sha512-D1CoOT2wPvadWLhVcmpkDnesTzjhNIQRWLsc3fA49IFOP2Y84cFOOJ+nKGYedvXHKUsPeq07HR4hXpBBr+CHlA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-json@6.1.0': + resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-multi-entry@6.0.1': + resolution: {integrity: sha512-AXm6toPyTSfbYZWghQGbom1Uh7dHXlrGa+HoiYNhQtDUE3Q7LqoUYdVQx9E1579QWS1uOiu+cZRSE4okO7ySgw==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-node-resolve@11.2.1': + resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} + engines: {node: '>= 10.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + + '@rollup/plugin-node-resolve@15.2.3': + resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-node-resolve@6.1.0': + resolution: {integrity: sha512-Cv7PDIvxdE40SWilY5WgZpqfIUEaDxFxs89zCAHjqyRwlTSuql4M5hjIuc5QYJkOH0/vyiyNXKD72O+LhRipGA==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0 + + '@rollup/plugin-replace@2.4.2': + resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + + '@rollup/plugin-replace@5.0.7': + resolution: {integrity: sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-terser@0.1.0': + resolution: {integrity: sha512-N2KK+qUfHX2hBzVzM41UWGLrEmcjVC37spC8R3c9mt3oEDFKh3N2e12/lLp9aVSt86veR0TQiCNQXrm8C6aiUQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.x || ^3.x + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-terser@0.4.4': + resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-typescript@11.1.6': + resolution: {integrity: sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.14.0||^3.0.0||^4.0.0 + tslib: '*' + typescript: '>=3.7.0' + peerDependenciesMeta: + rollup: + optional: true + tslib: + optional: true + + '@rollup/plugin-virtual@3.0.2': + resolution: {integrity: sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@3.1.0': + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + + '@rollup/pluginutils@4.2.1': + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + + '@rollup/pluginutils@5.1.0': + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.19.1': + resolution: {integrity: sha512-XzqSg714++M+FXhHfXpS1tDnNZNpgxxuGZWlRG/jSj+VEPmZ0yg6jV4E0AL3uyBKxO8mO3xtOsP5mQ+XLfrlww==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.19.1': + resolution: {integrity: sha512-thFUbkHteM20BGShD6P08aungq4irbIZKUNbG70LN8RkO7YztcGPiKTTGZS7Kw+x5h8hOXs0i4OaHwFxlpQN6A==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.19.1': + resolution: {integrity: sha512-8o6eqeFZzVLia2hKPUZk4jdE3zW7LCcZr+MD18tXkgBBid3lssGVAYuox8x6YHoEPDdDa9ixTaStcmx88lio5Q==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.19.1': + resolution: {integrity: sha512-4T42heKsnbjkn7ovYiAdDVRRWZLU9Kmhdt6HafZxFcUdpjlBlxj4wDrt1yFWLk7G4+E+8p2C9tcmSu0KA6auGA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.19.1': + resolution: {integrity: sha512-MXg1xp+e5GhZ3Vit1gGEyoC+dyQUBy2JgVQ+3hUrD9wZMkUw/ywgkpK7oZgnB6kPpGrxJ41clkPPnsknuD6M2Q==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.19.1': + resolution: {integrity: sha512-DZNLwIY4ftPSRVkJEaxYkq7u2zel7aah57HESuNkUnz+3bZHxwkCUkrfS2IWC1sxK6F2QNIR0Qr/YXw7nkF3Pw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.19.1': + resolution: {integrity: sha512-C7evongnjyxdngSDRRSQv5GvyfISizgtk9RM+z2biV5kY6S/NF/wta7K+DanmktC5DkuaJQgoKGf7KUDmA7RUw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.19.1': + resolution: {integrity: sha512-89tFWqxfxLLHkAthAcrTs9etAoBFRduNfWdl2xUs/yLV+7XDrJ5yuXMHptNqf1Zw0UCA3cAutkAiAokYCkaPtw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.19.1': + resolution: {integrity: sha512-PromGeV50sq+YfaisG8W3fd+Cl6mnOOiNv2qKKqKCpiiEke2KiKVyDqG/Mb9GWKbYMHj5a01fq/qlUR28PFhCQ==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.19.1': + resolution: {integrity: sha512-/1BmHYh+iz0cNCP0oHCuF8CSiNj0JOGf0jRlSo3L/FAyZyG2rGBuKpkZVH9YF+x58r1jgWxvm1aRg3DHrLDt6A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.19.1': + resolution: {integrity: sha512-0cYP5rGkQWRZKy9/HtsWVStLXzCF3cCBTRI+qRL8Z+wkYlqN7zrSYm6FuY5Kd5ysS5aH0q5lVgb/WbG4jqXN1Q==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.19.1': + resolution: {integrity: sha512-XUXeI9eM8rMP8aGvii/aOOiMvTs7xlCosq9xCjcqI9+5hBxtjDpD+7Abm1ZhVIFE1J2h2VIg0t2DX/gjespC2Q==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.19.1': + resolution: {integrity: sha512-V7cBw/cKXMfEVhpSvVZhC+iGifD6U1zJ4tbibjjN+Xi3blSXaj/rJynAkCFFQfoG6VZrAiP7uGVzL440Q6Me2Q==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.19.1': + resolution: {integrity: sha512-88brja2vldW/76jWATlBqHEoGjJLRnP0WOEKAUbMcXaAZnemNhlAHSyj4jIwMoP2T750LE9lblvD4e2jXleZsA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.19.1': + resolution: {integrity: sha512-LdxxcqRVSXi6k6JUrTah1rHuaupoeuiv38du8Mt4r4IPer3kwlTo+RuvfE8KzZ/tL6BhaPlzJ3835i6CxrFIRQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.19.1': + resolution: {integrity: sha512-2bIrL28PcK3YCqD9anGxDxamxdiJAxA+l7fWIwM5o8UqNy1t3d1NdAweO2XhA0KTDJ5aH1FsuiT5+7VhtHliXg==} + cpu: [x64] + os: [win32] + + '@rushstack/eslint-patch@1.10.4': + resolution: {integrity: sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==} + + '@segment/analytics-core@1.6.0': + resolution: {integrity: sha512-bn9X++IScUfpT7aJGjKU/yJAu/Ko2sYD6HsKA70Z2560E89x30pqgqboVKY8kootvQnT4UKCJiUr5NDMgjmWdQ==} + + '@segment/analytics-generic-utils@1.2.0': + resolution: {integrity: sha512-DfnW6mW3YQOLlDQQdR89k4EqfHb0g/3XvBXkovH1FstUN93eL1kfW9CsDcVQyH3bAC5ZsFyjA/o/1Q2j0QeoWw==} + + '@segment/analytics-next@1.72.1': + resolution: {integrity: sha512-OeCe/jMAWxC5a1fY8RRszIzG7zevmkRHEaUQZMXskPFPWu2fB9r8A/JeZtoX9+kKlNg2SMMAdsnIRxsvaHIkMA==} + + '@segment/analytics.js-video-plugins@0.2.1': + resolution: {integrity: sha512-lZwCyEXT4aaHBLNK433okEKdxGAuyrVmop4BpQqQSJuRz0DglPZgd9B/XjiiWs1UyOankg2aNYMN3VcS8t4eSQ==} + + '@segment/facade@3.4.10': + resolution: {integrity: sha512-xVQBbB/lNvk/u8+ey0kC/+g8pT3l0gCT8O2y9Z+StMMn3KAFAQ9w8xfgef67tJybktOKKU7pQGRPolRM1i1pdA==} + + '@segment/isodate-traverse@1.1.1': + resolution: {integrity: sha512-+G6e1SgAUkcq0EDMi+SRLfT48TNlLPF3QnSgFGVs0V9F3o3fq/woQ2rHFlW20W0yy5NnCUH0QGU3Am2rZy/E3w==} + + '@segment/isodate@1.0.3': + resolution: {integrity: sha512-BtanDuvJqnACFkeeYje7pWULVv8RgZaqKHWwGFnL/g/TH/CcZjkIVTfGDp/MAxmilYHUkrX70SqwnYSTNEaN7A==} + + '@sensejs/kafkajs-zstd-support@0.11.0': + resolution: {integrity: sha512-qWTaL7wUOUv/HLW8zBmfReVWFn1qOUvubqdhbjMzf1mD6at0dkOFF5g+QSi8Nb3RXWJeNb0KhgIwbOm/S+wPaQ==} + peerDependencies: + kafkajs: ^2.0.2 + + '@sentry-internal/feedback@7.118.0': + resolution: {integrity: sha512-IYOGRcqIqKJJpMwBBv+0JTu0FPpXnakJYvOx/XEa/SNyF5+l7b9gGEjUVWh1ok50kTLW/XPnpnXNAGQcoKHg+w==} + engines: {node: '>=12'} + + '@sentry-internal/replay-canvas@7.118.0': + resolution: {integrity: sha512-XxHlCClvrxmVKpiZetFYyiBaPQNiojoBGFFVgbbWBIAPc+fWeLJ2BMoQEBjn/0NA/8u8T6lErK5YQo/eIx9+XQ==} + engines: {node: '>=12'} + + '@sentry-internal/tracing@7.118.0': + resolution: {integrity: sha512-dERAshKlQLrBscHSarhHyUeGsu652bDTUN1FK0m4e3X48M3I5/s+0N880Qjpe5MprNLcINlaIgdQ9jkisvxjfw==} + engines: {node: '>=8'} + + '@sentry/browser@7.118.0': + resolution: {integrity: sha512-8onDOFV1VLEoBuqA5yaJeR3FF1JNuxr5C7p1oN3OwY724iTVqQnOLmZKZaSnHV3RkY67wKDGQkQIie14sc+42g==} + engines: {node: '>=8'} + + '@sentry/cli@1.77.3': + resolution: {integrity: sha512-c3eDqcDRmy4TFz2bFU5Y6QatlpoBPPa8cxBooaS4aMQpnIdLYPF1xhyyiW0LQlDUNc3rRjNF7oN5qKoaRoMTQQ==} + engines: {node: '>= 8'} + hasBin: true + + '@sentry/core@7.118.0': + resolution: {integrity: sha512-ol0xBdp3/K11IMAYSQE0FMxBOOH9hMsb/rjxXWe0hfM5c72CqYWL3ol7voPci0GELJ5CZG+9ImEU1V9r6gK64g==} + engines: {node: '>=8'} + + '@sentry/integrations@7.118.0': + resolution: {integrity: sha512-C2rR4NvIMjokF8jP5qzSf1o2zxDx7IeYnr8u15Kb2+HdZtX559owALR0hfgwnfeElqMhGlJBaKUWZ48lXJMzCQ==} + engines: {node: '>=8'} + + '@sentry/nextjs@7.118.0': + resolution: {integrity: sha512-UFhg4QSZ6LqOKTU67kgjojy23ZqoIgB1fjwOS6S10d5LKdbz7POwrNwHqi+aB3YIqyrSvRtFCXA+8mmsE0QoqA==} + engines: {node: '>=8'} + peerDependencies: + next: ^10.0.8 || ^11.0 || ^12.0 || ^13.0 || ^14.0 + react: 16.x || 17.x || 18.x + webpack: '>= 4.0.0' + peerDependenciesMeta: + webpack: + optional: true + + '@sentry/node@7.118.0': + resolution: {integrity: sha512-79N63DvYKkNPqzmc0cjO+vMZ/nU7+CbE3K3COQNiV7gk58+666G9mRZQJuZVOVebatq5wM5UR0G4LPkwD+J84g==} + engines: {node: '>=8'} + + '@sentry/react@7.118.0': + resolution: {integrity: sha512-oEYe5TGk8S7YzPsFqDf4xDHjfzs35/QFE+dou3S2d24OYpso8Tq4C5f1VzYmnOOyy85T7JNicYLSo0n0NSJvQg==} + engines: {node: '>=8'} + peerDependencies: + react: 15.x || 16.x || 17.x || 18.x + + '@sentry/replay@7.118.0': + resolution: {integrity: sha512-boQfCL+1L/tSZ9Huwi00+VtU+Ih1Lcg8HtxBuAsBCJR9pQgUL5jp7ECYdTeeHyCh/RJO7JqV1CEoGTgohe10mA==} + engines: {node: '>=12'} + + '@sentry/types@7.118.0': + resolution: {integrity: sha512-2drqrD2+6kgeg+W/ycmiti3G4lJrV3hGjY9PpJ3bJeXrh6T2+LxKPzlgSEnKFaeQWkXdZ4eaUbtTXVebMjb5JA==} + engines: {node: '>=8'} + + '@sentry/utils@7.118.0': + resolution: {integrity: sha512-43qItc/ydxZV1Zb3Kn2M54RwL9XXFa3IAYBO8S82Qvq5YUYmU2AmJ1jgg7DabXlVSWgMA1HntwqnOV3JLaEnTQ==} + engines: {node: '>=8'} + + '@sentry/vercel-edge@7.118.0': + resolution: {integrity: sha512-DclIpD0/Xi0kNeT97aFFtMLBzk3GFZXf9mpGgbx29Gt9Vt7Fyq8ZA9izALHYzXx056fqQaLtvOAkQxWsy9QuSA==} + engines: {node: '>=8'} + + '@sentry/webpack-plugin@1.21.0': + resolution: {integrity: sha512-x0PYIMWcsTauqxgl7vWUY6sANl+XGKtx7DCVnnY7aOIIlIna0jChTAPANTfA2QrK+VK+4I/4JxatCEZBnXh3Og==} + engines: {node: '>= 8'} + + '@sigstore/bundle@1.1.0': + resolution: {integrity: sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@sigstore/protobuf-specs@0.2.1': + resolution: {integrity: sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@sigstore/sign@1.0.0': + resolution: {integrity: sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@sigstore/tuf@1.0.3': + resolution: {integrity: sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@sinclair/typebox@0.24.51': + resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} + + '@sinclair/typebox@0.25.24': + resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + + '@sinonjs/commons@1.8.6': + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + + '@sinonjs/fake-timers@8.1.0': + resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} + + '@sinonjs/fake-timers@9.1.2': + resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==} + + '@smithy/abort-controller@3.1.1': + resolution: {integrity: sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==} + engines: {node: '>=16.0.0'} + + '@smithy/chunked-blob-reader-native@3.0.0': + resolution: {integrity: sha512-VDkpCYW+peSuM4zJip5WDfqvg2Mo/e8yxOv3VF1m11y7B8KKMKVFtmZWDe36Fvk8rGuWrPZHHXZ7rR7uM5yWyg==} + + '@smithy/chunked-blob-reader@3.0.0': + resolution: {integrity: sha512-sbnURCwjF0gSToGlsBiAmd1lRCmSn72nu9axfJu5lIx6RUEgHu6GwTMbqCdhQSi0Pumcm5vFxsi9XWXb2mTaoA==} + + '@smithy/config-resolver@3.0.5': + resolution: {integrity: sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==} + engines: {node: '>=16.0.0'} + + '@smithy/core@2.3.1': + resolution: {integrity: sha512-BC7VMXx/1BCmRPCVzzn4HGWAtsrb7/0758EtwOGFJQrlSwJBEjCcDLNZLFoL/68JexYa2s+KmgL/UfmXdG6v1w==} + engines: {node: '>=16.0.0'} + + '@smithy/credential-provider-imds@3.2.0': + resolution: {integrity: sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA==} + engines: {node: '>=16.0.0'} + + '@smithy/eventstream-codec@3.1.2': + resolution: {integrity: sha512-0mBcu49JWt4MXhrhRAlxASNy0IjDRFU+aWNDRal9OtUJvJNiwDuyKMUONSOjLjSCeGwZaE0wOErdqULer8r7yw==} + + '@smithy/eventstream-serde-browser@3.0.5': + resolution: {integrity: sha512-dEyiUYL/ekDfk+2Ra4GxV+xNnFoCmk1nuIXg+fMChFTrM2uI/1r9AdiTYzPqgb72yIv/NtAj6C3dG//1wwgakQ==} + engines: {node: '>=16.0.0'} + + '@smithy/eventstream-serde-config-resolver@3.0.3': + resolution: {integrity: sha512-NVTYjOuYpGfrN/VbRQgn31x73KDLfCXCsFdad8DiIc3IcdxL+dYA9zEQPyOP7Fy2QL8CPy2WE4WCUD+ZsLNfaQ==} + engines: {node: '>=16.0.0'} + + '@smithy/eventstream-serde-node@3.0.4': + resolution: {integrity: sha512-mjlG0OzGAYuUpdUpflfb9zyLrBGgmQmrobNT8b42ZTsGv/J03+t24uhhtVEKG/b2jFtPIHF74Bq+VUtbzEKOKg==} + engines: {node: '>=16.0.0'} + + '@smithy/eventstream-serde-universal@3.0.4': + resolution: {integrity: sha512-Od9dv8zh3PgOD7Vj4T3HSuox16n0VG8jJIM2gvKASL6aCtcS8CfHZDWe1Ik3ZXW6xBouU+45Q5wgoliWDZiJ0A==} + engines: {node: '>=16.0.0'} + + '@smithy/fetch-http-handler@3.2.4': + resolution: {integrity: sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==} + + '@smithy/hash-blob-browser@3.1.2': + resolution: {integrity: sha512-hAbfqN2UbISltakCC2TP0kx4LqXBttEv2MqSPE98gVuDFMf05lU+TpC41QtqGP3Ff5A3GwZMPfKnEy0VmEUpmg==} + + '@smithy/hash-node@3.0.3': + resolution: {integrity: sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==} + engines: {node: '>=16.0.0'} + + '@smithy/hash-stream-node@3.1.2': + resolution: {integrity: sha512-PBgDMeEdDzi6JxKwbfBtwQG9eT9cVwsf0dZzLXoJF4sHKHs5HEo/3lJWpn6jibfJwT34I1EBXpBnZE8AxAft6g==} + engines: {node: '>=16.0.0'} + + '@smithy/invalid-dependency@3.0.3': + resolution: {integrity: sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==} + + '@smithy/is-array-buffer@2.2.0': + resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} + engines: {node: '>=14.0.0'} + + '@smithy/is-array-buffer@3.0.0': + resolution: {integrity: sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==} + engines: {node: '>=16.0.0'} + + '@smithy/md5-js@3.0.3': + resolution: {integrity: sha512-O/SAkGVwpWmelpj/8yDtsaVe6sINHLB1q8YE/+ZQbDxIw3SRLbTZuRaI10K12sVoENdnHqzPp5i3/H+BcZ3m3Q==} + + '@smithy/middleware-content-length@3.0.5': + resolution: {integrity: sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-endpoint@3.1.0': + resolution: {integrity: sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-retry@3.0.13': + resolution: {integrity: sha512-zvCLfaRYCaUmjbF2yxShGZdolSHft7NNCTA28HVN9hKcEbOH+g5irr1X9s+in8EpambclGnevZY4A3lYpvDCFw==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-serde@3.0.3': + resolution: {integrity: sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-stack@3.0.3': + resolution: {integrity: sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==} + engines: {node: '>=16.0.0'} + + '@smithy/node-config-provider@3.1.4': + resolution: {integrity: sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==} + engines: {node: '>=16.0.0'} + + '@smithy/node-http-handler@3.1.4': + resolution: {integrity: sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==} + engines: {node: '>=16.0.0'} + + '@smithy/property-provider@3.1.3': + resolution: {integrity: sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==} + engines: {node: '>=16.0.0'} + + '@smithy/protocol-http@4.1.0': + resolution: {integrity: sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==} + engines: {node: '>=16.0.0'} + + '@smithy/querystring-builder@3.0.3': + resolution: {integrity: sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==} + engines: {node: '>=16.0.0'} + + '@smithy/querystring-parser@3.0.3': + resolution: {integrity: sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==} + engines: {node: '>=16.0.0'} + + '@smithy/service-error-classification@3.0.3': + resolution: {integrity: sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==} + engines: {node: '>=16.0.0'} + + '@smithy/shared-ini-file-loader@3.1.4': + resolution: {integrity: sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==} + engines: {node: '>=16.0.0'} + + '@smithy/signature-v4@4.1.0': + resolution: {integrity: sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag==} + engines: {node: '>=16.0.0'} + + '@smithy/smithy-client@3.1.11': + resolution: {integrity: sha512-l0BpyYkciNyMaS+PnFFz4aO5sBcXvGLoJd7mX9xrMBIm2nIQBVvYgp2ZpPDMzwjKCavsXu06iuCm0F6ZJZc6yQ==} + engines: {node: '>=16.0.0'} + + '@smithy/types@3.3.0': + resolution: {integrity: sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==} + engines: {node: '>=16.0.0'} + + '@smithy/url-parser@3.0.3': + resolution: {integrity: sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==} + + '@smithy/util-base64@3.0.0': + resolution: {integrity: sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-body-length-browser@3.0.0': + resolution: {integrity: sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==} + + '@smithy/util-body-length-node@3.0.0': + resolution: {integrity: sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==} + engines: {node: '>=16.0.0'} + + '@smithy/util-buffer-from@2.2.0': + resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} + engines: {node: '>=14.0.0'} + + '@smithy/util-buffer-from@3.0.0': + resolution: {integrity: sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==} + engines: {node: '>=16.0.0'} + + '@smithy/util-config-provider@3.0.0': + resolution: {integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-defaults-mode-browser@3.0.13': + resolution: {integrity: sha512-ZIRSUsnnMRStOP6OKtW+gCSiVFkwnfQF2xtf32QKAbHR6ACjhbAybDvry+3L5qQYdh3H6+7yD/AiUE45n8mTTw==} + engines: {node: '>= 10.0.0'} + + '@smithy/util-defaults-mode-node@3.0.13': + resolution: {integrity: sha512-voUa8TFJGfD+U12tlNNLCDlXibt9vRdNzRX45Onk/WxZe7TS+hTOZouEZRa7oARGicdgeXvt1A0W45qLGYdy+g==} + engines: {node: '>= 10.0.0'} + + '@smithy/util-endpoints@2.0.5': + resolution: {integrity: sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==} + engines: {node: '>=16.0.0'} + + '@smithy/util-hex-encoding@3.0.0': + resolution: {integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-middleware@3.0.3': + resolution: {integrity: sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==} + engines: {node: '>=16.0.0'} + + '@smithy/util-retry@3.0.3': + resolution: {integrity: sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==} + engines: {node: '>=16.0.0'} + + '@smithy/util-stream@3.1.3': + resolution: {integrity: sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==} + engines: {node: '>=16.0.0'} + + '@smithy/util-uri-escape@3.0.0': + resolution: {integrity: sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==} + engines: {node: '>=16.0.0'} + + '@smithy/util-utf8@2.3.0': + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} + engines: {node: '>=14.0.0'} + + '@smithy/util-utf8@3.0.0': + resolution: {integrity: sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==} + engines: {node: '>=16.0.0'} + + '@smithy/util-waiter@3.1.2': + resolution: {integrity: sha512-4pP0EV3iTsexDx+8PPGAKCQpd/6hsQBaQhqWzU4hqKPHN5epPsxKbvUTIiYIHTxaKt6/kEaqPBpu/ufvfbrRzw==} + engines: {node: '>=16.0.0'} + + '@surma/rollup-plugin-off-main-thread@2.2.3': + resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + + '@svgr/babel-plugin-add-jsx-attribute@5.4.0': + resolution: {integrity: sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==} + engines: {node: '>=10'} + + '@svgr/babel-plugin-remove-jsx-attribute@5.4.0': + resolution: {integrity: sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==} + engines: {node: '>=10'} + + '@svgr/babel-plugin-remove-jsx-empty-expression@5.0.1': + resolution: {integrity: sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==} + engines: {node: '>=10'} + + '@svgr/babel-plugin-replace-jsx-attribute-value@5.0.1': + resolution: {integrity: sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==} + engines: {node: '>=10'} + + '@svgr/babel-plugin-svg-dynamic-title@5.4.0': + resolution: {integrity: sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==} + engines: {node: '>=10'} + + '@svgr/babel-plugin-svg-em-dimensions@5.4.0': + resolution: {integrity: sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==} + engines: {node: '>=10'} + + '@svgr/babel-plugin-transform-react-native-svg@5.4.0': + resolution: {integrity: sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==} + engines: {node: '>=10'} + + '@svgr/babel-plugin-transform-svg-component@5.5.0': + resolution: {integrity: sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==} + engines: {node: '>=10'} + + '@svgr/babel-preset@5.5.0': + resolution: {integrity: sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==} + engines: {node: '>=10'} + + '@svgr/core@5.5.0': + resolution: {integrity: sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==} + engines: {node: '>=10'} + + '@svgr/hast-util-to-babel-ast@5.5.0': + resolution: {integrity: sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==} + engines: {node: '>=10'} + + '@svgr/plugin-jsx@5.5.0': + resolution: {integrity: sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==} + engines: {node: '>=10'} + + '@svgr/plugin-svgo@5.5.0': + resolution: {integrity: sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==} + engines: {node: '>=10'} + + '@svgr/rollup@5.5.0': + resolution: {integrity: sha512-EiZmH2VTr+Xzyb6Ga8XtGa9MEbiU3WQnB5vHmqhwAUqibU3uwuwr7MN+QwIh/gtBk1ucMim8BCfcRTlLVREM8A==} + engines: {node: '>=10'} + + '@svgr/webpack@5.5.0': + resolution: {integrity: sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==} + engines: {node: '>=10'} + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/helpers@0.5.5': + resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} + + '@tailwindcss/typography@0.5.13': + resolution: {integrity: sha512-ADGcJ8dX21dVVHIwTRgzrcunY6YY9uSlAHHGVKvkA+vLc5qLwEszvKts40lx7z0qc4clpjclwLeK5rVCV2P/uw==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + + '@tanstack/query-core@4.36.1': + resolution: {integrity: sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA==} + + '@tanstack/react-query@4.36.1': + resolution: {integrity: sha512-y7ySVHFyyQblPl3J3eQBWpXZkliroki3ARnBKsdJchlgt7yJLRDUcf4B8soufgiYt3pEQIkBWBx1N9/ZPIeUWw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + '@testing-library/dom@10.4.0': + resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} + engines: {node: '>=18'} + + '@testing-library/dom@8.20.1': + resolution: {integrity: sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==} + engines: {node: '>=12'} + + '@testing-library/jest-dom@6.4.8': + resolution: {integrity: sha512-JD0G+Zc38f5MBHA4NgxQMR5XtO5Jx9g86jqturNTt2WUfRmLDIY7iKkWHDCCTiDuFMre6nxAD5wHw9W5kI4rGw==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + + '@testing-library/react@13.4.0': + resolution: {integrity: sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==} + engines: {node: '>=12'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + + '@testing-library/user-event@14.5.2': + resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' + + '@tootallnate/once@1.1.2': + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + + '@tootallnate/once@2.0.0': + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + + '@trysound/sax@0.2.0': + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + + '@ts-morph/common@0.11.1': + resolution: {integrity: sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g==} + + '@ts-morph/common@0.12.3': + resolution: {integrity: sha512-4tUmeLyXJnJWvTFOKtcNJ1yh0a3SsTLi2MUoyj8iUNznFRN1ZquaNe7Oukqrnki2FzZkm0J9adCNLDZxUzvj+w==} + + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@tufjs/canonical-json@1.0.0': + resolution: {integrity: sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@tufjs/models@1.0.4': + resolution: {integrity: sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@types/archiver@5.3.4': + resolution: {integrity: sha512-Lj7fLBIMwYFgViVVZHEdExZC3lVYsl+QL0VmdNdIzGZH544jHveYWij6qdnBgJQDnR7pMKliN9z2cPZFEbhyPw==} + + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/bonjour@3.5.13': + resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + + '@types/caseless@0.12.5': + resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} + + '@types/chalk@2.2.0': + resolution: {integrity: sha512-1zzPV9FDe1I/WHhRkf9SNgqtRJWZqrBWgu7JGveuHmmyR9CnAPCie2N/x+iHrgnpYBIcCJWHBoMRv2TRWktsvw==} + deprecated: This is a stub types definition for chalk (https://github.com/chalk/chalk). chalk provides its own type definitions, so you don't need @types/chalk installed! + + '@types/cli-progress@3.11.6': + resolution: {integrity: sha512-cE3+jb9WRlu+uOSAugewNpITJDt1VF8dHOopPO4IABFc3SXYL5WE/+PTz/FCdZRRfIujiWW3n3aMbv1eIGVRWA==} + + '@types/commander@2.12.2': + resolution: {integrity: sha512-0QEFiR8ljcHp9bAbWxecjVRuAMr16ivPiGOw6KFQBVrVd0RQIcM3xKdRisH2EDWgVWujiYtHwhSkSUoAAGzH7Q==} + deprecated: This is a stub types definition for commander (https://github.com/tj/commander.js). commander provides its own type definitions, so you don't need @types/commander installed! + + '@types/connect-history-api-fallback@1.5.4': + resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/cookie@0.5.4': + resolution: {integrity: sha512-7z/eR6O859gyWIAjuvBWFzNURmf2oPBmJlfVWkwehU5nzIyjwBsTh7WMmEEV4JFnHuQ3ex4oyTvfKzcyJVDBNA==} + + '@types/cross-spawn@6.0.2': + resolution: {integrity: sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==} + + '@types/crypto-js@4.2.2': + resolution: {integrity: sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==} + + '@types/d3-array@3.2.1': + resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.1.0': + resolution: {integrity: sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==} + + '@types/d3-scale@4.0.8': + resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} + + '@types/d3-shape@3.1.6': + resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==} + + '@types/d3-time@3.0.3': + resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + + '@types/debug@4.1.7': + resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} + + '@types/dlv@1.1.4': + resolution: {integrity: sha512-m8KmImw4Jt+4rIgupwfivrWEOnj1LzkmKkqbh075uG13eTQ1ZxHWT6T0vIdSQhLIjQCiR0n0lZdtyDOPO1x2Mw==} + + '@types/docker-modem@3.0.6': + resolution: {integrity: sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==} + + '@types/dockerode@3.3.31': + resolution: {integrity: sha512-42R9eoVqJDSvVspV89g7RwRqfNExgievLNWoHkg7NoWIqAmavIbgQBb4oc0qRtHkxE+I3Xxvqv7qVXFABKPBTg==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@8.56.11': + resolution: {integrity: sha512-sVBpJMf7UPo/wGecYOpk2aQya2VUGeHhe38WG7/mN5FufNSubf5VT9Uh9Uyp8/eLJpu1/tuhJ/qTo4mhSB4V4Q==} + + '@types/eslint@9.6.0': + resolution: {integrity: sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==} + + '@types/estree@0.0.39': + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/expect@1.20.4': + resolution: {integrity: sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==} + + '@types/express-serve-static-core@4.19.5': + resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==} + + '@types/express@4.17.21': + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + + '@types/firebase@3.2.1': + resolution: {integrity: sha512-G8XgHMu2jHlElfc2xVNaYP50F0qrqeTCjgeG1v5b4SRwWG4XKC4fCuEdVZuZaMRmVygcnbRZBAo9O7RsDvmkGQ==} + deprecated: This is a stub types definition for Firebase API (https://www.firebase.com/docs/javascript/firebase). Firebase API provides its own type definitions, so you don't need @types/firebase installed! + + '@types/glob@7.2.0': + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + + '@types/html-minifier-terser@6.1.0': + resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + '@types/http-proxy@1.17.14': + resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==} + + '@types/inquirer@9.0.7': + resolution: {integrity: sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/jest@29.5.12': + resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} + + '@types/js-cookie@2.2.7': + resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} + + '@types/js-yaml@4.0.9': + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/jsonwebtoken@9.0.6': + resolution: {integrity: sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==} + + '@types/lodash@4.17.7': + resolution: {integrity: sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==} + + '@types/long@4.0.2': + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/minimatch@3.0.5': + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + + '@types/minimatch@5.1.2': + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + '@types/node-fetch@2.6.11': + resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} + + '@types/node-forge@1.3.11': + resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} + + '@types/node@15.14.9': + resolution: {integrity: sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==} + + '@types/node@16.18.11': + resolution: {integrity: sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==} + + '@types/node@18.19.42': + resolution: {integrity: sha512-d2ZFc/3lnK2YCYhos8iaNIYu9Vfhr92nHiyJHRltXWjXUBjEE+A4I58Tdbnw4VhggSW+2j5y5gTrLs4biNnubg==} + + '@types/node@20.14.14': + resolution: {integrity: sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==} + + '@types/nodemailer@6.4.15': + resolution: {integrity: sha512-0EBJxawVNjPkng1zm2vopRctuWVCxk34JcIlRuXSf54habUWdz1FB7wHDqOqvDa8Mtpt0Q3LTXQkAs2LNyK5jQ==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/pg-cursor@2.7.2': + resolution: {integrity: sha512-m3xT8bVFCvx98LuzbvXyuCdT/Hjdd/v8ml4jL4K1QF70Y8clOfCFdgoaEB1FWdcSwcpoFYZTJQaMD9/GQ27efQ==} + + '@types/pg-promise@5.4.3': + resolution: {integrity: sha512-ABgy5hzmcyRZxLNG6HUafpxbpmXGeVJ5dopKwssEsFeA7rpRakdoodt75HJNIjQB4He+s3PTfG1AoWQWm7OuCg==} + deprecated: This is a stub types definition for pg-promise (https://github.com/vitaly-t/pg-promise). pg-promise provides its own type definitions, so you don't need @types/pg-promise installed! + + '@types/pg-query-stream@3.4.0': + resolution: {integrity: sha512-oqGAu+5CMPAVNqemN9xYT3LBDy2qXBke15cstEuVYIvJL6lcKSNKeG61fONlVrxTYIFi9sPuGVtIweanrEZcJw==} + deprecated: This is a stub types definition. pg-query-stream provides its own type definitions, so you do not need this installed. + + '@types/pg@8.11.6': + resolution: {integrity: sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==} + + '@types/prettier@2.7.3': + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + + '@types/prop-types@15.7.12': + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + + '@types/q@1.5.8': + resolution: {integrity: sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==} + + '@types/qs@6.9.15': + resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/react-dom@18.3.0': + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + + '@types/react@18.3.3': + resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} + + '@types/readdir-glob@1.1.5': + resolution: {integrity: sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg==} + + '@types/request@2.48.12': + resolution: {integrity: sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==} + + '@types/resolve@0.0.8': + resolution: {integrity: sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==} + + '@types/resolve@1.17.1': + resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} + + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + + '@types/retry@0.12.0': + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-index@1.9.4': + resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} + + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + + '@types/sockjs@0.3.36': + resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} + + '@types/ssh2-streams@0.1.12': + resolution: {integrity: sha512-Sy8tpEmCce4Tq0oSOYdfqaBpA3hDM8SoxoFh5vzFsu2oL+znzGz8oVWW7xb4K920yYMUY+PIG31qZnFMfPWNCg==} + + '@types/ssh2@0.5.52': + resolution: {integrity: sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==} + + '@types/ssh2@1.15.0': + resolution: {integrity: sha512-YcT8jP5F8NzWeevWvcyrrLB3zcneVjzYY9ZDSMAMboI+2zR1qYWFhwsyOFVzT7Jorn67vqxC0FRiw8YyG9P1ww==} + + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + '@types/strip-bom@3.0.0': + resolution: {integrity: sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==} + + '@types/strip-json-comments@0.0.30': + resolution: {integrity: sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==} + + '@types/stripe@8.0.417': + resolution: {integrity: sha512-PTuqskh9YKNENnOHGVJBm4sM0zE8B1jZw1JIskuGAPkMB+OH236QeN8scclhYGPA4nG6zTtPXgwpXdp+HPDTVw==} + deprecated: This is a stub types definition. stripe provides its own type definitions, so you do not need this installed. + + '@types/through@0.0.33': + resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} + + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/vinyl@2.0.12': + resolution: {integrity: sha512-Sr2fYMBUVGYq8kj3UthXFAu5UN6ZW+rYr4NACjZQJvHvj+c8lYv0CahmZ2P/r7iUkN44gGUBwqxZkrKXYPb7cw==} + + '@types/web@0.0.152': + resolution: {integrity: sha512-Iu1OJ3ahq6/mwSK6jRKj2revI+avfPRWZOADcKeuv1AGCtkwbDl12AkWAl4KjiW2l4s2rkST7WagdhWOVGx9qg==} + + '@types/webidl-conversions@7.0.3': + resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} + + '@types/webpack@5.28.5': + resolution: {integrity: sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==} + + '@types/whatwg-url@11.0.5': + resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} + + '@types/ws@8.5.12': + resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@16.0.9': + resolution: {integrity: sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==} + + '@types/yargs@17.0.32': + resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + + '@typescript-eslint/eslint-plugin@5.62.0': + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/eslint-plugin@7.18.0': + resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/experimental-utils@5.62.0': + resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@typescript-eslint/parser@5.62.0': + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@7.18.0': + resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@7.2.0': + resolution: {integrity: sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/scope-manager@7.18.0': + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/scope-manager@7.2.0': + resolution: {integrity: sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/type-utils@5.62.0': + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/type-utils@7.18.0': + resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/types@7.18.0': + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/types@7.2.0': + resolution: {integrity: sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/typescript-estree@5.62.0': + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@7.18.0': + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@7.2.0': + resolution: {integrity: sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@5.62.0': + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@typescript-eslint/utils@7.18.0': + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/visitor-keys@5.62.0': + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/visitor-keys@7.18.0': + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/visitor-keys@7.2.0': + resolution: {integrity: sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@vercel/build-utils@8.3.6': + resolution: {integrity: sha512-EPwr8tXu41aoXg9QBiF98clu5AHbKtwbp3SeX/W6c8L0fhLwiT+H/s3WDuOL/UMz0TT3B8JAdY4PZioWNEAf6g==} + + '@vercel/error-utils@2.0.2': + resolution: {integrity: sha512-Sj0LFafGpYr6pfCqrQ82X6ukRl5qpmVrHM/191kNYFqkkB9YkjlMAj6QcEsvCG259x4QZ7Tya++0AB85NDPbKQ==} + + '@vercel/fun@1.1.0': + resolution: {integrity: sha512-SpuPAo+MlAYMtcMcC0plx7Tv4Mp7SQhJJj1iIENlOnABL24kxHpL09XLQMGzZIzIW7upR8c3edwgfpRtp+dhVw==} + engines: {node: '>= 10'} + + '@vercel/gatsby-plugin-vercel-analytics@1.0.11': + resolution: {integrity: sha512-iTEA0vY6RBPuEzkwUTVzSHDATo1aF6bdLLspI68mQ/BTbi5UQEGjpjyzdKOVcSYApDtFU6M6vypZ1t4vIEnHvw==} + + '@vercel/gatsby-plugin-vercel-builder@2.0.40': + resolution: {integrity: sha512-j3pZch8Qk2jfM87+dXX+xZXtdD+T2cMOmHhQWzO4oX3issxfBkkk2mAmY4o3Cxry5Xxe5iDQo6VsvY2IrWpCuA==} + + '@vercel/go@3.1.1': + resolution: {integrity: sha512-mrzomNYltxkjvtUmaYry5YEyvwTz6c/QQHE5Gr/pPGRIniUiP6T6OFOJ49RBN7e6pRXaNzHPVuidiuBhvHh5+Q==} + + '@vercel/hydrogen@1.0.4': + resolution: {integrity: sha512-Sc0lpmI/J6O3o2cL75k8klL7ir2gi6kYI92O5+MrR3hh4fwz/atUIL9UWsTGuFjKTm69VAoJrmn3VKf0/0SGLw==} + + '@vercel/next@4.3.6': + resolution: {integrity: sha512-qUHp79xX07qYtz7DGSogyWgEMrf+eu/IGV/92YnVA1xzDBogIFc8XFvMlN8QwDrsWWsR+I2eMSiGD+P8znlsaA==} + + '@vercel/nft@0.27.3': + resolution: {integrity: sha512-oySTdDSzUAFDXpsSLk9Q943o+/Yu/+TCFxnehpFQEf/3khi2stMpTHPVNwFdvZq/Z4Ky93lE+MGHpXCRpMkSCA==} + engines: {node: '>=16'} + hasBin: true + + '@vercel/node@3.2.8': + resolution: {integrity: sha512-mINg3ab1FHIqupZlLVpmCvyqGtkafnyNesgs7ZoCbNxqbb4ZrHtPj1kHv9cvTrFlDkFapkV/Ez8nbSsHeAxtOw==} + + '@vercel/python@4.3.1': + resolution: {integrity: sha512-pWRApBwUsAQJS8oZ7eKMiaBGbYJO71qw2CZqDFvkTj34FNBZtNIUcWSmqGfJJY5m2pU/9wt8z1CnKIyT9dstog==} + + '@vercel/redwood@2.1.3': + resolution: {integrity: sha512-lpsdQSHS2hvSX29/rJNm4q38dVXKstS4MVg875KE6zyXpACwviXuet0Cadyv0E60w7f2B6Ra+nJMpwKz6oJ5xg==} + + '@vercel/remix-builder@2.2.3': + resolution: {integrity: sha512-rXb0cgCIe8xCSl6gw+j5cjMEcmgQc5nbnpyMuaQ8+lRBSN0eEl8RkufkVQ4FblGQbnPnPFBCmraUx58HxKxfZw==} + + '@vercel/routing-utils@3.1.0': + resolution: {integrity: sha512-Ci5xTjVTJY/JLZXpCXpLehMft97i9fH34nu9PGav6DtwkVUF6TOPX86U0W0niQjMZ5n6/ZP0BwcJK2LOozKaGw==} + + '@vercel/ruby@2.1.0': + resolution: {integrity: sha512-UZYwlSEEfVnfzTmgkD+kxex9/gkZGt7unOWNyWFN7V/ZnZSsGBUgv6hXLnwejdRi3EztgRQEBd1kUKlXdIeC0Q==} + + '@vercel/static-build@2.5.18': + resolution: {integrity: sha512-UgF/wrx5j07PMidvCVTjlTw1C47Ly+tpWihQyAH42xzf9BHtM+8S9UwOPdM5GYhtBuq2fmpPxFi9DCQ5sg4g7Q==} + + '@vercel/static-config@3.0.0': + resolution: {integrity: sha512-2qtvcBJ1bGY0dYGYh3iM7yGKkk971FujLEDXzuW5wcZsPr1GSEjO/w2iSr3qve6nDDtBImsGoDEnus5FI4+fIw==} + + '@webassemblyjs/ast@1.12.1': + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + + '@webassemblyjs/floating-point-hex-parser@1.11.6': + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + '@webassemblyjs/helper-api-error@1.11.6': + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + '@webassemblyjs/helper-buffer@1.12.1': + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + + '@webassemblyjs/helper-numbers@1.11.6': + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + '@webassemblyjs/helper-wasm-section@1.12.1': + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + + '@webassemblyjs/ieee754@1.11.6': + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + + '@webassemblyjs/leb128@1.11.6': + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + + '@webassemblyjs/utf8@1.11.6': + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + '@webassemblyjs/wasm-edit@1.12.1': + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + + '@webassemblyjs/wasm-gen@1.12.1': + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + + '@webassemblyjs/wasm-opt@1.12.1': + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + + '@webassemblyjs/wasm-parser@1.12.1': + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + + '@webassemblyjs/wast-printer@1.12.1': + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + + '@webpack-cli/configtest@2.1.1': + resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + + '@webpack-cli/generators@3.0.7': + resolution: {integrity: sha512-H4dlEX8CzO5EHBYYZQop9x4w6lG9FenSF/1spLRlvRAULDgTs0VfmwOuwp03tTLml9jpMsouuVw6vEN8KpwE/w==} + engines: {node: '>=14.15.0'} + peerDependencies: + prettier: '*' + webpack: 5.x.x + webpack-cli: 5.x.x + peerDependenciesMeta: + prettier: + optional: true + + '@webpack-cli/info@2.0.2': + resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + + '@webpack-cli/serve@2.0.5': + resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + webpack-dev-server: '*' + peerDependenciesMeta: + webpack-dev-server: + optional: true + + '@xobotyi/scrollbar-width@1.9.5': + resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead + + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-globals@6.0.0: + resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} + + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} + + acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} + engines: {node: '>=0.4.0'} + + acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + + address@1.2.2: + resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} + engines: {node: '>= 10.0.0'} + + adjust-sourcemap-loader@4.0.0: + resolution: {integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==} + engines: {node: '>=8.9'} + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + engines: {node: '>= 14'} + + agentkeepalive@4.3.0: + resolution: {integrity: sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==} + engines: {node: '>= 8.0.0'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + + ajv@8.6.3: + resolution: {integrity: sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==} + + alphanum-sort@1.0.2: + resolution: {integrity: sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==} + + analytics-utils@1.0.12: + resolution: {integrity: sha512-WvV2YWgsnXLxaY0QYux0crpBAg/0JA763NmbMVz22jKhMPo7dpTBet8G2IlF7ixTjLDzGlkHk1ZaKqqQmjJ+4w==} + peerDependencies: + '@types/dlv': ^1.0.0 + + analytics@0.8.9: + resolution: {integrity: sha512-oTbUzQpncMTslakqfK70GgB6bopk5hY+uuekwnadMkDyqNLgcD02KRzteTnO7q5Ko6wDECVtT8xi/6OuAMZykA==} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-html-community@0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.0} + hasBin: true + + ansi-html@0.0.9: + resolution: {integrity: sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==} + engines: {'0': node >= 0.8.0} + hasBin: true + + ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + ansi-to-html@0.7.2: + resolution: {integrity: sha512-v6MqmEpNlxF+POuyhKkidusCHWWkaLcGRURzivcU3I9tv7k4JVhFcnukrM5Rlk2rUywdZuzYAZ+kbZqWCnfN3g==} + engines: {node: '>=8.0.0'} + hasBin: true + + antd@5.19.4: + resolution: {integrity: sha512-bhSNzeScfaeN85LrQXZh5fD26y6uB+6c5cgoPUmW7lkC5oDN4mnT04yYcpqHpZD8p227AmycE+ZrcnilJH9log==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + aproba@1.2.0: + resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} + + aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + + archiver-utils@2.1.0: + resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} + engines: {node: '>= 6'} + + archiver-utils@3.0.4: + resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==} + engines: {node: '>= 10'} + + archiver@5.3.2: + resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==} + engines: {node: '>= 10'} + + are-we-there-yet@1.1.7: + resolution: {integrity: sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==} + deprecated: This package is no longer supported. + + are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. + + are-we-there-yet@3.0.1: + resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + + arg@4.1.0: + resolution: {integrity: sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + + array-differ@3.0.0: + resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} + engines: {node: '>=8'} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + + array-tree-filter@2.1.0: + resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==} + + array-union@1.0.2: + resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} + engines: {node: '>=0.10.0'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array-uniq@1.0.3: + resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} + engines: {node: '>=0.10.0'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + + array.prototype.reduce@1.0.7: + resolution: {integrity: sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + + arrify@2.0.1: + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + + assert-options@0.8.1: + resolution: {integrity: sha512-5lNGRB5g5i2bGIzb+J1QQE1iKU/WEMVBReFIc5pPDWjcPj23otPL0eI6PB2v7QPi0qU6Mhym5D3y0ZiSIOf3GA==} + engines: {node: '>=10.0.0'} + + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + + async-listen@1.2.0: + resolution: {integrity: sha512-CcEtRh/oc9Jc4uWeUwdpG/+Mb2YUHKmdaTf0gUr7Wa+bfp4xx70HOb3RuSTJMvqKNB1TkdTfjLdrcz2X4rkkZA==} + + async-listen@3.0.0: + resolution: {integrity: sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg==} + engines: {node: '>= 14'} + + async-listen@3.0.1: + resolution: {integrity: sha512-cWMaNwUJnf37C/S5TfCkk/15MwbPRwVYALA2jtjkbHjCmAPiDXyNJy2q3p1KAZzDLHAWyarUWSujUoHR4pEgrA==} + engines: {node: '>= 14'} + + async-lock@1.4.1: + resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==} + + async-retry@1.3.3: + resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + + async-sema@3.1.1: + resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + + async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + asyncro@3.0.0: + resolution: {integrity: sha512-nEnWYfrBmA3taTiuiOoZYmgJ/CNrSoQLeLs29SeLcPu60yaw/mHDBHV0iOZ051fTvsTHxpCY+gXibqT9wbQYfg==} + + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + autoprefixer@10.4.20: + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + autoprefixer@9.8.8: + resolution: {integrity: sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==} + hasBin: true + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axe-core@4.10.0: + resolution: {integrity: sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==} + engines: {node: '>=4'} + + axios@1.7.2: + resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} + + axobject-query@3.1.1: + resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} + + babel-jest@27.5.1: + resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + + babel-jest@28.1.3: + resolution: {integrity: sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + + babel-jest@29.7.0: + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + + babel-loader@8.3.0: + resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} + engines: {node: '>= 8.9'} + peerDependencies: + '@babel/core': ^7.0.0 + webpack: '>=2' + + babel-loader@9.1.3: + resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} + engines: {node: '>= 14.15.0'} + peerDependencies: + '@babel/core': ^7.12.0 + webpack: '>=5' + + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + + babel-plugin-jest-hoist@27.5.1: + resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + babel-plugin-jest-hoist@28.1.3: + resolution: {integrity: sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + babel-plugin-macros@2.8.0: + resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==} + + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + + babel-plugin-named-asset-import@0.3.8: + resolution: {integrity: sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==} + peerDependencies: + '@babel/core': ^7.1.0 + + babel-plugin-polyfill-corejs2@0.4.11: + resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.10.4: + resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.2: + resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-transform-async-to-promises@0.8.18: + resolution: {integrity: sha512-WpOrF76nUHijnNn10eBGOHZmXQC8JYRME9rOLxStOga7Av2VO53ehVFvVNImMksVtQuL2/7ZNxEgxnx7oo/3Hw==} + + babel-plugin-transform-react-remove-prop-types@0.4.24: + resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==} + + babel-plugin-transform-replace-expressions@0.2.0: + resolution: {integrity: sha512-Eh1rRd9hWEYgkgoA3D0kGp7xJ/wgVshgsqmq60iC4HVWD+Lux+fNHSHBa2v1Hsv+dHflShC71qKhiH40OiPtDA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + babel-preset-current-node-syntax@1.0.1: + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + + babel-preset-jest@27.5.1: + resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + + babel-preset-jest@28.1.3: + resolution: {integrity: sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + + babel-preset-jest@29.6.3: + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + + babel-preset-react-app@10.0.1: + resolution: {integrity: sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==} + + babel-runtime@6.25.0: + resolution: {integrity: sha512-zeCYxDePWYAT/DfmQWIHsMSFW2vv45UIwIAMjGvQVsTd47RwsiRH0uK1yzyWZ7LDBKdhnGDPM6NYEO5CZyhPrg==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base16@1.0.0: + resolution: {integrity: sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + batch@0.6.1: + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + + before-after-hook@2.2.3: + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + + bfj@7.1.0: + resolution: {integrity: sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==} + engines: {node: '>= 8.0.0'} + + big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + big.js@6.2.1: + resolution: {integrity: sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==} + + bignumber.js@9.1.2: + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + + bin-links@3.0.3: + resolution: {integrity: sha512-zKdnMPWEdh4F5INR07/eBrodC7QrF5JKvqskjz/ZZRXg5YSAZIbn8zGhbhUrElzHBZ2fvEQdOU59RHcTG3GiwA==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + binaryextensions@4.19.0: + resolution: {integrity: sha512-DRxnVbOi/1OgA5pA9EDiRT8gvVYeqfuN7TmPfLyt6cyho3KbHCi3EtDQf39TTmGDrR5dZ9CspdXhPkL/j/WGbg==} + engines: {node: '>=0.8'} + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + bintrees@1.0.2: + resolution: {integrity: sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + bonjour-service@1.2.1: + resolution: {integrity: sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + bottleneck@2.19.5: + resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} + + bowser@2.11.0: + resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + + boxen@7.1.1: + resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} + engines: {node: '>=14.16'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + brotli-size@4.0.0: + resolution: {integrity: sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==} + engines: {node: '>= 10.16.0'} + + browser-process-hrtime@1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + + browserslist@4.23.2: + resolution: {integrity: sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + bson@6.8.0: + resolution: {integrity: sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ==} + engines: {node: '>=16.20.1'} + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + buildcheck@0.0.6: + resolution: {integrity: sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==} + engines: {node: '>=10.0.0'} + + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + + builtins@1.0.3: + resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + byline@5.0.0: + resolution: {integrity: sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==} + engines: {node: '>=0.10.0'} + + bytes@3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + + bytes@3.1.0: + resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==} + engines: {node: '>= 0.8'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cacache@15.3.0: + resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} + engines: {node: '>= 10'} + + cacache@16.1.3: + resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + cacache@17.1.4: + resolution: {integrity: sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + caller-callsite@2.0.0: + resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} + engines: {node: '>=4'} + + caller-path@2.0.0: + resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} + engines: {node: '>=4'} + + callsites@2.0.0: + resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} + engines: {node: '>=4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camel-case@3.0.0: + resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} + + camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + + caniuse-api@3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + + caniuse-lite@1.0.30001645: + resolution: {integrity: sha512-GFtY2+qt91kzyMk6j48dJcwJVq5uTkk71XxE3RtScx7XWRLsO7bU44LOFkOZYR8w9YMS0UhPSYpN/6rAMImmLw==} + + caniuse-lite@1.0.30001649: + resolution: {integrity: sha512-fJegqZZ0ZX8HOWr6rcafGr72+xcgJKI9oWfDW5DrD7ExUtgZC7a7R7ZYmZqplh7XDocFdGeIFn7roAxhOeYrPQ==} + + case-sensitive-paths-webpack-plugin@2.4.0: + resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} + engines: {node: '>=4'} + + chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + char-regex@2.0.1: + resolution: {integrity: sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==} + engines: {node: '>=12.20'} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + chart.js@4.4.3: + resolution: {integrity: sha512-qK1gkGSRYcJzqrrzdR6a+I0vQ4/R+SoODXyAjscQ/4mzuNzySaMCd+hyVxitSY1+L2fjPD1Gbn+ibNqRmwQeLw==} + engines: {pnpm: '>=8'} + + check-types@11.2.3: + resolution: {integrity: sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==} + + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.0.0-rc.12: + resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} + engines: {node: '>= 6'} + + chokidar@3.3.1: + resolution: {integrity: sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==} + engines: {node: '>= 8.10.0'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + circ-json@1.0.4: + resolution: {integrity: sha512-/2NljkKlOCvNgs8jsIlJcCFhUfF6C1JJKM8PdJQ6HqIrqhJBouMcWFdeDJLNLZAadeTj0K9FMziH74hpEtAr1g==} + + cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + + cjs-module-lexer@1.3.1: + resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} + + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + + clean-css@4.2.4: + resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} + engines: {node: '>= 4.0'} + + clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + clean-webpack-plugin@4.0.0: + resolution: {integrity: sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==} + engines: {node: '>=10.0.0'} + peerDependencies: + webpack: '>=4.0.0 <6.0.0' + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-table@0.3.11: + resolution: {integrity: sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==} + engines: {node: '>= 0.2.0'} + + cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-buffer@1.0.0: + resolution: {integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==} + engines: {node: '>= 0.10'} + + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + + clone-stats@1.0.0: + resolution: {integrity: sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + cloneable-readable@1.1.3: + resolution: {integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + + cmd-shim@5.0.0: + resolution: {integrity: sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + coa@2.0.2: + resolution: {integrity: sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==} + engines: {node: '>= 4.0'} + + code-block-writer@10.1.1: + resolution: {integrity: sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==} + + code-block-writer@11.0.3: + resolution: {integrity: sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==} + + code-point-at@1.1.0: + resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} + engines: {node: '>=0.10.0'} + + collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + + color@3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + colors@1.0.3: + resolution: {integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==} + engines: {node: '>=0.1.90'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} + + commander@7.1.0: + resolution: {integrity: sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==} + engines: {node: '>= 10'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + common-ancestor-path@1.0.1: + resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} + + common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + + common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + compress-commons@4.1.2: + resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} + engines: {node: '>= 10'} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} + + compute-gcd@1.2.1: + resolution: {integrity: sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg==} + + compute-lcm@1.1.2: + resolution: {integrity: sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ==} + + compute-scroll-into-view@3.1.0: + resolution: {integrity: sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concat-with-sourcemaps@1.1.0: + resolution: {integrity: sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + confusing-browser-globals@1.0.11: + resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} + + connect-history-api-fallback@2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} + + console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.4: + resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-hrtime@3.0.0: + resolution: {integrity: sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==} + engines: {node: '>=8'} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-parser@1.4.6: + resolution: {integrity: sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==} + engines: {node: '>= 0.8.0'} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie@0.4.1: + resolution: {integrity: sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==} + engines: {node: '>= 0.6'} + + cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + copy-anything@2.0.6: + resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + + copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + + copy-webpack-plugin@12.0.2: + resolution: {integrity: sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.1.0 + + core-js-compat@3.37.1: + resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==} + + core-js-pure@3.37.1: + resolution: {integrity: sha512-J/r5JTHSmzTxbiYYrzXg9w1VpqrYt+gexenBE9pugeyhwPZTAEJddyiReJWsLO6uNQ8xJZFbod6XC7KKwatCiA==} + + core-js@2.6.12: + resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} + deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. + + core-js@3.37.1: + resolution: {integrity: sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==} + + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cosmiconfig@5.2.1: + resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} + engines: {node: '>=4'} + + cosmiconfig@6.0.0: + resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} + engines: {node: '>=8'} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + cpu-features@0.0.10: + resolution: {integrity: sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==} + engines: {node: '>=10.0.0'} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@4.0.3: + resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} + engines: {node: '>= 10'} + + create-jest@29.7.0: + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-fetch@3.1.8: + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + + cross-fetch@4.0.0: + resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + + crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + + css-blank-pseudo@3.0.3: + resolution: {integrity: sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==} + engines: {node: ^12 || ^14 || >=16} + hasBin: true + peerDependencies: + postcss: ^8.4 + + css-color-names@0.0.4: + resolution: {integrity: sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==} + + css-declaration-sorter@4.0.1: + resolution: {integrity: sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==} + engines: {node: '>4'} + + css-declaration-sorter@6.4.1: + resolution: {integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==} + engines: {node: ^10 || ^12 || >=14} + peerDependencies: + postcss: ^8.0.9 + + css-has-pseudo@3.0.4: + resolution: {integrity: sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==} + engines: {node: ^12 || ^14 || >=16} + hasBin: true + peerDependencies: + postcss: ^8.4 + + css-in-js-utils@3.1.0: + resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} + + css-loader@6.11.0: + resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==} + engines: {node: '>= 12.13.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + webpack: ^5.0.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + css-minimizer-webpack-plugin@3.4.1: + resolution: {integrity: sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==} + engines: {node: '>= 12.13.0'} + peerDependencies: + '@parcel/css': '*' + clean-css: '*' + csso: '*' + esbuild: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + '@parcel/css': + optional: true + clean-css: + optional: true + csso: + optional: true + esbuild: + optional: true + + css-modules-loader-core@1.1.0: + resolution: {integrity: sha512-XWOBwgy5nwBn76aA+6ybUGL/3JBnCtBX9Ay9/OWIpzKYWlVHMazvJ+WtHumfi+xxdPF440cWK7JCYtt8xDifew==} + + css-prefers-color-scheme@6.0.3: + resolution: {integrity: sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==} + engines: {node: ^12 || ^14 || >=16} + hasBin: true + peerDependencies: + postcss: ^8.4 + + css-select-base-adapter@0.1.1: + resolution: {integrity: sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==} + + css-select@2.1.0: + resolution: {integrity: sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==} + + css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + + css-selector-tokenizer@0.7.3: + resolution: {integrity: sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==} + + css-tree@1.0.0-alpha.37: + resolution: {integrity: sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==} + engines: {node: '>=8.0.0'} + + css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + + css-what@3.4.2: + resolution: {integrity: sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==} + engines: {node: '>= 6'} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + + cssdb@7.11.2: + resolution: {integrity: sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssnano-preset-default@4.0.8: + resolution: {integrity: sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==} + engines: {node: '>=6.9.0'} + + cssnano-preset-default@5.2.14: + resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + cssnano-util-get-arguments@4.0.0: + resolution: {integrity: sha512-6RIcwmV3/cBMG8Aj5gucQRsJb4vv4I4rn6YjPbVWd5+Pn/fuG+YseGvXGk00XLkoZkaj31QOD7vMUpNPC4FIuw==} + engines: {node: '>=6.9.0'} + + cssnano-util-get-match@4.0.0: + resolution: {integrity: sha512-JPMZ1TSMRUPVIqEalIBNoBtAYbi8okvcFns4O0YIhcdGebeYZK7dMyHJiQ6GqNBA9kE0Hym4Aqym5rPdsV/4Cw==} + engines: {node: '>=6.9.0'} + + cssnano-util-raw-cache@4.0.1: + resolution: {integrity: sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==} + engines: {node: '>=6.9.0'} + + cssnano-util-same-parent@4.0.1: + resolution: {integrity: sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==} + engines: {node: '>=6.9.0'} + + cssnano-utils@3.1.0: + resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + cssnano@4.1.11: + resolution: {integrity: sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==} + engines: {node: '>=6.9.0'} + + cssnano@5.1.15: + resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + csso@4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + + cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + + cssom@0.4.4: + resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} + + cssstyle@2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + cuid@2.1.8: + resolution: {integrity: sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg==} + deprecated: Cuid and other k-sortable and non-cryptographic ids (Ulid, ObjectId, KSUID, all UUIDs) are all insecure. Use @paralleldrive/cuid2 instead. + + currency-codes@1.5.1: + resolution: {integrity: sha512-hqy8vtlIYKzO6pe2TE0V4/riZALIc7nhtE9cvxk5FDRCvfGplgzUvpTmZlMsyO+NeK5U41j+sQXJOo8l8v9kdg==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + + dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + data-urls@2.0.0: + resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} + engines: {node: '>=10'} + + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + + date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + + dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + + dayjs@1.11.12: + resolution: {integrity: sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.1.1: + resolution: {integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==} + deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debuglog@1.0.1: + resolution: {integrity: sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + decimal.js-light@2.5.1: + resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + + decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + + declaration-bundler-webpack-plugin@1.0.3: + resolution: {integrity: sha512-bgeoSOZYTOOdiNUZd/U8K6Z+6IrM/X+DgUcm3/VI1l130lzOBeL+ObetjIkKksxcj0zUJbLaFRFumFGYDOQ9fg==} + + decompress-response@4.2.1: + resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} + engines: {node: '>=8'} + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + + dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-equal@2.2.3: + resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} + engines: {node: '>= 0.4'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + default-gateway@6.0.3: + resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} + engines: {node: '>= 10'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + del@4.1.1: + resolution: {integrity: sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==} + engines: {node: '>=6'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + + denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + + depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + deprecation@2.3.1: + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + detect-port-alt@1.1.6: + resolution: {integrity: sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==} + engines: {node: '>= 4.2.1'} + hasBin: true + + dezalgo@1.0.4: + resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + diff-match-patch@1.0.5: + resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} + + diff-sequences@27.5.1: + resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + diff-sequences@28.1.1: + resolution: {integrity: sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + + docker-compose@0.24.8: + resolution: {integrity: sha512-plizRs/Vf15H+GCVxq2EUvyPK7ei9b/cVesHvjnX4xaXjM9spHe2Ytq0BitndFgvTJ3E3NljPNUEl7BAN43iZw==} + engines: {node: '>= 6.0.0'} + + docker-modem@3.0.8: + resolution: {integrity: sha512-f0ReSURdM3pcKPNS30mxOHSbaFLcknGmQjwSfmbcdOw1XWKXVhukM3NJHhr7NpY9BIyyWQb0EBo3KQvvuU5egQ==} + engines: {node: '>= 8.0'} + + dockerode@3.3.5: + resolution: {integrity: sha512-/0YNa3ZDNeLr/tSckmD69+Gq+qVNhvKfAHNeZJBnp7EOP6RGKV8ORrJHkUn20So5wU+xxT7+1n5u8PjHbfjbSA==} + engines: {node: '>= 8.0'} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + + dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + + dom-align@1.12.4: + resolution: {integrity: sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==} + + dom-converter@0.2.0: + resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} + + dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + + dom-serializer@0.2.2: + resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} + + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@1.3.1: + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domexception@2.0.1: + resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} + engines: {node: '>=8'} + deprecated: Use your platform's native DOMException instead + + domhandler@3.3.0: + resolution: {integrity: sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==} + engines: {node: '>= 4'} + + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@1.7.0: + resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + + domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + + dotenv-cli@6.0.0: + resolution: {integrity: sha512-qXlCOi3UMDhCWFKe0yq5sg3X+pJAz+RQDiFN38AMSbUrnY3uZshSfDJUAge951OS7J9gwLZGfsBlWRSOYz/TRg==} + hasBin: true + + dotenv-cli@7.4.2: + resolution: {integrity: sha512-SbUj8l61zIbzyhIbg0FwPJq6+wjbzdn9oEtozQpZ6kW2ihCcapKVZj49oCT3oPM+mgQm+itgvUQcG5szxVrZTA==} + hasBin: true + + dotenv-expand@10.0.0: + resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + engines: {node: '>=12'} + + dotenv-expand@5.1.0: + resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} + + dotenv-expand@8.0.3: + resolution: {integrity: sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg==} + engines: {node: '>=12'} + + dotenv@10.0.0: + resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} + engines: {node: '>=10'} + + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + + dset@3.1.3: + resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==} + engines: {node: '>=4'} + + duplexer@0.1.1: + resolution: {integrity: sha512-sxNZ+ljy+RA1maXoUReeqBBpBC6RLKmg5ewzV+x+mSETmWNoKdZN6vcQjpFROemza23hGFskJtFNoUWUaQ+R4Q==} + + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + + duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + + dynamic-dedupe@0.3.0: + resolution: {integrity: sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + + edge-runtime@2.5.9: + resolution: {integrity: sha512-pk+k0oK0PVXdlT4oRp4lwh+unuKB7Ng4iZ2HB+EZ7QCEQizX360Rp/F4aRpgpRgdP2ufB35N+1KppHmYjqIGSg==} + engines: {node: '>=16'} + hasBin: true + + editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-to-chromium@1.5.4: + resolution: {integrity: sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==} + + emittery@0.10.2: + resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} + engines: {node: '>=12'} + + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + + emittery@0.8.1: + resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} + engines: {node: '>=10'} + + emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + + end-of-stream@1.1.0: + resolution: {integrity: sha512-EoulkdKF/1xa92q25PbjuDcgJ9RDHYU2Rs3SCIvs2/dSQ3BpmxneNHmA/M7fe60M3PrV7nNGTTNbkK62l6vXiQ==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + enhanced-resolve@5.17.1: + resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + engines: {node: '>=10.13.0'} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + envinfo@7.13.0: + resolution: {integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==} + engines: {node: '>=4'} + hasBin: true + + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + + errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + + error@10.4.0: + resolution: {integrity: sha512-YxIFEJuhgcICugOUvRx5th0UM+ActZ9sjY0QJmeVwsQdvosZ7kYzc9QqS0Da3R5iUmgU5meGIxh0xBeZpMVeLw==} + + es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + + es-array-method-boxes-properly@1.0.0: + resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + + es-iterator-helpers@1.0.19: + resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.4.1: + resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + + es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + + es6-promisify@6.1.1: + resolution: {integrity: sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg==} + + esbuild-android-64@0.14.47: + resolution: {integrity: sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + esbuild-android-arm64@0.14.47: + resolution: {integrity: sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + esbuild-darwin-64@0.14.47: + resolution: {integrity: sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + esbuild-darwin-arm64@0.14.47: + resolution: {integrity: sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + esbuild-freebsd-64@0.14.47: + resolution: {integrity: sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + esbuild-freebsd-arm64@0.14.47: + resolution: {integrity: sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + esbuild-linux-32@0.14.47: + resolution: {integrity: sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + esbuild-linux-64@0.14.47: + resolution: {integrity: sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + esbuild-linux-arm64@0.14.47: + resolution: {integrity: sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + esbuild-linux-arm@0.14.47: + resolution: {integrity: sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + esbuild-linux-mips64le@0.14.47: + resolution: {integrity: sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + esbuild-linux-ppc64le@0.14.47: + resolution: {integrity: sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + esbuild-linux-riscv64@0.14.47: + resolution: {integrity: sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + esbuild-linux-s390x@0.14.47: + resolution: {integrity: sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + esbuild-netbsd-64@0.14.47: + resolution: {integrity: sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + esbuild-openbsd-64@0.14.47: + resolution: {integrity: sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + esbuild-sunos-64@0.14.47: + resolution: {integrity: sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + esbuild-windows-32@0.14.47: + resolution: {integrity: sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + esbuild-windows-64@0.14.47: + resolution: {integrity: sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + esbuild-windows-arm64@0.14.47: + resolution: {integrity: sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + esbuild@0.14.47: + resolution: {integrity: sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-goat@3.0.0: + resolution: {integrity: sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==} + engines: {node: '>=10'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escodegen@1.14.3: + resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} + engines: {node: '>=4.0'} + hasBin: true + + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + + eslint-config-next@14.2.5: + resolution: {integrity: sha512-zogs9zlOiZ7ka+wgUnmcM0KBEDjo4Jis7kxN1jvC0N4wynQ2MIx/KBkg4mVF63J5EK4W0QMCn7xO3vNisjaAoA==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-config-react-app@7.0.1: + resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} + engines: {node: '>=14.0.0'} + peerDependencies: + eslint: ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-import-resolver-typescript@3.6.1: + resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + + eslint-module-utils@2.8.1: + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-flowtype@8.0.3: + resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@babel/plugin-syntax-flow': ^7.14.5 + '@babel/plugin-transform-react-jsx': ^7.14.9 + eslint: ^8.1.0 + + eslint-plugin-import@2.29.1: + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-jest@25.7.0: + resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^4.0.0 || ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + + eslint-plugin-jsx-a11y@6.9.0: + resolution: {integrity: sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-plugin-react-hooks@4.6.2: + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + + eslint-plugin-react@7.35.0: + resolution: {integrity: sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + + eslint-plugin-testing-library@5.11.1: + resolution: {integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} + peerDependencies: + eslint: ^7.5.0 || ^8.0.0 + + eslint-plugin-unused-imports@4.0.1: + resolution: {integrity: sha512-rax76s05z64uQgG9YXsWFmXrgjkaK79AvfeAWiSxhPP6RVGxeRaj4+2u+wxxu/mDy2pmJoOy1QTOEALMia2xGQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^8.0.0-0 + eslint: ^9.0.0 + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + + eslint-rule-composer@0.3.0: + resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} + engines: {node: '>=4.0.0'} + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-webpack-plugin@3.2.0: + resolution: {integrity: sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==} + engines: {node: '>= 12.13.0'} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + webpack: ^5.0.0 + + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@1.2.2: + resolution: {integrity: sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==} + engines: {node: '>=0.4.0'} + hasBin: true + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@0.6.1: + resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} + + estree-walker@1.0.1: + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + events-intercept@2.0.0: + resolution: {integrity: sha512-blk1va0zol9QOrdZt0rFXo5KMkNPVSp92Eju/Qz8THwKWKRKeE0T8Br/1aW6+Edkyq9xHYgYxn2QtOnUKPUp+Q==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@3.2.0: + resolution: {integrity: sha512-kJJfVbI/lZE1PZYDI5VPxp8zXPO9rtxOkhpZ0jMKha56AI9y2gGVC6bkukStQf0ka5Rh15BA5m7cCCH4jmHqkw==} + engines: {node: ^8.12.0 || >=9.7.0} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + + expect@27.5.1: + resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + expect@28.1.3: + resolution: {integrity: sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + exponential-backoff@3.1.1: + resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} + + express@4.19.2: + resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + engines: {node: '>= 0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + + facebook-nodejs-business-sdk@19.0.3: + resolution: {integrity: sha512-u594CNtN3ypU+VOSvwIm7tUpHZj67jt06EDbSaAyOvbIawg1gUnSCDtaZscypydrjJXBZuQVd5ltPqftSMn8fQ==} + + farmhash-modern@1.1.0: + resolution: {integrity: sha512-6ypT4XfgqJk/F3Yuv4SX26I3doUjt0GTG4a+JgWxXQpxXzTBq8fPUeGHfcYMMDPHJHm3yPOSjaeBwBGAHWXCdA==} + engines: {node: '>=18.0.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-equals@5.0.1: + resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} + engines: {node: '>=6.0.0'} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-shallow-equal@1.0.0: + resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==} + + fast-text-encoding@1.0.6: + resolution: {integrity: sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==} + + fast-xml-parser@4.4.1: + resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} + hasBin: true + + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + + fastest-stable-stringify@2.0.2: + resolution: {integrity: sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==} + + fastparse@1.1.2: + resolution: {integrity: sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + faye-websocket@0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + + fbemitter@3.0.0: + resolution: {integrity: sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==} + + fbjs-css-vars@1.0.2: + resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} + + fbjs@3.0.5: + resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + figlet@1.7.0: + resolution: {integrity: sha512-gO8l3wvqo0V7wEFLXPbkX83b7MVjRrk1oRLfYlZXol8nEpb/ON9pcKLI4qpBv5YtOTfrINtqb7b40iYY2FTWFg==} + engines: {node: '>= 0.4.0'} + hasBin: true + + figures@1.7.0: + resolution: {integrity: sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==} + engines: {node: '>=0.10.0'} + + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-loader@6.2.0: + resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + filesize@6.4.0: + resolution: {integrity: sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ==} + engines: {node: '>= 0.4.0'} + + filesize@8.0.7: + resolution: {integrity: sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==} + engines: {node: '>= 0.4.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + + find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + + find-cache-dir@4.0.0: + resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} + engines: {node: '>=14.16'} + + find-free-port@2.0.0: + resolution: {integrity: sha512-J1j8gfEVf5FN4PR5w5wrZZ7NYs2IvqsHcd03cAeQx3Ec/mo+lKceaVNhpsRKoZpZKbId88o8qh+dwUwzBV6WCg==} + + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + find-yarn-workspace-root2@1.2.16: + resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + + firebase-admin@12.3.0: + resolution: {integrity: sha512-AKJcFbOZ7W8Fwcqh6Ba7FThXVoXwPdsf+E9vyjk5Z1vN1Z9mnTw88EQWfIsR91YglQ0KvWu1rvMhW65bcB4sog==} + engines: {node: '>=14'} + + firebase@10.12.5: + resolution: {integrity: sha512-J0yL3yh12CfFprTkSOQ9HqBugERyqvWwOuOoo1j1QHmYe9cYLKnBmtNCvGIYInDcsVUnJoRXCM+hxbGf48oVhg==} + + first-chunk-stream@2.0.0: + resolution: {integrity: sha512-X8Z+b/0L4lToKYq+lwnKqi9X/Zek0NibLpsJgVsSxpoYq7JtiCtRb5HqKVEjEw/qAb/4AKKRLOwwKHlWNpm2Eg==} + engines: {node: '>=0.10.0'} + + first-match@0.0.1: + resolution: {integrity: sha512-VvKbnaxrC0polTFDC+teKPTdl2mn6B/KUW+WB3C9RzKDeNwbzfLdnUz3FxC+tnjvus6bI0jWrWicQyVIPdS37A==} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + flux@4.0.4: + resolution: {integrity: sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==} + peerDependencies: + react: ^15.0.2 || ^16.0.0 || ^17.0.0 + + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + foreground-child@3.2.1: + resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} + engines: {node: '>=14'} + + fork-ts-checker-webpack-plugin@6.5.3: + resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} + engines: {node: '>=10', yarn: '>=1.0.0'} + peerDependencies: + eslint: '>= 6' + typescript: '>= 2.7' + vue-template-compiler: '*' + webpack: '>= 4' + peerDependenciesMeta: + eslint: + optional: true + vue-template-compiler: + optional: true + + form-data@2.5.1: + resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} + engines: {node: '>= 0.12'} + + form-data@3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@11.1.0: + resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} + engines: {node: '>=14.14'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + fs-minipass@1.2.7: + resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs-minipass@3.0.3: + resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + fs-monkey@1.0.6: + resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.1.3: + resolution: {integrity: sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + deprecated: '"Please update to latest v2.3 or v2.2"' + + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + + functional-red-black-tree@1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gauge@2.7.4: + resolution: {integrity: sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==} + deprecated: This package is no longer supported. + + gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. + + gauge@4.0.4: + resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + + gaxios@4.3.3: + resolution: {integrity: sha512-gSaYYIO1Y3wUtdfHmjDUZ8LWaxJQpiavzbF5Kq53akSzvmVg0RfyOcFDbO1KJ/KCGRFz2qG+lS81F0nkr7cRJA==} + engines: {node: '>=10'} + + gaxios@6.7.0: + resolution: {integrity: sha512-DSrkyMTfAnAm4ks9Go20QGOcXEyW/NmZhvTYBU2rb4afBB393WIMQPWPEDMl/k8xqiNN9HYq2zao3oWXsdl2Tg==} + engines: {node: '>=14'} + + gcp-metadata@4.3.1: + resolution: {integrity: sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==} + engines: {node: '>=10'} + + gcp-metadata@6.1.0: + resolution: {integrity: sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==} + engines: {node: '>=14'} + + generic-names@2.0.1: + resolution: {integrity: sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ==} + + generic-pool@3.4.2: + resolution: {integrity: sha512-H7cUpwCQSiJmAHM4c/aFu6fUfrhWXW1ncyh8ftxEPMu6AiYkHw9K8br720TGPZJbk5eOH2bynjZD1yPvdDAmag==} + engines: {node: '>= 4'} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-own-enumerable-property-symbols@3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-port@5.1.1: + resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} + engines: {node: '>=8'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.7.6: + resolution: {integrity: sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==} + + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + + github-username@6.0.0: + resolution: {integrity: sha512-7TTrRjxblSI5l6adk9zd+cV5d6i1OrJSo3Vr9xdGqFLBQo0mz5P9eIfKCDJ7eekVGGFLbce0qbPSnktXV2BjDQ==} + engines: {node: '>=10'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported + + global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + + global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globalyzer@0.1.0: + resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globby@14.0.2: + resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} + engines: {node: '>=18'} + + globby@6.1.0: + resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} + engines: {node: '>=0.10.0'} + + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + + google-ads-api@16.0.0-rest-beta3: + resolution: {integrity: sha512-0XdXmlycfoWxTOg/Sr2djdUepNYojvx+MHJXKT0TKRyhH5a2V/lGqtht1H3QktOpjIGFuAdcXSHB46AIxZg+9g==} + + google-ads-node@13.0.0: + resolution: {integrity: sha512-A8g+58gJrSQqN88OTlg3Y3x7JTMUT62ZMUMtfznEs3RKKNQFnz8cv077031NVpmgS1eSXbcdYTDtaCGkhWSv2g==} + + google-auth-library@7.14.1: + resolution: {integrity: sha512-5Rk7iLNDFhFeBYc3s8l1CqzbEBcdhwR193RlD4vSNFajIcINKI8W8P0JLmBpwymHqqWbX34pJDQu39cSy/6RsA==} + engines: {node: '>=10'} + + google-auth-library@9.12.0: + resolution: {integrity: sha512-5pWjpxJMNJ5UTuhK7QPD5KFPsbosWkX4ajMDeZwXllTtwwqeiIzPWbHIddkLBkkn0mUPboTmukT5rd30Ec9igQ==} + engines: {node: '>=14'} + + google-gax@4.3.8: + resolution: {integrity: sha512-SKAQKtvdjtNW3PMOhmKEqpQP+2C5ZqNKfwWxy70efpSwxvRYuAcgMJs6aRHTBPJjz3SO6ZbiXwM6WIuGYFZ7LQ==} + engines: {node: '>=14'} + + google-p12-pem@3.1.4: + resolution: {integrity: sha512-HHuHmkLgwjdmVRngf5+gSmpkyaRI6QmOg77J8tkNBHhNEI62sGHyw4/+UkgyZEI7h84NbWprXDJ+sa3xOYFvTg==} + engines: {node: '>=10'} + deprecated: Package is no longer maintained + hasBin: true + + googleapis-common@7.2.0: + resolution: {integrity: sha512-/fhDZEJZvOV3X5jmD+fKxMqma5q2Q9nZNSF3kn1F18tpxmA86BcTxAGBQdM0N89Z3bEaIs+HVznSmFJEAmMTjA==} + engines: {node: '>=14.0.0'} + + googleapis@126.0.1: + resolution: {integrity: sha512-4N8LLi+hj6ytK3PhE52KcM8iSGhJjtXnCDYB4fp6l+GdLbYz4FoDmx074WqMbl7iYMDN87vqD/8drJkhxW92mQ==} + engines: {node: '>=14.0.0'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + grouped-queue@2.0.0: + resolution: {integrity: sha512-/PiFUa7WIsl48dUeCvhIHnwNmAAzlI/eHoJl0vu3nsFA366JleY7Ff8EVTplZu5kO0MIdZjKTTnzItL61ahbnw==} + engines: {node: '>=8.0.0'} + + gtoken@5.3.2: + resolution: {integrity: sha512-gkvEKREW7dXWF8NV8pVrKfW7WqReAmjjkMBh6lNCCGOM4ucS0r0YyXXl0r/9Yj8wcW/32ISkfc8h5mPTDbtifQ==} + engines: {node: '>=10'} + + gtoken@7.1.0: + resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} + engines: {node: '>=14.0.0'} + + gzip-size@3.0.0: + resolution: {integrity: sha512-6s8trQiK+OMzSaCSVXX+iqIcLV9tC+E73jrJrJTyS4h/AJhlxHvzFKqM1YLDJWRGgHX8uLkBeXkA0njNj39L4w==} + engines: {node: '>=0.12.0'} + + gzip-size@5.1.1: + resolution: {integrity: sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==} + engines: {node: '>=6'} + + gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + + handle-thing@2.0.1: + resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + + harmony-reflect@1.6.2: + resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==} + + has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@1.0.0: + resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} + engines: {node: '>=0.10.0'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + + has@1.0.4: + resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} + engines: {node: '>= 0.4.0'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hex-color-regex@1.1.0: + resolution: {integrity: sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==} + + highlight.js@11.10.0: + resolution: {integrity: sha512-SYVnVFswQER+zu1laSya563s+F8VDGt7o35d4utbamowvUNLLMovFqwCLSocpZTz3MgaSRA1IbqRWZv97dtErQ==} + engines: {node: '>=12.0.0'} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + hoopy@0.1.4: + resolution: {integrity: sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==} + engines: {node: '>= 6.0.0'} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + hosted-git-info@6.1.1: + resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + hpack.js@2.1.6: + resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + + hsl-regex@1.0.0: + resolution: {integrity: sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A==} + + hsla-regex@1.0.0: + resolution: {integrity: sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA==} + + html-encoding-sniffer@2.0.1: + resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} + engines: {node: '>=10'} + + html-entities@2.5.2: + resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + html-minifier-terser@6.1.0: + resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} + engines: {node: '>=12'} + hasBin: true + + html-minifier@4.0.0: + resolution: {integrity: sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==} + engines: {node: '>=6'} + hasBin: true + + html-webpack-plugin@5.6.0: + resolution: {integrity: sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==} + engines: {node: '>=10.13.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + webpack: ^5.20.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + htmlencode@0.0.4: + resolution: {integrity: sha512-0uDvNVpzj/E2TfvLLyyXhKBRvF1y84aZsyRxRXFsQobnHaL4pcaXk+Y9cnFlvnxrBLeXDNq/VJBD+ngdBgQG1w==} + + htmlparser2@5.0.1: + resolution: {integrity: sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ==} + + htmlparser2@6.1.0: + resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + + htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + + htmlparser2@9.1.0: + resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + http-deceiver@1.2.7: + resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + + http-errors@1.4.0: + resolution: {integrity: sha512-oLjPqve1tuOl5aRhv8GK5eHpqP1C9fb+Ol+XTLjKfLltE44zdDbEdjPSbU7Ch5rSNsVFqZn97SrMmZLdu1/YMw==} + engines: {node: '>= 0.6'} + + http-errors@1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + + http-errors@1.7.3: + resolution: {integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==} + engines: {node: '>= 0.6'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-parser-js@0.5.8: + resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} + + http-proxy-agent@4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + + http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + + http-proxy-middleware@2.0.6: + resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/express': ^4.17.13 + peerDependenciesMeta: + '@types/express': + optional: true + + http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + https-proxy-agent@7.0.5: + resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} + engines: {node: '>= 14'} + + human-signals@1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + + husky@8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} + hasBin: true + + hyphenate-style-name@1.1.0: + resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + icss-replace-symbols@1.1.0: + resolution: {integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==} + + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + idb@7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + + identity-obj-proxy@3.0.0: + resolution: {integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==} + engines: {node: '>=4'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + + ignore-walk@4.0.1: + resolution: {integrity: sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==} + engines: {node: '>=10'} + + ignore-walk@6.0.5: + resolution: {integrity: sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + image-size@0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + + immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + + import-cwd@2.1.0: + resolution: {integrity: sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==} + engines: {node: '>=4'} + + import-cwd@3.0.0: + resolution: {integrity: sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==} + engines: {node: '>=8'} + + import-fresh@2.0.0: + resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} + engines: {node: '>=4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-from@2.1.0: + resolution: {integrity: sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==} + engines: {node: '>=4'} + + import-from@3.0.0: + resolution: {integrity: sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==} + engines: {node: '>=8'} + + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + indexes-of@1.0.1: + resolution: {integrity: sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==} + + infer-owner@1.0.4: + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.1: + resolution: {integrity: sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==} + + inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + inline-style-prefixer@7.0.1: + resolution: {integrity: sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==} + + inquirer@8.2.6: + resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} + engines: {node: '>=12.0.0'} + + inquirer@9.3.6: + resolution: {integrity: sha512-riK/iQB2ctwkpWYgjjWIRv3MBLt2gzb2Sj0JNQNbyTXgyXsLWcDPJ5WS5ZDTCx7BRFnJsARtYh+58fjP5M2Y0Q==} + engines: {node: '>=18'} + + intercom-client@5.0.0: + resolution: {integrity: sha512-fEzM9w+apUwK6roDyZPvfXqmI9mrdM5Nz0QmCeDTM/8G2I0464SzJDfLTDRvz+ZkY6EIeTHEaQnK09DmYgqRhA==} + engines: {node: '>= v8.0.0'} + + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + + interpret@3.1.1: + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} + + ioredis@5.4.1: + resolution: {integrity: sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==} + engines: {node: '>=12.22.0'} + + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + + ip6addr@0.2.5: + resolution: {integrity: sha512-9RGGSB6Zc9Ox5DpDGFnJdIeF0AsqXzdH+FspCfPPaU/L/4tI6P+5lIoFUFm9JXs9IrJv1boqAaNCQmoDADTSKQ==} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + ipaddr.js@2.2.0: + resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} + engines: {node: '>= 10'} + + is-absolute-url@2.1.0: + resolution: {integrity: sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg==} + engines: {node: '>=0.10.0'} + + is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + + is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-color-stop@1.1.0: + resolution: {integrity: sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA==} + + is-core-module@2.15.0: + resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-directory@0.3.1: + resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} + engines: {node: '>=0.10.0'} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + + is-fullwidth-code-point@1.0.0: + resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-path-cwd@2.2.0: + resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} + engines: {node: '>=6'} + + is-path-in-cwd@2.1.0: + resolution: {integrity: sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==} + engines: {node: '>=6'} + + is-path-inside@2.1.0: + resolution: {integrity: sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==} + engines: {node: '>=6'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + + is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-regexp@1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + + is-resolvable@1.1.0: + resolution: {integrity: sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==} + + is-root@2.1.0: + resolution: {integrity: sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==} + engines: {node: '>=6'} + + is-scoped@2.1.0: + resolution: {integrity: sha512-Cv4OpPTHAK9kHYzkzCrof3VJh7H/PrG2MBUMvvJebaaUMbqhm0YAtXnvh0I3Hnj2tMZWwrRROWLSgfJrKqWmlQ==} + engines: {node: '>=8'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + + is-valid-domain@0.1.6: + resolution: {integrity: sha512-ZKtq737eFkZr71At8NxOFcP9O1K89gW3DkdrGMpp1upr/ueWjj+Weh4l9AI4rN0Gt8W2M1w7jrG2b/Yv83Ljpg==} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} + + is-what@3.14.1: + resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isbinaryfile@4.0.10: + resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} + engines: {node: '>= 8.0.0'} + + isbinaryfile@5.0.2: + resolution: {integrity: sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==} + engines: {node: '>= 18.0.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + iso-3166-1@2.1.1: + resolution: {integrity: sha512-RZxXf8cw5Y8LyHZIwIRvKw8sWTIHh2/txBT+ehO0QroesVfnz3JNFFX4i/OC/Yuv2bDIVYrHna5PMvjtpefq5w==} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + isolated-vm@5.0.1: + resolution: {integrity: sha512-hs7+ff59Z2zDvavfcjuot/r1gm6Bmpt+GoZxmVfxUmXaX5scOvUq/Rnme+mUtSh5lW41hH8gAuvk/yTJDYO8Fg==} + engines: {node: '>=18.0.0'} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + + jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true + + jest-changed-files@27.5.1: + resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + jest-changed-files@28.1.3: + resolution: {integrity: sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-circus@27.5.1: + resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + jest-circus@28.1.3: + resolution: {integrity: sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-cli@27.5.1: + resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-cli@28.1.3: + resolution: {integrity: sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-cli@29.7.0: + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@27.5.1: + resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + ts-node: '>=9.0.0' + peerDependenciesMeta: + ts-node: + optional: true + + jest-config@28.1.3: + resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + + jest-config@29.7.0: + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + + jest-diff@27.5.1: + resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + jest-diff@28.1.3: + resolution: {integrity: sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-docblock@27.5.1: + resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + jest-docblock@28.1.1: + resolution: {integrity: sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-each@27.5.1: + resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + jest-each@28.1.3: + resolution: {integrity: sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-environment-jsdom@27.5.1: + resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + jest-environment-node@27.5.1: + resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + jest-environment-node@28.1.3: + resolution: {integrity: sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@27.5.1: + resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + jest-get-type@28.0.2: + resolution: {integrity: sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-haste-map@27.5.1: + resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + jest-haste-map@28.1.3: + resolution: {integrity: sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-jasmine2@27.5.1: + resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + jest-leak-detector@27.5.1: + resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + jest-leak-detector@28.1.3: + resolution: {integrity: sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@27.5.1: + resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + jest-matcher-utils@28.1.3: + resolution: {integrity: sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-message-util@27.5.1: + resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + jest-message-util@28.1.3: + resolution: {integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-mock@27.5.1: + resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + jest-mock@28.1.3: + resolution: {integrity: sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-regex-util@27.5.1: + resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + jest-regex-util@28.0.2: + resolution: {integrity: sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve-dependencies@27.5.1: + resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + jest-resolve-dependencies@28.1.3: + resolution: {integrity: sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve@27.5.1: + resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + jest-resolve@28.1.3: + resolution: {integrity: sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runner@27.5.1: + resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + jest-runner@28.1.3: + resolution: {integrity: sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runtime@27.5.1: + resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + jest-runtime@28.1.3: + resolution: {integrity: sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-serializer@27.5.1: + resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + jest-snapshot@27.5.1: + resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + jest-snapshot@28.1.3: + resolution: {integrity: sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@27.5.1: + resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + jest-util@28.1.3: + resolution: {integrity: sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-validate@27.5.1: + resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + jest-validate@28.1.3: + resolution: {integrity: sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-watch-typeahead@1.1.0: + resolution: {integrity: sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + jest: ^27.0.0 || ^28.0.0 + + jest-watcher@27.5.1: + resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + jest-watcher@28.1.3: + resolution: {integrity: sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@24.9.0: + resolution: {integrity: sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==} + engines: {node: '>= 6'} + + jest-worker@26.6.2: + resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} + engines: {node: '>= 10.13.0'} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jest-worker@28.1.3: + resolution: {integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest@27.5.1: + resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest@28.1.3: + resolution: {integrity: sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest@29.7.0: + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + hasBin: true + + jose@4.15.9: + resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} + + js-beautify@1.15.1: + resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} + engines: {node: '>=14'} + hasBin: true + + js-cookie@2.2.1: + resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} + + js-cookie@3.0.1: + resolution: {integrity: sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==} + engines: {node: '>=12'} + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + js-sha256@0.9.0: + resolution: {integrity: sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + + jsdom@16.7.0: + resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} + engines: {node: '>=10'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-bigint@1.0.0: + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-parse-even-better-errors@3.0.2: + resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + json-schema-compare@0.2.2: + resolution: {integrity: sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ==} + + json-schema-merge-allof@0.8.1: + resolution: {integrity: sha512-CTUKmIlPJbsWfzRRnOXz+0MjIqvnleIXwFTzz+t9T86HnYX/Rozria6ZVGLktAU9e+NygNljveP+yxqtQp/Q4w==} + engines: {node: '>=12.0.0'} + + json-schema-to-ts@1.6.4: + resolution: {integrity: sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-nice@1.1.4: + resolution: {integrity: sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==} + + json2mq@0.2.0: + resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsondiffpatch@0.5.0: + resolution: {integrity: sha512-Quz3MvAwHxVYNXsOByL7xI5EB2WYOeFswqaHIA3qOK3isRWTxiplBEocmmru6XmxDB2L7jDNYtYA4FyimoAFEw==} + engines: {node: '>=8.17.0'} + hasBin: true + bundledDependencies: [] + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + jsonpath@1.1.1: + resolution: {integrity: sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==} + + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + + jsonwebtoken@9.0.2: + resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} + engines: {node: '>=12', npm: '>=6'} + + jsprim@2.0.2: + resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==} + engines: {'0': node >=0.6.0} + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + juice@10.0.0: + resolution: {integrity: sha512-9f68xmhGrnIi6DBkiiP3rUrQN33SEuaKu1+njX6VgMP+jwZAsnT33WIzlrWICL9matkhYu3OyrqSUP55YTIdGg==} + engines: {node: '>=10.0.0'} + hasBin: true + + just-diff-apply@5.5.0: + resolution: {integrity: sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==} + + just-diff@5.2.0: + resolution: {integrity: sha512-6ufhP9SHjb7jibNFrNxyFZ6od3g+An6Ai9mhGRvcYe8UJlH0prseN64M+6ZBBUoKYHZsitDP42gAJ8+eVWr3lw==} + + jwa@1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + + jwa@2.0.0: + resolution: {integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==} + + jwks-rsa@3.1.0: + resolution: {integrity: sha512-v7nqlfezb9YfHHzYII3ef2a2j1XnGeSE/bK3WfumaYCqONAIstJbrEGapz4kadScZzEt7zYCN7bucj8C0Mv/Rg==} + engines: {node: '>=14'} + + jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + + jws@4.0.0: + resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} + + kafkajs-snappy@1.1.0: + resolution: {integrity: sha512-M4h2WhlxhXmR64z8nwzfGa1Dhhz78vykRfySRL8tuYQ8e6JSOuclbF2FJ8jeMJP3EZWw3uhjvwHlz7Ucu3UdWA==} + engines: {node: '>=8.0.0'} + + kafkajs@2.2.4: + resolution: {integrity: sha512-j/YeapB1vfPT2iOIUn/vxdyKEuhuY2PxMBvf5JWux6iSaukAccrMtXEY/Lb7OvavDhOWME589bpLrEdnVHjfjA==} + engines: {node: '>=14.0.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} + + language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + + language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + + launch-editor@2.8.0: + resolution: {integrity: sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==} + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + + less-loader@10.2.0: + resolution: {integrity: sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg==} + engines: {node: '>= 12.13.0'} + peerDependencies: + less: ^3.5.0 || ^4.0.0 + webpack: ^5.0.0 + + less@4.2.0: + resolution: {integrity: sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==} + engines: {node: '>=6'} + hasBin: true + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lie@3.1.1: + resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + + limiter@1.1.5: + resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + load-yaml-file@0.2.0: + resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} + engines: {node: '>=6'} + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + loader-utils@1.4.2: + resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} + engines: {node: '>=4.0.0'} + + loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + + loader-utils@3.3.1: + resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} + engines: {node: '>= 12.13.0'} + + localforage@1.10.0: + resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} + + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.castarray@4.4.0: + resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + + lodash.curry@4.1.1: + resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + + lodash.difference@4.5.0: + resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} + + lodash.flatten@4.4.0: + resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} + + lodash.flow@3.5.0: + resolution: {integrity: sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==} + + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + + lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + + lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash.union@4.6.0: + resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + long@4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + + long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lower-case@1.1.4: + resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + lru-memoizer@2.3.0: + resolution: {integrity: sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==} + + lucide-react@0.263.1: + resolution: {integrity: sha512-keqxAx97PlaEN89PXZ6ki1N8nRjGWtDa4021GFYLNj0RgruM5odbpl8GHTExj0hhPq3sF6Up0gnxt6TSHu+ovw==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 + + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + + magic-string@0.22.5: + resolution: {integrity: sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==} + + magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + + magic-string@0.27.0: + resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} + engines: {node: '>=12'} + + magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + + make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + make-fetch-happen@10.2.1: + resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + make-fetch-happen@11.1.1: + resolution: {integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + make-fetch-happen@9.1.0: + resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} + engines: {node: '>= 10'} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + markdown-to-jsx@7.4.7: + resolution: {integrity: sha512-0+ls1IQZdU6cwM1yu0ZjjiVWYtkbExSyUIFU2ZeDIFuZM1W42Mh4OlJ4nb4apX4H8smxDHRdFaoIVJGwfv5hkg==} + engines: {node: '>= 10'} + peerDependencies: + react: '>= 0.14.0' + + matched@5.0.1: + resolution: {integrity: sha512-E1fhSTPRyhAlNaNvGXAgZQlq1hL0bgYMTk/6bktVlIhzUnX/SZs7296ACdVeNJE8xFNGSuvd9IpI7vSnmcqLvw==} + engines: {node: '>=10'} + + maxmin@2.1.0: + resolution: {integrity: sha512-NWlApBjW9az9qRPaeg7CX4sQBWwytqz32bIEo1PW9pRW+kBP9KLRfJO3UC+TV31EcQZEUq7eMzikC7zt3zPJcw==} + engines: {node: '>=0.12'} + + maxmind@4.3.20: + resolution: {integrity: sha512-xwnLGghs96DyNK3ANs1jzW8+JwS6pBQ3eTh3kNsi23n5wySZb9FgqCghmde5JZFOv23bxGehcyh6lT522llNKw==} + engines: {node: '>=12', npm: '>=6'} + + mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + + mdn-data@2.0.4: + resolution: {integrity: sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + mem-fs-editor@9.7.0: + resolution: {integrity: sha512-ReB3YD24GNykmu4WeUL/FDIQtkoyGB6zfJv60yfCo3QjKeimNcTqv2FT83bP0ccs6uu+sm5zyoBlspAzigmsdg==} + engines: {node: '>=12.10.0'} + peerDependencies: + mem-fs: ^2.1.0 + peerDependenciesMeta: + mem-fs: + optional: true + + mem-fs@2.3.0: + resolution: {integrity: sha512-GftCCBs6EN8sz3BoWO1bCj8t7YBtT713d8bUgbhg9Iel5kFSqnSvCK06TYIDJAtJ51cSiWkM/YemlT0dfoFycw==} + engines: {node: '>=12'} + + memfs@3.5.3: + resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + engines: {node: '>= 4.0.0'} + + memory-pager@1.5.0: + resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} + + mensch@0.3.4: + resolution: {integrity: sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==} + + merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micro@9.3.5-canary.3: + resolution: {integrity: sha512-viYIo9PefV+w9dvoIBh1gI44Mvx1BOk67B4BpC2QK77qdY0xZF0Q+vWLt/BII6cLkIc8rLmSIcJaB/OrXXKe1g==} + engines: {node: '>= 8.0.0'} + hasBin: true + + microbundle-crl@0.13.11: + resolution: {integrity: sha512-3roSSgtJdIvvIOJdhefWD8BoEjHkbInkJzUoSE+ER6NGcpTuPWXNFyAbXamCL9Qg8rTU4urbYtXusk/d1ZpteA==} + hasBin: true + + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.53.0: + resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-response@2.1.0: + resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} + engines: {node: '>=8'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + mini-css-extract-plugin@2.9.0: + resolution: {integrity: sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@7.4.6: + resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} + engines: {node: '>=10'} + + minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass-collect@1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + + minipass-fetch@1.4.1: + resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} + engines: {node: '>=8'} + + minipass-fetch@2.1.2: + resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + minipass-fetch@3.0.5: + resolution: {integrity: sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + + minipass-json-stream@1.0.2: + resolution: {integrity: sha512-myxeeTm57lYs8pH2nxPzmEEg8DGIgW+9mv6D4JZD2pa81I/OBjeU7PtICXV6c9eRGTA5JMDsuIPUZRCyBMYNhg==} + + minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + + minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + + minipass@2.9.0: + resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@1.3.3: + resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + minizlib@3.0.1: + resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} + engines: {node: '>= 18'} + + mixwith@0.1.1: + resolution: {integrity: sha512-DQsf/liljH/9e+94jR+xfK8vlKceeKdOM9H9UEXLwGuvEEpO6debNtJ9yt1ZKzPKPrwqGxzMdu0BR1fnQb6i4A==} + + mjml-accordion@4.15.3: + resolution: {integrity: sha512-LPNVSj1LyUVYT9G1gWwSw3GSuDzDsQCu0tPB2uDsq4VesYNnU6v3iLCQidMiR6azmIt13OEozG700ygAUuA6Ng==} + + mjml-body@4.15.3: + resolution: {integrity: sha512-7pfUOVPtmb0wC+oUOn4xBsAw4eT5DyD6xqaxj/kssu6RrFXOXgJaVnDPAI9AzIvXJ/5as9QrqRGYAddehwWpHQ==} + + mjml-button@4.15.3: + resolution: {integrity: sha512-79qwn9AgdGjJR1vLnrcm2rq2AsAZkKC5JPwffTMG+Nja6zGYpTDZFZ56ekHWr/r1b5WxkukcPj2PdevUug8c+Q==} + + mjml-carousel@4.15.3: + resolution: {integrity: sha512-3ju6I4l7uUhPRrJfN3yK9AMsfHvrYbRkcJ1GRphFHzUj37B2J6qJOQUpzA547Y4aeh69TSb7HFVf1t12ejQxVw==} + + mjml-cli@4.15.3: + resolution: {integrity: sha512-+V2TDw3tXUVEptFvLSerz125C2ogYl8klIBRY1m5BHd4JvGVf3yhx8N3PngByCzA6PGcv/eydGQN+wy34SHf0Q==} + hasBin: true + + mjml-column@4.15.3: + resolution: {integrity: sha512-hYdEFdJGHPbZJSEysykrevEbB07yhJGSwfDZEYDSbhQQFjV2tXrEgYcFD5EneMaowjb55e3divSJxU4c5q4Qgw==} + + mjml-core@4.15.3: + resolution: {integrity: sha512-Dmwk+2cgSD9L9GmTbEUNd8QxkTZtW9P7FN/ROZW/fGZD6Hq6/4TB0zEspg2Ow9eYjZXO2ofOJ3PaQEEShKV0kQ==} + + mjml-divider@4.15.3: + resolution: {integrity: sha512-vh27LQ9FG/01y0b9ntfqm+GT5AjJnDSDY9hilss2ixIUh0FemvfGRfsGVeV5UBVPBKK7Ffhvfqc7Rciob9Spzw==} + + mjml-group@4.15.3: + resolution: {integrity: sha512-HSu/rKnGZVKFq3ciT46vi1EOy+9mkB0HewO4+P6dP/Y0UerWkN6S3UK11Cxsj0cAp0vFwkPDCdOeEzRdpFEkzA==} + + mjml-head-attributes@4.15.3: + resolution: {integrity: sha512-2ISo0r5ZKwkrvJgDou9xVPxxtXMaETe2AsAA02L89LnbB2KC0N5myNsHV0sEysTw9+CfCmgjAb0GAI5QGpxKkQ==} + + mjml-head-breakpoint@4.15.3: + resolution: {integrity: sha512-Eo56FA5C2v6ucmWQL/JBJ2z641pLOom4k0wP6CMZI2utfyiJ+e2Uuinj1KTrgDcEvW4EtU9HrfAqLK9UosLZlg==} + + mjml-head-font@4.15.3: + resolution: {integrity: sha512-CzV2aDPpiNIIgGPHNcBhgyedKY4SX3BJoTwOobSwZVIlEA6TAWB4Z9WwFUmQqZOgo1AkkiTHPZQvGcEhFFXH6g==} + + mjml-head-html-attributes@4.15.3: + resolution: {integrity: sha512-MDNDPMBOgXUZYdxhosyrA2kudiGO8aogT0/cODyi2Ed9o/1S7W+je11JUYskQbncqhWKGxNyaP4VWa+6+vUC/g==} + + mjml-head-preview@4.15.3: + resolution: {integrity: sha512-J2PxCefUVeFwsAExhrKo4lwxDevc5aKj888HBl/wN4EuWOoOg06iOGCxz4Omd8dqyFsrqvbBuPqRzQ+VycGmaA==} + + mjml-head-style@4.15.3: + resolution: {integrity: sha512-9J+JuH+mKrQU65CaJ4KZegACUgNIlYmWQYx3VOBR/tyz+8kDYX7xBhKJCjQ1I4wj2Tvga3bykd89Oc2kFZ5WOw==} + + mjml-head-title@4.15.3: + resolution: {integrity: sha512-IM59xRtsxID4DubQ0iLmoCGXguEe+9BFG4z6y2xQDrscIa4QY3KlfqgKGT69ojW+AVbXXJPEVqrAi4/eCsLItQ==} + + mjml-head@4.15.3: + resolution: {integrity: sha512-o3mRuuP/MB5fZycjD3KH/uXsnaPl7Oo8GtdbJTKtH1+O/3pz8GzGMkscTKa97l03DAG2EhGrzzLcU2A6eshwFw==} + + mjml-hero@4.15.3: + resolution: {integrity: sha512-9cLAPuc69yiuzNrMZIN58j+HMK1UWPaq2i3/Fg2ZpimfcGFKRcPGCbEVh0v+Pb6/J0+kf8yIO0leH20opu3AyQ==} + + mjml-image@4.15.3: + resolution: {integrity: sha512-g1OhSdofIytE9qaOGdTPmRIp7JsCtgO0zbsn1Fk6wQh2gEL55Z40j/VoghslWAWTgT2OHFdBKnMvWtN6U5+d2Q==} + + mjml-migrate@4.15.3: + resolution: {integrity: sha512-sr/+35RdxZroNQVegjpfRHJ5hda9XCgaS4mK2FGO+Mb1IUevKfeEPII3F/cHDpNwFeYH3kAgyqQ22ClhGLWNBA==} + hasBin: true + + mjml-navbar@4.15.3: + resolution: {integrity: sha512-VsKH/Jdlf8Yu3y7GpzQV5n7JMdpqvZvTSpF6UQXL0PWOm7k6+LX+sCZimOfpHJ+wCaaybpxokjWZ71mxOoCWoA==} + + mjml-parser-xml@4.15.3: + resolution: {integrity: sha512-Tz0UX8/JVYICLjT+U8J1f/TFxIYVYjzZHeh4/Oyta0pLpRLeZlxEd71f3u3kdnulCKMP4i37pFRDmyLXAlEuLw==} + + mjml-preset-core@4.15.3: + resolution: {integrity: sha512-1zZS8P4O0KweWUqNS655+oNnVMPQ1Rq1GaZq5S9JfwT1Vh/m516lSmiTW9oko6gGHytt5s6Yj6oOeu5Zm8FoLw==} + + mjml-raw@4.15.3: + resolution: {integrity: sha512-IGyHheOYyRchBLiAEgw3UM11kFNmBSMupu2BDdejC6ZiDhEAdG+tyERlsCwDPYtXanvFpGWULIu3XlsUPc+RZw==} + + mjml-react@2.0.8: + resolution: {integrity: sha512-3wtHZZs1Y7e7Tl+ImojD/+aPE8Z0xshMww7MKSQlD9A1E/92amWQilGZN3T+WjWWaDueKcH2Gc1RJ72PLGSRGA==} + peerDependencies: + mjml: ^4.7.0 + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 + + mjml-section@4.15.3: + resolution: {integrity: sha512-JfVPRXH++Hd933gmQfG8JXXCBCR6fIzC3DwiYycvanL/aW1cEQ2EnebUfQkt5QzlYjOkJEH+JpccAsq3ln6FZQ==} + + mjml-social@4.15.3: + resolution: {integrity: sha512-7sD5FXrESOxpT9Z4Oh36bS6u/geuUrMP1aCg2sjyAwbPcF1aWa2k9OcatQfpRf6pJEhUZ18y6/WBBXmMVmSzXg==} + + mjml-spacer@4.15.3: + resolution: {integrity: sha512-3B7Qj+17EgDdAtZ3NAdMyOwLTX1jfmJuY7gjyhS2HtcZAmppW+cxqHUBwCKfvSRgTQiccmEvtNxaQK+tfyrZqA==} + + mjml-table@4.15.3: + resolution: {integrity: sha512-FLx7DcRKTdKdcOCbMyBaeudeHaHpwPveRrBm6WyQe3LXx6FfdmOh59i71/16LFQMgBOD3N4/UJkzxLzlTJzMqQ==} + + mjml-text@4.15.3: + resolution: {integrity: sha512-+C0hxCmw9kg0XzT6vhE5mFkK6y225nC8UEQcN94K0fBCjPKkM+HqZMwGX205fzdGRi+Bxa55b/VhrIVwdv+8vw==} + + mjml-validator@4.15.3: + resolution: {integrity: sha512-Xb72KdqRwjv/qM2rJpV22syyP2N3cRQ9VVDrN6u2FSzLq02buFNxmSPJ7CKhat3PrUNdVHU75KZwOf/tz4UEhA==} + + mjml-wrapper@4.15.3: + resolution: {integrity: sha512-ditsCijeHJrmBmObtJmQ18ddLxv5oPyMTdPU8Di8APOnD2zPk7Z4UAuJSl7HXB45oFiivr3MJf4koFzMUSZ6Gg==} + + mjml@4.15.3: + resolution: {integrity: sha512-bW2WpJxm6HS+S3Yu6tq1DUPFoTxU9sPviUSmnL7Ua+oVO3WA5ILFWqvujUlz+oeuM+HCwEyMiP5xvKNPENVjYA==} + hasBin: true + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + mkdirp-infer-owner@2.0.0: + resolution: {integrity: sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==} + engines: {node: '>=10'} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + + mmdb-lib@2.1.1: + resolution: {integrity: sha512-yx8H/1H5AfnufiLnzzPqPf4yr/dKU9IFT1rPVwSkrKWHsQEeVVd6+X+L0nUbXhlEFTu3y/7hu38CFmEVgzvyeg==} + engines: {node: '>=10', npm: '>=6'} + + module-details-from-path@1.0.3: + resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} + + moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} + + monaco-editor@0.50.0: + resolution: {integrity: sha512-8CclLCmrRRh+sul7C08BmPBP3P8wVWfBHomsTcndxg5NRCEPfu/mc2AGU8k37ajjDVXcXFc12ORAMUkmk+lkFA==} + + mongodb-connection-string-url@3.0.1: + resolution: {integrity: sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==} + + mongodb@6.8.0: + resolution: {integrity: sha512-HGQ9NWDle5WvwMnrvUxsFYPd3JEbqD3RgABHBQRuoCEND0qzhsd0iH5ypHsf1eJ+sXmvmyKpP+FLOKY8Il7jMw==} + engines: {node: '>=16.20.1'} + peerDependencies: + '@aws-sdk/credential-providers': ^3.188.0 + '@mongodb-js/zstd': ^1.1.0 + gcp-metadata: ^5.2.0 + kerberos: ^2.0.1 + mongodb-client-encryption: '>=6.0.0 <7' + snappy: ^7.2.2 + socks: ^2.7.1 + peerDependenciesMeta: + '@aws-sdk/credential-providers': + optional: true + '@mongodb-js/zstd': + optional: true + gcp-metadata: + optional: true + kerberos: + optional: true + mongodb-client-encryption: + optional: true + snappy: + optional: true + socks: + optional: true + + monorel@0.4.2: + resolution: {integrity: sha512-CoMOQatkftXPegXzAh8Qnjc/+VQuiujhNjU6iWY5YZi0o2N0FKxPckja8LhKYoHBZlMt0jyKA+99EfnxjffjBQ==} + hasBin: true + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.1: + resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + multicast-dns@7.2.5: + resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} + hasBin: true + + multimatch@5.0.0: + resolution: {integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==} + engines: {node: '>=10'} + + mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nan@2.20.0: + resolution: {integrity: sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==} + + nano-css@5.6.2: + resolution: {integrity: sha512-+6bHaC8dSDGALM1HJjOHVXpuastdu2xFoZlC77Jh4cg+33Zcgm+Gxd+1xsnpZK14eyHObSp82+ll5y3SX75liw==} + peerDependencies: + react: '*' + react-dom: '*' + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + + natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + needle@3.3.1: + resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} + engines: {node: '>= 4.4.x'} + hasBin: true + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + new-date@1.0.3: + resolution: {integrity: sha512-0fsVvQPbo2I18DT2zVHpezmeeNYV2JaJSrseiHLc17GNOxJzUdx5mvSigPu8LtIfZSij5i1wXnXFspEs2CD6hA==} + + next-auth@4.24.7: + resolution: {integrity: sha512-iChjE8ov/1K/z98gdKbn2Jw+2vLgJtVV39X+rCP5SGnVQuco7QOr19FRNGMIrD8d3LYhHWV9j9sKLzq1aDWWQQ==} + peerDependencies: + next: ^12.2.5 || ^13 || ^14 + nodemailer: ^6.6.5 + react: ^17.0.2 || ^18 + react-dom: ^17.0.2 || ^18 + peerDependenciesMeta: + nodemailer: + optional: true + + next-transpile-modules@10.0.1: + resolution: {integrity: sha512-4VX/LCMofxIYAVV58UmD+kr8jQflpLWvas/BQ4Co0qWLWzVh06FoZkECkrX5eEZT6oJFqie6+kfbTA3EZCVtdQ==} + + next@14.2.5: + resolution: {integrity: sha512-0f8aRfBVL+mpzfBjYfQuLWh2WyAwtJXCRfkPF4UJ5qd2YwrHczsrSzXU4tRMV0OAxR8ZJZWPFn6uhSC56UTsLA==} + engines: {node: '>=18.17.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + sass: + optional: true + + no-case@2.3.2: + resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-abi@2.30.1: + resolution: {integrity: sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==} + + node-abi@3.65.0: + resolution: {integrity: sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==} + engines: {node: '>=10'} + + node-addon-api@2.0.2: + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + + node-cache@5.1.2: + resolution: {integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==} + engines: {node: '>= 8.0.0'} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + + node-fetch-commonjs@3.3.2: + resolution: {integrity: sha512-VBlAiynj3VMLrotgwOS3OyECFxas5y7ltLcK4t41lMUZeaK15Ym4QRkqN0EQKAFL42q9i21EPKjzLUPfltR72A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-fetch@2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-fetch@2.6.9: + resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + node-gyp-build@4.8.1: + resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} + hasBin: true + + node-gyp@8.4.1: + resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==} + engines: {node: '>= 10.12.0'} + hasBin: true + + node-gyp@9.4.1: + resolution: {integrity: sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==} + engines: {node: ^12.13 || ^14.13 || >=16} + hasBin: true + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-loader@2.0.0: + resolution: {integrity: sha512-I5VN34NO4/5UYJaUBtkrODPWxbobrE4hgDqPrjB25yPkonFhCmZ146vTH+Zg417E9Iwoh1l/MbRs1apc5J295Q==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^5.0.0 + + node-postgres@0.6.2: + resolution: {integrity: sha512-wjaW+KutPOFemtBDuogyy6OMMOs2vpSOwuqbUhFUbrDEOTk66K2lmRyvOdO4t26qGtnPyZXQ4bAuF17cBhi5aQ==} + + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + node-sql-parser@4.18.0: + resolution: {integrity: sha512-2YEOR5qlI1zUFbGMLKNfsrR5JUvFg9LxIRVE+xJe962pfVLH0rnItqLzv96XVs1Y1UIR8FxsXAuvX/lYAWZ2BQ==} + engines: {node: '>=8'} + + nodemailer@6.9.14: + resolution: {integrity: sha512-Dobp/ebDKBvz91sbtRKhcznLThrKxKt97GI2FAlAyy+fk19j73Uz3sBXolVtmcXjaorivqsbbbjDY+Jkt4/bQA==} + engines: {node: '>=6.0.0'} + + nodemon@3.1.4: + resolution: {integrity: sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==} + engines: {node: '>=10'} + hasBin: true + + noop-logger@0.1.1: + resolution: {integrity: sha512-6kM8CLXvuW5crTxsAtva2YLrRrDaiTIkIePWs9moLHqbFWT94WpNFjwS/5dfLfECg5i/lkmw3aoqVidxt23TEQ==} + + nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + + nopt@6.0.0: + resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + hasBin: true + + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-package-data@5.0.0: + resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + normalize-url@3.3.0: + resolution: {integrity: sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==} + engines: {node: '>=6'} + + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + npm-bundled@1.1.2: + resolution: {integrity: sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==} + + npm-bundled@3.0.1: + resolution: {integrity: sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-install-checks@4.0.0: + resolution: {integrity: sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==} + engines: {node: '>=10'} + + npm-install-checks@6.3.0: + resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-normalize-package-bin@1.0.1: + resolution: {integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==} + + npm-normalize-package-bin@2.0.0: + resolution: {integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-package-arg@10.1.0: + resolution: {integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-package-arg@8.1.5: + resolution: {integrity: sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==} + engines: {node: '>=10'} + + npm-packlist@3.0.0: + resolution: {integrity: sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ==} + engines: {node: '>=10'} + hasBin: true + + npm-packlist@7.0.4: + resolution: {integrity: sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-pick-manifest@6.1.1: + resolution: {integrity: sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==} + + npm-pick-manifest@8.0.2: + resolution: {integrity: sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-registry-fetch@12.0.2: + resolution: {integrity: sha512-Df5QT3RaJnXYuOwtXBXS9BWs+tHH2olvkCLh6jcR/b/u3DvPMlp3J0TvvYwplPKxHMOwfg287PYih9QqaVFoKA==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16} + + npm-registry-fetch@14.0.5: + resolution: {integrity: sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npmlog@4.1.2: + resolution: {integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==} + deprecated: This package is no longer supported. + + npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + deprecated: This package is no longer supported. + + npmlog@6.0.2: + resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + + nth-check@1.0.2: + resolution: {integrity: sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + nub@0.0.0: + resolution: {integrity: sha512-dK0Ss9C34R/vV0FfYJXuqDAqHlaW9fvWVufq9MmGF2umCuDbd5GRfRD9fpi/LiM0l4ZXf8IBB+RYmZExqCrf0w==} + + num2fraction@1.2.2: + resolution: {integrity: sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==} + + number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + + nwsapi@2.2.12: + resolution: {integrity: sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==} + + oauth@0.9.15: + resolution: {integrity: sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==} + + obj-case@0.2.1: + resolution: {integrity: sha512-PquYBBTy+Y6Ob/O2574XHhDtHJlV1cJHMCgW+rDRc9J5hhmRelJB3k5dTK/3cVmFVtzvAKuENeuLpoyTzMzkOg==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@2.2.0: + resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} + engines: {node: '>= 6'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} + + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.getownpropertydescriptors@2.1.8: + resolution: {integrity: sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==} + engines: {node: '>= 0.8'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + engines: {node: '>= 0.4'} + + obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + + oidc-token-hash@5.0.3: + resolution: {integrity: sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==} + engines: {node: ^10.13.0 || >=12.0.0} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + + once@1.3.3: + resolution: {integrity: sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + openid-client@5.6.5: + resolution: {integrity: sha512-5P4qO9nGJzB5PI0LFlhj4Dzg3m4odt0qsJTfyEtZyOlkgpILwEioOhVVJOrS1iVH494S4Ee5OCjjg6Bf5WOj3w==} + + optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + os-paths@4.4.0: + resolution: {integrity: sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg==} + engines: {node: '>= 6.0'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + + p-finally@2.0.1: + resolution: {integrity: sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==} + engines: {node: '>=8'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + + p-retry@4.6.2: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + + p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + + p-transform@1.3.0: + resolution: {integrity: sha512-UJKdSzgd3KOnXXAtqN5+/eeHcvTn1hBkesEmElVgvO/NAYcxAvmjzIGmnNd3Tb/gRAvMBdNRFD4qAWdHxY6QXg==} + engines: {node: '>=12.10.0'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + + pacote@12.0.3: + resolution: {integrity: sha512-CdYEl03JDrRO3x18uHjBYA9TyoW8gy+ThVcypcDkxPtKlw76e4ejhYB6i9lJ+/cebbjpqPW/CijjqxwDTts8Ow==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16} + hasBin: true + + pacote@15.2.0: + resolution: {integrity: sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + param-case@2.1.1: + resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} + + param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parenthesis@3.1.8: + resolution: {integrity: sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw==} + + parse-conflict-json@2.0.2: + resolution: {integrity: sha512-jDbRGb00TAPFsKWCpZZOT93SxVP9nONOSgES3AevqRq/CHvavEBvKAjxX9p5Y5F0RZLxH9Ufd9+RwtCsa+lFDA==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + parse-duration@1.1.0: + resolution: {integrity: sha512-z6t9dvSJYaPoQq7quMzdEagSFtpGu+utzHqqxmpVWNNZRIXnvqyCvn9XsTdh7c/w0Bqmdz3RB3YnRaKtpRtEXQ==} + + parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-ms@2.1.0: + resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} + engines: {node: '>=6'} + + parse-node-version@1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} + + parse5-htmlparser2-tree-adapter@7.0.0: + resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + + parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + + parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-is-inside@1.0.2: + resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-match@1.2.4: + resolution: {integrity: sha512-UWlehEdqu36jmh4h5CWJ7tARp1OEVKGHKm6+dg9qMq5RKUTV5WJrGgaZ3dN2m7WFAXDbjlHzvJvL/IUpy84Ktw==} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + + path-to-regexp@1.8.0: + resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} + + path-to-regexp@6.1.0: + resolution: {integrity: sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==} + + path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + path-type@5.0.0: + resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} + engines: {node: '>=12'} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + pg-cloudflare@1.1.1: + resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} + + pg-connection-string@2.6.4: + resolution: {integrity: sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==} + + pg-cursor@2.10.6: + resolution: {integrity: sha512-yxQGjy1GJl6BROtA4mq62Xd2izqhoGco6NYUgKXY9GMBKXfh7tGSGOhIy5K2ULerqOlJ4+3EKKj4Fog0OEKCyA==} + peerDependencies: + pg: ^8 + + pg-cursor@2.11.0: + resolution: {integrity: sha512-TLCOCtu+rqMarzjUi+/Ffc2DV5ZqO/27y5GqnK9Z3w51rWXMwC8FcO96Uf9/ORo5o+qRXEVJxM9Ts3K2K31MLg==} + peerDependencies: + pg: ^8 + + pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + + pg-minify@1.6.5: + resolution: {integrity: sha512-u0UE8veaCnMfJmoklqneeBBopOAPG3/6DHqGVHYAhz8DkJXh9dnjPlz25fRxn4e+6XVzdOp7kau63Rp52fZ3WQ==} + engines: {node: '>=14.0.0'} + + pg-numeric@1.0.2: + resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==} + engines: {node: '>=4'} + + pg-pool@3.6.2: + resolution: {integrity: sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==} + peerDependencies: + pg: '>=8.0' + + pg-promise@11.9.1: + resolution: {integrity: sha512-qvMmyDvWd64X0a25hCuWV40GLMbgeYf4z7ZmzxQqGHtUIlzMtxcMtaBHAMr7XVOL62wFv2ZVKW5pFruD/4ZAOg==} + engines: {node: '>=14.0'} + + pg-protocol@1.6.1: + resolution: {integrity: sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==} + + pg-query-stream@4.6.0: + resolution: {integrity: sha512-sg2Hewe6ge6osEY07zGu7Z8djrsQBvyiTy5ZjQffoSatEgnNNVsV3EWDm9Px/8R9oaAL1YnfnP8AXPMmfzujZg==} + peerDependencies: + pg: ^8 + + pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + + pg-types@4.0.2: + resolution: {integrity: sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==} + engines: {node: '>=10'} + + pg@8.11.6: + resolution: {integrity: sha512-6CyL4F0j3vPmakU9rWdeRY8qF5Cjc3OE86y6YpgDI6YtKHhNyCjGEIE8U5ZRfBjKTZikwolKIFWh3I22MeRnoA==} + engines: {node: '>= 8.0.0'} + peerDependencies: + pg-native: '>=3.0.1' + peerDependenciesMeta: + pg-native: + optional: true + + pg@8.12.0: + resolution: {integrity: sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==} + engines: {node: '>= 8.0.0'} + peerDependencies: + pg-native: '>=3.0.1' + peerDependenciesMeta: + pg-native: + optional: true + + pgpass@1.0.5: + resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} + + picocolors@0.2.1: + resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pify@5.0.0: + resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} + engines: {node: '>=10'} + + pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + + pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pkg-dir@7.0.0: + resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} + engines: {node: '>=14.16'} + + pkg-up@3.1.0: + resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} + engines: {node: '>=8'} + + playwright-core@1.39.0: + resolution: {integrity: sha512-+k4pdZgs1qiM+OUkSjx96YiKsXsmb59evFoqv8SKO067qBA+Z2s/dCzJij/ZhdQcs2zlTAgRKfeiiLm8PQ2qvw==} + engines: {node: '>=16'} + hasBin: true + + playwright@1.39.0: + resolution: {integrity: sha512-naE5QT11uC/Oiq0BwZ50gDmy8c8WLPRTEWuSSFVG2egBka/1qMoSqYQcROMT9zLwJ86oPofcTH2jBY/5wWOgIw==} + engines: {node: '>=16'} + hasBin: true + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss-attribute-case-insensitive@5.0.2: + resolution: {integrity: sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + + postcss-browser-comments@4.0.0: + resolution: {integrity: sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==} + engines: {node: '>=8'} + peerDependencies: + browserslist: '>=4' + postcss: '>=8' + + postcss-calc@7.0.5: + resolution: {integrity: sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==} + + postcss-calc@8.2.4: + resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} + peerDependencies: + postcss: ^8.2.2 + + postcss-clamp@4.1.0: + resolution: {integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==} + engines: {node: '>=7.6.0'} + peerDependencies: + postcss: ^8.4.6 + + postcss-color-functional-notation@4.2.4: + resolution: {integrity: sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + + postcss-color-hex-alpha@8.0.4: + resolution: {integrity: sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + + postcss-color-rebeccapurple@7.1.1: + resolution: {integrity: sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + + postcss-colormin@4.0.3: + resolution: {integrity: sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==} + engines: {node: '>=6.9.0'} + + postcss-colormin@5.3.1: + resolution: {integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-convert-values@4.0.1: + resolution: {integrity: sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==} + engines: {node: '>=6.9.0'} + + postcss-convert-values@5.1.3: + resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-custom-media@8.0.2: + resolution: {integrity: sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.3 + + postcss-custom-properties@12.1.11: + resolution: {integrity: sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + + postcss-custom-selectors@6.0.3: + resolution: {integrity: sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.3 + + postcss-dir-pseudo-class@6.0.5: + resolution: {integrity: sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + + postcss-discard-comments@4.0.2: + resolution: {integrity: sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==} + engines: {node: '>=6.9.0'} + + postcss-discard-comments@5.1.2: + resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-discard-duplicates@4.0.2: + resolution: {integrity: sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==} + engines: {node: '>=6.9.0'} + + postcss-discard-duplicates@5.1.0: + resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-discard-empty@4.0.1: + resolution: {integrity: sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==} + engines: {node: '>=6.9.0'} + + postcss-discard-empty@5.1.1: + resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-discard-overridden@4.0.1: + resolution: {integrity: sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==} + engines: {node: '>=6.9.0'} + + postcss-discard-overridden@5.1.0: + resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-double-position-gradients@3.1.2: + resolution: {integrity: sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + + postcss-env-function@4.0.6: + resolution: {integrity: sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + + postcss-flexbugs-fixes@5.0.2: + resolution: {integrity: sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==} + peerDependencies: + postcss: ^8.1.4 + + postcss-focus-visible@6.0.4: + resolution: {integrity: sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + + postcss-focus-within@5.0.4: + resolution: {integrity: sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + + postcss-font-variant@5.0.0: + resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==} + peerDependencies: + postcss: ^8.1.0 + + postcss-gap-properties@3.0.5: + resolution: {integrity: sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + + postcss-image-set-function@4.0.7: + resolution: {integrity: sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-initial@4.0.1: + resolution: {integrity: sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-lab-function@4.2.1: + resolution: {integrity: sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + + postcss-load-config@2.1.2: + resolution: {integrity: sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==} + engines: {node: '>= 4'} + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-loader@6.2.1: + resolution: {integrity: sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==} + engines: {node: '>= 12.13.0'} + peerDependencies: + postcss: ^7.0.0 || ^8.0.1 + webpack: ^5.0.0 + + postcss-logical@5.0.4: + resolution: {integrity: sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + + postcss-media-minmax@5.0.0: + resolution: {integrity: sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + postcss: ^8.1.0 + + postcss-merge-longhand@4.0.11: + resolution: {integrity: sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==} + engines: {node: '>=6.9.0'} + + postcss-merge-longhand@5.1.7: + resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-merge-rules@4.0.3: + resolution: {integrity: sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==} + engines: {node: '>=6.9.0'} + + postcss-merge-rules@5.1.4: + resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-minify-font-values@4.0.2: + resolution: {integrity: sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==} + engines: {node: '>=6.9.0'} + + postcss-minify-font-values@5.1.0: + resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-minify-gradients@4.0.2: + resolution: {integrity: sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==} + engines: {node: '>=6.9.0'} + + postcss-minify-gradients@5.1.1: + resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-minify-params@4.0.2: + resolution: {integrity: sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==} + engines: {node: '>=6.9.0'} + + postcss-minify-params@5.1.4: + resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-minify-selectors@4.0.2: + resolution: {integrity: sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==} + engines: {node: '>=6.9.0'} + + postcss-minify-selectors@5.2.1: + resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-modules-extract-imports@1.1.0: + resolution: {integrity: sha512-zF9+UIEvtpeqMGxhpeT9XaIevQSrBBCz9fi7SwfkmjVacsSj8DY5eFVgn+wY8I9vvdDDwK5xC8Myq4UkoLFIkA==} + + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@1.2.0: + resolution: {integrity: sha512-X4cquUPIaAd86raVrBwO8fwRfkIdbwFu7CTfEOjiZQHVQwlHRSkTgH5NLDmMm5+1hQO8u6dZ+TOOJDbay1hYpA==} + + postcss-modules-local-by-default@4.0.5: + resolution: {integrity: sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@1.1.0: + resolution: {integrity: sha512-LTYwnA4C1He1BKZXIx1CYiHixdSe9LWYVKadq9lK5aCCMkoOkFyZ7aigt+srfjlRplJY3gIol6KUNefdMQJdlw==} + + postcss-modules-scope@3.2.0: + resolution: {integrity: sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@1.3.0: + resolution: {integrity: sha512-i7IFaR9hlQ6/0UgFuqM6YWaCfA1Ej8WMg8A5DggnH1UGKJvTV/ugqq/KaULixzzOi3T/tF6ClBXcHGCzdd5unA==} + + postcss-modules-values@4.0.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules@2.0.0: + resolution: {integrity: sha512-eqp+Bva+U2cwQO7dECJ8/V+X+uH1HduNeITB0CPPFAu6d/8LKQ32/j+p9rQ2YL1QytVcrNU0X+fBqgGmQIA1Rw==} + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-nesting@10.2.0: + resolution: {integrity: sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + + postcss-normalize-charset@4.0.1: + resolution: {integrity: sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==} + engines: {node: '>=6.9.0'} + + postcss-normalize-charset@5.1.0: + resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-display-values@4.0.2: + resolution: {integrity: sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==} + engines: {node: '>=6.9.0'} + + postcss-normalize-display-values@5.1.0: + resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-positions@4.0.2: + resolution: {integrity: sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==} + engines: {node: '>=6.9.0'} + + postcss-normalize-positions@5.1.1: + resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-repeat-style@4.0.2: + resolution: {integrity: sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==} + engines: {node: '>=6.9.0'} + + postcss-normalize-repeat-style@5.1.1: + resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-string@4.0.2: + resolution: {integrity: sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==} + engines: {node: '>=6.9.0'} + + postcss-normalize-string@5.1.0: + resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-timing-functions@4.0.2: + resolution: {integrity: sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==} + engines: {node: '>=6.9.0'} + + postcss-normalize-timing-functions@5.1.0: + resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-unicode@4.0.1: + resolution: {integrity: sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==} + engines: {node: '>=6.9.0'} + + postcss-normalize-unicode@5.1.1: + resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-url@4.0.1: + resolution: {integrity: sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==} + engines: {node: '>=6.9.0'} + + postcss-normalize-url@5.1.0: + resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-whitespace@4.0.2: + resolution: {integrity: sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==} + engines: {node: '>=6.9.0'} + + postcss-normalize-whitespace@5.1.1: + resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize@10.0.1: + resolution: {integrity: sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==} + engines: {node: '>= 12'} + peerDependencies: + browserslist: '>= 4' + postcss: '>= 8' + + postcss-opacity-percentage@1.1.3: + resolution: {integrity: sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + + postcss-ordered-values@4.1.2: + resolution: {integrity: sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==} + engines: {node: '>=6.9.0'} + + postcss-ordered-values@5.1.3: + resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-overflow-shorthand@3.0.4: + resolution: {integrity: sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + + postcss-page-break@3.0.4: + resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==} + peerDependencies: + postcss: ^8 + + postcss-place@7.0.5: + resolution: {integrity: sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + + postcss-preset-env@7.8.3: + resolution: {integrity: sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + + postcss-pseudo-class-any-link@7.1.6: + resolution: {integrity: sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + + postcss-reduce-initial@4.0.3: + resolution: {integrity: sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==} + engines: {node: '>=6.9.0'} + + postcss-reduce-initial@5.1.2: + resolution: {integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-reduce-transforms@4.0.2: + resolution: {integrity: sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==} + engines: {node: '>=6.9.0'} + + postcss-reduce-transforms@5.1.0: + resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-replace-overflow-wrap@4.0.0: + resolution: {integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==} + peerDependencies: + postcss: ^8.0.3 + + postcss-selector-not@6.0.1: + resolution: {integrity: sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + + postcss-selector-parser@3.1.2: + resolution: {integrity: sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==} + engines: {node: '>=8'} + + postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + + postcss-selector-parser@6.1.1: + resolution: {integrity: sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==} + engines: {node: '>=4'} + + postcss-svgo@4.0.3: + resolution: {integrity: sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==} + engines: {node: '>=6.9.0'} + + postcss-svgo@5.1.0: + resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-unique-selectors@4.0.1: + resolution: {integrity: sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==} + engines: {node: '>=6.9.0'} + + postcss-unique-selectors@5.1.1: + resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-value-parser@3.3.1: + resolution: {integrity: sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@6.0.1: + resolution: {integrity: sha512-VbGX1LQgQbf9l3cZ3qbUuC3hGqIEOGQFHAEHQ/Diaeo0yLgpgK5Rb8J+OcamIfQ9PbAU/fzBjVtQX3AhJHUvZw==} + engines: {node: '>=4.0.0'} + + postcss@7.0.39: + resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} + engines: {node: '>=6.0.0'} + + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.4.40: + resolution: {integrity: sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.4.41: + resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} + engines: {node: ^10 || ^12 || >=14} + + postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + + postgres-array@3.0.2: + resolution: {integrity: sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==} + engines: {node: '>=12'} + + postgres-bytea@1.0.0: + resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} + engines: {node: '>=0.10.0'} + + postgres-bytea@3.0.0: + resolution: {integrity: sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==} + engines: {node: '>= 6'} + + postgres-date@1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + + postgres-date@2.1.0: + resolution: {integrity: sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==} + engines: {node: '>=12'} + + postgres-interval@1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + + postgres-interval@3.0.0: + resolution: {integrity: sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==} + engines: {node: '>=12'} + + postgres-range@1.1.4: + resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==} + + posthog-node@4.0.1: + resolution: {integrity: sha512-rtqm2h22QxLGBrW2bLYzbRhliIrqgZ0k+gF0LkQ1SNdeD06YE5eilV0MxZppFSxC8TfH0+B0cWCuebEnreIDgQ==} + engines: {node: '>=15.0.0'} + + preact-render-to-string@5.2.6: + resolution: {integrity: sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==} + peerDependencies: + preact: '>=10' + + preact@10.23.1: + resolution: {integrity: sha512-O5UdRsNh4vdZaTieWe3XOgSpdMAmkIYBCT3VhQDlKrzyCm8lUYsk0fmVEvoQQifoOjFRTaHZO69ylrzTW2BH+A==} + + prebuild-install@5.3.6: + resolution: {integrity: sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg==} + engines: {node: '>=6'} + hasBin: true + + prebuild-install@7.1.2: + resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} + engines: {node: '>=10'} + hasBin: true + + preferred-pm@3.1.4: + resolution: {integrity: sha512-lEHd+yEm22jXdCphDrkvIJQU66EuLojPPtvZkpKIkiD+l0DMThF/niqZKJSoU8Vl7iuvtmzyMhir9LdVy5WMnA==} + engines: {node: '>=10'} + + prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + pretty-bytes@3.0.1: + resolution: {integrity: sha512-eb7ZAeUTgfh294cElcu51w+OTRp/6ItW758LjwJSK72LDevcuJn0P4eD71PLMDGPwwatXmAmYHTkzvpKlJE3ow==} + engines: {node: '>=0.10.0'} + + pretty-bytes@5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} + + pretty-error@4.0.0: + resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} + + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + pretty-format@28.1.3: + resolution: {integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + pretty-format@3.8.0: + resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} + + pretty-ms@7.0.1: + resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} + engines: {node: '>=10'} + + prisma@5.17.0: + resolution: {integrity: sha512-m4UWkN5lBE6yevqeOxEvmepnL5cNPEjzMw2IqDB59AcEV6w7D8vGljDLd1gPFH+W6gUxw9x7/RmN5dCS/WTPxA==} + engines: {node: '>=16.13'} + hasBin: true + + prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + + proc-log@1.0.0: + resolution: {integrity: sha512-aCk8AO51s+4JyuYGg3Q/a6gnrlDO09NpVWePtjp7xwphcoQ04x5WAfCyugcsbLooWcMJ87CLkD4+604IckEdhg==} + + proc-log@3.0.0: + resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + prom-client@15.1.3: + resolution: {integrity: sha512-6ZiOBfCywsD4k1BN9IX0uZhF+tJkV8q8llP64G5Hajs4JOeVLPCwpPVcpXy3BwYiUGgyJzsJJQeOIv7+hDSq8g==} + engines: {node: ^16 || ^18 || >=20} + + promise-all-reject-late@1.0.1: + resolution: {integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==} + + promise-call-limit@1.0.2: + resolution: {integrity: sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==} + + promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + + promise.series@0.2.0: + resolution: {integrity: sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==} + engines: {node: '>=0.12'} + + promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + + promise@8.3.0: + resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} + + promisepipe@3.0.0: + resolution: {integrity: sha512-V6TbZDJ/ZswevgkDNpGt/YqNCiZP9ASfgU+p83uJE6NrGtvSGoOcHLiDCqkMs2+yg7F5qHdLV8d0aS8O26G/KA==} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + proper-lockfile@4.1.2: + resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + + properties-reader@2.3.0: + resolution: {integrity: sha512-z597WicA7nDZxK12kZqHr2TcvwNU1GCfA5UwfDY/HDp3hXPoPlb5rlEx9bwGTiJnc0OqbBTkU975jDToth8Gxw==} + engines: {node: '>=14'} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + proto3-json-serializer@2.0.2: + resolution: {integrity: sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==} + engines: {node: '>=14.0.0'} + + protobufjs@7.3.2: + resolution: {integrity: sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==} + engines: {node: '>=12.0.0'} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + + psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + + pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + + pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pure-color@1.3.0: + resolution: {integrity: sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==} + + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + + q@1.5.1: + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + deprecated: |- + You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. + + (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) + + qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + + qs@6.12.3: + resolution: {integrity: sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ==} + engines: {node: '>=0.6'} + + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + raf@3.4.1: + resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.4.1: + resolution: {integrity: sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==} + engines: {node: '>= 0.8'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + raw-loader@4.0.2: + resolution: {integrity: sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + + rc-align@4.0.15: + resolution: {integrity: sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-cascader@3.27.0: + resolution: {integrity: sha512-z5uq8VvQadFUBiuZJ7YF5UAUGNkZtdEtcEYiIA94N/Kc2MIKr6lEbN5HyVddvYSgwWlKqnL6pH5bFXFuIK3MNg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-checkbox@3.3.0: + resolution: {integrity: sha512-Ih3ZaAcoAiFKJjifzwsGiT/f/quIkxJoklW4yKGho14Olulwn8gN7hOBve0/WGDg5o/l/5mL0w7ff7/YGvefVw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-collapse@3.7.3: + resolution: {integrity: sha512-60FJcdTRn0X5sELF18TANwtVi7FtModq649H11mYF1jh83DniMoM4MqY627sEKRCTm4+WXfGDcB7hY5oW6xhyw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-dialog@9.5.2: + resolution: {integrity: sha512-qVUjc8JukG+j/pNaHVSRa2GO2/KbV2thm7yO4hepQ902eGdYK913sGkwg/fh9yhKYV1ql3BKIN2xnud3rEXAPw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-drawer@7.2.0: + resolution: {integrity: sha512-9lOQ7kBekEJRdEpScHvtmEtXnAsy+NGDXiRWc2ZVC7QXAazNVbeT4EraQKYwCME8BJLa8Bxqxvs5swwyOepRwg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-dropdown@4.2.0: + resolution: {integrity: sha512-odM8Ove+gSh0zU27DUj5cG1gNKg7mLWBYzB5E4nNLrLwBmYEgYP43vHKDGOVZcJSVElQBI0+jTQgjnq0NfLjng==} + peerDependencies: + react: '>=16.11.0' + react-dom: '>=16.11.0' + + rc-field-form@2.2.1: + resolution: {integrity: sha512-uoNqDoR7A4tn4QTSqoWPAzrR7ZwOK5I+vuZ/qdcHtbKx+ZjEsTg7QXm2wk/jalDiSksAQmATxL0T5LJkRREdIA==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-image@7.9.0: + resolution: {integrity: sha512-l4zqO5E0quuLMCtdKfBgj4Suv8tIS011F5k1zBBlK25iMjjiNHxA0VeTzGFtUZERSA45gvpXDg8/P6qNLjR25g==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-input-number@9.1.0: + resolution: {integrity: sha512-NqJ6i25Xn/AgYfVxynlevIhX3FuKlMwIFpucGG1h98SlK32wQwDK0zhN9VY32McOmuaqzftduNYWWooWz8pXQA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-input@1.5.1: + resolution: {integrity: sha512-+nOzQJDeIfIpNP/SgY45LXSKbuMlp4Yap2y8c+ZpU7XbLmNzUd6+d5/S75sA/52jsVE6S/AkhkkDEAOjIu7i6g==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + + rc-mentions@2.14.0: + resolution: {integrity: sha512-qKR59FMuF8PK4ZqsbWX3UuA5P1M/snzyqV6Yt3y1DCFbCEdqUGIBgQp6vEfLCO6Z0RoRFlzXtCeSlBTcDDpg1A==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-menu@9.14.1: + resolution: {integrity: sha512-5wlRb3M8S4yGlWhSoEYJ7ZVRElyScdcpUHxgiLxkeig1tEdyKrnED3B2fhpN0Rrpdp9jyhnmZR/Lwq2fH5VvDQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-motion@2.9.2: + resolution: {integrity: sha512-fUAhHKLDdkAXIDLH0GYwof3raS58dtNUmzLF2MeiR8o6n4thNpSDQhOqQzWE4WfFZDCi9VEN8n7tiB7czREcyw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-notification@5.6.0: + resolution: {integrity: sha512-TGQW5T7waOxLwgJG7fXcw8l7AQiFOjaZ7ISF5PrU526nunHRNcTMuzKihQHaF4E/h/KfOCDk3Mv8eqzbu2e28w==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-overflow@1.3.2: + resolution: {integrity: sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-pagination@4.2.0: + resolution: {integrity: sha512-V6qeANJsT6tmOcZ4XiUmj8JXjRLbkusuufpuoBw2GiAn94fIixYjFLmbruD1Sbhn8fPLDnWawPp4CN37zQorvw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-picker@2.7.6: + resolution: {integrity: sha512-H9if/BUJUZBOhPfWcPeT15JUI3/ntrG9muzERrXDkSoWmDj4yzmBvumozpxYrHwjcKnjyDGAke68d+whWwvhHA==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-picker@4.6.11: + resolution: {integrity: sha512-PEVH5MMTUrdvTTxCmPndsXiJL7TFLSu8q0cDdZrhdcjn8en3NbuhOFacWqKTvdnfG53RPPhiBssXCUHYyc3R/Q==} + engines: {node: '>=8.x'} + peerDependencies: + date-fns: '>= 2.x' + dayjs: '>= 1.x' + luxon: '>= 3.x' + moment: '>= 2.x' + react: '>=16.9.0' + react-dom: '>=16.9.0' + peerDependenciesMeta: + date-fns: + optional: true + dayjs: + optional: true + luxon: + optional: true + moment: + optional: true + + rc-progress@4.0.0: + resolution: {integrity: sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-rate@2.13.0: + resolution: {integrity: sha512-oxvx1Q5k5wD30sjN5tqAyWTvJfLNNJn7Oq3IeS4HxWfAiC4BOXMITNAsw7u/fzdtO4MS8Ki8uRLOzcnEuoQiAw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-resize-observer@1.4.0: + resolution: {integrity: sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-segmented@2.3.0: + resolution: {integrity: sha512-I3FtM5Smua/ESXutFfb8gJ8ZPcvFR+qUgeeGFQHBOvRiRKyAk4aBE5nfqrxXx+h8/vn60DQjOt6i4RNtrbOobg==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + + rc-select@14.15.1: + resolution: {integrity: sha512-mGvuwW1RMm1NCSI8ZUoRoLRK51R2Nb+QJnmiAvbDRcjh2//ulCkxeV6ZRFTECPpE1t2DPfyqZMPw90SVJzQ7wQ==} + engines: {node: '>=8.x'} + peerDependencies: + react: '*' + react-dom: '*' + + rc-slider@10.6.2: + resolution: {integrity: sha512-FjkoFjyvUQWcBo1F3RgSglky3ar0+qHLM41PlFVYB4Bj3RD8E/Mv7kqMouLFBU+3aFglMzzctAIWRwajEuueSw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-steps@6.0.1: + resolution: {integrity: sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-switch@4.1.0: + resolution: {integrity: sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-table@7.45.7: + resolution: {integrity: sha512-wi9LetBL1t1csxyGkMB2p3mCiMt+NDexMlPbXHvQFmBBAsMxrgNSAPwUci2zDLUq9m8QdWc1Nh8suvrpy9mXrg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-tabs@15.1.1: + resolution: {integrity: sha512-Tc7bJvpEdkWIVCUL7yQrMNBJY3j44NcyWS48jF/UKMXuUlzaXK+Z/pEL5LjGcTadtPvVmNqA40yv7hmr+tCOAw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-textarea@1.7.0: + resolution: {integrity: sha512-UxizYJkWkmxP3zofXgc487QiGyDmhhheDLLjIWbFtDmiru1ls30KpO8odDaPyqNUIy9ugj5djxTEuezIn6t3Jg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-tooltip@6.2.0: + resolution: {integrity: sha512-iS/3iOAvtDh9GIx1ulY7EFUXUtktFccNLsARo3NPgLf0QW9oT0w3dA9cYWlhqAKmD+uriEwdWz1kH0Qs4zk2Aw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-tree-select@5.22.1: + resolution: {integrity: sha512-b8mAK52xEpRgS+b2PTapCt29GoIrO5cO8jB7AfHttFsIJfcnynY9FCtnYzURsKXJkGHbFY6UzSEB2I3TETtdWg==} + peerDependencies: + react: '*' + react-dom: '*' + + rc-tree@5.8.8: + resolution: {integrity: sha512-S+mCMWo91m5AJqjz3PdzKilGgbFm7fFJRFiTDOcoRbD7UfMOPnerXwMworiga0O2XIo383UoWuEfeHs1WOltag==} + engines: {node: '>=10.x'} + peerDependencies: + react: '*' + react-dom: '*' + + rc-trigger@5.3.4: + resolution: {integrity: sha512-mQv+vas0TwKcjAO2izNPkqR4j86OemLRmvL2nOzdP9OWNWA1ivoTt5hzFqYNW9zACwmTezRiN8bttrC7cZzYSw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-upload@4.6.0: + resolution: {integrity: sha512-Zr0DT1NHw/ApxrP7UAoxOtGaVYuzarrrCVr0ld7RiEFsKX07uFhE1EpCBxwL11ruFn89GMcshOKWp+s6FLyAlA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-util@5.43.0: + resolution: {integrity: sha512-AzC7KKOXFqAdIBqdGWepL9Xn7cm3vnAmjlHqUnoQaTMZYhM4VlXGLkkHHxj/BZ7Td0+SOPKB4RGPboBVKT9htw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-virtual-list@3.14.5: + resolution: {integrity: sha512-ZMOnkCLv2wUN8Jz7yI4XiSLa9THlYvf00LuMhb1JlsQCewuU7ydPuHw1rGVPhe9VZYl/5UqODtNd7QKJ2DMGfg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + react-app-polyfill@3.0.0: + resolution: {integrity: sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==} + engines: {node: '>=14'} + + react-base16-styling@0.6.0: + resolution: {integrity: sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==} + + react-dev-utils@12.0.1: + resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=2.7' + webpack: '>=4' + peerDependenciesMeta: + typescript: + optional: true + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-error-overlay@6.0.11: + resolution: {integrity: sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==} + + react-icons@4.12.0: + resolution: {integrity: sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==} + peerDependencies: + react: '*' + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-json-view@1.21.3: + resolution: {integrity: sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==} + peerDependencies: + react: ^17.0.0 || ^16.3.0 || ^15.5.4 + react-dom: ^17.0.0 || ^16.3.0 || ^15.5.4 + + react-lifecycles-compat@3.0.4: + resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} + + react-reconciler@0.26.2: + resolution: {integrity: sha512-nK6kgY28HwrMNwDnMui3dvm3rCFjZrcGiuwLc5COUipBK5hWHLOxMJhSnSomirqWwjPBJKV1QcbkI0VJr7Gl1Q==} + engines: {node: '>=0.10.0'} + peerDependencies: + react: ^17.0.2 + + react-refresh@0.11.0: + resolution: {integrity: sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==} + engines: {node: '>=0.10.0'} + + react-router-dom@6.25.1: + resolution: {integrity: sha512-0tUDpbFvk35iv+N89dWNrJp+afLgd+y4VtorJZuOCXK0kkCWjEvb3vTJM++SYvMEpbVwXKf3FjeVveVEb6JpDQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + react-router@6.25.1: + resolution: {integrity: sha512-u8ELFr5Z6g02nUtpPAggP73Jigj1mRePSwhS/2nkTrlPU5yEkH1vYzWNyvSnSzeeE2DNqWdH+P8OhIh9wuXhTw==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + + react-scripts@5.0.1: + resolution: {integrity: sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==} + engines: {node: '>=14.0.0'} + hasBin: true + peerDependencies: + eslint: '*' + react: '>= 16' + typescript: ^3.2.1 || ^4 + peerDependenciesMeta: + typescript: + optional: true + + react-smooth@4.0.1: + resolution: {integrity: sha512-OE4hm7XqR0jNOq3Qmk9mFLyd6p2+j6bvbPJ7qlB7+oo0eNcL2l7WQzG6MBnT3EXY6xzkLMUBec3AfewJdA0J8w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + react-textarea-autosize@8.5.3: + resolution: {integrity: sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==} + engines: {node: '>=10'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + react-transition-group@4.4.5: + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + + react-universal-interface@0.6.2: + resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==} + peerDependencies: + react: '*' + tslib: '*' + + react-use@17.5.1: + resolution: {integrity: sha512-LG/uPEVRflLWMwi3j/sZqR00nF6JGqTTDblkXK2nzXsIvij06hXl1V/MZIlwj1OKIQUtlh1l9jK8gLsRyCQxMg==} + peerDependencies: + react: '*' + react-dom: '*' + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + read-cmd-shim@3.0.1: + resolution: {integrity: sha512-kEmDUoYf/CDy8yZbLTmhB1X9kkjf9Q80PCNsDMb7ufrGd6zZSQA1+UyjrO+pZm5K/S4OXCWJeiIt1JA8kAsa6g==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + read-package-json-fast@2.0.3: + resolution: {integrity: sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==} + engines: {node: '>=10'} + + read-package-json-fast@3.0.2: + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + read-package-json@6.0.4: + resolution: {integrity: sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + deprecated: This package is no longer supported. Please use @npmcli/package-json instead. + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + + readdir-scoped-modules@1.1.0: + resolution: {integrity: sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==} + deprecated: This functionality has been moved to @npmcli/fs + + readdirp@3.3.0: + resolution: {integrity: sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==} + engines: {node: '>=8.10.0'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + recharts-scale@0.4.5: + resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} + + recharts@2.12.7: + resolution: {integrity: sha512-hlLJMhPQfv4/3NBSAyq3gzGg4h2v69RJh6KU7b3pXYNNAELs9kEoXOjbkxdXpALqKBoVmVptGfLpxdaVYqjmXQ==} + engines: {node: '>=14'} + peerDependencies: + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 + + rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + + rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + + recursive-readdir@2.2.3: + resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} + engines: {node: '>=6.0.0'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + redis-errors@1.2.0: + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} + + redis-parser@3.0.0: + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} + + reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} + engines: {node: '>= 0.4'} + + regenerate-unicode-properties@10.1.1: + resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regenerator-runtime@0.10.5: + resolution: {integrity: sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==} + + regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + + regex-parser@2.3.0: + resolution: {integrity: sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==} + + regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + + regexpu-core@5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} + + regjsparser@0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + + relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + + remove-trailing-separator@1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + + renderkid@3.0.0: + resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} + + replace-ext@1.0.1: + resolution: {integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==} + engines: {node: '>= 0.10'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@3.0.0: + resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} + engines: {node: '>=4'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve-url-loader@4.0.0: + resolution: {integrity: sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==} + engines: {node: '>=8.9'} + peerDependencies: + rework: 1.0.1 + rework-visit: 1.0.0 + peerDependenciesMeta: + rework: + optional: true + rework-visit: + optional: true + + resolve.exports@1.1.1: + resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} + engines: {node: '>=10'} + + resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + + resolve@1.12.0: + resolution: {integrity: sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + retry-request@7.0.2: + resolution: {integrity: sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==} + engines: {node: '>=14'} + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rgb-regex@1.0.1: + resolution: {integrity: sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w==} + + rgba-regex@1.0.0: + resolution: {integrity: sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg==} + + rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@5.0.9: + resolution: {integrity: sha512-3i7b8OcswU6CpU8Ej89quJD4O98id7TtVM5U4Mybh84zQXdrFmDLouWBEEaD/QfO3gDDfH+AGFCGsR7kngzQnA==} + engines: {node: 14 >=14.20 || 16 >=16.20 || >=18} + hasBin: true + + rollup-plugin-babel@4.4.0: + resolution: {integrity: sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==} + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-babel. + peerDependencies: + '@babel/core': 7 || ^7.0.0-rc.2 + rollup: '>=0.60.0 <3' + + rollup-plugin-bundle-size@1.0.3: + resolution: {integrity: sha512-aWj0Pvzq90fqbI5vN1IvUrlf4utOqy+AERYxwWjegH1G8PzheMnrRIgQ5tkwKVtQMDP0bHZEACW/zLDF+XgfXQ==} + + rollup-plugin-es3@1.1.0: + resolution: {integrity: sha512-jTMqQgMZ/tkjRW4scf4ln5c0OiTSi+Lx/IEyFd41ldgGoLvvg9AQxmVOl93+KaoyB7XRYToYjiHDvO40NPF/fA==} + + rollup-plugin-postcss@2.9.0: + resolution: {integrity: sha512-Y7qDwlqjZMBexbB1kRJf+jKIQL8HR6C+ay53YzN+nNJ64hn1PNZfBE3c61hFUhD//zrMwmm7uBW30RuTi+CD0w==} + engines: {node: '>=10'} + + rollup-plugin-smart-asset@2.1.2: + resolution: {integrity: sha512-Y/gD3abliw3F20uY6ILpmH6sokXKntuTFKvDdLEJxHFcyQRsTb12u2KbsapqPZDa4JN/Nxx7BslYlZ/KmYAtPg==} + peerDependencies: + rollup: '>0.60' + + rollup-plugin-terser@5.3.1: + resolution: {integrity: sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w==} + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser + peerDependencies: + rollup: '>=0.66.0 <3' + + rollup-plugin-terser@7.0.2: + resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser + peerDependencies: + rollup: ^2.0.0 + + rollup-plugin-typescript2@0.25.3: + resolution: {integrity: sha512-ADkSaidKBovJmf5VBnZBZe+WzaZwofuvYdzGAKTN/J4hN7QJCFYAq7IrH9caxlru6T5qhX41PNFS1S4HqhsGQg==} + peerDependencies: + rollup: '>=1.26.3' + typescript: '>=2.4.0' + + rollup-pluginutils@2.8.1: + resolution: {integrity: sha512-J5oAoysWar6GuZo0s+3bZ6sVZAC0pfqKz68De7ZgDi5z63jOVZn1uJL/+z1jeKHNbGII8kAyHF5q8LnxSX5lQg==} + + rollup-pluginutils@2.8.2: + resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} + + rollup@1.32.1: + resolution: {integrity: sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==} + hasBin: true + + rollup@2.78.0: + resolution: {integrity: sha512-4+YfbQC9QEVvKTanHhIAFVUFSRsezvQF8vFOJwtGfb9Bb+r014S+qryr9PSmw8x6sMnPkmFBGAvIFVQxvJxjtg==} + engines: {node: '>=10.0.0'} + hasBin: true + + rollup@2.79.1: + resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} + engines: {node: '>=10.0.0'} + hasBin: true + + rollup@3.29.4: + resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + + rollup@4.19.1: + resolution: {integrity: sha512-K5vziVlg7hTpYfFBI+91zHBEMo6jafYXpkMlqZjg7/zhIG9iHqazBf4xz9AVdjS9BruRn280ROqLI7G3OFRIlw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rtl-css-js@1.16.1: + resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} + + run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + + run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rusha@0.8.14: + resolution: {integrity: sha512-cLgakCUf6PedEu15t8kbsjnwIFFR2D4RfL+W3iWFJ4iac7z4B0ZI8fxy4R3J956kAI68HclCFGL8MPoUVC3qVA==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-identifier@0.4.2: + resolution: {integrity: sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==} + + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sanitize.css@13.0.0: + resolution: {integrity: sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==} + + sass-loader@12.6.0: + resolution: {integrity: sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + fibers: '>= 3.1.0' + node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + sass: ^1.3.0 + sass-embedded: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + fibers: + optional: true + node-sass: + optional: true + sass: + optional: true + sass-embedded: + optional: true + + sax@1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + saxes@5.0.1: + resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} + engines: {node: '>=10'} + + scheduler@0.20.2: + resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + schema-utils@2.7.0: + resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==} + engines: {node: '>= 8.9.0'} + + schema-utils@2.7.1: + resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} + engines: {node: '>= 8.9.0'} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + schema-utils@4.2.0: + resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} + engines: {node: '>= 12.13.0'} + + scoped-regex@2.1.0: + resolution: {integrity: sha512-g3WxHrqSWCZHGHlSrF51VXFdjImhwvH8ZO/pryFH56Qi0cDsZfylQa/t0jCzVQFNbNvM00HfHjkDPEuarKDSWQ==} + engines: {node: '>=8'} + + screenfull@5.2.0: + resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} + engines: {node: '>=0.10.0'} + + scroll-into-view-if-needed@3.1.0: + resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} + + select-hose@2.0.0: + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + + selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.3.5: + resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} + engines: {node: '>=10'} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + + serialize-javascript@4.0.0: + resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + serve-index@1.9.1: + resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} + engines: {node: '>= 0.8.0'} + + serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-harmonic-interval@1.0.1: + resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==} + engines: {node: '>=6.9'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + setprototypeof@1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + + setprototypeof@1.1.1: + resolution: {integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + + shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.0.2: + resolution: {integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==} + engines: {node: '>=14'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sigstore@1.9.0: + resolution: {integrity: sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@3.1.1: + resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + + simple-git@3.25.0: + resolution: {integrity: sha512-KIY5sBnzc4yEcJXW7Tdv4viEz8KyG+nU0hay+DWZasvdFOYKeUZ6Xc25LUHHjw0tinPT7O1eY6pzX7pRT1K8rw==} + + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + + simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + slick@1.12.2: + resolution: {integrity: sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + smob@1.5.0: + resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} + + snappyjs@0.6.1: + resolution: {integrity: sha512-YIK6I2lsH072UE0aOFxxY1dPDCS43I5ktqHpeAsuLNYWkE5pGxRGWfDM4/vSUfNzXjC1Ivzt3qx31PCLmc9yqg==} + + sockjs@0.3.24: + resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + + socks-proxy-agent@6.2.1: + resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} + engines: {node: '>= 10'} + + socks-proxy-agent@7.0.0: + resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} + engines: {node: '>= 10'} + + socks@2.8.3: + resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + sort-keys@4.2.0: + resolution: {integrity: sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==} + engines: {node: '>=8'} + + source-list-map@2.0.1: + resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map-loader@3.0.2: + resolution: {integrity: sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.5.6: + resolution: {integrity: sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==} + engines: {node: '>=0.10.0'} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + + sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + + sparse-bitfield@3.0.3: + resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.18: + resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==} + + spdy-transport@3.0.0: + resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + + spdy@4.0.2: + resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} + engines: {node: '>=6.0.0'} + + spex@3.3.0: + resolution: {integrity: sha512-VNiXjFp6R4ldPbVRYbpxlD35yRHceecVXlct1J4/X80KuuPnW2AXMq3sGwhnJOhKkUsOxAT6nRGfGE5pocVw5w==} + engines: {node: '>=10.0.0'} + + split-ca@1.0.1: + resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + ssh-remote-port-forward@1.0.4: + resolution: {integrity: sha512-x0LV1eVDwjf1gmG7TTnfqIzf+3VPRz7vrNIjX6oYLbeCrf/PeVY6hkT68Mg+q02qXxQhrLjB0jfgvhevoCRmLQ==} + + ssh2@1.15.0: + resolution: {integrity: sha512-C0PHgX4h6lBxYx7hcXwu3QWdh4tg6tZZsTfXcdvc5caW/EMxaB4H9dWsl7qk+F7LAW762hp8VbXOX7x4xUYvEw==} + engines: {node: '>=10.16.0'} + + ssri@10.0.6: + resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + ssri@8.0.1: + resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} + engines: {node: '>= 8'} + + ssri@9.0.1: + resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + stable-hash@0.0.3: + resolution: {integrity: sha512-c63fvNCQ7ip1wBfPv54MflMA5L6OE5J0p6Fg13IpKft4JAFoNal8+s/jtJ8PibrwqXm4onnbeQsADs8k0NQGUA==} + + stable@0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + + stack-generator@2.0.10: + resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + + stacktrace-gps@3.1.2: + resolution: {integrity: sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==} + + stacktrace-js@2.0.2: + resolution: {integrity: sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==} + + stacktrace-parser@0.1.10: + resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} + engines: {node: '>=6'} + + standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + + stat-mode@0.3.0: + resolution: {integrity: sha512-QjMLR0A3WwFY2aZdV0okfFEJB5TRjkggXZjxP3A1RsWsNHNu3YPv8btmtc6iCFZ0Rul3FE93OYogvhOUClU+ng==} + + state-local@1.0.7: + resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} + + static-eval@2.0.2: + resolution: {integrity: sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + stop-iteration-iterator@1.0.0: + resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} + engines: {node: '>= 0.4'} + + stopwatch-node@1.1.0: + resolution: {integrity: sha512-TpRTztFjiq/B5wn84oKK0YHHtprgrC8pLOUkqVU+MN+2DgdBMaEIeSyGeAn2n+7mT9zrfJyhM33Yw4j/rRV2Bg==} + + stream-chain@2.2.5: + resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} + + stream-events@1.0.5: + resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==} + + stream-json@1.8.0: + resolution: {integrity: sha512-HZfXngYHUAr1exT4fxlbc1IOce1RYxp2ldeaf97LYCOPSoOqY/1Psp7iGvpb+6JIOgkra9zDYnPX01hGAHzEPw==} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + stream-to-array@2.3.0: + resolution: {integrity: sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==} + + stream-to-promise@2.2.0: + resolution: {integrity: sha512-HAGUASw8NT0k8JvIVutB2Y/9iBk7gpgEyAudXwNJmZERdMITGdajOa4VJfD/kNiA3TppQpTP4J+CtcHwdzKBAw==} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + string-convert@0.2.1: + resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==} + + string-hash@1.1.3: + resolution: {integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==} + + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + + string-length@5.0.1: + resolution: {integrity: sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==} + engines: {node: '>=12.20'} + + string-natural-compare@3.0.1: + resolution: {integrity: sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==} + + string-width@1.0.2: + resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} + engines: {node: '>=0.10.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string.prototype.includes@2.0.0: + resolution: {integrity: sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==} + + string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} + + string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-object@3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} + + strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom-buf@1.0.0: + resolution: {integrity: sha512-1sUIL1jck0T1mhOLP2c696BIznzT525Lkub+n4jjMHjhjhoAQA6Ye659DxdlZBr0aLDMQoTxKIpnlqxgtwjsuQ==} + engines: {node: '>=4'} + + strip-bom-stream@2.0.0: + resolution: {integrity: sha512-yH0+mD8oahBZWnY43vxs4pSinn8SMKAdml/EOGBewoe1Y0Eitd0h2Mg3ZRiXruUW6L4P+lvZiEgbh0NgUGia1w==} + engines: {node: '>=0.10.0'} + + strip-bom@2.0.0: + resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} + engines: {node: '>=0.10.0'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-comments@2.0.1: + resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} + engines: {node: '>=10'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + stripe@11.18.0: + resolution: {integrity: sha512-OUA32uhNoSoM6wOodyFbV+3IBCoO140uzdXmBArQ0S88D4EbH91xl2v+Ml1sKalcFKUBadHLeHfU/p9AbsOfGw==} + engines: {node: '>=12.*'} + + strnum@1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + + stubs@3.0.0: + resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} + + style-inject@0.3.0: + resolution: {integrity: sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==} + + style-loader@3.3.4: + resolution: {integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + + styled-jsx@5.1.1: + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + stylehacks@4.0.3: + resolution: {integrity: sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==} + engines: {node: '>=6.9.0'} + + stylehacks@5.1.1: + resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + stylis@4.3.2: + resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + + supports-color@3.2.3: + resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} + engines: {node: '>=0.8.0'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@6.1.0: + resolution: {integrity: sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==} + engines: {node: '>=6'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg-parser@2.0.4: + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + + svgo@1.3.2: + resolution: {integrity: sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==} + engines: {node: '>=4.0.0'} + deprecated: This SVGO version is no longer supported. Upgrade to v2.x.x. + hasBin: true + + svgo@2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} + hasBin: true + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + tailwindcss@3.4.7: + resolution: {integrity: sha512-rxWZbe87YJb4OcSopb7up2Ba4U82BoiSGUdoDr3Ydrg9ckxFS/YWsvhN323GMcddgU65QRy7JndC7ahhInhvlQ==} + engines: {node: '>=14.0.0'} + hasBin: true + + tapable@1.1.3: + resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} + engines: {node: '>=6'} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + tar-fs@2.0.1: + resolution: {integrity: sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==} + + tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar@4.4.18: + resolution: {integrity: sha512-ZuOtqqmkV9RE1+4odd+MhBpibmCxNP6PJhH/h2OqNuotTX7/XHPZQJv2pKvWMplFH9SIZZhitehh6vBH6LO8Pg==} + engines: {node: '>=4.5'} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} + + tdigest@0.1.2: + resolution: {integrity: sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==} + + teeny-request@9.0.0: + resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==} + engines: {node: '>=14'} + + temp-dir@2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + + tempy@0.6.0: + resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} + engines: {node: '>=10'} + + terminal-link@2.1.1: + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} + + terser-webpack-plugin@5.3.10: + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@4.8.1: + resolution: {integrity: sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==} + engines: {node: '>=6.0.0'} + hasBin: true + + terser@5.31.3: + resolution: {integrity: sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==} + engines: {node: '>=10'} + hasBin: true + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + testcontainers@9.12.0: + resolution: {integrity: sha512-zmjLTAUqCiDvhDq7TCwcyhI3m/cXXKGnhyLLJ9pgh53VgG9O+P+opX1pIx28aYTUQ7Yu6b5sJf0xoIuxoiclWg==} + engines: {node: '>= 10.16'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + textextensions@5.16.0: + resolution: {integrity: sha512-7D/r3s6uPZyU//MCYrX6I14nzauDwJ5CxazouuRGNuvSCihW87ufN6VLoROLCrHg6FblLuJrT6N2BVaPVzqElw==} + engines: {node: '>=0.8'} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + throat@6.0.2: + resolution: {integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==} + + throttle-debounce@3.0.1: + resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} + engines: {node: '>=10'} + + throttle-debounce@5.0.2: + resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==} + engines: {node: '>=12.22'} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + thunky@1.1.0: + resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + + time-span@4.0.0: + resolution: {integrity: sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==} + engines: {node: '>=10'} + + timezones-list@3.0.3: + resolution: {integrity: sha512-C+Vdvvj2c1xB6pu81pOX8geo6mrk/QsudFVlTVQET7QQwu8WAIyhDNeCrK5grU7EMzmbKLWqz7uU6dN8fvQvPQ==} + + timsort@0.3.0: + resolution: {integrity: sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==} + + tiny-glob@0.2.9: + resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tiny-lru@11.2.6: + resolution: {integrity: sha512-0PU3c9PjMnltZaFo2sGYv/nnJsMjG0Cxx8X6FXHPPGjFyoo1SJDxvUXW1207rdiSxYizf31roo+GrkIByQeZoA==} + engines: {node: '>=12'} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + tmp@0.2.3: + resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} + engines: {node: '>=14.14'} + + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + + toidentifier@1.0.0: + resolution: {integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==} + engines: {node: '>=0.6'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + touch@3.1.1: + resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} + hasBin: true + + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tr46@2.1.0: + resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} + engines: {node: '>=8'} + + tr46@4.1.1: + resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} + engines: {node: '>=14'} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + treeverse@1.0.4: + resolution: {integrity: sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==} + + tryer@1.0.1: + resolution: {integrity: sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==} + + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-easing@0.2.0: + resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + ts-jest@29.0.5: + resolution: {integrity: sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + + ts-jest@29.2.3: + resolution: {integrity: sha512-yCcfVdiBFngVz9/keHin9EnsrQtQtEu3nRykNy9RVp+FiPFFbPJ3Sg6Qg4+TkmH0vMP5qsTKgXSsk80HRwvdgQ==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/transform': ^29.0.0 + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/transform': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + + ts-loader@9.5.1: + resolution: {integrity: sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==} + engines: {node: '>=12.0.0'} + peerDependencies: + typescript: '*' + webpack: ^5.0.0 + + ts-morph@12.0.0: + resolution: {integrity: sha512-VHC8XgU2fFW7yO1f/b3mxKDje1vmyzFXHWzOYmKEkCEwcLjDtbdLgBQviqj4ZwP4MJkQtRo6Ha2I29lq/B+VxA==} + + ts-morph@13.0.3: + resolution: {integrity: sha512-pSOfUMx8Ld/WUreoSzvMFQG5i9uEiWIsBYjpU9+TTASOeUa89j5HykomeqVULm1oqWtBdleI3KEFRLrlA3zGIw==} + + ts-node-dev@2.0.0: + resolution: {integrity: sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==} + engines: {node: '>=0.8.0'} + hasBin: true + peerDependencies: + node-notifier: '*' + typescript: '*' + peerDependenciesMeta: + node-notifier: + optional: true + + ts-node@10.9.1: + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + ts-toolbelt@6.15.5: + resolution: {integrity: sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==} + + ts-toolbelt@9.6.0: + resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tsconfig@7.0.0: + resolution: {integrity: sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==} + + tslib@1.10.0: + resolution: {integrity: sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + + tuf-js@1.1.7: + resolution: {integrity: sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + turbo-darwin-64@1.2.16: + resolution: {integrity: sha512-dyitLQJdH3uLVdlH9jAkP4LqEO/K+wOXjUqOzjTciRLjQPzmsNY60/bmFHODADK4eBBl1nxbtn7tmmoT4vS1qA==} + cpu: [x64] + os: [darwin] + + turbo-darwin-arm64@1.2.16: + resolution: {integrity: sha512-Ex6uM4HU7rGXdhvJMpzNpp6qxglJ98nWeIi5qR/lBXHLjK3UCvSW8BEALArUJYJTXS9FZBq1a5LowFqXYsfDcA==} + cpu: [arm64] + os: [darwin] + + turbo-freebsd-64@1.2.16: + resolution: {integrity: sha512-onRGKMvog8B3XDssSBIAg+FrEq9pcBoAybP7bpi/uYIH1L/WQ7YMmLn88X9JX19ehYuVOVZrjap4jWH2GIkU8A==} + cpu: [x64] + os: [freebsd] + + turbo-freebsd-arm64@1.2.16: + resolution: {integrity: sha512-S0EqPqxwnJuVNNXRgcHB0r8ai8LSrpHdihVJKRM7WYmIR7isccBEf/G9agrt73sCXwjvenxFs4HDR7cSvGt14Q==} + cpu: [arm64] + os: [freebsd] + + turbo-linux-32@1.2.16: + resolution: {integrity: sha512-ecbqmGOxgTWePGrowtwyvZGfvwaLxFWmPK21cU0PS+fzoZBaVmzYmniTdd/2EkGCw7TOPhtiT22v96fWcnRycA==} + cpu: [ia32] + os: [linux] + + turbo-linux-64@1.2.16: + resolution: {integrity: sha512-q6gtdMWCzM0Sktkd73zcaQjNoeM1MjtrbwQBctWN/Sgj0eiPBPnzpIvokvx98x7RLf4qyI99/mlme0Dn5fx21A==} + cpu: [x64] + os: [linux] + + turbo-linux-arm64@1.2.16: + resolution: {integrity: sha512-gUf67tYJ/N09WAZTTmtUWYrqm381tZxiulnRGAIM+iRsaTrweyUKZaYXwJvlPpI/cQOw25wCG9/IyvxLeagL8A==} + cpu: [arm64] + os: [linux] + + turbo-linux-arm@1.2.16: + resolution: {integrity: sha512-du7uvExELNb89V3g7iM0XP21fR1Yl3EoHRcOfQz32oUqnS7idCKvbEowM9LtiluQl1dKcOIJjn1nlvvsqzkhOg==} + cpu: [arm] + os: [linux] + + turbo-linux-mips64le@1.2.16: + resolution: {integrity: sha512-U5BM+Ql3z13uRtwMmKH/8eL+9DdTgyijC2gaX4xP0RTlcN7WfAstg8Fg/Tn2Vw9vtpVDdxwpw7dvX4kw2ghhpA==} + cpu: [mips64el] + os: [linux] + + turbo-linux-ppc64le@1.2.16: + resolution: {integrity: sha512-HQWSCmVZyc5chw7Ie2ZcfZPfmM06mbEEu0Wl11Y5QWh1ZzhPNQHs/TsF4I9r146wHi62XgcrKFjkw4ARZiWsLA==} + cpu: [ppc64] + os: [linux] + + turbo-windows-32@1.2.16: + resolution: {integrity: sha512-0ZtPz5FK2qZjznMG4vvRyaabrhO8BgbN+tBx1wjXSuoICTAjYi5TwRVVRh59c3x7qQmR21Cv33CrhLBPRfeAlg==} + cpu: [ia32] + os: [win32] + + turbo-windows-64@1.2.16: + resolution: {integrity: sha512-j8iAIixq/rGfBpHNbYOosxMasZrGuMzLILEuQGDxZgKNpYgobJ15QFHQlGR9sit1b8qPU5zZX4CtByRtkgH1Bw==} + cpu: [x64] + os: [win32] + + turbo-windows-arm64@1.2.16: + resolution: {integrity: sha512-4GpcJG3B8R9WDhwfT8fu6ZmOOfseCg6Q1cy/G8/zpJQk769yYcSnD8MgQhYgHB58aVFxZcMxBvLL6UA0UrpgWA==} + cpu: [arm64] + os: [win32] + + turbo@1.2.16: + resolution: {integrity: sha512-PPUa2COKgFkyb6N3uF9AnIY3l9FZkF15QQ3U1K2wpI01D3gyGKQO0Q3DUQ4ipmciP0teBfL7H+l/QTrUA9IVvQ==} + hasBin: true + + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + + type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.16.0: + resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} + engines: {node: '>=10'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + + typescript@3.9.10: + resolution: {integrity: sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==} + engines: {node: '>=4.2.0'} + hasBin: true + + typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + engines: {node: '>=14.17'} + hasBin: true + + ua-parser-js@1.0.38: + resolution: {integrity: sha512-Aq5ppTOfvrCMgAPneW1HfWj66Xi7XL+/mIy996R1/CLS/rcyJQm6QZdsKrUeivDFQ+Oc9Wyuwor8Ze8peEoUoQ==} + + uglify-js@3.19.1: + resolution: {integrity: sha512-y/2wiW+ceTYR2TSSptAhfnEtpLaQ4Ups5zrjB2d3kuVxHj16j/QJwPl5PvuGy9uARb39J0+iKxcRPvtpsx4A4A==} + engines: {node: '>=0.8.0'} + hasBin: true + + uid-promise@1.0.0: + resolution: {integrity: sha512-R8375j0qwXyIu/7R0tjdF06/sElHqbmdmWC9M2qQHpEVbvE4I5+38KJI7LUUmQMp7NVq4tKHiBMkT0NFM453Ig==} + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + + underscore@1.12.1: + resolution: {integrity: sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + engines: {node: '>=14.0'} + + unfetch@3.1.2: + resolution: {integrity: sha512-L0qrK7ZeAudGiKYw6nzFjnJ2D5WHblUBwmHIqtPS6oKUd+Hcpk7/hKsSmcHsTlpd1TbTNsiRBUKRq3bHLNIqIw==} + + unfetch@4.2.0: + resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} + + unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + uniq@1.0.1: + resolution: {integrity: sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==} + + uniqs@2.0.0: + resolution: {integrity: sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ==} + + unique-filename@1.1.1: + resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} + + unique-filename@2.0.1: + resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + unique-filename@3.0.0: + resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + unique-slug@2.0.2: + resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} + + unique-slug@3.0.0: + resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + unique-slug@4.0.0: + resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + + universal-user-agent@6.0.1: + resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + unquote@1.1.1: + resolution: {integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==} + + untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + + upath@1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + upper-case@1.1.3: + resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + + url-template@2.0.8: + resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==} + + use-composed-ref@1.3.0: + resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + use-isomorphic-layout-effect@1.1.2: + resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-latest@1.2.1: + resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-sync-external-store@1.2.2: + resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + util.promisify@1.0.1: + resolution: {integrity: sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==} + + utila@0.4.0: + resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@10.0.0: + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + hasBin: true + + uuid@3.3.2: + resolution: {integrity: sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + v8-to-istanbul@8.1.1: + resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} + engines: {node: '>=10.12.0'} + + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} + + valid-data-url@3.0.1: + resolution: {integrity: sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA==} + engines: {node: '>=10'} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + validate-npm-package-name@3.0.0: + resolution: {integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==} + + validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + validate.io-array@1.0.6: + resolution: {integrity: sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg==} + + validate.io-function@1.0.2: + resolution: {integrity: sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ==} + + validate.io-integer-array@1.0.0: + resolution: {integrity: sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA==} + + validate.io-integer@1.0.5: + resolution: {integrity: sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ==} + + validate.io-number@1.0.3: + resolution: {integrity: sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vendors@1.0.4: + resolution: {integrity: sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==} + + vercel@35.2.3: + resolution: {integrity: sha512-sfDUnP7dmerNZ/2PrUXLC9dJnJASFMy/UGW7Y2W0LVZbMtwH+jdLnViioRUEQaA2zbkkAipKza6w9rvD4sDvrA==} + engines: {node: '>= 16'} + hasBin: true + + verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + + victory-vendor@36.9.2: + resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==} + + vinyl-file@3.0.0: + resolution: {integrity: sha512-BoJDj+ca3D9xOuPEM6RWVtWQtvEPQiQYn82LvdxhLWplfQsBzBqtgK0yhCP0s1BNTi6dH9BO+dzybvyQIacifg==} + engines: {node: '>=4'} + + vinyl@2.2.1: + resolution: {integrity: sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==} + engines: {node: '>= 0.10'} + + vlq@0.2.3: + resolution: {integrity: sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==} + + w3c-hr-time@1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + + w3c-xmlserializer@2.0.0: + resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} + engines: {node: '>=10'} + + walk-up-path@1.0.0: + resolution: {integrity: sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==} + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + watchpack@2.4.1: + resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} + engines: {node: '>=10.13.0'} + + wbuf@1.7.3: + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + web-resource-inliner@6.0.1: + resolution: {integrity: sha512-kfqDxt5dTB1JhqsCUQVFDj0rmY+4HLwGQIsLPbyrsN9y9WV/1oFDSx3BQ4GfCv9X+jVeQ7rouTqwK53rA/7t8A==} + engines: {node: '>=10.0.0'} + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + web-vitals@0.2.4: + resolution: {integrity: sha512-6BjspCO9VriYy12z356nL6JBS0GYeEcA457YyRzD+dD6XYCQ75NKhcOHUMHentOE7OcVCIXXDvOm0jKFfQG2Gg==} + + web-vitals@2.1.4: + resolution: {integrity: sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + webidl-conversions@5.0.0: + resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} + engines: {node: '>=8'} + + webidl-conversions@6.1.0: + resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} + engines: {node: '>=10.4'} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + webpack-cli@5.1.4: + resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} + engines: {node: '>=14.15.0'} + hasBin: true + peerDependencies: + '@webpack-cli/generators': '*' + webpack: 5.x.x + webpack-bundle-analyzer: '*' + webpack-dev-server: '*' + peerDependenciesMeta: + '@webpack-cli/generators': + optional: true + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true + + webpack-dev-middleware@5.3.4: + resolution: {integrity: sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + + webpack-dev-server@4.15.2: + resolution: {integrity: sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==} + engines: {node: '>= 12.13.0'} + hasBin: true + peerDependencies: + webpack: ^4.37.0 || ^5.0.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + + webpack-manifest-plugin@4.1.1: + resolution: {integrity: sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==} + engines: {node: '>=12.22.0'} + peerDependencies: + webpack: ^4.44.2 || ^5.47.0 + + webpack-merge@5.10.0: + resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} + engines: {node: '>=10.0.0'} + + webpack-sources@1.4.3: + resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} + + webpack-sources@2.3.1: + resolution: {integrity: sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==} + engines: {node: '>=10.13.0'} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack@5.93.0: + resolution: {integrity: sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + websocket-driver@0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + + websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + + whatwg-encoding@1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + + whatwg-fetch@3.6.20: + resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} + + whatwg-mimetype@2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + + whatwg-url@13.0.0: + resolution: {integrity: sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==} + engines: {node: '>=16'} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + whatwg-url@8.7.0: + resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} + engines: {node: '>=10'} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-builtin-type@1.1.4: + resolution: {integrity: sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-pm-runs@1.1.0: + resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} + engines: {node: '>=4'} + + which-pm@2.2.0: + resolution: {integrity: sha512-MOiaDbA5ZZgUjkeMWM5EkJp4loW5ZRoa5bc3/aeMox/PJelMhE6t7S/mLuiY43DBupyxH+S0U1bTui9kWUlmsw==} + engines: {node: '>=8.15'} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@3.0.1: + resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + + widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + + wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + workbox-background-sync@6.6.0: + resolution: {integrity: sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==} + + workbox-broadcast-update@6.6.0: + resolution: {integrity: sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==} + + workbox-build@6.6.0: + resolution: {integrity: sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==} + engines: {node: '>=10.0.0'} + + workbox-cacheable-response@6.6.0: + resolution: {integrity: sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==} + deprecated: workbox-background-sync@6.6.0 + + workbox-core@6.6.0: + resolution: {integrity: sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==} + + workbox-expiration@6.6.0: + resolution: {integrity: sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==} + + workbox-google-analytics@6.6.0: + resolution: {integrity: sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==} + deprecated: It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained + + workbox-navigation-preload@6.6.0: + resolution: {integrity: sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==} + + workbox-precaching@6.6.0: + resolution: {integrity: sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==} + + workbox-range-requests@6.6.0: + resolution: {integrity: sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==} + + workbox-recipes@6.6.0: + resolution: {integrity: sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==} + + workbox-routing@6.6.0: + resolution: {integrity: sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==} + + workbox-strategies@6.6.0: + resolution: {integrity: sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==} + + workbox-streams@6.6.0: + resolution: {integrity: sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==} + + workbox-sw@6.6.0: + resolution: {integrity: sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==} + + workbox-webpack-plugin@6.6.0: + resolution: {integrity: sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==} + engines: {node: '>=10.0.0'} + peerDependencies: + webpack: ^4.4.0 || ^5.9.0 + + workbox-window@6.6.0: + resolution: {integrity: sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + + write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xdg-app-paths@5.1.0: + resolution: {integrity: sha512-RAQ3WkPf4KTU1A8RtFx3gWywzVKe00tfOPFfl2NDGqbIFENQO4kqAJp7mhQjNj/33W5x5hiWWUdyfPq/5SU3QA==} + engines: {node: '>=6'} + + xdg-portable@7.3.0: + resolution: {integrity: sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw==} + engines: {node: '>= 6.0'} + + xml-name-validator@3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.5.0: + resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yauzl-clone@1.0.4: + resolution: {integrity: sha512-igM2RRCf3k8TvZoxR2oguuw4z1xasOnA31joCqHIyLkeWrvAc2Jgay5ISQ2ZplinkoGaJ6orCz56Ey456c5ESA==} + engines: {node: '>=6'} + + yauzl-promise@2.1.3: + resolution: {integrity: sha512-A1pf6fzh6eYkK0L4Qp7g9jzJSDrM6nN0bOn5T0IbY4Yo3w+YkWlHFkJP7mzknMXjqusHFHlKsK2N+4OLsK2MRA==} + engines: {node: '>=6'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yeoman-environment@3.19.3: + resolution: {integrity: sha512-/+ODrTUHtlDPRH9qIC0JREH8+7nsRcjDl3Bxn2Xo/rvAaVvixH5275jHwg0C85g4QsF4P6M2ojfScPPAl+pLAg==} + engines: {node: '>=12.10.0'} + hasBin: true + + yeoman-generator@5.10.0: + resolution: {integrity: sha512-iDUKykV7L4nDNzeYSedRmSeJ5eMYFucnKDi6KN1WNASXErgPepKqsQw55TgXPHnmpcyOh2Dd/LAZkyc+f0qaAw==} + engines: {node: '>=12.10.0'} + peerDependencies: + yeoman-environment: ^3.2.0 + peerDependenciesMeta: + yeoman-environment: + optional: true + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + engines: {node: '>=12.20'} + + yoctocolors-cjs@2.1.2: + resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + engines: {node: '>=18'} + + zip-stream@4.1.1: + resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} + engines: {node: '>= 10'} + + zod-prisma@0.5.4: + resolution: {integrity: sha512-5Ca4Qd1a1jy1T/NqCEpbr0c+EsbjJfJ/7euEHob3zDvtUK2rTuD1Rc/vfzH8q8PtaR2TZbysD88NHmrLwpv3Xg==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + decimal.js: ^10.0.0 + prisma: ^3.0.0 + zod: ^3.0.0 + peerDependenciesMeta: + decimal.js: + optional: true + + zod-to-json-schema@3.23.2: + resolution: {integrity: sha512-uSt90Gzc/tUfyNqxnjlfBs8W6WSGpNBv0rVsNxP/BVSMHMKGdthPYff4xtCHYloJGM0CFxFsb3NbC0eqPhfImw==} + peerDependencies: + zod: ^3.23.3 + + zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + + zstd-napi@0.0.6: + resolution: {integrity: sha512-CKYrptAvjMhxQTuC7J42UXdmgKc73piuZHNGg0dya6qYZzPmaH31fXxuFv7B9QGAWX8tBmFlDJo9aXne7bmx3g==} + +snapshots: + + '@adobe/css-tools@4.4.0': {} + + '@alloc/quick-lru@5.2.0': {} + + '@amplitude/ua-parser-js@0.7.33': {} + + '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - /@analytics/cookie-utils@0.2.12: - resolution: {integrity: sha512-2h/yuIu3kmu+ZJlKmlT6GoRvUEY2k1BbQBezEv5kGhnn9KpmzPz715Y3GmM2i+m7Y0QmBdVUoA260dQZkofs2A==} + '@analytics/cookie-utils@0.2.12': dependencies: '@analytics/global-storage-utils': 0.1.7 - dev: false - /@analytics/core@0.12.15(@types/dlv@1.1.4): - resolution: {integrity: sha512-Y+zxTNIbONXKxeEUOtcXs4b3uuiGjF5sy1zHl8ZNkIBwrOpTM8ZGNhi0xGL8ZhaQLGbi03BrT6DaoNNG3sBQOg==} + '@analytics/core@0.12.15(@types/dlv@1.1.4)': dependencies: '@analytics/global-storage-utils': 0.1.7 '@analytics/type-utils': 0.6.2 analytics-utils: 1.0.12(@types/dlv@1.1.4) transitivePeerDependencies: - '@types/dlv' - dev: false - /@analytics/global-storage-utils@0.1.7: - resolution: {integrity: sha512-V+spzGLZYm4biZT4uefaylm80SrLXf8WOTv9hCgA46cLcyxx3LD4GCpssp1lj+RcWLl/uXJQBRO4Mnn/o1x6Gw==} + '@analytics/global-storage-utils@0.1.7': dependencies: '@analytics/type-utils': 0.6.2 - dev: false - /@analytics/localstorage-utils@0.1.10: - resolution: {integrity: sha512-uJS+Jp1yLG5VFCgA5T82ZODYBS0xuDQx0NtAZrgbqt9j51BX3TcgmOez5LVkrUNu/lpbxjCLq35I4TKj78VmOQ==} + '@analytics/localstorage-utils@0.1.10': dependencies: '@analytics/global-storage-utils': 0.1.7 - dev: false - /@analytics/session-storage-utils@0.0.7: - resolution: {integrity: sha512-PSv40UxG96HVcjY15e3zOqU2n8IqXnH8XvTkg1X43uXNTKVSebiI2kUjA3Q7ESFbw5DPwcLbJhV7GforpuBLDw==} + '@analytics/session-storage-utils@0.0.7': dependencies: '@analytics/global-storage-utils': 0.1.7 - dev: false - /@analytics/storage-utils@0.4.2: - resolution: {integrity: sha512-AXObwyVQw9h2uJh1t2hUgabtVxzYpW+7uKVbdHQK80vr3Td5rrmCxrCxarh7HUuAgSDZ0bZWqmYxVgmwKceaLg==} + '@analytics/storage-utils@0.4.2': dependencies: '@analytics/cookie-utils': 0.2.12 '@analytics/global-storage-utils': 0.1.7 '@analytics/localstorage-utils': 0.1.10 '@analytics/session-storage-utils': 0.0.7 '@analytics/type-utils': 0.6.2 - dev: false - /@analytics/type-utils@0.6.2: - resolution: {integrity: sha512-TD+xbmsBLyYy/IxFimW/YL/9L2IEnM7/EoV9Aeh56U64Ify8o27HJcKjo38XY9Tcn0uOq1AX3thkKgvtWvwFQg==} - dev: false + '@analytics/type-utils@0.6.2': {} - /@ant-design/colors@7.1.0: - resolution: {integrity: sha512-MMoDGWn1y9LdQJQSHiCC20x3uZ3CwQnv9QMz6pCmJOrqdgM9YxsoVVY0wtrdXbmfSgnV0KNk6zi09NAhMR2jvg==} + '@ant-design/colors@7.1.0': dependencies: '@ctrl/tinycolor': 3.6.1 - /@ant-design/cssinjs-utils@1.0.3(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-BrztZZKuoYcJK8uEH40ylBemf/Mu/QPiDos56g2bv6eUoniQkgQHOCOvA3+pncoFO1TaS8xcUCIqGzDA0I+ZVQ==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + '@ant-design/cssinjs-utils@1.0.3(react-dom@18.3.1)(react@18.3.1)': dependencies: '@ant-design/cssinjs': 1.21.0(react-dom@18.3.1)(react@18.3.1) '@babel/runtime': 7.25.0 @@ -1269,11 +13697,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /@ant-design/cssinjs@1.21.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-gIilraPl+9EoKdYxnupxjHB/Q6IHNRjEXszKbDxZdsgv4sAZ9pjkCq8yanDWNvyfjp4leir2OVAJm0vxwKK8YA==} - peerDependencies: - react: '>=16.0.0' - react-dom: '>=16.0.0' + '@ant-design/cssinjs@1.21.0(react-dom@18.3.1)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 '@emotion/hash': 0.8.0 @@ -1285,15 +13709,9 @@ packages: react-dom: 18.3.1(react@18.3.1) stylis: 4.3.2 - /@ant-design/icons-svg@4.4.2: - resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==} + '@ant-design/icons-svg@4.4.2': {} - /@ant-design/icons@5.4.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-QZbWC5xQYexCI5q4/fehSEkchJr5UGtvAJweT743qKUQQGs9IH2DehNLP49DJ3Ii9m9CijD2HN6fNy3WKhIFdA==} - engines: {node: '>=8'} - peerDependencies: - react: '>=16.0.0' - react-dom: '>=16.0.0' + '@ant-design/icons@5.4.0(react-dom@18.3.1)(react@18.3.1)': dependencies: '@ant-design/colors': 7.1.0 '@ant-design/icons-svg': 4.4.2 @@ -1303,10 +13721,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /@ant-design/react-slick@1.1.2(react@18.3.1): - resolution: {integrity: sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==} - peerDependencies: - react: '>=16.9.0' + '@ant-design/react-slick@1.1.2(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 @@ -1315,37 +13730,26 @@ packages: resize-observer-polyfill: 1.5.1 throttle-debounce: 5.0.2 - /@apideck/better-ajv-errors@0.3.6(ajv@8.12.0): - resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} - engines: {node: '>=10'} - peerDependencies: - ajv: '>=8' + '@apideck/better-ajv-errors@0.3.6(ajv@8.12.0)': dependencies: ajv: 8.12.0 json-schema: 0.4.0 jsonpointer: 5.0.1 leven: 3.1.0 - dev: false - /@aws-crypto/crc32@5.2.0: - resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} - engines: {node: '>=16.0.0'} + '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 '@aws-sdk/types': 3.609.0 tslib: 2.6.3 - dev: false - /@aws-crypto/crc32c@5.2.0: - resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==} + '@aws-crypto/crc32c@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 '@aws-sdk/types': 3.609.0 tslib: 2.6.3 - dev: false - /@aws-crypto/sha1-browser@5.2.0: - resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==} + '@aws-crypto/sha1-browser@5.2.0': dependencies: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 @@ -1353,10 +13757,8 @@ packages: '@aws-sdk/util-locate-window': 3.568.0 '@smithy/util-utf8': 2.3.0 tslib: 2.6.3 - dev: false - /@aws-crypto/sha256-browser@5.2.0: - resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} + '@aws-crypto/sha256-browser@5.2.0': dependencies: '@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/supports-web-crypto': 5.2.0 @@ -1365,34 +13767,24 @@ packages: '@aws-sdk/util-locate-window': 3.568.0 '@smithy/util-utf8': 2.3.0 tslib: 2.6.3 - dev: false - /@aws-crypto/sha256-js@5.2.0: - resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} - engines: {node: '>=16.0.0'} + '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 '@aws-sdk/types': 3.609.0 tslib: 2.6.3 - dev: false - /@aws-crypto/supports-web-crypto@5.2.0: - resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} + '@aws-crypto/supports-web-crypto@5.2.0': dependencies: tslib: 2.6.3 - dev: false - /@aws-crypto/util@5.2.0: - resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} + '@aws-crypto/util@5.2.0': dependencies: '@aws-sdk/types': 3.609.0 '@smithy/util-utf8': 2.3.0 tslib: 2.6.3 - dev: false - /@aws-sdk/client-s3@3.621.0: - resolution: {integrity: sha512-YhGkd2HQTM4HCYJIAVWvfbUMpOF7XUr1W/e2LN3CFP0WTF4zcCJKesJ2iNHrExqC0Ek1+qarMxiXBK95itfjYQ==} - engines: {node: '>=16.0.0'} + '@aws-sdk/client-s3@3.621.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 @@ -1454,13 +13846,8 @@ packages: tslib: 2.6.3 transitivePeerDependencies: - aws-crt - dev: false - /@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0): - resolution: {integrity: sha512-mMjk3mFUwV2Y68POf1BQMTF+F6qxt5tPu6daEUCNGC9Cenk3h2YXQQoS4/eSyYzuBiYk3vx49VgleRvdvkg8rg==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sts': ^3.621.0 + '@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0)': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 @@ -1504,11 +13891,8 @@ packages: tslib: 2.6.3 transitivePeerDependencies: - aws-crt - dev: false - /@aws-sdk/client-sso@3.621.0: - resolution: {integrity: sha512-xpKfikN4u0BaUYZA9FGUMkkDmfoIP0Q03+A86WjqDWhcOoqNA1DkHsE4kZ+r064ifkPUfcNuUvlkVTEoBZoFjA==} - engines: {node: '>=16.0.0'} + '@aws-sdk/client-sso@3.621.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 @@ -1550,11 +13934,8 @@ packages: tslib: 2.6.3 transitivePeerDependencies: - aws-crt - dev: false - /@aws-sdk/client-sts@3.621.0: - resolution: {integrity: sha512-707uiuReSt+nAx6d0c21xLjLm2lxeKc7padxjv92CIrIocnQSlJPxSCM7r5zBhwiahJA6MNQwmTl2xznU67KgA==} - engines: {node: '>=16.0.0'} + '@aws-sdk/client-sts@3.621.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 @@ -1598,11 +13979,8 @@ packages: tslib: 2.6.3 transitivePeerDependencies: - aws-crt - dev: false - /@aws-sdk/core@3.621.0: - resolution: {integrity: sha512-CtOwWmDdEiINkGXD93iGfXjN0WmCp9l45cDWHHGa8lRgEDyhuL7bwd/pH5aSzj0j8SiQBG2k0S7DHbd5RaqvbQ==} - engines: {node: '>=16.0.0'} + '@aws-sdk/core@3.621.0': dependencies: '@smithy/core': 2.3.1 '@smithy/node-config-provider': 3.1.4 @@ -1613,21 +13991,15 @@ packages: '@smithy/util-middleware': 3.0.3 fast-xml-parser: 4.4.1 tslib: 2.6.3 - dev: false - /@aws-sdk/credential-provider-env@3.620.1: - resolution: {integrity: sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==} - engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-env@3.620.1': dependencies: '@aws-sdk/types': 3.609.0 '@smithy/property-provider': 3.1.3 '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@aws-sdk/credential-provider-http@3.621.0: - resolution: {integrity: sha512-/jc2tEsdkT1QQAI5Dvoci50DbSxtJrevemwFsm0B73pwCcOQZ5ZwwSdVqGsPutzYzUVx3bcXg3LRL7jLACqRIg==} - engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-http@3.621.0': dependencies: '@aws-sdk/types': 3.609.0 '@smithy/fetch-http-handler': 3.2.4 @@ -1638,13 +14010,8 @@ packages: '@smithy/types': 3.3.0 '@smithy/util-stream': 3.1.3 tslib: 2.6.3 - dev: false - /@aws-sdk/credential-provider-ini@3.621.0(@aws-sdk/client-sso-oidc@3.621.0)(@aws-sdk/client-sts@3.621.0): - resolution: {integrity: sha512-0EWVnSc+JQn5HLnF5Xv405M8n4zfdx9gyGdpnCmAmFqEDHA8LmBdxJdpUk1Ovp/I5oPANhjojxabIW5f1uU0RA==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sts': ^3.621.0 + '@aws-sdk/credential-provider-ini@3.621.0(@aws-sdk/client-sso-oidc@3.621.0)(@aws-sdk/client-sts@3.621.0)': dependencies: '@aws-sdk/client-sts': 3.621.0 '@aws-sdk/credential-provider-env': 3.620.1 @@ -1661,11 +14028,8 @@ packages: transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' - aws-crt - dev: false - /@aws-sdk/credential-provider-node@3.621.0(@aws-sdk/client-sso-oidc@3.621.0)(@aws-sdk/client-sts@3.621.0): - resolution: {integrity: sha512-4JqpccUgz5Snanpt2+53hbOBbJQrSFq7E1sAAbgY6BKVQUsW5qyXqnjvSF32kDeKa5JpBl3bBWLZl04IadcPHw==} - engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-node@3.621.0(@aws-sdk/client-sso-oidc@3.621.0)(@aws-sdk/client-sts@3.621.0)': dependencies: '@aws-sdk/credential-provider-env': 3.620.1 '@aws-sdk/credential-provider-http': 3.621.0 @@ -1683,22 +14047,16 @@ packages: - '@aws-sdk/client-sso-oidc' - '@aws-sdk/client-sts' - aws-crt - dev: false - /@aws-sdk/credential-provider-process@3.620.1: - resolution: {integrity: sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==} - engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-process@3.620.1': dependencies: '@aws-sdk/types': 3.609.0 '@smithy/property-provider': 3.1.3 '@smithy/shared-ini-file-loader': 3.1.4 '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@aws-sdk/credential-provider-sso@3.621.0(@aws-sdk/client-sso-oidc@3.621.0): - resolution: {integrity: sha512-Kza0jcFeA/GEL6xJlzR2KFf1PfZKMFnxfGzJzl5yN7EjoGdMijl34KaRyVnfRjnCWcsUpBWKNIDk9WZVMY9yiw==} - engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-sso@3.621.0(@aws-sdk/client-sso-oidc@3.621.0)': dependencies: '@aws-sdk/client-sso': 3.621.0 '@aws-sdk/token-providers': 3.614.0(@aws-sdk/client-sso-oidc@3.621.0) @@ -1710,24 +14068,16 @@ packages: transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' - aws-crt - dev: false - /@aws-sdk/credential-provider-web-identity@3.621.0(@aws-sdk/client-sts@3.621.0): - resolution: {integrity: sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sts': ^3.621.0 + '@aws-sdk/credential-provider-web-identity@3.621.0(@aws-sdk/client-sts@3.621.0)': dependencies: '@aws-sdk/client-sts': 3.621.0 '@aws-sdk/types': 3.609.0 '@smithy/property-provider': 3.1.3 '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@aws-sdk/middleware-bucket-endpoint@3.620.0: - resolution: {integrity: sha512-eGLL0W6L3HDb3OACyetZYOWpHJ+gLo0TehQKeQyy2G8vTYXqNTeqYhuI6up9HVjBzU9eQiULVQETmgQs7TFaRg==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-bucket-endpoint@3.620.0': dependencies: '@aws-sdk/types': 3.609.0 '@aws-sdk/util-arn-parser': 3.568.0 @@ -1736,21 +14086,15 @@ packages: '@smithy/types': 3.3.0 '@smithy/util-config-provider': 3.0.0 tslib: 2.6.3 - dev: false - /@aws-sdk/middleware-expect-continue@3.620.0: - resolution: {integrity: sha512-QXeRFMLfyQ31nAHLbiTLtk0oHzG9QLMaof5jIfqcUwnOkO8YnQdeqzakrg1Alpy/VQ7aqzIi8qypkBe2KXZz0A==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-expect-continue@3.620.0': dependencies: '@aws-sdk/types': 3.609.0 '@smithy/protocol-http': 4.1.0 '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@aws-sdk/middleware-flexible-checksums@3.620.0: - resolution: {integrity: sha512-ftz+NW7qka2sVuwnnO1IzBku5ccP+s5qZGeRTPgrKB7OzRW85gthvIo1vQR2w+OwHFk7WJbbhhWwbCbktnP4UA==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-flexible-checksums@3.620.0': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 @@ -1760,49 +14104,34 @@ packages: '@smithy/types': 3.3.0 '@smithy/util-utf8': 3.0.0 tslib: 2.6.3 - dev: false - /@aws-sdk/middleware-host-header@3.620.0: - resolution: {integrity: sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-host-header@3.620.0': dependencies: '@aws-sdk/types': 3.609.0 '@smithy/protocol-http': 4.1.0 '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@aws-sdk/middleware-location-constraint@3.609.0: - resolution: {integrity: sha512-xzsdoTkszGVqGVPjUmgoP7TORiByLueMHieI1fhQL888WPdqctwAx3ES6d/bA9Q/i8jnc6hs+Fjhy8UvBTkE9A==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-location-constraint@3.609.0': dependencies: '@aws-sdk/types': 3.609.0 '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@aws-sdk/middleware-logger@3.609.0: - resolution: {integrity: sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-logger@3.609.0': dependencies: '@aws-sdk/types': 3.609.0 '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@aws-sdk/middleware-recursion-detection@3.620.0: - resolution: {integrity: sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-recursion-detection@3.620.0': dependencies: '@aws-sdk/types': 3.609.0 '@smithy/protocol-http': 4.1.0 '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@aws-sdk/middleware-sdk-s3@3.621.0: - resolution: {integrity: sha512-CJrQrtKylcqvyPkRR16JmPZkHroCkWwLErQrg30ZcBPNNok8xbfX6cYqG16XDTnu4lSYzv2Yqc4w4oOBv8xerQ==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-sdk-s3@3.621.0': dependencies: '@aws-sdk/types': 3.609.0 '@aws-sdk/util-arn-parser': 3.568.0 @@ -1815,11 +14144,8 @@ packages: '@smithy/util-stream': 3.1.3 '@smithy/util-utf8': 3.0.0 tslib: 2.6.3 - dev: false - /@aws-sdk/middleware-signing@3.620.0: - resolution: {integrity: sha512-gxI7rubiaanUXaLfJ4NybERa9MGPNg2Ycl/OqANsozrBnR3Pw8vqy3EuVImQOyn2pJ2IFvl8ZPoSMHf4pX56FQ==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-signing@3.620.0': dependencies: '@aws-sdk/types': 3.609.0 '@smithy/property-provider': 3.1.3 @@ -1828,31 +14154,22 @@ packages: '@smithy/types': 3.3.0 '@smithy/util-middleware': 3.0.3 tslib: 2.6.3 - dev: false - /@aws-sdk/middleware-ssec@3.609.0: - resolution: {integrity: sha512-GZSD1s7+JswWOTamVap79QiDaIV7byJFssBW68GYjyRS5EBjNfwA/8s+6uE6g39R3ojyTbYOmvcANoZEhSULXg==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-ssec@3.609.0': dependencies: '@aws-sdk/types': 3.609.0 '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@aws-sdk/middleware-user-agent@3.620.0: - resolution: {integrity: sha512-bvS6etn+KsuL32ubY5D3xNof1qkenpbJXf/ugGXbg0n98DvDFQ/F+SMLxHgbnER5dsKYchNnhmtI6/FC3HFu/A==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-user-agent@3.620.0': dependencies: '@aws-sdk/types': 3.609.0 '@aws-sdk/util-endpoints': 3.614.0 '@smithy/protocol-http': 4.1.0 '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@aws-sdk/region-config-resolver@3.614.0: - resolution: {integrity: sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==} - engines: {node: '>=16.0.0'} + '@aws-sdk/region-config-resolver@3.614.0': dependencies: '@aws-sdk/types': 3.609.0 '@smithy/node-config-provider': 3.1.4 @@ -1860,11 +14177,8 @@ packages: '@smithy/util-config-provider': 3.0.0 '@smithy/util-middleware': 3.0.3 tslib: 2.6.3 - dev: false - /@aws-sdk/signature-v4-multi-region@3.621.0: - resolution: {integrity: sha512-u+ulCaHFveqHaTxgiYrEAyfBVP6GRKjnmDut67CtjhjslshPWYpo/ndtlCW1zc0RDne3uUeK13Pqp7dp7p1d6g==} - engines: {node: '>=16.0.0'} + '@aws-sdk/signature-v4-multi-region@3.621.0': dependencies: '@aws-sdk/middleware-sdk-s3': 3.621.0 '@aws-sdk/types': 3.609.0 @@ -1872,13 +14186,8 @@ packages: '@smithy/signature-v4': 4.1.0 '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@aws-sdk/token-providers@3.614.0(@aws-sdk/client-sso-oidc@3.621.0): - resolution: {integrity: sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sso-oidc': ^3.614.0 + '@aws-sdk/token-providers@3.614.0(@aws-sdk/client-sso-oidc@3.621.0)': dependencies: '@aws-sdk/client-sso-oidc': 3.621.0(@aws-sdk/client-sts@3.621.0) '@aws-sdk/types': 3.609.0 @@ -1886,86 +14195,54 @@ packages: '@smithy/shared-ini-file-loader': 3.1.4 '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@aws-sdk/types@3.609.0: - resolution: {integrity: sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==} - engines: {node: '>=16.0.0'} + '@aws-sdk/types@3.609.0': dependencies: '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@aws-sdk/util-arn-parser@3.568.0: - resolution: {integrity: sha512-XUKJWWo+KOB7fbnPP0+g/o5Ulku/X53t7i/h+sPHr5xxYTJJ9CYnbToo95mzxe7xWvkLrsNtJ8L+MnNn9INs2w==} - engines: {node: '>=16.0.0'} + '@aws-sdk/util-arn-parser@3.568.0': dependencies: tslib: 2.6.3 - dev: false - /@aws-sdk/util-endpoints@3.614.0: - resolution: {integrity: sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw==} - engines: {node: '>=16.0.0'} + '@aws-sdk/util-endpoints@3.614.0': dependencies: '@aws-sdk/types': 3.609.0 '@smithy/types': 3.3.0 '@smithy/util-endpoints': 2.0.5 tslib: 2.6.3 - dev: false - /@aws-sdk/util-locate-window@3.568.0: - resolution: {integrity: sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==} - engines: {node: '>=16.0.0'} + '@aws-sdk/util-locate-window@3.568.0': dependencies: tslib: 2.6.3 - dev: false - /@aws-sdk/util-user-agent-browser@3.609.0: - resolution: {integrity: sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==} + '@aws-sdk/util-user-agent-browser@3.609.0': dependencies: '@aws-sdk/types': 3.609.0 '@smithy/types': 3.3.0 bowser: 2.11.0 tslib: 2.6.3 - dev: false - /@aws-sdk/util-user-agent-node@3.614.0: - resolution: {integrity: sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==} - engines: {node: '>=16.0.0'} - peerDependencies: - aws-crt: '>=1.0.0' - peerDependenciesMeta: - aws-crt: - optional: true + '@aws-sdk/util-user-agent-node@3.614.0': dependencies: '@aws-sdk/types': 3.609.0 '@smithy/node-config-provider': 3.1.4 '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@aws-sdk/xml-builder@3.609.0: - resolution: {integrity: sha512-l9XxNcA4HX98rwCC2/KoiWcmEiRfZe4G+mYwDbCFT87JIMj6GBhLDkAzr/W8KAaA2IDr8Vc6J8fZPgVulxxfMA==} - engines: {node: '>=16.0.0'} + '@aws-sdk/xml-builder@3.609.0': dependencies: '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@babel/code-frame@7.24.7: - resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} - engines: {node: '>=6.9.0'} + '@babel/code-frame@7.24.7': dependencies: '@babel/highlight': 7.24.7 picocolors: 1.0.1 - /@babel/compat-data@7.25.2: - resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==} - engines: {node: '>=6.9.0'} + '@babel/compat-data@7.25.2': {} - /@babel/core@7.25.2: - resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} - engines: {node: '>=6.9.0'} + '@babel/core@7.25.2': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.24.7 @@ -1985,47 +14262,33 @@ packages: transitivePeerDependencies: - supports-color - /@babel/eslint-parser@7.25.1(@babel/core@7.25.2)(eslint@8.57.0): - resolution: {integrity: sha512-Y956ghgTT4j7rKesabkh5WeqgSFZVFwaPR0IWFm7KFHFmmJ4afbG49SmfW4S+GyRPx0Dy5jxEWA5t0rpxfElWg==} - engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} - peerDependencies: - '@babel/core': ^7.11.0 - eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 + '@babel/eslint-parser@7.25.1(@babel/core@7.25.2)(eslint@8.57.0)': dependencies: '@babel/core': 7.25.2 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 eslint: 8.57.0 eslint-visitor-keys: 2.1.0 semver: 6.3.1 - dev: false - /@babel/generator@7.25.0: - resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} - engines: {node: '>=6.9.0'} + '@babel/generator@7.25.0': dependencies: '@babel/types': 7.25.2 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 - /@babel/helper-annotate-as-pure@7.24.7: - resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} - engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.24.7': dependencies: '@babel/types': 7.25.2 - /@babel/helper-builder-binary-assignment-operator-visitor@7.24.7: - resolution: {integrity: sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==} - engines: {node: '>=6.9.0'} + '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7': dependencies: '@babel/traverse': 7.25.2 '@babel/types': 7.25.2 transitivePeerDependencies: - supports-color - /@babel/helper-compilation-targets@7.25.2: - resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} - engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.25.2': dependencies: '@babel/compat-data': 7.25.2 '@babel/helper-validator-option': 7.24.8 @@ -2033,11 +14296,7 @@ packages: lru-cache: 5.1.1 semver: 6.3.1 - /@babel/helper-create-class-features-plugin@7.25.0(@babel/core@7.25.2): - resolution: {integrity: sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-create-class-features-plugin@7.25.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.24.7 @@ -2050,21 +14309,14 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-create-regexp-features-plugin@7.25.2(@babel/core@7.25.2): - resolution: {integrity: sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-create-regexp-features-plugin@7.25.2(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.24.7 regexpu-core: 5.3.2 semver: 6.3.1 - /@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.25.2): - resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-compilation-targets': 7.25.2 @@ -2075,29 +14327,21 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-member-expression-to-functions@7.24.8: - resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==} - engines: {node: '>=6.9.0'} + '@babel/helper-member-expression-to-functions@7.24.8': dependencies: '@babel/traverse': 7.25.2 '@babel/types': 7.25.2 transitivePeerDependencies: - supports-color - /@babel/helper-module-imports@7.24.7: - resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} - engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.24.7': dependencies: '@babel/traverse': 7.25.2 '@babel/types': 7.25.2 transitivePeerDependencies: - supports-color - /@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2): - resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-module-imports': 7.24.7 @@ -2107,21 +14351,13 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-optimise-call-expression@7.24.7: - resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} - engines: {node: '>=6.9.0'} + '@babel/helper-optimise-call-expression@7.24.7': dependencies: '@babel/types': 7.25.2 - /@babel/helper-plugin-utils@7.24.8: - resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} - engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.24.8': {} - /@babel/helper-remap-async-to-generator@7.25.0(@babel/core@7.25.2): - resolution: {integrity: sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-remap-async-to-generator@7.25.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.24.7 @@ -2130,11 +14366,7 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-replace-supers@7.25.0(@babel/core@7.25.2): - resolution: {integrity: sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-replace-supers@7.25.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-member-expression-to-functions': 7.24.8 @@ -2143,39 +14375,27 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-simple-access@7.24.7: - resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} - engines: {node: '>=6.9.0'} + '@babel/helper-simple-access@7.24.7': dependencies: '@babel/traverse': 7.25.2 '@babel/types': 7.25.2 transitivePeerDependencies: - supports-color - /@babel/helper-skip-transparent-expression-wrappers@7.24.7: - resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} - engines: {node: '>=6.9.0'} + '@babel/helper-skip-transparent-expression-wrappers@7.24.7': dependencies: '@babel/traverse': 7.25.2 '@babel/types': 7.25.2 transitivePeerDependencies: - supports-color - /@babel/helper-string-parser@7.24.8: - resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} - engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.24.8': {} - /@babel/helper-validator-identifier@7.24.7: - resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} - engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.24.7': {} - /@babel/helper-validator-option@7.24.8: - resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} - engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.24.8': {} - /@babel/helper-wrap-function@7.25.0: - resolution: {integrity: sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==} - engines: {node: '>=6.9.0'} + '@babel/helper-wrap-function@7.25.0': dependencies: '@babel/template': 7.25.0 '@babel/traverse': 7.25.2 @@ -2183,34 +14403,23 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helpers@7.25.0: - resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} - engines: {node: '>=6.9.0'} + '@babel/helpers@7.25.0': dependencies: '@babel/template': 7.25.0 '@babel/types': 7.25.2 - /@babel/highlight@7.24.7: - resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} - engines: {node: '>=6.9.0'} + '@babel/highlight@7.24.7': dependencies: '@babel/helper-validator-identifier': 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.1 - /@babel/parser@7.25.0: - resolution: {integrity: sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA==} - engines: {node: '>=6.0.0'} - hasBin: true + '@babel/parser@7.25.0': dependencies: '@babel/types': 7.25.2 - /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.0(@babel/core@7.25.2): - resolution: {integrity: sha512-dG0aApncVQwAUJa8tP1VHTnmU67BeIQvKafd3raEx315H54FfkZSz3B/TT+33ZQAjatGJA79gZqTtqL5QZUKXw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 @@ -2218,29 +14427,17 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.0(@babel/core@7.25.2): - resolution: {integrity: sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.0(@babel/core@7.25.2): - resolution: {integrity: sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 @@ -2249,11 +14446,7 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.0(@babel/core@7.25.2): - resolution: {integrity: sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 @@ -2261,38 +14454,23 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.25.2): - resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 transitivePeerDependencies: - supports-color - dev: false - /@babel/plugin-proposal-class-properties@7.7.4(@babel/core@7.25.2): - resolution: {integrity: sha512-EcuXeV4Hv1X3+Q1TsuOmyyxeTRiSqurGJ26+I/FW1WbymmRRapVORm6x1Zl3iDIHyRxEs+VXWp6qnlcfcJSbbw==} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-class-properties@7.7.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 transitivePeerDependencies: - supports-color - dev: true - /@babel/plugin-proposal-decorators@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-RL9GR0pUG5Kc8BUWLNDm2T5OpYwSX15r98I0IkgmRQTXuELq/OynH8xtMTMvTJFjXbMWFVTKtYkTaYQsuAwQlQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-decorators@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) @@ -2301,36 +14479,19 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.25.2): - resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) - dev: false - /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.25.2): - resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead. - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) - dev: false - /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.25.2): - resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 @@ -2339,34 +14500,19 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.25.2): - resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead. - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 transitivePeerDependencies: - supports-color - dev: false - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2): - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - /@babel/plugin-proposal-private-property-in-object@7.21.11(@babel/core@7.25.2): - resolution: {integrity: sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead. - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-private-property-in-object@7.21.11(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.24.7 @@ -2375,217 +14521,129 @@ packages: '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) transitivePeerDependencies: - supports-color - dev: false - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.25.2): - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2): - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-decorators@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-Ui4uLJJrRV1lb38zg1yYTmRKmiZLiftDEvZN2iq3kd9kUFU+PttmzTbAFC2ucRk/XJmtek6G23gPsuZbhrT8fQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-decorators@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.25.2): - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.25.2): - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-import-assertions@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-assertions@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2): - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.25.2): - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-async-generator-functions@7.25.0(@babel/core@7.25.2): - resolution: {integrity: sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-async-generator-functions@7.25.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 @@ -2595,11 +14653,7 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-async-to-generator@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-async-to-generator@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-module-imports': 7.24.7 @@ -2608,29 +14662,17 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-block-scoping@7.25.0(@babel/core@7.25.2): - resolution: {integrity: sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-block-scoping@7.25.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-class-properties@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-class-properties@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) @@ -2638,11 +14680,7 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-class-static-block@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 + '@babel/plugin-transform-class-static-block@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) @@ -2651,11 +14689,7 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-classes@7.25.0(@babel/core@7.25.2): - resolution: {integrity: sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-classes@7.25.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.24.7 @@ -2667,69 +14701,41 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 '@babel/template': 7.25.0 - /@babel/plugin-transform-destructuring@7.24.8(@babel/core@7.25.2): - resolution: {integrity: sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-destructuring@7.24.8(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-duplicate-keys@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-duplicate-keys@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.0(@babel/core@7.25.2): - resolution: {integrity: sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-dynamic-import@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-dynamic-import@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) - /@babel/plugin-transform-exponentiation-operator@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-exponentiation-operator@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-builder-binary-assignment-operator-visitor': 7.24.7 @@ -2737,31 +14743,19 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-export-namespace-from@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-export-namespace-from@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) - /@babel/plugin-transform-flow-strip-types@7.25.2(@babel/core@7.25.2): - resolution: {integrity: sha512-InBZ0O8tew5V0K6cHcQ+wgxlrjOw1W4wDXLkOTjLRD8GYhTSkxTVBtdy3MMtvYBrbAWa1Qm3hNoTc1620Yj+Mg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-flow-strip-types@7.25.2(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.25.2) - /@babel/plugin-transform-for-of@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-for-of@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 @@ -2769,11 +14763,7 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-function-name@7.25.1(@babel/core@7.25.2): - resolution: {integrity: sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-function-name@7.25.1(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-compilation-targets': 7.25.2 @@ -2782,49 +14772,29 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) - /@babel/plugin-transform-literals@7.25.2(@babel/core@7.25.2): - resolution: {integrity: sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-literals@7.25.2(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) - /@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-modules-amd@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-amd@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) @@ -2832,11 +14802,7 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-commonjs@7.24.8(@babel/core@7.25.2): - resolution: {integrity: sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-commonjs@7.24.8(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) @@ -2845,11 +14811,7 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-systemjs@7.25.0(@babel/core@7.25.2): - resolution: {integrity: sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-systemjs@7.25.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) @@ -2859,11 +14821,7 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-umd@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-umd@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) @@ -2871,50 +14829,30 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-named-capturing-groups-regex@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/plugin-transform-named-capturing-groups-regex@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-new-target@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-new-target@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-nullish-coalescing-operator@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-nullish-coalescing-operator@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) - /@babel/plugin-transform-numeric-separator@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-numeric-separator@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) - /@babel/plugin-transform-object-rest-spread@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-object-rest-spread@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-compilation-targets': 7.25.2 @@ -2922,11 +14860,7 @@ packages: '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) - /@babel/plugin-transform-object-super@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-object-super@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 @@ -2934,21 +14868,13 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-optional-catch-binding@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-optional-catch-binding@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) - /@babel/plugin-transform-optional-chaining@7.24.8(@babel/core@7.25.2): - resolution: {integrity: sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-optional-chaining@7.24.8(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 @@ -2957,20 +14883,12 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-parameters@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-parameters@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-private-methods@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-private-methods@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) @@ -2978,11 +14896,7 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-private-property-in-object@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-private-property-in-object@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.24.7 @@ -2992,49 +14906,29 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-react-constant-elements@7.25.1(@babel/core@7.25.2): - resolution: {integrity: sha512-SLV/giH/V4SmloZ6Dt40HjTGTAIkxn33TVIHxNGNvo8ezMhrxBkzisj4op1KZYPIOHFLqhv60OHvX+YRu4xbmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-constant-elements@7.25.1(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-react-display-name@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-display-name@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-react-jsx-development@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-development@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2) transitivePeerDependencies: - supports-color - /@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2): - resolution: {integrity: sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.24.7 @@ -3045,40 +14939,24 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-react-pure-annotations@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-pure-annotations@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 regenerator-transform: 0.15.2 - /@babel/plugin-transform-reserved-words@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-reserved-words@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-runtime@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-runtime@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-module-imports': 7.24.7 @@ -3089,22 +14967,13 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: false - /@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-spread@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-spread@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 @@ -3112,38 +14981,22 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-sticky-regex@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-sticky-regex@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-typeof-symbol@7.24.8(@babel/core@7.25.2): - resolution: {integrity: sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-typeof-symbol@7.24.8(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-typescript@7.25.2(@babel/core@7.25.2): - resolution: {integrity: sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-typescript@7.25.2(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.24.7 @@ -3154,50 +15007,30 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-unicode-property-regex@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-unicode-property-regex@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-unicode-regex@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-unicode-regex@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 - /@babel/plugin-transform-unicode-sets-regex@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/plugin-transform-unicode-sets-regex@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 - /@babel/preset-env@7.25.2(@babel/core@7.25.2): - resolution: {integrity: sha512-Y2Vkwy3ITW4id9c6KXshVV/x5yCGK7VdJmKkzOzNsDZMojRKfSA/033rRbLqlRozmhRXCejxWHLSJOg/wUHfzw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/preset-env@7.25.2(@babel/core@7.25.2)': dependencies: '@babel/compat-data': 7.25.2 '@babel/core': 7.25.2 @@ -3286,33 +15119,21 @@ packages: transitivePeerDependencies: - supports-color - /@babel/preset-flow@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-NL3Lo0NorCU607zU3NwRyJbpaB6E3t0xtd3LfAQKDfkeX4/ggcDXvkmkW42QWT5owUeW/jAe4hn+2qvkV1IbfQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/preset-flow@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-validator-option': 7.24.8 '@babel/plugin-transform-flow-strip-types': 7.25.2(@babel/core@7.25.2) - dev: true - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.25.2): - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 '@babel/types': 7.25.2 esutils: 2.0.3 - /@babel/preset-react@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/preset-react@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 @@ -3324,11 +15145,7 @@ packages: transitivePeerDependencies: - supports-color - /@babel/preset-typescript@7.24.7(@babel/core@7.25.2): - resolution: {integrity: sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/preset-typescript@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 @@ -3339,26 +15156,19 @@ packages: transitivePeerDependencies: - supports-color - /@babel/regjsgen@0.8.0: - resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + '@babel/regjsgen@0.8.0': {} - /@babel/runtime@7.25.0: - resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} - engines: {node: '>=6.9.0'} + '@babel/runtime@7.25.0': dependencies: regenerator-runtime: 0.14.1 - /@babel/template@7.25.0: - resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} - engines: {node: '>=6.9.0'} + '@babel/template@7.25.0': dependencies: '@babel/code-frame': 7.24.7 '@babel/parser': 7.25.0 '@babel/types': 7.25.2 - /@babel/traverse@7.25.2: - resolution: {integrity: sha512-s4/r+a7xTnny2O6FcZzqgT6nE4/GHEdcqj4qAeglbUOh0TeglEfmNJFAd/OLoVtGd6ZhAO8GCVvCNUO5t/VJVQ==} - engines: {node: '>=6.9.0'} + '@babel/traverse@7.25.2': dependencies: '@babel/code-frame': 7.24.7 '@babel/generator': 7.25.0 @@ -3370,307 +15180,166 @@ packages: transitivePeerDependencies: - supports-color - /@babel/types@7.25.2: - resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} - engines: {node: '>=6.9.0'} + '@babel/types@7.25.2': dependencies: '@babel/helper-string-parser': 7.24.8 '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 - /@balena/dockerignore@1.0.2: - resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} - dev: true + '@balena/dockerignore@1.0.2': {} - /@bcoe/v8-coverage@0.2.3: - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@bcoe/v8-coverage@0.2.3': {} - /@clickhouse/client-common@1.4.0: - resolution: {integrity: sha512-kglG8YyWnR1K24RckUf5ZdNTN0U0s+a1j/bpCO4ZjzjO87ICgWlXFVD22pZqSACW7/2IIi1IkzbwtxKI2s/MOw==} - dev: false + '@clickhouse/client-common@1.4.0': {} - /@clickhouse/client@1.4.0: - resolution: {integrity: sha512-O4mbFPM/wQtFck01ghYI2mnNHv9jSFEiQBsTCH4t6MKeGHNAPkJGaFGv+KycLTv6zjnQNjiUGdXDMVRema5SyA==} - engines: {node: '>=16'} + '@clickhouse/client@1.4.0': dependencies: '@clickhouse/client-common': 1.4.0 - dev: false - - /@cspotcode/source-map-support@0.8.1: - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} + + '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 - /@csstools/normalize.css@12.1.1: - resolution: {integrity: sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==} - dev: false + '@csstools/normalize.css@12.1.1': {} - /@csstools/postcss-cascade-layers@1.1.1(postcss@8.4.40): - resolution: {integrity: sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 + '@csstools/postcss-cascade-layers@1.1.1(postcss@8.4.40)': dependencies: '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.1) postcss: 8.4.40 postcss-selector-parser: 6.1.1 - dev: false - /@csstools/postcss-color-function@1.1.1(postcss@8.4.40): - resolution: {integrity: sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 + '@csstools/postcss-color-function@1.1.1(postcss@8.4.40)': dependencies: '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.40) postcss: 8.4.40 postcss-value-parser: 4.2.0 - dev: false - /@csstools/postcss-font-format-keywords@1.0.1(postcss@8.4.40): - resolution: {integrity: sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 + '@csstools/postcss-font-format-keywords@1.0.1(postcss@8.4.40)': dependencies: postcss: 8.4.40 postcss-value-parser: 4.2.0 - dev: false - /@csstools/postcss-hwb-function@1.0.2(postcss@8.4.40): - resolution: {integrity: sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 + '@csstools/postcss-hwb-function@1.0.2(postcss@8.4.40)': dependencies: postcss: 8.4.40 postcss-value-parser: 4.2.0 - dev: false - /@csstools/postcss-ic-unit@1.0.1(postcss@8.4.40): - resolution: {integrity: sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 + '@csstools/postcss-ic-unit@1.0.1(postcss@8.4.40)': dependencies: '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.40) postcss: 8.4.40 postcss-value-parser: 4.2.0 - dev: false - /@csstools/postcss-is-pseudo-class@2.0.7(postcss@8.4.40): - resolution: {integrity: sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 + '@csstools/postcss-is-pseudo-class@2.0.7(postcss@8.4.40)': dependencies: '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.1) postcss: 8.4.40 postcss-selector-parser: 6.1.1 - dev: false - /@csstools/postcss-nested-calc@1.0.0(postcss@8.4.40): - resolution: {integrity: sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 + '@csstools/postcss-nested-calc@1.0.0(postcss@8.4.40)': dependencies: postcss: 8.4.40 postcss-value-parser: 4.2.0 - dev: false - /@csstools/postcss-normalize-display-values@1.0.1(postcss@8.4.40): - resolution: {integrity: sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 + '@csstools/postcss-normalize-display-values@1.0.1(postcss@8.4.40)': dependencies: postcss: 8.4.40 postcss-value-parser: 4.2.0 - dev: false - /@csstools/postcss-oklab-function@1.1.1(postcss@8.4.40): - resolution: {integrity: sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 + '@csstools/postcss-oklab-function@1.1.1(postcss@8.4.40)': dependencies: '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.40) postcss: 8.4.40 postcss-value-parser: 4.2.0 - dev: false - /@csstools/postcss-progressive-custom-properties@1.3.0(postcss@8.4.40): - resolution: {integrity: sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.3 + '@csstools/postcss-progressive-custom-properties@1.3.0(postcss@8.4.40)': dependencies: postcss: 8.4.40 postcss-value-parser: 4.2.0 - dev: false - /@csstools/postcss-stepped-value-functions@1.0.1(postcss@8.4.40): - resolution: {integrity: sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 + '@csstools/postcss-stepped-value-functions@1.0.1(postcss@8.4.40)': dependencies: postcss: 8.4.40 postcss-value-parser: 4.2.0 - dev: false - /@csstools/postcss-text-decoration-shorthand@1.0.0(postcss@8.4.40): - resolution: {integrity: sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 + '@csstools/postcss-text-decoration-shorthand@1.0.0(postcss@8.4.40)': dependencies: postcss: 8.4.40 postcss-value-parser: 4.2.0 - dev: false - /@csstools/postcss-trigonometric-functions@1.0.2(postcss@8.4.40): - resolution: {integrity: sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==} - engines: {node: ^14 || >=16} - peerDependencies: - postcss: ^8.2 + '@csstools/postcss-trigonometric-functions@1.0.2(postcss@8.4.40)': dependencies: postcss: 8.4.40 postcss-value-parser: 4.2.0 - dev: false - /@csstools/postcss-unset-value@1.0.2(postcss@8.4.40): - resolution: {integrity: sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 + '@csstools/postcss-unset-value@1.0.2(postcss@8.4.40)': dependencies: postcss: 8.4.40 - dev: false - /@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.1.1): - resolution: {integrity: sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss-selector-parser: ^6.0.10 + '@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.1.1)': dependencies: postcss-selector-parser: 6.1.1 - dev: false - /@ctrl/tinycolor@3.6.1: - resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} - engines: {node: '>=10'} + '@ctrl/tinycolor@3.6.1': {} - /@discoveryjs/json-ext@0.5.7: - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} + '@discoveryjs/json-ext@0.5.7': {} - /@dnd-kit/accessibility@3.1.0(react@18.3.1): - resolution: {integrity: sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==} - peerDependencies: - react: '>=16.8.0' + '@dnd-kit/accessibility@3.1.0(react@18.3.1)': dependencies: react: 18.3.1 tslib: 2.6.3 - dev: false - /@dnd-kit/core@6.1.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + '@dnd-kit/core@6.1.0(react-dom@18.3.1)(react@18.3.1)': dependencies: '@dnd-kit/accessibility': 3.1.0(react@18.3.1) '@dnd-kit/utilities': 3.2.2(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.6.3 - dev: false - /@dnd-kit/modifiers@6.0.1(@dnd-kit/core@6.1.0)(react@18.3.1): - resolution: {integrity: sha512-rbxcsg3HhzlcMHVHWDuh9LCjpOVAgqbV78wLGI8tziXY3+qcMQ61qVXIvNKQFuhj75dSfD+o+PYZQ/NUk2A23A==} - peerDependencies: - '@dnd-kit/core': ^6.0.6 - react: '>=16.8.0' + '@dnd-kit/modifiers@6.0.1(@dnd-kit/core@6.1.0)(react@18.3.1)': dependencies: '@dnd-kit/core': 6.1.0(react-dom@18.3.1)(react@18.3.1) '@dnd-kit/utilities': 3.2.2(react@18.3.1) react: 18.3.1 tslib: 2.6.3 - dev: false - /@dnd-kit/sortable@7.0.2(@dnd-kit/core@6.1.0)(react@18.3.1): - resolution: {integrity: sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA==} - peerDependencies: - '@dnd-kit/core': ^6.0.7 - react: '>=16.8.0' + '@dnd-kit/sortable@7.0.2(@dnd-kit/core@6.1.0)(react@18.3.1)': dependencies: '@dnd-kit/core': 6.1.0(react-dom@18.3.1)(react@18.3.1) '@dnd-kit/utilities': 3.2.2(react@18.3.1) react: 18.3.1 tslib: 2.6.3 - dev: false - /@dnd-kit/utilities@3.2.2(react@18.3.1): - resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} - peerDependencies: - react: '>=16.8.0' + '@dnd-kit/utilities@3.2.2(react@18.3.1)': dependencies: react: 18.3.1 tslib: 2.6.3 - dev: false - /@edge-runtime/format@2.2.1: - resolution: {integrity: sha512-JQTRVuiusQLNNLe2W9tnzBlV/GvSVcozLl4XZHk5swnRZ/v6jp8TqR8P7sqmJsQqblDZ3EztcWmLDbhRje/+8g==} - engines: {node: '>=16'} - dev: true + '@edge-runtime/format@2.2.1': {} - /@edge-runtime/node-utils@2.3.0: - resolution: {integrity: sha512-uUtx8BFoO1hNxtHjp3eqVPC/mWImGb2exOfGjMLUoipuWgjej+f4o/VP4bUI8U40gu7Teogd5VTeZUkGvJSPOQ==} - engines: {node: '>=16'} - dev: true + '@edge-runtime/node-utils@2.3.0': {} - /@edge-runtime/ponyfill@2.4.2: - resolution: {integrity: sha512-oN17GjFr69chu6sDLvXxdhg0Qe8EZviGSuqzR9qOiKh4MhFYGdBBcqRNzdmYeAdeRzOW2mM9yil4RftUQ7sUOA==} - engines: {node: '>=16'} - dev: true + '@edge-runtime/ponyfill@2.4.2': {} - /@edge-runtime/primitives@4.1.0: - resolution: {integrity: sha512-Vw0lbJ2lvRUqc7/soqygUX216Xb8T3WBZ987oywz6aJqRxcwSVWwr9e+Nqo2m9bxobA9mdbWNNoRY6S9eko1EQ==} - engines: {node: '>=16'} - dev: true + '@edge-runtime/primitives@4.1.0': {} - /@edge-runtime/vm@3.2.0: - resolution: {integrity: sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw==} - engines: {node: '>=16'} + '@edge-runtime/vm@3.2.0': dependencies: '@edge-runtime/primitives': 4.1.0 - dev: true - /@emotion/hash@0.8.0: - resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} + '@emotion/hash@0.8.0': {} - /@emotion/unitless@0.7.5: - resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + '@emotion/unitless@0.7.5': {} - /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': dependencies: eslint: 8.57.0 eslint-visitor-keys: 3.4.3 - /@eslint-community/regexpp@4.11.0: - resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint-community/regexpp@4.11.0': {} - /@eslint/eslintrc@2.1.4: - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 debug: 4.3.6(supports-color@5.5.0) @@ -3684,22 +15353,13 @@ packages: transitivePeerDependencies: - supports-color - /@eslint/js@8.57.0: - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/js@8.57.0': {} - /@fastify/busboy@2.1.1: - resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} - engines: {node: '>=14'} + '@fastify/busboy@2.1.1': {} - /@fastify/busboy@3.0.0: - resolution: {integrity: sha512-83rnH2nCvclWaPQQKvkJ2pdOjG4TZyEVuFDnlOF6KP08lDaaceVyw/W63mDuafQT+MKHCvXIPpE5uYWeM0rT4w==} - dev: false + '@fastify/busboy@3.0.0': {} - /@firebase/analytics-compat@0.2.13(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8): - resolution: {integrity: sha512-aZ4wGfNDMsCxhKzDbK2g1aV0JKsdQ9FbeIsjpNJPzhahV0XYj+z36Y4RNLPpG/6hHU4gxnezxs+yn3HhHkNL8w==} - peerDependencies: - '@firebase/app-compat': 0.x + '@firebase/analytics-compat@0.2.13(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8)': dependencies: '@firebase/analytics': 0.10.7(@firebase/app@0.10.8) '@firebase/analytics-types': 0.8.2 @@ -3710,13 +15370,9 @@ packages: transitivePeerDependencies: - '@firebase/app' - /@firebase/analytics-types@0.8.2: - resolution: {integrity: sha512-EnzNNLh+9/sJsimsA/FGqzakmrAUKLeJvjRHlg8df1f97NLUlFidk9600y0ZgWOp3CAxn6Hjtk+08tixlUOWyw==} + '@firebase/analytics-types@0.8.2': {} - /@firebase/analytics@0.10.7(@firebase/app@0.10.8): - resolution: {integrity: sha512-GE29uTT6y/Jv2EP0OjpTezeTQZ5FTCTaZXKrrdVGjb/t35AU4u/jiU+hUwUPpuK8fqhhiHkS/AawE3a3ZK/a9Q==} - peerDependencies: - '@firebase/app': 0.x + '@firebase/analytics@0.10.7(@firebase/app@0.10.8)': dependencies: '@firebase/app': 0.10.8 '@firebase/component': 0.6.8 @@ -3725,10 +15381,7 @@ packages: '@firebase/util': 1.9.7 tslib: 2.6.3 - /@firebase/app-check-compat@0.3.14(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8): - resolution: {integrity: sha512-kK3bPfojAfXE53W+20rxMqIxrloFswXG9vh4kEdYL6Wa2IB3sD5++2dPiK3yGxl8oQiqS8qL2wcKB5/xLpEVEg==} - peerDependencies: - '@firebase/app-compat': 0.x + '@firebase/app-check-compat@0.3.14(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8)': dependencies: '@firebase/app-check': 0.8.7(@firebase/app@0.10.8) '@firebase/app-check-types': 0.5.2 @@ -3740,16 +15393,11 @@ packages: transitivePeerDependencies: - '@firebase/app' - /@firebase/app-check-interop-types@0.3.2: - resolution: {integrity: sha512-LMs47Vinv2HBMZi49C09dJxp0QT5LwDzFaVGf/+ITHe3BlIhUiLNttkATSXplc89A2lAaeTqjgqVkiRfUGyQiQ==} + '@firebase/app-check-interop-types@0.3.2': {} - /@firebase/app-check-types@0.5.2: - resolution: {integrity: sha512-FSOEzTzL5bLUbD2co3Zut46iyPWML6xc4x+78TeaXMSuJap5QObfb+rVvZJtla3asN4RwU7elaQaduP+HFizDA==} + '@firebase/app-check-types@0.5.2': {} - /@firebase/app-check@0.8.7(@firebase/app@0.10.8): - resolution: {integrity: sha512-EkOeJcMKVR0zZ6z/jqcFTqHb/xq+TVIRIuBNGHdpcIuFU1czhSlegvqv2+nC+nFrkD8M6Xvd3tAlUOkdbMeS6A==} - peerDependencies: - '@firebase/app': 0.x + '@firebase/app-check@0.8.7(@firebase/app@0.10.8)': dependencies: '@firebase/app': 0.10.8 '@firebase/component': 0.6.8 @@ -3757,8 +15405,7 @@ packages: '@firebase/util': 1.9.7 tslib: 2.6.3 - /@firebase/app-compat@0.2.38: - resolution: {integrity: sha512-36ZrSvkYLW7QR01Sii2X+IY18ErMpRg6e2B2f/DVTtJBolthwXOnNBps+wvaVBvegdvdVPspgDXZUV0ppqh45w==} + '@firebase/app-compat@0.2.38': dependencies: '@firebase/app': 0.10.8 '@firebase/component': 0.6.8 @@ -3766,11 +15413,9 @@ packages: '@firebase/util': 1.9.7 tslib: 2.6.3 - /@firebase/app-types@0.9.2: - resolution: {integrity: sha512-oMEZ1TDlBz479lmABwWsWjzHwheQKiAgnuKxE0pz0IXCVx7/rtlkx1fQ6GfgK24WCrxDKMplZrT50Kh04iMbXQ==} + '@firebase/app-types@0.9.2': {} - /@firebase/app@0.10.8: - resolution: {integrity: sha512-xSLmW0/RShcnUEXH7l+wC0AFWaUtty4tUFF2loIgbtXTRmra0UH/SqYDf/IcfreUninRrCsusNmvoTidGkXJPw==} + '@firebase/app@0.10.8': dependencies: '@firebase/component': 0.6.8 '@firebase/logger': 0.4.2 @@ -3778,10 +15423,7 @@ packages: idb: 7.1.1 tslib: 2.6.3 - /@firebase/auth-compat@0.5.11(@firebase/app-compat@0.2.38)(@firebase/app-types@0.9.2)(@firebase/app@0.10.8): - resolution: {integrity: sha512-7rE3MkQDoWwI2qd8qsra4/QZCO2GzQSbCL6AVQpult9+Nbimg+5A+YeHxpLTcYAxUV6HDg2CqTDQreFLhcm1CQ==} - peerDependencies: - '@firebase/app-compat': 0.x + '@firebase/auth-compat@0.5.11(@firebase/app-compat@0.2.38)(@firebase/app-types@0.9.2)(@firebase/app@0.10.8)': dependencies: '@firebase/app-compat': 0.2.38 '@firebase/auth': 1.7.6(@firebase/app@0.10.8) @@ -3795,26 +15437,14 @@ packages: - '@firebase/app-types' - '@react-native-async-storage/async-storage' - /@firebase/auth-interop-types@0.2.3: - resolution: {integrity: sha512-Fc9wuJGgxoxQeavybiuwgyi+0rssr76b+nHpj+eGhXFYAdudMWyfBHvFL/I5fEHniUM/UQdFzi9VXJK2iZF7FQ==} + '@firebase/auth-interop-types@0.2.3': {} - /@firebase/auth-types@0.12.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.7): - resolution: {integrity: sha512-qsEBaRMoGvHO10unlDJhaKSuPn4pyoTtlQuP1ghZfzB6rNQPuhp/N/DcFZxm9i4v0SogjCbf9reWupwIvfmH6w==} - peerDependencies: - '@firebase/app-types': 0.x - '@firebase/util': 1.x + '@firebase/auth-types@0.12.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.7)': dependencies: '@firebase/app-types': 0.9.2 '@firebase/util': 1.9.7 - /@firebase/auth@1.7.6(@firebase/app@0.10.8): - resolution: {integrity: sha512-T+lA5xoug9CByGYkD5WkfTh2ujEYq/frGZPbk0H+fNU6fNl7nqg88KcsmzsC6Fsqbjm3LLEb/i6wJvF6NSNEig==} - peerDependencies: - '@firebase/app': 0.x - '@react-native-async-storage/async-storage': ^1.18.1 - peerDependenciesMeta: - '@react-native-async-storage/async-storage': - optional: true + '@firebase/auth@1.7.6(@firebase/app@0.10.8)': dependencies: '@firebase/app': 0.10.8 '@firebase/component': 0.6.8 @@ -3823,14 +15453,12 @@ packages: tslib: 2.6.3 undici: 5.28.4 - /@firebase/component@0.6.8: - resolution: {integrity: sha512-LcNvxGLLGjBwB0dJUsBGCej2fqAepWyBubs4jt1Tiuns7QLbXHuyObZ4aMeBjZjWx4m8g1LoVI9QFpSaq/k4/g==} + '@firebase/component@0.6.8': dependencies: '@firebase/util': 1.9.7 tslib: 2.6.3 - /@firebase/database-compat@1.0.6: - resolution: {integrity: sha512-1OGA0sLY47mkXjhICCrUTXEYFnSSXoiXWm1SHsN62b+Lzs5aKA3aWTjTUmYIoK93kDAMPkYpulSv8jcbH4Hwew==} + '@firebase/database-compat@1.0.6': dependencies: '@firebase/component': 0.6.8 '@firebase/database': 1.0.6 @@ -3838,10 +15466,8 @@ packages: '@firebase/logger': 0.4.2 '@firebase/util': 1.9.7 tslib: 2.6.3 - dev: false - /@firebase/database-compat@1.0.7: - resolution: {integrity: sha512-R/3B+VVzEFN5YcHmfWns3eitA8fHLTL03io+FIoMcTYkajFnrBdS3A+g/KceN9omP7FYYYGTQWF9lvbEx6eMEg==} + '@firebase/database-compat@1.0.7': dependencies: '@firebase/component': 0.6.8 '@firebase/database': 1.0.7 @@ -3850,14 +15476,12 @@ packages: '@firebase/util': 1.9.7 tslib: 2.6.3 - /@firebase/database-types@1.0.4: - resolution: {integrity: sha512-mz9ZzbH6euFXbcBo+enuJ36I5dR5w+enJHHjy9Y5ThCdKUseqfDjW3vCp1YxE9zygFCSjJJ/z1cQ+zodvUcwPQ==} + '@firebase/database-types@1.0.4': dependencies: '@firebase/app-types': 0.9.2 '@firebase/util': 1.9.7 - /@firebase/database@1.0.6: - resolution: {integrity: sha512-nrexUEG/fpVlHtWKkyfhTC3834kZ1WS7voNyqbBsBCqHXQOvznN5Z0L3nxBqdXSJyltNAf4ndFlQqm5gZiEczQ==} + '@firebase/database@1.0.6': dependencies: '@firebase/app-check-interop-types': 0.3.2 '@firebase/auth-interop-types': 0.2.3 @@ -3866,10 +15490,8 @@ packages: '@firebase/util': 1.9.7 faye-websocket: 0.11.4 tslib: 2.6.3 - dev: false - /@firebase/database@1.0.7: - resolution: {integrity: sha512-wjXr5AO8RPxVVg7rRCYffT7FMtBjHRfJ9KMwi19MbOf0vBf0H9YqW3WCgcnLpXI6ehiUcU3z3qgPnnU0nK6SnA==} + '@firebase/database@1.0.7': dependencies: '@firebase/app-check-interop-types': 0.3.2 '@firebase/auth-interop-types': 0.2.3 @@ -3879,10 +15501,7 @@ packages: faye-websocket: 0.11.4 tslib: 2.6.3 - /@firebase/firestore-compat@0.3.34(@firebase/app-compat@0.2.38)(@firebase/app-types@0.9.2)(@firebase/app@0.10.8): - resolution: {integrity: sha512-OBP2F/Ccydl2U2j8XIfpKBxf0EnQHEhbZ4LTwbSS2QlG9+8TwhvKFkKk/ZljWYqaype+qFKPuXZ5flCqYEETeA==} - peerDependencies: - '@firebase/app-compat': 0.x + '@firebase/firestore-compat@0.3.34(@firebase/app-compat@0.2.38)(@firebase/app-types@0.9.2)(@firebase/app@0.10.8)': dependencies: '@firebase/app-compat': 0.2.38 '@firebase/component': 0.6.8 @@ -3894,20 +15513,12 @@ packages: - '@firebase/app' - '@firebase/app-types' - /@firebase/firestore-types@3.0.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.7): - resolution: {integrity: sha512-wp1A+t5rI2Qc/2q7r2ZpjUXkRVPtGMd6zCLsiWurjsQpqPgFin3AhNibKcIzoF2rnToNa/XYtyWXuifjOOwDgg==} - peerDependencies: - '@firebase/app-types': 0.x - '@firebase/util': 1.x + '@firebase/firestore-types@3.0.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.7)': dependencies: '@firebase/app-types': 0.9.2 '@firebase/util': 1.9.7 - /@firebase/firestore@4.6.5(@firebase/app@0.10.8): - resolution: {integrity: sha512-0+Ascaht4qUzj4pCopMPWmoAujk8HKjwCpaNYOOjbYMZ65RVfZPsfZwwbWi/zWMXj6xvPsai5oBiErUUkrLwNw==} - engines: {node: '>=10.10.0'} - peerDependencies: - '@firebase/app': 0.x + '@firebase/firestore@4.6.5(@firebase/app@0.10.8)': dependencies: '@firebase/app': 0.10.8 '@firebase/component': 0.6.8 @@ -3919,10 +15530,7 @@ packages: tslib: 2.6.3 undici: 5.28.4 - /@firebase/functions-compat@0.3.12(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8): - resolution: {integrity: sha512-r3XUb5VlITWpML46JymfJPkK6I9j4SNlO7qWIXUc0TUmkv0oAfVoiIt1F83/NuMZXaGr4YWA/794nVSy4GV8tw==} - peerDependencies: - '@firebase/app-compat': 0.x + '@firebase/functions-compat@0.3.12(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8)': dependencies: '@firebase/app-compat': 0.2.38 '@firebase/component': 0.6.8 @@ -3933,13 +15541,9 @@ packages: transitivePeerDependencies: - '@firebase/app' - /@firebase/functions-types@0.6.2: - resolution: {integrity: sha512-0KiJ9lZ28nS2iJJvimpY4nNccV21rkQyor5Iheu/nq8aKXJqtJdeSlZDspjPSBBiHRzo7/GMUttegnsEITqR+w==} + '@firebase/functions-types@0.6.2': {} - /@firebase/functions@0.11.6(@firebase/app@0.10.8): - resolution: {integrity: sha512-GPfIBPtpwQvsC7SQbgaUjLTdja0CsNwMoKSgrzA1FGGRk4NX6qO7VQU6XCwBiAFWbpbQex6QWkSMsCzLx1uibQ==} - peerDependencies: - '@firebase/app': 0.x + '@firebase/functions@0.11.6(@firebase/app@0.10.8)': dependencies: '@firebase/app': 0.10.8 '@firebase/app-check-interop-types': 0.3.2 @@ -3950,10 +15554,7 @@ packages: tslib: 2.6.3 undici: 5.28.4 - /@firebase/installations-compat@0.2.8(@firebase/app-compat@0.2.38)(@firebase/app-types@0.9.2)(@firebase/app@0.10.8): - resolution: {integrity: sha512-pI2q8JFHB7yIq/szmhzGSWXtOvtzl6tCUmyykv5C8vvfOVJUH6mP4M4iwjbK8S1JotKd/K70+JWyYlxgQ0Kpyw==} - peerDependencies: - '@firebase/app-compat': 0.x + '@firebase/installations-compat@0.2.8(@firebase/app-compat@0.2.38)(@firebase/app-types@0.9.2)(@firebase/app@0.10.8)': dependencies: '@firebase/app-compat': 0.2.38 '@firebase/component': 0.6.8 @@ -3965,17 +15566,11 @@ packages: - '@firebase/app' - '@firebase/app-types' - /@firebase/installations-types@0.5.2(@firebase/app-types@0.9.2): - resolution: {integrity: sha512-que84TqGRZJpJKHBlF2pkvc1YcXrtEDOVGiDjovP/a3s6W4nlbohGXEsBJo0JCeeg/UG9A+DEZVDUV9GpklUzA==} - peerDependencies: - '@firebase/app-types': 0.x + '@firebase/installations-types@0.5.2(@firebase/app-types@0.9.2)': dependencies: '@firebase/app-types': 0.9.2 - /@firebase/installations@0.6.8(@firebase/app@0.10.8): - resolution: {integrity: sha512-57V374qdb2+wT5v7+ntpLXBjZkO6WRgmAUbVkRfFTM/4t980p0FesbqTAcOIiM8U866UeuuuF8lYH70D3jM/jQ==} - peerDependencies: - '@firebase/app': 0.x + '@firebase/installations@0.6.8(@firebase/app@0.10.8)': dependencies: '@firebase/app': 0.10.8 '@firebase/component': 0.6.8 @@ -3983,15 +15578,11 @@ packages: idb: 7.1.1 tslib: 2.6.3 - /@firebase/logger@0.4.2: - resolution: {integrity: sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==} + '@firebase/logger@0.4.2': dependencies: tslib: 2.6.3 - /@firebase/messaging-compat@0.2.10(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8): - resolution: {integrity: sha512-FXQm7rcowkDm8kFLduHV35IRYCRo+Ng0PIp/t1+EBuEbyplaKkGjZ932pE+owf/XR+G/60ku2QRBptRGLXZydg==} - peerDependencies: - '@firebase/app-compat': 0.x + '@firebase/messaging-compat@0.2.10(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8)': dependencies: '@firebase/app-compat': 0.2.38 '@firebase/component': 0.6.8 @@ -4001,13 +15592,9 @@ packages: transitivePeerDependencies: - '@firebase/app' - /@firebase/messaging-interop-types@0.2.2: - resolution: {integrity: sha512-l68HXbuD2PPzDUOFb3aG+nZj5KA3INcPwlocwLZOzPp9rFM9yeuI9YLl6DQfguTX5eAGxO0doTR+rDLDvQb5tA==} + '@firebase/messaging-interop-types@0.2.2': {} - /@firebase/messaging@0.12.10(@firebase/app@0.10.8): - resolution: {integrity: sha512-fGbxJPKpl2DIKNJGhbk4mYPcM+qE2gl91r6xPoiol/mN88F5Ym6UeRdMVZah+pijh9WxM55alTYwXuW40r1Y2Q==} - peerDependencies: - '@firebase/app': 0.x + '@firebase/messaging@0.12.10(@firebase/app@0.10.8)': dependencies: '@firebase/app': 0.10.8 '@firebase/component': 0.6.8 @@ -4017,10 +15604,7 @@ packages: idb: 7.1.1 tslib: 2.6.3 - /@firebase/performance-compat@0.2.8(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8): - resolution: {integrity: sha512-o7TFClRVJd3VIBoY7KZQqtCeW0PC6v9uBzM6Lfw3Nc9D7hM6OonqecYvh7NwJ6R14k+xM27frLS4BcCvFHKw2A==} - peerDependencies: - '@firebase/app-compat': 0.x + '@firebase/performance-compat@0.2.8(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8)': dependencies: '@firebase/app-compat': 0.2.38 '@firebase/component': 0.6.8 @@ -4032,13 +15616,9 @@ packages: transitivePeerDependencies: - '@firebase/app' - /@firebase/performance-types@0.2.2: - resolution: {integrity: sha512-gVq0/lAClVH5STrIdKnHnCo2UcPLjJlDUoEB/tB4KM+hAeHUxWKnpT0nemUPvxZ5nbdY/pybeyMe8Cs29gEcHA==} + '@firebase/performance-types@0.2.2': {} - /@firebase/performance@0.6.8(@firebase/app@0.10.8): - resolution: {integrity: sha512-F+alziiIZ6Yn8FG47mxwljq+4XkgkT2uJIFRlkyViUQRLzrogaUJW6u/+6ZrePXnouKlKIwzqos3PVJraPEcCA==} - peerDependencies: - '@firebase/app': 0.x + '@firebase/performance@0.6.8(@firebase/app@0.10.8)': dependencies: '@firebase/app': 0.10.8 '@firebase/component': 0.6.8 @@ -4047,10 +15627,7 @@ packages: '@firebase/util': 1.9.7 tslib: 2.6.3 - /@firebase/remote-config-compat@0.2.8(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8): - resolution: {integrity: sha512-UxSFOp6dzFj2AHB8Bq/BYtbq5iFyizKx4Rd6WxAdaKYM8cnPMeK+l2v+Oogtjae+AeyHRI+MfL2acsfVe5cd2A==} - peerDependencies: - '@firebase/app-compat': 0.x + '@firebase/remote-config-compat@0.2.8(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8)': dependencies: '@firebase/app-compat': 0.2.38 '@firebase/component': 0.6.8 @@ -4062,13 +15639,9 @@ packages: transitivePeerDependencies: - '@firebase/app' - /@firebase/remote-config-types@0.3.2: - resolution: {integrity: sha512-0BC4+Ud7y2aPTyhXJTMTFfrGGLqdYXrUB9sJVAB8NiqJswDTc4/2qrE/yfUbnQJhbSi6ZaTTBKyG3n1nplssaA==} + '@firebase/remote-config-types@0.3.2': {} - /@firebase/remote-config@0.4.8(@firebase/app@0.10.8): - resolution: {integrity: sha512-AMLqe6wfIRnjc6FkCWOSUjhc1fSTEf8o+cv1NolFvbiJ/tU+TqN4pI7pT+MIKQzNiq5fxLehkOx+xtAQBxPJKQ==} - peerDependencies: - '@firebase/app': 0.x + '@firebase/remote-config@0.4.8(@firebase/app@0.10.8)': dependencies: '@firebase/app': 0.10.8 '@firebase/component': 0.6.8 @@ -4077,10 +15650,7 @@ packages: '@firebase/util': 1.9.7 tslib: 2.6.3 - /@firebase/storage-compat@0.3.9(@firebase/app-compat@0.2.38)(@firebase/app-types@0.9.2)(@firebase/app@0.10.8): - resolution: {integrity: sha512-WWgAp5bTW961oIsCc9+98m4MIVKpEqztAlIngfHfwO/x3DYoBPRl/awMRG3CAXyVxG+7B7oHC5IsnqM+vTwx2A==} - peerDependencies: - '@firebase/app-compat': 0.x + '@firebase/storage-compat@0.3.9(@firebase/app-compat@0.2.38)(@firebase/app-types@0.9.2)(@firebase/app@0.10.8)': dependencies: '@firebase/app-compat': 0.2.38 '@firebase/component': 0.6.8 @@ -4092,19 +15662,12 @@ packages: - '@firebase/app' - '@firebase/app-types' - /@firebase/storage-types@0.8.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.7): - resolution: {integrity: sha512-0vWu99rdey0g53lA7IShoA2Lol1jfnPovzLDUBuon65K7uKG9G+L5uO05brD9pMw+l4HRFw23ah3GwTGpEav6g==} - peerDependencies: - '@firebase/app-types': 0.x - '@firebase/util': 1.x + '@firebase/storage-types@0.8.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.7)': dependencies: '@firebase/app-types': 0.9.2 '@firebase/util': 1.9.7 - /@firebase/storage@0.12.6(@firebase/app@0.10.8): - resolution: {integrity: sha512-Zgb9WuehJxzhj7pGXUvkAEaH+3HvLjD9xSZ9nepuXf5f8378xME7oGJtREr/RnepdDA5YW0XIxe0QQBNHpe1nw==} - peerDependencies: - '@firebase/app': 0.x + '@firebase/storage@0.12.6(@firebase/app@0.10.8)': dependencies: '@firebase/app': 0.10.8 '@firebase/component': 0.6.8 @@ -4112,17 +15675,11 @@ packages: tslib: 2.6.3 undici: 5.28.4 - /@firebase/util@1.9.7: - resolution: {integrity: sha512-fBVNH/8bRbYjqlbIhZ+lBtdAAS4WqZumx03K06/u7fJSpz1TGjEMm1ImvKD47w+xaFKIP2ori6z8BrbakRfjJA==} + '@firebase/util@1.9.7': dependencies: tslib: 2.6.3 - /@firebase/vertexai-preview@0.0.3(@firebase/app-types@0.9.2)(@firebase/app@0.10.8): - resolution: {integrity: sha512-KVtUWLp+ScgiwkDKAvNkVucAyhLVQp6C6lhnVEuIg4mWhWcS3oerjAeVhZT4uNofKwWxRsOaB2Yec7DMTXlQPQ==} - engines: {node: '>=18.0.0'} - peerDependencies: - '@firebase/app': 0.x - '@firebase/app-types': 0.x + '@firebase/vertexai-preview@0.0.3(@firebase/app-types@0.9.2)(@firebase/app@0.10.8)': dependencies: '@firebase/app': 0.10.8 '@firebase/app-check-interop-types': 0.3.2 @@ -4132,24 +15689,15 @@ packages: '@firebase/util': 1.9.7 tslib: 2.6.3 - /@firebase/webchannel-wrapper@1.0.1: - resolution: {integrity: sha512-jmEnr/pk0yVkA7mIlHNnxCi+wWzOFUg0WyIotgkKAb2u1J7fAeDBcVNSTjTihbAYNusCLQdW5s9IJ5qwnEufcQ==} + '@firebase/webchannel-wrapper@1.0.1': {} - /@fontsource/inter@4.5.15: - resolution: {integrity: sha512-FzleM9AxZQK2nqsTDtBiY0PMEVWvnKnuu2i09+p6DHvrHsuucoV2j0tmw+kAT3L4hvsLdAIDv6MdGehsPIdT+Q==} - dev: false + '@fontsource/inter@4.5.15': {} - /@fontsource/roboto-mono@4.5.10: - resolution: {integrity: sha512-KrJdmkqz6DszT2wV/bbhXef4r0hV3B0vw2mAqei8A2kRnvq+gcJLmmIeQ94vu9VEXrUQzos5M9lH1TAAXpRphw==} - dev: false + '@fontsource/roboto-mono@4.5.10': {} - /@gar/promisify@1.1.3: - resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + '@gar/promisify@1.1.3': {} - /@google-cloud/firestore@7.9.0: - resolution: {integrity: sha512-c4ALHT3G08rV7Zwv8Z2KG63gZh66iKdhCBeDfCpIkLrjX6EAjTD/szMdj14M+FnQuClZLFfW5bAgoOjfNmLtJg==} - engines: {node: '>=14.0.0'} - requiresBuild: true + '@google-cloud/firestore@7.9.0': dependencies: fast-deep-equal: 3.1.3 functional-red-black-tree: 1.0.1 @@ -4158,47 +15706,28 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false optional: true - /@google-cloud/paginator@5.0.2: - resolution: {integrity: sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==} - engines: {node: '>=14.0.0'} - requiresBuild: true + '@google-cloud/paginator@5.0.2': dependencies: arrify: 2.0.1 extend: 3.0.2 - dev: false optional: true - /@google-cloud/projectify@4.0.0: - resolution: {integrity: sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==} - engines: {node: '>=14.0.0'} - requiresBuild: true - dev: false + '@google-cloud/projectify@4.0.0': optional: true - /@google-cloud/promisify@4.0.0: - resolution: {integrity: sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==} - engines: {node: '>=14'} - requiresBuild: true - dev: false + '@google-cloud/promisify@4.0.0': optional: true - /@google-cloud/scheduler@4.3.0: - resolution: {integrity: sha512-3VeVu/YVkJ0NIC0zDRucmY6o4wm7ii5TGHJLKtJUz4osm8f143uJ/FDSJz1vXMAg6GseZ/yzLvBQ5r/Sb+U2Ow==} - engines: {node: '>=14.0.0'} + '@google-cloud/scheduler@4.3.0': dependencies: google-gax: 4.3.8 transitivePeerDependencies: - encoding - supports-color - dev: false - /@google-cloud/storage@7.12.1: - resolution: {integrity: sha512-Z3ZzOnF3YKLuvpkvF+TjQ6lztxcAyTILp+FjKonmVpEwPa9vFvxpZjubLR4sB6bf19i/8HL2AXRjA0YFgHFRmQ==} - engines: {node: '>=14'} - requiresBuild: true + '@google-cloud/storage@7.12.1': dependencies: '@google-cloud/paginator': 5.0.2 '@google-cloud/projectify': 4.0.0 @@ -4218,36 +15747,26 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false optional: true - /@grpc/grpc-js@1.11.1: - resolution: {integrity: sha512-gyt/WayZrVPH2w/UTLansS7F9Nwld472JxxaETamrM8HNlsa+jSLNyKAZmhxI2Me4c3mQHFiS1wWHDY1g1Kthw==} - engines: {node: '>=12.10.0'} + '@grpc/grpc-js@1.11.1': dependencies: '@grpc/proto-loader': 0.7.13 '@js-sdsl/ordered-map': 4.4.2 - dev: false - /@grpc/grpc-js@1.9.15: - resolution: {integrity: sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ==} - engines: {node: ^8.13.0 || >=10.10.0} + '@grpc/grpc-js@1.9.15': dependencies: '@grpc/proto-loader': 0.7.13 '@types/node': 18.19.42 - /@grpc/proto-loader@0.7.13: - resolution: {integrity: sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==} - engines: {node: '>=6'} - hasBin: true + '@grpc/proto-loader@0.7.13': dependencies: lodash.camelcase: 4.3.0 long: 5.2.3 protobufjs: 7.3.2 yargs: 17.7.2 - /@hubspot/api-client@11.1.0: - resolution: {integrity: sha512-HUkvUJKKvKhED0RZfpjnTX+b5+RNRlFfAllT7ozLP7gEoT5fp5aT148mnBdNZTr1UPfScBdDQa42ixHjgkIlNQ==} + '@hubspot/api-client@11.1.0': dependencies: '@types/node-fetch': 2.6.11 bottleneck: 2.19.5 @@ -4259,12 +15778,8 @@ packages: url-parse: 1.5.10 transitivePeerDependencies: - encoding - dev: false - /@humanwhocodes/config-array@0.11.14: - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead + '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 debug: 4.3.6(supports-color@5.5.0) @@ -4272,51 +15787,32 @@ packages: transitivePeerDependencies: - supports-color - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} + '@humanwhocodes/module-importer@1.0.1': {} - /@humanwhocodes/object-schema@2.0.3: - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead + '@humanwhocodes/object-schema@2.0.3': {} - /@inquirer/figures@1.0.5: - resolution: {integrity: sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==} - engines: {node: '>=18'} - dev: true + '@inquirer/figures@1.0.5': {} - /@ioredis/commands@1.2.0: - resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + '@ioredis/commands@1.2.0': {} - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 + string-width-cjs: string-width@4.2.3 strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 + strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 - /@isaacs/fs-minipass@4.0.1: - resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} - engines: {node: '>=18.0.0'} + '@isaacs/fs-minipass@4.0.1': dependencies: minipass: 7.1.2 - dev: false - /@isaacs/string-locale-compare@1.1.0: - resolution: {integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==} + '@isaacs/string-locale-compare@1.1.0': {} - /@isaacs/ttlcache@1.4.1: - resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==} - engines: {node: '>=12'} - dev: false + '@isaacs/ttlcache@1.4.1': {} - /@istanbuljs/load-nyc-config@1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} + '@istanbuljs/load-nyc-config@1.1.0': dependencies: camelcase: 5.3.1 find-up: 4.1.0 @@ -4324,13 +15820,9 @@ packages: js-yaml: 3.14.1 resolve-from: 5.0.0 - /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} + '@istanbuljs/schema@0.1.3': {} - /@jest/console@27.5.1: - resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + '@jest/console@27.5.1': dependencies: '@jest/types': 27.5.1 '@types/node': 18.19.42 @@ -4338,11 +15830,8 @@ packages: jest-message-util: 27.5.1 jest-util: 27.5.1 slash: 3.0.0 - dev: false - /@jest/console@28.1.3: - resolution: {integrity: sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + '@jest/console@28.1.3': dependencies: '@jest/types': 28.1.3 '@types/node': 18.19.42 @@ -4351,9 +15840,7 @@ packages: jest-util: 28.1.3 slash: 3.0.0 - /@jest/console@29.7.0: - resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 '@types/node': 18.19.42 @@ -4362,14 +15849,7 @@ packages: jest-util: 29.7.0 slash: 3.0.0 - /@jest/core@27.5.1(ts-node@10.9.2): - resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + '@jest/core@27.5.1(ts-node@10.9.2)': dependencies: '@jest/console': 27.5.1 '@jest/reporters': 27.5.1 @@ -4405,16 +15885,8 @@ packages: - supports-color - ts-node - utf-8-validate - dev: false - /@jest/core@28.1.3(ts-node@10.9.2): - resolution: {integrity: sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + '@jest/core@28.1.3(ts-node@10.9.2)': dependencies: '@jest/console': 28.1.3 '@jest/reporters': 28.1.3 @@ -4448,16 +15920,8 @@ packages: transitivePeerDependencies: - supports-color - ts-node - dev: true - /@jest/core@29.7.0(ts-node@10.9.2): - resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + '@jest/core@29.7.0(ts-node@10.9.2)': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -4492,70 +15956,50 @@ packages: - supports-color - ts-node - /@jest/environment@27.5.1: - resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + '@jest/environment@27.5.1': dependencies: '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 '@types/node': 18.19.42 jest-mock: 27.5.1 - dev: false - /@jest/environment@28.1.3: - resolution: {integrity: sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + '@jest/environment@28.1.3': dependencies: '@jest/fake-timers': 28.1.3 '@jest/types': 28.1.3 '@types/node': 18.19.42 jest-mock: 28.1.3 - dev: true - /@jest/environment@29.7.0: - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/environment@29.7.0': dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/node': 18.19.42 jest-mock: 29.7.0 - /@jest/expect-utils@28.1.3: - resolution: {integrity: sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + '@jest/expect-utils@28.1.3': dependencies: jest-get-type: 28.0.2 - dev: true - /@jest/expect-utils@29.7.0: - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/expect-utils@29.7.0': dependencies: jest-get-type: 29.6.3 - /@jest/expect@28.1.3: - resolution: {integrity: sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + '@jest/expect@28.1.3': dependencies: expect: 28.1.3 jest-snapshot: 28.1.3 transitivePeerDependencies: - supports-color - dev: true - /@jest/expect@29.7.0: - resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/expect@29.7.0': dependencies: expect: 29.7.0 jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color - /@jest/fake-timers@27.5.1: - resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + '@jest/fake-timers@27.5.1': dependencies: '@jest/types': 27.5.1 '@sinonjs/fake-timers': 8.1.0 @@ -4563,11 +16007,8 @@ packages: jest-message-util: 27.5.1 jest-mock: 27.5.1 jest-util: 27.5.1 - dev: false - /@jest/fake-timers@28.1.3: - resolution: {integrity: sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + '@jest/fake-timers@28.1.3': dependencies: '@jest/types': 28.1.3 '@sinonjs/fake-timers': 9.1.2 @@ -4575,11 +16016,8 @@ packages: jest-message-util: 28.1.3 jest-mock: 28.1.3 jest-util: 28.1.3 - dev: true - /@jest/fake-timers@29.7.0: - resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/fake-timers@29.7.0': dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 @@ -4588,29 +16026,21 @@ packages: jest-mock: 29.7.0 jest-util: 29.7.0 - /@jest/globals@27.5.1: - resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + '@jest/globals@27.5.1': dependencies: '@jest/environment': 27.5.1 '@jest/types': 27.5.1 expect: 27.5.1 - dev: false - /@jest/globals@28.1.3: - resolution: {integrity: sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + '@jest/globals@28.1.3': dependencies: '@jest/environment': 28.1.3 '@jest/expect': 28.1.3 '@jest/types': 28.1.3 transitivePeerDependencies: - supports-color - dev: true - /@jest/globals@29.7.0: - resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/globals@29.7.0': dependencies: '@jest/environment': 29.7.0 '@jest/expect': 29.7.0 @@ -4619,14 +16049,7 @@ packages: transitivePeerDependencies: - supports-color - /@jest/reporters@27.5.1: - resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + '@jest/reporters@27.5.1': dependencies: '@bcoe/v8-coverage': 0.2.3 '@jest/console': 27.5.1 @@ -4655,16 +16078,8 @@ packages: v8-to-istanbul: 8.1.1 transitivePeerDependencies: - supports-color - dev: false - /@jest/reporters@28.1.3: - resolution: {integrity: sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + '@jest/reporters@28.1.3': dependencies: '@bcoe/v8-coverage': 0.2.3 '@jest/console': 28.1.3 @@ -4693,16 +16108,8 @@ packages: v8-to-istanbul: 9.3.0 transitivePeerDependencies: - supports-color - dev: true - /@jest/reporters@29.7.0: - resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + '@jest/reporters@29.7.0': dependencies: '@bcoe/v8-coverage': 0.2.3 '@jest/console': 29.7.0 @@ -4731,75 +16138,54 @@ packages: transitivePeerDependencies: - supports-color - /@jest/schemas@28.1.3: - resolution: {integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + '@jest/schemas@28.1.3': dependencies: '@sinclair/typebox': 0.24.51 - /@jest/schemas@29.6.3: - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/schemas@29.6.3': dependencies: '@sinclair/typebox': 0.27.8 - /@jest/source-map@27.5.1: - resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + '@jest/source-map@27.5.1': dependencies: callsites: 3.1.0 graceful-fs: 4.2.11 source-map: 0.6.1 - dev: false - /@jest/source-map@28.1.2: - resolution: {integrity: sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + '@jest/source-map@28.1.2': dependencies: '@jridgewell/trace-mapping': 0.3.25 callsites: 3.1.0 graceful-fs: 4.2.11 - dev: true - /@jest/source-map@29.6.3: - resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/source-map@29.6.3': dependencies: '@jridgewell/trace-mapping': 0.3.25 callsites: 3.1.0 graceful-fs: 4.2.11 - /@jest/test-result@27.5.1: - resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + '@jest/test-result@27.5.1': dependencies: '@jest/console': 27.5.1 '@jest/types': 27.5.1 '@types/istanbul-lib-coverage': 2.0.6 collect-v8-coverage: 1.0.2 - dev: false - /@jest/test-result@28.1.3: - resolution: {integrity: sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + '@jest/test-result@28.1.3': dependencies: '@jest/console': 28.1.3 '@jest/types': 28.1.3 '@types/istanbul-lib-coverage': 2.0.6 collect-v8-coverage: 1.0.2 - /@jest/test-result@29.7.0: - resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/test-result@29.7.0': dependencies: '@jest/console': 29.7.0 '@jest/types': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 collect-v8-coverage: 1.0.2 - /@jest/test-sequencer@27.5.1: - resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + '@jest/test-sequencer@27.5.1': dependencies: '@jest/test-result': 27.5.1 graceful-fs: 4.2.11 @@ -4807,30 +16193,22 @@ packages: jest-runtime: 27.5.1 transitivePeerDependencies: - supports-color - dev: false - /@jest/test-sequencer@28.1.3: - resolution: {integrity: sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + '@jest/test-sequencer@28.1.3': dependencies: '@jest/test-result': 28.1.3 graceful-fs: 4.2.11 jest-haste-map: 28.1.3 slash: 3.0.0 - dev: true - /@jest/test-sequencer@29.7.0: - resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/test-sequencer@29.7.0': dependencies: '@jest/test-result': 29.7.0 graceful-fs: 4.2.11 jest-haste-map: 29.7.0 slash: 3.0.0 - /@jest/transform@27.5.1: - resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + '@jest/transform@27.5.1': dependencies: '@babel/core': 7.25.2 '@jest/types': 27.5.1 @@ -4849,11 +16227,8 @@ packages: write-file-atomic: 3.0.3 transitivePeerDependencies: - supports-color - dev: false - /@jest/transform@28.1.3: - resolution: {integrity: sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + '@jest/transform@28.1.3': dependencies: '@babel/core': 7.25.2 '@jest/types': 28.1.3 @@ -4872,11 +16247,8 @@ packages: write-file-atomic: 4.0.2 transitivePeerDependencies: - supports-color - dev: true - /@jest/transform@29.7.0: - resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/transform@29.7.0': dependencies: '@babel/core': 7.25.2 '@jest/types': 29.6.3 @@ -4896,20 +16268,15 @@ packages: transitivePeerDependencies: - supports-color - /@jest/types@27.5.1: - resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + '@jest/types@27.5.1': dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 '@types/node': 18.19.42 '@types/yargs': 16.0.9 chalk: 4.1.2 - dev: false - /@jest/types@28.1.3: - resolution: {integrity: sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + '@jest/types@28.1.3': dependencies: '@jest/schemas': 28.1.3 '@types/istanbul-lib-coverage': 2.0.6 @@ -4918,9 +16285,7 @@ packages: '@types/yargs': 17.0.32 chalk: 4.1.2 - /@jest/types@29.6.3: - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/types@29.6.3': dependencies: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 @@ -4929,99 +16294,63 @@ packages: '@types/yargs': 17.0.32 chalk: 4.1.2 - /@jitsu/sdk-js@3.1.5: - resolution: {integrity: sha512-e7P8uvGBNwWCC864MItcYSv0IT2+nwYiX8QXZ0lfyG8hutEXXX9Yt2/+MynXuGxMIoIrJ+j0bWVu20k9rrhxSg==} - deprecated: This package is for legacy Jitsu Classic version. For latest version of Jitsu please use @jitsu/js - dev: true + '@jitsu/sdk-js@3.1.5': {} - /@jridgewell/gen-mapping@0.3.5: - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 - /@jridgewell/resolve-uri@3.1.2: - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} + '@jridgewell/resolve-uri@3.1.2': {} - /@jridgewell/set-array@1.2.1: - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} + '@jridgewell/set-array@1.2.1': {} - /@jridgewell/source-map@0.3.6: - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + '@jridgewell/source-map@0.3.6': dependencies: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - /@jridgewell/sourcemap-codec@1.5.0: - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.5.0': {} - /@jridgewell/trace-mapping@0.3.25: - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - /@jridgewell/trace-mapping@0.3.9: - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - /@js-sdsl/ordered-map@4.4.2: - resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} - dev: false + '@js-sdsl/ordered-map@4.4.2': {} - /@kurkle/color@0.3.2: - resolution: {integrity: sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==} - dev: false + '@kurkle/color@0.3.2': {} - /@kwsites/file-exists@1.1.1: - resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} + '@kwsites/file-exists@1.1.1': dependencies: debug: 4.3.6(supports-color@5.5.0) transitivePeerDependencies: - supports-color - dev: false - /@kwsites/promise-deferred@1.1.1: - resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} - dev: false + '@kwsites/promise-deferred@1.1.1': {} - /@leichtgewicht/ip-codec@2.0.5: - resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} - dev: false + '@leichtgewicht/ip-codec@2.0.5': {} - /@loadable/component@5.16.4(react@18.3.1): - resolution: {integrity: sha512-fJWxx9b5WHX90QKmizo9B+es2so8DnBthI1mbflwCoOyvzEwxiZ/SVDCTtXEnHG72/kGBdzr297SSIekYtzSOQ==} - engines: {node: '>=8'} - peerDependencies: - react: ^16.3.0 || ^17.0.0 || ^18.0.0 + '@loadable/component@5.16.4(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 hoist-non-react-statics: 3.3.2 react: 18.3.1 react-is: 16.13.1 - dev: false - /@lukeed/csprng@1.1.0: - resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} - engines: {node: '>=8'} - dev: true + '@lukeed/csprng@1.1.0': {} - /@lukeed/uuid@2.0.1: - resolution: {integrity: sha512-qC72D4+CDdjGqJvkFMMEAtancHUQ7/d/tAiHf64z8MopFDmcrtbcJuerDtFceuAfQJ2pDSfCKCtbqoGBNnwg0w==} - engines: {node: '>=8'} + '@lukeed/uuid@2.0.1': dependencies: '@lukeed/csprng': 1.1.0 - dev: true - /@mapbox/node-pre-gyp@1.0.11: - resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} - hasBin: true + '@mapbox/node-pre-gyp@1.0.11': dependencies: detect-libc: 2.0.3 https-proxy-agent: 5.0.1 @@ -5035,109 +16364,50 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: true - /@maxmind/geoip2-node@5.0.0: - resolution: {integrity: sha512-ki+q5//oU4tZ3BAhegZJcB5czoZyic5JSTEKbrUAQB/BzAoAiGyLW0immEmQvVVyy2SMlvBTJ3zqyRj8K9BbwQ==} + '@maxmind/geoip2-node@5.0.0': dependencies: ip6addr: 0.2.5 maxmind: 4.3.20 - dev: false - /@monaco-editor/loader@1.4.0(monaco-editor@0.50.0): - resolution: {integrity: sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==} - peerDependencies: - monaco-editor: '>= 0.21.0 < 1' + '@monaco-editor/loader@1.4.0(monaco-editor@0.50.0)': dependencies: monaco-editor: 0.50.0 state-local: 1.0.7 - dev: false - /@monaco-editor/react@4.6.0(monaco-editor@0.50.0)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==} - peerDependencies: - monaco-editor: '>= 0.25.0 < 1' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@monaco-editor/react@4.6.0(monaco-editor@0.50.0)(react-dom@18.3.1)(react@18.3.1)': dependencies: '@monaco-editor/loader': 1.4.0(monaco-editor@0.50.0) monaco-editor: 0.50.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /@mongodb-js/saslprep@1.1.8: - resolution: {integrity: sha512-qKwC/M/nNNaKUBMQ0nuzm47b7ZYWQHN3pcXq4IIcoSBc2hOIrflAxJduIvvqmhoz3gR2TacTAs8vlsCVPkiEdQ==} + '@mongodb-js/saslprep@1.1.8': dependencies: sparse-bitfield: 3.0.3 - dev: false - /@mongodb-js/zstd-darwin-arm64@1.2.0: - resolution: {integrity: sha512-QWgW6IkWp3ErBXOvlOj9lw3lwMfey7eXh/p/Srb/7sEiu1e0yEO+LQ8IctmDWh8bfznKXmwUC0h7LKDbYR30yw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false + '@mongodb-js/zstd-darwin-arm64@1.2.0': optional: true - /@mongodb-js/zstd-darwin-x64@1.2.0: - resolution: {integrity: sha512-VnxYO8P2SWubdnydGId5+6veO6Ki6nxCr/pTaDZd8s4Urn6bDdXSX6YsZ0r42dO3Fa0FVYzrlcVAuNB67e2b6w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false + '@mongodb-js/zstd-darwin-x64@1.2.0': optional: true - /@mongodb-js/zstd-linux-arm64-gnu@1.2.0: - resolution: {integrity: sha512-TYF0XgNJW6UrvtY2u4Uuo5HiVWNgWNZ/ae2BhVp8hNsDhwFqb/YNoyiZqBei6whUwr8hecMy0UaHAXm3h+O2+Q==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false + '@mongodb-js/zstd-linux-arm64-gnu@1.2.0': optional: true - /@mongodb-js/zstd-linux-arm64-musl@1.2.0: - resolution: {integrity: sha512-e2ClmJI1BvJq23VSLH14hgjjjcMOad3R/Ap7Q7dTa1uiVSJG4xKd2CmrWQgX1Az4/EfUMWEI7pb4yuanbdd2AQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false + '@mongodb-js/zstd-linux-arm64-musl@1.2.0': optional: true - /@mongodb-js/zstd-linux-x64-gnu@1.2.0: - resolution: {integrity: sha512-JuoK8lxUlkFPDBfsBUJKnLxpXA5ar+v7G43lIUlBKgjOp5aEWO/qQp5sNgCRnYA7x6PItYqIkEJjsays4N6JOA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false + '@mongodb-js/zstd-linux-x64-gnu@1.2.0': optional: true - /@mongodb-js/zstd-linux-x64-musl@1.2.0: - resolution: {integrity: sha512-pSb1iUF3Gc/qrJuP/Mi5ry4YFAUdUVFKNRZh1KTDDhSWyRCLd9gKcNdRnXqJjIdeGGEKf4bhtZAbYw4i/g0foA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false + '@mongodb-js/zstd-linux-x64-musl@1.2.0': optional: true - /@mongodb-js/zstd-win32-x64-msvc@1.2.0: - resolution: {integrity: sha512-iz4Yl+WK3yr/4Yg6F4tKz3X9+yMZDK6pyBMA0CdXydSDZs6o2XQ2I0ZSu3oSk/ACfaZX3SNfRi3XTGgAM1eKZA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false + '@mongodb-js/zstd-win32-x64-msvc@1.2.0': optional: true - /@mongodb-js/zstd@1.2.0: - resolution: {integrity: sha512-sKHsJU2MXsp822IFXOHw/4mpFulScNHpZzVy1Zi5k5wBsdiAPx1QramyOXZkpacla+2QPEC/s7TxPlEhG/HuNQ==} - engines: {node: '>= 10'} + '@mongodb-js/zstd@1.2.0': optionalDependencies: '@mongodb-js/zstd-darwin-arm64': 1.2.0 '@mongodb-js/zstd-darwin-x64': 1.2.0 @@ -5146,130 +16416,59 @@ packages: '@mongodb-js/zstd-linux-x64-gnu': 1.2.0 '@mongodb-js/zstd-linux-x64-musl': 1.2.0 '@mongodb-js/zstd-win32-x64-msvc': 1.2.0 - dev: false - /@nangohq/frontend@0.21.17: - resolution: {integrity: sha512-utnO6JkRIQVqZBo472Yynf0nBl5Pc3QCMlC9L5LsIWApCD1pSkqZCA7cZKIJiX2p3tiB8Hzav31o0lAsnTZ1AQ==} - dev: false + '@nangohq/frontend@0.21.17': {} - /@next/env@14.2.5: - resolution: {integrity: sha512-/zZGkrTOsraVfYjGP8uM0p6r0BDT6xWpkjdVbcz66PJVSpwXX3yNiRycxAuDfBKGWBrZBXRuK/YVlkNgxHGwmA==} - dev: false + '@next/env@14.2.5': {} - /@next/eslint-plugin-next@14.2.5: - resolution: {integrity: sha512-LY3btOpPh+OTIpviNojDpUdIbHW9j0JBYBjsIp8IxtDFfYFyORvw3yNq6N231FVqQA7n7lwaf7xHbVJlA1ED7g==} + '@next/eslint-plugin-next@14.2.5': dependencies: glob: 10.3.10 - /@next/swc-darwin-arm64@14.2.5: - resolution: {integrity: sha512-/9zVxJ+K9lrzSGli1///ujyRfon/ZneeZ+v4ptpiPoOU+GKZnm8Wj8ELWU1Pm7GHltYRBklmXMTUqM/DqQ99FQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false + '@next/swc-darwin-arm64@14.2.5': optional: true - /@next/swc-darwin-x64@14.2.5: - resolution: {integrity: sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false + '@next/swc-darwin-x64@14.2.5': optional: true - /@next/swc-linux-arm64-gnu@14.2.5: - resolution: {integrity: sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false + '@next/swc-linux-arm64-gnu@14.2.5': optional: true - /@next/swc-linux-arm64-musl@14.2.5: - resolution: {integrity: sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false + '@next/swc-linux-arm64-musl@14.2.5': optional: true - /@next/swc-linux-x64-gnu@14.2.5: - resolution: {integrity: sha512-8XFikMSxWleYNryWIjiCX+gU201YS+erTUidKdyOVYi5qUQo/gRxv/3N1oZFCgqpesN6FPeqGM72Zve+nReVXQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false + '@next/swc-linux-x64-gnu@14.2.5': optional: true - /@next/swc-linux-x64-musl@14.2.5: - resolution: {integrity: sha512-6QLwi7RaYiQDcRDSU/os40r5o06b5ue7Jsk5JgdRBGGp8l37RZEh9JsLSM8QF0YDsgcosSeHjglgqi25+m04IQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false + '@next/swc-linux-x64-musl@14.2.5': optional: true - /@next/swc-win32-arm64-msvc@14.2.5: - resolution: {integrity: sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false + '@next/swc-win32-arm64-msvc@14.2.5': optional: true - /@next/swc-win32-ia32-msvc@14.2.5: - resolution: {integrity: sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false + '@next/swc-win32-ia32-msvc@14.2.5': optional: true - /@next/swc-win32-x64-msvc@14.2.5: - resolution: {integrity: sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false + '@next/swc-win32-x64-msvc@14.2.5': optional: true - /@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1: - resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': dependencies: eslint-scope: 5.1.1 - dev: false - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + '@nodelib/fs.stat@2.0.5': {} - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - /@npmcli/arborist@4.3.1: - resolution: {integrity: sha512-yMRgZVDpwWjplorzt9SFSaakWx6QIK248Nw4ZFgkrAy/GvJaFRaSZzE6nD7JBK5r8g/+PTxFq5Wj/sfciE7x+A==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16} - hasBin: true + '@npmcli/arborist@4.3.1': dependencies: '@isaacs/string-locale-compare': 1.1.0 '@npmcli/installed-package-contents': 1.0.7 @@ -5307,27 +16506,21 @@ packages: - bluebird - supports-color - /@npmcli/fs@1.1.1: - resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} + '@npmcli/fs@1.1.1': dependencies: '@gar/promisify': 1.1.3 semver: 7.6.3 - /@npmcli/fs@2.1.2: - resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + '@npmcli/fs@2.1.2': dependencies: '@gar/promisify': 1.1.3 semver: 7.6.3 - /@npmcli/fs@3.1.1: - resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/fs@3.1.1': dependencies: semver: 7.6.3 - /@npmcli/git@2.1.0: - resolution: {integrity: sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==} + '@npmcli/git@2.1.0': dependencies: '@npmcli/promise-spawn': 1.3.2 lru-cache: 6.0.0 @@ -5340,9 +16533,7 @@ packages: transitivePeerDependencies: - bluebird - /@npmcli/git@4.1.0: - resolution: {integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/git@4.1.0': dependencies: '@npmcli/promise-spawn': 6.0.2 lru-cache: 7.18.3 @@ -5355,34 +16546,24 @@ packages: transitivePeerDependencies: - bluebird - /@npmcli/installed-package-contents@1.0.7: - resolution: {integrity: sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==} - engines: {node: '>= 10'} - hasBin: true + '@npmcli/installed-package-contents@1.0.7': dependencies: npm-bundled: 1.1.2 npm-normalize-package-bin: 1.0.1 - /@npmcli/installed-package-contents@2.1.0: - resolution: {integrity: sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true + '@npmcli/installed-package-contents@2.1.0': dependencies: npm-bundled: 3.0.1 npm-normalize-package-bin: 3.0.1 - /@npmcli/map-workspaces@2.0.4: - resolution: {integrity: sha512-bMo0aAfwhVwqoVM5UzX1DJnlvVvzDCHae821jv48L1EsrYwfOZChlqWYXEtto/+BkBXetPbEWgau++/brh4oVg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + '@npmcli/map-workspaces@2.0.4': dependencies: '@npmcli/name-from-folder': 1.0.1 glob: 8.1.0 minimatch: 5.1.6 read-package-json-fast: 2.0.3 - /@npmcli/metavuln-calculator@2.0.0: - resolution: {integrity: sha512-VVW+JhWCKRwCTE+0xvD6p3uV4WpqocNYYtzyvenqL/u1Q3Xx6fGTJ+6UoIoii07fbuEO9U3IIyuGY0CYHDv1sg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16} + '@npmcli/metavuln-calculator@2.0.0': dependencies: cacache: 15.3.0 json-parse-even-better-errors: 2.3.1 @@ -5392,50 +16573,35 @@ packages: - bluebird - supports-color - /@npmcli/move-file@1.1.2: - resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} - engines: {node: '>=10'} - deprecated: This functionality has been moved to @npmcli/fs + '@npmcli/move-file@1.1.2': dependencies: mkdirp: 1.0.4 rimraf: 3.0.2 - /@npmcli/move-file@2.0.1: - resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This functionality has been moved to @npmcli/fs + '@npmcli/move-file@2.0.1': dependencies: mkdirp: 1.0.4 rimraf: 3.0.2 - /@npmcli/name-from-folder@1.0.1: - resolution: {integrity: sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==} + '@npmcli/name-from-folder@1.0.1': {} - /@npmcli/node-gyp@1.0.3: - resolution: {integrity: sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==} + '@npmcli/node-gyp@1.0.3': {} - /@npmcli/node-gyp@3.0.0: - resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/node-gyp@3.0.0': {} - /@npmcli/package-json@1.0.1: - resolution: {integrity: sha512-y6jnu76E9C23osz8gEMBayZmaZ69vFOIk8vR1FJL/wbEJ54+9aVG9rLTjQKSXfgYZEr50nw1txBBFfBZZe+bYg==} + '@npmcli/package-json@1.0.1': dependencies: json-parse-even-better-errors: 2.3.1 - /@npmcli/promise-spawn@1.3.2: - resolution: {integrity: sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==} + '@npmcli/promise-spawn@1.3.2': dependencies: infer-owner: 1.0.4 - /@npmcli/promise-spawn@6.0.2: - resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/promise-spawn@6.0.2': dependencies: which: 3.0.1 - /@npmcli/run-script@2.0.0: - resolution: {integrity: sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig==} + '@npmcli/run-script@2.0.0': dependencies: '@npmcli/node-gyp': 1.0.3 '@npmcli/promise-spawn': 1.3.2 @@ -5445,9 +16611,7 @@ packages: - bluebird - supports-color - /@npmcli/run-script@6.0.2: - resolution: {integrity: sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/run-script@6.0.2': dependencies: '@npmcli/node-gyp': 3.0.0 '@npmcli/promise-spawn': 6.0.2 @@ -5458,13 +16622,11 @@ packages: - bluebird - supports-color - /@octokit/auth-token@2.5.0: - resolution: {integrity: sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==} + '@octokit/auth-token@2.5.0': dependencies: '@octokit/types': 6.41.0 - /@octokit/core@3.6.0: - resolution: {integrity: sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==} + '@octokit/core@3.6.0': dependencies: '@octokit/auth-token': 2.5.0 '@octokit/graphql': 4.8.0 @@ -5476,15 +16638,13 @@ packages: transitivePeerDependencies: - encoding - /@octokit/endpoint@6.0.12: - resolution: {integrity: sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==} + '@octokit/endpoint@6.0.12': dependencies: '@octokit/types': 6.41.0 is-plain-object: 5.0.0 universal-user-agent: 6.0.1 - /@octokit/graphql@4.8.0: - resolution: {integrity: sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==} + '@octokit/graphql@4.8.0': dependencies: '@octokit/request': 5.6.3 '@octokit/types': 6.41.0 @@ -5492,42 +16652,30 @@ packages: transitivePeerDependencies: - encoding - /@octokit/openapi-types@12.11.0: - resolution: {integrity: sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==} + '@octokit/openapi-types@12.11.0': {} - /@octokit/plugin-paginate-rest@2.21.3(@octokit/core@3.6.0): - resolution: {integrity: sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==} - peerDependencies: - '@octokit/core': '>=2' + '@octokit/plugin-paginate-rest@2.21.3(@octokit/core@3.6.0)': dependencies: '@octokit/core': 3.6.0 '@octokit/types': 6.41.0 - /@octokit/plugin-request-log@1.0.4(@octokit/core@3.6.0): - resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} - peerDependencies: - '@octokit/core': '>=3' + '@octokit/plugin-request-log@1.0.4(@octokit/core@3.6.0)': dependencies: '@octokit/core': 3.6.0 - /@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0): - resolution: {integrity: sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==} - peerDependencies: - '@octokit/core': '>=3' + '@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0)': dependencies: '@octokit/core': 3.6.0 '@octokit/types': 6.41.0 deprecation: 2.3.1 - /@octokit/request-error@2.1.0: - resolution: {integrity: sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==} + '@octokit/request-error@2.1.0': dependencies: '@octokit/types': 6.41.0 deprecation: 2.3.1 once: 1.4.0 - /@octokit/request@5.6.3: - resolution: {integrity: sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==} + '@octokit/request@5.6.3': dependencies: '@octokit/endpoint': 6.0.12 '@octokit/request-error': 2.1.0 @@ -5538,8 +16686,7 @@ packages: transitivePeerDependencies: - encoding - /@octokit/rest@18.12.0: - resolution: {integrity: sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==} + '@octokit/rest@18.12.0': dependencies: '@octokit/core': 3.6.0 '@octokit/plugin-paginate-rest': 2.21.3(@octokit/core@3.6.0) @@ -5548,62 +16695,24 @@ packages: transitivePeerDependencies: - encoding - /@octokit/types@6.41.0: - resolution: {integrity: sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==} + '@octokit/types@6.41.0': dependencies: '@octokit/openapi-types': 12.11.0 - /@one-ini/wasm@0.1.1: - resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} - dev: false + '@one-ini/wasm@0.1.1': {} - /@opentelemetry/api@1.9.0: - resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} - engines: {node: '>=8.0.0'} - dev: false + '@opentelemetry/api@1.9.0': {} - /@panva/hkdf@1.2.1: - resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==} - dev: false + '@panva/hkdf@1.2.1': {} - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true + '@pkgjs/parseargs@0.11.0': optional: true - /@playwright/test@1.39.0: - resolution: {integrity: sha512-3u1iFqgzl7zr004bGPYiN/5EZpRUSFddQBra8Rqll5N0/vfpqlP9I9EXqAoGacuAbX6c9Ulg/Cjqglp5VkK6UQ==} - engines: {node: '>=16'} - hasBin: true + '@playwright/test@1.39.0': dependencies: playwright: 1.39.0 - /@pmmmwh/react-refresh-webpack-plugin@0.5.15(react-refresh@0.11.0)(webpack-dev-server@4.15.2)(webpack@5.93.0): - resolution: {integrity: sha512-LFWllMA55pzB9D34w/wXUCf8+c+IYKuJDgxiZ3qMhl64KRMBHYM1I3VdGaD2BV5FNPV2/S2596bppxHbv2ZydQ==} - engines: {node: '>= 10.13'} - peerDependencies: - '@types/webpack': 4.x || 5.x - react-refresh: '>=0.10.0 <1.0.0' - sockjs-client: ^1.4.0 - type-fest: '>=0.17.0 <5.0.0' - webpack: '>=4.43.0 <6.0.0' - webpack-dev-server: 3.x || 4.x || 5.x - webpack-hot-middleware: 2.x - webpack-plugin-serve: 0.x || 1.x - peerDependenciesMeta: - '@types/webpack': - optional: true - sockjs-client: - optional: true - type-fest: - optional: true - webpack-dev-server: - optional: true - webpack-hot-middleware: - optional: true - webpack-plugin-serve: - optional: true + '@pmmmwh/react-refresh-webpack-plugin@0.5.15(react-refresh@0.11.0)(webpack-dev-server@4.15.2)(webpack@5.93.0)': dependencies: ansi-html: 0.0.9 core-js-pure: 3.37.1 @@ -5615,109 +16724,73 @@ packages: source-map: 0.7.4 webpack: 5.93.0(webpack-cli@5.1.4) webpack-dev-server: 4.15.2(webpack@5.93.0) - dev: false - /@prisma/client@5.17.0(prisma@5.17.0): - resolution: {integrity: sha512-N2tnyKayT0Zf7mHjwEyE8iG7FwTmXDHFZ1GnNhQp0pJUObsuel4ZZ1XwfuAYkq5mRIiC/Kot0kt0tGCfLJ70Jw==} - engines: {node: '>=16.13'} - requiresBuild: true - peerDependencies: - prisma: '*' - peerDependenciesMeta: - prisma: - optional: true + '@prisma/client@5.17.0(prisma@5.17.0)': dependencies: prisma: 5.17.0 - dev: false - /@prisma/debug@3.8.1: - resolution: {integrity: sha512-ft4VPTYME1UBJ7trfrBuF2w9jX1ipDy786T9fAEskNGb+y26gPDqz5fiEWc2kgHNeVdz/qTI/V3wXILRyEcgxQ==} + '@prisma/debug@3.8.1': dependencies: '@types/debug': 4.1.7 ms: 2.1.3 strip-ansi: 6.0.1 - dev: true - /@prisma/debug@5.17.0: - resolution: {integrity: sha512-l7+AteR3P8FXiYyo496zkuoiJ5r9jLQEdUuxIxNCN1ud8rdbH3GTxm+f+dCyaSv9l9WY+29L9czaVRXz9mULfg==} + '@prisma/debug@5.17.0': {} - /@prisma/engines-version@5.17.0-31.393aa359c9ad4a4bb28630fb5613f9c281cde053: - resolution: {integrity: sha512-tUuxZZysZDcrk5oaNOdrBnnkoTtmNQPkzINFDjz7eG6vcs9AVDmA/F6K5Plsb2aQc/l5M2EnFqn3htng9FA4hg==} + '@prisma/engines-version@5.17.0-31.393aa359c9ad4a4bb28630fb5613f9c281cde053': {} - /@prisma/engines@5.17.0: - resolution: {integrity: sha512-+r+Nf+JP210Jur+/X8SIPLtz+uW9YA4QO5IXA+KcSOBe/shT47bCcRMTYCbOESw3FFYFTwe7vU6KTWHKPiwvtg==} - requiresBuild: true + '@prisma/engines@5.17.0': dependencies: '@prisma/debug': 5.17.0 '@prisma/engines-version': 5.17.0-31.393aa359c9ad4a4bb28630fb5613f9c281cde053 '@prisma/fetch-engine': 5.17.0 '@prisma/get-platform': 5.17.0 - /@prisma/fetch-engine@5.17.0: - resolution: {integrity: sha512-ESxiOaHuC488ilLPnrv/tM2KrPhQB5TRris/IeIV4ZvUuKeaicCl4Xj/JCQeG9IlxqOgf1cCg5h5vAzlewN91Q==} + '@prisma/fetch-engine@5.17.0': dependencies: '@prisma/debug': 5.17.0 '@prisma/engines-version': 5.17.0-31.393aa359c9ad4a4bb28630fb5613f9c281cde053 '@prisma/get-platform': 5.17.0 - /@prisma/generator-helper@3.8.1: - resolution: {integrity: sha512-3zSy+XTEjmjLj6NO+/YPN1Cu7or3xA11TOoOnLRJ9G4pTT67RJXjK0L9Xy5n+3I0Xlb7xrWCgo8MvQQLMWzxPA==} + '@prisma/generator-helper@3.8.1': dependencies: '@prisma/debug': 3.8.1 '@types/cross-spawn': 6.0.2 chalk: 4.1.2 cross-spawn: 7.0.3 - dev: true - /@prisma/get-platform@5.17.0: - resolution: {integrity: sha512-UlDgbRozCP1rfJ5Tlkf3Cnftb6srGrEQ4Nm3og+1Se2gWmCZ0hmPIi+tQikGDUVLlvOWx3Gyi9LzgRP+HTXV9w==} + '@prisma/get-platform@5.17.0': dependencies: '@prisma/debug': 5.17.0 - /@protobufjs/aspromise@1.1.2: - resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + '@protobufjs/aspromise@1.1.2': {} - /@protobufjs/base64@1.1.2: - resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + '@protobufjs/base64@1.1.2': {} - /@protobufjs/codegen@2.0.4: - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + '@protobufjs/codegen@2.0.4': {} - /@protobufjs/eventemitter@1.1.0: - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + '@protobufjs/eventemitter@1.1.0': {} - /@protobufjs/fetch@1.1.0: - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + '@protobufjs/fetch@1.1.0': dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/inquire': 1.1.0 - /@protobufjs/float@1.0.2: - resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + '@protobufjs/float@1.0.2': {} - /@protobufjs/inquire@1.1.0: - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + '@protobufjs/inquire@1.1.0': {} - /@protobufjs/path@1.1.2: - resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + '@protobufjs/path@1.1.2': {} - /@protobufjs/pool@1.1.0: - resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + '@protobufjs/pool@1.1.0': {} - /@protobufjs/utf8@1.1.0: - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + '@protobufjs/utf8@1.1.0': {} - /@rc-component/async-validator@5.0.4: - resolution: {integrity: sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==} - engines: {node: '>=14.x'} + '@rc-component/async-validator@5.0.4': dependencies: '@babel/runtime': 7.25.0 - /@rc-component/color-picker@1.5.3(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-+tGGH3nLmYXTalVe0L8hSZNs73VTP5ueSHwUlDC77KKRaN7G4DS4wcpG5DTDzdcV/Yas+rzA6UGgIyzd8fS4cw==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + '@rc-component/color-picker@1.5.3(react-dom@18.3.1)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 '@ctrl/tinycolor': 3.6.1 @@ -5726,29 +16799,18 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /@rc-component/context@1.4.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + '@rc-component/context@1.4.0(react-dom@18.3.1)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /@rc-component/mini-decimal@1.1.0: - resolution: {integrity: sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==} - engines: {node: '>=8.x'} + '@rc-component/mini-decimal@1.1.0': dependencies: '@babel/runtime': 7.25.0 - /@rc-component/mutate-observer@1.1.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + '@rc-component/mutate-observer@1.1.0(react-dom@18.3.1)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 @@ -5756,12 +16818,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /@rc-component/portal@1.1.2(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + '@rc-component/portal@1.1.2(react-dom@18.3.1)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 @@ -5769,12 +16826,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /@rc-component/qrcode@1.0.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + '@rc-component/qrcode@1.0.0(react-dom@18.3.1)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 @@ -5782,12 +16834,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /@rc-component/tour@1.15.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-h6hyILDwL+In9GAgRobwRWihLqqsD7Uft3fZGrJ7L4EiyCoxbnNYwzPXDfz7vNDhWeVyvAWQJj9fJCzpI4+b4g==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + '@rc-component/tour@1.15.0(react-dom@18.3.1)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) @@ -5797,12 +16844,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /@rc-component/trigger@2.2.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-QarBCji02YE9aRFhZgRZmOpXBj0IZutRippsVBv85sxvG4FGk/vRxwAlkn3MS9zK5mwbETd86mAVg2tKqTkdJA==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + '@rc-component/trigger@2.2.0(react-dom@18.3.1)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) @@ -5813,21 +16855,9 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /@remix-run/router@1.18.0: - resolution: {integrity: sha512-L3jkqmqoSVBVKHfpGZmLrex0lxR5SucGA0sUfFzGctehw+S/ggL9L/0NnC5mw6P8HUWpFZ3nQw3cRApjjWx9Sw==} - engines: {node: '>=14.0.0'} - dev: false + '@remix-run/router@1.18.0': {} - /@rjsf/antd@5.19.4(@ant-design/icons@5.4.0)(@rjsf/core@5.10.0)(@rjsf/utils@5.10.0)(antd@5.19.4)(dayjs@1.11.12)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-oWeHkNEWTzNWTNI7fxLRCbWf89aM7Xj3/SQfxVTCYniDQTR6PWQYZ9E6glDpfzbN66gV3E+blvDnxrcq3+pWIA==} - engines: {node: '>=14'} - peerDependencies: - '@ant-design/icons': ^4.0.0 || ^5.0.0 - '@rjsf/core': ^5.19.x - '@rjsf/utils': ^5.19.x - antd: ^4.24.0 || ^5.8.5 - dayjs: ^1.8.0 - react: ^16.14.0 || >=17 + '@rjsf/antd@5.19.4(@ant-design/icons@5.4.0)(@rjsf/core@5.10.0)(@rjsf/utils@5.10.0)(antd@5.19.4)(dayjs@1.11.12)(react-dom@18.3.1)(react@18.3.1)': dependencies: '@ant-design/icons': 5.4.0(react-dom@18.3.1)(react@18.3.1) '@rjsf/core': 5.10.0(@rjsf/utils@5.10.0)(react@18.3.1) @@ -5841,14 +16871,8 @@ packages: react: 18.3.1 transitivePeerDependencies: - react-dom - dev: false - /@rjsf/core@5.10.0(@rjsf/utils@5.10.0)(react@18.3.1): - resolution: {integrity: sha512-G9KapNurCpP9l/CK4rR3/pQ1rKuaD1BxdzHjaWUWrpUbEqbDTeNu+5630ymUf0y8A04JuSN1guQRVyYl0Dlfxw==} - engines: {node: '>=14'} - peerDependencies: - '@rjsf/utils': ^5.8.x - react: ^16.14.0 || >=17 + '@rjsf/core@5.10.0(@rjsf/utils@5.10.0)(react@18.3.1)': dependencies: '@rjsf/utils': 5.10.0(react@18.3.1) lodash: 4.17.21 @@ -5857,13 +16881,8 @@ packages: nanoid: 3.3.7 prop-types: 15.8.1 react: 18.3.1 - dev: false - /@rjsf/utils@5.10.0(react@18.3.1): - resolution: {integrity: sha512-HGytUxCGtV6OCOw4PbjFcksxrPIxUt0y3T9oqCTsP4xiqnLfve4ZfY9FkbHzPSGOXVp57yCNNEZTWiK6tcV9uA==} - engines: {node: '>=14'} - peerDependencies: - react: ^16.14.0 || >=17 + '@rjsf/utils@5.10.0(react@18.3.1)': dependencies: json-schema-merge-allof: 0.8.1 jsonpointer: 5.0.1 @@ -5871,40 +16890,20 @@ packages: lodash-es: 4.17.21 react: 18.3.1 react-is: 18.3.1 - dev: false - /@rjsf/validator-ajv6@5.10.0(@rjsf/utils@5.10.0): - resolution: {integrity: sha512-XywXT7Gs8V0mx5xZ5cc95HH73B7kpWma1qozQJC7DeTHoYhbLpfOrZdsYuFYAO4xmGD+hS7zNarsHlOWPUiW2w==} - engines: {node: '>=14'} - peerDependencies: - '@rjsf/utils': ^5.8.x + '@rjsf/validator-ajv6@5.10.0(@rjsf/utils@5.10.0)': dependencies: '@rjsf/utils': 5.10.0(react@18.3.1) ajv: 6.12.6 lodash: 4.17.21 lodash-es: 4.17.21 - dev: false - /@rollup/plugin-alias@3.1.9(rollup@1.32.1): - resolution: {integrity: sha512-QI5fsEvm9bDzt32k39wpOwZhVzRcL5ydcffUHMyLVaVaLeC70I8TJZ17F1z1eMoLu4E/UOcH9BWVkKpIKdrfiw==} - engines: {node: '>=8.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0 + '@rollup/plugin-alias@3.1.9(rollup@1.32.1)': dependencies: rollup: 1.32.1 slash: 3.0.0 - dev: true - /@rollup/plugin-babel@5.3.1(@babel/core@7.25.2)(rollup@2.79.1): - resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} - engines: {node: '>= 10.0.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@types/babel__core': ^7.1.9 - rollup: ^1.20.0||^2.0.0 - peerDependenciesMeta: - '@types/babel__core': - optional: true + '@rollup/plugin-babel@5.3.1(@babel/core@7.25.2)(rollup@2.79.1)': dependencies: '@babel/core': 7.25.2 '@babel/helper-module-imports': 7.24.7 @@ -5912,13 +16911,8 @@ packages: rollup: 2.79.1 transitivePeerDependencies: - supports-color - dev: false - /@rollup/plugin-commonjs@11.1.0(rollup@1.32.1): - resolution: {integrity: sha512-Ycr12N3ZPN96Fw2STurD21jMqzKwL9QuFhms3SD7KKRK7oaXUsBU9Zt0jL/rOPHiPYisI21/rXGO3jr9BnLHUA==} - engines: {node: '>= 8.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0 + '@rollup/plugin-commonjs@11.1.0(rollup@1.32.1)': dependencies: '@rollup/pluginutils': 3.1.0(rollup@1.32.1) commondir: 1.0.1 @@ -5928,16 +16922,8 @@ packages: magic-string: 0.25.9 resolve: 1.22.8 rollup: 1.32.1 - dev: true - /@rollup/plugin-commonjs@23.0.7(rollup@3.29.4): - resolution: {integrity: sha512-hsSD5Qzyuat/swzrExGG5l7EuIlPhwTsT7KwKbSCQzIcJWjRxiimi/0tyMYY2bByitNb3i1p+6JWEDGa0NvT0Q==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.68.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-commonjs@23.0.7(rollup@3.29.4)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@3.29.4) commondir: 1.0.1 @@ -5946,16 +16932,8 @@ packages: is-reference: 1.2.1 magic-string: 0.27.0 rollup: 3.29.4 - dev: true - /@rollup/plugin-commonjs@24.0.0(rollup@2.78.0): - resolution: {integrity: sha512-0w0wyykzdyRRPHOb0cQt14mIBLujfAv6GgP6g8nvg/iBxEm112t3YPPq+Buqe2+imvElTka+bjNlJ/gB56TD8g==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.68.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-commonjs@24.0.0(rollup@2.78.0)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@2.78.0) commondir: 1.0.1 @@ -5964,16 +16942,8 @@ packages: is-reference: 1.2.1 magic-string: 0.27.0 rollup: 2.78.0 - dev: false - /@rollup/plugin-commonjs@25.0.8(rollup@3.29.4): - resolution: {integrity: sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.68.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-commonjs@25.0.8(rollup@3.29.4)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@3.29.4) commondir: 1.0.1 @@ -5982,62 +16952,29 @@ packages: is-reference: 1.2.1 magic-string: 0.30.11 rollup: 3.29.4 - dev: true - /@rollup/plugin-json@4.1.0(rollup@1.32.1): - resolution: {integrity: sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==} - peerDependencies: - rollup: ^1.20.0 || ^2.0.0 + '@rollup/plugin-json@4.1.0(rollup@1.32.1)': dependencies: '@rollup/pluginutils': 3.1.0(rollup@1.32.1) rollup: 1.32.1 - dev: true - /@rollup/plugin-json@5.0.2(rollup@3.29.4): - resolution: {integrity: sha512-D1CoOT2wPvadWLhVcmpkDnesTzjhNIQRWLsc3fA49IFOP2Y84cFOOJ+nKGYedvXHKUsPeq07HR4hXpBBr+CHlA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-json@5.0.2(rollup@3.29.4)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@3.29.4) rollup: 3.29.4 - dev: true - /@rollup/plugin-json@6.1.0(rollup@3.29.4): - resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-json@6.1.0(rollup@3.29.4)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@3.29.4) rollup: 3.29.4 - dev: true - /@rollup/plugin-multi-entry@6.0.1(rollup@3.29.4): - resolution: {integrity: sha512-AXm6toPyTSfbYZWghQGbom1Uh7dHXlrGa+HoiYNhQtDUE3Q7LqoUYdVQx9E1579QWS1uOiu+cZRSE4okO7ySgw==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-multi-entry@6.0.1(rollup@3.29.4)': dependencies: '@rollup/plugin-virtual': 3.0.2(rollup@3.29.4) matched: 5.0.1 rollup: 3.29.4 - dev: true - /@rollup/plugin-node-resolve@11.2.1(rollup@2.79.1): - resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} - engines: {node: '>= 10.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0 + '@rollup/plugin-node-resolve@11.2.1(rollup@2.79.1)': dependencies: '@rollup/pluginutils': 3.1.0(rollup@2.79.1) '@types/resolve': 1.17.1 @@ -6046,16 +16983,8 @@ packages: is-module: 1.0.0 resolve: 1.22.8 rollup: 2.79.1 - dev: false - /@rollup/plugin-node-resolve@15.2.3(rollup@3.29.4): - resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.78.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-node-resolve@15.2.3(rollup@3.29.4)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@3.29.4) '@types/resolve': 1.20.2 @@ -6064,13 +16993,8 @@ packages: is-module: 1.0.0 resolve: 1.22.8 rollup: 3.29.4 - dev: true - /@rollup/plugin-node-resolve@6.1.0(rollup@1.32.1): - resolution: {integrity: sha512-Cv7PDIvxdE40SWilY5WgZpqfIUEaDxFxs89zCAHjqyRwlTSuql4M5hjIuc5QYJkOH0/vyiyNXKD72O+LhRipGA==} - engines: {node: '>= 8.0.0'} - peerDependencies: - rollup: ^1.20.0 + '@rollup/plugin-node-resolve@6.1.0(rollup@1.32.1)': dependencies: '@rollup/pluginutils': 3.1.0(rollup@1.32.1) '@types/resolve': 0.0.8 @@ -6078,337 +17002,153 @@ packages: is-module: 1.0.0 resolve: 1.22.8 rollup: 1.32.1 - dev: true - /@rollup/plugin-replace@2.4.2(rollup@2.79.1): - resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} - peerDependencies: - rollup: ^1.20.0 || ^2.0.0 + '@rollup/plugin-replace@2.4.2(rollup@2.79.1)': dependencies: '@rollup/pluginutils': 3.1.0(rollup@2.79.1) magic-string: 0.25.9 rollup: 2.79.1 - dev: false - /@rollup/plugin-replace@5.0.7(rollup@3.29.4): - resolution: {integrity: sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-replace@5.0.7(rollup@3.29.4)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@3.29.4) magic-string: 0.30.11 rollup: 3.29.4 - dev: true - /@rollup/plugin-terser@0.1.0(rollup@3.29.4): - resolution: {integrity: sha512-N2KK+qUfHX2hBzVzM41UWGLrEmcjVC37spC8R3c9mt3oEDFKh3N2e12/lLp9aVSt86veR0TQiCNQXrm8C6aiUQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.x || ^3.x - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-terser@0.1.0(rollup@3.29.4)': dependencies: rollup: 3.29.4 terser: 5.31.3 - dev: true - /@rollup/plugin-terser@0.4.4(rollup@3.29.4): - resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-terser@0.4.4(rollup@3.29.4)': dependencies: rollup: 3.29.4 serialize-javascript: 6.0.2 - smob: 1.5.0 - terser: 5.31.3 - dev: true - - /@rollup/plugin-typescript@11.1.6(rollup@3.29.4)(tslib@2.6.3)(typescript@5.5.4): - resolution: {integrity: sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.14.0||^3.0.0||^4.0.0 - tslib: '*' - typescript: '>=3.7.0' - peerDependenciesMeta: - rollup: - optional: true - tslib: - optional: true + smob: 1.5.0 + terser: 5.31.3 + + '@rollup/plugin-typescript@11.1.6(rollup@3.29.4)(tslib@2.6.3)(typescript@5.5.4)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@3.29.4) resolve: 1.22.8 rollup: 3.29.4 tslib: 2.6.3 typescript: 5.5.4 - dev: true - /@rollup/plugin-typescript@11.1.6(rollup@4.19.1)(tslib@2.6.3)(typescript@5.5.4): - resolution: {integrity: sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.14.0||^3.0.0||^4.0.0 - tslib: '*' - typescript: '>=3.7.0' - peerDependenciesMeta: - rollup: - optional: true - tslib: - optional: true + '@rollup/plugin-typescript@11.1.6(rollup@4.19.1)(tslib@2.6.3)(typescript@5.5.4)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.19.1) resolve: 1.22.8 rollup: 4.19.1 tslib: 2.6.3 typescript: 5.5.4 - dev: true - /@rollup/plugin-virtual@3.0.2(rollup@3.29.4): - resolution: {integrity: sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-virtual@3.0.2(rollup@3.29.4)': dependencies: rollup: 3.29.4 - dev: true - /@rollup/pluginutils@3.1.0(rollup@1.32.1): - resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} - engines: {node: '>= 8.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0 + '@rollup/pluginutils@3.1.0(rollup@1.32.1)': dependencies: '@types/estree': 0.0.39 estree-walker: 1.0.1 picomatch: 2.3.1 rollup: 1.32.1 - dev: true - /@rollup/pluginutils@3.1.0(rollup@2.79.1): - resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} - engines: {node: '>= 8.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0 + '@rollup/pluginutils@3.1.0(rollup@2.79.1)': dependencies: '@types/estree': 0.0.39 estree-walker: 1.0.1 picomatch: 2.3.1 rollup: 2.79.1 - dev: false - /@rollup/pluginutils@4.2.1: - resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} - engines: {node: '>= 8.0.0'} + '@rollup/pluginutils@4.2.1': dependencies: estree-walker: 2.0.2 picomatch: 2.3.1 - dev: true - /@rollup/pluginutils@5.1.0(rollup@2.78.0): - resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/pluginutils@5.1.0(rollup@2.78.0)': dependencies: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 rollup: 2.78.0 - dev: false - /@rollup/pluginutils@5.1.0(rollup@3.29.4): - resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/pluginutils@5.1.0(rollup@3.29.4)': dependencies: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 rollup: 3.29.4 - dev: true - /@rollup/pluginutils@5.1.0(rollup@4.19.1): - resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/pluginutils@5.1.0(rollup@4.19.1)': dependencies: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 rollup: 4.19.1 - dev: true - /@rollup/rollup-android-arm-eabi@4.19.1: - resolution: {integrity: sha512-XzqSg714++M+FXhHfXpS1tDnNZNpgxxuGZWlRG/jSj+VEPmZ0yg6jV4E0AL3uyBKxO8mO3xtOsP5mQ+XLfrlww==} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true + '@rollup/rollup-android-arm-eabi@4.19.1': optional: true - /@rollup/rollup-android-arm64@4.19.1: - resolution: {integrity: sha512-thFUbkHteM20BGShD6P08aungq4irbIZKUNbG70LN8RkO7YztcGPiKTTGZS7Kw+x5h8hOXs0i4OaHwFxlpQN6A==} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true + '@rollup/rollup-android-arm64@4.19.1': optional: true - /@rollup/rollup-darwin-arm64@4.19.1: - resolution: {integrity: sha512-8o6eqeFZzVLia2hKPUZk4jdE3zW7LCcZr+MD18tXkgBBid3lssGVAYuox8x6YHoEPDdDa9ixTaStcmx88lio5Q==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + '@rollup/rollup-darwin-arm64@4.19.1': optional: true - /@rollup/rollup-darwin-x64@4.19.1: - resolution: {integrity: sha512-4T42heKsnbjkn7ovYiAdDVRRWZLU9Kmhdt6HafZxFcUdpjlBlxj4wDrt1yFWLk7G4+E+8p2C9tcmSu0KA6auGA==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + '@rollup/rollup-darwin-x64@4.19.1': optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.19.1: - resolution: {integrity: sha512-MXg1xp+e5GhZ3Vit1gGEyoC+dyQUBy2JgVQ+3hUrD9wZMkUw/ywgkpK7oZgnB6kPpGrxJ41clkPPnsknuD6M2Q==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-arm-gnueabihf@4.19.1': optional: true - /@rollup/rollup-linux-arm-musleabihf@4.19.1: - resolution: {integrity: sha512-DZNLwIY4ftPSRVkJEaxYkq7u2zel7aah57HESuNkUnz+3bZHxwkCUkrfS2IWC1sxK6F2QNIR0Qr/YXw7nkF3Pw==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-arm-musleabihf@4.19.1': optional: true - /@rollup/rollup-linux-arm64-gnu@4.19.1: - resolution: {integrity: sha512-C7evongnjyxdngSDRRSQv5GvyfISizgtk9RM+z2biV5kY6S/NF/wta7K+DanmktC5DkuaJQgoKGf7KUDmA7RUw==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-arm64-gnu@4.19.1': optional: true - /@rollup/rollup-linux-arm64-musl@4.19.1: - resolution: {integrity: sha512-89tFWqxfxLLHkAthAcrTs9etAoBFRduNfWdl2xUs/yLV+7XDrJ5yuXMHptNqf1Zw0UCA3cAutkAiAokYCkaPtw==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-arm64-musl@4.19.1': optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.19.1: - resolution: {integrity: sha512-PromGeV50sq+YfaisG8W3fd+Cl6mnOOiNv2qKKqKCpiiEke2KiKVyDqG/Mb9GWKbYMHj5a01fq/qlUR28PFhCQ==} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-powerpc64le-gnu@4.19.1': optional: true - /@rollup/rollup-linux-riscv64-gnu@4.19.1: - resolution: {integrity: sha512-/1BmHYh+iz0cNCP0oHCuF8CSiNj0JOGf0jRlSo3L/FAyZyG2rGBuKpkZVH9YF+x58r1jgWxvm1aRg3DHrLDt6A==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-riscv64-gnu@4.19.1': optional: true - /@rollup/rollup-linux-s390x-gnu@4.19.1: - resolution: {integrity: sha512-0cYP5rGkQWRZKy9/HtsWVStLXzCF3cCBTRI+qRL8Z+wkYlqN7zrSYm6FuY5Kd5ysS5aH0q5lVgb/WbG4jqXN1Q==} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-s390x-gnu@4.19.1': optional: true - /@rollup/rollup-linux-x64-gnu@4.19.1: - resolution: {integrity: sha512-XUXeI9eM8rMP8aGvii/aOOiMvTs7xlCosq9xCjcqI9+5hBxtjDpD+7Abm1ZhVIFE1J2h2VIg0t2DX/gjespC2Q==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-x64-gnu@4.19.1': optional: true - /@rollup/rollup-linux-x64-musl@4.19.1: - resolution: {integrity: sha512-V7cBw/cKXMfEVhpSvVZhC+iGifD6U1zJ4tbibjjN+Xi3blSXaj/rJynAkCFFQfoG6VZrAiP7uGVzL440Q6Me2Q==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-x64-musl@4.19.1': optional: true - /@rollup/rollup-win32-arm64-msvc@4.19.1: - resolution: {integrity: sha512-88brja2vldW/76jWATlBqHEoGjJLRnP0WOEKAUbMcXaAZnemNhlAHSyj4jIwMoP2T750LE9lblvD4e2jXleZsA==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-win32-arm64-msvc@4.19.1': optional: true - /@rollup/rollup-win32-ia32-msvc@4.19.1: - resolution: {integrity: sha512-LdxxcqRVSXi6k6JUrTah1rHuaupoeuiv38du8Mt4r4IPer3kwlTo+RuvfE8KzZ/tL6BhaPlzJ3835i6CxrFIRQ==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-win32-ia32-msvc@4.19.1': optional: true - /@rollup/rollup-win32-x64-msvc@4.19.1: - resolution: {integrity: sha512-2bIrL28PcK3YCqD9anGxDxamxdiJAxA+l7fWIwM5o8UqNy1t3d1NdAweO2XhA0KTDJ5aH1FsuiT5+7VhtHliXg==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-win32-x64-msvc@4.19.1': optional: true - /@rushstack/eslint-patch@1.10.4: - resolution: {integrity: sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==} + '@rushstack/eslint-patch@1.10.4': {} - /@segment/analytics-core@1.6.0: - resolution: {integrity: sha512-bn9X++IScUfpT7aJGjKU/yJAu/Ko2sYD6HsKA70Z2560E89x30pqgqboVKY8kootvQnT4UKCJiUr5NDMgjmWdQ==} + '@segment/analytics-core@1.6.0': dependencies: '@lukeed/uuid': 2.0.1 '@segment/analytics-generic-utils': 1.2.0 dset: 3.1.3 tslib: 2.6.3 - dev: true - /@segment/analytics-generic-utils@1.2.0: - resolution: {integrity: sha512-DfnW6mW3YQOLlDQQdR89k4EqfHb0g/3XvBXkovH1FstUN93eL1kfW9CsDcVQyH3bAC5ZsFyjA/o/1Q2j0QeoWw==} + '@segment/analytics-generic-utils@1.2.0': dependencies: tslib: 2.6.3 - dev: true - /@segment/analytics-next@1.72.1: - resolution: {integrity: sha512-OeCe/jMAWxC5a1fY8RRszIzG7zevmkRHEaUQZMXskPFPWu2fB9r8A/JeZtoX9+kKlNg2SMMAdsnIRxsvaHIkMA==} + '@segment/analytics-next@1.72.1': dependencies: '@lukeed/uuid': 2.0.1 '@segment/analytics-core': 1.6.0 @@ -6422,74 +17162,50 @@ packages: unfetch: 4.2.0 transitivePeerDependencies: - encoding - dev: true - /@segment/analytics.js-video-plugins@0.2.1: - resolution: {integrity: sha512-lZwCyEXT4aaHBLNK433okEKdxGAuyrVmop4BpQqQSJuRz0DglPZgd9B/XjiiWs1UyOankg2aNYMN3VcS8t4eSQ==} + '@segment/analytics.js-video-plugins@0.2.1': dependencies: unfetch: 3.1.2 - dev: true - /@segment/facade@3.4.10: - resolution: {integrity: sha512-xVQBbB/lNvk/u8+ey0kC/+g8pT3l0gCT8O2y9Z+StMMn3KAFAQ9w8xfgef67tJybktOKKU7pQGRPolRM1i1pdA==} + '@segment/facade@3.4.10': dependencies: '@segment/isodate-traverse': 1.1.1 inherits: 2.0.4 new-date: 1.0.3 obj-case: 0.2.1 - dev: true - /@segment/isodate-traverse@1.1.1: - resolution: {integrity: sha512-+G6e1SgAUkcq0EDMi+SRLfT48TNlLPF3QnSgFGVs0V9F3o3fq/woQ2rHFlW20W0yy5NnCUH0QGU3Am2rZy/E3w==} + '@segment/isodate-traverse@1.1.1': dependencies: '@segment/isodate': 1.0.3 - dev: true - /@segment/isodate@1.0.3: - resolution: {integrity: sha512-BtanDuvJqnACFkeeYje7pWULVv8RgZaqKHWwGFnL/g/TH/CcZjkIVTfGDp/MAxmilYHUkrX70SqwnYSTNEaN7A==} - dev: true + '@segment/isodate@1.0.3': {} - /@sensejs/kafkajs-zstd-support@0.11.0(kafkajs@2.2.4): - resolution: {integrity: sha512-qWTaL7wUOUv/HLW8zBmfReVWFn1qOUvubqdhbjMzf1mD6at0dkOFF5g+QSi8Nb3RXWJeNb0KhgIwbOm/S+wPaQ==} - peerDependencies: - kafkajs: ^2.0.2 + '@sensejs/kafkajs-zstd-support@0.11.0(kafkajs@2.2.4)': dependencies: kafkajs: 2.2.4 tslib: 2.6.3 zstd-napi: 0.0.6 - dev: false - /@sentry-internal/feedback@7.118.0: - resolution: {integrity: sha512-IYOGRcqIqKJJpMwBBv+0JTu0FPpXnakJYvOx/XEa/SNyF5+l7b9gGEjUVWh1ok50kTLW/XPnpnXNAGQcoKHg+w==} - engines: {node: '>=12'} + '@sentry-internal/feedback@7.118.0': dependencies: '@sentry/core': 7.118.0 '@sentry/types': 7.118.0 '@sentry/utils': 7.118.0 - dev: false - /@sentry-internal/replay-canvas@7.118.0: - resolution: {integrity: sha512-XxHlCClvrxmVKpiZetFYyiBaPQNiojoBGFFVgbbWBIAPc+fWeLJ2BMoQEBjn/0NA/8u8T6lErK5YQo/eIx9+XQ==} - engines: {node: '>=12'} + '@sentry-internal/replay-canvas@7.118.0': dependencies: '@sentry/core': 7.118.0 '@sentry/replay': 7.118.0 '@sentry/types': 7.118.0 '@sentry/utils': 7.118.0 - dev: false - /@sentry-internal/tracing@7.118.0: - resolution: {integrity: sha512-dERAshKlQLrBscHSarhHyUeGsu652bDTUN1FK0m4e3X48M3I5/s+0N880Qjpe5MprNLcINlaIgdQ9jkisvxjfw==} - engines: {node: '>=8'} + '@sentry-internal/tracing@7.118.0': dependencies: '@sentry/core': 7.118.0 '@sentry/types': 7.118.0 '@sentry/utils': 7.118.0 - dev: false - /@sentry/browser@7.118.0: - resolution: {integrity: sha512-8onDOFV1VLEoBuqA5yaJeR3FF1JNuxr5C7p1oN3OwY724iTVqQnOLmZKZaSnHV3RkY67wKDGQkQIie14sc+42g==} - engines: {node: '>=8'} + '@sentry/browser@7.118.0': dependencies: '@sentry-internal/feedback': 7.118.0 '@sentry-internal/replay-canvas': 7.118.0 @@ -6499,13 +17215,8 @@ packages: '@sentry/replay': 7.118.0 '@sentry/types': 7.118.0 '@sentry/utils': 7.118.0 - dev: false - /@sentry/cli@1.77.3: - resolution: {integrity: sha512-c3eDqcDRmy4TFz2bFU5Y6QatlpoBPPa8cxBooaS4aMQpnIdLYPF1xhyyiW0LQlDUNc3rRjNF7oN5qKoaRoMTQQ==} - engines: {node: '>= 8'} - hasBin: true - requiresBuild: true + '@sentry/cli@1.77.3': dependencies: https-proxy-agent: 5.0.1 mkdirp: 0.5.6 @@ -6516,36 +17227,20 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false - /@sentry/core@7.118.0: - resolution: {integrity: sha512-ol0xBdp3/K11IMAYSQE0FMxBOOH9hMsb/rjxXWe0hfM5c72CqYWL3ol7voPci0GELJ5CZG+9ImEU1V9r6gK64g==} - engines: {node: '>=8'} + '@sentry/core@7.118.0': dependencies: '@sentry/types': 7.118.0 '@sentry/utils': 7.118.0 - dev: false - /@sentry/integrations@7.118.0: - resolution: {integrity: sha512-C2rR4NvIMjokF8jP5qzSf1o2zxDx7IeYnr8u15Kb2+HdZtX559owALR0hfgwnfeElqMhGlJBaKUWZ48lXJMzCQ==} - engines: {node: '>=8'} + '@sentry/integrations@7.118.0': dependencies: '@sentry/core': 7.118.0 '@sentry/types': 7.118.0 '@sentry/utils': 7.118.0 localforage: 1.10.0 - dev: false - /@sentry/nextjs@7.118.0(next@14.2.5)(react@18.3.1)(webpack@5.93.0): - resolution: {integrity: sha512-UFhg4QSZ6LqOKTU67kgjojy23ZqoIgB1fjwOS6S10d5LKdbz7POwrNwHqi+aB3YIqyrSvRtFCXA+8mmsE0QoqA==} - engines: {node: '>=8'} - peerDependencies: - next: ^10.0.8 || ^11.0 || ^12.0 || ^13.0 || ^14.0 - react: 16.x || 17.x || 18.x - webpack: '>= 4.0.0' - peerDependenciesMeta: - webpack: - optional: true + '@sentry/nextjs@7.118.0(next@14.2.5)(react@18.3.1)(webpack@5.93.0)': dependencies: '@rollup/plugin-commonjs': 24.0.0(rollup@2.78.0) '@sentry/core': 7.118.0 @@ -6566,24 +17261,16 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false - /@sentry/node@7.118.0: - resolution: {integrity: sha512-79N63DvYKkNPqzmc0cjO+vMZ/nU7+CbE3K3COQNiV7gk58+666G9mRZQJuZVOVebatq5wM5UR0G4LPkwD+J84g==} - engines: {node: '>=8'} + '@sentry/node@7.118.0': dependencies: '@sentry-internal/tracing': 7.118.0 '@sentry/core': 7.118.0 '@sentry/integrations': 7.118.0 '@sentry/types': 7.118.0 '@sentry/utils': 7.118.0 - dev: false - /@sentry/react@7.118.0(react@18.3.1): - resolution: {integrity: sha512-oEYe5TGk8S7YzPsFqDf4xDHjfzs35/QFE+dou3S2d24OYpso8Tq4C5f1VzYmnOOyy85T7JNicYLSo0n0NSJvQg==} - engines: {node: '>=8'} - peerDependencies: - react: 15.x || 16.x || 17.x || 18.x + '@sentry/react@7.118.0(react@18.3.1)': dependencies: '@sentry/browser': 7.118.0 '@sentry/core': 7.118.0 @@ -6591,65 +17278,43 @@ packages: '@sentry/utils': 7.118.0 hoist-non-react-statics: 3.3.2 react: 18.3.1 - dev: false - /@sentry/replay@7.118.0: - resolution: {integrity: sha512-boQfCL+1L/tSZ9Huwi00+VtU+Ih1Lcg8HtxBuAsBCJR9pQgUL5jp7ECYdTeeHyCh/RJO7JqV1CEoGTgohe10mA==} - engines: {node: '>=12'} + '@sentry/replay@7.118.0': dependencies: '@sentry-internal/tracing': 7.118.0 '@sentry/core': 7.118.0 '@sentry/types': 7.118.0 '@sentry/utils': 7.118.0 - dev: false - /@sentry/types@7.118.0: - resolution: {integrity: sha512-2drqrD2+6kgeg+W/ycmiti3G4lJrV3hGjY9PpJ3bJeXrh6T2+LxKPzlgSEnKFaeQWkXdZ4eaUbtTXVebMjb5JA==} - engines: {node: '>=8'} - dev: false + '@sentry/types@7.118.0': {} - /@sentry/utils@7.118.0: - resolution: {integrity: sha512-43qItc/ydxZV1Zb3Kn2M54RwL9XXFa3IAYBO8S82Qvq5YUYmU2AmJ1jgg7DabXlVSWgMA1HntwqnOV3JLaEnTQ==} - engines: {node: '>=8'} + '@sentry/utils@7.118.0': dependencies: '@sentry/types': 7.118.0 - dev: false - /@sentry/vercel-edge@7.118.0: - resolution: {integrity: sha512-DclIpD0/Xi0kNeT97aFFtMLBzk3GFZXf9mpGgbx29Gt9Vt7Fyq8ZA9izALHYzXx056fqQaLtvOAkQxWsy9QuSA==} - engines: {node: '>=8'} + '@sentry/vercel-edge@7.118.0': dependencies: '@sentry-internal/tracing': 7.118.0 '@sentry/core': 7.118.0 '@sentry/integrations': 7.118.0 '@sentry/types': 7.118.0 '@sentry/utils': 7.118.0 - dev: false - /@sentry/webpack-plugin@1.21.0: - resolution: {integrity: sha512-x0PYIMWcsTauqxgl7vWUY6sANl+XGKtx7DCVnnY7aOIIlIna0jChTAPANTfA2QrK+VK+4I/4JxatCEZBnXh3Og==} - engines: {node: '>= 8'} + '@sentry/webpack-plugin@1.21.0': dependencies: '@sentry/cli': 1.77.3 webpack-sources: 3.2.3 transitivePeerDependencies: - encoding - supports-color - dev: false - /@sigstore/bundle@1.1.0: - resolution: {integrity: sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@sigstore/bundle@1.1.0': dependencies: '@sigstore/protobuf-specs': 0.2.1 - /@sigstore/protobuf-specs@0.2.1: - resolution: {integrity: sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@sigstore/protobuf-specs@0.2.1': {} - /@sigstore/sign@1.0.0: - resolution: {integrity: sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@sigstore/sign@1.0.0': dependencies: '@sigstore/bundle': 1.1.0 '@sigstore/protobuf-specs': 0.2.1 @@ -6657,92 +17322,64 @@ packages: transitivePeerDependencies: - supports-color - /@sigstore/tuf@1.0.3: - resolution: {integrity: sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@sigstore/tuf@1.0.3': dependencies: '@sigstore/protobuf-specs': 0.2.1 tuf-js: 1.1.7 transitivePeerDependencies: - supports-color - /@sinclair/typebox@0.24.51: - resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} + '@sinclair/typebox@0.24.51': {} - /@sinclair/typebox@0.25.24: - resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} - dev: true + '@sinclair/typebox@0.25.24': {} - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@sinclair/typebox@0.27.8': {} - /@sindresorhus/merge-streams@2.3.0: - resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} - engines: {node: '>=18'} - dev: true + '@sindresorhus/merge-streams@2.3.0': {} - /@sinonjs/commons@1.8.6: - resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + '@sinonjs/commons@1.8.6': dependencies: type-detect: 4.0.8 - /@sinonjs/commons@3.0.1: - resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 - /@sinonjs/fake-timers@10.3.0: - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + '@sinonjs/fake-timers@10.3.0': dependencies: '@sinonjs/commons': 3.0.1 - /@sinonjs/fake-timers@8.1.0: - resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} + '@sinonjs/fake-timers@8.1.0': dependencies: '@sinonjs/commons': 1.8.6 - dev: false - /@sinonjs/fake-timers@9.1.2: - resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==} + '@sinonjs/fake-timers@9.1.2': dependencies: '@sinonjs/commons': 1.8.6 - dev: true - /@smithy/abort-controller@3.1.1: - resolution: {integrity: sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==} - engines: {node: '>=16.0.0'} + '@smithy/abort-controller@3.1.1': dependencies: '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@smithy/chunked-blob-reader-native@3.0.0: - resolution: {integrity: sha512-VDkpCYW+peSuM4zJip5WDfqvg2Mo/e8yxOv3VF1m11y7B8KKMKVFtmZWDe36Fvk8rGuWrPZHHXZ7rR7uM5yWyg==} + '@smithy/chunked-blob-reader-native@3.0.0': dependencies: '@smithy/util-base64': 3.0.0 tslib: 2.6.3 - dev: false - /@smithy/chunked-blob-reader@3.0.0: - resolution: {integrity: sha512-sbnURCwjF0gSToGlsBiAmd1lRCmSn72nu9axfJu5lIx6RUEgHu6GwTMbqCdhQSi0Pumcm5vFxsi9XWXb2mTaoA==} + '@smithy/chunked-blob-reader@3.0.0': dependencies: tslib: 2.6.3 - dev: false - /@smithy/config-resolver@3.0.5: - resolution: {integrity: sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==} - engines: {node: '>=16.0.0'} + '@smithy/config-resolver@3.0.5': dependencies: '@smithy/node-config-provider': 3.1.4 '@smithy/types': 3.3.0 '@smithy/util-config-provider': 3.0.0 '@smithy/util-middleware': 3.0.3 tslib: 2.6.3 - dev: false - /@smithy/core@2.3.1: - resolution: {integrity: sha512-BC7VMXx/1BCmRPCVzzn4HGWAtsrb7/0758EtwOGFJQrlSwJBEjCcDLNZLFoL/68JexYa2s+KmgL/UfmXdG6v1w==} - engines: {node: '>=16.0.0'} + '@smithy/core@2.3.1': dependencies: '@smithy/middleware-endpoint': 3.1.0 '@smithy/middleware-retry': 3.0.13 @@ -6752,142 +17389,99 @@ packages: '@smithy/types': 3.3.0 '@smithy/util-middleware': 3.0.3 tslib: 2.6.3 - dev: false - /@smithy/credential-provider-imds@3.2.0: - resolution: {integrity: sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA==} - engines: {node: '>=16.0.0'} + '@smithy/credential-provider-imds@3.2.0': dependencies: '@smithy/node-config-provider': 3.1.4 '@smithy/property-provider': 3.1.3 '@smithy/types': 3.3.0 '@smithy/url-parser': 3.0.3 tslib: 2.6.3 - dev: false - /@smithy/eventstream-codec@3.1.2: - resolution: {integrity: sha512-0mBcu49JWt4MXhrhRAlxASNy0IjDRFU+aWNDRal9OtUJvJNiwDuyKMUONSOjLjSCeGwZaE0wOErdqULer8r7yw==} + '@smithy/eventstream-codec@3.1.2': dependencies: '@aws-crypto/crc32': 5.2.0 '@smithy/types': 3.3.0 '@smithy/util-hex-encoding': 3.0.0 tslib: 2.6.3 - dev: false - /@smithy/eventstream-serde-browser@3.0.5: - resolution: {integrity: sha512-dEyiUYL/ekDfk+2Ra4GxV+xNnFoCmk1nuIXg+fMChFTrM2uI/1r9AdiTYzPqgb72yIv/NtAj6C3dG//1wwgakQ==} - engines: {node: '>=16.0.0'} + '@smithy/eventstream-serde-browser@3.0.5': dependencies: '@smithy/eventstream-serde-universal': 3.0.4 '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@smithy/eventstream-serde-config-resolver@3.0.3: - resolution: {integrity: sha512-NVTYjOuYpGfrN/VbRQgn31x73KDLfCXCsFdad8DiIc3IcdxL+dYA9zEQPyOP7Fy2QL8CPy2WE4WCUD+ZsLNfaQ==} - engines: {node: '>=16.0.0'} + '@smithy/eventstream-serde-config-resolver@3.0.3': dependencies: '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@smithy/eventstream-serde-node@3.0.4: - resolution: {integrity: sha512-mjlG0OzGAYuUpdUpflfb9zyLrBGgmQmrobNT8b42ZTsGv/J03+t24uhhtVEKG/b2jFtPIHF74Bq+VUtbzEKOKg==} - engines: {node: '>=16.0.0'} + '@smithy/eventstream-serde-node@3.0.4': dependencies: '@smithy/eventstream-serde-universal': 3.0.4 '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@smithy/eventstream-serde-universal@3.0.4: - resolution: {integrity: sha512-Od9dv8zh3PgOD7Vj4T3HSuox16n0VG8jJIM2gvKASL6aCtcS8CfHZDWe1Ik3ZXW6xBouU+45Q5wgoliWDZiJ0A==} - engines: {node: '>=16.0.0'} + '@smithy/eventstream-serde-universal@3.0.4': dependencies: '@smithy/eventstream-codec': 3.1.2 '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@smithy/fetch-http-handler@3.2.4: - resolution: {integrity: sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==} + '@smithy/fetch-http-handler@3.2.4': dependencies: '@smithy/protocol-http': 4.1.0 '@smithy/querystring-builder': 3.0.3 '@smithy/types': 3.3.0 '@smithy/util-base64': 3.0.0 tslib: 2.6.3 - dev: false - /@smithy/hash-blob-browser@3.1.2: - resolution: {integrity: sha512-hAbfqN2UbISltakCC2TP0kx4LqXBttEv2MqSPE98gVuDFMf05lU+TpC41QtqGP3Ff5A3GwZMPfKnEy0VmEUpmg==} + '@smithy/hash-blob-browser@3.1.2': dependencies: '@smithy/chunked-blob-reader': 3.0.0 '@smithy/chunked-blob-reader-native': 3.0.0 '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@smithy/hash-node@3.0.3: - resolution: {integrity: sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==} - engines: {node: '>=16.0.0'} + '@smithy/hash-node@3.0.3': dependencies: '@smithy/types': 3.3.0 '@smithy/util-buffer-from': 3.0.0 '@smithy/util-utf8': 3.0.0 tslib: 2.6.3 - dev: false - /@smithy/hash-stream-node@3.1.2: - resolution: {integrity: sha512-PBgDMeEdDzi6JxKwbfBtwQG9eT9cVwsf0dZzLXoJF4sHKHs5HEo/3lJWpn6jibfJwT34I1EBXpBnZE8AxAft6g==} - engines: {node: '>=16.0.0'} + '@smithy/hash-stream-node@3.1.2': dependencies: '@smithy/types': 3.3.0 '@smithy/util-utf8': 3.0.0 tslib: 2.6.3 - dev: false - /@smithy/invalid-dependency@3.0.3: - resolution: {integrity: sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==} + '@smithy/invalid-dependency@3.0.3': dependencies: '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@smithy/is-array-buffer@2.2.0: - resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} - engines: {node: '>=14.0.0'} + '@smithy/is-array-buffer@2.2.0': dependencies: tslib: 2.6.3 - dev: false - /@smithy/is-array-buffer@3.0.0: - resolution: {integrity: sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==} - engines: {node: '>=16.0.0'} + '@smithy/is-array-buffer@3.0.0': dependencies: tslib: 2.6.3 - dev: false - /@smithy/md5-js@3.0.3: - resolution: {integrity: sha512-O/SAkGVwpWmelpj/8yDtsaVe6sINHLB1q8YE/+ZQbDxIw3SRLbTZuRaI10K12sVoENdnHqzPp5i3/H+BcZ3m3Q==} + '@smithy/md5-js@3.0.3': dependencies: '@smithy/types': 3.3.0 '@smithy/util-utf8': 3.0.0 tslib: 2.6.3 - dev: false - /@smithy/middleware-content-length@3.0.5: - resolution: {integrity: sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw==} - engines: {node: '>=16.0.0'} + '@smithy/middleware-content-length@3.0.5': dependencies: '@smithy/protocol-http': 4.1.0 '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@smithy/middleware-endpoint@3.1.0: - resolution: {integrity: sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==} - engines: {node: '>=16.0.0'} + '@smithy/middleware-endpoint@3.1.0': dependencies: '@smithy/middleware-serde': 3.0.3 '@smithy/node-config-provider': 3.1.4 @@ -6896,11 +17490,8 @@ packages: '@smithy/url-parser': 3.0.3 '@smithy/util-middleware': 3.0.3 tslib: 2.6.3 - dev: false - /@smithy/middleware-retry@3.0.13: - resolution: {integrity: sha512-zvCLfaRYCaUmjbF2yxShGZdolSHft7NNCTA28HVN9hKcEbOH+g5irr1X9s+in8EpambclGnevZY4A3lYpvDCFw==} - engines: {node: '>=16.0.0'} + '@smithy/middleware-retry@3.0.13': dependencies: '@smithy/node-config-provider': 3.1.4 '@smithy/protocol-http': 4.1.0 @@ -6911,96 +17502,63 @@ packages: '@smithy/util-retry': 3.0.3 tslib: 2.6.3 uuid: 9.0.1 - dev: false - /@smithy/middleware-serde@3.0.3: - resolution: {integrity: sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==} - engines: {node: '>=16.0.0'} + '@smithy/middleware-serde@3.0.3': dependencies: '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@smithy/middleware-stack@3.0.3: - resolution: {integrity: sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==} - engines: {node: '>=16.0.0'} + '@smithy/middleware-stack@3.0.3': dependencies: '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@smithy/node-config-provider@3.1.4: - resolution: {integrity: sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==} - engines: {node: '>=16.0.0'} + '@smithy/node-config-provider@3.1.4': dependencies: '@smithy/property-provider': 3.1.3 '@smithy/shared-ini-file-loader': 3.1.4 '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@smithy/node-http-handler@3.1.4: - resolution: {integrity: sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==} - engines: {node: '>=16.0.0'} + '@smithy/node-http-handler@3.1.4': dependencies: '@smithy/abort-controller': 3.1.1 '@smithy/protocol-http': 4.1.0 '@smithy/querystring-builder': 3.0.3 '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@smithy/property-provider@3.1.3: - resolution: {integrity: sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==} - engines: {node: '>=16.0.0'} + '@smithy/property-provider@3.1.3': dependencies: '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@smithy/protocol-http@4.1.0: - resolution: {integrity: sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==} - engines: {node: '>=16.0.0'} + '@smithy/protocol-http@4.1.0': dependencies: '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@smithy/querystring-builder@3.0.3: - resolution: {integrity: sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==} - engines: {node: '>=16.0.0'} + '@smithy/querystring-builder@3.0.3': dependencies: '@smithy/types': 3.3.0 '@smithy/util-uri-escape': 3.0.0 tslib: 2.6.3 - dev: false - /@smithy/querystring-parser@3.0.3: - resolution: {integrity: sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==} - engines: {node: '>=16.0.0'} + '@smithy/querystring-parser@3.0.3': dependencies: '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@smithy/service-error-classification@3.0.3: - resolution: {integrity: sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==} - engines: {node: '>=16.0.0'} + '@smithy/service-error-classification@3.0.3': dependencies: '@smithy/types': 3.3.0 - dev: false - /@smithy/shared-ini-file-loader@3.1.4: - resolution: {integrity: sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==} - engines: {node: '>=16.0.0'} + '@smithy/shared-ini-file-loader@3.1.4': dependencies: '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@smithy/signature-v4@4.1.0: - resolution: {integrity: sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag==} - engines: {node: '>=16.0.0'} + '@smithy/signature-v4@4.1.0': dependencies: '@smithy/is-array-buffer': 3.0.0 '@smithy/protocol-http': 4.1.0 @@ -7010,11 +17568,8 @@ packages: '@smithy/util-uri-escape': 3.0.0 '@smithy/util-utf8': 3.0.0 tslib: 2.6.3 - dev: false - /@smithy/smithy-client@3.1.11: - resolution: {integrity: sha512-l0BpyYkciNyMaS+PnFFz4aO5sBcXvGLoJd7mX9xrMBIm2nIQBVvYgp2ZpPDMzwjKCavsXu06iuCm0F6ZJZc6yQ==} - engines: {node: '>=16.0.0'} + '@smithy/smithy-client@3.1.11': dependencies: '@smithy/middleware-endpoint': 3.1.0 '@smithy/middleware-stack': 3.0.3 @@ -7022,82 +17577,54 @@ packages: '@smithy/types': 3.3.0 '@smithy/util-stream': 3.1.3 tslib: 2.6.3 - dev: false - /@smithy/types@3.3.0: - resolution: {integrity: sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==} - engines: {node: '>=16.0.0'} + '@smithy/types@3.3.0': dependencies: tslib: 2.6.3 - dev: false - /@smithy/url-parser@3.0.3: - resolution: {integrity: sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==} + '@smithy/url-parser@3.0.3': dependencies: '@smithy/querystring-parser': 3.0.3 '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@smithy/util-base64@3.0.0: - resolution: {integrity: sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==} - engines: {node: '>=16.0.0'} + '@smithy/util-base64@3.0.0': dependencies: '@smithy/util-buffer-from': 3.0.0 '@smithy/util-utf8': 3.0.0 tslib: 2.6.3 - dev: false - /@smithy/util-body-length-browser@3.0.0: - resolution: {integrity: sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==} + '@smithy/util-body-length-browser@3.0.0': dependencies: tslib: 2.6.3 - dev: false - /@smithy/util-body-length-node@3.0.0: - resolution: {integrity: sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==} - engines: {node: '>=16.0.0'} + '@smithy/util-body-length-node@3.0.0': dependencies: tslib: 2.6.3 - dev: false - /@smithy/util-buffer-from@2.2.0: - resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} - engines: {node: '>=14.0.0'} + '@smithy/util-buffer-from@2.2.0': dependencies: '@smithy/is-array-buffer': 2.2.0 tslib: 2.6.3 - dev: false - /@smithy/util-buffer-from@3.0.0: - resolution: {integrity: sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==} - engines: {node: '>=16.0.0'} + '@smithy/util-buffer-from@3.0.0': dependencies: '@smithy/is-array-buffer': 3.0.0 tslib: 2.6.3 - dev: false - /@smithy/util-config-provider@3.0.0: - resolution: {integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==} - engines: {node: '>=16.0.0'} + '@smithy/util-config-provider@3.0.0': dependencies: tslib: 2.6.3 - dev: false - /@smithy/util-defaults-mode-browser@3.0.13: - resolution: {integrity: sha512-ZIRSUsnnMRStOP6OKtW+gCSiVFkwnfQF2xtf32QKAbHR6ACjhbAybDvry+3L5qQYdh3H6+7yD/AiUE45n8mTTw==} - engines: {node: '>= 10.0.0'} + '@smithy/util-defaults-mode-browser@3.0.13': dependencies: '@smithy/property-provider': 3.1.3 '@smithy/smithy-client': 3.1.11 '@smithy/types': 3.3.0 bowser: 2.11.0 tslib: 2.6.3 - dev: false - /@smithy/util-defaults-mode-node@3.0.13: - resolution: {integrity: sha512-voUa8TFJGfD+U12tlNNLCDlXibt9vRdNzRX45Onk/WxZe7TS+hTOZouEZRa7oARGicdgeXvt1A0W45qLGYdy+g==} - engines: {node: '>= 10.0.0'} + '@smithy/util-defaults-mode-node@3.0.13': dependencies: '@smithy/config-resolver': 3.0.5 '@smithy/credential-provider-imds': 3.2.0 @@ -7106,44 +17633,29 @@ packages: '@smithy/smithy-client': 3.1.11 '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@smithy/util-endpoints@2.0.5: - resolution: {integrity: sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==} - engines: {node: '>=16.0.0'} + '@smithy/util-endpoints@2.0.5': dependencies: '@smithy/node-config-provider': 3.1.4 '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@smithy/util-hex-encoding@3.0.0: - resolution: {integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==} - engines: {node: '>=16.0.0'} + '@smithy/util-hex-encoding@3.0.0': dependencies: tslib: 2.6.3 - dev: false - /@smithy/util-middleware@3.0.3: - resolution: {integrity: sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==} - engines: {node: '>=16.0.0'} + '@smithy/util-middleware@3.0.3': dependencies: '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@smithy/util-retry@3.0.3: - resolution: {integrity: sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==} - engines: {node: '>=16.0.0'} + '@smithy/util-retry@3.0.3': dependencies: '@smithy/service-error-classification': 3.0.3 '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@smithy/util-stream@3.1.3: - resolution: {integrity: sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==} - engines: {node: '>=16.0.0'} + '@smithy/util-stream@3.1.3': dependencies: '@smithy/fetch-http-handler': 3.2.4 '@smithy/node-http-handler': 3.1.4 @@ -7153,84 +17665,51 @@ packages: '@smithy/util-hex-encoding': 3.0.0 '@smithy/util-utf8': 3.0.0 tslib: 2.6.3 - dev: false - /@smithy/util-uri-escape@3.0.0: - resolution: {integrity: sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==} - engines: {node: '>=16.0.0'} + '@smithy/util-uri-escape@3.0.0': dependencies: tslib: 2.6.3 - dev: false - /@smithy/util-utf8@2.3.0: - resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} - engines: {node: '>=14.0.0'} + '@smithy/util-utf8@2.3.0': dependencies: '@smithy/util-buffer-from': 2.2.0 tslib: 2.6.3 - dev: false - /@smithy/util-utf8@3.0.0: - resolution: {integrity: sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==} - engines: {node: '>=16.0.0'} + '@smithy/util-utf8@3.0.0': dependencies: '@smithy/util-buffer-from': 3.0.0 tslib: 2.6.3 - dev: false - /@smithy/util-waiter@3.1.2: - resolution: {integrity: sha512-4pP0EV3iTsexDx+8PPGAKCQpd/6hsQBaQhqWzU4hqKPHN5epPsxKbvUTIiYIHTxaKt6/kEaqPBpu/ufvfbrRzw==} - engines: {node: '>=16.0.0'} + '@smithy/util-waiter@3.1.2': dependencies: '@smithy/abort-controller': 3.1.1 '@smithy/types': 3.3.0 tslib: 2.6.3 - dev: false - /@surma/rollup-plugin-off-main-thread@2.2.3: - resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + '@surma/rollup-plugin-off-main-thread@2.2.3': dependencies: ejs: 3.1.10 json5: 2.2.3 magic-string: 0.25.9 string.prototype.matchall: 4.0.11 - dev: false - /@svgr/babel-plugin-add-jsx-attribute@5.4.0: - resolution: {integrity: sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==} - engines: {node: '>=10'} + '@svgr/babel-plugin-add-jsx-attribute@5.4.0': {} - /@svgr/babel-plugin-remove-jsx-attribute@5.4.0: - resolution: {integrity: sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==} - engines: {node: '>=10'} + '@svgr/babel-plugin-remove-jsx-attribute@5.4.0': {} - /@svgr/babel-plugin-remove-jsx-empty-expression@5.0.1: - resolution: {integrity: sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==} - engines: {node: '>=10'} + '@svgr/babel-plugin-remove-jsx-empty-expression@5.0.1': {} - /@svgr/babel-plugin-replace-jsx-attribute-value@5.0.1: - resolution: {integrity: sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==} - engines: {node: '>=10'} + '@svgr/babel-plugin-replace-jsx-attribute-value@5.0.1': {} - /@svgr/babel-plugin-svg-dynamic-title@5.4.0: - resolution: {integrity: sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==} - engines: {node: '>=10'} + '@svgr/babel-plugin-svg-dynamic-title@5.4.0': {} - /@svgr/babel-plugin-svg-em-dimensions@5.4.0: - resolution: {integrity: sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==} - engines: {node: '>=10'} + '@svgr/babel-plugin-svg-em-dimensions@5.4.0': {} - /@svgr/babel-plugin-transform-react-native-svg@5.4.0: - resolution: {integrity: sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==} - engines: {node: '>=10'} + '@svgr/babel-plugin-transform-react-native-svg@5.4.0': {} - /@svgr/babel-plugin-transform-svg-component@5.5.0: - resolution: {integrity: sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==} - engines: {node: '>=10'} + '@svgr/babel-plugin-transform-svg-component@5.5.0': {} - /@svgr/babel-preset@5.5.0: - resolution: {integrity: sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==} - engines: {node: '>=10'} + '@svgr/babel-preset@5.5.0': dependencies: '@svgr/babel-plugin-add-jsx-attribute': 5.4.0 '@svgr/babel-plugin-remove-jsx-attribute': 5.4.0 @@ -7241,9 +17720,7 @@ packages: '@svgr/babel-plugin-transform-react-native-svg': 5.4.0 '@svgr/babel-plugin-transform-svg-component': 5.5.0 - /@svgr/core@5.5.0: - resolution: {integrity: sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==} - engines: {node: '>=10'} + '@svgr/core@5.5.0': dependencies: '@svgr/plugin-jsx': 5.5.0 camelcase: 6.3.0 @@ -7251,15 +17728,11 @@ packages: transitivePeerDependencies: - supports-color - /@svgr/hast-util-to-babel-ast@5.5.0: - resolution: {integrity: sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==} - engines: {node: '>=10'} + '@svgr/hast-util-to-babel-ast@5.5.0': dependencies: '@babel/types': 7.25.2 - /@svgr/plugin-jsx@5.5.0: - resolution: {integrity: sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==} - engines: {node: '>=10'} + '@svgr/plugin-jsx@5.5.0': dependencies: '@babel/core': 7.25.2 '@svgr/babel-preset': 5.5.0 @@ -7268,17 +17741,13 @@ packages: transitivePeerDependencies: - supports-color - /@svgr/plugin-svgo@5.5.0: - resolution: {integrity: sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==} - engines: {node: '>=10'} + '@svgr/plugin-svgo@5.5.0': dependencies: cosmiconfig: 7.1.0 deepmerge: 4.3.1 svgo: 1.3.2 - /@svgr/rollup@5.5.0: - resolution: {integrity: sha512-EiZmH2VTr+Xzyb6Ga8XtGa9MEbiU3WQnB5vHmqhwAUqibU3uwuwr7MN+QwIh/gtBk1ucMim8BCfcRTlLVREM8A==} - engines: {node: '>=10'} + '@svgr/rollup@5.5.0': dependencies: '@babel/core': 7.25.2 '@babel/plugin-transform-react-constant-elements': 7.25.1(@babel/core@7.25.2) @@ -7290,11 +17759,8 @@ packages: rollup-pluginutils: 2.8.2 transitivePeerDependencies: - supports-color - dev: true - /@svgr/webpack@5.5.0: - resolution: {integrity: sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==} - engines: {node: '>=10'} + '@svgr/webpack@5.5.0': dependencies: '@babel/core': 7.25.2 '@babel/plugin-transform-react-constant-elements': 7.25.1(@babel/core@7.25.2) @@ -7306,56 +17772,32 @@ packages: loader-utils: 2.0.4 transitivePeerDependencies: - supports-color - dev: false - /@swc/counter@0.1.3: - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - dev: false + '@swc/counter@0.1.3': {} - /@swc/helpers@0.5.5: - resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} + '@swc/helpers@0.5.5': dependencies: '@swc/counter': 0.1.3 tslib: 2.6.3 - dev: false - /@tailwindcss/typography@0.5.13(tailwindcss@3.4.7): - resolution: {integrity: sha512-ADGcJ8dX21dVVHIwTRgzrcunY6YY9uSlAHHGVKvkA+vLc5qLwEszvKts40lx7z0qc4clpjclwLeK5rVCV2P/uw==} - peerDependencies: - tailwindcss: '>=3.0.0 || insiders' + '@tailwindcss/typography@0.5.13(tailwindcss@3.4.7)': dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 tailwindcss: 3.4.7(ts-node@10.9.2) - dev: true - /@tanstack/query-core@4.36.1: - resolution: {integrity: sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA==} - dev: false + '@tanstack/query-core@4.36.1': {} - /@tanstack/react-query@4.36.1(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-y7ySVHFyyQblPl3J3eQBWpXZkliroki3ARnBKsdJchlgt7yJLRDUcf4B8soufgiYt3pEQIkBWBx1N9/ZPIeUWw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-native: '*' - peerDependenciesMeta: - react-dom: - optional: true - react-native: - optional: true + '@tanstack/react-query@4.36.1(react-dom@18.3.1)(react@18.3.1)': dependencies: '@tanstack/query-core': 4.36.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) use-sync-external-store: 1.2.2(react@18.3.1) - dev: false - /@testing-library/dom@10.4.0: - resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} - engines: {node: '>=18'} + '@testing-library/dom@10.4.0': dependencies: '@babel/code-frame': 7.24.7 '@babel/runtime': 7.25.0 @@ -7365,11 +17807,8 @@ packages: dom-accessibility-api: 0.5.16 lz-string: 1.5.0 pretty-format: 27.5.1 - dev: true - /@testing-library/dom@8.20.1: - resolution: {integrity: sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==} - engines: {node: '>=12'} + '@testing-library/dom@8.20.1': dependencies: '@babel/code-frame': 7.24.7 '@babel/runtime': 7.25.0 @@ -7379,11 +17818,8 @@ packages: dom-accessibility-api: 0.5.16 lz-string: 1.5.0 pretty-format: 27.5.1 - dev: true - /@testing-library/jest-dom@6.4.8: - resolution: {integrity: sha512-JD0G+Zc38f5MBHA4NgxQMR5XtO5Jx9g86jqturNTt2WUfRmLDIY7iKkWHDCCTiDuFMre6nxAD5wHw9W5kI4rGw==} - engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + '@testing-library/jest-dom@6.4.8': dependencies: '@adobe/css-tools': 4.4.0 '@babel/runtime': 7.25.0 @@ -7393,97 +17829,61 @@ packages: dom-accessibility-api: 0.6.3 lodash: 4.17.21 redent: 3.0.0 - dev: true - /@testing-library/react@13.4.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==} - engines: {node: '>=12'} - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 + '@testing-library/react@13.4.0(react-dom@18.3.1)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 '@testing-library/dom': 8.20.1 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: true - /@testing-library/user-event@14.5.2(@testing-library/dom@10.4.0): - resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} - engines: {node: '>=12', npm: '>=6'} - peerDependencies: - '@testing-library/dom': '>=7.21.4' + '@testing-library/user-event@14.5.2(@testing-library/dom@10.4.0)': dependencies: '@testing-library/dom': 10.4.0 - dev: true - /@tootallnate/once@1.1.2: - resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} - engines: {node: '>= 6'} + '@tootallnate/once@1.1.2': {} - /@tootallnate/once@2.0.0: - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} + '@tootallnate/once@2.0.0': {} - /@trysound/sax@0.2.0: - resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} - engines: {node: '>=10.13.0'} - dev: false + '@trysound/sax@0.2.0': {} - /@ts-morph/common@0.11.1: - resolution: {integrity: sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g==} + '@ts-morph/common@0.11.1': dependencies: fast-glob: 3.3.2 minimatch: 3.1.2 mkdirp: 1.0.4 path-browserify: 1.0.1 - dev: true - /@ts-morph/common@0.12.3: - resolution: {integrity: sha512-4tUmeLyXJnJWvTFOKtcNJ1yh0a3SsTLi2MUoyj8iUNznFRN1ZquaNe7Oukqrnki2FzZkm0J9adCNLDZxUzvj+w==} + '@ts-morph/common@0.12.3': dependencies: fast-glob: 3.3.2 minimatch: 3.1.2 mkdirp: 1.0.4 path-browserify: 1.0.1 - dev: true - /@tsconfig/node10@1.0.11: - resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + '@tsconfig/node10@1.0.11': {} - /@tsconfig/node12@1.0.11: - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + '@tsconfig/node12@1.0.11': {} - /@tsconfig/node14@1.0.3: - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + '@tsconfig/node14@1.0.3': {} - /@tsconfig/node16@1.0.4: - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@tsconfig/node16@1.0.4': {} - /@tufjs/canonical-json@1.0.0: - resolution: {integrity: sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@tufjs/canonical-json@1.0.0': {} - /@tufjs/models@1.0.4: - resolution: {integrity: sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@tufjs/models@1.0.4': dependencies: '@tufjs/canonical-json': 1.0.0 minimatch: 9.0.5 - /@types/archiver@5.3.4: - resolution: {integrity: sha512-Lj7fLBIMwYFgViVVZHEdExZC3lVYsl+QL0VmdNdIzGZH544jHveYWij6qdnBgJQDnR7pMKliN9z2cPZFEbhyPw==} + '@types/archiver@5.3.4': dependencies: '@types/readdir-glob': 1.1.5 - dev: true - /@types/aria-query@5.0.4: - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - dev: true + '@types/aria-query@5.0.4': {} - /@types/babel__core@7.20.5: - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.25.0 '@babel/types': 7.25.2 @@ -7491,528 +17891,358 @@ packages: '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.6 - /@types/babel__generator@7.6.8: - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + '@types/babel__generator@7.6.8': dependencies: '@babel/types': 7.25.2 - /@types/babel__template@7.4.4: - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + '@types/babel__template@7.4.4': dependencies: '@babel/parser': 7.25.0 '@babel/types': 7.25.2 - /@types/babel__traverse@7.20.6: - resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/babel__traverse@7.20.6': dependencies: '@babel/types': 7.25.2 - /@types/body-parser@1.19.5: - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 '@types/node': 18.19.42 - /@types/bonjour@3.5.13: - resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + '@types/bonjour@3.5.13': dependencies: '@types/node': 18.19.42 - dev: false - /@types/caseless@0.12.5: - resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} - dev: false + '@types/caseless@0.12.5': {} - /@types/chalk@2.2.0: - resolution: {integrity: sha512-1zzPV9FDe1I/WHhRkf9SNgqtRJWZqrBWgu7JGveuHmmyR9CnAPCie2N/x+iHrgnpYBIcCJWHBoMRv2TRWktsvw==} - deprecated: This is a stub types definition for chalk (https://github.com/chalk/chalk). chalk provides its own type definitions, so you don't need @types/chalk installed! + '@types/chalk@2.2.0': dependencies: chalk: 5.3.0 - dev: true - /@types/cli-progress@3.11.6: - resolution: {integrity: sha512-cE3+jb9WRlu+uOSAugewNpITJDt1VF8dHOopPO4IABFc3SXYL5WE/+PTz/FCdZRRfIujiWW3n3aMbv1eIGVRWA==} + '@types/cli-progress@3.11.6': dependencies: '@types/node': 18.19.42 - dev: true - /@types/commander@2.12.2: - resolution: {integrity: sha512-0QEFiR8ljcHp9bAbWxecjVRuAMr16ivPiGOw6KFQBVrVd0RQIcM3xKdRisH2EDWgVWujiYtHwhSkSUoAAGzH7Q==} - deprecated: This is a stub types definition for commander (https://github.com/tj/commander.js). commander provides its own type definitions, so you don't need @types/commander installed! + '@types/commander@2.12.2': dependencies: commander: 11.1.0 - dev: true - /@types/connect-history-api-fallback@1.5.4: - resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} + '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 4.19.5 '@types/node': 18.19.42 - dev: false - /@types/connect@3.4.38: - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/connect@3.4.38': dependencies: '@types/node': 18.19.42 - /@types/cookie@0.5.4: - resolution: {integrity: sha512-7z/eR6O859gyWIAjuvBWFzNURmf2oPBmJlfVWkwehU5nzIyjwBsTh7WMmEEV4JFnHuQ3ex4oyTvfKzcyJVDBNA==} - dev: false + '@types/cookie@0.5.4': {} - /@types/cross-spawn@6.0.2: - resolution: {integrity: sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==} + '@types/cross-spawn@6.0.2': dependencies: '@types/node': 18.19.42 - dev: true - /@types/crypto-js@4.2.2: - resolution: {integrity: sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==} - dev: true + '@types/crypto-js@4.2.2': {} - /@types/d3-array@3.2.1: - resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} - dev: false + '@types/d3-array@3.2.1': {} - /@types/d3-color@3.1.3: - resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} - dev: false + '@types/d3-color@3.1.3': {} - /@types/d3-ease@3.0.2: - resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} - dev: false + '@types/d3-ease@3.0.2': {} - /@types/d3-interpolate@3.0.4: - resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + '@types/d3-interpolate@3.0.4': dependencies: '@types/d3-color': 3.1.3 - dev: false - /@types/d3-path@3.1.0: - resolution: {integrity: sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==} - dev: false + '@types/d3-path@3.1.0': {} - /@types/d3-scale@4.0.8: - resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} + '@types/d3-scale@4.0.8': dependencies: '@types/d3-time': 3.0.3 - dev: false - /@types/d3-shape@3.1.6: - resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==} + '@types/d3-shape@3.1.6': dependencies: '@types/d3-path': 3.1.0 - dev: false - /@types/d3-time@3.0.3: - resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} - dev: false + '@types/d3-time@3.0.3': {} - /@types/d3-timer@3.0.2: - resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} - dev: false + '@types/d3-timer@3.0.2': {} - /@types/debug@4.1.7: - resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} + '@types/debug@4.1.7': dependencies: '@types/ms': 0.7.34 - dev: true - /@types/dlv@1.1.4: - resolution: {integrity: sha512-m8KmImw4Jt+4rIgupwfivrWEOnj1LzkmKkqbh075uG13eTQ1ZxHWT6T0vIdSQhLIjQCiR0n0lZdtyDOPO1x2Mw==} - dev: false + '@types/dlv@1.1.4': {} - /@types/docker-modem@3.0.6: - resolution: {integrity: sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==} + '@types/docker-modem@3.0.6': dependencies: '@types/node': 18.19.42 '@types/ssh2': 1.15.0 - dev: true - /@types/dockerode@3.3.31: - resolution: {integrity: sha512-42R9eoVqJDSvVspV89g7RwRqfNExgievLNWoHkg7NoWIqAmavIbgQBb4oc0qRtHkxE+I3Xxvqv7qVXFABKPBTg==} + '@types/dockerode@3.3.31': dependencies: '@types/docker-modem': 3.0.6 '@types/node': 18.19.42 '@types/ssh2': 1.15.0 - dev: true - /@types/eslint-scope@3.7.7: - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 9.6.0 '@types/estree': 1.0.5 - /@types/eslint@8.56.11: - resolution: {integrity: sha512-sVBpJMf7UPo/wGecYOpk2aQya2VUGeHhe38WG7/mN5FufNSubf5VT9Uh9Uyp8/eLJpu1/tuhJ/qTo4mhSB4V4Q==} + '@types/eslint@8.56.11': dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 - dev: false - /@types/eslint@9.6.0: - resolution: {integrity: sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==} + '@types/eslint@9.6.0': dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 - /@types/estree@0.0.39: - resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + '@types/estree@0.0.39': {} - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/estree@1.0.5': {} - /@types/expect@1.20.4: - resolution: {integrity: sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==} + '@types/expect@1.20.4': {} - /@types/express-serve-static-core@4.19.5: - resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==} + '@types/express-serve-static-core@4.19.5': dependencies: '@types/node': 18.19.42 '@types/qs': 6.9.15 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 - /@types/express@4.17.21: - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + '@types/express@4.17.21': dependencies: '@types/body-parser': 1.19.5 '@types/express-serve-static-core': 4.19.5 '@types/qs': 6.9.15 '@types/serve-static': 1.15.7 - /@types/firebase@3.2.1: - resolution: {integrity: sha512-G8XgHMu2jHlElfc2xVNaYP50F0qrqeTCjgeG1v5b4SRwWG4XKC4fCuEdVZuZaMRmVygcnbRZBAo9O7RsDvmkGQ==} - deprecated: This is a stub types definition for Firebase API (https://www.firebase.com/docs/javascript/firebase). Firebase API provides its own type definitions, so you don't need @types/firebase installed! + '@types/firebase@3.2.1': dependencies: firebase: 10.12.5 transitivePeerDependencies: - '@react-native-async-storage/async-storage' - dev: true - /@types/glob@7.2.0: - resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 '@types/node': 18.19.42 - dev: true - /@types/graceful-fs@4.1.9: - resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + '@types/graceful-fs@4.1.9': dependencies: '@types/node': 18.19.42 - /@types/html-minifier-terser@6.1.0: - resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} - dev: false + '@types/html-minifier-terser@6.1.0': {} - /@types/http-errors@2.0.4: - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + '@types/http-errors@2.0.4': {} - /@types/http-proxy@1.17.14: - resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==} + '@types/http-proxy@1.17.14': dependencies: '@types/node': 18.19.42 - dev: false - /@types/inquirer@9.0.7: - resolution: {integrity: sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g==} + '@types/inquirer@9.0.7': dependencies: '@types/through': 0.0.33 rxjs: 7.8.1 - dev: true - /@types/istanbul-lib-coverage@2.0.6: - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + '@types/istanbul-lib-coverage@2.0.6': {} - /@types/istanbul-lib-report@3.0.3: - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + '@types/istanbul-lib-report@3.0.3': dependencies: '@types/istanbul-lib-coverage': 2.0.6 - /@types/istanbul-reports@3.0.4: - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + '@types/istanbul-reports@3.0.4': dependencies: '@types/istanbul-lib-report': 3.0.3 - /@types/jest@29.5.12: - resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} + '@types/jest@29.5.12': dependencies: expect: 29.7.0 pretty-format: 29.7.0 - dev: true - /@types/js-cookie@2.2.7: - resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} - dev: false + '@types/js-cookie@2.2.7': {} - /@types/js-yaml@4.0.9: - resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} - dev: true + '@types/js-yaml@4.0.9': {} - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/json-schema@7.0.15': {} - /@types/json5@0.0.29: - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/json5@0.0.29': {} - /@types/jsonwebtoken@9.0.6: - resolution: {integrity: sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==} + '@types/jsonwebtoken@9.0.6': dependencies: '@types/node': 18.19.42 - /@types/lodash@4.17.7: - resolution: {integrity: sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==} - dev: true + '@types/lodash@4.17.7': {} - /@types/long@4.0.2: - resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} - dev: false + '@types/long@4.0.2': {} - /@types/mime@1.3.5: - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + '@types/mime@1.3.5': {} - /@types/minimatch@3.0.5: - resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + '@types/minimatch@3.0.5': {} - /@types/minimatch@5.1.2: - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - dev: true + '@types/minimatch@5.1.2': {} - /@types/ms@0.7.34: - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - dev: true + '@types/ms@0.7.34': {} - /@types/node-fetch@2.6.11: - resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} + '@types/node-fetch@2.6.11': dependencies: '@types/node': 18.19.42 form-data: 4.0.0 - dev: false - /@types/node-forge@1.3.11: - resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} + '@types/node-forge@1.3.11': dependencies: '@types/node': 18.19.42 - dev: false - /@types/node@15.14.9: - resolution: {integrity: sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==} + '@types/node@15.14.9': {} - /@types/node@16.18.11: - resolution: {integrity: sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==} - dev: true + '@types/node@16.18.11': {} - /@types/node@18.19.42: - resolution: {integrity: sha512-d2ZFc/3lnK2YCYhos8iaNIYu9Vfhr92nHiyJHRltXWjXUBjEE+A4I58Tdbnw4VhggSW+2j5y5gTrLs4biNnubg==} + '@types/node@18.19.42': dependencies: undici-types: 5.26.5 - /@types/node@20.14.14: - resolution: {integrity: sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==} + '@types/node@20.14.14': dependencies: undici-types: 5.26.5 - dev: false - /@types/nodemailer@6.4.15: - resolution: {integrity: sha512-0EBJxawVNjPkng1zm2vopRctuWVCxk34JcIlRuXSf54habUWdz1FB7wHDqOqvDa8Mtpt0Q3LTXQkAs2LNyK5jQ==} + '@types/nodemailer@6.4.15': dependencies: '@types/node': 18.19.42 - dev: true - /@types/normalize-package-data@2.4.4: - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/normalize-package-data@2.4.4': {} - /@types/parse-json@4.0.2: - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + '@types/parse-json@4.0.2': {} - /@types/pg-cursor@2.7.2: - resolution: {integrity: sha512-m3xT8bVFCvx98LuzbvXyuCdT/Hjdd/v8ml4jL4K1QF70Y8clOfCFdgoaEB1FWdcSwcpoFYZTJQaMD9/GQ27efQ==} + '@types/pg-cursor@2.7.2': dependencies: '@types/node': 18.19.42 '@types/pg': 8.11.6 - dev: false - /@types/pg-promise@5.4.3: - resolution: {integrity: sha512-ABgy5hzmcyRZxLNG6HUafpxbpmXGeVJ5dopKwssEsFeA7rpRakdoodt75HJNIjQB4He+s3PTfG1AoWQWm7OuCg==} - deprecated: This is a stub types definition for pg-promise (https://github.com/vitaly-t/pg-promise). pg-promise provides its own type definitions, so you don't need @types/pg-promise installed! + '@types/pg-promise@5.4.3': dependencies: pg-promise: 11.9.1 transitivePeerDependencies: - pg-native - dev: false - /@types/pg-query-stream@3.4.0(pg@8.11.6): - resolution: {integrity: sha512-oqGAu+5CMPAVNqemN9xYT3LBDy2qXBke15cstEuVYIvJL6lcKSNKeG61fONlVrxTYIFi9sPuGVtIweanrEZcJw==} - deprecated: This is a stub types definition. pg-query-stream provides its own type definitions, so you do not need this installed. + '@types/pg-query-stream@3.4.0(pg@8.11.6)': dependencies: pg-query-stream: 4.6.0(pg@8.11.6) transitivePeerDependencies: - pg - dev: true - /@types/pg@8.11.6: - resolution: {integrity: sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==} + '@types/pg@8.11.6': dependencies: '@types/node': 18.19.42 pg-protocol: 1.6.1 pg-types: 4.0.2 - /@types/prettier@2.7.3: - resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + '@types/prettier@2.7.3': {} - /@types/prop-types@15.7.12: - resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + '@types/prop-types@15.7.12': {} - /@types/q@1.5.8: - resolution: {integrity: sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==} + '@types/q@1.5.8': {} - /@types/qs@6.9.15: - resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + '@types/qs@6.9.15': {} - /@types/range-parser@1.2.7: - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + '@types/range-parser@1.2.7': {} - /@types/react-dom@18.3.0: - resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + '@types/react-dom@18.3.0': dependencies: '@types/react': 18.3.3 - /@types/react@18.3.3: - resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} + '@types/react@18.3.3': dependencies: '@types/prop-types': 15.7.12 csstype: 3.1.3 - /@types/readdir-glob@1.1.5: - resolution: {integrity: sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg==} + '@types/readdir-glob@1.1.5': dependencies: '@types/node': 18.19.42 - dev: true - /@types/request@2.48.12: - resolution: {integrity: sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==} + '@types/request@2.48.12': dependencies: '@types/caseless': 0.12.5 '@types/node': 18.19.42 '@types/tough-cookie': 4.0.5 form-data: 2.5.1 - dev: false - /@types/resolve@0.0.8: - resolution: {integrity: sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==} + '@types/resolve@0.0.8': dependencies: '@types/node': 18.19.42 - dev: true - /@types/resolve@1.17.1: - resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} + '@types/resolve@1.17.1': dependencies: '@types/node': 18.19.42 - dev: false - /@types/resolve@1.20.2: - resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - dev: true + '@types/resolve@1.20.2': {} - /@types/retry@0.12.0: - resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - dev: false + '@types/retry@0.12.0': {} - /@types/semver@7.5.8: - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + '@types/semver@7.5.8': {} - /@types/send@0.17.4: - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 '@types/node': 18.19.42 - /@types/serve-index@1.9.4: - resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} + '@types/serve-index@1.9.4': dependencies: '@types/express': 4.17.21 - dev: false - /@types/serve-static@1.15.7: - resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 '@types/node': 18.19.42 '@types/send': 0.17.4 - /@types/sockjs@0.3.36: - resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} + '@types/sockjs@0.3.36': dependencies: '@types/node': 18.19.42 - dev: false - /@types/ssh2-streams@0.1.12: - resolution: {integrity: sha512-Sy8tpEmCce4Tq0oSOYdfqaBpA3hDM8SoxoFh5vzFsu2oL+znzGz8oVWW7xb4K920yYMUY+PIG31qZnFMfPWNCg==} + '@types/ssh2-streams@0.1.12': dependencies: '@types/node': 18.19.42 - dev: true - /@types/ssh2@0.5.52: - resolution: {integrity: sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==} + '@types/ssh2@0.5.52': dependencies: '@types/node': 18.19.42 '@types/ssh2-streams': 0.1.12 - dev: true - /@types/ssh2@1.15.0: - resolution: {integrity: sha512-YcT8jP5F8NzWeevWvcyrrLB3zcneVjzYY9ZDSMAMboI+2zR1qYWFhwsyOFVzT7Jorn67vqxC0FRiw8YyG9P1ww==} + '@types/ssh2@1.15.0': dependencies: '@types/node': 18.19.42 - dev: true - /@types/stack-utils@2.0.3: - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + '@types/stack-utils@2.0.3': {} - /@types/strip-bom@3.0.0: - resolution: {integrity: sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==} - dev: true + '@types/strip-bom@3.0.0': {} - /@types/strip-json-comments@0.0.30: - resolution: {integrity: sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==} - dev: true + '@types/strip-json-comments@0.0.30': {} - /@types/stripe@8.0.417: - resolution: {integrity: sha512-PTuqskh9YKNENnOHGVJBm4sM0zE8B1jZw1JIskuGAPkMB+OH236QeN8scclhYGPA4nG6zTtPXgwpXdp+HPDTVw==} - deprecated: This is a stub types definition. stripe provides its own type definitions, so you do not need this installed. + '@types/stripe@8.0.417': dependencies: stripe: 11.18.0 - dev: true - /@types/through@0.0.33: - resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} + '@types/through@0.0.33': dependencies: '@types/node': 18.19.42 - dev: true - /@types/tough-cookie@4.0.5: - resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - dev: false + '@types/tough-cookie@4.0.5': {} - /@types/trusted-types@2.0.7: - resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - dev: false + '@types/trusted-types@2.0.7': {} - /@types/vinyl@2.0.12: - resolution: {integrity: sha512-Sr2fYMBUVGYq8kj3UthXFAu5UN6ZW+rYr4NACjZQJvHvj+c8lYv0CahmZ2P/r7iUkN44gGUBwqxZkrKXYPb7cw==} + '@types/vinyl@2.0.12': dependencies: '@types/expect': 1.20.4 '@types/node': 18.19.42 - /@types/web@0.0.152: - resolution: {integrity: sha512-Iu1OJ3ahq6/mwSK6jRKj2revI+avfPRWZOADcKeuv1AGCtkwbDl12AkWAl4KjiW2l4s2rkST7WagdhWOVGx9qg==} - dev: true + '@types/web@0.0.152': {} - /@types/webidl-conversions@7.0.3: - resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} - dev: false + '@types/webidl-conversions@7.0.3': {} - /@types/webpack@5.28.5(webpack-cli@5.1.4): - resolution: {integrity: sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==} + '@types/webpack@5.28.5(webpack-cli@5.1.4)': dependencies: '@types/node': 18.19.42 tapable: 2.2.1 @@ -8022,44 +18252,26 @@ packages: - esbuild - uglify-js - webpack-cli - dev: true - /@types/whatwg-url@11.0.5: - resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} + '@types/whatwg-url@11.0.5': dependencies: '@types/webidl-conversions': 7.0.3 - dev: false - /@types/ws@8.5.12: - resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} + '@types/ws@8.5.12': dependencies: '@types/node': 18.19.42 - dev: false - /@types/yargs-parser@21.0.3: - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + '@types/yargs-parser@21.0.3': {} - /@types/yargs@16.0.9: - resolution: {integrity: sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==} + '@types/yargs@16.0.9': dependencies: '@types/yargs-parser': 21.0.3 - dev: false - /@types/yargs@17.0.32: - resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + '@types/yargs@17.0.32': dependencies: '@types/yargs-parser': 21.0.3 - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.5.4): - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@eslint-community/regexpp': 4.11.0 '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) @@ -8076,18 +18288,8 @@ packages: typescript: 5.5.4 transitivePeerDependencies: - supports-color - dev: false - /@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.0)(typescript@5.5.4): - resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@eslint-community/regexpp': 4.11.0 '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) @@ -8103,30 +18305,16 @@ packages: typescript: 5.5.4 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/experimental-utils@5.62.0(eslint@8.57.0)(typescript@5.5.4): - resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@typescript-eslint/experimental-utils@5.62.0(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) eslint: 8.57.0 transitivePeerDependencies: - supports-color - typescript - dev: false - /@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4): - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 @@ -8136,17 +18324,8 @@ packages: typescript: 5.5.4 transitivePeerDependencies: - supports-color - dev: false - /@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4): - resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 @@ -8157,17 +18336,8 @@ packages: typescript: 5.5.4 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4): - resolution: {integrity: sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@typescript-eslint/scope-manager': 7.2.0 '@typescript-eslint/types': 7.2.0 @@ -8179,38 +18349,22 @@ packages: transitivePeerDependencies: - supports-color - /@typescript-eslint/scope-manager@5.62.0: - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/scope-manager@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - dev: false - /@typescript-eslint/scope-manager@7.18.0: - resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/scope-manager@7.18.0': dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - dev: true - /@typescript-eslint/scope-manager@7.2.0: - resolution: {integrity: sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/scope-manager@7.2.0': dependencies: '@typescript-eslint/types': 7.2.0 '@typescript-eslint/visitor-keys': 7.2.0 - /@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.5.4): - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) @@ -8220,17 +18374,8 @@ packages: typescript: 5.5.4 transitivePeerDependencies: - supports-color - dev: false - /@typescript-eslint/type-utils@7.18.0(eslint@8.57.0)(typescript@5.5.4): - resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) @@ -8240,30 +18385,14 @@ packages: typescript: 5.5.4 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/types@5.62.0: - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: false + '@typescript-eslint/types@5.62.0': {} - /@typescript-eslint/types@7.18.0: - resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} - engines: {node: ^18.18.0 || >=20.0.0} - dev: true + '@typescript-eslint/types@7.18.0': {} - /@typescript-eslint/types@7.2.0: - resolution: {integrity: sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/types@7.2.0': {} - /@typescript-eslint/typescript-estree@5.62.0(typescript@5.5.4): - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.5.4)': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 @@ -8275,16 +18404,8 @@ packages: typescript: 5.5.4 transitivePeerDependencies: - supports-color - dev: false - /@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4): - resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4)': dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 @@ -8297,16 +18418,8 @@ packages: typescript: 5.5.4 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/typescript-estree@7.2.0(typescript@5.5.4): - resolution: {integrity: sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/typescript-estree@7.2.0(typescript@5.5.4)': dependencies: '@typescript-eslint/types': 7.2.0 '@typescript-eslint/visitor-keys': 7.2.0 @@ -8320,11 +18433,7 @@ packages: transitivePeerDependencies: - supports-color - /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.5.4): - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.15 @@ -8338,13 +18447,8 @@ packages: transitivePeerDependencies: - supports-color - typescript - dev: false - /@typescript-eslint/utils@7.18.0(eslint@8.57.0)(typescript@5.5.4): - resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 + '@typescript-eslint/utils@7.18.0(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@typescript-eslint/scope-manager': 7.18.0 @@ -8354,45 +18458,29 @@ packages: transitivePeerDependencies: - supports-color - typescript - dev: true - /@typescript-eslint/visitor-keys@5.62.0: - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/visitor-keys@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 - dev: false - /@typescript-eslint/visitor-keys@7.18.0: - resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/visitor-keys@7.18.0': dependencies: '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 - dev: true - /@typescript-eslint/visitor-keys@7.2.0: - resolution: {integrity: sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/visitor-keys@7.2.0': dependencies: '@typescript-eslint/types': 7.2.0 eslint-visitor-keys: 3.4.3 - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@ungap/structured-clone@1.2.0': {} - /@vercel/build-utils@8.3.6: - resolution: {integrity: sha512-EPwr8tXu41aoXg9QBiF98clu5AHbKtwbp3SeX/W6c8L0fhLwiT+H/s3WDuOL/UMz0TT3B8JAdY4PZioWNEAf6g==} - dev: true + '@vercel/build-utils@8.3.6': {} - /@vercel/error-utils@2.0.2: - resolution: {integrity: sha512-Sj0LFafGpYr6pfCqrQ82X6ukRl5qpmVrHM/191kNYFqkkB9YkjlMAj6QcEsvCG259x4QZ7Tya++0AB85NDPbKQ==} - dev: true + '@vercel/error-utils@2.0.2': {} - /@vercel/fun@1.1.0: - resolution: {integrity: sha512-SpuPAo+MlAYMtcMcC0plx7Tv4Mp7SQhJJj1iIENlOnABL24kxHpL09XLQMGzZIzIW7upR8c3edwgfpRtp+dhVw==} - engines: {node: '>= 10'} + '@vercel/fun@1.1.0': dependencies: '@tootallnate/once': 2.0.0 async-listen: 1.2.0 @@ -8417,16 +18505,12 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: true - /@vercel/gatsby-plugin-vercel-analytics@1.0.11: - resolution: {integrity: sha512-iTEA0vY6RBPuEzkwUTVzSHDATo1aF6bdLLspI68mQ/BTbi5UQEGjpjyzdKOVcSYApDtFU6M6vypZ1t4vIEnHvw==} + '@vercel/gatsby-plugin-vercel-analytics@1.0.11': dependencies: web-vitals: 0.2.4 - dev: true - /@vercel/gatsby-plugin-vercel-builder@2.0.40: - resolution: {integrity: sha512-j3pZch8Qk2jfM87+dXX+xZXtdD+T2cMOmHhQWzO4oX3issxfBkkk2mAmY4o3Cxry5Xxe5iDQo6VsvY2IrWpCuA==} + '@vercel/gatsby-plugin-vercel-builder@2.0.40': dependencies: '@sinclair/typebox': 0.25.24 '@vercel/build-utils': 8.3.6 @@ -8434,32 +18518,22 @@ packages: esbuild: 0.14.47 etag: 1.8.1 fs-extra: 11.1.0 - dev: true - /@vercel/go@3.1.1: - resolution: {integrity: sha512-mrzomNYltxkjvtUmaYry5YEyvwTz6c/QQHE5Gr/pPGRIniUiP6T6OFOJ49RBN7e6pRXaNzHPVuidiuBhvHh5+Q==} - dev: true + '@vercel/go@3.1.1': {} - /@vercel/hydrogen@1.0.4: - resolution: {integrity: sha512-Sc0lpmI/J6O3o2cL75k8klL7ir2gi6kYI92O5+MrR3hh4fwz/atUIL9UWsTGuFjKTm69VAoJrmn3VKf0/0SGLw==} + '@vercel/hydrogen@1.0.4': dependencies: '@vercel/static-config': 3.0.0 ts-morph: 12.0.0 - dev: true - /@vercel/next@4.3.6: - resolution: {integrity: sha512-qUHp79xX07qYtz7DGSogyWgEMrf+eu/IGV/92YnVA1xzDBogIFc8XFvMlN8QwDrsWWsR+I2eMSiGD+P8znlsaA==} + '@vercel/next@4.3.6': dependencies: '@vercel/nft': 0.27.3 transitivePeerDependencies: - encoding - supports-color - dev: true - /@vercel/nft@0.27.3: - resolution: {integrity: sha512-oySTdDSzUAFDXpsSLk9Q943o+/Yu/+TCFxnehpFQEf/3khi2stMpTHPVNwFdvZq/Z4Ky93lE+MGHpXCRpMkSCA==} - engines: {node: '>=16'} - hasBin: true + '@vercel/nft@0.27.3': dependencies: '@mapbox/node-pre-gyp': 1.0.11 '@rollup/pluginutils': 4.2.1 @@ -8476,10 +18550,8 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: true - /@vercel/node@3.2.8: - resolution: {integrity: sha512-mINg3ab1FHIqupZlLVpmCvyqGtkafnyNesgs7ZoCbNxqbb4ZrHtPj1kHv9cvTrFlDkFapkV/Ez8nbSsHeAxtOw==} + '@vercel/node@3.2.8': dependencies: '@edge-runtime/node-utils': 2.3.0 '@edge-runtime/primitives': 4.1.0 @@ -8506,14 +18578,10 @@ packages: - '@swc/wasm' - encoding - supports-color - dev: true - /@vercel/python@4.3.1: - resolution: {integrity: sha512-pWRApBwUsAQJS8oZ7eKMiaBGbYJO71qw2CZqDFvkTj34FNBZtNIUcWSmqGfJJY5m2pU/9wt8z1CnKIyT9dstog==} - dev: true + '@vercel/python@4.3.1': {} - /@vercel/redwood@2.1.3: - resolution: {integrity: sha512-lpsdQSHS2hvSX29/rJNm4q38dVXKstS4MVg875KE6zyXpACwviXuet0Cadyv0E60w7f2B6Ra+nJMpwKz6oJ5xg==} + '@vercel/redwood@2.1.3': dependencies: '@vercel/nft': 0.27.3 '@vercel/routing-utils': 3.1.0 @@ -8523,10 +18591,8 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: true - /@vercel/remix-builder@2.2.3: - resolution: {integrity: sha512-rXb0cgCIe8xCSl6gw+j5cjMEcmgQc5nbnpyMuaQ8+lRBSN0eEl8RkufkVQ4FblGQbnPnPFBCmraUx58HxKxfZw==} + '@vercel/remix-builder@2.2.3': dependencies: '@vercel/error-utils': 2.0.2 '@vercel/nft': 0.27.3 @@ -8535,85 +18601,65 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: true - /@vercel/routing-utils@3.1.0: - resolution: {integrity: sha512-Ci5xTjVTJY/JLZXpCXpLehMft97i9fH34nu9PGav6DtwkVUF6TOPX86U0W0niQjMZ5n6/ZP0BwcJK2LOozKaGw==} + '@vercel/routing-utils@3.1.0': dependencies: path-to-regexp: 6.1.0 optionalDependencies: ajv: 6.12.6 - dev: true - /@vercel/ruby@2.1.0: - resolution: {integrity: sha512-UZYwlSEEfVnfzTmgkD+kxex9/gkZGt7unOWNyWFN7V/ZnZSsGBUgv6hXLnwejdRi3EztgRQEBd1kUKlXdIeC0Q==} - dev: true + '@vercel/ruby@2.1.0': {} - /@vercel/static-build@2.5.18: - resolution: {integrity: sha512-UgF/wrx5j07PMidvCVTjlTw1C47Ly+tpWihQyAH42xzf9BHtM+8S9UwOPdM5GYhtBuq2fmpPxFi9DCQ5sg4g7Q==} + '@vercel/static-build@2.5.18': dependencies: '@vercel/gatsby-plugin-vercel-analytics': 1.0.11 '@vercel/gatsby-plugin-vercel-builder': 2.0.40 '@vercel/static-config': 3.0.0 ts-morph: 12.0.0 - dev: true - /@vercel/static-config@3.0.0: - resolution: {integrity: sha512-2qtvcBJ1bGY0dYGYh3iM7yGKkk971FujLEDXzuW5wcZsPr1GSEjO/w2iSr3qve6nDDtBImsGoDEnus5FI4+fIw==} + '@vercel/static-config@3.0.0': dependencies: ajv: 8.6.3 json-schema-to-ts: 1.6.4 ts-morph: 12.0.0 - dev: true - /@webassemblyjs/ast@1.12.1: - resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + '@webassemblyjs/ast@1.12.1': dependencies: '@webassemblyjs/helper-numbers': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - /@webassemblyjs/floating-point-hex-parser@1.11.6: - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + '@webassemblyjs/floating-point-hex-parser@1.11.6': {} - /@webassemblyjs/helper-api-error@1.11.6: - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + '@webassemblyjs/helper-api-error@1.11.6': {} - /@webassemblyjs/helper-buffer@1.12.1: - resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + '@webassemblyjs/helper-buffer@1.12.1': {} - /@webassemblyjs/helper-numbers@1.11.6: - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + '@webassemblyjs/helper-numbers@1.11.6': dependencies: '@webassemblyjs/floating-point-hex-parser': 1.11.6 '@webassemblyjs/helper-api-error': 1.11.6 '@xtuc/long': 4.2.2 - /@webassemblyjs/helper-wasm-bytecode@1.11.6: - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} - /@webassemblyjs/helper-wasm-section@1.12.1: - resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + '@webassemblyjs/helper-wasm-section@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-buffer': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/wasm-gen': 1.12.1 - /@webassemblyjs/ieee754@1.11.6: - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + '@webassemblyjs/ieee754@1.11.6': dependencies: '@xtuc/ieee754': 1.2.0 - /@webassemblyjs/leb128@1.11.6: - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + '@webassemblyjs/leb128@1.11.6': dependencies: '@xtuc/long': 4.2.2 - /@webassemblyjs/utf8@1.11.6: - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + '@webassemblyjs/utf8@1.11.6': {} - /@webassemblyjs/wasm-edit@1.12.1: - resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + '@webassemblyjs/wasm-edit@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-buffer': 1.12.1 @@ -8624,8 +18670,7 @@ packages: '@webassemblyjs/wasm-parser': 1.12.1 '@webassemblyjs/wast-printer': 1.12.1 - /@webassemblyjs/wasm-gen@1.12.1: - resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + '@webassemblyjs/wasm-gen@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 @@ -8633,16 +18678,14 @@ packages: '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - /@webassemblyjs/wasm-opt@1.12.1: - resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + '@webassemblyjs/wasm-opt@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-buffer': 1.12.1 '@webassemblyjs/wasm-gen': 1.12.1 '@webassemblyjs/wasm-parser': 1.12.1 - /@webassemblyjs/wasm-parser@1.12.1: - resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + '@webassemblyjs/wasm-parser@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-api-error': 1.11.6 @@ -8651,32 +18694,17 @@ packages: '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - /@webassemblyjs/wast-printer@1.12.1: - resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + '@webassemblyjs/wast-printer@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 - /@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.93.0): - resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.93.0)': dependencies: webpack: 5.93.0(webpack-cli@5.1.4) webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) - /@webpack-cli/generators@3.0.7(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0): - resolution: {integrity: sha512-H4dlEX8CzO5EHBYYZQop9x4w6lG9FenSF/1spLRlvRAULDgTs0VfmwOuwp03tTLml9jpMsouuVw6vEN8KpwE/w==} - engines: {node: '>=14.15.0'} - peerDependencies: - prettier: '*' - webpack: 5.x.x - webpack-cli: 5.x.x - peerDependenciesMeta: - prettier: - optional: true + '@webpack-cli/generators@3.0.7(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0)': dependencies: prettier: 2.8.8 webpack: 5.93.0(webpack-cli@5.1.4) @@ -8689,141 +18717,80 @@ packages: - mem-fs - supports-color - /@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.93.0): - resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.93.0)': dependencies: webpack: 5.93.0(webpack-cli@5.1.4) webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) - /@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.93.0): - resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - webpack-dev-server: '*' - peerDependenciesMeta: - webpack-dev-server: - optional: true + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.93.0)': dependencies: webpack: 5.93.0(webpack-cli@5.1.4) webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) - /@xobotyi/scrollbar-width@1.9.5: - resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} - dev: false + '@xobotyi/scrollbar-width@1.9.5': {} - /@xtuc/ieee754@1.2.0: - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + '@xtuc/ieee754@1.2.0': {} - /@xtuc/long@4.2.2: - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + '@xtuc/long@4.2.2': {} - /abab@2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - deprecated: Use your platform's native atob() and btoa() methods instead - dev: false + abab@2.0.6: {} - /abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + abbrev@1.1.1: {} - /abbrev@2.0.0: - resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: false + abbrev@2.0.0: {} - /abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 - /accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} + accepts@1.3.8: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 - /acorn-globals@6.0.0: - resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} + acorn-globals@6.0.0: dependencies: acorn: 7.4.1 acorn-walk: 7.2.0 - dev: false - /acorn-import-attributes@1.9.5(acorn@8.12.1): - resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} - peerDependencies: - acorn: ^8 + acorn-import-attributes@1.9.5(acorn@8.12.1): dependencies: acorn: 8.12.1 - /acorn-jsx@5.3.2(acorn@8.12.1): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-jsx@5.3.2(acorn@8.12.1): dependencies: acorn: 8.12.1 - /acorn-walk@7.2.0: - resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} - engines: {node: '>=0.4.0'} - dev: false + acorn-walk@7.2.0: {} - /acorn-walk@8.3.3: - resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} - engines: {node: '>=0.4.0'} + acorn-walk@8.3.3: dependencies: acorn: 8.12.1 - /acorn@7.4.1: - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} - engines: {node: '>=0.4.0'} - hasBin: true + acorn@7.4.1: {} - /acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} - engines: {node: '>=0.4.0'} - hasBin: true + acorn@8.12.1: {} - /address@1.2.2: - resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} - engines: {node: '>= 10.0.0'} - dev: false + address@1.2.2: {} - /adjust-sourcemap-loader@4.0.0: - resolution: {integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==} - engines: {node: '>=8.9'} + adjust-sourcemap-loader@4.0.0: dependencies: loader-utils: 2.0.4 regex-parser: 2.3.0 - dev: false - /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} + agent-base@6.0.2: dependencies: debug: 4.3.6(supports-color@5.5.0) transitivePeerDependencies: - supports-color - /agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} - engines: {node: '>= 14'} + agent-base@7.1.1: dependencies: debug: 4.3.6(supports-color@5.5.0) transitivePeerDependencies: - supports-color - dev: false - /agentkeepalive@4.3.0: - resolution: {integrity: sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==} - engines: {node: '>= 8.0.0'} + agentkeepalive@4.3.0: dependencies: debug: 4.3.6(supports-color@5.5.0) depd: 2.0.0 @@ -8831,165 +18798,99 @@ packages: transitivePeerDependencies: - supports-color - /aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 indent-string: 4.0.0 - /ajv-formats@2.1.1(ajv@8.12.0): - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true + ajv-formats@2.1.1(ajv@8.12.0): dependencies: ajv: 8.12.0 - /ajv-keywords@3.5.2(ajv@6.12.6): - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 + ajv-keywords@3.5.2(ajv@6.12.6): dependencies: ajv: 6.12.6 - /ajv-keywords@5.1.0(ajv@8.12.0): - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} - peerDependencies: - ajv: ^8.8.2 + ajv-keywords@5.1.0(ajv@8.12.0): dependencies: ajv: 8.12.0 fast-deep-equal: 3.1.3 - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - /ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + ajv@8.12.0: dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - /ajv@8.6.3: - resolution: {integrity: sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==} + ajv@8.6.3: dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - dev: true - /alphanum-sort@1.0.2: - resolution: {integrity: sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==} - dev: true + alphanum-sort@1.0.2: {} - /analytics-utils@1.0.12(@types/dlv@1.1.4): - resolution: {integrity: sha512-WvV2YWgsnXLxaY0QYux0crpBAg/0JA763NmbMVz22jKhMPo7dpTBet8G2IlF7ixTjLDzGlkHk1ZaKqqQmjJ+4w==} - peerDependencies: - '@types/dlv': ^1.0.0 + analytics-utils@1.0.12(@types/dlv@1.1.4): dependencies: '@analytics/type-utils': 0.6.2 '@types/dlv': 1.1.4 dlv: 1.1.3 - dev: false - /analytics@0.8.9(@types/dlv@1.1.4): - resolution: {integrity: sha512-oTbUzQpncMTslakqfK70GgB6bopk5hY+uuekwnadMkDyqNLgcD02KRzteTnO7q5Ko6wDECVtT8xi/6OuAMZykA==} + analytics@0.8.9(@types/dlv@1.1.4): dependencies: '@analytics/core': 0.12.15(@types/dlv@1.1.4) '@analytics/storage-utils': 0.4.2 transitivePeerDependencies: - '@types/dlv' - dev: false - /ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + ansi-align@3.0.1: dependencies: string-width: 4.2.3 - dev: false - /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - dev: false + ansi-colors@4.1.3: {} - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 - /ansi-html-community@0.0.8: - resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} - engines: {'0': node >= 0.8.0} - hasBin: true - dev: false + ansi-html-community@0.0.8: {} - /ansi-html@0.0.9: - resolution: {integrity: sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==} - engines: {'0': node >= 0.8.0} - hasBin: true - dev: false + ansi-html@0.0.9: {} - /ansi-regex@2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} - engines: {node: '>=0.10.0'} + ansi-regex@2.1.1: {} - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + ansi-regex@5.0.1: {} - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} + ansi-regex@6.0.1: {} - /ansi-styles@2.2.1: - resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} - engines: {node: '>=0.10.0'} - dev: true + ansi-styles@2.2.1: {} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} + ansi-styles@5.2.0: {} - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} + ansi-styles@6.2.1: {} - /ansi-to-html@0.7.2: - resolution: {integrity: sha512-v6MqmEpNlxF+POuyhKkidusCHWWkaLcGRURzivcU3I9tv7k4JVhFcnukrM5Rlk2rUywdZuzYAZ+kbZqWCnfN3g==} - engines: {node: '>=8.0.0'} - hasBin: true + ansi-to-html@0.7.2: dependencies: entities: 2.2.0 - dev: true - /antd@5.19.4(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-bhSNzeScfaeN85LrQXZh5fD26y6uB+6c5cgoPUmW7lkC5oDN4mnT04yYcpqHpZD8p227AmycE+ZrcnilJH9log==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + antd@5.19.4(react-dom@18.3.1)(react@18.3.1): dependencies: '@ant-design/colors': 7.1.0 '@ant-design/cssinjs': 1.21.0(react-dom@18.3.1)(react@18.3.1) @@ -9047,26 +18948,18 @@ packages: - luxon - moment - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + any-promise@1.3.0: {} - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - /aproba@1.2.0: - resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} - dev: false + aproba@1.2.0: {} - /aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + aproba@2.0.0: {} - /archiver-utils@2.1.0: - resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} - engines: {node: '>= 6'} + archiver-utils@2.1.0: dependencies: glob: 7.2.3 graceful-fs: 4.2.11 @@ -9078,11 +18971,8 @@ packages: lodash.union: 4.6.0 normalize-path: 3.0.0 readable-stream: 2.3.8 - dev: true - /archiver-utils@3.0.4: - resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==} - engines: {node: '>= 10'} + archiver-utils@3.0.4: dependencies: glob: 7.2.3 graceful-fs: 4.2.11 @@ -9094,11 +18984,8 @@ packages: lodash.union: 4.6.0 normalize-path: 3.0.0 readable-stream: 3.6.2 - dev: true - /archiver@5.3.2: - resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==} - engines: {node: '>= 10'} + archiver@5.3.2: dependencies: archiver-utils: 2.1.0 async: 3.2.5 @@ -9107,78 +18994,52 @@ packages: readdir-glob: 1.1.3 tar-stream: 2.2.0 zip-stream: 4.1.1 - dev: true - /are-we-there-yet@1.1.7: - resolution: {integrity: sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==} - deprecated: This package is no longer supported. + are-we-there-yet@1.1.7: dependencies: delegates: 1.0.0 readable-stream: 2.3.8 - dev: false - /are-we-there-yet@2.0.0: - resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. + are-we-there-yet@2.0.0: dependencies: delegates: 1.0.0 readable-stream: 3.6.2 - /are-we-there-yet@3.0.1: - resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This package is no longer supported. + are-we-there-yet@3.0.1: dependencies: delegates: 1.0.0 readable-stream: 3.6.2 - /arg@4.1.0: - resolution: {integrity: sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==} - dev: true + arg@4.1.0: {} - /arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + arg@4.1.3: {} - /arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + arg@5.0.2: {} - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + argparse@2.0.1: {} - /aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + aria-query@5.1.3: dependencies: deep-equal: 2.2.3 - /aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + aria-query@5.3.0: dependencies: dequal: 2.0.3 - dev: true - /array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.1: dependencies: call-bind: 1.0.7 is-array-buffer: 3.0.4 - /array-differ@3.0.0: - resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} - engines: {node: '>=8'} + array-differ@3.0.0: {} - /array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + array-flatten@1.1.1: {} - /array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} + array-includes@3.1.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -9187,28 +19048,17 @@ packages: get-intrinsic: 1.2.4 is-string: 1.0.7 - /array-tree-filter@2.1.0: - resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==} + array-tree-filter@2.1.0: {} - /array-union@1.0.2: - resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} - engines: {node: '>=0.10.0'} + array-union@1.0.2: dependencies: array-uniq: 1.0.3 - dev: true - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} + array-union@2.1.0: {} - /array-uniq@1.0.3: - resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} - engines: {node: '>=0.10.0'} - dev: true + array-uniq@1.0.3: {} - /array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} + array.prototype.findlast@1.2.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -9217,9 +19067,7 @@ packages: es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 - /array.prototype.findlastindex@1.2.5: - resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} - engines: {node: '>= 0.4'} + array.prototype.findlastindex@1.2.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -9228,27 +19076,21 @@ packages: es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 - /array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} + array.prototype.flat@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 - /array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} + array.prototype.flatmap@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 - /array.prototype.reduce@1.0.7: - resolution: {integrity: sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==} - engines: {node: '>= 0.4'} + array.prototype.reduce@1.0.7: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -9258,9 +19100,7 @@ packages: es-object-atoms: 1.0.0 is-string: 1.0.7 - /array.prototype.tosorted@1.1.4: - resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} - engines: {node: '>= 0.4'} + array.prototype.tosorted@1.1.4: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -9268,9 +19108,7 @@ packages: es-errors: 1.3.0 es-shim-unscopables: 1.0.2 - /arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} + arraybuffer.prototype.slice@1.0.3: dependencies: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 @@ -9281,84 +19119,44 @@ packages: is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 - /arrify@2.0.1: - resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} - engines: {node: '>=8'} + arrify@2.0.1: {} - /asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + asap@2.0.6: {} - /asn1@0.2.6: - resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + asn1@0.2.6: dependencies: safer-buffer: 2.1.2 - dev: true - /assert-options@0.8.1: - resolution: {integrity: sha512-5lNGRB5g5i2bGIzb+J1QQE1iKU/WEMVBReFIc5pPDWjcPj23otPL0eI6PB2v7QPi0qU6Mhym5D3y0ZiSIOf3GA==} - engines: {node: '>=10.0.0'} - dev: false + assert-options@0.8.1: {} - /assert-plus@1.0.0: - resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} - engines: {node: '>=0.8'} - dev: false + assert-plus@1.0.0: {} - /ast-types-flow@0.0.8: - resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + ast-types-flow@0.0.8: {} - /async-listen@1.2.0: - resolution: {integrity: sha512-CcEtRh/oc9Jc4uWeUwdpG/+Mb2YUHKmdaTf0gUr7Wa+bfp4xx70HOb3RuSTJMvqKNB1TkdTfjLdrcz2X4rkkZA==} - dev: true + async-listen@1.2.0: {} - /async-listen@3.0.0: - resolution: {integrity: sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg==} - engines: {node: '>= 14'} - dev: true + async-listen@3.0.0: {} - /async-listen@3.0.1: - resolution: {integrity: sha512-cWMaNwUJnf37C/S5TfCkk/15MwbPRwVYALA2jtjkbHjCmAPiDXyNJy2q3p1KAZzDLHAWyarUWSujUoHR4pEgrA==} - engines: {node: '>= 14'} - dev: true + async-listen@3.0.1: {} - /async-lock@1.4.1: - resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==} - dev: true + async-lock@1.4.1: {} - /async-retry@1.3.3: - resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} - requiresBuild: true + async-retry@1.3.3: dependencies: retry: 0.13.1 - dev: false optional: true - /async-sema@3.1.1: - resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} - dev: true + async-sema@3.1.1: {} - /async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + async@3.2.5: {} - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: false + asynckit@0.4.0: {} - /asyncro@3.0.0: - resolution: {integrity: sha512-nEnWYfrBmA3taTiuiOoZYmgJ/CNrSoQLeLs29SeLcPu60yaw/mHDBHV0iOZ051fTvsTHxpCY+gXibqT9wbQYfg==} - dev: true + asyncro@3.0.0: {} - /at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - dev: false + at-least-node@1.0.0: {} - /autoprefixer@10.4.20(postcss@8.4.40): - resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 + autoprefixer@10.4.20(postcss@8.4.40): dependencies: browserslist: 4.23.3 caniuse-lite: 1.0.30001649 @@ -9367,14 +19165,8 @@ packages: picocolors: 1.0.1 postcss: 8.4.40 postcss-value-parser: 4.2.0 - dev: false - /autoprefixer@10.4.20(postcss@8.4.41): - resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 + autoprefixer@10.4.20(postcss@8.4.41): dependencies: browserslist: 4.23.3 caniuse-lite: 1.0.30001649 @@ -9383,11 +19175,8 @@ packages: picocolors: 1.0.1 postcss: 8.4.41 postcss-value-parser: 4.2.0 - dev: true - /autoprefixer@9.8.8: - resolution: {integrity: sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==} - hasBin: true + autoprefixer@9.8.8: dependencies: browserslist: 4.23.2 caniuse-lite: 1.0.30001645 @@ -9396,38 +19185,26 @@ packages: picocolors: 0.2.1 postcss: 7.0.39 postcss-value-parser: 4.2.0 - dev: true - /available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 - /axe-core@4.10.0: - resolution: {integrity: sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==} - engines: {node: '>=4'} + axe-core@4.10.0: {} - /axios@1.7.2: - resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} + axios@1.7.2: dependencies: follow-redirects: 1.15.6 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - dev: false - /axobject-query@3.1.1: - resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} + axobject-query@3.1.1: dependencies: deep-equal: 2.2.3 - /babel-jest@27.5.1(@babel/core@7.25.2): - resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - peerDependencies: - '@babel/core': ^7.8.0 + babel-jest@27.5.1(@babel/core@7.25.2): dependencies: '@babel/core': 7.25.2 '@jest/transform': 27.5.1 @@ -9440,13 +19217,8 @@ packages: slash: 3.0.0 transitivePeerDependencies: - supports-color - dev: false - /babel-jest@28.1.3(@babel/core@7.25.2): - resolution: {integrity: sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - peerDependencies: - '@babel/core': ^7.8.0 + babel-jest@28.1.3(@babel/core@7.25.2): dependencies: '@babel/core': 7.25.2 '@jest/transform': 28.1.3 @@ -9458,13 +19230,8 @@ packages: slash: 3.0.0 transitivePeerDependencies: - supports-color - dev: true - /babel-jest@29.7.0(@babel/core@7.25.2): - resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.8.0 + babel-jest@29.7.0(@babel/core@7.25.2): dependencies: '@babel/core': 7.25.2 '@jest/transform': 29.7.0 @@ -9477,12 +19244,7 @@ packages: transitivePeerDependencies: - supports-color - /babel-loader@8.3.0(@babel/core@7.25.2)(webpack@5.93.0): - resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} - engines: {node: '>= 8.9'} - peerDependencies: - '@babel/core': ^7.0.0 - webpack: '>=2' + babel-loader@8.3.0(@babel/core@7.25.2)(webpack@5.93.0): dependencies: '@babel/core': 7.25.2 find-cache-dir: 3.3.2 @@ -9490,24 +19252,15 @@ packages: make-dir: 3.1.0 schema-utils: 2.7.1 webpack: 5.93.0(webpack-cli@5.1.4) - dev: false - /babel-loader@9.1.3(@babel/core@7.25.2)(webpack@5.93.0): - resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} - engines: {node: '>= 14.15.0'} - peerDependencies: - '@babel/core': ^7.12.0 - webpack: '>=5' + babel-loader@9.1.3(@babel/core@7.25.2)(webpack@5.93.0): dependencies: '@babel/core': 7.25.2 find-cache-dir: 4.0.0 schema-utils: 4.2.0 webpack: 5.93.0(webpack-cli@5.1.4) - dev: true - /babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} + babel-plugin-istanbul@6.1.1: dependencies: '@babel/helper-plugin-utils': 7.24.8 '@istanbuljs/load-nyc-config': 1.1.0 @@ -9517,64 +19270,44 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-jest-hoist@27.5.1: - resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + babel-plugin-jest-hoist@27.5.1: dependencies: '@babel/template': 7.25.0 '@babel/types': 7.25.2 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.6 - dev: false - /babel-plugin-jest-hoist@28.1.3: - resolution: {integrity: sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + babel-plugin-jest-hoist@28.1.3: dependencies: '@babel/template': 7.25.0 '@babel/types': 7.25.2 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.6 - dev: true - /babel-plugin-jest-hoist@29.6.3: - resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.25.0 '@babel/types': 7.25.2 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.6 - /babel-plugin-macros@2.8.0: - resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==} + babel-plugin-macros@2.8.0: dependencies: '@babel/runtime': 7.25.0 cosmiconfig: 6.0.0 resolve: 1.22.8 - dev: true - /babel-plugin-macros@3.1.0: - resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} - engines: {node: '>=10', npm: '>=6'} + babel-plugin-macros@3.1.0: dependencies: '@babel/runtime': 7.25.0 cosmiconfig: 7.1.0 resolve: 1.22.8 - dev: false - /babel-plugin-named-asset-import@0.3.8(@babel/core@7.25.2): - resolution: {integrity: sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==} - peerDependencies: - '@babel/core': ^7.1.0 + babel-plugin-named-asset-import@0.3.8(@babel/core@7.25.2): dependencies: '@babel/core': 7.25.2 - dev: false - /babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.25.2): - resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.25.2): dependencies: '@babel/compat-data': 7.25.2 '@babel/core': 7.25.2 @@ -9583,10 +19316,7 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.25.2): - resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.25.2): dependencies: '@babel/core': 7.25.2 '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) @@ -9594,37 +19324,23 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.25.2): - resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.25.2): dependencies: '@babel/core': 7.25.2 '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) transitivePeerDependencies: - supports-color - /babel-plugin-transform-async-to-promises@0.8.18: - resolution: {integrity: sha512-WpOrF76nUHijnNn10eBGOHZmXQC8JYRME9rOLxStOga7Av2VO53ehVFvVNImMksVtQuL2/7ZNxEgxnx7oo/3Hw==} - dev: true + babel-plugin-transform-async-to-promises@0.8.18: {} - /babel-plugin-transform-react-remove-prop-types@0.4.24: - resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==} - dev: false + babel-plugin-transform-react-remove-prop-types@0.4.24: {} - /babel-plugin-transform-replace-expressions@0.2.0(@babel/core@7.25.2): - resolution: {integrity: sha512-Eh1rRd9hWEYgkgoA3D0kGp7xJ/wgVshgsqmq60iC4HVWD+Lux+fNHSHBa2v1Hsv+dHflShC71qKhiH40OiPtDA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + babel-plugin-transform-replace-expressions@0.2.0(@babel/core@7.25.2): dependencies: '@babel/core': 7.25.2 '@babel/parser': 7.25.0 - dev: true - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.25.2): - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} - peerDependencies: - '@babel/core': ^7.0.0 + babel-preset-current-node-syntax@1.0.1(@babel/core@7.25.2): dependencies: '@babel/core': 7.25.2 '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) @@ -9640,40 +19356,25 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) - /babel-preset-jest@27.5.1(@babel/core@7.25.2): - resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - peerDependencies: - '@babel/core': ^7.0.0 + babel-preset-jest@27.5.1(@babel/core@7.25.2): dependencies: '@babel/core': 7.25.2 babel-plugin-jest-hoist: 27.5.1 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.25.2) - dev: false - /babel-preset-jest@28.1.3(@babel/core@7.25.2): - resolution: {integrity: sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - peerDependencies: - '@babel/core': ^7.0.0 + babel-preset-jest@28.1.3(@babel/core@7.25.2): dependencies: '@babel/core': 7.25.2 babel-plugin-jest-hoist: 28.1.3 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.25.2) - dev: true - /babel-preset-jest@29.6.3(@babel/core@7.25.2): - resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.0.0 + babel-preset-jest@29.6.3(@babel/core@7.25.2): dependencies: '@babel/core': 7.25.2 babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.25.2) - /babel-preset-react-app@10.0.1: - resolution: {integrity: sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==} + babel-preset-react-app@10.0.1: dependencies: '@babel/core': 7.25.2 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.25.2) @@ -9694,68 +19395,43 @@ packages: babel-plugin-transform-react-remove-prop-types: 0.4.24 transitivePeerDependencies: - supports-color - dev: false - /babel-runtime@6.25.0: - resolution: {integrity: sha512-zeCYxDePWYAT/DfmQWIHsMSFW2vv45UIwIAMjGvQVsTd47RwsiRH0uK1yzyWZ7LDBKdhnGDPM6NYEO5CZyhPrg==} + babel-runtime@6.25.0: dependencies: core-js: 2.6.12 regenerator-runtime: 0.10.5 - dev: false - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@1.0.2: {} - /base16@1.0.0: - resolution: {integrity: sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==} - dev: false + base16@1.0.0: {} - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + base64-js@1.5.1: {} - /batch@0.6.1: - resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} - dev: false + batch@0.6.1: {} - /bcrypt-pbkdf@1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + bcrypt-pbkdf@1.0.2: dependencies: tweetnacl: 0.14.5 - dev: true - /before-after-hook@2.2.3: - resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + before-after-hook@2.2.3: {} - /bfj@7.1.0: - resolution: {integrity: sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==} - engines: {node: '>= 8.0.0'} + bfj@7.1.0: dependencies: bluebird: 3.7.2 check-types: 11.2.3 hoopy: 0.1.4 jsonpath: 1.1.1 tryer: 1.0.1 - dev: false - /big-integer@1.6.52: - resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} - engines: {node: '>=0.6'} - dev: false + big-integer@1.6.52: {} - /big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + big.js@5.2.2: {} - /big.js@6.2.1: - resolution: {integrity: sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==} - dev: true + big.js@6.2.1: {} - /bignumber.js@9.1.2: - resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} - dev: false + bignumber.js@9.1.2: {} - /bin-links@3.0.3: - resolution: {integrity: sha512-zKdnMPWEdh4F5INR07/eBrodC7QrF5JKvqskjz/ZZRXg5YSAZIbn8zGhbhUrElzHBZ2fvEQdOU59RHcTG3GiwA==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + bin-links@3.0.3: dependencies: cmd-shim: 5.0.0 mkdirp-infer-owner: 2.0.0 @@ -9764,38 +19440,25 @@ packages: rimraf: 3.0.2 write-file-atomic: 4.0.2 - /binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} + binary-extensions@2.3.0: {} - /binaryextensions@4.19.0: - resolution: {integrity: sha512-DRxnVbOi/1OgA5pA9EDiRT8gvVYeqfuN7TmPfLyt6cyho3KbHCi3EtDQf39TTmGDrR5dZ9CspdXhPkL/j/WGbg==} - engines: {node: '>=0.8'} + binaryextensions@4.19.0: {} - /bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 - dev: true - /bintrees@1.0.2: - resolution: {integrity: sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==} - dev: false + bintrees@1.0.2: {} - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bl@4.1.0: dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - /bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - dev: false + bluebird@3.7.2: {} - /body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + body-parser@1.20.2: dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -9812,27 +19475,18 @@ packages: transitivePeerDependencies: - supports-color - /bonjour-service@1.2.1: - resolution: {integrity: sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==} + bonjour-service@1.2.1: dependencies: fast-deep-equal: 3.1.3 multicast-dns: 7.2.5 - dev: false - /boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + boolbase@1.0.0: {} - /bottleneck@2.19.5: - resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} - dev: false + bottleneck@2.19.5: {} - /bowser@2.11.0: - resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} - dev: false + bowser@2.11.0: {} - /boxen@7.1.1: - resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} - engines: {node: '>=14.16'} + boxen@7.1.1: dependencies: ansi-align: 3.0.1 camelcase: 7.0.1 @@ -9842,139 +19496,86 @@ packages: type-fest: 2.19.0 widest-line: 4.0.1 wrap-ansi: 8.1.0 - dev: false - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 - /braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} + braces@3.0.3: dependencies: fill-range: 7.1.1 - /brotli-size@4.0.0: - resolution: {integrity: sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==} - engines: {node: '>= 10.16.0'} + brotli-size@4.0.0: dependencies: duplexer: 0.1.1 - dev: true - /browser-process-hrtime@1.0.0: - resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} - dev: false + browser-process-hrtime@1.0.0: {} - /browserslist@4.23.2: - resolution: {integrity: sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + browserslist@4.23.2: dependencies: caniuse-lite: 1.0.30001645 electron-to-chromium: 1.5.4 node-releases: 2.0.18 update-browserslist-db: 1.1.0(browserslist@4.23.2) - /browserslist@4.23.3: - resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + browserslist@4.23.3: dependencies: caniuse-lite: 1.0.30001649 electron-to-chromium: 1.5.4 node-releases: 2.0.18 update-browserslist-db: 1.1.0(browserslist@4.23.3) - /bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} + bs-logger@0.2.6: dependencies: fast-json-stable-stringify: 2.1.0 - dev: true - /bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + bser@2.1.1: dependencies: node-int64: 0.4.0 - /bson@6.8.0: - resolution: {integrity: sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ==} - engines: {node: '>=16.20.1'} - dev: false + bson@6.8.0: {} - /buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - dev: true + buffer-crc32@0.2.13: {} - /buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - dev: false + buffer-equal-constant-time@1.0.1: {} - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer-from@1.1.2: {} - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + buffer@6.0.3: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - /buildcheck@0.0.6: - resolution: {integrity: sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==} - engines: {node: '>=10.0.0'} - requiresBuild: true - dev: true + buildcheck@0.0.6: optional: true - /builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} + builtin-modules@3.3.0: {} - /builtins@1.0.3: - resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} + builtins@1.0.3: {} - /busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} + busboy@1.6.0: dependencies: streamsearch: 1.1.0 - dev: false - /byline@5.0.0: - resolution: {integrity: sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==} - engines: {node: '>=0.10.0'} - dev: true + byline@5.0.0: {} - /bytes@3.0.0: - resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} - engines: {node: '>= 0.8'} - dev: false + bytes@3.0.0: {} - /bytes@3.1.0: - resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==} - engines: {node: '>= 0.8'} - dev: true + bytes@3.1.0: {} - /bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} + bytes@3.1.2: {} - /cacache@15.3.0: - resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} - engines: {node: '>= 10'} + cacache@15.3.0: dependencies: '@npmcli/fs': 1.1.1 '@npmcli/move-file': 1.1.2 @@ -9997,9 +19598,7 @@ packages: transitivePeerDependencies: - bluebird - /cacache@16.1.3: - resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + cacache@16.1.3: dependencies: '@npmcli/fs': 2.1.2 '@npmcli/move-file': 2.0.1 @@ -10022,9 +19621,7 @@ packages: transitivePeerDependencies: - bluebird - /cacache@17.1.4: - resolution: {integrity: sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + cacache@17.1.4: dependencies: '@npmcli/fs': 3.1.1 fs-minipass: 3.0.3 @@ -10039,9 +19636,7 @@ packages: tar: 6.2.1 unique-filename: 3.0.0 - /call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 @@ -10049,141 +19644,88 @@ packages: get-intrinsic: 1.2.4 set-function-length: 1.2.2 - /caller-callsite@2.0.0: - resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} - engines: {node: '>=4'} + caller-callsite@2.0.0: dependencies: callsites: 2.0.0 - dev: true - /caller-path@2.0.0: - resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} - engines: {node: '>=4'} + caller-path@2.0.0: dependencies: caller-callsite: 2.0.0 - dev: true - /callsites@2.0.0: - resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} - engines: {node: '>=4'} - dev: true + callsites@2.0.0: {} - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + callsites@3.1.0: {} - /camel-case@3.0.0: - resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} + camel-case@3.0.0: dependencies: no-case: 2.3.2 upper-case: 1.1.3 - dev: false - /camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + camel-case@4.1.2: dependencies: pascal-case: 3.1.2 tslib: 2.6.3 - dev: false - /camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} + camelcase-css@2.0.1: {} - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} + camelcase@5.3.1: {} - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} + camelcase@6.3.0: {} - /camelcase@7.0.1: - resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} - engines: {node: '>=14.16'} - dev: false + camelcase@7.0.1: {} - /caniuse-api@3.0.0: - resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + caniuse-api@3.0.0: dependencies: browserslist: 4.23.2 caniuse-lite: 1.0.30001645 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - /caniuse-lite@1.0.30001645: - resolution: {integrity: sha512-GFtY2+qt91kzyMk6j48dJcwJVq5uTkk71XxE3RtScx7XWRLsO7bU44LOFkOZYR8w9YMS0UhPSYpN/6rAMImmLw==} + caniuse-lite@1.0.30001645: {} - /caniuse-lite@1.0.30001649: - resolution: {integrity: sha512-fJegqZZ0ZX8HOWr6rcafGr72+xcgJKI9oWfDW5DrD7ExUtgZC7a7R7ZYmZqplh7XDocFdGeIFn7roAxhOeYrPQ==} + caniuse-lite@1.0.30001649: {} - /case-sensitive-paths-webpack-plugin@2.4.0: - resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} - engines: {node: '>=4'} - dev: false + case-sensitive-paths-webpack-plugin@2.4.0: {} - /chalk@1.1.3: - resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} - engines: {node: '>=0.10.0'} + chalk@1.1.3: dependencies: ansi-styles: 2.2.1 escape-string-regexp: 1.0.5 has-ansi: 2.0.0 strip-ansi: 3.0.1 supports-color: 2.0.0 - dev: true - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - /chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} + chalk@3.0.0: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chalk@5.3.0: {} - /char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} + char-regex@1.0.2: {} - /char-regex@2.0.1: - resolution: {integrity: sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==} - engines: {node: '>=12.20'} - dev: false + char-regex@2.0.1: {} - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + chardet@0.7.0: {} - /chart.js@4.4.3: - resolution: {integrity: sha512-qK1gkGSRYcJzqrrzdR6a+I0vQ4/R+SoODXyAjscQ/4mzuNzySaMCd+hyVxitSY1+L2fjPD1Gbn+ibNqRmwQeLw==} - engines: {pnpm: '>=8'} + chart.js@4.4.3: dependencies: '@kurkle/color': 0.3.2 - dev: false - /check-types@11.2.3: - resolution: {integrity: sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==} - dev: false + check-types@11.2.3: {} - /cheerio-select@2.1.0: - resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + cheerio-select@2.1.0: dependencies: boolbase: 1.0.0 css-select: 5.1.0 @@ -10191,11 +19733,8 @@ packages: domelementtype: 2.3.0 domhandler: 5.0.3 domutils: 3.1.0 - dev: false - /cheerio@1.0.0-rc.12: - resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} - engines: {node: '>= 6'} + cheerio@1.0.0-rc.12: dependencies: cheerio-select: 2.1.0 dom-serializer: 2.0.0 @@ -10204,11 +19743,8 @@ packages: htmlparser2: 8.0.2 parse5: 7.1.2 parse5-htmlparser2-tree-adapter: 7.0.0 - dev: false - /chokidar@3.3.1: - resolution: {integrity: sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==} - engines: {node: '>= 8.10.0'} + chokidar@3.3.1: dependencies: anymatch: 3.1.3 braces: 3.0.3 @@ -10219,11 +19755,8 @@ packages: readdirp: 3.3.0 optionalDependencies: fsevents: 2.1.3 - dev: true - /chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 braces: 3.0.3 @@ -10235,312 +19768,183 @@ packages: optionalDependencies: fsevents: 2.3.3 - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + chownr@1.1.4: {} - /chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} + chownr@2.0.0: {} - /chownr@3.0.0: - resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} - engines: {node: '>=18'} - dev: false + chownr@3.0.0: {} - /chrome-trace-event@1.0.4: - resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} - engines: {node: '>=6.0'} + chrome-trace-event@1.0.4: {} - /ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} + ci-info@3.9.0: {} - /circ-json@1.0.4: - resolution: {integrity: sha512-/2NljkKlOCvNgs8jsIlJcCFhUfF6C1JJKM8PdJQ6HqIrqhJBouMcWFdeDJLNLZAadeTj0K9FMziH74hpEtAr1g==} - dev: false + circ-json@1.0.4: {} - /cjs-module-lexer@1.2.3: - resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} - dev: true + cjs-module-lexer@1.2.3: {} - /cjs-module-lexer@1.3.1: - resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} + cjs-module-lexer@1.3.1: {} - /classnames@2.5.1: - resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + classnames@2.5.1: {} - /clean-css@4.2.4: - resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} - engines: {node: '>= 4.0'} + clean-css@4.2.4: dependencies: source-map: 0.6.1 - dev: false - /clean-css@5.3.3: - resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} - engines: {node: '>= 10.0'} + clean-css@5.3.3: dependencies: source-map: 0.6.1 - dev: false - /clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} + clean-stack@2.2.0: {} - /clean-webpack-plugin@4.0.0(webpack@5.93.0): - resolution: {integrity: sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==} - engines: {node: '>=10.0.0'} - peerDependencies: - webpack: '>=4.0.0 <6.0.0' + clean-webpack-plugin@4.0.0(webpack@5.93.0): dependencies: del: 4.1.1 webpack: 5.93.0(webpack-cli@5.1.4) - dev: true - /cli-boxes@3.0.0: - resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} - engines: {node: '>=10'} - dev: false + cli-boxes@3.0.0: {} - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 - /cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} + cli-spinners@2.9.2: {} - /cli-table@0.3.11: - resolution: {integrity: sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==} - engines: {node: '>= 0.2.0'} + cli-table@0.3.11: dependencies: colors: 1.0.3 - /cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} + cli-width@3.0.0: {} - /cli-width@4.1.0: - resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} - engines: {node: '>= 12'} - dev: true + cli-width@4.1.0: {} - /client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - dev: false + client-only@0.0.1: {} - /cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + cliui@7.0.4: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: false - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - /clone-buffer@1.0.0: - resolution: {integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==} - engines: {node: '>= 0.10'} + clone-buffer@1.0.0: {} - /clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} + clone-deep@4.0.1: dependencies: is-plain-object: 2.0.4 kind-of: 6.0.3 shallow-clone: 3.0.1 - /clone-stats@1.0.0: - resolution: {integrity: sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==} + clone-stats@1.0.0: {} - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} + clone@1.0.4: {} - /clone@2.1.2: - resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} - engines: {node: '>=0.8'} + clone@2.1.2: {} - /cloneable-readable@1.1.3: - resolution: {integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==} + cloneable-readable@1.1.3: dependencies: inherits: 2.0.4 process-nextick-args: 2.0.1 readable-stream: 2.3.8 - /clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} - dev: false + clsx@2.1.1: {} - /cluster-key-slot@1.1.2: - resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} - engines: {node: '>=0.10.0'} + cluster-key-slot@1.1.2: {} - /cmd-shim@5.0.0: - resolution: {integrity: sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + cmd-shim@5.0.0: dependencies: mkdirp-infer-owner: 2.0.0 - /co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + co@4.6.0: {} - /coa@2.0.2: - resolution: {integrity: sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==} - engines: {node: '>= 4.0'} + coa@2.0.2: dependencies: '@types/q': 1.5.8 chalk: 2.4.2 q: 1.5.1 - /code-block-writer@10.1.1: - resolution: {integrity: sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==} - dev: true + code-block-writer@10.1.1: {} - /code-block-writer@11.0.3: - resolution: {integrity: sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==} - dev: true + code-block-writer@11.0.3: {} - /code-point-at@1.1.0: - resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} - engines: {node: '>=0.10.0'} - dev: false + code-point-at@1.1.0: {} - /collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + collect-v8-coverage@1.0.2: {} - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@1.9.3: dependencies: color-name: 1.1.3 - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + color-convert@2.0.1: dependencies: color-name: 1.1.4 - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-name@1.1.3: {} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-name@1.1.4: {} - /color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + color-string@1.9.1: dependencies: color-name: 1.1.4 simple-swizzle: 0.2.2 - /color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true + color-support@1.1.3: {} - /color@3.2.1: - resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + color@3.2.1: dependencies: color-convert: 1.9.3 color-string: 1.9.1 - /colord@2.9.3: - resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} - dev: false + colord@2.9.3: {} - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + colorette@2.0.20: {} - /colors@1.0.3: - resolution: {integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==} - engines: {node: '>=0.1.90'} + colors@1.0.3: {} - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 - dev: false - /commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} + commander@10.0.1: {} - /commander@11.1.0: - resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} - engines: {node: '>=16'} - dev: true + commander@11.1.0: {} - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@2.20.3: {} - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} + commander@4.1.1: {} - /commander@6.2.1: - resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} - engines: {node: '>= 6'} - dev: false + commander@6.2.1: {} - /commander@7.1.0: - resolution: {integrity: sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==} - engines: {node: '>= 10'} + commander@7.1.0: {} - /commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - dev: false + commander@7.2.0: {} - /commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} - dev: false + commander@8.3.0: {} - /common-ancestor-path@1.0.1: - resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} + common-ancestor-path@1.0.1: {} - /common-path-prefix@3.0.0: - resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} - dev: true + common-path-prefix@3.0.0: {} - /common-tags@1.8.2: - resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} - engines: {node: '>=4.0.0'} - dev: false + common-tags@1.8.2: {} - /commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + commondir@1.0.1: {} - /compress-commons@4.1.2: - resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} - engines: {node: '>= 10'} + compress-commons@4.1.2: dependencies: buffer-crc32: 0.2.13 crc32-stream: 4.0.3 normalize-path: 3.0.0 readable-stream: 3.6.2 - dev: true - /compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} + compressible@2.0.18: dependencies: mime-db: 1.53.0 - dev: false - /compression@1.7.4: - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} - engines: {node: '>= 0.8.0'} + compression@1.7.4: dependencies: accepts: 1.3.8 bytes: 3.0.0 @@ -10551,123 +19955,75 @@ packages: vary: 1.1.2 transitivePeerDependencies: - supports-color - dev: false - /compute-gcd@1.2.1: - resolution: {integrity: sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg==} + compute-gcd@1.2.1: dependencies: validate.io-array: 1.0.6 validate.io-function: 1.0.2 validate.io-integer-array: 1.0.0 - dev: false - /compute-lcm@1.1.2: - resolution: {integrity: sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ==} + compute-lcm@1.1.2: dependencies: compute-gcd: 1.2.1 validate.io-array: 1.0.6 validate.io-function: 1.0.2 validate.io-integer-array: 1.0.0 - dev: false - /compute-scroll-into-view@3.1.0: - resolution: {integrity: sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==} + compute-scroll-into-view@3.1.0: {} - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concat-map@0.0.1: {} - /concat-with-sourcemaps@1.1.0: - resolution: {integrity: sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==} + concat-with-sourcemaps@1.1.0: dependencies: source-map: 0.6.1 - dev: true - /config-chain@1.1.13: - resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + config-chain@1.1.13: dependencies: ini: 1.3.8 proto-list: 1.2.4 - dev: false - /confusing-browser-globals@1.0.11: - resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} - dev: false + confusing-browser-globals@1.0.11: {} - /connect-history-api-fallback@2.0.0: - resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} - engines: {node: '>=0.8'} - dev: false + connect-history-api-fallback@2.0.0: {} - /console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + console-control-strings@1.1.0: {} - /content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 - /content-type@1.0.4: - resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} - engines: {node: '>= 0.6'} - dev: true + content-type@1.0.4: {} - /content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} + content-type@1.0.5: {} - /convert-hrtime@3.0.0: - resolution: {integrity: sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==} - engines: {node: '>=8'} - dev: true + convert-hrtime@3.0.0: {} - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + convert-source-map@1.9.0: {} - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + convert-source-map@2.0.0: {} - /cookie-parser@1.4.6: - resolution: {integrity: sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==} - engines: {node: '>= 0.8.0'} + cookie-parser@1.4.6: dependencies: cookie: 0.4.1 cookie-signature: 1.0.6 - dev: true - /cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + cookie-signature@1.0.6: {} - /cookie@0.4.1: - resolution: {integrity: sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==} - engines: {node: '>= 0.6'} - dev: true + cookie@0.4.1: {} - /cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} - dev: false + cookie@0.5.0: {} - /cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} - engines: {node: '>= 0.6'} + cookie@0.6.0: {} - /copy-anything@2.0.6: - resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + copy-anything@2.0.6: dependencies: is-what: 3.14.1 - dev: true - /copy-to-clipboard@3.3.3: - resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + copy-to-clipboard@3.3.3: dependencies: toggle-selection: 1.0.6 - /copy-webpack-plugin@12.0.2(webpack@5.93.0): - resolution: {integrity: sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==} - engines: {node: '>= 18.12.0'} - peerDependencies: - webpack: ^5.1.0 + copy-webpack-plugin@12.0.2(webpack@5.93.0): dependencies: fast-glob: 3.3.2 glob-parent: 6.0.2 @@ -10676,49 +20032,29 @@ packages: schema-utils: 4.2.0 serialize-javascript: 6.0.2 webpack: 5.93.0(webpack-cli@5.1.4) - dev: true - /core-js-compat@3.37.1: - resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==} + core-js-compat@3.37.1: dependencies: browserslist: 4.23.2 - /core-js-pure@3.37.1: - resolution: {integrity: sha512-J/r5JTHSmzTxbiYYrzXg9w1VpqrYt+gexenBE9pugeyhwPZTAEJddyiReJWsLO6uNQ8xJZFbod6XC7KKwatCiA==} - requiresBuild: true - dev: false + core-js-pure@3.37.1: {} - /core-js@2.6.12: - resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} - deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. - requiresBuild: true - dev: false + core-js@2.6.12: {} - /core-js@3.37.1: - resolution: {integrity: sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==} - requiresBuild: true - dev: false + core-js@3.37.1: {} - /core-util-is@1.0.2: - resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} - dev: false + core-util-is@1.0.2: {} - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + core-util-is@1.0.3: {} - /cosmiconfig@5.2.1: - resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} - engines: {node: '>=4'} + cosmiconfig@5.2.1: dependencies: import-fresh: 2.0.0 is-directory: 0.3.1 js-yaml: 3.14.1 parse-json: 4.0.0 - dev: true - /cosmiconfig@6.0.0: - resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} - engines: {node: '>=8'} + cosmiconfig@6.0.0: dependencies: '@types/parse-json': 4.0.2 import-fresh: 3.3.0 @@ -10726,9 +20062,7 @@ packages: path-type: 4.0.0 yaml: 1.10.2 - /cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} + cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.2 import-fresh: 3.3.0 @@ -10736,34 +20070,20 @@ packages: path-type: 4.0.0 yaml: 1.10.2 - /cpu-features@0.0.10: - resolution: {integrity: sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==} - engines: {node: '>=10.0.0'} - requiresBuild: true + cpu-features@0.0.10: dependencies: buildcheck: 0.0.6 nan: 2.20.0 - dev: true optional: true - /crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} - hasBin: true - dev: true + crc-32@1.2.2: {} - /crc32-stream@4.0.3: - resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} - engines: {node: '>= 10'} + crc32-stream@4.0.3: dependencies: crc-32: 1.2.2 readable-stream: 3.6.2 - dev: true - /create-jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2): - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true + create-jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 @@ -10778,102 +20098,56 @@ packages: - supports-color - ts-node - /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + create-require@1.1.1: {} - /cross-fetch@3.1.8: - resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + cross-fetch@3.1.8: dependencies: node-fetch: 2.7.0 transitivePeerDependencies: - encoding - dev: false - /cross-fetch@4.0.0: - resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + cross-fetch@4.0.0: dependencies: node-fetch: 2.7.0 transitivePeerDependencies: - encoding - dev: true - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - /crypto-js@4.2.0: - resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} - dev: false + crypto-js@4.2.0: {} - /crypto-random-string@2.0.0: - resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} - engines: {node: '>=8'} - dev: false + crypto-random-string@2.0.0: {} - /css-blank-pseudo@3.0.3(postcss@8.4.40): - resolution: {integrity: sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==} - engines: {node: ^12 || ^14 || >=16} - hasBin: true - peerDependencies: - postcss: ^8.4 + css-blank-pseudo@3.0.3(postcss@8.4.40): dependencies: postcss: 8.4.40 postcss-selector-parser: 6.1.1 - dev: false - /css-color-names@0.0.4: - resolution: {integrity: sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==} - dev: true + css-color-names@0.0.4: {} - /css-declaration-sorter@4.0.1: - resolution: {integrity: sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==} - engines: {node: '>4'} + css-declaration-sorter@4.0.1: dependencies: postcss: 7.0.39 timsort: 0.3.0 - dev: true - /css-declaration-sorter@6.4.1(postcss@8.4.41): - resolution: {integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==} - engines: {node: ^10 || ^12 || >=14} - peerDependencies: - postcss: ^8.0.9 + css-declaration-sorter@6.4.1(postcss@8.4.41): dependencies: postcss: 8.4.41 - dev: false - /css-has-pseudo@3.0.4(postcss@8.4.40): - resolution: {integrity: sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==} - engines: {node: ^12 || ^14 || >=16} - hasBin: true - peerDependencies: - postcss: ^8.4 + css-has-pseudo@3.0.4(postcss@8.4.40): dependencies: postcss: 8.4.40 postcss-selector-parser: 6.1.1 - dev: false - /css-in-js-utils@3.1.0: - resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} + css-in-js-utils@3.1.0: dependencies: hyphenate-style-name: 1.1.0 - dev: false - /css-loader@6.11.0(webpack@5.93.0): - resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==} - engines: {node: '>= 12.13.0'} - peerDependencies: - '@rspack/core': 0.x || 1.x - webpack: ^5.0.0 - peerDependenciesMeta: - '@rspack/core': - optional: true - webpack: - optional: true + css-loader@6.11.0(webpack@5.93.0): dependencies: icss-utils: 5.1.0(postcss@8.4.41) postcss: 8.4.41 @@ -10884,26 +20158,8 @@ packages: postcss-value-parser: 4.2.0 semver: 7.6.3 webpack: 5.93.0(webpack-cli@5.1.4) - dev: false - /css-minimizer-webpack-plugin@3.4.1(webpack@5.93.0): - resolution: {integrity: sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==} - engines: {node: '>= 12.13.0'} - peerDependencies: - '@parcel/css': '*' - clean-css: '*' - csso: '*' - esbuild: '*' - webpack: ^5.0.0 - peerDependenciesMeta: - '@parcel/css': - optional: true - clean-css: - optional: true - csso: - optional: true - esbuild: - optional: true + css-minimizer-webpack-plugin@3.4.1(webpack@5.93.0): dependencies: cssnano: 5.1.15(postcss@8.4.41) jest-worker: 27.5.1 @@ -10912,10 +20168,8 @@ packages: serialize-javascript: 6.0.2 source-map: 0.6.1 webpack: 5.93.0(webpack-cli@5.1.4) - dev: false - /css-modules-loader-core@1.1.0: - resolution: {integrity: sha512-XWOBwgy5nwBn76aA+6ybUGL/3JBnCtBX9Ay9/OWIpzKYWlVHMazvJ+WtHumfi+xxdPF440cWK7JCYtt8xDifew==} + css-modules-loader-core@1.1.0: dependencies: icss-replace-symbols: 1.1.0 postcss: 6.0.1 @@ -10923,95 +20177,62 @@ packages: postcss-modules-local-by-default: 1.2.0 postcss-modules-scope: 1.1.0 postcss-modules-values: 1.3.0 - dev: true - /css-prefers-color-scheme@6.0.3(postcss@8.4.40): - resolution: {integrity: sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==} - engines: {node: ^12 || ^14 || >=16} - hasBin: true - peerDependencies: - postcss: ^8.4 + css-prefers-color-scheme@6.0.3(postcss@8.4.40): dependencies: postcss: 8.4.40 - dev: false - /css-select-base-adapter@0.1.1: - resolution: {integrity: sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==} + css-select-base-adapter@0.1.1: {} - /css-select@2.1.0: - resolution: {integrity: sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==} + css-select@2.1.0: dependencies: boolbase: 1.0.0 css-what: 3.4.2 domutils: 1.7.0 nth-check: 1.0.2 - /css-select@4.3.0: - resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + css-select@4.3.0: dependencies: boolbase: 1.0.0 css-what: 6.1.0 domhandler: 4.3.1 domutils: 2.8.0 nth-check: 2.1.1 - dev: false - /css-select@5.1.0: - resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + css-select@5.1.0: dependencies: boolbase: 1.0.0 css-what: 6.1.0 domhandler: 5.0.3 domutils: 3.1.0 nth-check: 2.1.1 - dev: false - /css-selector-tokenizer@0.7.3: - resolution: {integrity: sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==} + css-selector-tokenizer@0.7.3: dependencies: cssesc: 3.0.0 fastparse: 1.1.2 - dev: true - /css-tree@1.0.0-alpha.37: - resolution: {integrity: sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==} - engines: {node: '>=8.0.0'} + css-tree@1.0.0-alpha.37: dependencies: mdn-data: 2.0.4 source-map: 0.6.1 - /css-tree@1.1.3: - resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} - engines: {node: '>=8.0.0'} + css-tree@1.1.3: dependencies: mdn-data: 2.0.14 source-map: 0.6.1 - /css-what@3.4.2: - resolution: {integrity: sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==} - engines: {node: '>= 6'} + css-what@3.4.2: {} - /css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} - dev: false + css-what@6.1.0: {} - /css.escape@1.5.1: - resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - dev: true + css.escape@1.5.1: {} - /cssdb@7.11.2: - resolution: {integrity: sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==} - dev: false + cssdb@7.11.2: {} - /cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true + cssesc@3.0.0: {} - /cssnano-preset-default@4.0.8: - resolution: {integrity: sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==} - engines: {node: '>=6.9.0'} + cssnano-preset-default@4.0.8: dependencies: css-declaration-sorter: 4.0.1 cssnano-util-raw-cache: 4.0.1 @@ -11043,13 +20264,8 @@ packages: postcss-reduce-transforms: 4.0.2 postcss-svgo: 4.0.3 postcss-unique-selectors: 4.0.1 - dev: true - /cssnano-preset-default@5.2.14(postcss@8.4.41): - resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + cssnano-preset-default@5.2.14(postcss@8.4.41): dependencies: css-declaration-sorter: 6.4.1(postcss@8.4.41) cssnano-utils: 3.1.0(postcss@8.4.41) @@ -11081,313 +20297,170 @@ packages: postcss-reduce-transforms: 5.1.0(postcss@8.4.41) postcss-svgo: 5.1.0(postcss@8.4.41) postcss-unique-selectors: 5.1.1(postcss@8.4.41) - dev: false - /cssnano-util-get-arguments@4.0.0: - resolution: {integrity: sha512-6RIcwmV3/cBMG8Aj5gucQRsJb4vv4I4rn6YjPbVWd5+Pn/fuG+YseGvXGk00XLkoZkaj31QOD7vMUpNPC4FIuw==} - engines: {node: '>=6.9.0'} - dev: true + cssnano-util-get-arguments@4.0.0: {} - /cssnano-util-get-match@4.0.0: - resolution: {integrity: sha512-JPMZ1TSMRUPVIqEalIBNoBtAYbi8okvcFns4O0YIhcdGebeYZK7dMyHJiQ6GqNBA9kE0Hym4Aqym5rPdsV/4Cw==} - engines: {node: '>=6.9.0'} - dev: true + cssnano-util-get-match@4.0.0: {} - /cssnano-util-raw-cache@4.0.1: - resolution: {integrity: sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==} - engines: {node: '>=6.9.0'} + cssnano-util-raw-cache@4.0.1: dependencies: postcss: 7.0.39 - dev: true - /cssnano-util-same-parent@4.0.1: - resolution: {integrity: sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==} - engines: {node: '>=6.9.0'} - dev: true + cssnano-util-same-parent@4.0.1: {} - /cssnano-utils@3.1.0(postcss@8.4.41): - resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + cssnano-utils@3.1.0(postcss@8.4.41): dependencies: postcss: 8.4.41 - dev: false - /cssnano@4.1.11: - resolution: {integrity: sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==} - engines: {node: '>=6.9.0'} + cssnano@4.1.11: dependencies: cosmiconfig: 5.2.1 cssnano-preset-default: 4.0.8 is-resolvable: 1.1.0 - postcss: 7.0.39 - dev: true - - /cssnano@5.1.15(postcss@8.4.41): - resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss: 7.0.39 + + cssnano@5.1.15(postcss@8.4.41): dependencies: cssnano-preset-default: 5.2.14(postcss@8.4.41) lilconfig: 2.1.0 postcss: 8.4.41 yaml: 1.10.2 - dev: false - /csso@4.2.0: - resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} - engines: {node: '>=8.0.0'} + csso@4.2.0: dependencies: css-tree: 1.1.3 - /cssom@0.3.8: - resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} - dev: false + cssom@0.3.8: {} - /cssom@0.4.4: - resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} - dev: false + cssom@0.4.4: {} - /cssstyle@2.3.0: - resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} - engines: {node: '>=8'} + cssstyle@2.3.0: dependencies: cssom: 0.3.8 - dev: false - /csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + csstype@3.1.3: {} - /cuid@2.1.8: - resolution: {integrity: sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg==} - deprecated: Cuid and other k-sortable and non-cryptographic ids (Ulid, ObjectId, KSUID, all UUIDs) are all insecure. Use @paralleldrive/cuid2 instead. + cuid@2.1.8: {} - /currency-codes@1.5.1: - resolution: {integrity: sha512-hqy8vtlIYKzO6pe2TE0V4/riZALIc7nhtE9cvxk5FDRCvfGplgzUvpTmZlMsyO+NeK5U41j+sQXJOo8l8v9kdg==} + currency-codes@1.5.1: dependencies: first-match: 0.0.1 nub: 0.0.0 - dev: false - /d3-array@3.2.4: - resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} - engines: {node: '>=12'} + d3-array@3.2.4: dependencies: internmap: 2.0.3 - dev: false - /d3-color@3.1.0: - resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} - engines: {node: '>=12'} - dev: false + d3-color@3.1.0: {} - /d3-ease@3.0.1: - resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} - engines: {node: '>=12'} - dev: false + d3-ease@3.0.1: {} - /d3-format@3.1.0: - resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} - engines: {node: '>=12'} - dev: false + d3-format@3.1.0: {} - /d3-interpolate@3.0.1: - resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} - engines: {node: '>=12'} + d3-interpolate@3.0.1: dependencies: d3-color: 3.1.0 - dev: false - /d3-path@3.1.0: - resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} - engines: {node: '>=12'} - dev: false + d3-path@3.1.0: {} - /d3-scale@4.0.2: - resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} - engines: {node: '>=12'} + d3-scale@4.0.2: dependencies: d3-array: 3.2.4 d3-format: 3.1.0 d3-interpolate: 3.0.1 d3-time: 3.1.0 d3-time-format: 4.1.0 - dev: false - /d3-shape@3.2.0: - resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} - engines: {node: '>=12'} + d3-shape@3.2.0: dependencies: d3-path: 3.1.0 - dev: false - /d3-time-format@4.1.0: - resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} - engines: {node: '>=12'} + d3-time-format@4.1.0: dependencies: d3-time: 3.1.0 - dev: false - /d3-time@3.1.0: - resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} - engines: {node: '>=12'} + d3-time@3.1.0: dependencies: d3-array: 3.2.4 - dev: false - /d3-timer@3.0.1: - resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} - engines: {node: '>=12'} - dev: false + d3-timer@3.0.1: {} - /damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + damerau-levenshtein@1.0.8: {} - /dargs@7.0.0: - resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} - engines: {node: '>=8'} + dargs@7.0.0: {} - /data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - dev: true + data-uri-to-buffer@4.0.1: {} - /data-urls@2.0.0: - resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} - engines: {node: '>=10'} + data-urls@2.0.0: dependencies: abab: 2.0.6 whatwg-mimetype: 2.3.0 whatwg-url: 8.7.0 - dev: false - /data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} + data-view-buffer@1.0.1: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - /data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} + data-view-byte-length@1.0.1: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - /data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} + data-view-byte-offset@1.0.0: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - /date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} + date-fns@2.30.0: dependencies: '@babel/runtime': 7.25.0 - dev: false - /dateformat@4.6.3: - resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + dateformat@4.6.3: {} - /dayjs@1.11.12: - resolution: {integrity: sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg==} + dayjs@1.11.12: {} - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@2.6.9: dependencies: ms: 2.0.0 - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@3.2.7: dependencies: ms: 2.1.3 - /debug@4.1.1: - resolution: {integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==} - deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.1.1: dependencies: ms: 2.1.3 - dev: true - /debug@4.3.6(supports-color@5.5.0): - resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.3.6(supports-color@5.5.0): dependencies: ms: 2.1.2 supports-color: 5.5.0 - /debuglog@1.0.1: - resolution: {integrity: sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + debuglog@1.0.1: {} - /decimal.js-light@2.5.1: - resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} - dev: false + decimal.js-light@2.5.1: {} - /decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - dev: false + decimal.js@10.4.3: {} - /declaration-bundler-webpack-plugin@1.0.3: - resolution: {integrity: sha512-bgeoSOZYTOOdiNUZd/U8K6Z+6IrM/X+DgUcm3/VI1l130lzOBeL+ObetjIkKksxcj0zUJbLaFRFumFGYDOQ9fg==} - dev: true + declaration-bundler-webpack-plugin@1.0.3: {} - /decompress-response@4.2.1: - resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} - engines: {node: '>=8'} + decompress-response@4.2.1: dependencies: mimic-response: 2.1.0 - dev: false - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} + decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 - dev: false - /dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + dedent@0.7.0: {} - /dedent@1.5.3: - resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true + dedent@1.5.3: {} - /deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} + deep-equal@2.2.3: dependencies: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 @@ -11408,53 +20481,35 @@ packages: which-collection: 1.0.2 which-typed-array: 1.1.15 - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} + deep-extend@0.6.0: {} - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deep-is@0.1.4: {} - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} + deepmerge@4.3.1: {} - /default-gateway@6.0.3: - resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} - engines: {node: '>= 10'} + default-gateway@6.0.3: dependencies: execa: 5.1.1 - dev: false - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + defaults@1.0.4: dependencies: clone: 1.0.4 - /define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 gopd: 1.0.1 - /define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - dev: false + define-lazy-prop@2.0.0: {} - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 object-keys: 1.1.1 - /del@4.1.1: - resolution: {integrity: sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==} - engines: {node: '>=6'} + del@4.1.1: dependencies: '@types/glob': 7.2.0 globby: 6.1.0 @@ -11463,130 +20518,72 @@ packages: p-map: 2.1.0 pify: 4.0.1 rimraf: 2.7.1 - dev: true - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: false + delayed-stream@1.0.0: {} - /delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + delegates@1.0.0: {} - /denque@2.1.0: - resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} - engines: {node: '>=0.10'} + denque@2.1.0: {} - /depd@1.1.2: - resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} - engines: {node: '>= 0.6'} + depd@1.1.2: {} - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} + depd@2.0.0: {} - /deprecation@2.3.1: - resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + deprecation@2.3.1: {} - /dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - dev: true + dequal@2.0.3: {} - /destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + destroy@1.2.0: {} - /detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} - hasBin: true - dev: false + detect-libc@1.0.3: {} - /detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} - engines: {node: '>=8'} + detect-libc@2.0.3: {} - /detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} + detect-newline@3.1.0: {} - /detect-node@2.1.0: - resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} - dev: false + detect-node@2.1.0: {} - /detect-port-alt@1.1.6: - resolution: {integrity: sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==} - engines: {node: '>= 4.2.1'} - hasBin: true + detect-port-alt@1.1.6: dependencies: address: 1.2.2 debug: 2.6.9 transitivePeerDependencies: - supports-color - dev: false - /dezalgo@1.0.4: - resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + dezalgo@1.0.4: dependencies: asap: 2.0.6 wrappy: 1.0.2 - /didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + didyoumean@1.2.2: {} - /diff-match-patch@1.0.5: - resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} - dev: false + diff-match-patch@1.0.5: {} - /diff-sequences@27.5.1: - resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dev: false + diff-sequences@27.5.1: {} - /diff-sequences@28.1.1: - resolution: {integrity: sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - dev: true + diff-sequences@28.1.1: {} - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + diff-sequences@29.6.3: {} - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} + diff@4.0.2: {} - /diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} - engines: {node: '>=0.3.1'} + diff@5.2.0: {} - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 - /dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dlv@1.1.3: {} - /dns-packet@5.6.1: - resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} - engines: {node: '>=6'} + dns-packet@5.6.1: dependencies: '@leichtgewicht/ip-codec': 2.0.5 - dev: false - /docker-compose@0.24.8: - resolution: {integrity: sha512-plizRs/Vf15H+GCVxq2EUvyPK7ei9b/cVesHvjnX4xaXjM9spHe2Ytq0BitndFgvTJ3E3NljPNUEl7BAN43iZw==} - engines: {node: '>= 6.0.0'} + docker-compose@0.24.8: dependencies: yaml: 2.5.0 - dev: true - /docker-modem@3.0.8: - resolution: {integrity: sha512-f0ReSURdM3pcKPNS30mxOHSbaFLcknGmQjwSfmbcdOw1XWKXVhukM3NJHhr7NpY9BIyyWQb0EBo3KQvvuU5egQ==} - engines: {node: '>= 8.0'} + docker-modem@3.0.8: dependencies: debug: 4.3.6(supports-color@5.5.0) readable-stream: 3.6.2 @@ -11594,233 +20591,149 @@ packages: ssh2: 1.15.0 transitivePeerDependencies: - supports-color - dev: true - /dockerode@3.3.5: - resolution: {integrity: sha512-/0YNa3ZDNeLr/tSckmD69+Gq+qVNhvKfAHNeZJBnp7EOP6RGKV8ORrJHkUn20So5wU+xxT7+1n5u8PjHbfjbSA==} - engines: {node: '>= 8.0'} + dockerode@3.3.5: dependencies: '@balena/dockerignore': 1.0.2 docker-modem: 3.0.8 tar-fs: 2.0.1 transitivePeerDependencies: - supports-color - dev: true - /doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} + doctrine@2.1.0: dependencies: esutils: 2.0.3 - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + doctrine@3.0.0: dependencies: esutils: 2.0.3 - /dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - dev: true + dom-accessibility-api@0.5.16: {} - /dom-accessibility-api@0.6.3: - resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} - dev: true + dom-accessibility-api@0.6.3: {} - /dom-align@1.12.4: - resolution: {integrity: sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==} - dev: false + dom-align@1.12.4: {} - /dom-converter@0.2.0: - resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} + dom-converter@0.2.0: dependencies: utila: 0.4.0 - dev: false - /dom-helpers@5.2.1: - resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + dom-helpers@5.2.1: dependencies: '@babel/runtime': 7.25.0 csstype: 3.1.3 - dev: false - /dom-serializer@0.2.2: - resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} + dom-serializer@0.2.2: dependencies: domelementtype: 2.3.0 entities: 2.2.0 - /dom-serializer@1.4.1: - resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + dom-serializer@1.4.1: dependencies: domelementtype: 2.3.0 domhandler: 4.3.1 entities: 2.2.0 - dev: false - /dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 entities: 4.5.0 - dev: false - /domelementtype@1.3.1: - resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + domelementtype@1.3.1: {} - /domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + domelementtype@2.3.0: {} - /domexception@2.0.1: - resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} - engines: {node: '>=8'} - deprecated: Use your platform's native DOMException instead + domexception@2.0.1: dependencies: webidl-conversions: 5.0.0 - dev: false - /domhandler@3.3.0: - resolution: {integrity: sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==} - engines: {node: '>= 4'} + domhandler@3.3.0: dependencies: domelementtype: 2.3.0 - dev: false - /domhandler@4.3.1: - resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} - engines: {node: '>= 4'} + domhandler@4.3.1: dependencies: domelementtype: 2.3.0 - dev: false - /domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} + domhandler@5.0.3: dependencies: domelementtype: 2.3.0 - dev: false - /domutils@1.7.0: - resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + domutils@1.7.0: dependencies: dom-serializer: 0.2.2 domelementtype: 1.3.1 - /domutils@2.8.0: - resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + domutils@2.8.0: dependencies: dom-serializer: 1.4.1 domelementtype: 2.3.0 domhandler: 4.3.1 - dev: false - /domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + domutils@3.1.0: dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 domhandler: 5.0.3 - dev: false - /dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dot-case@3.0.4: dependencies: no-case: 3.0.4 tslib: 2.6.3 - dev: false - /dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} + dot-prop@5.3.0: dependencies: is-obj: 2.0.0 - dev: true - /dotenv-cli@6.0.0: - resolution: {integrity: sha512-qXlCOi3UMDhCWFKe0yq5sg3X+pJAz+RQDiFN38AMSbUrnY3uZshSfDJUAge951OS7J9gwLZGfsBlWRSOYz/TRg==} - hasBin: true + dotenv-cli@6.0.0: dependencies: cross-spawn: 7.0.3 dotenv: 16.4.5 dotenv-expand: 8.0.3 minimist: 1.2.8 - dev: true - /dotenv-cli@7.4.2: - resolution: {integrity: sha512-SbUj8l61zIbzyhIbg0FwPJq6+wjbzdn9oEtozQpZ6kW2ihCcapKVZj49oCT3oPM+mgQm+itgvUQcG5szxVrZTA==} - hasBin: true + dotenv-cli@7.4.2: dependencies: cross-spawn: 7.0.3 dotenv: 16.4.5 dotenv-expand: 10.0.0 minimist: 1.2.8 - dev: true - /dotenv-expand@10.0.0: - resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} - engines: {node: '>=12'} - dev: true + dotenv-expand@10.0.0: {} - /dotenv-expand@5.1.0: - resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} - dev: false + dotenv-expand@5.1.0: {} - /dotenv-expand@8.0.3: - resolution: {integrity: sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg==} - engines: {node: '>=12'} - dev: true + dotenv-expand@8.0.3: {} - /dotenv@10.0.0: - resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} - engines: {node: '>=10'} - dev: false + dotenv@10.0.0: {} - /dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} - engines: {node: '>=12'} - dev: true + dotenv@16.4.5: {} - /dset@3.1.3: - resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==} - engines: {node: '>=4'} - dev: true + dset@3.1.3: {} - /duplexer@0.1.1: - resolution: {integrity: sha512-sxNZ+ljy+RA1maXoUReeqBBpBC6RLKmg5ewzV+x+mSETmWNoKdZN6vcQjpFROemza23hGFskJtFNoUWUaQ+R4Q==} - dev: true + duplexer@0.1.1: {} - /duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + duplexer@0.1.2: {} - /duplexify@4.1.3: - resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + duplexify@4.1.3: dependencies: end-of-stream: 1.4.4 inherits: 2.0.4 readable-stream: 3.6.2 stream-shift: 1.0.3 - dev: false - /dynamic-dedupe@0.3.0: - resolution: {integrity: sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==} + dynamic-dedupe@0.3.0: dependencies: xtend: 4.0.2 - dev: true - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + eastasianwidth@0.2.0: {} - /ecdsa-sig-formatter@1.0.11: - resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + ecdsa-sig-formatter@1.0.11: dependencies: safe-buffer: 5.2.1 - dev: false - /edge-runtime@2.5.9: - resolution: {integrity: sha512-pk+k0oK0PVXdlT4oRp4lwh+unuKB7Ng4iZ2HB+EZ7QCEQizX360Rp/F4aRpgpRgdP2ufB35N+1KppHmYjqIGSg==} - engines: {node: '>=16'} - hasBin: true + edge-runtime@2.5.9: dependencies: '@edge-runtime/format': 2.2.1 '@edge-runtime/ponyfill': 2.4.2 @@ -11831,134 +20744,82 @@ packages: pretty-ms: 7.0.1 signal-exit: 4.0.2 time-span: 4.0.0 - dev: true - /editorconfig@1.0.4: - resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} - engines: {node: '>=14'} - hasBin: true + editorconfig@1.0.4: dependencies: '@one-ini/wasm': 0.1.1 commander: 10.0.1 minimatch: 9.0.1 semver: 7.6.3 - dev: false - /ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + ee-first@1.1.1: {} - /ejs@3.1.10: - resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} - engines: {node: '>=0.10.0'} - hasBin: true + ejs@3.1.10: dependencies: jake: 10.9.2 - /electron-to-chromium@1.5.4: - resolution: {integrity: sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==} + electron-to-chromium@1.5.4: {} - /emittery@0.10.2: - resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} - engines: {node: '>=12'} + emittery@0.10.2: {} - /emittery@0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} - engines: {node: '>=12'} + emittery@0.13.1: {} - /emittery@0.8.1: - resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} - engines: {node: '>=10'} - dev: false + emittery@0.8.1: {} - /emoji-regex@10.3.0: - resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} - dev: false + emoji-regex@10.3.0: {} - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@8.0.0: {} - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + emoji-regex@9.2.2: {} - /emojis-list@3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} + emojis-list@3.0.0: {} - /encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} + encodeurl@1.0.2: {} - /encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - requiresBuild: true + encoding@0.1.13: dependencies: iconv-lite: 0.6.3 optional: true - /end-of-stream@1.1.0: - resolution: {integrity: sha512-EoulkdKF/1xa92q25PbjuDcgJ9RDHYU2Rs3SCIvs2/dSQ3BpmxneNHmA/M7fe60M3PrV7nNGTTNbkK62l6vXiQ==} + end-of-stream@1.1.0: dependencies: once: 1.3.3 - dev: true - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.4: dependencies: once: 1.4.0 - /enhanced-resolve@5.17.1: - resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} - engines: {node: '>=10.13.0'} + enhanced-resolve@5.17.1: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 - /entities@2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + entities@2.2.0: {} - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: false + entities@4.5.0: {} - /env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} + env-paths@2.2.1: {} - /envinfo@7.13.0: - resolution: {integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==} - engines: {node: '>=4'} - hasBin: true + envinfo@7.13.0: {} - /err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + err-code@2.0.3: {} - /errno@0.1.8: - resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} - hasBin: true - requiresBuild: true + errno@0.1.8: dependencies: prr: 1.0.1 - dev: true optional: true - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - /error-stack-parser@2.1.4: - resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + error-stack-parser@2.1.4: dependencies: stackframe: 1.3.4 - dev: false - /error@10.4.0: - resolution: {integrity: sha512-YxIFEJuhgcICugOUvRx5th0UM+ActZ9sjY0QJmeVwsQdvosZ7kYzc9QqS0Da3R5iUmgU5meGIxh0xBeZpMVeLw==} + error@10.4.0: {} - /es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} + es-abstract@1.23.3: dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 @@ -12007,21 +20868,15 @@ packages: unbox-primitive: 1.0.2 which-typed-array: 1.1.15 - /es-array-method-boxes-properly@1.0.0: - resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} + es-array-method-boxes-properly@1.0.0: {} - /es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} + es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 - /es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} + es-errors@1.3.0: {} - /es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + es-get-iterator@1.1.3: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 @@ -12033,9 +20888,7 @@ packages: isarray: 2.0.5 stop-iteration-iterator: 1.0.0 - /es-iterator-helpers@1.0.19: - resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} - engines: {node: '>= 0.4'} + es-iterator-helpers@1.0.19: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -12052,233 +20905,95 @@ packages: iterator.prototype: 1.1.2 safe-array-concat: 1.1.2 - /es-module-lexer@1.4.1: - resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} - dev: true + es-module-lexer@1.4.1: {} - /es-module-lexer@1.5.4: - resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + es-module-lexer@1.5.4: {} - /es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} + es-object-atoms@1.0.0: dependencies: es-errors: 1.3.0 - /es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} + es-set-tostringtag@2.0.3: dependencies: get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 hasown: 2.0.2 - /es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + es-shim-unscopables@1.0.2: dependencies: hasown: 2.0.2 - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + es-to-primitive@1.2.1: dependencies: is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 - /es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - dev: false + es6-promise@4.2.8: {} - /es6-promisify@6.1.1: - resolution: {integrity: sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg==} - dev: true + es6-promisify@6.1.1: {} - /esbuild-android-64@0.14.47: - resolution: {integrity: sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true + esbuild-android-64@0.14.47: optional: true - /esbuild-android-arm64@0.14.47: - resolution: {integrity: sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true + esbuild-android-arm64@0.14.47: optional: true - /esbuild-darwin-64@0.14.47: - resolution: {integrity: sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + esbuild-darwin-64@0.14.47: optional: true - /esbuild-darwin-arm64@0.14.47: - resolution: {integrity: sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + esbuild-darwin-arm64@0.14.47: optional: true - /esbuild-freebsd-64@0.14.47: - resolution: {integrity: sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true + esbuild-freebsd-64@0.14.47: optional: true - /esbuild-freebsd-arm64@0.14.47: - resolution: {integrity: sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true + esbuild-freebsd-arm64@0.14.47: optional: true - /esbuild-linux-32@0.14.47: - resolution: {integrity: sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true + esbuild-linux-32@0.14.47: optional: true - /esbuild-linux-64@0.14.47: - resolution: {integrity: sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + esbuild-linux-64@0.14.47: optional: true - /esbuild-linux-arm64@0.14.47: - resolution: {integrity: sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + esbuild-linux-arm64@0.14.47: optional: true - /esbuild-linux-arm@0.14.47: - resolution: {integrity: sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + esbuild-linux-arm@0.14.47: optional: true - /esbuild-linux-mips64le@0.14.47: - resolution: {integrity: sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true + esbuild-linux-mips64le@0.14.47: optional: true - /esbuild-linux-ppc64le@0.14.47: - resolution: {integrity: sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true + esbuild-linux-ppc64le@0.14.47: optional: true - /esbuild-linux-riscv64@0.14.47: - resolution: {integrity: sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true + esbuild-linux-riscv64@0.14.47: optional: true - /esbuild-linux-s390x@0.14.47: - resolution: {integrity: sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true + esbuild-linux-s390x@0.14.47: optional: true - /esbuild-netbsd-64@0.14.47: - resolution: {integrity: sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true + esbuild-netbsd-64@0.14.47: optional: true - /esbuild-openbsd-64@0.14.47: - resolution: {integrity: sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true + esbuild-openbsd-64@0.14.47: optional: true - /esbuild-sunos-64@0.14.47: - resolution: {integrity: sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true + esbuild-sunos-64@0.14.47: optional: true - /esbuild-windows-32@0.14.47: - resolution: {integrity: sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + esbuild-windows-32@0.14.47: optional: true - /esbuild-windows-64@0.14.47: - resolution: {integrity: sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + esbuild-windows-64@0.14.47: optional: true - /esbuild-windows-arm64@0.14.47: - resolution: {integrity: sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + esbuild-windows-arm64@0.14.47: optional: true - /esbuild@0.14.47: - resolution: {integrity: sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.14.47: optionalDependencies: esbuild-android-64: 0.14.47 esbuild-android-arm64: 0.14.47 @@ -12300,36 +21015,20 @@ packages: esbuild-windows-32: 0.14.47 esbuild-windows-64: 0.14.47 esbuild-windows-arm64: 0.14.47 - dev: true - /escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} + escalade@3.1.2: {} - /escape-goat@3.0.0: - resolution: {integrity: sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==} - engines: {node: '>=10'} - dev: false + escape-goat@3.0.0: {} - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-html@1.0.3: {} - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + escape-string-regexp@1.0.5: {} - /escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} + escape-string-regexp@2.0.0: {} - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + escape-string-regexp@4.0.0: {} - /escodegen@1.14.3: - resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} - engines: {node: '>=4.0'} - hasBin: true + escodegen@1.14.3: dependencies: esprima: 4.0.1 estraverse: 4.3.0 @@ -12337,28 +21036,16 @@ packages: optionator: 0.8.3 optionalDependencies: source-map: 0.6.1 - dev: false - /escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true + escodegen@2.1.0: dependencies: esprima: 4.0.1 estraverse: 5.3.0 esutils: 2.0.3 optionalDependencies: source-map: 0.6.1 - dev: false - /eslint-config-next@14.2.5(eslint@8.57.0)(typescript@5.5.4): - resolution: {integrity: sha512-zogs9zlOiZ7ka+wgUnmcM0KBEDjo4Jis7kxN1jvC0N4wynQ2MIx/KBkg4mVF63J5EK4W0QMCn7xO3vNisjaAoA==} - peerDependencies: - eslint: ^7.23.0 || ^8.0.0 - typescript: '>=3.3.1' - peerDependenciesMeta: - typescript: - optional: true + eslint-config-next@14.2.5(eslint@8.57.0)(typescript@5.5.4): dependencies: '@next/eslint-plugin-next': 14.2.5 '@rushstack/eslint-patch': 1.10.4 @@ -12375,24 +21062,11 @@ packages: - eslint-import-resolver-webpack - supports-color - /eslint-config-prettier@9.1.0(eslint@8.57.0): - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' + eslint-config-prettier@9.1.0(eslint@8.57.0): dependencies: eslint: 8.57.0 - dev: true - /eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0)(jest@27.5.1)(typescript@5.5.4): - resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} - engines: {node: '>=14.0.0'} - peerDependencies: - eslint: ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0)(jest@27.5.1)(typescript@5.5.4): dependencies: '@babel/core': 7.25.2 '@babel/eslint-parser': 7.25.1(@babel/core@7.25.2)(eslint@8.57.0) @@ -12417,10 +21091,8 @@ packages: - eslint-import-resolver-webpack - jest - supports-color - dev: false - /eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 is-core-module: 2.15.0 @@ -12428,12 +21100,7 @@ packages: transitivePeerDependencies: - supports-color - /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): - resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): dependencies: debug: 4.3.6(supports-color@5.5.0) enhanced-resolve: 5.17.1 @@ -12450,26 +21117,7 @@ packages: - eslint-import-resolver-webpack - supports-color - /eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true + eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): dependencies: '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) debug: 3.2.7 @@ -12477,28 +21125,8 @@ packages: eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - dev: false - /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): dependencies: '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4) debug: 3.2.7 @@ -12508,30 +21136,15 @@ packages: transitivePeerDependencies: - supports-color - /eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0): - resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@babel/plugin-syntax-flow': ^7.14.5 - '@babel/plugin-transform-react-jsx': ^7.14.9 - eslint: ^8.1.0 + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0): dependencies: '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.25.2) '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2) eslint: 8.57.0 lodash: 4.17.21 string-natural-compare: 3.0.1 - dev: false - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0)(eslint@8.57.0): - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true + eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0)(eslint@8.57.0): dependencies: '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) array-includes: 3.1.8 @@ -12556,17 +21169,8 @@ packages: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - dev: false - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): dependencies: '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4) array-includes: 3.1.8 @@ -12592,18 +21196,7 @@ packages: - eslint-import-resolver-webpack - supports-color - /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.57.0)(jest@27.5.1)(typescript@5.5.4): - resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^4.0.0 || ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - jest: '*' - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - jest: - optional: true + eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.57.0)(jest@27.5.1)(typescript@5.5.4): dependencies: '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) @@ -12612,13 +21205,8 @@ packages: transitivePeerDependencies: - supports-color - typescript - dev: false - /eslint-plugin-jsx-a11y@6.9.0(eslint@8.57.0): - resolution: {integrity: sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + eslint-plugin-jsx-a11y@6.9.0(eslint@8.57.0): dependencies: aria-query: 5.1.3 array-includes: 3.1.8 @@ -12638,19 +21226,11 @@ packages: safe-regex-test: 1.0.3 string.prototype.includes: 2.0.0 - /eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): - resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): dependencies: eslint: 8.57.0 - /eslint-plugin-react@7.35.0(eslint@8.57.0): - resolution: {integrity: sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + eslint-plugin-react@7.35.0(eslint@8.57.0): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -12672,67 +21252,36 @@ packages: string.prototype.matchall: 4.0.11 string.prototype.repeat: 1.0.0 - /eslint-plugin-testing-library@5.11.1(eslint@8.57.0)(typescript@5.5.4): - resolution: {integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} - peerDependencies: - eslint: ^7.5.0 || ^8.0.0 + eslint-plugin-testing-library@5.11.1(eslint@8.57.0)(typescript@5.5.4): dependencies: '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) eslint: 8.57.0 transitivePeerDependencies: - supports-color - typescript - dev: false - /eslint-plugin-unused-imports@4.0.1(eslint@8.57.0): - resolution: {integrity: sha512-rax76s05z64uQgG9YXsWFmXrgjkaK79AvfeAWiSxhPP6RVGxeRaj4+2u+wxxu/mDy2pmJoOy1QTOEALMia2xGQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^8.0.0-0 - eslint: ^9.0.0 - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true + eslint-plugin-unused-imports@4.0.1(eslint@8.57.0): dependencies: eslint: 8.57.0 eslint-rule-composer: 0.3.0 - dev: true - /eslint-rule-composer@0.3.0: - resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} - engines: {node: '>=4.0.0'} - dev: true + eslint-rule-composer@0.3.0: {} - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} + eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - - /eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} - dev: false - - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - /eslint-webpack-plugin@3.2.0(eslint@8.57.0)(webpack@5.93.0): - resolution: {integrity: sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==} - engines: {node: '>= 12.13.0'} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - webpack: ^5.0.0 + + eslint-visitor-keys@2.1.0: {} + + eslint-visitor-keys@3.4.3: {} + + eslint-webpack-plugin@3.2.0(eslint@8.57.0)(webpack@5.93.0): dependencies: '@types/eslint': 8.56.11 eslint: 8.57.0 @@ -12741,12 +21290,8 @@ packages: normalize-path: 3.0.0 schema-utils: 4.2.0 webpack: 5.93.0(webpack-cli@5.1.4) - dev: false - /eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true + eslint@8.57.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/regexpp': 4.11.0 @@ -12789,81 +21334,47 @@ packages: transitivePeerDependencies: - supports-color - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@9.6.1: dependencies: acorn: 8.12.1 acorn-jsx: 5.3.2(acorn@8.12.1) eslint-visitor-keys: 3.4.3 - /esprima@1.2.2: - resolution: {integrity: sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: false + esprima@1.2.2: {} - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true + esprima@4.0.1: {} - /esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} + esquery@1.6.0: dependencies: estraverse: 5.3.0 - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} + estraverse@4.3.0: {} - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} + estraverse@5.3.0: {} - /estree-walker@0.6.1: - resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} - dev: true + estree-walker@0.6.1: {} - /estree-walker@1.0.1: - resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + estree-walker@1.0.1: {} - /estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@2.0.2: {} - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} + esutils@2.0.3: {} - /etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} + etag@1.8.1: {} - /event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} + event-target-shim@5.0.1: {} - /eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + eventemitter3@4.0.7: {} - /events-intercept@2.0.0: - resolution: {integrity: sha512-blk1va0zol9QOrdZt0rFXo5KMkNPVSp92Eju/Qz8THwKWKRKeE0T8Br/1aW6+Edkyq9xHYgYxn2QtOnUKPUp+Q==} - dev: true + events-intercept@2.0.0: {} - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} + events@3.3.0: {} - /execa@3.2.0: - resolution: {integrity: sha512-kJJfVbI/lZE1PZYDI5VPxp8zXPO9rtxOkhpZ0jMKha56AI9y2gGVC6bkukStQf0ka5Rh15BA5m7cCCH4jmHqkw==} - engines: {node: ^8.12.0 || >=9.7.0} + execa@3.2.0: dependencies: cross-spawn: 7.0.3 get-stream: 5.2.0 @@ -12875,11 +21386,8 @@ packages: p-finally: 2.0.1 signal-exit: 3.0.7 strip-final-newline: 2.0.0 - dev: true - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + execa@5.1.1: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -12891,39 +21399,26 @@ packages: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - /exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} + exit@0.1.2: {} - /expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - dev: false + expand-template@2.0.3: {} - /expect@27.5.1: - resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + expect@27.5.1: dependencies: '@jest/types': 27.5.1 jest-get-type: 27.5.1 jest-matcher-utils: 27.5.1 jest-message-util: 27.5.1 - dev: false - /expect@28.1.3: - resolution: {integrity: sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + expect@28.1.3: dependencies: '@jest/expect-utils': 28.1.3 jest-get-type: 28.0.2 jest-matcher-utils: 28.1.3 jest-message-util: 28.1.3 jest-util: 28.1.3 - dev: true - /expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + expect@29.7.0: dependencies: '@jest/expect-utils': 29.7.0 jest-get-type: 29.6.3 @@ -12931,12 +21426,9 @@ packages: jest-message-util: 29.7.0 jest-util: 29.7.0 - /exponential-backoff@3.1.1: - resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} + exponential-backoff@3.1.1: {} - /express@4.19.2: - resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} - engines: {node: '>= 0.10.0'} + express@4.19.2: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 @@ -12972,25 +21464,17 @@ packages: transitivePeerDependencies: - supports-color - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: false + extend@3.0.2: {} - /external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} + external-editor@3.1.0: dependencies: chardet: 0.7.0 iconv-lite: 0.4.24 tmp: 0.0.33 - /extsprintf@1.3.0: - resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} - engines: {'0': node >=0.6.0} - dev: false + extsprintf@1.3.0: {} - /facebook-nodejs-business-sdk@19.0.3: - resolution: {integrity: sha512-u594CNtN3ypU+VOSvwIm7tUpHZj67jt06EDbSaAyOvbIawg1gUnSCDtaZscypydrjJXBZuQVd5ltPqftSMn8fQ==} + facebook-nodejs-business-sdk@19.0.3: dependencies: axios: 1.7.2 currency-codes: 1.5.1 @@ -12999,24 +21483,14 @@ packages: mixwith: 0.1.1 transitivePeerDependencies: - debug - dev: false - /farmhash-modern@1.1.0: - resolution: {integrity: sha512-6ypT4XfgqJk/F3Yuv4SX26I3doUjt0GTG4a+JgWxXQpxXzTBq8fPUeGHfcYMMDPHJHm3yPOSjaeBwBGAHWXCdA==} - engines: {node: '>=18.0.0'} - dev: false + farmhash-modern@1.1.0: {} - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-deep-equal@3.1.3: {} - /fast-equals@5.0.1: - resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} - engines: {node: '>=6.0.0'} - dev: false + fast-equals@5.0.1: {} - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 @@ -13024,69 +21498,45 @@ packages: merge2: 1.4.1 micromatch: 4.0.7 - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-json-stable-stringify@2.1.0: {} - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-levenshtein@2.0.6: {} - /fast-shallow-equal@1.0.0: - resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==} - dev: false + fast-shallow-equal@1.0.0: {} - /fast-text-encoding@1.0.6: - resolution: {integrity: sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==} - dev: false + fast-text-encoding@1.0.6: {} - /fast-xml-parser@4.4.1: - resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} - hasBin: true + fast-xml-parser@4.4.1: dependencies: strnum: 1.0.5 - dev: false - /fastest-levenshtein@1.0.16: - resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} - engines: {node: '>= 4.9.1'} + fastest-levenshtein@1.0.16: {} - /fastest-stable-stringify@2.0.2: - resolution: {integrity: sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==} - dev: false + fastest-stable-stringify@2.0.2: {} - /fastparse@1.1.2: - resolution: {integrity: sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==} - dev: true + fastparse@1.1.2: {} - /fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.17.1: dependencies: reusify: 1.0.4 - /faye-websocket@0.11.4: - resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} - engines: {node: '>=0.8.0'} + faye-websocket@0.11.4: dependencies: websocket-driver: 0.7.4 - /fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + fb-watchman@2.0.2: dependencies: bser: 2.1.1 - /fbemitter@3.0.0: - resolution: {integrity: sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==} + fbemitter@3.0.0: dependencies: fbjs: 3.0.5 transitivePeerDependencies: - encoding - dev: false - /fbjs-css-vars@1.0.2: - resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} - dev: false + fbjs-css-vars@1.0.2: {} - /fbjs@3.0.5: - resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} + fbjs@3.0.5: dependencies: cross-fetch: 3.1.8 fbjs-css-vars: 1.0.2 @@ -13097,87 +21547,52 @@ packages: ua-parser-js: 1.0.38 transitivePeerDependencies: - encoding - dev: false - /fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fd-slicer@1.1.0: dependencies: pend: 1.2.0 - dev: true - /fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} + fetch-blob@3.2.0: dependencies: node-domexception: 1.0.0 web-streams-polyfill: 3.3.3 - dev: true - /figlet@1.7.0: - resolution: {integrity: sha512-gO8l3wvqo0V7wEFLXPbkX83b7MVjRrk1oRLfYlZXol8nEpb/ON9pcKLI4qpBv5YtOTfrINtqb7b40iYY2FTWFg==} - engines: {node: '>= 0.4.0'} - hasBin: true - dev: false + figlet@1.7.0: {} - /figures@1.7.0: - resolution: {integrity: sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==} - engines: {node: '>=0.10.0'} + figures@1.7.0: dependencies: escape-string-regexp: 1.0.5 object-assign: 4.1.1 - dev: true - /figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 - /file-loader@6.2.0(webpack@5.93.0): - resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 + file-loader@6.2.0(webpack@5.93.0): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 webpack: 5.93.0(webpack-cli@5.1.4) - dev: false - /file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - dev: true + file-uri-to-path@1.0.0: {} - /filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + filelist@1.0.4: dependencies: minimatch: 5.1.6 - /filesize@6.4.0: - resolution: {integrity: sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ==} - engines: {node: '>= 0.4.0'} - dev: true + filesize@6.4.0: {} - /filesize@8.0.7: - resolution: {integrity: sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==} - engines: {node: '>= 0.4.0'} - dev: false + filesize@8.0.7: {} - /fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 - /finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} + finalhandler@1.2.0: dependencies: debug: 2.6.9 encodeurl: 1.0.2 @@ -13189,64 +21604,44 @@ packages: transitivePeerDependencies: - supports-color - /find-cache-dir@3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} + find-cache-dir@3.3.2: dependencies: commondir: 1.0.1 make-dir: 3.1.0 pkg-dir: 4.2.0 - /find-cache-dir@4.0.0: - resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} - engines: {node: '>=14.16'} + find-cache-dir@4.0.0: dependencies: common-path-prefix: 3.0.0 pkg-dir: 7.0.0 - dev: true - /find-free-port@2.0.0: - resolution: {integrity: sha512-J1j8gfEVf5FN4PR5w5wrZZ7NYs2IvqsHcd03cAeQx3Ec/mo+lKceaVNhpsRKoZpZKbId88o8qh+dwUwzBV6WCg==} - dev: true + find-free-port@2.0.0: {} - /find-up@3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} - engines: {node: '>=6'} + find-up@3.0.0: dependencies: locate-path: 3.0.0 - dev: false - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + find-up@4.1.0: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - /find-up@6.3.0: - resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + find-up@6.3.0: dependencies: locate-path: 7.2.0 path-exists: 5.0.0 - dev: true - /find-yarn-workspace-root2@1.2.16: - resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + find-yarn-workspace-root2@1.2.16: dependencies: micromatch: 4.0.7 pkg-dir: 4.2.0 - /firebase-admin@12.3.0: - resolution: {integrity: sha512-AKJcFbOZ7W8Fwcqh6Ba7FThXVoXwPdsf+E9vyjk5Z1vN1Z9mnTw88EQWfIsR91YglQ0KvWu1rvMhW65bcB4sog==} - engines: {node: '>=14'} + firebase-admin@12.3.0: dependencies: '@fastify/busboy': 3.0.0 '@firebase/database-compat': 1.0.6 @@ -13263,10 +21658,8 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false - /firebase@10.12.5: - resolution: {integrity: sha512-J0yL3yh12CfFprTkSOQ9HqBugERyqvWwOuOoo1j1QHmYe9cYLKnBmtNCvGIYInDcsVUnJoRXCM+hxbGf48oVhg==} + firebase@10.12.5: dependencies: '@firebase/analytics': 0.10.7(@firebase/app@0.10.8) '@firebase/analytics-compat': 0.2.13(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8) @@ -13298,78 +21691,42 @@ packages: transitivePeerDependencies: - '@react-native-async-storage/async-storage' - /first-chunk-stream@2.0.0: - resolution: {integrity: sha512-X8Z+b/0L4lToKYq+lwnKqi9X/Zek0NibLpsJgVsSxpoYq7JtiCtRb5HqKVEjEw/qAb/4AKKRLOwwKHlWNpm2Eg==} - engines: {node: '>=0.10.0'} + first-chunk-stream@2.0.0: dependencies: readable-stream: 2.3.8 - /first-match@0.0.1: - resolution: {integrity: sha512-VvKbnaxrC0polTFDC+teKPTdl2mn6B/KUW+WB3C9RzKDeNwbzfLdnUz3FxC+tnjvus6bI0jWrWicQyVIPdS37A==} - dev: false + first-match@0.0.1: {} - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@3.2.0: dependencies: flatted: 3.3.1 keyv: 4.5.4 rimraf: 3.0.2 - /flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true + flat@5.0.2: {} - /flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + flatted@3.3.1: {} - /flux@4.0.4(react@18.3.1): - resolution: {integrity: sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==} - peerDependencies: - react: ^15.0.2 || ^16.0.0 || ^17.0.0 + flux@4.0.4(react@18.3.1): dependencies: fbemitter: 3.0.0 fbjs: 3.0.5 react: 18.3.1 transitivePeerDependencies: - encoding - dev: false - /follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: false + follow-redirects@1.15.6: {} - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.3: dependencies: is-callable: 1.2.7 - /foreground-child@3.2.1: - resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} - engines: {node: '>=14'} + foreground-child@3.2.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 - /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.0)(typescript@5.5.4)(webpack@5.93.0): - resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} - engines: {node: '>=10', yarn: '>=1.0.0'} - peerDependencies: - eslint: '>= 6' - typescript: '>= 2.7' - vue-template-compiler: '*' - webpack: '>= 4' - peerDependenciesMeta: - eslint: - optional: true - vue-template-compiler: - optional: true + fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.0)(typescript@5.5.4)(webpack@5.93.0): dependencies: '@babel/code-frame': 7.24.7 '@types/json-schema': 7.0.15 @@ -13387,165 +21744,102 @@ packages: tapable: 1.1.3 typescript: 5.5.4 webpack: 5.93.0(webpack-cli@5.1.4) - dev: false - /form-data@2.5.1: - resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} - engines: {node: '>= 0.12'} + form-data@2.5.1: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: false - /form-data@3.0.1: - resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} - engines: {node: '>= 6'} + form-data@3.0.1: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: false - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} + form-data@4.0.0: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: false - /formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} + formdata-polyfill@4.0.10: dependencies: fetch-blob: 3.2.0 - dev: true - /forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} + forwarded@0.2.0: {} - /fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + fraction.js@4.3.7: {} - /fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} + fresh@0.5.2: {} - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs-constants@1.0.0: {} - /fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} + fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - dev: false - /fs-extra@11.1.0: - resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} - engines: {node: '>=14.14'} + fs-extra@11.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - dev: true - /fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} + fs-extra@8.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 - dev: true - /fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} + fs-extra@9.1.0: dependencies: at-least-node: 1.0.0 graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - dev: false - /fs-minipass@1.2.7: - resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} + fs-minipass@1.2.7: dependencies: minipass: 2.9.0 - dev: true - /fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} + fs-minipass@2.1.0: dependencies: minipass: 3.3.6 - /fs-minipass@3.0.3: - resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + fs-minipass@3.0.3: dependencies: minipass: 7.1.2 - /fs-monkey@1.0.6: - resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==} - dev: false + fs-monkey@1.0.6: {} - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fs.realpath@1.0.0: {} - /fsevents@2.1.3: - resolution: {integrity: sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - deprecated: '"Please update to latest v2.3 or v2.2"' - requiresBuild: true - dev: true + fsevents@2.1.3: optional: true - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true + fsevents@2.3.2: optional: true - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true + fsevents@2.3.3: optional: true - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + function-bind@1.1.2: {} - /function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} + function.prototype.name@1.1.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 functions-have-names: 1.2.3 - /functional-red-black-tree@1.0.1: - resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} - requiresBuild: true - dev: false + functional-red-black-tree@1.0.1: optional: true - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + functions-have-names@1.2.3: {} - /gauge@2.7.4: - resolution: {integrity: sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==} - deprecated: This package is no longer supported. + gauge@2.7.4: dependencies: aproba: 1.2.0 console-control-strings: 1.1.0 @@ -13555,12 +21849,8 @@ packages: string-width: 1.0.2 strip-ansi: 3.0.1 wide-align: 1.1.5 - dev: false - /gauge@3.0.2: - resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. + gauge@3.0.2: dependencies: aproba: 2.0.0 color-support: 1.1.3 @@ -13572,10 +21862,7 @@ packages: strip-ansi: 6.0.1 wide-align: 1.1.5 - /gauge@4.0.4: - resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This package is no longer supported. + gauge@4.0.4: dependencies: aproba: 2.0.0 color-support: 1.1.3 @@ -13586,9 +21873,7 @@ packages: strip-ansi: 6.0.1 wide-align: 1.1.5 - /gaxios@4.3.3: - resolution: {integrity: sha512-gSaYYIO1Y3wUtdfHmjDUZ8LWaxJQpiavzbF5Kq53akSzvmVg0RfyOcFDbO1KJ/KCGRFz2qG+lS81F0nkr7cRJA==} - engines: {node: '>=10'} + gaxios@4.3.3: dependencies: abort-controller: 3.0.0 extend: 3.0.2 @@ -13598,11 +21883,8 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false - /gaxios@6.7.0: - resolution: {integrity: sha512-DSrkyMTfAnAm4ks9Go20QGOcXEyW/NmZhvTYBU2rb4afBB393WIMQPWPEDMl/k8xqiNN9HYq2zao3oWXsdl2Tg==} - engines: {node: '>=14'} + gaxios@6.7.0: dependencies: extend: 3.0.2 https-proxy-agent: 7.0.5 @@ -13612,57 +21894,36 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false - /gcp-metadata@4.3.1: - resolution: {integrity: sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==} - engines: {node: '>=10'} + gcp-metadata@4.3.1: dependencies: gaxios: 4.3.3 json-bigint: 1.0.0 transitivePeerDependencies: - encoding - supports-color - dev: false - /gcp-metadata@6.1.0: - resolution: {integrity: sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==} - engines: {node: '>=14'} + gcp-metadata@6.1.0: dependencies: gaxios: 6.7.0 json-bigint: 1.0.0 transitivePeerDependencies: - encoding - supports-color - dev: false - /generic-names@2.0.1: - resolution: {integrity: sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ==} + generic-names@2.0.1: dependencies: loader-utils: 1.4.2 - dev: true - /generic-pool@3.4.2: - resolution: {integrity: sha512-H7cUpwCQSiJmAHM4c/aFu6fUfrhWXW1ncyh8ftxEPMu6AiYkHw9K8br720TGPZJbk5eOH2bynjZD1yPvdDAmag==} - engines: {node: '>= 4'} - dev: true + generic-pool@3.4.2: {} - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} + gensync@1.0.0-beta.2: {} - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + get-caller-file@2.0.5: {} - /get-east-asian-width@1.2.0: - resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} - engines: {node: '>=18'} - dev: false + get-east-asian-width@1.2.0: {} - /get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + get-intrinsic@1.2.4: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 @@ -13670,74 +21931,47 @@ packages: has-symbols: 1.0.3 hasown: 2.0.2 - /get-own-enumerable-property-symbols@3.0.2: - resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} - dev: false + get-own-enumerable-property-symbols@3.0.2: {} - /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} + get-package-type@0.1.0: {} - /get-port@5.1.1: - resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} - engines: {node: '>=8'} - dev: true + get-port@5.1.1: {} - /get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} + get-stream@5.2.0: dependencies: pump: 3.0.0 - dev: true - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + get-stream@6.0.1: {} - /get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} + get-symbol-description@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 - /get-tsconfig@4.7.6: - resolution: {integrity: sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==} + get-tsconfig@4.7.6: dependencies: resolve-pkg-maps: 1.0.0 - /github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - dev: false + github-from-package@0.0.0: {} - /github-username@6.0.0: - resolution: {integrity: sha512-7TTrRjxblSI5l6adk9zd+cV5d6i1OrJSo3Vr9xdGqFLBQo0mz5P9eIfKCDJ7eekVGGFLbce0qbPSnktXV2BjDQ==} - engines: {node: '>=10'} + github-username@6.0.0: dependencies: '@octokit/rest': 18.12.0 transitivePeerDependencies: - encoding - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + glob-to-regexp@0.4.1: {} - /glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + glob@10.3.10: dependencies: foreground-child: 3.2.1 jackspeak: 2.3.6 @@ -13745,9 +21979,7 @@ packages: minipass: 7.1.2 path-scurry: 1.11.1 - /glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true + glob@10.4.5: dependencies: foreground-child: 3.2.1 jackspeak: 3.4.3 @@ -13756,9 +21988,7 @@ packages: package-json-from-dist: 1.0.0 path-scurry: 1.11.1 - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -13767,10 +21997,7 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported + glob@8.1.0: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -13778,46 +22005,30 @@ packages: minimatch: 5.1.6 once: 1.4.0 - /global-modules@2.0.0: - resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} - engines: {node: '>=6'} + global-modules@2.0.0: dependencies: global-prefix: 3.0.0 - dev: false - /global-prefix@3.0.0: - resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} - engines: {node: '>=6'} + global-prefix@3.0.0: dependencies: ini: 1.3.8 kind-of: 6.0.3 which: 1.3.1 - dev: false - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} + globals@11.12.0: {} - /globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + globals@13.24.0: dependencies: type-fest: 0.20.2 - /globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} + globalthis@1.0.4: dependencies: define-properties: 1.2.1 gopd: 1.0.1 - /globalyzer@0.1.0: - resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} - dev: true + globalyzer@0.1.0: {} - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 @@ -13826,9 +22037,7 @@ packages: merge2: 1.4.1 slash: 3.0.0 - /globby@14.0.2: - resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} - engines: {node: '>=18'} + globby@14.0.2: dependencies: '@sindresorhus/merge-streams': 2.3.0 fast-glob: 3.3.2 @@ -13836,25 +22045,18 @@ packages: path-type: 5.0.0 slash: 5.1.0 unicorn-magic: 0.1.0 - dev: true - /globby@6.1.0: - resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} - engines: {node: '>=0.10.0'} + globby@6.1.0: dependencies: array-union: 1.0.2 glob: 7.2.3 object-assign: 4.1.1 pify: 2.3.0 pinkie-promise: 2.0.1 - dev: true - /globrex@0.1.2: - resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - dev: true + globrex@0.1.2: {} - /google-ads-api@16.0.0-rest-beta3: - resolution: {integrity: sha512-0XdXmlycfoWxTOg/Sr2djdUepNYojvx+MHJXKT0TKRyhH5a2V/lGqtht1H3QktOpjIGFuAdcXSHB46AIxZg+9g==} + google-ads-api@16.0.0-rest-beta3: dependencies: '@isaacs/ttlcache': 1.4.1 axios: 1.7.2 @@ -13869,21 +22071,16 @@ packages: - debug - encoding - supports-color - dev: false - /google-ads-node@13.0.0: - resolution: {integrity: sha512-A8g+58gJrSQqN88OTlg3Y3x7JTMUT62ZMUMtfznEs3RKKNQFnz8cv077031NVpmgS1eSXbcdYTDtaCGkhWSv2g==} + google-ads-node@13.0.0: dependencies: google-gax: 4.3.8 lru-cache: 10.4.3 transitivePeerDependencies: - encoding - supports-color - dev: false - /google-auth-library@7.14.1: - resolution: {integrity: sha512-5Rk7iLNDFhFeBYc3s8l1CqzbEBcdhwR193RlD4vSNFajIcINKI8W8P0JLmBpwymHqqWbX34pJDQu39cSy/6RsA==} - engines: {node: '>=10'} + google-auth-library@7.14.1: dependencies: arrify: 2.0.1 base64-js: 1.5.1 @@ -13897,11 +22094,8 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false - /google-auth-library@9.12.0: - resolution: {integrity: sha512-5pWjpxJMNJ5UTuhK7QPD5KFPsbosWkX4ajMDeZwXllTtwwqeiIzPWbHIddkLBkkn0mUPboTmukT5rd30Ec9igQ==} - engines: {node: '>=14'} + google-auth-library@9.12.0: dependencies: base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 @@ -13912,11 +22106,8 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false - /google-gax@4.3.8: - resolution: {integrity: sha512-SKAQKtvdjtNW3PMOhmKEqpQP+2C5ZqNKfwWxy70efpSwxvRYuAcgMJs6aRHTBPJjz3SO6ZbiXwM6WIuGYFZ7LQ==} - engines: {node: '>=14'} + google-gax@4.3.8: dependencies: '@grpc/grpc-js': 1.11.1 '@grpc/proto-loader': 0.7.13 @@ -13933,20 +22124,12 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false - /google-p12-pem@3.1.4: - resolution: {integrity: sha512-HHuHmkLgwjdmVRngf5+gSmpkyaRI6QmOg77J8tkNBHhNEI62sGHyw4/+UkgyZEI7h84NbWprXDJ+sa3xOYFvTg==} - engines: {node: '>=10'} - deprecated: Package is no longer maintained - hasBin: true + google-p12-pem@3.1.4: dependencies: node-forge: 1.3.1 - dev: false - /googleapis-common@7.2.0: - resolution: {integrity: sha512-/fhDZEJZvOV3X5jmD+fKxMqma5q2Q9nZNSF3kn1F18tpxmA86BcTxAGBQdM0N89Z3bEaIs+HVznSmFJEAmMTjA==} - engines: {node: '>=14.0.0'} + googleapis-common@7.2.0: dependencies: extend: 3.0.2 gaxios: 6.7.0 @@ -13957,37 +22140,26 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false - /googleapis@126.0.1: - resolution: {integrity: sha512-4N8LLi+hj6ytK3PhE52KcM8iSGhJjtXnCDYB4fp6l+GdLbYz4FoDmx074WqMbl7iYMDN87vqD/8drJkhxW92mQ==} - engines: {node: '>=14.0.0'} + googleapis@126.0.1: dependencies: google-auth-library: 9.12.0 googleapis-common: 7.2.0 transitivePeerDependencies: - encoding - supports-color - dev: false - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graceful-fs@4.2.11: {} - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + graphemer@1.4.0: {} - /grouped-queue@2.0.0: - resolution: {integrity: sha512-/PiFUa7WIsl48dUeCvhIHnwNmAAzlI/eHoJl0vu3nsFA366JleY7Ff8EVTplZu5kO0MIdZjKTTnzItL61ahbnw==} - engines: {node: '>=8.0.0'} + grouped-queue@2.0.0: {} - /gtoken@5.3.2: - resolution: {integrity: sha512-gkvEKREW7dXWF8NV8pVrKfW7WqReAmjjkMBh6lNCCGOM4ucS0r0YyXXl0r/9Yj8wcW/32ISkfc8h5mPTDbtifQ==} - engines: {node: '>=10'} + gtoken@5.3.2: dependencies: gaxios: 4.3.3 google-p12-pem: 3.1.4 @@ -13995,180 +22167,106 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false - /gtoken@7.1.0: - resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} - engines: {node: '>=14.0.0'} + gtoken@7.1.0: dependencies: gaxios: 6.7.0 jws: 4.0.0 transitivePeerDependencies: - encoding - supports-color - dev: false - /gzip-size@3.0.0: - resolution: {integrity: sha512-6s8trQiK+OMzSaCSVXX+iqIcLV9tC+E73jrJrJTyS4h/AJhlxHvzFKqM1YLDJWRGgHX8uLkBeXkA0njNj39L4w==} - engines: {node: '>=0.12.0'} + gzip-size@3.0.0: dependencies: duplexer: 0.1.2 - dev: true - /gzip-size@5.1.1: - resolution: {integrity: sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==} - engines: {node: '>=6'} + gzip-size@5.1.1: dependencies: duplexer: 0.1.2 pify: 4.0.1 - dev: true - /gzip-size@6.0.0: - resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} - engines: {node: '>=10'} + gzip-size@6.0.0: dependencies: duplexer: 0.1.2 - dev: false - /handle-thing@2.0.1: - resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} - dev: false + handle-thing@2.0.1: {} - /harmony-reflect@1.6.2: - resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==} - dev: false + harmony-reflect@1.6.2: {} - /has-ansi@2.0.0: - resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} - engines: {node: '>=0.10.0'} + has-ansi@2.0.0: dependencies: ansi-regex: 2.1.1 - dev: true - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + has-bigints@1.0.2: {} - /has-flag@1.0.0: - resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} - engines: {node: '>=0.10.0'} - dev: true + has-flag@1.0.0: {} - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + has-flag@3.0.0: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + has-flag@4.0.0: {} - /has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.0 - /has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} + has-proto@1.0.3: {} - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} + has-symbols@1.0.3: {} - /has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: dependencies: has-symbols: 1.0.3 - /has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + has-unicode@2.0.1: {} - /has@1.0.4: - resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} - engines: {node: '>= 0.4.0'} - dev: true + has@1.0.4: {} - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + hasown@2.0.2: dependencies: function-bind: 1.1.2 - /he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - dev: false + he@1.2.0: {} - /hex-color-regex@1.1.0: - resolution: {integrity: sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==} - dev: true + hex-color-regex@1.1.0: {} - /highlight.js@11.10.0: - resolution: {integrity: sha512-SYVnVFswQER+zu1laSya563s+F8VDGt7o35d4utbamowvUNLLMovFqwCLSocpZTz3MgaSRA1IbqRWZv97dtErQ==} - engines: {node: '>=12.0.0'} - dev: false + highlight.js@11.10.0: {} - /hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 - dev: false - /hoopy@0.1.4: - resolution: {integrity: sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==} - engines: {node: '>= 6.0.0'} - dev: false + hoopy@0.1.4: {} - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + hosted-git-info@2.8.9: {} - /hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} + hosted-git-info@4.1.0: dependencies: lru-cache: 6.0.0 - /hosted-git-info@6.1.1: - resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hosted-git-info@6.1.1: dependencies: lru-cache: 7.18.3 - /hpack.js@2.1.6: - resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + hpack.js@2.1.6: dependencies: inherits: 2.0.4 obuf: 1.1.2 readable-stream: 2.3.8 wbuf: 1.7.3 - dev: false - /hsl-regex@1.0.0: - resolution: {integrity: sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A==} - dev: true + hsl-regex@1.0.0: {} - /hsla-regex@1.0.0: - resolution: {integrity: sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA==} - dev: true + hsla-regex@1.0.0: {} - /html-encoding-sniffer@2.0.1: - resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} - engines: {node: '>=10'} + html-encoding-sniffer@2.0.1: dependencies: whatwg-encoding: 1.0.5 - dev: false - /html-entities@2.5.2: - resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==} - dev: false + html-entities@2.5.2: {} - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + html-escaper@2.0.2: {} - /html-minifier-terser@6.1.0: - resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} - engines: {node: '>=12'} - hasBin: true + html-minifier-terser@6.1.0: dependencies: camel-case: 4.1.2 clean-css: 5.3.3 @@ -14177,12 +22275,8 @@ packages: param-case: 3.0.4 relateurl: 0.2.7 terser: 5.31.3 - dev: false - /html-minifier@4.0.0: - resolution: {integrity: sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==} - engines: {node: '>=6'} - hasBin: true + html-minifier@4.0.0: dependencies: camel-case: 3.0.0 clean-css: 4.2.4 @@ -14191,19 +22285,8 @@ packages: param-case: 2.1.1 relateurl: 0.2.7 uglify-js: 3.19.1 - dev: false - /html-webpack-plugin@5.6.0(webpack@5.93.0): - resolution: {integrity: sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==} - engines: {node: '>=10.13.0'} - peerDependencies: - '@rspack/core': 0.x || 1.x - webpack: ^5.20.0 - peerDependenciesMeta: - '@rspack/core': - optional: true - webpack: - optional: true + html-webpack-plugin@5.6.0(webpack@5.93.0): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -14211,87 +22294,62 @@ packages: pretty-error: 4.0.0 tapable: 2.2.1 webpack: 5.93.0(webpack-cli@5.1.4) - dev: false - /htmlencode@0.0.4: - resolution: {integrity: sha512-0uDvNVpzj/E2TfvLLyyXhKBRvF1y84aZsyRxRXFsQobnHaL4pcaXk+Y9cnFlvnxrBLeXDNq/VJBD+ngdBgQG1w==} - dev: false + htmlencode@0.0.4: {} - /htmlparser2@5.0.1: - resolution: {integrity: sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ==} + htmlparser2@5.0.1: dependencies: domelementtype: 2.3.0 domhandler: 3.3.0 domutils: 2.8.0 entities: 2.2.0 - dev: false - /htmlparser2@6.1.0: - resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + htmlparser2@6.1.0: dependencies: domelementtype: 2.3.0 domhandler: 4.3.1 domutils: 2.8.0 entities: 2.2.0 - dev: false - /htmlparser2@8.0.2: - resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + htmlparser2@8.0.2: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 domutils: 3.1.0 entities: 4.5.0 - dev: false - /htmlparser2@9.1.0: - resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} + htmlparser2@9.1.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 domutils: 3.1.0 entities: 4.5.0 - dev: false - /http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + http-cache-semantics@4.1.1: {} - /http-deceiver@1.2.7: - resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} - dev: false + http-deceiver@1.2.7: {} - /http-errors@1.4.0: - resolution: {integrity: sha512-oLjPqve1tuOl5aRhv8GK5eHpqP1C9fb+Ol+XTLjKfLltE44zdDbEdjPSbU7Ch5rSNsVFqZn97SrMmZLdu1/YMw==} - engines: {node: '>= 0.6'} + http-errors@1.4.0: dependencies: inherits: 2.0.1 statuses: 1.5.0 - dev: true - /http-errors@1.6.3: - resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} - engines: {node: '>= 0.6'} + http-errors@1.6.3: dependencies: depd: 1.1.2 inherits: 2.0.3 setprototypeof: 1.1.0 statuses: 1.5.0 - dev: false - /http-errors@1.7.3: - resolution: {integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==} - engines: {node: '>= 0.6'} + http-errors@1.7.3: dependencies: depd: 1.1.2 inherits: 2.0.4 setprototypeof: 1.1.1 statuses: 1.5.0 toidentifier: 1.0.0 - dev: true - /http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} + http-errors@2.0.0: dependencies: depd: 2.0.0 inherits: 2.0.4 @@ -14299,12 +22357,9 @@ packages: statuses: 2.0.1 toidentifier: 1.0.1 - /http-parser-js@0.5.8: - resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} + http-parser-js@0.5.8: {} - /http-proxy-agent@4.0.1: - resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} - engines: {node: '>= 6'} + http-proxy-agent@4.0.1: dependencies: '@tootallnate/once': 1.1.2 agent-base: 6.0.2 @@ -14312,9 +22367,7 @@ packages: transitivePeerDependencies: - supports-color - /http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} + http-proxy-agent@5.0.0: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 @@ -14322,14 +22375,7 @@ packages: transitivePeerDependencies: - supports-color - /http-proxy-middleware@2.0.6(@types/express@4.17.21): - resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/express': ^4.17.13 - peerDependenciesMeta: - '@types/express': - optional: true + http-proxy-middleware@2.0.6(@types/express@4.17.21): dependencies: '@types/express': 4.17.21 '@types/http-proxy': 1.17.14 @@ -14339,233 +22385,139 @@ packages: micromatch: 4.0.7 transitivePeerDependencies: - debug - dev: false - /http-proxy@1.18.1: - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} + http-proxy@1.18.1: dependencies: eventemitter3: 4.0.7 follow-redirects: 1.15.6 requires-port: 1.0.0 transitivePeerDependencies: - debug - dev: false - /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} + https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 debug: 4.3.6(supports-color@5.5.0) transitivePeerDependencies: - supports-color - /https-proxy-agent@7.0.5: - resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} - engines: {node: '>= 14'} + https-proxy-agent@7.0.5: dependencies: agent-base: 7.1.1 debug: 4.3.6(supports-color@5.5.0) transitivePeerDependencies: - supports-color - dev: false - /human-signals@1.1.1: - resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} - engines: {node: '>=8.12.0'} - dev: true + human-signals@1.1.1: {} - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + human-signals@2.1.0: {} - /humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + humanize-ms@1.2.1: dependencies: ms: 2.1.3 - /husky@8.0.3: - resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} - engines: {node: '>=14'} - hasBin: true - dev: true + husky@8.0.3: {} - /hyphenate-style-name@1.1.0: - resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==} - dev: false + hyphenate-style-name@1.1.0: {} - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - /icss-replace-symbols@1.1.0: - resolution: {integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==} - dev: true + icss-replace-symbols@1.1.0: {} - /icss-utils@5.1.0(postcss@8.4.41): - resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 + icss-utils@5.1.0(postcss@8.4.41): dependencies: postcss: 8.4.41 - dev: false - /idb@7.1.1: - resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + idb@7.1.1: {} - /identity-obj-proxy@3.0.0: - resolution: {integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==} - engines: {node: '>=4'} + identity-obj-proxy@3.0.0: dependencies: harmony-reflect: 1.6.2 - dev: false - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ieee754@1.2.1: {} - /ignore-by-default@1.0.1: - resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} - dev: true + ignore-by-default@1.0.1: {} - /ignore-walk@4.0.1: - resolution: {integrity: sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==} - engines: {node: '>=10'} + ignore-walk@4.0.1: dependencies: minimatch: 3.1.2 - /ignore-walk@6.0.5: - resolution: {integrity: sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ignore-walk@6.0.5: dependencies: minimatch: 9.0.5 - /ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} + ignore@5.3.1: {} - /image-size@0.5.5: - resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} - engines: {node: '>=0.10.0'} - hasBin: true - requiresBuild: true - dev: true + image-size@0.5.5: optional: true - /immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - dev: false + immediate@3.0.6: {} - /immer@9.0.21: - resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} - dev: false + immer@9.0.21: {} - /import-cwd@2.1.0: - resolution: {integrity: sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==} - engines: {node: '>=4'} + import-cwd@2.1.0: dependencies: import-from: 2.1.0 - dev: true - /import-cwd@3.0.0: - resolution: {integrity: sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==} - engines: {node: '>=8'} + import-cwd@3.0.0: dependencies: import-from: 3.0.0 - dev: true - /import-fresh@2.0.0: - resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} - engines: {node: '>=4'} + import-fresh@2.0.0: dependencies: caller-path: 2.0.0 resolve-from: 3.0.0 - dev: true - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - /import-from@2.1.0: - resolution: {integrity: sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==} - engines: {node: '>=4'} + import-from@2.1.0: dependencies: resolve-from: 3.0.0 - dev: true - /import-from@3.0.0: - resolution: {integrity: sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==} - engines: {node: '>=8'} + import-from@3.0.0: dependencies: resolve-from: 5.0.0 - dev: true - /import-local@3.2.0: - resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} - engines: {node: '>=8'} - hasBin: true + import-local@3.2.0: dependencies: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + imurmurhash@0.1.4: {} - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} + indent-string@4.0.0: {} - /indexes-of@1.0.1: - resolution: {integrity: sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==} - dev: true + indexes-of@1.0.1: {} - /infer-owner@1.0.4: - resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + infer-owner@1.0.4: {} - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - /inherits@2.0.1: - resolution: {integrity: sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==} - dev: true + inherits@2.0.1: {} - /inherits@2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - dev: false + inherits@2.0.3: {} - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inherits@2.0.4: {} - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: false + ini@1.3.8: {} - /inline-style-prefixer@7.0.1: - resolution: {integrity: sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==} + inline-style-prefixer@7.0.1: dependencies: css-in-js-utils: 3.1.0 - dev: false - /inquirer@8.2.6: - resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} - engines: {node: '>=12.0.0'} + inquirer@8.2.6: dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -14583,9 +22535,7 @@ packages: through: 2.3.8 wrap-ansi: 6.2.0 - /inquirer@9.3.6: - resolution: {integrity: sha512-riK/iQB2ctwkpWYgjjWIRv3MBLt2gzb2Sj0JNQNbyTXgyXsLWcDPJ5WS5ZDTCx7BRFnJsARtYh+58fjP5M2Y0Q==} - engines: {node: '>=18'} + inquirer@9.3.6: dependencies: '@inquirer/figures': 1.0.5 ansi-escapes: 4.3.2 @@ -14599,43 +22549,28 @@ packages: strip-ansi: 6.0.1 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.2 - dev: true - /intercom-client@5.0.0: - resolution: {integrity: sha512-fEzM9w+apUwK6roDyZPvfXqmI9mrdM5Nz0QmCeDTM/8G2I0464SzJDfLTDRvz+ZkY6EIeTHEaQnK09DmYgqRhA==} - engines: {node: '>= v8.0.0'} + intercom-client@5.0.0: dependencies: axios: 1.7.2 htmlencode: 0.0.4 lodash: 4.17.21 transitivePeerDependencies: - debug - dev: false - /internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} + internal-slot@1.0.7: dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.0.6 - /internmap@2.0.3: - resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} - engines: {node: '>=12'} - dev: false + internmap@2.0.3: {} - /interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} + interpret@1.4.0: {} - /interpret@3.1.1: - resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} - engines: {node: '>=10.13.0'} + interpret@3.1.1: {} - /ioredis@5.4.1: - resolution: {integrity: sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==} - engines: {node: '>=12.22.0'} + ioredis@5.4.1: dependencies: '@ioredis/commands': 1.2.0 cluster-key-slot: 1.1.2 @@ -14649,91 +22584,60 @@ packages: transitivePeerDependencies: - supports-color - /ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} - engines: {node: '>= 12'} + ip-address@9.0.5: dependencies: jsbn: 1.1.0 sprintf-js: 1.1.3 - /ip6addr@0.2.5: - resolution: {integrity: sha512-9RGGSB6Zc9Ox5DpDGFnJdIeF0AsqXzdH+FspCfPPaU/L/4tI6P+5lIoFUFm9JXs9IrJv1boqAaNCQmoDADTSKQ==} + ip6addr@0.2.5: dependencies: assert-plus: 1.0.0 jsprim: 2.0.2 - dev: false - /ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} + ipaddr.js@1.9.1: {} - /ipaddr.js@2.2.0: - resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} - engines: {node: '>= 10'} - dev: false + ipaddr.js@2.2.0: {} - /is-absolute-url@2.1.0: - resolution: {integrity: sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg==} - engines: {node: '>=0.10.0'} - dev: true + is-absolute-url@2.1.0: {} - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} + is-arguments@1.1.1: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - /is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} + is-array-buffer@3.0.4: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-arrayish@0.2.1: {} - /is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + is-arrayish@0.3.2: {} - /is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} - engines: {node: '>= 0.4'} + is-async-function@2.0.0: dependencies: has-tostringtag: 1.0.2 - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.0.4: dependencies: has-bigints: 1.0.2 - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + is-boolean-object@1.1.2: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - /is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} + is-builtin-module@3.2.1: dependencies: builtin-modules: 3.3.0 - dev: true - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} + is-callable@1.2.7: {} - /is-color-stop@1.1.0: - resolution: {integrity: sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA==} + is-color-stop@1.1.0: dependencies: css-color-names: 0.0.4 hex-color-regex: 1.1.0 @@ -14741,309 +22645,178 @@ packages: hsla-regex: 1.0.0 rgb-regex: 1.0.1 rgba-regex: 1.0.0 - dev: true - /is-core-module@2.15.0: - resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} - engines: {node: '>= 0.4'} + is-core-module@2.15.0: dependencies: hasown: 2.0.2 - /is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} + is-data-view@1.0.1: dependencies: is-typed-array: 1.1.13 - - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + + is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.2 - /is-directory@0.3.1: - resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} - engines: {node: '>=0.10.0'} - dev: true + is-directory@0.3.1: {} - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - dev: false + is-docker@2.2.1: {} - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + is-extglob@2.1.1: {} - /is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + is-finalizationregistry@1.0.2: dependencies: call-bind: 1.0.7 - /is-fullwidth-code-point@1.0.0: - resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} - engines: {node: '>=0.10.0'} + is-fullwidth-code-point@1.0.0: dependencies: number-is-nan: 1.0.1 - dev: false - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + is-fullwidth-code-point@3.0.0: {} - /is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} + is-generator-fn@2.1.0: {} - /is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} + is-generator-function@1.0.10: dependencies: has-tostringtag: 1.0.2 - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - /is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} + is-interactive@1.0.0: {} - /is-lambda@1.0.1: - resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + is-lambda@1.0.1: {} - /is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} + is-map@2.0.3: {} - /is-module@1.0.0: - resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + is-module@1.0.0: {} - /is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} + is-negative-zero@2.0.3: {} - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + is-number-object@1.0.7: dependencies: has-tostringtag: 1.0.2 - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + is-number@7.0.0: {} - /is-obj@1.0.1: - resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} - engines: {node: '>=0.10.0'} - dev: false + is-obj@1.0.1: {} - /is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - dev: true + is-obj@2.0.0: {} - /is-path-cwd@2.2.0: - resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} - engines: {node: '>=6'} - dev: true + is-path-cwd@2.2.0: {} - /is-path-in-cwd@2.1.0: - resolution: {integrity: sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==} - engines: {node: '>=6'} + is-path-in-cwd@2.1.0: dependencies: is-path-inside: 2.1.0 - dev: true - /is-path-inside@2.1.0: - resolution: {integrity: sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==} - engines: {node: '>=6'} + is-path-inside@2.1.0: dependencies: path-is-inside: 1.0.2 - dev: true - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} + is-path-inside@3.0.3: {} - /is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} + is-plain-obj@2.1.0: {} - /is-plain-obj@3.0.0: - resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} - engines: {node: '>=10'} - dev: false + is-plain-obj@3.0.0: {} - /is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} + is-plain-object@2.0.4: dependencies: isobject: 3.0.1 - /is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} + is-plain-object@5.0.0: {} - /is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - dev: false + is-potential-custom-element-name@1.0.1: {} - /is-reference@1.2.1: - resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + is-reference@1.2.1: dependencies: '@types/estree': 1.0.5 - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + is-regex@1.1.4: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - /is-regexp@1.0.0: - resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} - engines: {node: '>=0.10.0'} - dev: false + is-regexp@1.0.0: {} - /is-resolvable@1.1.0: - resolution: {integrity: sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==} - dev: true + is-resolvable@1.1.0: {} - /is-root@2.1.0: - resolution: {integrity: sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==} - engines: {node: '>=6'} - dev: false + is-root@2.1.0: {} - /is-scoped@2.1.0: - resolution: {integrity: sha512-Cv4OpPTHAK9kHYzkzCrof3VJh7H/PrG2MBUMvvJebaaUMbqhm0YAtXnvh0I3Hnj2tMZWwrRROWLSgfJrKqWmlQ==} - engines: {node: '>=8'} + is-scoped@2.1.0: dependencies: scoped-regex: 2.1.0 - /is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} + is-set@2.0.3: {} - /is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} + is-shared-array-buffer@1.0.3: dependencies: call-bind: 1.0.7 - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + is-stream@2.0.1: {} - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + is-string@1.0.7: dependencies: has-tostringtag: 1.0.2 - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + is-symbol@1.0.4: dependencies: has-symbols: 1.0.3 - /is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} + is-typed-array@1.1.13: dependencies: which-typed-array: 1.1.15 - /is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - dev: false + is-typedarray@1.0.0: {} - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} + is-unicode-supported@0.1.0: {} - /is-utf8@0.2.1: - resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + is-utf8@0.2.1: {} - /is-valid-domain@0.1.6: - resolution: {integrity: sha512-ZKtq737eFkZr71At8NxOFcP9O1K89gW3DkdrGMpp1upr/ueWjj+Weh4l9AI4rN0Gt8W2M1w7jrG2b/Yv83Ljpg==} + is-valid-domain@0.1.6: dependencies: punycode: 2.3.1 - dev: false - /is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} + is-weakmap@2.0.2: {} - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakref@1.0.2: dependencies: call-bind: 1.0.7 - /is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} - engines: {node: '>= 0.4'} + is-weakset@2.0.3: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 - /is-what@3.14.1: - resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} - dev: true + is-what@3.14.1: {} - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + is-wsl@2.2.0: dependencies: is-docker: 2.2.1 - dev: false - /isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - dev: true + isarray@0.0.1: {} - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isarray@1.0.0: {} - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + isarray@2.0.5: {} - /isbinaryfile@4.0.10: - resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} - engines: {node: '>= 8.0.0'} + isbinaryfile@4.0.10: {} - /isbinaryfile@5.0.2: - resolution: {integrity: sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==} - engines: {node: '>= 18.0.0'} + isbinaryfile@5.0.2: {} - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isexe@2.0.0: {} - /iso-3166-1@2.1.1: - resolution: {integrity: sha512-RZxXf8cw5Y8LyHZIwIRvKw8sWTIHh2/txBT+ehO0QroesVfnz3JNFFX4i/OC/Yuv2bDIVYrHna5PMvjtpefq5w==} - dev: false + iso-3166-1@2.1.1: {} - /isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} + isobject@3.0.1: {} - /isolated-vm@5.0.1: - resolution: {integrity: sha512-hs7+ff59Z2zDvavfcjuot/r1gm6Bmpt+GoZxmVfxUmXaX5scOvUq/Rnme+mUtSh5lW41hH8gAuvk/yTJDYO8Fg==} - engines: {node: '>=18.0.0'} - requiresBuild: true + isolated-vm@5.0.1: dependencies: prebuild-install: 7.1.2 - dev: false - /istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} + istanbul-lib-coverage@3.2.2: {} - /istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} + istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.25.2 '@babel/parser': 7.25.0 @@ -15053,9 +22826,7 @@ packages: transitivePeerDependencies: - supports-color - /istanbul-lib-instrument@6.0.3: - resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} - engines: {node: '>=10'} + istanbul-lib-instrument@6.0.3: dependencies: '@babel/core': 7.25.2 '@babel/parser': 7.25.0 @@ -15065,17 +22836,13 @@ packages: transitivePeerDependencies: - supports-color - /istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} + istanbul-lib-report@3.0.1: dependencies: istanbul-lib-coverage: 3.2.2 make-dir: 4.0.0 supports-color: 7.2.0 - /istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} + istanbul-lib-source-maps@4.0.1: dependencies: debug: 4.3.6(supports-color@5.5.0) istanbul-lib-coverage: 3.2.2 @@ -15083,15 +22850,12 @@ packages: transitivePeerDependencies: - supports-color - /istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} - engines: {node: '>=8'} + istanbul-reports@3.1.7: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - /iterator.prototype@1.1.2: - resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + iterator.prototype@1.1.2: dependencies: define-properties: 1.2.1 get-intrinsic: 1.2.4 @@ -15099,59 +22863,43 @@ packages: reflect.getprototypeof: 1.0.6 set-function-name: 2.0.2 - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} + jackspeak@2.3.6: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - /jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - /jake@10.9.2: - resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} - engines: {node: '>=10'} - hasBin: true + jake@10.9.2: dependencies: async: 3.2.5 chalk: 4.1.2 filelist: 1.0.4 minimatch: 3.1.2 - /jest-changed-files@27.5.1: - resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + jest-changed-files@27.5.1: dependencies: '@jest/types': 27.5.1 execa: 5.1.1 throat: 6.0.2 - dev: false - /jest-changed-files@28.1.3: - resolution: {integrity: sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-changed-files@28.1.3: dependencies: execa: 5.1.1 p-limit: 3.1.0 - dev: true - /jest-changed-files@29.7.0: - resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-changed-files@29.7.0: dependencies: execa: 5.1.1 jest-util: 29.7.0 p-limit: 3.1.0 - /jest-circus@27.5.1: - resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + jest-circus@27.5.1: dependencies: '@jest/environment': 27.5.1 '@jest/test-result': 27.5.1 @@ -15174,11 +22922,8 @@ packages: throat: 6.0.2 transitivePeerDependencies: - supports-color - dev: false - /jest-circus@28.1.3: - resolution: {integrity: sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-circus@28.1.3: dependencies: '@jest/environment': 28.1.3 '@jest/expect': 28.1.3 @@ -15201,11 +22946,8 @@ packages: stack-utils: 2.0.6 transitivePeerDependencies: - supports-color - dev: true - /jest-circus@29.7.0: - resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-circus@29.7.0: dependencies: '@jest/environment': 29.7.0 '@jest/expect': 29.7.0 @@ -15231,15 +22973,7 @@ packages: - babel-plugin-macros - supports-color - /jest-cli@27.5.1(ts-node@10.9.2): - resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + jest-cli@27.5.1(ts-node@10.9.2): dependencies: '@jest/core': 27.5.1(ts-node@10.9.2) '@jest/test-result': 27.5.1 @@ -15259,17 +22993,8 @@ packages: - supports-color - ts-node - utf-8-validate - dev: false - /jest-cli@28.1.3(@types/node@18.19.42)(ts-node@10.9.2): - resolution: {integrity: sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + jest-cli@28.1.3(@types/node@18.19.42)(ts-node@10.9.2): dependencies: '@jest/core': 28.1.3(ts-node@10.9.2) '@jest/test-result': 28.1.3 @@ -15287,17 +23012,8 @@ packages: - '@types/node' - supports-color - ts-node - dev: true - /jest-cli@29.7.0(@types/node@18.19.42)(ts-node@10.9.2): - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + jest-cli@29.7.0(@types/node@18.19.42)(ts-node@10.9.2): dependencies: '@jest/core': 29.7.0(ts-node@10.9.2) '@jest/test-result': 29.7.0 @@ -15316,14 +23032,7 @@ packages: - supports-color - ts-node - /jest-config@27.5.1(ts-node@10.9.2): - resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - peerDependencies: - ts-node: '>=9.0.0' - peerDependenciesMeta: - ts-node: - optional: true + jest-config@27.5.1(ts-node@10.9.2): dependencies: '@babel/core': 7.25.2 '@jest/test-sequencer': 27.5.1 @@ -15355,19 +23064,8 @@ packages: - canvas - supports-color - utf-8-validate - dev: false - /jest-config@28.1.3(@types/node@18.19.42)(ts-node@10.9.2): - resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true + jest-config@28.1.3(@types/node@18.19.42)(ts-node@10.9.2): dependencies: '@babel/core': 7.25.2 '@jest/test-sequencer': 28.1.3 @@ -15395,19 +23093,8 @@ packages: ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) transitivePeerDependencies: - supports-color - dev: true - /jest-config@29.7.0(@types/node@18.19.42)(ts-node@10.9.2): - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true + jest-config@29.7.0(@types/node@18.19.42)(ts-node@10.9.2): dependencies: '@babel/core': 7.25.2 '@jest/test-sequencer': 29.7.0 @@ -15437,80 +23124,56 @@ packages: - babel-plugin-macros - supports-color - /jest-diff@27.5.1: - resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + jest-diff@27.5.1: dependencies: chalk: 4.1.2 diff-sequences: 27.5.1 jest-get-type: 27.5.1 pretty-format: 27.5.1 - dev: false - /jest-diff@28.1.3: - resolution: {integrity: sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-diff@28.1.3: dependencies: chalk: 4.1.2 diff-sequences: 28.1.1 jest-get-type: 28.0.2 pretty-format: 28.1.3 - dev: true - /jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-diff@29.7.0: dependencies: chalk: 4.1.2 diff-sequences: 29.6.3 jest-get-type: 29.6.3 pretty-format: 29.7.0 - /jest-docblock@27.5.1: - resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + jest-docblock@27.5.1: dependencies: detect-newline: 3.1.0 - dev: false - /jest-docblock@28.1.1: - resolution: {integrity: sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-docblock@28.1.1: dependencies: detect-newline: 3.1.0 - dev: true - /jest-docblock@29.7.0: - resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-docblock@29.7.0: dependencies: detect-newline: 3.1.0 - /jest-each@27.5.1: - resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + jest-each@27.5.1: dependencies: '@jest/types': 27.5.1 chalk: 4.1.2 jest-get-type: 27.5.1 jest-util: 27.5.1 pretty-format: 27.5.1 - dev: false - /jest-each@28.1.3: - resolution: {integrity: sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-each@28.1.3: dependencies: '@jest/types': 28.1.3 chalk: 4.1.2 jest-get-type: 28.0.2 jest-util: 28.1.3 pretty-format: 28.1.3 - dev: true - /jest-each@29.7.0: - resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-each@29.7.0: dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 @@ -15518,9 +23181,7 @@ packages: jest-util: 29.7.0 pretty-format: 29.7.0 - /jest-environment-jsdom@27.5.1: - resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + jest-environment-jsdom@27.5.1: dependencies: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 @@ -15534,11 +23195,8 @@ packages: - canvas - supports-color - utf-8-validate - dev: false - /jest-environment-node@27.5.1: - resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + jest-environment-node@27.5.1: dependencies: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 @@ -15546,11 +23204,8 @@ packages: '@types/node': 18.19.42 jest-mock: 27.5.1 jest-util: 27.5.1 - dev: false - /jest-environment-node@28.1.3: - resolution: {integrity: sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-environment-node@28.1.3: dependencies: '@jest/environment': 28.1.3 '@jest/fake-timers': 28.1.3 @@ -15558,11 +23213,8 @@ packages: '@types/node': 18.19.42 jest-mock: 28.1.3 jest-util: 28.1.3 - dev: true - /jest-environment-node@29.7.0: - resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-environment-node@29.7.0: dependencies: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 @@ -15571,23 +23223,13 @@ packages: jest-mock: 29.7.0 jest-util: 29.7.0 - /jest-get-type@27.5.1: - resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dev: false + jest-get-type@27.5.1: {} - /jest-get-type@28.0.2: - resolution: {integrity: sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - dev: true + jest-get-type@28.0.2: {} - /jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-get-type@29.6.3: {} - /jest-haste-map@27.5.1: - resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + jest-haste-map@27.5.1: dependencies: '@jest/types': 27.5.1 '@types/graceful-fs': 4.1.9 @@ -15603,11 +23245,8 @@ packages: walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 - dev: false - /jest-haste-map@28.1.3: - resolution: {integrity: sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-haste-map@28.1.3: dependencies: '@jest/types': 28.1.3 '@types/graceful-fs': 4.1.9 @@ -15622,11 +23261,8 @@ packages: walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 - dev: true - /jest-haste-map@29.7.0: - resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-haste-map@29.7.0: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 @@ -15642,9 +23278,7 @@ packages: optionalDependencies: fsevents: 2.3.3 - /jest-jasmine2@27.5.1: - resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + jest-jasmine2@27.5.1: dependencies: '@jest/environment': 27.5.1 '@jest/source-map': 27.5.1 @@ -15665,63 +23299,44 @@ packages: throat: 6.0.2 transitivePeerDependencies: - supports-color - dev: false - /jest-leak-detector@27.5.1: - resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + jest-leak-detector@27.5.1: dependencies: jest-get-type: 27.5.1 pretty-format: 27.5.1 - dev: false - /jest-leak-detector@28.1.3: - resolution: {integrity: sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-leak-detector@28.1.3: dependencies: jest-get-type: 28.0.2 pretty-format: 28.1.3 - dev: true - /jest-leak-detector@29.7.0: - resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-leak-detector@29.7.0: dependencies: jest-get-type: 29.6.3 pretty-format: 29.7.0 - /jest-matcher-utils@27.5.1: - resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + jest-matcher-utils@27.5.1: dependencies: chalk: 4.1.2 jest-diff: 27.5.1 jest-get-type: 27.5.1 pretty-format: 27.5.1 - dev: false - /jest-matcher-utils@28.1.3: - resolution: {integrity: sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-matcher-utils@28.1.3: dependencies: chalk: 4.1.2 jest-diff: 28.1.3 jest-get-type: 28.0.2 pretty-format: 28.1.3 - dev: true - /jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-matcher-utils@29.7.0: dependencies: chalk: 4.1.2 jest-diff: 29.7.0 jest-get-type: 29.6.3 pretty-format: 29.7.0 - /jest-message-util@27.5.1: - resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + jest-message-util@27.5.1: dependencies: '@babel/code-frame': 7.24.7 '@jest/types': 27.5.1 @@ -15732,11 +23347,8 @@ packages: pretty-format: 27.5.1 slash: 3.0.0 stack-utils: 2.0.6 - dev: false - /jest-message-util@28.1.3: - resolution: {integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-message-util@28.1.3: dependencies: '@babel/code-frame': 7.24.7 '@jest/types': 28.1.3 @@ -15748,9 +23360,7 @@ packages: slash: 3.0.0 stack-utils: 2.0.6 - /jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-message-util@29.7.0: dependencies: '@babel/code-frame': 7.24.7 '@jest/types': 29.6.3 @@ -15762,111 +23372,63 @@ packages: slash: 3.0.0 stack-utils: 2.0.6 - /jest-mock@27.5.1: - resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + jest-mock@27.5.1: dependencies: '@jest/types': 27.5.1 '@types/node': 18.19.42 - dev: false - /jest-mock@28.1.3: - resolution: {integrity: sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-mock@28.1.3: dependencies: '@jest/types': 28.1.3 '@types/node': 18.19.42 - dev: true - /jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 18.19.42 - jest-util: 29.7.0 - - /jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true + '@types/node': 18.19.42 + jest-util: 29.7.0 + + jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): dependencies: jest-resolve: 27.5.1 - dev: false - /jest-pnp-resolver@1.2.3(jest-resolve@28.1.3): - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true + jest-pnp-resolver@1.2.3(jest-resolve@28.1.3): dependencies: jest-resolve: 28.1.3 - dev: true - /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true + jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): dependencies: jest-resolve: 29.7.0 - /jest-regex-util@27.5.1: - resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dev: false + jest-regex-util@27.5.1: {} - /jest-regex-util@28.0.2: - resolution: {integrity: sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-regex-util@28.0.2: {} - /jest-regex-util@29.6.3: - resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-regex-util@29.6.3: {} - /jest-resolve-dependencies@27.5.1: - resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + jest-resolve-dependencies@27.5.1: dependencies: '@jest/types': 27.5.1 jest-regex-util: 27.5.1 jest-snapshot: 27.5.1 transitivePeerDependencies: - supports-color - dev: false - /jest-resolve-dependencies@28.1.3: - resolution: {integrity: sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-resolve-dependencies@28.1.3: dependencies: jest-regex-util: 28.0.2 jest-snapshot: 28.1.3 transitivePeerDependencies: - supports-color - dev: true - /jest-resolve-dependencies@29.7.0: - resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-resolve-dependencies@29.7.0: dependencies: jest-regex-util: 29.6.3 jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color - /jest-resolve@27.5.1: - resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + jest-resolve@27.5.1: dependencies: '@jest/types': 27.5.1 chalk: 4.1.2 @@ -15878,11 +23440,8 @@ packages: resolve: 1.22.8 resolve.exports: 1.1.1 slash: 3.0.0 - dev: false - /jest-resolve@28.1.3: - resolution: {integrity: sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-resolve@28.1.3: dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 @@ -15893,11 +23452,8 @@ packages: resolve: 1.22.8 resolve.exports: 1.1.1 slash: 3.0.0 - dev: true - /jest-resolve@29.7.0: - resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-resolve@29.7.0: dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 @@ -15909,9 +23465,7 @@ packages: resolve.exports: 2.0.2 slash: 3.0.0 - /jest-runner@27.5.1: - resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + jest-runner@27.5.1: dependencies: '@jest/console': 27.5.1 '@jest/environment': 27.5.1 @@ -15939,11 +23493,8 @@ packages: - canvas - supports-color - utf-8-validate - dev: false - /jest-runner@28.1.3: - resolution: {integrity: sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-runner@28.1.3: dependencies: '@jest/console': 28.1.3 '@jest/environment': 28.1.3 @@ -15968,11 +23519,8 @@ packages: source-map-support: 0.5.13 transitivePeerDependencies: - supports-color - dev: true - /jest-runner@29.7.0: - resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-runner@29.7.0: dependencies: '@jest/console': 29.7.0 '@jest/environment': 29.7.0 @@ -15998,9 +23546,7 @@ packages: transitivePeerDependencies: - supports-color - /jest-runtime@27.5.1: - resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + jest-runtime@27.5.1: dependencies: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 @@ -16026,11 +23572,8 @@ packages: strip-bom: 4.0.0 transitivePeerDependencies: - supports-color - dev: false - /jest-runtime@28.1.3: - resolution: {integrity: sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-runtime@28.1.3: dependencies: '@jest/environment': 28.1.3 '@jest/fake-timers': 28.1.3 @@ -16056,11 +23599,8 @@ packages: strip-bom: 4.0.0 transitivePeerDependencies: - supports-color - dev: true - /jest-runtime@29.7.0: - resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-runtime@29.7.0: dependencies: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 @@ -16087,17 +23627,12 @@ packages: transitivePeerDependencies: - supports-color - /jest-serializer@27.5.1: - resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + jest-serializer@27.5.1: dependencies: '@types/node': 18.19.42 graceful-fs: 4.2.11 - dev: false - /jest-snapshot@27.5.1: - resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + jest-snapshot@27.5.1: dependencies: '@babel/core': 7.25.2 '@babel/generator': 7.25.0 @@ -16123,11 +23658,8 @@ packages: semver: 7.6.3 transitivePeerDependencies: - supports-color - dev: false - /jest-snapshot@28.1.3: - resolution: {integrity: sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-snapshot@28.1.3: dependencies: '@babel/core': 7.25.2 '@babel/generator': 7.25.0 @@ -16154,11 +23686,8 @@ packages: semver: 7.6.3 transitivePeerDependencies: - supports-color - dev: true - /jest-snapshot@29.7.0: - resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-snapshot@29.7.0: dependencies: '@babel/core': 7.25.2 '@babel/generator': 7.25.0 @@ -16183,9 +23712,7 @@ packages: transitivePeerDependencies: - supports-color - /jest-util@27.5.1: - resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + jest-util@27.5.1: dependencies: '@jest/types': 27.5.1 '@types/node': 18.19.42 @@ -16193,11 +23720,8 @@ packages: ci-info: 3.9.0 graceful-fs: 4.2.11 picomatch: 2.3.1 - dev: false - /jest-util@28.1.3: - resolution: {integrity: sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-util@28.1.3: dependencies: '@jest/types': 28.1.3 '@types/node': 18.19.42 @@ -16206,9 +23730,7 @@ packages: graceful-fs: 4.2.11 picomatch: 2.3.1 - /jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 '@types/node': 18.19.42 @@ -16217,9 +23739,7 @@ packages: graceful-fs: 4.2.11 picomatch: 2.3.1 - /jest-validate@27.5.1: - resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + jest-validate@27.5.1: dependencies: '@jest/types': 27.5.1 camelcase: 6.3.0 @@ -16227,11 +23747,8 @@ packages: jest-get-type: 27.5.1 leven: 3.1.0 pretty-format: 27.5.1 - dev: false - /jest-validate@28.1.3: - resolution: {integrity: sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-validate@28.1.3: dependencies: '@jest/types': 28.1.3 camelcase: 6.3.0 @@ -16239,11 +23756,8 @@ packages: jest-get-type: 28.0.2 leven: 3.1.0 pretty-format: 28.1.3 - dev: true - /jest-validate@29.7.0: - resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-validate@29.7.0: dependencies: '@jest/types': 29.6.3 camelcase: 6.3.0 @@ -16252,11 +23766,7 @@ packages: leven: 3.1.0 pretty-format: 29.7.0 - /jest-watch-typeahead@1.1.0(jest@27.5.1): - resolution: {integrity: sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - jest: ^27.0.0 || ^28.0.0 + jest-watch-typeahead@1.1.0(jest@27.5.1): dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -16266,11 +23776,8 @@ packages: slash: 4.0.0 string-length: 5.0.1 strip-ansi: 7.1.0 - dev: false - /jest-watcher@27.5.1: - resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + jest-watcher@27.5.1: dependencies: '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 @@ -16279,11 +23786,8 @@ packages: chalk: 4.1.2 jest-util: 27.5.1 string-length: 4.0.2 - dev: false - /jest-watcher@28.1.3: - resolution: {integrity: sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-watcher@28.1.3: dependencies: '@jest/test-result': 28.1.3 '@jest/types': 28.1.3 @@ -16294,9 +23798,7 @@ packages: jest-util: 28.1.3 string-length: 4.0.2 - /jest-watcher@29.7.0: - resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-watcher@29.7.0: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 @@ -16307,57 +23809,37 @@ packages: jest-util: 29.7.0 string-length: 4.0.2 - /jest-worker@24.9.0: - resolution: {integrity: sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==} - engines: {node: '>= 6'} + jest-worker@24.9.0: dependencies: merge-stream: 2.0.0 supports-color: 6.1.0 - dev: true - /jest-worker@26.6.2: - resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} - engines: {node: '>= 10.13.0'} + jest-worker@26.6.2: dependencies: '@types/node': 18.19.42 merge-stream: 2.0.0 supports-color: 7.2.0 - dev: false - /jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} + jest-worker@27.5.1: dependencies: '@types/node': 18.19.42 merge-stream: 2.0.0 supports-color: 8.1.1 - /jest-worker@28.1.3: - resolution: {integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-worker@28.1.3: dependencies: '@types/node': 18.19.42 merge-stream: 2.0.0 supports-color: 8.1.1 - /jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-worker@29.7.0: dependencies: '@types/node': 18.19.42 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - /jest@27.5.1(ts-node@10.9.2): - resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + jest@27.5.1(ts-node@10.9.2): dependencies: '@jest/core': 27.5.1(ts-node@10.9.2) import-local: 3.2.0 @@ -16368,17 +23850,8 @@ packages: - supports-color - ts-node - utf-8-validate - dev: false - /jest@28.1.3(@types/node@18.19.42)(ts-node@10.9.2): - resolution: {integrity: sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + jest@28.1.3(@types/node@18.19.42)(ts-node@10.9.2): dependencies: '@jest/core': 28.1.3(ts-node@10.9.2) '@jest/types': 28.1.3 @@ -16388,17 +23861,8 @@ packages: - '@types/node' - supports-color - ts-node - dev: true - /jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2): - resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2): dependencies: '@jest/core': 29.7.0(ts-node@10.9.2) '@jest/types': 29.6.3 @@ -16409,73 +23873,41 @@ packages: - babel-plugin-macros - supports-color - ts-node - dev: true - /jiti@1.21.6: - resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} - hasBin: true + jiti@1.21.6: {} - /jose@4.15.9: - resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} - dev: false + jose@4.15.9: {} - /js-beautify@1.15.1: - resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} - engines: {node: '>=14'} - hasBin: true + js-beautify@1.15.1: dependencies: config-chain: 1.1.13 editorconfig: 1.0.4 glob: 10.4.5 js-cookie: 3.0.5 nopt: 7.2.1 - dev: false - /js-cookie@2.2.1: - resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} - dev: false + js-cookie@2.2.1: {} - /js-cookie@3.0.1: - resolution: {integrity: sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==} - engines: {node: '>=12'} - dev: true + js-cookie@3.0.1: {} - /js-cookie@3.0.5: - resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} - engines: {node: '>=14'} - dev: false + js-cookie@3.0.5: {} - /js-sha256@0.9.0: - resolution: {integrity: sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==} - dev: false + js-sha256@0.9.0: {} - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@4.0.0: {} - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true + js-yaml@3.14.1: dependencies: argparse: 1.0.10 esprima: 4.0.1 - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - /jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + jsbn@1.1.0: {} - /jsdom@16.7.0: - resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} - engines: {node: '>=10'} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true + jsdom@16.7.0: dependencies: abab: 2.0.6 acorn: 8.12.1 @@ -16508,134 +23940,84 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false - /jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true + jsesc@0.5.0: {} - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true + jsesc@2.5.2: {} - /json-bigint@1.0.0: - resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + json-bigint@1.0.0: dependencies: bignumber.js: 9.1.2 - dev: false - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-buffer@3.0.1: {} - /json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - dev: true + json-parse-better-errors@1.0.2: {} - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-parse-even-better-errors@2.3.1: {} - /json-parse-even-better-errors@3.0.2: - resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + json-parse-even-better-errors@3.0.2: {} - /json-schema-compare@0.2.2: - resolution: {integrity: sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ==} + json-schema-compare@0.2.2: dependencies: lodash: 4.17.21 - dev: false - /json-schema-merge-allof@0.8.1: - resolution: {integrity: sha512-CTUKmIlPJbsWfzRRnOXz+0MjIqvnleIXwFTzz+t9T86HnYX/Rozria6ZVGLktAU9e+NygNljveP+yxqtQp/Q4w==} - engines: {node: '>=12.0.0'} + json-schema-merge-allof@0.8.1: dependencies: compute-lcm: 1.1.2 json-schema-compare: 0.2.2 lodash: 4.17.21 - dev: false - /json-schema-to-ts@1.6.4: - resolution: {integrity: sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA==} + json-schema-to-ts@1.6.4: dependencies: '@types/json-schema': 7.0.15 ts-toolbelt: 6.15.5 - dev: true - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@0.4.1: {} - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema-traverse@1.0.0: {} - /json-schema@0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - dev: false + json-schema@0.4.0: {} - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json-stable-stringify-without-jsonify@1.0.1: {} - /json-stringify-nice@1.1.4: - resolution: {integrity: sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==} + json-stringify-nice@1.1.4: {} - /json2mq@0.2.0: - resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==} + json2mq@0.2.0: dependencies: string-convert: 0.2.1 - /json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true + json5@1.0.2: dependencies: minimist: 1.2.8 - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true + json5@2.2.3: {} - /jsondiffpatch@0.5.0: - resolution: {integrity: sha512-Quz3MvAwHxVYNXsOByL7xI5EB2WYOeFswqaHIA3qOK3isRWTxiplBEocmmru6XmxDB2L7jDNYtYA4FyimoAFEw==} - engines: {node: '>=8.17.0'} - hasBin: true + jsondiffpatch@0.5.0: dependencies: chalk: 3.0.0 diff-match-patch: 1.0.5 - dev: false - bundledDependencies: [] - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 - dev: true - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.1.0: dependencies: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 - /jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} + jsonparse@1.3.1: {} - /jsonpath@1.1.1: - resolution: {integrity: sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==} + jsonpath@1.1.1: dependencies: esprima: 1.2.2 static-eval: 2.0.2 underscore: 1.12.1 - dev: false - /jsonpointer@5.0.1: - resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} - engines: {node: '>=0.10.0'} - dev: false + jsonpointer@5.0.1: {} - /jsonwebtoken@9.0.2: - resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} - engines: {node: '>=12', npm: '>=6'} + jsonwebtoken@9.0.2: dependencies: jws: 3.2.2 lodash.includes: 4.3.0 @@ -16647,31 +24029,22 @@ packages: lodash.once: 4.1.1 ms: 2.1.3 semver: 7.6.3 - dev: false - /jsprim@2.0.2: - resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==} - engines: {'0': node >=0.6.0} + jsprim@2.0.2: dependencies: assert-plus: 1.0.0 extsprintf: 1.3.0 json-schema: 0.4.0 verror: 1.10.0 - dev: false - /jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} + jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.8 array.prototype.flat: 1.3.2 object.assign: 4.1.5 object.values: 1.2.0 - /juice@10.0.0: - resolution: {integrity: sha512-9f68xmhGrnIi6DBkiiP3rUrQN33SEuaKu1+njX6VgMP+jwZAsnT33WIzlrWICL9matkhYu3OyrqSUP55YTIdGg==} - engines: {node: '>=10.0.0'} - hasBin: true + juice@10.0.0: dependencies: cheerio: 1.0.0-rc.12 commander: 6.2.1 @@ -16680,33 +24053,24 @@ packages: web-resource-inliner: 6.0.1 transitivePeerDependencies: - encoding - dev: false - /just-diff-apply@5.5.0: - resolution: {integrity: sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==} + just-diff-apply@5.5.0: {} - /just-diff@5.2.0: - resolution: {integrity: sha512-6ufhP9SHjb7jibNFrNxyFZ6od3g+An6Ai9mhGRvcYe8UJlH0prseN64M+6ZBBUoKYHZsitDP42gAJ8+eVWr3lw==} + just-diff@5.2.0: {} - /jwa@1.4.1: - resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + jwa@1.4.1: dependencies: buffer-equal-constant-time: 1.0.1 ecdsa-sig-formatter: 1.0.11 safe-buffer: 5.2.1 - dev: false - /jwa@2.0.0: - resolution: {integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==} + jwa@2.0.0: dependencies: buffer-equal-constant-time: 1.0.1 ecdsa-sig-formatter: 1.0.11 safe-buffer: 5.2.1 - dev: false - /jwks-rsa@3.1.0: - resolution: {integrity: sha512-v7nqlfezb9YfHHzYII3ef2a2j1XnGeSE/bK3WfumaYCqONAIstJbrEGapz4kadScZzEt7zYCN7bucj8C0Mv/Rg==} - engines: {node: '>=14'} + jwks-rsa@3.1.0: dependencies: '@types/express': 4.17.21 '@types/jsonwebtoken': 9.0.6 @@ -16716,90 +24080,55 @@ packages: lru-memoizer: 2.3.0 transitivePeerDependencies: - supports-color - dev: false - /jws@3.2.2: - resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + jws@3.2.2: dependencies: jwa: 1.4.1 safe-buffer: 5.2.1 - dev: false - /jws@4.0.0: - resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} + jws@4.0.0: dependencies: jwa: 2.0.0 safe-buffer: 5.2.1 - dev: false - /kafkajs-snappy@1.1.0: - resolution: {integrity: sha512-M4h2WhlxhXmR64z8nwzfGa1Dhhz78vykRfySRL8tuYQ8e6JSOuclbF2FJ8jeMJP3EZWw3uhjvwHlz7Ucu3UdWA==} - engines: {node: '>=8.0.0'} + kafkajs-snappy@1.1.0: dependencies: snappyjs: 0.6.1 - dev: false - /kafkajs@2.2.4: - resolution: {integrity: sha512-j/YeapB1vfPT2iOIUn/vxdyKEuhuY2PxMBvf5JWux6iSaukAccrMtXEY/Lb7OvavDhOWME589bpLrEdnVHjfjA==} - engines: {node: '>=14.0.0'} - dev: false + kafkajs@2.2.4: {} - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@4.5.4: dependencies: json-buffer: 3.0.1 - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} + kind-of@6.0.3: {} - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} + kleur@3.0.3: {} - /klona@2.0.6: - resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} - engines: {node: '>= 8'} + klona@2.0.6: {} - /language-subtag-registry@0.3.23: - resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + language-subtag-registry@0.3.23: {} - /language-tags@1.0.9: - resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} - engines: {node: '>=0.10'} + language-tags@1.0.9: dependencies: language-subtag-registry: 0.3.23 - /launch-editor@2.8.0: - resolution: {integrity: sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==} + launch-editor@2.8.0: dependencies: picocolors: 1.0.1 shell-quote: 1.8.1 - dev: false - /lazystream@1.0.1: - resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} - engines: {node: '>= 0.6.3'} + lazystream@1.0.1: dependencies: readable-stream: 2.3.8 - dev: true - /less-loader@10.2.0(less@4.2.0)(webpack@5.93.0): - resolution: {integrity: sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg==} - engines: {node: '>= 12.13.0'} - peerDependencies: - less: ^3.5.0 || ^4.0.0 - webpack: ^5.0.0 + less-loader@10.2.0(less@4.2.0)(webpack@5.93.0): dependencies: klona: 2.0.6 less: 4.2.0 webpack: 5.93.0(webpack-cli@5.1.4) - dev: true - /less@4.2.0: - resolution: {integrity: sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==} - engines: {node: '>=6'} - hasBin: true + less@4.2.0: dependencies: copy-anything: 2.0.6 parse-node-version: 1.0.1 @@ -16812,326 +24141,200 @@ packages: mime: 1.6.0 needle: 3.3.1 source-map: 0.6.1 - dev: true - /leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} + leven@3.1.0: {} - /levn@0.3.0: - resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} - engines: {node: '>= 0.8.0'} + levn@0.3.0: dependencies: prelude-ls: 1.1.2 type-check: 0.3.2 - dev: false - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - /lie@3.1.1: - resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} + lie@3.1.1: dependencies: immediate: 3.0.6 - dev: false - /lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} + lilconfig@2.1.0: {} - /lilconfig@3.1.2: - resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} - engines: {node: '>=14'} + lilconfig@3.1.2: {} - /limiter@1.1.5: - resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==} - dev: false + limiter@1.1.5: {} - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + lines-and-columns@1.2.4: {} - /load-yaml-file@0.2.0: - resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} - engines: {node: '>=6'} + load-yaml-file@0.2.0: dependencies: graceful-fs: 4.2.11 js-yaml: 3.14.1 pify: 4.0.1 strip-bom: 3.0.0 - /loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} + loader-runner@4.3.0: {} - /loader-utils@1.4.2: - resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} - engines: {node: '>=4.0.0'} + loader-utils@1.4.2: dependencies: big.js: 5.2.2 emojis-list: 3.0.0 json5: 1.0.2 - dev: true - /loader-utils@2.0.4: - resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} - engines: {node: '>=8.9.0'} + loader-utils@2.0.4: dependencies: big.js: 5.2.2 emojis-list: 3.0.0 json5: 2.2.3 - /loader-utils@3.3.1: - resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} - engines: {node: '>= 12.13.0'} - dev: false + loader-utils@3.3.1: {} - /localforage@1.10.0: - resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} + localforage@1.10.0: dependencies: lie: 3.1.1 - dev: false - /locate-path@3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} - engines: {node: '>=6'} + locate-path@3.0.0: dependencies: p-locate: 3.0.0 path-exists: 3.0.0 - dev: false - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 - /locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + locate-path@7.2.0: dependencies: p-locate: 6.0.0 - dev: true - /lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - dev: false + lodash-es@4.17.21: {} - /lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + lodash.camelcase@4.3.0: {} - /lodash.castarray@4.4.0: - resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} - dev: true + lodash.castarray@4.4.0: {} - /lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - dev: false + lodash.clonedeep@4.5.0: {} - /lodash.curry@4.1.1: - resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} - dev: false + lodash.curry@4.1.1: {} - /lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.debounce@4.0.8: {} - /lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + lodash.defaults@4.2.0: {} - /lodash.difference@4.5.0: - resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} - dev: true + lodash.difference@4.5.0: {} - /lodash.flatten@4.4.0: - resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} - dev: true + lodash.flatten@4.4.0: {} - /lodash.flow@3.5.0: - resolution: {integrity: sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==} - dev: false + lodash.flow@3.5.0: {} - /lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - dev: false + lodash.get@4.4.2: {} - /lodash.includes@4.3.0: - resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} - dev: false + lodash.includes@4.3.0: {} - /lodash.isarguments@3.1.0: - resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + lodash.isarguments@3.1.0: {} - /lodash.isboolean@3.0.3: - resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} - dev: false + lodash.isboolean@3.0.3: {} - /lodash.isinteger@4.0.4: - resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} - dev: false + lodash.isinteger@4.0.4: {} - /lodash.isnumber@3.0.3: - resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} - dev: false + lodash.isnumber@3.0.3: {} - /lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + lodash.isplainobject@4.0.6: {} - /lodash.isstring@4.0.1: - resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - dev: false + lodash.isstring@4.0.1: {} - /lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + lodash.memoize@4.1.2: {} - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.merge@4.6.2: {} - /lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - dev: false + lodash.once@4.1.1: {} - /lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - dev: false + lodash.sortby@4.7.0: {} - /lodash.union@4.6.0: - resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} - dev: true + lodash.union@4.6.0: {} - /lodash.uniq@4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + lodash.uniq@4.5.0: {} - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lodash@4.17.21: {} - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + log-symbols@4.1.0: dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - /long@4.0.0: - resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} - dev: false + long@4.0.0: {} - /long@5.2.3: - resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + long@5.2.3: {} - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - /lower-case@1.1.4: - resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} - dev: false + lower-case@1.1.4: {} - /lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + lower-case@2.0.2: dependencies: tslib: 2.6.3 - dev: false - /lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@10.4.3: {} - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - /lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} + lru-cache@7.18.3: {} - /lru-memoizer@2.3.0: - resolution: {integrity: sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==} + lru-memoizer@2.3.0: dependencies: lodash.clonedeep: 4.5.0 lru-cache: 6.0.0 - dev: false - /lucide-react@0.263.1(react@18.3.1): - resolution: {integrity: sha512-keqxAx97PlaEN89PXZ6ki1N8nRjGWtDa4021GFYLNj0RgruM5odbpl8GHTExj0hhPq3sF6Up0gnxt6TSHu+ovw==} - peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 + lucide-react@0.263.1(react@18.3.1): dependencies: react: 18.3.1 - dev: false - /lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true - dev: true + lz-string@1.5.0: {} - /magic-string@0.22.5: - resolution: {integrity: sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==} + magic-string@0.22.5: dependencies: vlq: 0.2.3 - dev: true - /magic-string@0.25.9: - resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + magic-string@0.25.9: dependencies: sourcemap-codec: 1.4.8 - /magic-string@0.27.0: - resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} - engines: {node: '>=12'} + magic-string@0.27.0: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - /magic-string@0.30.11: - resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + magic-string@0.30.11: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - dev: true - /make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} - requiresBuild: true + make-dir@2.1.0: dependencies: pify: 4.0.1 semver: 5.7.2 - dev: true optional: true - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} + make-dir@3.1.0: dependencies: semver: 6.3.1 - /make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} + make-dir@4.0.0: dependencies: semver: 7.6.3 - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + make-error@1.3.6: {} - /make-fetch-happen@10.2.1: - resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + make-fetch-happen@10.2.1: dependencies: agentkeepalive: 4.3.0 cacache: 16.1.3 @@ -17153,9 +24356,7 @@ packages: - bluebird - supports-color - /make-fetch-happen@11.1.1: - resolution: {integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + make-fetch-happen@11.1.1: dependencies: agentkeepalive: 4.3.0 cacache: 17.1.4 @@ -17175,9 +24376,7 @@ packages: transitivePeerDependencies: - supports-color - /make-fetch-happen@9.1.0: - resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} - engines: {node: '>= 10'} + make-fetch-happen@9.1.0: dependencies: agentkeepalive: 4.3.0 cacache: 15.3.0 @@ -17199,69 +24398,40 @@ packages: - bluebird - supports-color - /makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + makeerror@1.0.12: dependencies: tmpl: 1.0.5 - /map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - dev: false + map-obj@4.3.0: {} - /markdown-to-jsx@7.4.7(react@18.3.1): - resolution: {integrity: sha512-0+ls1IQZdU6cwM1yu0ZjjiVWYtkbExSyUIFU2ZeDIFuZM1W42Mh4OlJ4nb4apX4H8smxDHRdFaoIVJGwfv5hkg==} - engines: {node: '>= 10'} - peerDependencies: - react: '>= 0.14.0' + markdown-to-jsx@7.4.7(react@18.3.1): dependencies: react: 18.3.1 - dev: false - /matched@5.0.1: - resolution: {integrity: sha512-E1fhSTPRyhAlNaNvGXAgZQlq1hL0bgYMTk/6bktVlIhzUnX/SZs7296ACdVeNJE8xFNGSuvd9IpI7vSnmcqLvw==} - engines: {node: '>=10'} + matched@5.0.1: dependencies: glob: 7.2.3 picomatch: 2.3.1 - dev: true - /maxmin@2.1.0: - resolution: {integrity: sha512-NWlApBjW9az9qRPaeg7CX4sQBWwytqz32bIEo1PW9pRW+kBP9KLRfJO3UC+TV31EcQZEUq7eMzikC7zt3zPJcw==} - engines: {node: '>=0.12'} + maxmin@2.1.0: dependencies: chalk: 1.1.3 figures: 1.7.0 gzip-size: 3.0.0 pretty-bytes: 3.0.1 - dev: true - /maxmind@4.3.20: - resolution: {integrity: sha512-xwnLGghs96DyNK3ANs1jzW8+JwS6pBQ3eTh3kNsi23n5wySZb9FgqCghmde5JZFOv23bxGehcyh6lT522llNKw==} - engines: {node: '>=12', npm: '>=6'} + maxmind@4.3.20: dependencies: mmdb-lib: 2.1.1 tiny-lru: 11.2.6 - dev: false - /mdn-data@2.0.14: - resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + mdn-data@2.0.14: {} - /mdn-data@2.0.4: - resolution: {integrity: sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==} + mdn-data@2.0.4: {} - /media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} + media-typer@0.3.0: {} - /mem-fs-editor@9.7.0(mem-fs@2.3.0): - resolution: {integrity: sha512-ReB3YD24GNykmu4WeUL/FDIQtkoyGB6zfJv60yfCo3QjKeimNcTqv2FT83bP0ccs6uu+sm5zyoBlspAzigmsdg==} - engines: {node: '>=12.10.0'} - peerDependencies: - mem-fs: ^2.1.0 - peerDependenciesMeta: - mem-fs: - optional: true + mem-fs-editor@9.7.0(mem-fs@2.3.0): dependencies: binaryextensions: 4.19.0 commondir: 1.0.1 @@ -17275,57 +24445,36 @@ packages: normalize-path: 3.0.0 textextensions: 5.16.0 - /mem-fs@2.3.0: - resolution: {integrity: sha512-GftCCBs6EN8sz3BoWO1bCj8t7YBtT713d8bUgbhg9Iel5kFSqnSvCK06TYIDJAtJ51cSiWkM/YemlT0dfoFycw==} - engines: {node: '>=12'} + mem-fs@2.3.0: dependencies: '@types/node': 15.14.9 '@types/vinyl': 2.0.12 vinyl: 2.2.1 vinyl-file: 3.0.0 - /memfs@3.5.3: - resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} - engines: {node: '>= 4.0.0'} + memfs@3.5.3: dependencies: fs-monkey: 1.0.6 - dev: false - /memory-pager@1.5.0: - resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} - dev: false + memory-pager@1.5.0: {} - /mensch@0.3.4: - resolution: {integrity: sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==} - dev: false + mensch@0.3.4: {} - /merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + merge-descriptors@1.0.1: {} - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + merge-stream@2.0.0: {} - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + merge2@1.4.1: {} - /methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} + methods@1.1.2: {} - /micro@9.3.5-canary.3: - resolution: {integrity: sha512-viYIo9PefV+w9dvoIBh1gI44Mvx1BOk67B4BpC2QK77qdY0xZF0Q+vWLt/BII6cLkIc8rLmSIcJaB/OrXXKe1g==} - engines: {node: '>= 8.0.0'} - hasBin: true + micro@9.3.5-canary.3: dependencies: arg: 4.1.0 content-type: 1.0.4 raw-body: 2.4.1 - dev: true - /microbundle-crl@0.13.11: - resolution: {integrity: sha512-3roSSgtJdIvvIOJdhefWD8BoEjHkbInkJzUoSE+ER6NGcpTuPWXNFyAbXamCL9Qg8rTU4urbYtXusk/d1ZpteA==} - hasBin: true + microbundle-crl@0.13.11: dependencies: '@babel/core': 7.25.2 '@babel/plugin-proposal-class-properties': 7.7.4(@babel/core@7.25.2) @@ -17370,130 +24519,74 @@ packages: typescript: 3.9.10 transitivePeerDependencies: - supports-color - dev: true - /micromatch@4.0.7: - resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} - engines: {node: '>=8.6'} + micromatch@4.0.7: dependencies: braces: 3.0.3 picomatch: 2.3.1 - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + mime-db@1.52.0: {} - /mime-db@1.53.0: - resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} - engines: {node: '>= 0.6'} - dev: false + mime-db@1.53.0: {} - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 - /mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true + mime@1.6.0: {} - /mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true + mime@2.6.0: {} - /mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} - hasBin: true - requiresBuild: true - dev: false + mime@3.0.0: optional: true - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + mimic-fn@2.1.0: {} - /mimic-response@2.1.0: - resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} - engines: {node: '>=8'} - dev: false + mimic-response@2.1.0: {} - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - dev: false + mimic-response@3.1.0: {} - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true + min-indent@1.0.1: {} - /mini-css-extract-plugin@2.9.0(webpack@5.93.0): - resolution: {integrity: sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^5.0.0 + mini-css-extract-plugin@2.9.0(webpack@5.93.0): dependencies: schema-utils: 4.2.0 tapable: 2.2.1 webpack: 5.93.0(webpack-cli@5.1.4) - dev: false - /minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - dev: false + minimalistic-assert@1.0.1: {} - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + minimatch@5.1.6: dependencies: brace-expansion: 2.0.1 - /minimatch@7.4.6: - resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} - engines: {node: '>=10'} + minimatch@7.4.6: dependencies: brace-expansion: 2.0.1 - /minimatch@9.0.1: - resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.1: dependencies: brace-expansion: 2.0.1 - dev: false - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.3: dependencies: brace-expansion: 2.0.1 - /minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minimist@1.2.8: {} - /minipass-collect@1.0.2: - resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} - engines: {node: '>= 8'} + minipass-collect@1.0.2: dependencies: minipass: 3.3.6 - /minipass-fetch@1.4.1: - resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} - engines: {node: '>=8'} + minipass-fetch@1.4.1: dependencies: minipass: 3.3.6 minipass-sized: 1.0.3 @@ -17501,9 +24594,7 @@ packages: optionalDependencies: encoding: 0.1.13 - /minipass-fetch@2.1.2: - resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + minipass-fetch@2.1.2: dependencies: minipass: 3.3.6 minipass-sized: 1.0.3 @@ -17511,9 +24602,7 @@ packages: optionalDependencies: encoding: 0.1.13 - /minipass-fetch@3.0.5: - resolution: {integrity: sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + minipass-fetch@3.0.5: dependencies: minipass: 7.1.2 minipass-sized: 1.0.3 @@ -17521,119 +24610,85 @@ packages: optionalDependencies: encoding: 0.1.13 - /minipass-flush@1.0.5: - resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} - engines: {node: '>= 8'} + minipass-flush@1.0.5: dependencies: minipass: 3.3.6 - /minipass-json-stream@1.0.2: - resolution: {integrity: sha512-myxeeTm57lYs8pH2nxPzmEEg8DGIgW+9mv6D4JZD2pa81I/OBjeU7PtICXV6c9eRGTA5JMDsuIPUZRCyBMYNhg==} + minipass-json-stream@1.0.2: dependencies: jsonparse: 1.3.1 minipass: 3.3.6 - /minipass-pipeline@1.2.4: - resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} - engines: {node: '>=8'} + minipass-pipeline@1.2.4: dependencies: minipass: 3.3.6 - /minipass-sized@1.0.3: - resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} - engines: {node: '>=8'} + minipass-sized@1.0.3: dependencies: minipass: 3.3.6 - /minipass@2.9.0: - resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} + minipass@2.9.0: dependencies: safe-buffer: 5.2.1 yallist: 3.1.1 - dev: true - /minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} + minipass@3.3.6: dependencies: yallist: 4.0.0 - /minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} + minipass@5.0.0: {} - /minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} + minipass@7.1.2: {} - /minizlib@1.3.3: - resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} + minizlib@1.3.3: dependencies: minipass: 2.9.0 - dev: true - /minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} + minizlib@2.1.2: dependencies: minipass: 3.3.6 yallist: 4.0.0 - /minizlib@3.0.1: - resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} - engines: {node: '>= 18'} + minizlib@3.0.1: dependencies: minipass: 7.1.2 rimraf: 5.0.9 - dev: false - /mixwith@0.1.1: - resolution: {integrity: sha512-DQsf/liljH/9e+94jR+xfK8vlKceeKdOM9H9UEXLwGuvEEpO6debNtJ9yt1ZKzPKPrwqGxzMdu0BR1fnQb6i4A==} - dev: false + mixwith@0.1.1: {} - /mjml-accordion@4.15.3: - resolution: {integrity: sha512-LPNVSj1LyUVYT9G1gWwSw3GSuDzDsQCu0tPB2uDsq4VesYNnU6v3iLCQidMiR6azmIt13OEozG700ygAUuA6Ng==} + mjml-accordion@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: - encoding - dev: false - /mjml-body@4.15.3: - resolution: {integrity: sha512-7pfUOVPtmb0wC+oUOn4xBsAw4eT5DyD6xqaxj/kssu6RrFXOXgJaVnDPAI9AzIvXJ/5as9QrqRGYAddehwWpHQ==} + mjml-body@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: - encoding - dev: false - /mjml-button@4.15.3: - resolution: {integrity: sha512-79qwn9AgdGjJR1vLnrcm2rq2AsAZkKC5JPwffTMG+Nja6zGYpTDZFZ56ekHWr/r1b5WxkukcPj2PdevUug8c+Q==} + mjml-button@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: - encoding - dev: false - /mjml-carousel@4.15.3: - resolution: {integrity: sha512-3ju6I4l7uUhPRrJfN3yK9AMsfHvrYbRkcJ1GRphFHzUj37B2J6qJOQUpzA547Y4aeh69TSb7HFVf1t12ejQxVw==} + mjml-carousel@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: - encoding - dev: false - /mjml-cli@4.15.3: - resolution: {integrity: sha512-+V2TDw3tXUVEptFvLSerz125C2ogYl8klIBRY1m5BHd4JvGVf3yhx8N3PngByCzA6PGcv/eydGQN+wy34SHf0Q==} - hasBin: true + mjml-cli@4.15.3: dependencies: '@babel/runtime': 7.25.0 chokidar: 3.6.0 @@ -17649,20 +24704,16 @@ packages: yargs: 17.7.2 transitivePeerDependencies: - encoding - dev: false - /mjml-column@4.15.3: - resolution: {integrity: sha512-hYdEFdJGHPbZJSEysykrevEbB07yhJGSwfDZEYDSbhQQFjV2tXrEgYcFD5EneMaowjb55e3divSJxU4c5q4Qgw==} + mjml-column@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: - encoding - dev: false - /mjml-core@4.15.3: - resolution: {integrity: sha512-Dmwk+2cgSD9L9GmTbEUNd8QxkTZtW9P7FN/ROZW/fGZD6Hq6/4TB0zEspg2Ow9eYjZXO2ofOJ3PaQEEShKV0kQ==} + mjml-core@4.15.3: dependencies: '@babel/runtime': 7.25.0 cheerio: 1.0.0-rc.12 @@ -17676,131 +24727,104 @@ packages: mjml-validator: 4.15.3 transitivePeerDependencies: - encoding - dev: false - /mjml-divider@4.15.3: - resolution: {integrity: sha512-vh27LQ9FG/01y0b9ntfqm+GT5AjJnDSDY9hilss2ixIUh0FemvfGRfsGVeV5UBVPBKK7Ffhvfqc7Rciob9Spzw==} + mjml-divider@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: - encoding - dev: false - /mjml-group@4.15.3: - resolution: {integrity: sha512-HSu/rKnGZVKFq3ciT46vi1EOy+9mkB0HewO4+P6dP/Y0UerWkN6S3UK11Cxsj0cAp0vFwkPDCdOeEzRdpFEkzA==} + mjml-group@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: - encoding - dev: false - /mjml-head-attributes@4.15.3: - resolution: {integrity: sha512-2ISo0r5ZKwkrvJgDou9xVPxxtXMaETe2AsAA02L89LnbB2KC0N5myNsHV0sEysTw9+CfCmgjAb0GAI5QGpxKkQ==} + mjml-head-attributes@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: - encoding - dev: false - /mjml-head-breakpoint@4.15.3: - resolution: {integrity: sha512-Eo56FA5C2v6ucmWQL/JBJ2z641pLOom4k0wP6CMZI2utfyiJ+e2Uuinj1KTrgDcEvW4EtU9HrfAqLK9UosLZlg==} + mjml-head-breakpoint@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: - encoding - dev: false - /mjml-head-font@4.15.3: - resolution: {integrity: sha512-CzV2aDPpiNIIgGPHNcBhgyedKY4SX3BJoTwOobSwZVIlEA6TAWB4Z9WwFUmQqZOgo1AkkiTHPZQvGcEhFFXH6g==} + mjml-head-font@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: - encoding - dev: false - /mjml-head-html-attributes@4.15.3: - resolution: {integrity: sha512-MDNDPMBOgXUZYdxhosyrA2kudiGO8aogT0/cODyi2Ed9o/1S7W+je11JUYskQbncqhWKGxNyaP4VWa+6+vUC/g==} + mjml-head-html-attributes@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: - encoding - dev: false - /mjml-head-preview@4.15.3: - resolution: {integrity: sha512-J2PxCefUVeFwsAExhrKo4lwxDevc5aKj888HBl/wN4EuWOoOg06iOGCxz4Omd8dqyFsrqvbBuPqRzQ+VycGmaA==} + mjml-head-preview@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: - encoding - dev: false - /mjml-head-style@4.15.3: - resolution: {integrity: sha512-9J+JuH+mKrQU65CaJ4KZegACUgNIlYmWQYx3VOBR/tyz+8kDYX7xBhKJCjQ1I4wj2Tvga3bykd89Oc2kFZ5WOw==} + mjml-head-style@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: - encoding - dev: false - /mjml-head-title@4.15.3: - resolution: {integrity: sha512-IM59xRtsxID4DubQ0iLmoCGXguEe+9BFG4z6y2xQDrscIa4QY3KlfqgKGT69ojW+AVbXXJPEVqrAi4/eCsLItQ==} + mjml-head-title@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: - encoding - dev: false - /mjml-head@4.15.3: - resolution: {integrity: sha512-o3mRuuP/MB5fZycjD3KH/uXsnaPl7Oo8GtdbJTKtH1+O/3pz8GzGMkscTKa97l03DAG2EhGrzzLcU2A6eshwFw==} + mjml-head@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: - encoding - dev: false - /mjml-hero@4.15.3: - resolution: {integrity: sha512-9cLAPuc69yiuzNrMZIN58j+HMK1UWPaq2i3/Fg2ZpimfcGFKRcPGCbEVh0v+Pb6/J0+kf8yIO0leH20opu3AyQ==} + mjml-hero@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: - encoding - dev: false - /mjml-image@4.15.3: - resolution: {integrity: sha512-g1OhSdofIytE9qaOGdTPmRIp7JsCtgO0zbsn1Fk6wQh2gEL55Z40j/VoghslWAWTgT2OHFdBKnMvWtN6U5+d2Q==} + mjml-image@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: - encoding - dev: false - /mjml-migrate@4.15.3: - resolution: {integrity: sha512-sr/+35RdxZroNQVegjpfRHJ5hda9XCgaS4mK2FGO+Mb1IUevKfeEPII3F/cHDpNwFeYH3kAgyqQ22ClhGLWNBA==} - hasBin: true + mjml-migrate@4.15.3: dependencies: '@babel/runtime': 7.25.0 js-beautify: 1.15.1 @@ -17810,29 +24834,23 @@ packages: yargs: 17.7.2 transitivePeerDependencies: - encoding - dev: false - /mjml-navbar@4.15.3: - resolution: {integrity: sha512-VsKH/Jdlf8Yu3y7GpzQV5n7JMdpqvZvTSpF6UQXL0PWOm7k6+LX+sCZimOfpHJ+wCaaybpxokjWZ71mxOoCWoA==} + mjml-navbar@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: - encoding - dev: false - /mjml-parser-xml@4.15.3: - resolution: {integrity: sha512-Tz0UX8/JVYICLjT+U8J1f/TFxIYVYjzZHeh4/Oyta0pLpRLeZlxEd71f3u3kdnulCKMP4i37pFRDmyLXAlEuLw==} + mjml-parser-xml@4.15.3: dependencies: '@babel/runtime': 7.25.0 detect-node: 2.1.0 htmlparser2: 9.1.0 lodash: 4.17.21 - dev: false - /mjml-preset-core@4.15.3: - resolution: {integrity: sha512-1zZS8P4O0KweWUqNS655+oNnVMPQ1Rq1GaZq5S9JfwT1Vh/m516lSmiTW9oko6gGHytt5s6Yj6oOeu5Zm8FoLw==} + mjml-preset-core@4.15.3: dependencies: '@babel/runtime': 7.25.0 mjml-accordion: 4.15.3 @@ -17862,24 +24880,16 @@ packages: mjml-wrapper: 4.15.3 transitivePeerDependencies: - encoding - dev: false - /mjml-raw@4.15.3: - resolution: {integrity: sha512-IGyHheOYyRchBLiAEgw3UM11kFNmBSMupu2BDdejC6ZiDhEAdG+tyERlsCwDPYtXanvFpGWULIu3XlsUPc+RZw==} + mjml-raw@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: - encoding - dev: false - /mjml-react@2.0.8(mjml@4.15.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-3wtHZZs1Y7e7Tl+ImojD/+aPE8Z0xshMww7MKSQlD9A1E/92amWQilGZN3T+WjWWaDueKcH2Gc1RJ72PLGSRGA==} - peerDependencies: - mjml: ^4.7.0 - react: ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 + mjml-react@2.0.8(mjml@4.15.3)(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 babel-runtime: 6.25.0 @@ -17888,66 +24898,52 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-reconciler: 0.26.2(react@18.3.1) - dev: false - /mjml-section@4.15.3: - resolution: {integrity: sha512-JfVPRXH++Hd933gmQfG8JXXCBCR6fIzC3DwiYycvanL/aW1cEQ2EnebUfQkt5QzlYjOkJEH+JpccAsq3ln6FZQ==} + mjml-section@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: - encoding - dev: false - /mjml-social@4.15.3: - resolution: {integrity: sha512-7sD5FXrESOxpT9Z4Oh36bS6u/geuUrMP1aCg2sjyAwbPcF1aWa2k9OcatQfpRf6pJEhUZ18y6/WBBXmMVmSzXg==} + mjml-social@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: - encoding - dev: false - /mjml-spacer@4.15.3: - resolution: {integrity: sha512-3B7Qj+17EgDdAtZ3NAdMyOwLTX1jfmJuY7gjyhS2HtcZAmppW+cxqHUBwCKfvSRgTQiccmEvtNxaQK+tfyrZqA==} + mjml-spacer@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: - encoding - dev: false - /mjml-table@4.15.3: - resolution: {integrity: sha512-FLx7DcRKTdKdcOCbMyBaeudeHaHpwPveRrBm6WyQe3LXx6FfdmOh59i71/16LFQMgBOD3N4/UJkzxLzlTJzMqQ==} + mjml-table@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: - encoding - dev: false - /mjml-text@4.15.3: - resolution: {integrity: sha512-+C0hxCmw9kg0XzT6vhE5mFkK6y225nC8UEQcN94K0fBCjPKkM+HqZMwGX205fzdGRi+Bxa55b/VhrIVwdv+8vw==} + mjml-text@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: - encoding - dev: false - /mjml-validator@4.15.3: - resolution: {integrity: sha512-Xb72KdqRwjv/qM2rJpV22syyP2N3cRQ9VVDrN6u2FSzLq02buFNxmSPJ7CKhat3PrUNdVHU75KZwOf/tz4UEhA==} + mjml-validator@4.15.3: dependencies: '@babel/runtime': 7.25.0 - dev: false - /mjml-wrapper@4.15.3: - resolution: {integrity: sha512-ditsCijeHJrmBmObtJmQ18ddLxv5oPyMTdPU8Di8APOnD2zPk7Z4UAuJSl7HXB45oFiivr3MJf4koFzMUSZ6Gg==} + mjml-wrapper@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 @@ -17955,11 +24951,8 @@ packages: mjml-section: 4.15.3 transitivePeerDependencies: - encoding - dev: false - /mjml@4.15.3: - resolution: {integrity: sha512-bW2WpJxm6HS+S3Yu6tq1DUPFoTxU9sPviUSmnL7Ua+oVO3WA5ILFWqvujUlz+oeuM+HCwEyMiP5xvKNPENVjYA==} - hasBin: true + mjml@4.15.3: dependencies: '@babel/runtime': 7.25.0 mjml-cli: 4.15.3 @@ -17969,130 +24962,64 @@ packages: mjml-validator: 4.15.3 transitivePeerDependencies: - encoding - dev: false - /mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + mkdirp-classic@0.5.3: {} - /mkdirp-infer-owner@2.0.0: - resolution: {integrity: sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==} - engines: {node: '>=10'} + mkdirp-infer-owner@2.0.0: dependencies: chownr: 2.0.0 infer-owner: 1.0.4 mkdirp: 1.0.4 - /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true + mkdirp@0.5.6: dependencies: minimist: 1.2.8 - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - - /mkdirp@3.0.1: - resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} - engines: {node: '>=10'} - hasBin: true - dev: false - - /mmdb-lib@2.1.1: - resolution: {integrity: sha512-yx8H/1H5AfnufiLnzzPqPf4yr/dKU9IFT1rPVwSkrKWHsQEeVVd6+X+L0nUbXhlEFTu3y/7hu38CFmEVgzvyeg==} - engines: {node: '>=10', npm: '>=6'} - dev: false - - /module-details-from-path@1.0.3: - resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} - dev: true - - /moment@2.30.1: - resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} - dev: false - - /monaco-editor@0.50.0: - resolution: {integrity: sha512-8CclLCmrRRh+sul7C08BmPBP3P8wVWfBHomsTcndxg5NRCEPfu/mc2AGU8k37ajjDVXcXFc12ORAMUkmk+lkFA==} - dev: false - - /mongodb-connection-string-url@3.0.1: - resolution: {integrity: sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==} - dependencies: - '@types/whatwg-url': 11.0.5 - whatwg-url: 13.0.0 - dev: false + mkdirp@1.0.4: {} - /mongodb@6.8.0(@mongodb-js/zstd@1.2.0): - resolution: {integrity: sha512-HGQ9NWDle5WvwMnrvUxsFYPd3JEbqD3RgABHBQRuoCEND0qzhsd0iH5ypHsf1eJ+sXmvmyKpP+FLOKY8Il7jMw==} - engines: {node: '>=16.20.1'} - peerDependencies: - '@aws-sdk/credential-providers': ^3.188.0 - '@mongodb-js/zstd': ^1.1.0 - gcp-metadata: ^5.2.0 - kerberos: ^2.0.1 - mongodb-client-encryption: '>=6.0.0 <7' - snappy: ^7.2.2 - socks: ^2.7.1 - peerDependenciesMeta: - '@aws-sdk/credential-providers': - optional: true - '@mongodb-js/zstd': - optional: true - gcp-metadata: - optional: true - kerberos: - optional: true - mongodb-client-encryption: - optional: true - snappy: - optional: true - socks: - optional: true + mkdirp@3.0.1: {} + + mmdb-lib@2.1.1: {} + + module-details-from-path@1.0.3: {} + + moment@2.30.1: {} + + monaco-editor@0.50.0: {} + + mongodb-connection-string-url@3.0.1: + dependencies: + '@types/whatwg-url': 11.0.5 + whatwg-url: 13.0.0 + + mongodb@6.8.0(@mongodb-js/zstd@1.2.0): dependencies: '@mongodb-js/saslprep': 1.1.8 '@mongodb-js/zstd': 1.2.0 bson: 6.8.0 mongodb-connection-string-url: 3.0.1 - dev: false - /monorel@0.4.2: - resolution: {integrity: sha512-CoMOQatkftXPegXzAh8Qnjc/+VQuiujhNjU6iWY5YZi0o2N0FKxPckja8LhKYoHBZlMt0jyKA+99EfnxjffjBQ==} - hasBin: true + monorel@0.4.2: dependencies: minimist: 1.2.8 tslib: 2.6.3 - dev: true - /mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - dev: true + mri@1.2.0: {} - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + ms@2.0.0: {} - /ms@2.1.1: - resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==} - dev: true + ms@2.1.1: {} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.2: {} - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + ms@2.1.3: {} - /multicast-dns@7.2.5: - resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} - hasBin: true + multicast-dns@7.2.5: dependencies: dns-packet: 5.6.1 thunky: 1.1.0 - dev: false - /multimatch@5.0.0: - resolution: {integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==} - engines: {node: '>=10'} + multimatch@5.0.0: dependencies: '@types/minimatch': 3.0.5 array-differ: 3.0.0 @@ -18100,32 +25027,20 @@ packages: arrify: 2.0.1 minimatch: 3.1.2 - /mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + mute-stream@0.0.8: {} - /mute-stream@1.0.0: - resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + mute-stream@1.0.0: {} - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + mz@2.7.0: dependencies: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 - /nan@2.20.0: - resolution: {integrity: sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==} - requiresBuild: true - dev: true + nan@2.20.0: optional: true - /nano-css@5.6.2(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-+6bHaC8dSDGALM1HJjOHVXpuastdu2xFoZlC77Jh4cg+33Zcgm+Gxd+1xsnpZK14eyHObSp82+ll5y3SX75liw==} - peerDependencies: - react: '*' - react-dom: '*' + nano-css@5.6.2(react-dom@18.3.1)(react@18.3.1): dependencies: '@jridgewell/sourcemap-codec': 1.5.0 css-tree: 1.1.3 @@ -18137,58 +25052,30 @@ packages: rtl-css-js: 1.16.1 stacktrace-js: 2.0.2 stylis: 4.3.2 - dev: false - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true + nanoid@3.3.7: {} - /napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - dev: false + napi-build-utils@1.0.2: {} - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: false + natural-compare-lite@1.4.0: {} - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + natural-compare@1.4.0: {} - /needle@3.3.1: - resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} - engines: {node: '>= 4.4.x'} - hasBin: true - requiresBuild: true + needle@3.3.1: dependencies: iconv-lite: 0.6.3 sax: 1.4.1 - dev: true optional: true - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} + negotiator@0.6.3: {} - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + neo-async@2.6.2: {} - /new-date@1.0.3: - resolution: {integrity: sha512-0fsVvQPbo2I18DT2zVHpezmeeNYV2JaJSrseiHLc17GNOxJzUdx5mvSigPu8LtIfZSij5i1wXnXFspEs2CD6hA==} + new-date@1.0.3: dependencies: '@segment/isodate': 1.0.3 - dev: true - /next-auth@4.24.7(next@14.2.5)(nodemailer@6.9.14)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-iChjE8ov/1K/z98gdKbn2Jw+2vLgJtVV39X+rCP5SGnVQuco7QOr19FRNGMIrD8d3LYhHWV9j9sKLzq1aDWWQQ==} - peerDependencies: - next: ^12.2.5 || ^13 || ^14 - nodemailer: ^6.6.5 - react: ^17.0.2 || ^18 - react-dom: ^17.0.2 || ^18 - peerDependenciesMeta: - nodemailer: - optional: true + next-auth@4.24.7(next@14.2.5)(nodemailer@6.9.14)(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 '@panva/hkdf': 1.2.1 @@ -18203,31 +25090,12 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) uuid: 8.3.2 - dev: false - /next-transpile-modules@10.0.1: - resolution: {integrity: sha512-4VX/LCMofxIYAVV58UmD+kr8jQflpLWvas/BQ4Co0qWLWzVh06FoZkECkrX5eEZT6oJFqie6+kfbTA3EZCVtdQ==} + next-transpile-modules@10.0.1: dependencies: enhanced-resolve: 5.17.1 - dev: true - /next@14.2.5(@babel/core@7.25.2)(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-0f8aRfBVL+mpzfBjYfQuLWh2WyAwtJXCRfkPF4UJ5qd2YwrHczsrSzXU4tRMV0OAxR8ZJZWPFn6uhSC56UTsLA==} - engines: {node: '>=18.17.0'} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.41.2 - react: ^18.2.0 - react-dom: ^18.2.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@playwright/test': - optional: true - sass: - optional: true + next@14.2.5(@babel/core@7.25.2)(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1): dependencies: '@next/env': 14.2.5 '@playwright/test': 1.39.0 @@ -18252,113 +25120,60 @@ packages: transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - dev: false - /no-case@2.3.2: - resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} + no-case@2.3.2: dependencies: lower-case: 1.1.4 - dev: false - /no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + no-case@3.0.4: dependencies: lower-case: 2.0.2 tslib: 2.6.3 - dev: false - /node-abi@2.30.1: - resolution: {integrity: sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==} + node-abi@2.30.1: dependencies: semver: 5.7.2 - dev: false - /node-abi@3.65.0: - resolution: {integrity: sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==} - engines: {node: '>=10'} + node-abi@3.65.0: dependencies: semver: 7.6.3 - dev: false - /node-addon-api@2.0.2: - resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} - dev: false + node-addon-api@2.0.2: {} - /node-cache@5.1.2: - resolution: {integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==} - engines: {node: '>= 8.0.0'} + node-cache@5.1.2: dependencies: clone: 2.1.2 - dev: false - /node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} + node-domexception@1.0.0: {} - /node-fetch-commonjs@3.3.2: - resolution: {integrity: sha512-VBlAiynj3VMLrotgwOS3OyECFxas5y7ltLcK4t41lMUZeaK15Ym4QRkqN0EQKAFL42q9i21EPKjzLUPfltR72A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-fetch-commonjs@3.3.2: dependencies: node-domexception: 1.0.0 web-streams-polyfill: 3.3.3 - /node-fetch@2.6.7: - resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + node-fetch@2.6.7: dependencies: whatwg-url: 5.0.0 - dev: true - /node-fetch@2.6.9: - resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + node-fetch@2.6.9: dependencies: whatwg-url: 5.0.0 - dev: true - /node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - /node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-fetch@3.3.2: dependencies: data-uri-to-buffer: 4.0.1 fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 - dev: true - /node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} + node-forge@1.3.1: {} - /node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} - hasBin: true - dev: true + node-gyp-build@4.8.1: {} - /node-gyp@8.4.1: - resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==} - engines: {node: '>= 10.12.0'} - hasBin: true + node-gyp@8.4.1: dependencies: env-paths: 2.2.1 glob: 7.2.3 @@ -18374,10 +25189,7 @@ packages: - bluebird - supports-color - /node-gyp@9.4.1: - resolution: {integrity: sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==} - engines: {node: ^12.13 || ^14.13 || >=16} - hasBin: true + node-gyp@9.4.1: dependencies: env-paths: 2.2.1 exponential-backoff: 3.1.1 @@ -18394,42 +25206,24 @@ packages: - bluebird - supports-color - /node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + node-int64@0.4.0: {} - /node-loader@2.0.0(webpack@5.93.0): - resolution: {integrity: sha512-I5VN34NO4/5UYJaUBtkrODPWxbobrE4hgDqPrjB25yPkonFhCmZ146vTH+Zg417E9Iwoh1l/MbRs1apc5J295Q==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^5.0.0 + node-loader@2.0.0(webpack@5.93.0): dependencies: loader-utils: 2.0.4 webpack: 5.93.0(webpack-cli@5.1.4) - dev: true - /node-postgres@0.6.2: - resolution: {integrity: sha512-wjaW+KutPOFemtBDuogyy6OMMOs2vpSOwuqbUhFUbrDEOTk66K2lmRyvOdO4t26qGtnPyZXQ4bAuF17cBhi5aQ==} - dev: true + node-postgres@0.6.2: {} - /node-releases@2.0.18: - resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + node-releases@2.0.18: {} - /node-sql-parser@4.18.0: - resolution: {integrity: sha512-2YEOR5qlI1zUFbGMLKNfsrR5JUvFg9LxIRVE+xJe962pfVLH0rnItqLzv96XVs1Y1UIR8FxsXAuvX/lYAWZ2BQ==} - engines: {node: '>=8'} + node-sql-parser@4.18.0: dependencies: big-integer: 1.6.52 - dev: false - /nodemailer@6.9.14: - resolution: {integrity: sha512-Dobp/ebDKBvz91sbtRKhcznLThrKxKt97GI2FAlAyy+fk19j73Uz3sBXolVtmcXjaorivqsbbbjDY+Jkt4/bQA==} - engines: {node: '>=6.0.0'} - dev: false + nodemailer@6.9.14: {} - /nodemon@3.1.4: - resolution: {integrity: sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==} - engines: {node: '>=10'} - hasBin: true + nodemon@3.1.4: dependencies: chokidar: 3.6.0 debug: 4.3.6(supports-color@5.5.0) @@ -18441,156 +25235,104 @@ packages: supports-color: 5.5.0 touch: 3.1.1 undefsafe: 2.0.5 - dev: true - /noop-logger@0.1.1: - resolution: {integrity: sha512-6kM8CLXvuW5crTxsAtva2YLrRrDaiTIkIePWs9moLHqbFWT94WpNFjwS/5dfLfECg5i/lkmw3aoqVidxt23TEQ==} - dev: false + noop-logger@0.1.1: {} - /nopt@5.0.0: - resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} - engines: {node: '>=6'} - hasBin: true + nopt@5.0.0: dependencies: abbrev: 1.1.1 - /nopt@6.0.0: - resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - hasBin: true + nopt@6.0.0: dependencies: abbrev: 1.1.1 - /nopt@7.2.1: - resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true + nopt@7.2.1: dependencies: abbrev: 2.0.0 - dev: false - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 resolve: 1.22.8 semver: 5.7.2 validate-npm-package-license: 3.0.4 - /normalize-package-data@5.0.0: - resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + normalize-package-data@5.0.0: dependencies: hosted-git-info: 6.1.1 is-core-module: 2.15.0 semver: 7.6.3 validate-npm-package-license: 3.0.4 - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + normalize-path@3.0.0: {} - /normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} + normalize-range@0.1.2: {} - /normalize-url@3.3.0: - resolution: {integrity: sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==} - engines: {node: '>=6'} - dev: true + normalize-url@3.3.0: {} - /normalize-url@6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} - dev: false + normalize-url@6.1.0: {} - /npm-bundled@1.1.2: - resolution: {integrity: sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==} + npm-bundled@1.1.2: dependencies: npm-normalize-package-bin: 1.0.1 - /npm-bundled@3.0.1: - resolution: {integrity: sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-bundled@3.0.1: dependencies: npm-normalize-package-bin: 3.0.1 - /npm-install-checks@4.0.0: - resolution: {integrity: sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==} - engines: {node: '>=10'} + npm-install-checks@4.0.0: dependencies: semver: 7.6.3 - /npm-install-checks@6.3.0: - resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-install-checks@6.3.0: dependencies: semver: 7.6.3 - /npm-normalize-package-bin@1.0.1: - resolution: {integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==} + npm-normalize-package-bin@1.0.1: {} - /npm-normalize-package-bin@2.0.0: - resolution: {integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + npm-normalize-package-bin@2.0.0: {} - /npm-normalize-package-bin@3.0.1: - resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-normalize-package-bin@3.0.1: {} - /npm-package-arg@10.1.0: - resolution: {integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-package-arg@10.1.0: dependencies: hosted-git-info: 6.1.1 proc-log: 3.0.0 semver: 7.6.3 validate-npm-package-name: 5.0.1 - /npm-package-arg@8.1.5: - resolution: {integrity: sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==} - engines: {node: '>=10'} + npm-package-arg@8.1.5: dependencies: hosted-git-info: 4.1.0 semver: 7.6.3 validate-npm-package-name: 3.0.0 - /npm-packlist@3.0.0: - resolution: {integrity: sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ==} - engines: {node: '>=10'} - hasBin: true + npm-packlist@3.0.0: dependencies: glob: 7.2.3 ignore-walk: 4.0.1 npm-bundled: 1.1.2 npm-normalize-package-bin: 1.0.1 - /npm-packlist@7.0.4: - resolution: {integrity: sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-packlist@7.0.4: dependencies: ignore-walk: 6.0.5 - /npm-pick-manifest@6.1.1: - resolution: {integrity: sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==} + npm-pick-manifest@6.1.1: dependencies: npm-install-checks: 4.0.0 npm-normalize-package-bin: 1.0.1 npm-package-arg: 8.1.5 semver: 7.6.3 - /npm-pick-manifest@8.0.2: - resolution: {integrity: sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-pick-manifest@8.0.2: dependencies: npm-install-checks: 6.3.0 npm-normalize-package-bin: 3.0.1 npm-package-arg: 10.1.0 semver: 7.6.3 - /npm-registry-fetch@12.0.2: - resolution: {integrity: sha512-Df5QT3RaJnXYuOwtXBXS9BWs+tHH2olvkCLh6jcR/b/u3DvPMlp3J0TvvYwplPKxHMOwfg287PYih9QqaVFoKA==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16} + npm-registry-fetch@12.0.2: dependencies: make-fetch-happen: 10.2.1 minipass: 3.3.6 @@ -18602,9 +25344,7 @@ packages: - bluebird - supports-color - /npm-registry-fetch@14.0.5: - resolution: {integrity: sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-registry-fetch@14.0.5: dependencies: make-fetch-happen: 11.1.1 minipass: 5.0.0 @@ -18616,133 +25356,87 @@ packages: transitivePeerDependencies: - supports-color - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - /npmlog@4.1.2: - resolution: {integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==} - deprecated: This package is no longer supported. + npmlog@4.1.2: dependencies: are-we-there-yet: 1.1.7 console-control-strings: 1.1.0 gauge: 2.7.4 set-blocking: 2.0.0 - dev: false - /npmlog@5.0.1: - resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} - deprecated: This package is no longer supported. + npmlog@5.0.1: dependencies: are-we-there-yet: 2.0.0 console-control-strings: 1.1.0 gauge: 3.0.2 set-blocking: 2.0.0 - /npmlog@6.0.2: - resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This package is no longer supported. + npmlog@6.0.2: dependencies: are-we-there-yet: 3.0.1 console-control-strings: 1.1.0 gauge: 4.0.4 set-blocking: 2.0.0 - /nth-check@1.0.2: - resolution: {integrity: sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==} + nth-check@1.0.2: dependencies: boolbase: 1.0.0 - /nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + nth-check@2.1.1: dependencies: boolbase: 1.0.0 - dev: false - /nub@0.0.0: - resolution: {integrity: sha512-dK0Ss9C34R/vV0FfYJXuqDAqHlaW9fvWVufq9MmGF2umCuDbd5GRfRD9fpi/LiM0l4ZXf8IBB+RYmZExqCrf0w==} - dev: false + nub@0.0.0: {} - /num2fraction@1.2.2: - resolution: {integrity: sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==} - dev: true + num2fraction@1.2.2: {} - /number-is-nan@1.0.1: - resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} - engines: {node: '>=0.10.0'} + number-is-nan@1.0.1: {} - /nwsapi@2.2.12: - resolution: {integrity: sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==} - dev: false + nwsapi@2.2.12: {} - /oauth@0.9.15: - resolution: {integrity: sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==} - dev: false + oauth@0.9.15: {} - /obj-case@0.2.1: - resolution: {integrity: sha512-PquYBBTy+Y6Ob/O2574XHhDtHJlV1cJHMCgW+rDRc9J5hhmRelJB3k5dTK/3cVmFVtzvAKuENeuLpoyTzMzkOg==} - dev: true + obj-case@0.2.1: {} - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + object-assign@4.1.1: {} - /object-hash@2.2.0: - resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} - engines: {node: '>= 6'} - dev: false + object-hash@2.2.0: {} - /object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} + object-hash@3.0.0: {} - /object-inspect@1.13.2: - resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} - engines: {node: '>= 0.4'} + object-inspect@1.13.2: {} - /object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} + object-is@1.1.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} + object-keys@1.1.1: {} - /object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} + object.assign@4.1.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 - /object.entries@1.1.8: - resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} - engines: {node: '>= 0.4'} + object.entries@1.1.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - /object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} + object.fromentries@2.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.0.0 - /object.getownpropertydescriptors@2.1.8: - resolution: {integrity: sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==} - engines: {node: '>= 0.8'} + object.getownpropertydescriptors@2.1.8: dependencies: array.prototype.reduce: 1.0.7 call-bind: 1.0.7 @@ -18752,79 +25446,54 @@ packages: gopd: 1.0.1 safe-array-concat: 1.1.2 - /object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} + object.groupby@1.0.3: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 - /object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} - engines: {node: '>= 0.4'} + object.values@1.2.0: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - /obuf@1.1.2: - resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + obuf@1.1.2: {} - /oidc-token-hash@5.0.3: - resolution: {integrity: sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==} - engines: {node: ^10.13.0 || >=12.0.0} - dev: false + oidc-token-hash@5.0.3: {} - /on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + on-finished@2.4.1: dependencies: ee-first: 1.1.1 - /on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} - dev: false + on-headers@1.0.2: {} - /once@1.3.3: - resolution: {integrity: sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==} + once@1.3.3: dependencies: wrappy: 1.0.2 - dev: true - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + once@1.4.0: dependencies: wrappy: 1.0.2 - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - /open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 is-docker: 2.2.1 is-wsl: 2.2.0 - dev: false - /openid-client@5.6.5: - resolution: {integrity: sha512-5P4qO9nGJzB5PI0LFlhj4Dzg3m4odt0qsJTfyEtZyOlkgpILwEioOhVVJOrS1iVH494S4Ee5OCjjg6Bf5WOj3w==} + openid-client@5.6.5: dependencies: jose: 4.15.9 lru-cache: 6.0.0 object-hash: 2.2.0 oidc-token-hash: 5.0.3 - dev: false - /optionator@0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} - engines: {node: '>= 0.8.0'} + optionator@0.8.3: dependencies: deep-is: 0.1.4 fast-levenshtein: 2.0.6 @@ -18832,11 +25501,8 @@ packages: prelude-ls: 1.1.2 type-check: 0.3.2 word-wrap: 1.2.5 - dev: false - /optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} + optionator@0.9.4: dependencies: deep-is: 0.1.4 fast-levenshtein: 2.0.6 @@ -18845,9 +25511,7 @@ packages: type-check: 0.4.0 word-wrap: 1.2.5 - /ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} + ora@5.4.1: dependencies: bl: 4.1.0 chalk: 4.1.2 @@ -18859,121 +25523,74 @@ packages: strip-ansi: 6.0.1 wcwidth: 1.0.1 - /os-paths@4.4.0: - resolution: {integrity: sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg==} - engines: {node: '>= 6.0'} - dev: true + os-paths@4.4.0: {} - /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} + os-tmpdir@1.0.2: {} - /p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} + p-finally@1.0.0: {} - /p-finally@2.0.1: - resolution: {integrity: sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==} - engines: {node: '>=8'} - dev: true + p-finally@2.0.1: {} - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + p-limit@2.3.0: dependencies: p-try: 2.2.0 - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - /p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-limit@4.0.0: dependencies: yocto-queue: 1.1.1 - dev: true - - /p-locate@3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} + + p-locate@3.0.0: dependencies: p-limit: 2.3.0 - dev: false - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + p-locate@4.1.0: dependencies: p-limit: 2.3.0 - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - /p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-locate@6.0.0: dependencies: p-limit: 4.0.0 - dev: true - /p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} - dev: true + p-map@2.1.0: {} - /p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} + p-map@4.0.0: dependencies: aggregate-error: 3.1.0 - /p-queue@6.6.2: - resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} - engines: {node: '>=8'} + p-queue@6.6.2: dependencies: eventemitter3: 4.0.7 p-timeout: 3.2.0 - /p-retry@4.6.2: - resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} - engines: {node: '>=8'} + p-retry@4.6.2: dependencies: '@types/retry': 0.12.0 retry: 0.13.1 - dev: false - /p-timeout@3.2.0: - resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} - engines: {node: '>=8'} + p-timeout@3.2.0: dependencies: p-finally: 1.0.0 - /p-transform@1.3.0: - resolution: {integrity: sha512-UJKdSzgd3KOnXXAtqN5+/eeHcvTn1hBkesEmElVgvO/NAYcxAvmjzIGmnNd3Tb/gRAvMBdNRFD4qAWdHxY6QXg==} - engines: {node: '>=12.10.0'} + p-transform@1.3.0: dependencies: debug: 4.3.6(supports-color@5.5.0) p-queue: 6.6.2 transitivePeerDependencies: - supports-color - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} + p-try@2.2.0: {} - /package-json-from-dist@1.0.0: - resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + package-json-from-dist@1.0.0: {} - /pacote@12.0.3: - resolution: {integrity: sha512-CdYEl03JDrRO3x18uHjBYA9TyoW8gy+ThVcypcDkxPtKlw76e4ejhYB6i9lJ+/cebbjpqPW/CijjqxwDTts8Ow==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16} - hasBin: true + pacote@12.0.3: dependencies: '@npmcli/git': 2.1.0 '@npmcli/installed-package-contents': 1.0.7 @@ -18998,10 +25615,7 @@ packages: - bluebird - supports-color - /pacote@15.2.0: - resolution: {integrity: sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true + pacote@15.2.0: dependencies: '@npmcli/git': 4.1.0 '@npmcli/installed-package-contents': 2.1.0 @@ -19025,240 +25639,139 @@ packages: - bluebird - supports-color - /param-case@2.1.1: - resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} + param-case@2.1.1: dependencies: no-case: 2.3.2 - dev: false - /param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + param-case@3.0.4: dependencies: dot-case: 3.0.4 tslib: 2.6.3 - dev: false - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + parent-module@1.0.1: dependencies: callsites: 3.1.0 - /parenthesis@3.1.8: - resolution: {integrity: sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw==} - dev: true + parenthesis@3.1.8: {} - /parse-conflict-json@2.0.2: - resolution: {integrity: sha512-jDbRGb00TAPFsKWCpZZOT93SxVP9nONOSgES3AevqRq/CHvavEBvKAjxX9p5Y5F0RZLxH9Ufd9+RwtCsa+lFDA==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + parse-conflict-json@2.0.2: dependencies: json-parse-even-better-errors: 2.3.1 just-diff: 5.2.0 just-diff-apply: 5.5.0 - /parse-duration@1.1.0: - resolution: {integrity: sha512-z6t9dvSJYaPoQq7quMzdEagSFtpGu+utzHqqxmpVWNNZRIXnvqyCvn9XsTdh7c/w0Bqmdz3RB3YnRaKtpRtEXQ==} - dev: false + parse-duration@1.1.0: {} - /parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} + parse-json@4.0.0: dependencies: error-ex: 1.3.2 json-parse-better-errors: 1.0.2 - dev: true - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.24.7 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - /parse-ms@2.1.0: - resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} - engines: {node: '>=6'} - dev: true + parse-ms@2.1.0: {} - /parse-node-version@1.0.1: - resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} - engines: {node: '>= 0.10'} - dev: true + parse-node-version@1.0.1: {} - /parse5-htmlparser2-tree-adapter@7.0.0: - resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + parse5-htmlparser2-tree-adapter@7.0.0: dependencies: domhandler: 5.0.3 parse5: 7.1.2 - dev: false - /parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - dev: false + parse5@6.0.1: {} - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + parse5@7.1.2: dependencies: entities: 4.5.0 - dev: false - /parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} + parseurl@1.3.3: {} - /pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + pascal-case@3.1.2: dependencies: no-case: 3.0.4 tslib: 2.6.3 - dev: false - /path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - dev: true + path-browserify@1.0.1: {} - /path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - dev: false + path-exists@3.0.0: {} - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + path-exists@4.0.0: {} - /path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + path-exists@5.0.0: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + path-is-absolute@1.0.1: {} - /path-is-inside@1.0.2: - resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} - dev: true + path-is-inside@1.0.2: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + path-key@3.1.1: {} - /path-match@1.2.4: - resolution: {integrity: sha512-UWlehEdqu36jmh4h5CWJ7tARp1OEVKGHKm6+dg9qMq5RKUTV5WJrGgaZ3dN2m7WFAXDbjlHzvJvL/IUpy84Ktw==} + path-match@1.2.4: dependencies: http-errors: 1.4.0 path-to-regexp: 1.8.0 - dev: true - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-parse@1.0.7: {} - /path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} + path-scurry@1.11.1: dependencies: lru-cache: 10.4.3 minipass: 7.1.2 - /path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + path-to-regexp@0.1.7: {} - /path-to-regexp@1.8.0: - resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} + path-to-regexp@1.8.0: dependencies: isarray: 0.0.1 - dev: true - /path-to-regexp@6.1.0: - resolution: {integrity: sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==} - dev: true + path-to-regexp@6.1.0: {} - /path-to-regexp@6.2.1: - resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} - dev: true + path-to-regexp@6.2.1: {} - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + path-type@4.0.0: {} - /path-type@5.0.0: - resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} - engines: {node: '>=12'} - dev: true + path-type@5.0.0: {} - /pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - dev: true + pend@1.2.0: {} - /performance-now@2.1.0: - resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - dev: false + performance-now@2.1.0: {} - /pg-cloudflare@1.1.1: - resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} - requiresBuild: true + pg-cloudflare@1.1.1: optional: true - /pg-connection-string@2.6.4: - resolution: {integrity: sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==} + pg-connection-string@2.6.4: {} - /pg-cursor@2.10.6(pg@8.11.6): - resolution: {integrity: sha512-yxQGjy1GJl6BROtA4mq62Xd2izqhoGco6NYUgKXY9GMBKXfh7tGSGOhIy5K2ULerqOlJ4+3EKKj4Fog0OEKCyA==} - peerDependencies: - pg: ^8 + pg-cursor@2.10.6(pg@8.11.6): dependencies: pg: 8.11.6 - dev: false - /pg-cursor@2.11.0(pg@8.11.6): - resolution: {integrity: sha512-TLCOCtu+rqMarzjUi+/Ffc2DV5ZqO/27y5GqnK9Z3w51rWXMwC8FcO96Uf9/ORo5o+qRXEVJxM9Ts3K2K31MLg==} - peerDependencies: - pg: ^8 + pg-cursor@2.11.0(pg@8.11.6): dependencies: pg: 8.11.6 - dev: true - /pg-cursor@2.11.0(pg@8.12.0): - resolution: {integrity: sha512-TLCOCtu+rqMarzjUi+/Ffc2DV5ZqO/27y5GqnK9Z3w51rWXMwC8FcO96Uf9/ORo5o+qRXEVJxM9Ts3K2K31MLg==} - peerDependencies: - pg: ^8 + pg-cursor@2.11.0(pg@8.12.0): dependencies: pg: 8.12.0 - dev: false - /pg-int8@1.0.1: - resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} - engines: {node: '>=4.0.0'} + pg-int8@1.0.1: {} - /pg-minify@1.6.5: - resolution: {integrity: sha512-u0UE8veaCnMfJmoklqneeBBopOAPG3/6DHqGVHYAhz8DkJXh9dnjPlz25fRxn4e+6XVzdOp7kau63Rp52fZ3WQ==} - engines: {node: '>=14.0.0'} - dev: false + pg-minify@1.6.5: {} - /pg-numeric@1.0.2: - resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==} - engines: {node: '>=4'} + pg-numeric@1.0.2: {} - /pg-pool@3.6.2(pg@8.11.6): - resolution: {integrity: sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==} - peerDependencies: - pg: '>=8.0' + pg-pool@3.6.2(pg@8.11.6): dependencies: pg: 8.11.6 - /pg-pool@3.6.2(pg@8.12.0): - resolution: {integrity: sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==} - peerDependencies: - pg: '>=8.0' + pg-pool@3.6.2(pg@8.12.0): dependencies: pg: 8.12.0 - dev: false - /pg-promise@11.9.1: - resolution: {integrity: sha512-qvMmyDvWd64X0a25hCuWV40GLMbgeYf4z7ZmzxQqGHtUIlzMtxcMtaBHAMr7XVOL62wFv2ZVKW5pFruD/4ZAOg==} - engines: {node: '>=14.0'} + pg-promise@11.9.1: dependencies: assert-options: 0.8.1 pg: 8.12.0 @@ -19266,23 +25779,15 @@ packages: spex: 3.3.0 transitivePeerDependencies: - pg-native - dev: false - /pg-protocol@1.6.1: - resolution: {integrity: sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==} + pg-protocol@1.6.1: {} - /pg-query-stream@4.6.0(pg@8.11.6): - resolution: {integrity: sha512-sg2Hewe6ge6osEY07zGu7Z8djrsQBvyiTy5ZjQffoSatEgnNNVsV3EWDm9Px/8R9oaAL1YnfnP8AXPMmfzujZg==} - peerDependencies: - pg: ^8 + pg-query-stream@4.6.0(pg@8.11.6): dependencies: pg: 8.11.6 pg-cursor: 2.11.0(pg@8.11.6) - dev: true - /pg-types@2.2.0: - resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} - engines: {node: '>=4'} + pg-types@2.2.0: dependencies: pg-int8: 1.0.1 postgres-array: 2.0.0 @@ -19290,9 +25795,7 @@ packages: postgres-date: 1.0.7 postgres-interval: 1.2.0 - /pg-types@4.0.2: - resolution: {integrity: sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==} - engines: {node: '>=10'} + pg-types@4.0.2: dependencies: pg-int8: 1.0.1 pg-numeric: 1.0.2 @@ -19302,14 +25805,7 @@ packages: postgres-interval: 3.0.0 postgres-range: 1.1.4 - /pg@8.11.6: - resolution: {integrity: sha512-6CyL4F0j3vPmakU9rWdeRY8qF5Cjc3OE86y6YpgDI6YtKHhNyCjGEIE8U5ZRfBjKTZikwolKIFWh3I22MeRnoA==} - engines: {node: '>= 8.0.0'} - peerDependencies: - pg-native: '>=3.0.1' - peerDependenciesMeta: - pg-native: - optional: true + pg@8.11.6: dependencies: pg-connection-string: 2.6.4 pg-pool: 3.6.2(pg@8.11.6) @@ -19319,14 +25815,7 @@ packages: optionalDependencies: pg-cloudflare: 1.1.1 - /pg@8.12.0: - resolution: {integrity: sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==} - engines: {node: '>= 8.0.0'} - peerDependencies: - pg-native: '>=3.0.1' - peerDependenciesMeta: - pg-native: - optional: true + pg@8.12.0: dependencies: pg-connection-string: 2.6.4 pg-pool: 3.6.2(pg@8.12.0) @@ -19335,516 +25824,278 @@ packages: pgpass: 1.0.5 optionalDependencies: pg-cloudflare: 1.1.1 - dev: false - /pgpass@1.0.5: - resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} + pgpass@1.0.5: dependencies: split2: 4.2.0 - /picocolors@0.2.1: - resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} + picocolors@0.2.1: {} - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true + picocolors@1.0.0: {} - /picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + picocolors@1.0.1: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + picomatch@2.3.1: {} - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} + pify@2.3.0: {} - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} + pify@4.0.1: {} - /pify@5.0.0: - resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} - engines: {node: '>=10'} - dev: true + pify@5.0.0: {} - /pinkie-promise@2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} + pinkie-promise@2.0.1: dependencies: pinkie: 2.0.4 - dev: true - /pinkie@2.0.4: - resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} - engines: {node: '>=0.10.0'} - dev: true + pinkie@2.0.4: {} - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} + pirates@4.0.6: {} - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 - /pkg-dir@7.0.0: - resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} - engines: {node: '>=14.16'} + pkg-dir@7.0.0: dependencies: find-up: 6.3.0 - dev: true - /pkg-up@3.1.0: - resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} - engines: {node: '>=8'} + pkg-up@3.1.0: dependencies: find-up: 3.0.0 - dev: false - /playwright-core@1.39.0: - resolution: {integrity: sha512-+k4pdZgs1qiM+OUkSjx96YiKsXsmb59evFoqv8SKO067qBA+Z2s/dCzJij/ZhdQcs2zlTAgRKfeiiLm8PQ2qvw==} - engines: {node: '>=16'} - hasBin: true + playwright-core@1.39.0: {} - /playwright@1.39.0: - resolution: {integrity: sha512-naE5QT11uC/Oiq0BwZ50gDmy8c8WLPRTEWuSSFVG2egBka/1qMoSqYQcROMT9zLwJ86oPofcTH2jBY/5wWOgIw==} - engines: {node: '>=16'} - hasBin: true + playwright@1.39.0: dependencies: playwright-core: 1.39.0 optionalDependencies: fsevents: 2.3.2 - /possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} + possible-typed-array-names@1.0.0: {} - /postcss-attribute-case-insensitive@5.0.2(postcss@8.4.40): - resolution: {integrity: sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 + postcss-attribute-case-insensitive@5.0.2(postcss@8.4.40): dependencies: postcss: 8.4.40 postcss-selector-parser: 6.1.1 - dev: false - /postcss-browser-comments@4.0.0(browserslist@4.23.2)(postcss@8.4.40): - resolution: {integrity: sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==} - engines: {node: '>=8'} - peerDependencies: - browserslist: '>=4' - postcss: '>=8' + postcss-browser-comments@4.0.0(browserslist@4.23.2)(postcss@8.4.40): dependencies: browserslist: 4.23.2 postcss: 8.4.40 - dev: false - /postcss-calc@7.0.5: - resolution: {integrity: sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==} + postcss-calc@7.0.5: dependencies: postcss: 7.0.39 postcss-selector-parser: 6.1.1 postcss-value-parser: 4.2.0 - dev: true - /postcss-calc@8.2.4(postcss@8.4.41): - resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} - peerDependencies: - postcss: ^8.2.2 + postcss-calc@8.2.4(postcss@8.4.41): dependencies: postcss: 8.4.41 postcss-selector-parser: 6.1.1 postcss-value-parser: 4.2.0 - dev: false - /postcss-clamp@4.1.0(postcss@8.4.40): - resolution: {integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==} - engines: {node: '>=7.6.0'} - peerDependencies: - postcss: ^8.4.6 + postcss-clamp@4.1.0(postcss@8.4.40): dependencies: postcss: 8.4.40 postcss-value-parser: 4.2.0 - dev: false - /postcss-color-functional-notation@4.2.4(postcss@8.4.40): - resolution: {integrity: sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 + postcss-color-functional-notation@4.2.4(postcss@8.4.40): dependencies: postcss: 8.4.40 postcss-value-parser: 4.2.0 - dev: false - /postcss-color-hex-alpha@8.0.4(postcss@8.4.40): - resolution: {integrity: sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.4 + postcss-color-hex-alpha@8.0.4(postcss@8.4.40): dependencies: postcss: 8.4.40 postcss-value-parser: 4.2.0 - dev: false - /postcss-color-rebeccapurple@7.1.1(postcss@8.4.40): - resolution: {integrity: sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 + postcss-color-rebeccapurple@7.1.1(postcss@8.4.40): dependencies: postcss: 8.4.40 postcss-value-parser: 4.2.0 - dev: false - /postcss-colormin@4.0.3: - resolution: {integrity: sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==} - engines: {node: '>=6.9.0'} + postcss-colormin@4.0.3: dependencies: browserslist: 4.23.2 color: 3.2.1 has: 1.0.4 postcss: 7.0.39 postcss-value-parser: 3.3.1 - dev: true - /postcss-colormin@5.3.1(postcss@8.4.41): - resolution: {integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-colormin@5.3.1(postcss@8.4.41): dependencies: browserslist: 4.23.2 caniuse-api: 3.0.0 colord: 2.9.3 postcss: 8.4.41 postcss-value-parser: 4.2.0 - dev: false - /postcss-convert-values@4.0.1: - resolution: {integrity: sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==} - engines: {node: '>=6.9.0'} + postcss-convert-values@4.0.1: dependencies: postcss: 7.0.39 postcss-value-parser: 3.3.1 - dev: true - /postcss-convert-values@5.1.3(postcss@8.4.41): - resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-convert-values@5.1.3(postcss@8.4.41): dependencies: browserslist: 4.23.2 postcss: 8.4.41 postcss-value-parser: 4.2.0 - dev: false - /postcss-custom-media@8.0.2(postcss@8.4.40): - resolution: {integrity: sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.3 + postcss-custom-media@8.0.2(postcss@8.4.40): dependencies: postcss: 8.4.40 postcss-value-parser: 4.2.0 - dev: false - /postcss-custom-properties@12.1.11(postcss@8.4.40): - resolution: {integrity: sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 + postcss-custom-properties@12.1.11(postcss@8.4.40): dependencies: postcss: 8.4.40 postcss-value-parser: 4.2.0 - dev: false - /postcss-custom-selectors@6.0.3(postcss@8.4.40): - resolution: {integrity: sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.3 + postcss-custom-selectors@6.0.3(postcss@8.4.40): dependencies: postcss: 8.4.40 postcss-selector-parser: 6.1.1 - dev: false - /postcss-dir-pseudo-class@6.0.5(postcss@8.4.40): - resolution: {integrity: sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 + postcss-dir-pseudo-class@6.0.5(postcss@8.4.40): dependencies: postcss: 8.4.40 postcss-selector-parser: 6.1.1 - dev: false - /postcss-discard-comments@4.0.2: - resolution: {integrity: sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==} - engines: {node: '>=6.9.0'} + postcss-discard-comments@4.0.2: dependencies: postcss: 7.0.39 - dev: true - /postcss-discard-comments@5.1.2(postcss@8.4.41): - resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-discard-comments@5.1.2(postcss@8.4.41): dependencies: postcss: 8.4.41 - dev: false - /postcss-discard-duplicates@4.0.2: - resolution: {integrity: sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==} - engines: {node: '>=6.9.0'} + postcss-discard-duplicates@4.0.2: dependencies: postcss: 7.0.39 - dev: true - /postcss-discard-duplicates@5.1.0(postcss@8.4.41): - resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-discard-duplicates@5.1.0(postcss@8.4.41): dependencies: postcss: 8.4.41 - dev: false - /postcss-discard-empty@4.0.1: - resolution: {integrity: sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==} - engines: {node: '>=6.9.0'} + postcss-discard-empty@4.0.1: dependencies: postcss: 7.0.39 - dev: true - /postcss-discard-empty@5.1.1(postcss@8.4.41): - resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-discard-empty@5.1.1(postcss@8.4.41): dependencies: postcss: 8.4.41 - dev: false - /postcss-discard-overridden@4.0.1: - resolution: {integrity: sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==} - engines: {node: '>=6.9.0'} + postcss-discard-overridden@4.0.1: dependencies: postcss: 7.0.39 - dev: true - /postcss-discard-overridden@5.1.0(postcss@8.4.41): - resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-discard-overridden@5.1.0(postcss@8.4.41): dependencies: postcss: 8.4.41 - dev: false - /postcss-double-position-gradients@3.1.2(postcss@8.4.40): - resolution: {integrity: sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 + postcss-double-position-gradients@3.1.2(postcss@8.4.40): dependencies: '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.40) postcss: 8.4.40 postcss-value-parser: 4.2.0 - dev: false - /postcss-env-function@4.0.6(postcss@8.4.40): - resolution: {integrity: sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.4 + postcss-env-function@4.0.6(postcss@8.4.40): dependencies: postcss: 8.4.40 postcss-value-parser: 4.2.0 - dev: false - /postcss-flexbugs-fixes@5.0.2(postcss@8.4.40): - resolution: {integrity: sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==} - peerDependencies: - postcss: ^8.1.4 + postcss-flexbugs-fixes@5.0.2(postcss@8.4.40): dependencies: postcss: 8.4.40 - dev: false - /postcss-focus-visible@6.0.4(postcss@8.4.40): - resolution: {integrity: sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.4 + postcss-focus-visible@6.0.4(postcss@8.4.40): dependencies: postcss: 8.4.40 postcss-selector-parser: 6.1.1 - dev: false - - /postcss-focus-within@5.0.4(postcss@8.4.40): - resolution: {integrity: sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.4 + + postcss-focus-within@5.0.4(postcss@8.4.40): dependencies: postcss: 8.4.40 postcss-selector-parser: 6.1.1 - dev: false - /postcss-font-variant@5.0.0(postcss@8.4.40): - resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==} - peerDependencies: - postcss: ^8.1.0 + postcss-font-variant@5.0.0(postcss@8.4.40): dependencies: postcss: 8.4.40 - dev: false - /postcss-gap-properties@3.0.5(postcss@8.4.40): - resolution: {integrity: sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 + postcss-gap-properties@3.0.5(postcss@8.4.40): dependencies: postcss: 8.4.40 - dev: false - /postcss-image-set-function@4.0.7(postcss@8.4.40): - resolution: {integrity: sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 + postcss-image-set-function@4.0.7(postcss@8.4.40): dependencies: postcss: 8.4.40 postcss-value-parser: 4.2.0 - dev: false - /postcss-import@15.1.0(postcss@8.4.40): - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} - peerDependencies: - postcss: ^8.0.0 + postcss-import@15.1.0(postcss@8.4.40): dependencies: postcss: 8.4.40 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - /postcss-initial@4.0.1(postcss@8.4.40): - resolution: {integrity: sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==} - peerDependencies: - postcss: ^8.0.0 + postcss-initial@4.0.1(postcss@8.4.40): dependencies: postcss: 8.4.40 - dev: false - /postcss-js@4.0.1(postcss@8.4.40): - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 + postcss-js@4.0.1(postcss@8.4.40): dependencies: camelcase-css: 2.0.1 postcss: 8.4.40 - /postcss-lab-function@4.2.1(postcss@8.4.40): - resolution: {integrity: sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 + postcss-lab-function@4.2.1(postcss@8.4.40): dependencies: '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.40) postcss: 8.4.40 postcss-value-parser: 4.2.0 - dev: false - /postcss-load-config@2.1.2: - resolution: {integrity: sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==} - engines: {node: '>= 4'} + postcss-load-config@2.1.2: dependencies: cosmiconfig: 5.2.1 import-cwd: 2.1.0 - dev: true - /postcss-load-config@4.0.2(postcss@8.4.40)(ts-node@10.9.2): - resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} - engines: {node: '>= 14'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true + postcss-load-config@4.0.2(postcss@8.4.40)(ts-node@10.9.2): dependencies: lilconfig: 3.1.2 postcss: 8.4.40 ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) yaml: 2.5.0 - /postcss-loader@6.2.1(postcss@8.4.40)(webpack@5.93.0): - resolution: {integrity: sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==} - engines: {node: '>= 12.13.0'} - peerDependencies: - postcss: ^7.0.0 || ^8.0.1 - webpack: ^5.0.0 + postcss-loader@6.2.1(postcss@8.4.40)(webpack@5.93.0): dependencies: cosmiconfig: 7.1.0 klona: 2.0.6 postcss: 8.4.40 semver: 7.6.3 webpack: 5.93.0(webpack-cli@5.1.4) - dev: false - /postcss-logical@5.0.4(postcss@8.4.40): - resolution: {integrity: sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.4 + postcss-logical@5.0.4(postcss@8.4.40): dependencies: postcss: 8.4.40 - dev: false - /postcss-media-minmax@5.0.0(postcss@8.4.40): - resolution: {integrity: sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - postcss: ^8.1.0 + postcss-media-minmax@5.0.0(postcss@8.4.40): dependencies: postcss: 8.4.40 - dev: false - /postcss-merge-longhand@4.0.11: - resolution: {integrity: sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==} - engines: {node: '>=6.9.0'} + postcss-merge-longhand@4.0.11: dependencies: css-color-names: 0.0.4 postcss: 7.0.39 postcss-value-parser: 3.3.1 stylehacks: 4.0.3 - dev: true - /postcss-merge-longhand@5.1.7(postcss@8.4.41): - resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-merge-longhand@5.1.7(postcss@8.4.41): dependencies: postcss: 8.4.41 postcss-value-parser: 4.2.0 stylehacks: 5.1.1(postcss@8.4.41) - dev: false - /postcss-merge-rules@4.0.3: - resolution: {integrity: sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==} - engines: {node: '>=6.9.0'} + postcss-merge-rules@4.0.3: dependencies: browserslist: 4.23.2 caniuse-api: 3.0.0 @@ -19852,64 +26103,40 @@ packages: postcss: 7.0.39 postcss-selector-parser: 3.1.2 vendors: 1.0.4 - dev: true - /postcss-merge-rules@5.1.4(postcss@8.4.41): - resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-merge-rules@5.1.4(postcss@8.4.41): dependencies: browserslist: 4.23.2 caniuse-api: 3.0.0 cssnano-utils: 3.1.0(postcss@8.4.41) postcss: 8.4.41 postcss-selector-parser: 6.1.1 - dev: false - /postcss-minify-font-values@4.0.2: - resolution: {integrity: sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==} - engines: {node: '>=6.9.0'} + postcss-minify-font-values@4.0.2: dependencies: postcss: 7.0.39 postcss-value-parser: 3.3.1 - dev: true - /postcss-minify-font-values@5.1.0(postcss@8.4.41): - resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-minify-font-values@5.1.0(postcss@8.4.41): dependencies: postcss: 8.4.41 postcss-value-parser: 4.2.0 - dev: false - /postcss-minify-gradients@4.0.2: - resolution: {integrity: sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==} - engines: {node: '>=6.9.0'} + postcss-minify-gradients@4.0.2: dependencies: cssnano-util-get-arguments: 4.0.0 is-color-stop: 1.1.0 postcss: 7.0.39 postcss-value-parser: 3.3.1 - dev: true - /postcss-minify-gradients@5.1.1(postcss@8.4.41): - resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-minify-gradients@5.1.1(postcss@8.4.41): dependencies: colord: 2.9.3 cssnano-utils: 3.1.0(postcss@8.4.41) postcss: 8.4.41 postcss-value-parser: 4.2.0 - dev: false - /postcss-minify-params@4.0.2: - resolution: {integrity: sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==} - engines: {node: '>=6.9.0'} + postcss-minify-params@4.0.2: dependencies: alphanum-sort: 1.0.2 browserslist: 4.23.2 @@ -19917,386 +26144,224 @@ packages: postcss: 7.0.39 postcss-value-parser: 3.3.1 uniqs: 2.0.0 - dev: true - /postcss-minify-params@5.1.4(postcss@8.4.41): - resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-minify-params@5.1.4(postcss@8.4.41): dependencies: browserslist: 4.23.2 cssnano-utils: 3.1.0(postcss@8.4.41) postcss: 8.4.41 postcss-value-parser: 4.2.0 - dev: false - /postcss-minify-selectors@4.0.2: - resolution: {integrity: sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==} - engines: {node: '>=6.9.0'} + postcss-minify-selectors@4.0.2: dependencies: alphanum-sort: 1.0.2 has: 1.0.4 postcss: 7.0.39 postcss-selector-parser: 3.1.2 - dev: true - /postcss-minify-selectors@5.2.1(postcss@8.4.41): - resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-minify-selectors@5.2.1(postcss@8.4.41): dependencies: postcss: 8.4.41 postcss-selector-parser: 6.1.1 - dev: false - /postcss-modules-extract-imports@1.1.0: - resolution: {integrity: sha512-zF9+UIEvtpeqMGxhpeT9XaIevQSrBBCz9fi7SwfkmjVacsSj8DY5eFVgn+wY8I9vvdDDwK5xC8Myq4UkoLFIkA==} + postcss-modules-extract-imports@1.1.0: dependencies: postcss: 6.0.1 - dev: true - /postcss-modules-extract-imports@3.1.0(postcss@8.4.41): - resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 + postcss-modules-extract-imports@3.1.0(postcss@8.4.41): dependencies: postcss: 8.4.41 - dev: false - /postcss-modules-local-by-default@1.2.0: - resolution: {integrity: sha512-X4cquUPIaAd86raVrBwO8fwRfkIdbwFu7CTfEOjiZQHVQwlHRSkTgH5NLDmMm5+1hQO8u6dZ+TOOJDbay1hYpA==} + postcss-modules-local-by-default@1.2.0: dependencies: css-selector-tokenizer: 0.7.3 postcss: 6.0.1 - dev: true - /postcss-modules-local-by-default@4.0.5(postcss@8.4.41): - resolution: {integrity: sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 + postcss-modules-local-by-default@4.0.5(postcss@8.4.41): dependencies: icss-utils: 5.1.0(postcss@8.4.41) postcss: 8.4.41 postcss-selector-parser: 6.1.1 postcss-value-parser: 4.2.0 - dev: false - /postcss-modules-scope@1.1.0: - resolution: {integrity: sha512-LTYwnA4C1He1BKZXIx1CYiHixdSe9LWYVKadq9lK5aCCMkoOkFyZ7aigt+srfjlRplJY3gIol6KUNefdMQJdlw==} + postcss-modules-scope@1.1.0: dependencies: css-selector-tokenizer: 0.7.3 postcss: 6.0.1 - dev: true - /postcss-modules-scope@3.2.0(postcss@8.4.41): - resolution: {integrity: sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 + postcss-modules-scope@3.2.0(postcss@8.4.41): dependencies: postcss: 8.4.41 postcss-selector-parser: 6.1.1 - dev: false - /postcss-modules-values@1.3.0: - resolution: {integrity: sha512-i7IFaR9hlQ6/0UgFuqM6YWaCfA1Ej8WMg8A5DggnH1UGKJvTV/ugqq/KaULixzzOi3T/tF6ClBXcHGCzdd5unA==} + postcss-modules-values@1.3.0: dependencies: icss-replace-symbols: 1.1.0 postcss: 6.0.1 - dev: true - /postcss-modules-values@4.0.0(postcss@8.4.41): - resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 + postcss-modules-values@4.0.0(postcss@8.4.41): dependencies: icss-utils: 5.1.0(postcss@8.4.41) postcss: 8.4.41 - dev: false - /postcss-modules@2.0.0: - resolution: {integrity: sha512-eqp+Bva+U2cwQO7dECJ8/V+X+uH1HduNeITB0CPPFAu6d/8LKQ32/j+p9rQ2YL1QytVcrNU0X+fBqgGmQIA1Rw==} + postcss-modules@2.0.0: dependencies: css-modules-loader-core: 1.1.0 generic-names: 2.0.1 lodash.camelcase: 4.3.0 postcss: 7.0.39 string-hash: 1.1.3 - dev: true - /postcss-nested@6.2.0(postcss@8.4.40): - resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 + postcss-nested@6.2.0(postcss@8.4.40): dependencies: postcss: 8.4.40 postcss-selector-parser: 6.1.1 - /postcss-nesting@10.2.0(postcss@8.4.40): - resolution: {integrity: sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 + postcss-nesting@10.2.0(postcss@8.4.40): dependencies: '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.1) postcss: 8.4.40 postcss-selector-parser: 6.1.1 - dev: false - /postcss-normalize-charset@4.0.1: - resolution: {integrity: sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==} - engines: {node: '>=6.9.0'} + postcss-normalize-charset@4.0.1: dependencies: postcss: 7.0.39 - dev: true - /postcss-normalize-charset@5.1.0(postcss@8.4.41): - resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-normalize-charset@5.1.0(postcss@8.4.41): dependencies: postcss: 8.4.41 - dev: false - /postcss-normalize-display-values@4.0.2: - resolution: {integrity: sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==} - engines: {node: '>=6.9.0'} + postcss-normalize-display-values@4.0.2: dependencies: cssnano-util-get-match: 4.0.0 postcss: 7.0.39 postcss-value-parser: 3.3.1 - dev: true - /postcss-normalize-display-values@5.1.0(postcss@8.4.41): - resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-normalize-display-values@5.1.0(postcss@8.4.41): dependencies: postcss: 8.4.41 postcss-value-parser: 4.2.0 - dev: false - /postcss-normalize-positions@4.0.2: - resolution: {integrity: sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==} - engines: {node: '>=6.9.0'} + postcss-normalize-positions@4.0.2: dependencies: cssnano-util-get-arguments: 4.0.0 has: 1.0.4 postcss: 7.0.39 postcss-value-parser: 3.3.1 - dev: true - /postcss-normalize-positions@5.1.1(postcss@8.4.41): - resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-normalize-positions@5.1.1(postcss@8.4.41): dependencies: postcss: 8.4.41 postcss-value-parser: 4.2.0 - dev: false - /postcss-normalize-repeat-style@4.0.2: - resolution: {integrity: sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==} - engines: {node: '>=6.9.0'} + postcss-normalize-repeat-style@4.0.2: dependencies: cssnano-util-get-arguments: 4.0.0 cssnano-util-get-match: 4.0.0 postcss: 7.0.39 postcss-value-parser: 3.3.1 - dev: true - /postcss-normalize-repeat-style@5.1.1(postcss@8.4.41): - resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-normalize-repeat-style@5.1.1(postcss@8.4.41): dependencies: postcss: 8.4.41 postcss-value-parser: 4.2.0 - dev: false - /postcss-normalize-string@4.0.2: - resolution: {integrity: sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==} - engines: {node: '>=6.9.0'} + postcss-normalize-string@4.0.2: dependencies: has: 1.0.4 postcss: 7.0.39 postcss-value-parser: 3.3.1 - dev: true - /postcss-normalize-string@5.1.0(postcss@8.4.41): - resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-normalize-string@5.1.0(postcss@8.4.41): dependencies: postcss: 8.4.41 postcss-value-parser: 4.2.0 - dev: false - /postcss-normalize-timing-functions@4.0.2: - resolution: {integrity: sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==} - engines: {node: '>=6.9.0'} + postcss-normalize-timing-functions@4.0.2: dependencies: cssnano-util-get-match: 4.0.0 postcss: 7.0.39 postcss-value-parser: 3.3.1 - dev: true - /postcss-normalize-timing-functions@5.1.0(postcss@8.4.41): - resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-normalize-timing-functions@5.1.0(postcss@8.4.41): dependencies: postcss: 8.4.41 postcss-value-parser: 4.2.0 - dev: false - /postcss-normalize-unicode@4.0.1: - resolution: {integrity: sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==} - engines: {node: '>=6.9.0'} + postcss-normalize-unicode@4.0.1: dependencies: browserslist: 4.23.2 postcss: 7.0.39 postcss-value-parser: 3.3.1 - dev: true - /postcss-normalize-unicode@5.1.1(postcss@8.4.41): - resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-normalize-unicode@5.1.1(postcss@8.4.41): dependencies: browserslist: 4.23.2 postcss: 8.4.41 postcss-value-parser: 4.2.0 - dev: false - /postcss-normalize-url@4.0.1: - resolution: {integrity: sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==} - engines: {node: '>=6.9.0'} + postcss-normalize-url@4.0.1: dependencies: is-absolute-url: 2.1.0 normalize-url: 3.3.0 postcss: 7.0.39 postcss-value-parser: 3.3.1 - dev: true - /postcss-normalize-url@5.1.0(postcss@8.4.41): - resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-normalize-url@5.1.0(postcss@8.4.41): dependencies: normalize-url: 6.1.0 postcss: 8.4.41 postcss-value-parser: 4.2.0 - dev: false - /postcss-normalize-whitespace@4.0.2: - resolution: {integrity: sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==} - engines: {node: '>=6.9.0'} + postcss-normalize-whitespace@4.0.2: dependencies: postcss: 7.0.39 postcss-value-parser: 3.3.1 - dev: true - /postcss-normalize-whitespace@5.1.1(postcss@8.4.41): - resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-normalize-whitespace@5.1.1(postcss@8.4.41): dependencies: postcss: 8.4.41 postcss-value-parser: 4.2.0 - dev: false - /postcss-normalize@10.0.1(browserslist@4.23.2)(postcss@8.4.40): - resolution: {integrity: sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==} - engines: {node: '>= 12'} - peerDependencies: - browserslist: '>= 4' - postcss: '>= 8' + postcss-normalize@10.0.1(browserslist@4.23.2)(postcss@8.4.40): dependencies: '@csstools/normalize.css': 12.1.1 browserslist: 4.23.2 postcss: 8.4.40 postcss-browser-comments: 4.0.0(browserslist@4.23.2)(postcss@8.4.40) sanitize.css: 13.0.0 - dev: false - /postcss-opacity-percentage@1.1.3(postcss@8.4.40): - resolution: {integrity: sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 + postcss-opacity-percentage@1.1.3(postcss@8.4.40): dependencies: postcss: 8.4.40 - dev: false - /postcss-ordered-values@4.1.2: - resolution: {integrity: sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==} - engines: {node: '>=6.9.0'} + postcss-ordered-values@4.1.2: dependencies: cssnano-util-get-arguments: 4.0.0 postcss: 7.0.39 postcss-value-parser: 3.3.1 - dev: true - /postcss-ordered-values@5.1.3(postcss@8.4.41): - resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-ordered-values@5.1.3(postcss@8.4.41): dependencies: cssnano-utils: 3.1.0(postcss@8.4.41) postcss: 8.4.41 postcss-value-parser: 4.2.0 - dev: false - /postcss-overflow-shorthand@3.0.4(postcss@8.4.40): - resolution: {integrity: sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 + postcss-overflow-shorthand@3.0.4(postcss@8.4.40): dependencies: postcss: 8.4.40 postcss-value-parser: 4.2.0 - dev: false - /postcss-page-break@3.0.4(postcss@8.4.40): - resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==} - peerDependencies: - postcss: ^8 + postcss-page-break@3.0.4(postcss@8.4.40): dependencies: postcss: 8.4.40 - dev: false - /postcss-place@7.0.5(postcss@8.4.40): - resolution: {integrity: sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 + postcss-place@7.0.5(postcss@8.4.40): dependencies: postcss: 8.4.40 postcss-value-parser: 4.2.0 - dev: false - /postcss-preset-env@7.8.3(postcss@8.4.40): - resolution: {integrity: sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 + postcss-preset-env@7.8.3(postcss@8.4.40): dependencies: '@csstools/postcss-cascade-layers': 1.1.1(postcss@8.4.40) '@csstools/postcss-color-function': 1.1.1(postcss@8.4.40) @@ -20348,254 +26413,155 @@ packages: postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.40) postcss-selector-not: 6.0.1(postcss@8.4.40) postcss-value-parser: 4.2.0 - dev: false - /postcss-pseudo-class-any-link@7.1.6(postcss@8.4.40): - resolution: {integrity: sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 + postcss-pseudo-class-any-link@7.1.6(postcss@8.4.40): dependencies: postcss: 8.4.40 postcss-selector-parser: 6.1.1 - dev: false - /postcss-reduce-initial@4.0.3: - resolution: {integrity: sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==} - engines: {node: '>=6.9.0'} + postcss-reduce-initial@4.0.3: dependencies: browserslist: 4.23.2 caniuse-api: 3.0.0 has: 1.0.4 postcss: 7.0.39 - dev: true - /postcss-reduce-initial@5.1.2(postcss@8.4.41): - resolution: {integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-reduce-initial@5.1.2(postcss@8.4.41): dependencies: browserslist: 4.23.2 caniuse-api: 3.0.0 postcss: 8.4.41 - dev: false - /postcss-reduce-transforms@4.0.2: - resolution: {integrity: sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==} - engines: {node: '>=6.9.0'} + postcss-reduce-transforms@4.0.2: dependencies: cssnano-util-get-match: 4.0.0 has: 1.0.4 postcss: 7.0.39 postcss-value-parser: 3.3.1 - dev: true - /postcss-reduce-transforms@5.1.0(postcss@8.4.41): - resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-reduce-transforms@5.1.0(postcss@8.4.41): dependencies: postcss: 8.4.41 postcss-value-parser: 4.2.0 - dev: false - /postcss-replace-overflow-wrap@4.0.0(postcss@8.4.40): - resolution: {integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==} - peerDependencies: - postcss: ^8.0.3 + postcss-replace-overflow-wrap@4.0.0(postcss@8.4.40): dependencies: postcss: 8.4.40 - dev: false - /postcss-selector-not@6.0.1(postcss@8.4.40): - resolution: {integrity: sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 + postcss-selector-not@6.0.1(postcss@8.4.40): dependencies: postcss: 8.4.40 postcss-selector-parser: 6.1.1 - dev: false - /postcss-selector-parser@3.1.2: - resolution: {integrity: sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==} - engines: {node: '>=8'} + postcss-selector-parser@3.1.2: dependencies: dot-prop: 5.3.0 indexes-of: 1.0.1 uniq: 1.0.1 - dev: true - /postcss-selector-parser@6.0.10: - resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} - engines: {node: '>=4'} + postcss-selector-parser@6.0.10: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - dev: true - /postcss-selector-parser@6.1.1: - resolution: {integrity: sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==} - engines: {node: '>=4'} + postcss-selector-parser@6.1.1: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - /postcss-svgo@4.0.3: - resolution: {integrity: sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==} - engines: {node: '>=6.9.0'} + postcss-svgo@4.0.3: dependencies: postcss: 7.0.39 postcss-value-parser: 3.3.1 svgo: 1.3.2 - dev: true - /postcss-svgo@5.1.0(postcss@8.4.41): - resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-svgo@5.1.0(postcss@8.4.41): dependencies: postcss: 8.4.41 postcss-value-parser: 4.2.0 svgo: 2.8.0 - dev: false - /postcss-unique-selectors@4.0.1: - resolution: {integrity: sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==} - engines: {node: '>=6.9.0'} + postcss-unique-selectors@4.0.1: dependencies: alphanum-sort: 1.0.2 postcss: 7.0.39 uniqs: 2.0.0 - dev: true - /postcss-unique-selectors@5.1.1(postcss@8.4.41): - resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-unique-selectors@5.1.1(postcss@8.4.41): dependencies: postcss: 8.4.41 postcss-selector-parser: 6.1.1 - dev: false - /postcss-value-parser@3.3.1: - resolution: {integrity: sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==} - dev: true + postcss-value-parser@3.3.1: {} - /postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + postcss-value-parser@4.2.0: {} - /postcss@6.0.1: - resolution: {integrity: sha512-VbGX1LQgQbf9l3cZ3qbUuC3hGqIEOGQFHAEHQ/Diaeo0yLgpgK5Rb8J+OcamIfQ9PbAU/fzBjVtQX3AhJHUvZw==} - engines: {node: '>=4.0.0'} + postcss@6.0.1: dependencies: chalk: 1.1.3 source-map: 0.5.7 supports-color: 3.2.3 - dev: true - /postcss@7.0.39: - resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} - engines: {node: '>=6.0.0'} + postcss@7.0.39: dependencies: picocolors: 0.2.1 source-map: 0.6.1 - /postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.4.31: dependencies: nanoid: 3.3.7 picocolors: 1.0.1 source-map-js: 1.2.0 - dev: false - /postcss@8.4.40: - resolution: {integrity: sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.4.40: dependencies: nanoid: 3.3.7 picocolors: 1.0.1 source-map-js: 1.2.0 - /postcss@8.4.41: - resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.4.41: dependencies: nanoid: 3.3.7 picocolors: 1.0.1 source-map-js: 1.2.0 - /postgres-array@2.0.0: - resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} - engines: {node: '>=4'} + postgres-array@2.0.0: {} - /postgres-array@3.0.2: - resolution: {integrity: sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==} - engines: {node: '>=12'} + postgres-array@3.0.2: {} - /postgres-bytea@1.0.0: - resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} - engines: {node: '>=0.10.0'} + postgres-bytea@1.0.0: {} - /postgres-bytea@3.0.0: - resolution: {integrity: sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==} - engines: {node: '>= 6'} + postgres-bytea@3.0.0: dependencies: obuf: 1.1.2 - /postgres-date@1.0.7: - resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} - engines: {node: '>=0.10.0'} + postgres-date@1.0.7: {} - /postgres-date@2.1.0: - resolution: {integrity: sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==} - engines: {node: '>=12'} + postgres-date@2.1.0: {} - /postgres-interval@1.2.0: - resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} - engines: {node: '>=0.10.0'} + postgres-interval@1.2.0: dependencies: xtend: 4.0.2 - /postgres-interval@3.0.0: - resolution: {integrity: sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==} - engines: {node: '>=12'} + postgres-interval@3.0.0: {} - /postgres-range@1.1.4: - resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==} + postgres-range@1.1.4: {} - /posthog-node@4.0.1: - resolution: {integrity: sha512-rtqm2h22QxLGBrW2bLYzbRhliIrqgZ0k+gF0LkQ1SNdeD06YE5eilV0MxZppFSxC8TfH0+B0cWCuebEnreIDgQ==} - engines: {node: '>=15.0.0'} + posthog-node@4.0.1: dependencies: axios: 1.7.2 rusha: 0.8.14 transitivePeerDependencies: - debug - dev: false - /preact-render-to-string@5.2.6(preact@10.23.1): - resolution: {integrity: sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==} - peerDependencies: - preact: '>=10' + preact-render-to-string@5.2.6(preact@10.23.1): dependencies: preact: 10.23.1 pretty-format: 3.8.0 - dev: false - /preact@10.23.1: - resolution: {integrity: sha512-O5UdRsNh4vdZaTieWe3XOgSpdMAmkIYBCT3VhQDlKrzyCm8lUYsk0fmVEvoQQifoOjFRTaHZO69ylrzTW2BH+A==} - dev: false + preact@10.23.1: {} - /prebuild-install@5.3.6: - resolution: {integrity: sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg==} - engines: {node: '>=6'} - hasBin: true + prebuild-install@5.3.6: dependencies: detect-libc: 1.0.3 expand-template: 2.0.3 @@ -20612,12 +26578,8 @@ packages: tar-fs: 2.1.1 tunnel-agent: 0.6.0 which-pm-runs: 1.1.0 - dev: false - /prebuild-install@7.1.2: - resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} - engines: {node: '>=10'} - hasBin: true + prebuild-install@7.1.2: dependencies: detect-libc: 2.0.3 expand-template: 2.0.3 @@ -20631,211 +26593,128 @@ packages: simple-get: 4.0.1 tar-fs: 2.1.1 tunnel-agent: 0.6.0 - dev: false - /preferred-pm@3.1.4: - resolution: {integrity: sha512-lEHd+yEm22jXdCphDrkvIJQU66EuLojPPtvZkpKIkiD+l0DMThF/niqZKJSoU8Vl7iuvtmzyMhir9LdVy5WMnA==} - engines: {node: '>=10'} + preferred-pm@3.1.4: dependencies: find-up: 5.0.0 find-yarn-workspace-root2: 1.2.16 path-exists: 4.0.0 which-pm: 2.2.0 - /prelude-ls@1.1.2: - resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} - engines: {node: '>= 0.8.0'} - dev: false + prelude-ls@1.1.2: {} - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} + prelude-ls@1.2.1: {} - /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true + prettier@2.8.8: {} - /pretty-bytes@3.0.1: - resolution: {integrity: sha512-eb7ZAeUTgfh294cElcu51w+OTRp/6ItW758LjwJSK72LDevcuJn0P4eD71PLMDGPwwatXmAmYHTkzvpKlJE3ow==} - engines: {node: '>=0.10.0'} + pretty-bytes@3.0.1: dependencies: number-is-nan: 1.0.1 - dev: true - /pretty-bytes@5.6.0: - resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} - engines: {node: '>=6'} + pretty-bytes@5.6.0: {} - /pretty-error@4.0.0: - resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} + pretty-error@4.0.0: dependencies: lodash: 4.17.21 renderkid: 3.0.0 - dev: false - /pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + pretty-format@27.5.1: dependencies: ansi-regex: 5.0.1 ansi-styles: 5.2.0 react-is: 17.0.2 - /pretty-format@28.1.3: - resolution: {integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + pretty-format@28.1.3: dependencies: '@jest/schemas': 28.1.3 ansi-regex: 5.0.1 ansi-styles: 5.2.0 react-is: 18.3.1 - /pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-format@29.7.0: dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 react-is: 18.3.1 - /pretty-format@3.8.0: - resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} - dev: false + pretty-format@3.8.0: {} - /pretty-ms@7.0.1: - resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} - engines: {node: '>=10'} + pretty-ms@7.0.1: dependencies: parse-ms: 2.1.0 - dev: true - /prisma@5.17.0: - resolution: {integrity: sha512-m4UWkN5lBE6yevqeOxEvmepnL5cNPEjzMw2IqDB59AcEV6w7D8vGljDLd1gPFH+W6gUxw9x7/RmN5dCS/WTPxA==} - engines: {node: '>=16.13'} - hasBin: true - requiresBuild: true + prisma@5.17.0: dependencies: '@prisma/engines': 5.17.0 - /prismjs@1.29.0: - resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} - engines: {node: '>=6'} - dev: true + prismjs@1.29.0: {} - /proc-log@1.0.0: - resolution: {integrity: sha512-aCk8AO51s+4JyuYGg3Q/a6gnrlDO09NpVWePtjp7xwphcoQ04x5WAfCyugcsbLooWcMJ87CLkD4+604IckEdhg==} + proc-log@1.0.0: {} - /proc-log@3.0.0: - resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + proc-log@3.0.0: {} - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + process-nextick-args@2.0.1: {} - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} + process@0.11.10: {} - /progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - dev: false + progress@2.0.3: {} - /prom-client@15.1.3: - resolution: {integrity: sha512-6ZiOBfCywsD4k1BN9IX0uZhF+tJkV8q8llP64G5Hajs4JOeVLPCwpPVcpXy3BwYiUGgyJzsJJQeOIv7+hDSq8g==} - engines: {node: ^16 || ^18 || >=20} + prom-client@15.1.3: dependencies: '@opentelemetry/api': 1.9.0 tdigest: 0.1.2 - dev: false - /promise-all-reject-late@1.0.1: - resolution: {integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==} + promise-all-reject-late@1.0.1: {} - /promise-call-limit@1.0.2: - resolution: {integrity: sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==} + promise-call-limit@1.0.2: {} - /promise-inflight@1.0.1: - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: - optional: true + promise-inflight@1.0.1: {} - /promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} + promise-retry@2.0.1: dependencies: err-code: 2.0.3 retry: 0.12.0 - /promise.series@0.2.0: - resolution: {integrity: sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==} - engines: {node: '>=0.12'} - dev: true + promise.series@0.2.0: {} - /promise@7.3.1: - resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + promise@7.3.1: dependencies: asap: 2.0.6 - dev: false - /promise@8.3.0: - resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} + promise@8.3.0: dependencies: asap: 2.0.6 - dev: false - /promisepipe@3.0.0: - resolution: {integrity: sha512-V6TbZDJ/ZswevgkDNpGt/YqNCiZP9ASfgU+p83uJE6NrGtvSGoOcHLiDCqkMs2+yg7F5qHdLV8d0aS8O26G/KA==} - dev: true + promisepipe@3.0.0: {} - /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} + prompts@2.4.2: dependencies: kleur: 3.0.3 sisteransi: 1.0.5 - /prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 - /proper-lockfile@4.1.2: - resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + proper-lockfile@4.1.2: dependencies: graceful-fs: 4.2.11 retry: 0.12.0 signal-exit: 3.0.7 - dev: true - /properties-reader@2.3.0: - resolution: {integrity: sha512-z597WicA7nDZxK12kZqHr2TcvwNU1GCfA5UwfDY/HDp3hXPoPlb5rlEx9bwGTiJnc0OqbBTkU975jDToth8Gxw==} - engines: {node: '>=14'} + properties-reader@2.3.0: dependencies: mkdirp: 1.0.4 - dev: true - /proto-list@1.2.4: - resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - dev: false + proto-list@1.2.4: {} - /proto3-json-serializer@2.0.2: - resolution: {integrity: sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==} - engines: {node: '>=14.0.0'} + proto3-json-serializer@2.0.2: dependencies: protobufjs: 7.3.2 - dev: false - /protobufjs@7.3.2: - resolution: {integrity: sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==} - engines: {node: '>=12.0.0'} - requiresBuild: true + protobufjs@7.3.2: dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/base64': 1.1.2 @@ -20850,125 +26729,76 @@ packages: '@types/node': 18.19.42 long: 5.2.3 - /proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: false + proxy-from-env@1.1.0: {} - /prr@1.0.1: - resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} - requiresBuild: true - dev: true + prr@1.0.1: optional: true - /psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - dev: false + psl@1.9.0: {} - /pstree.remy@1.1.8: - resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} - dev: true + pstree.remy@1.1.8: {} - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + pump@3.0.0: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - /pure-color@1.3.0: - resolution: {integrity: sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==} - dev: false + punycode@2.3.1: {} - /pure-rand@6.1.0: - resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + pure-color@1.3.0: {} - /q@1.5.1: - resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} - engines: {node: '>=0.6.0', teleport: '>=0.2.0'} - deprecated: |- - You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. + pure-rand@6.1.0: {} - (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) + q@1.5.1: {} - /qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} + qs@6.11.0: dependencies: side-channel: 1.0.6 - /qs@6.12.3: - resolution: {integrity: sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ==} - engines: {node: '>=0.6'} + qs@6.12.3: dependencies: side-channel: 1.0.6 - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: false + querystringify@2.2.0: {} - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + queue-microtask@1.2.3: {} - /raf@3.4.1: - resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} + raf@3.4.1: dependencies: performance-now: 2.1.0 - dev: false - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 - /range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} + range-parser@1.2.1: {} - /raw-body@2.4.1: - resolution: {integrity: sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==} - engines: {node: '>= 0.8'} + raw-body@2.4.1: dependencies: bytes: 3.1.0 http-errors: 1.7.3 iconv-lite: 0.4.24 unpipe: 1.0.0 - dev: true - /raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} + raw-body@2.5.2: dependencies: bytes: 3.1.2 http-errors: 2.0.0 iconv-lite: 0.4.24 unpipe: 1.0.0 - /raw-loader@4.0.2(webpack@5.93.0): - resolution: {integrity: sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 + raw-loader@4.0.2(webpack@5.93.0): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 webpack: 5.93.0(webpack-cli@5.1.4) - dev: true - /rc-align@4.0.15(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rc-align@4.0.15(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 @@ -20977,13 +26807,8 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) resize-observer-polyfill: 1.5.1 - dev: false - /rc-cascader@3.27.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-z5uq8VvQadFUBiuZJ7YF5UAUGNkZtdEtcEYiIA94N/Kc2MIKr6lEbN5HyVddvYSgwWlKqnL6pH5bFXFuIK3MNg==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rc-cascader@3.27.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 array-tree-filter: 2.1.0 @@ -20994,11 +26819,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-checkbox@3.3.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-Ih3ZaAcoAiFKJjifzwsGiT/f/quIkxJoklW4yKGho14Olulwn8gN7hOBve0/WGDg5o/l/5mL0w7ff7/YGvefVw==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rc-checkbox@3.3.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 @@ -21006,11 +26827,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-collapse@3.7.3(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-60FJcdTRn0X5sELF18TANwtVi7FtModq649H11mYF1jh83DniMoM4MqY627sEKRCTm4+WXfGDcB7hY5oW6xhyw==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rc-collapse@3.7.3(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 @@ -21019,11 +26836,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-dialog@9.5.2(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-qVUjc8JukG+j/pNaHVSRa2GO2/KbV2thm7yO4hepQ902eGdYK913sGkwg/fh9yhKYV1ql3BKIN2xnud3rEXAPw==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rc-dialog@9.5.2(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) @@ -21033,11 +26846,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-drawer@7.2.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-9lOQ7kBekEJRdEpScHvtmEtXnAsy+NGDXiRWc2ZVC7QXAazNVbeT4EraQKYwCME8BJLa8Bxqxvs5swwyOepRwg==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rc-drawer@7.2.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) @@ -21047,11 +26856,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-dropdown@4.2.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-odM8Ove+gSh0zU27DUj5cG1gNKg7mLWBYzB5E4nNLrLwBmYEgYP43vHKDGOVZcJSVElQBI0+jTQgjnq0NfLjng==} - peerDependencies: - react: '>=16.11.0' - react-dom: '>=16.11.0' + rc-dropdown@4.2.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) @@ -21060,12 +26865,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-field-form@2.2.1(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-uoNqDoR7A4tn4QTSqoWPAzrR7ZwOK5I+vuZ/qdcHtbKx+ZjEsTg7QXm2wk/jalDiSksAQmATxL0T5LJkRREdIA==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rc-field-form@2.2.1(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 '@rc-component/async-validator': 5.0.4 @@ -21073,11 +26873,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-image@7.9.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-l4zqO5E0quuLMCtdKfBgj4Suv8tIS011F5k1zBBlK25iMjjiNHxA0VeTzGFtUZERSA45gvpXDg8/P6qNLjR25g==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rc-image@7.9.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) @@ -21088,11 +26884,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-input-number@9.1.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-NqJ6i25Xn/AgYfVxynlevIhX3FuKlMwIFpucGG1h98SlK32wQwDK0zhN9VY32McOmuaqzftduNYWWooWz8pXQA==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rc-input-number@9.1.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 '@rc-component/mini-decimal': 1.1.0 @@ -21102,11 +26894,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-input@1.5.1(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-+nOzQJDeIfIpNP/SgY45LXSKbuMlp4Yap2y8c+ZpU7XbLmNzUd6+d5/S75sA/52jsVE6S/AkhkkDEAOjIu7i6g==} - peerDependencies: - react: '>=16.0.0' - react-dom: '>=16.0.0' + rc-input@1.5.1(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 @@ -21114,11 +26902,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-mentions@2.14.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-qKR59FMuF8PK4ZqsbWX3UuA5P1M/snzyqV6Yt3y1DCFbCEdqUGIBgQp6vEfLCO6Z0RoRFlzXtCeSlBTcDDpg1A==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rc-mentions@2.14.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) @@ -21130,11 +26914,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-menu@9.14.1(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-5wlRb3M8S4yGlWhSoEYJ7ZVRElyScdcpUHxgiLxkeig1tEdyKrnED3B2fhpN0Rrpdp9jyhnmZR/Lwq2fH5VvDQ==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rc-menu@9.14.1(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) @@ -21145,11 +26925,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-motion@2.9.2(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-fUAhHKLDdkAXIDLH0GYwof3raS58dtNUmzLF2MeiR8o6n4thNpSDQhOqQzWE4WfFZDCi9VEN8n7tiB7czREcyw==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rc-motion@2.9.2(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 @@ -21157,12 +26933,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-notification@5.6.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-TGQW5T7waOxLwgJG7fXcw8l7AQiFOjaZ7ISF5PrU526nunHRNcTMuzKihQHaF4E/h/KfOCDk3Mv8eqzbu2e28w==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rc-notification@5.6.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 @@ -21171,11 +26942,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-overflow@1.3.2(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rc-overflow@1.3.2(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 @@ -21184,11 +26951,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-pagination@4.2.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-V6qeANJsT6tmOcZ4XiUmj8JXjRLbkusuufpuoBw2GiAn94fIixYjFLmbruD1Sbhn8fPLDnWawPp4CN37zQorvw==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rc-pagination@4.2.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 @@ -21196,12 +26959,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-picker@2.7.6(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-H9if/BUJUZBOhPfWcPeT15JUI3/ntrG9muzERrXDkSoWmDj4yzmBvumozpxYrHwjcKnjyDGAke68d+whWwvhHA==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rc-picker@2.7.6(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 @@ -21213,27 +26971,8 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) shallowequal: 1.1.0 - dev: false - /rc-picker@4.6.11(dayjs@1.11.12)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-PEVH5MMTUrdvTTxCmPndsXiJL7TFLSu8q0cDdZrhdcjn8en3NbuhOFacWqKTvdnfG53RPPhiBssXCUHYyc3R/Q==} - engines: {node: '>=8.x'} - peerDependencies: - date-fns: '>= 2.x' - dayjs: '>= 1.x' - luxon: '>= 3.x' - moment: '>= 2.x' - react: '>=16.9.0' - react-dom: '>=16.9.0' - peerDependenciesMeta: - date-fns: - optional: true - dayjs: - optional: true - luxon: - optional: true - moment: - optional: true + rc-picker@4.6.11(dayjs@1.11.12)(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) @@ -21245,11 +26984,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-progress@4.0.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rc-progress@4.0.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 @@ -21257,12 +26992,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-rate@2.13.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-oxvx1Q5k5wD30sjN5tqAyWTvJfLNNJn7Oq3IeS4HxWfAiC4BOXMITNAsw7u/fzdtO4MS8Ki8uRLOzcnEuoQiAw==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rc-rate@2.13.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 @@ -21270,11 +27000,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-resize-observer@1.4.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rc-resize-observer@1.4.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 @@ -21283,11 +27009,7 @@ packages: react-dom: 18.3.1(react@18.3.1) resize-observer-polyfill: 1.5.1 - /rc-segmented@2.3.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-I3FtM5Smua/ESXutFfb8gJ8ZPcvFR+qUgeeGFQHBOvRiRKyAk4aBE5nfqrxXx+h8/vn60DQjOt6i4RNtrbOobg==} - peerDependencies: - react: '>=16.0.0' - react-dom: '>=16.0.0' + rc-segmented@2.3.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 @@ -21296,12 +27018,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-select@14.15.1(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-mGvuwW1RMm1NCSI8ZUoRoLRK51R2Nb+QJnmiAvbDRcjh2//ulCkxeV6ZRFTECPpE1t2DPfyqZMPw90SVJzQ7wQ==} - engines: {node: '>=8.x'} - peerDependencies: - react: '*' - react-dom: '*' + rc-select@14.15.1(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) @@ -21313,12 +27030,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-slider@10.6.2(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-FjkoFjyvUQWcBo1F3RgSglky3ar0+qHLM41PlFVYB4Bj3RD8E/Mv7kqMouLFBU+3aFglMzzctAIWRwajEuueSw==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rc-slider@10.6.2(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 @@ -21326,24 +27038,15 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-steps@6.0.1(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rc-steps@6.0.1(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - - /rc-switch@4.1.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + + rc-switch@4.1.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 @@ -21351,12 +27054,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-table@7.45.7(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-wi9LetBL1t1csxyGkMB2p3mCiMt+NDexMlPbXHvQFmBBAsMxrgNSAPwUci2zDLUq9m8QdWc1Nh8suvrpy9mXrg==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rc-table@7.45.7(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 '@rc-component/context': 1.4.0(react-dom@18.3.1)(react@18.3.1) @@ -21367,12 +27065,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-tabs@15.1.1(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-Tc7bJvpEdkWIVCUL7yQrMNBJY3j44NcyWS48jF/UKMXuUlzaXK+Z/pEL5LjGcTadtPvVmNqA40yv7hmr+tCOAw==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rc-tabs@15.1.1(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 @@ -21384,11 +27077,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-textarea@1.7.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-UxizYJkWkmxP3zofXgc487QiGyDmhhheDLLjIWbFtDmiru1ls30KpO8odDaPyqNUIy9ugj5djxTEuezIn6t3Jg==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rc-textarea@1.7.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 @@ -21398,11 +27087,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-tooltip@6.2.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-iS/3iOAvtDh9GIx1ulY7EFUXUtktFccNLsARo3NPgLf0QW9oT0w3dA9cYWlhqAKmD+uriEwdWz1kH0Qs4zk2Aw==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rc-tooltip@6.2.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) @@ -21410,11 +27095,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-tree-select@5.22.1(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-b8mAK52xEpRgS+b2PTapCt29GoIrO5cO8jB7AfHttFsIJfcnynY9FCtnYzURsKXJkGHbFY6UzSEB2I3TETtdWg==} - peerDependencies: - react: '*' - react-dom: '*' + rc-tree-select@5.22.1(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 @@ -21424,12 +27105,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-tree@5.8.8(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-S+mCMWo91m5AJqjz3PdzKilGgbFm7fFJRFiTDOcoRbD7UfMOPnerXwMworiga0O2XIo383UoWuEfeHs1WOltag==} - engines: {node: '>=10.x'} - peerDependencies: - react: '*' - react-dom: '*' + rc-tree@5.8.8(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 @@ -21439,12 +27115,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-trigger@5.3.4(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-mQv+vas0TwKcjAO2izNPkqR4j86OemLRmvL2nOzdP9OWNWA1ivoTt5hzFqYNW9zACwmTezRiN8bttrC7cZzYSw==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rc-trigger@5.3.4(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 @@ -21453,13 +27124,8 @@ packages: rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /rc-upload@4.6.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-Zr0DT1NHw/ApxrP7UAoxOtGaVYuzarrrCVr0ld7RiEFsKX07uFhE1EpCBxwL11ruFn89GMcshOKWp+s6FLyAlA==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rc-upload@4.6.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 @@ -21467,23 +27133,14 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc-util@5.43.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-AzC7KKOXFqAdIBqdGWepL9Xn7cm3vnAmjlHqUnoQaTMZYhM4VlXGLkkHHxj/BZ7Td0+SOPKB4RGPboBVKT9htw==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rc-util@5.43.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-is: 18.3.1 - /rc-virtual-list@3.14.5(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-ZMOnkCLv2wUN8Jz7yI4XiSLa9THlYvf00LuMhb1JlsQCewuU7ydPuHw1rGVPhe9VZYl/5UqODtNd7QKJ2DMGfg==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rc-virtual-list@3.14.5(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 @@ -21492,19 +27149,14 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true + rc@1.2.8: dependencies: deep-extend: 0.6.0 ini: 1.3.8 minimist: 1.2.8 strip-json-comments: 2.0.1 - dev: false - /react-app-polyfill@3.0.0: - resolution: {integrity: sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==} - engines: {node: '>=14'} + react-app-polyfill@3.0.0: dependencies: core-js: 3.37.1 object-assign: 4.1.1 @@ -21512,26 +27164,15 @@ packages: raf: 3.4.1 regenerator-runtime: 0.13.11 whatwg-fetch: 3.6.20 - dev: false - /react-base16-styling@0.6.0: - resolution: {integrity: sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==} + react-base16-styling@0.6.0: dependencies: base16: 1.0.0 lodash.curry: 4.1.1 lodash.flow: 3.5.0 pure-color: 1.3.0 - dev: false - /react-dev-utils@12.0.1(eslint@8.57.0)(typescript@5.5.4)(webpack@5.93.0): - resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=2.7' - webpack: '>=4' - peerDependenciesMeta: - typescript: - optional: true + react-dev-utils@12.0.1(eslint@8.57.0)(typescript@5.5.4)(webpack@5.93.0): dependencies: '@babel/code-frame': 7.24.7 address: 1.2.2 @@ -21563,43 +27204,26 @@ packages: - eslint - supports-color - vue-template-compiler - dev: false - /react-dom@18.3.1(react@18.3.1): - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} - peerDependencies: - react: ^18.3.1 + react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 react: 18.3.1 scheduler: 0.23.2 - /react-error-overlay@6.0.11: - resolution: {integrity: sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==} - dev: false + react-error-overlay@6.0.11: {} - /react-icons@4.12.0(react@18.3.1): - resolution: {integrity: sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==} - peerDependencies: - react: '*' + react-icons@4.12.0(react@18.3.1): dependencies: react: 18.3.1 - dev: false - /react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-is@16.13.1: {} - /react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + react-is@17.0.2: {} - /react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react-is@18.3.1: {} - /react-json-view@1.21.3(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==} - peerDependencies: - react: ^17.0.0 || ^16.3.0 || ^15.5.4 - react-dom: ^17.0.0 || ^16.3.0 || ^15.5.4 + react-json-view@1.21.3(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): dependencies: flux: 4.0.4(react@18.3.1) react: 18.3.1 @@ -21610,63 +27234,31 @@ packages: transitivePeerDependencies: - '@types/react' - encoding - dev: false - /react-lifecycles-compat@3.0.4: - resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} - dev: false + react-lifecycles-compat@3.0.4: {} - /react-reconciler@0.26.2(react@18.3.1): - resolution: {integrity: sha512-nK6kgY28HwrMNwDnMui3dvm3rCFjZrcGiuwLc5COUipBK5hWHLOxMJhSnSomirqWwjPBJKV1QcbkI0VJr7Gl1Q==} - engines: {node: '>=0.10.0'} - peerDependencies: - react: ^17.0.2 + react-reconciler@0.26.2(react@18.3.1): dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react: 18.3.1 scheduler: 0.20.2 - dev: false - /react-refresh@0.11.0: - resolution: {integrity: sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==} - engines: {node: '>=0.10.0'} - dev: false + react-refresh@0.11.0: {} - /react-router-dom@6.25.1(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-0tUDpbFvk35iv+N89dWNrJp+afLgd+y4VtorJZuOCXK0kkCWjEvb3vTJM++SYvMEpbVwXKf3FjeVveVEb6JpDQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' + react-router-dom@6.25.1(react-dom@18.3.1)(react@18.3.1): dependencies: '@remix-run/router': 1.18.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-router: 6.25.1(react@18.3.1) - dev: false - /react-router@6.25.1(react@18.3.1): - resolution: {integrity: sha512-u8ELFr5Z6g02nUtpPAggP73Jigj1mRePSwhS/2nkTrlPU5yEkH1vYzWNyvSnSzeeE2DNqWdH+P8OhIh9wuXhTw==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: '>=16.8' + react-router@6.25.1(react@18.3.1): dependencies: '@remix-run/router': 1.18.0 react: 18.3.1 - dev: false - /react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0)(react@18.3.1)(ts-node@10.9.2)(typescript@5.5.4): - resolution: {integrity: sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==} - engines: {node: '>=14.0.0'} - hasBin: true - peerDependencies: - eslint: '*' - react: '>= 16' - typescript: ^3.2.1 || ^4 - peerDependenciesMeta: - typescript: - optional: true + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0)(react@18.3.1)(ts-node@10.9.2)(typescript@5.5.4): dependencies: '@babel/core': 7.25.2 '@pmmmwh/react-refresh-webpack-plugin': 0.5.15(react-refresh@0.11.0)(webpack-dev-server@4.15.2)(webpack@5.93.0) @@ -21752,26 +27344,16 @@ packages: - webpack-cli - webpack-hot-middleware - webpack-plugin-serve - dev: false - /react-smooth@4.0.1(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-OE4hm7XqR0jNOq3Qmk9mFLyd6p2+j6bvbPJ7qlB7+oo0eNcL2l7WQzG6MBnT3EXY6xzkLMUBec3AfewJdA0J8w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-smooth@4.0.1(react-dom@18.3.1)(react@18.3.1): dependencies: fast-equals: 5.0.1 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-transition-group: 4.4.5(react-dom@18.3.1)(react@18.3.1) - dev: false - /react-textarea-autosize@8.5.3(@types/react@18.3.3)(react@18.3.1): - resolution: {integrity: sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==} - engines: {node: '>=10'} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-textarea-autosize@8.5.3(@types/react@18.3.3)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 react: 18.3.1 @@ -21779,13 +27361,8 @@ packages: use-latest: 1.2.1(@types/react@18.3.3)(react@18.3.1) transitivePeerDependencies: - '@types/react' - dev: false - /react-transition-group@4.4.5(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} - peerDependencies: - react: '>=16.6.0' - react-dom: '>=16.6.0' + react-transition-group@4.4.5(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 dom-helpers: 5.2.1 @@ -21793,23 +27370,13 @@ packages: prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /react-universal-interface@0.6.2(react@18.3.1)(tslib@2.6.3): - resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==} - peerDependencies: - react: '*' - tslib: '*' + react-universal-interface@0.6.2(react@18.3.1)(tslib@2.6.3): dependencies: react: 18.3.1 tslib: 2.6.3 - dev: false - /react-use@17.5.1(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-LG/uPEVRflLWMwi3j/sZqR00nF6JGqTTDblkXK2nzXsIvij06hXl1V/MZIlwj1OKIQUtlh1l9jK8gLsRyCQxMg==} - peerDependencies: - react: '*' - react-dom: '*' + react-use@17.5.1(react-dom@18.3.1)(react@18.3.1): dependencies: '@types/js-cookie': 2.2.7 '@xobotyi/scrollbar-width': 1.9.5 @@ -21827,66 +27394,48 @@ packages: throttle-debounce: 3.0.1 ts-easing: 0.2.0 tslib: 2.6.3 - dev: false - /react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} + react@18.3.1: dependencies: loose-envify: 1.4.0 - /read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + read-cache@1.0.0: dependencies: pify: 2.3.0 - /read-cmd-shim@3.0.1: - resolution: {integrity: sha512-kEmDUoYf/CDy8yZbLTmhB1X9kkjf9Q80PCNsDMb7ufrGd6zZSQA1+UyjrO+pZm5K/S4OXCWJeiIt1JA8kAsa6g==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + read-cmd-shim@3.0.1: {} - /read-package-json-fast@2.0.3: - resolution: {integrity: sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==} - engines: {node: '>=10'} + read-package-json-fast@2.0.3: dependencies: json-parse-even-better-errors: 2.3.1 npm-normalize-package-bin: 1.0.1 - /read-package-json-fast@3.0.2: - resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + read-package-json-fast@3.0.2: dependencies: json-parse-even-better-errors: 3.0.2 npm-normalize-package-bin: 3.0.1 - /read-package-json@6.0.4: - resolution: {integrity: sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - deprecated: This package is no longer supported. Please use @npmcli/package-json instead. + read-package-json@6.0.4: dependencies: glob: 10.4.5 json-parse-even-better-errors: 3.0.2 normalize-package-data: 5.0.0 npm-normalize-package-bin: 3.0.1 - /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} + read-pkg-up@7.0.1: dependencies: find-up: 4.1.0 read-pkg: 5.2.0 type-fest: 0.8.1 - /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} + read-pkg@5.2.0: dependencies: '@types/normalize-package-data': 2.4.4 normalize-package-data: 2.5.0 parse-json: 5.2.0 type-fest: 0.6.0 - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -21896,17 +27445,13 @@ packages: string_decoder: 1.1.1 util-deprecate: 1.0.2 - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - /readable-stream@4.5.2: - resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + readable-stream@4.5.2: dependencies: abort-controller: 3.0.0 buffer: 6.0.3 @@ -21914,46 +27459,30 @@ packages: process: 0.11.10 string_decoder: 1.3.0 - /readdir-glob@1.1.3: - resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + readdir-glob@1.1.3: dependencies: minimatch: 5.1.6 - dev: true - /readdir-scoped-modules@1.1.0: - resolution: {integrity: sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==} - deprecated: This functionality has been moved to @npmcli/fs + readdir-scoped-modules@1.1.0: dependencies: debuglog: 1.0.1 dezalgo: 1.0.4 graceful-fs: 4.2.11 once: 1.4.0 - /readdirp@3.3.0: - resolution: {integrity: sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==} - engines: {node: '>=8.10.0'} + readdirp@3.3.0: dependencies: picomatch: 2.3.1 - dev: true - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + readdirp@3.6.0: dependencies: picomatch: 2.3.1 - /recharts-scale@0.4.5: - resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} + recharts-scale@0.4.5: dependencies: decimal.js-light: 2.5.1 - dev: false - /recharts@2.12.7(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-hlLJMhPQfv4/3NBSAyq3gzGg4h2v69RJh6KU7b3pXYNNAELs9kEoXOjbkxdXpALqKBoVmVptGfLpxdaVYqjmXQ==} - engines: {node: '>=14'} - peerDependencies: - react: ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 + recharts@2.12.7(react-dom@18.3.1)(react@18.3.1): dependencies: clsx: 2.1.1 eventemitter3: 4.0.7 @@ -21965,48 +27494,31 @@ packages: recharts-scale: 0.4.5 tiny-invariant: 1.3.3 victory-vendor: 36.9.2 - dev: false - /rechoir@0.6.2: - resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} - engines: {node: '>= 0.10'} + rechoir@0.6.2: dependencies: resolve: 1.22.8 - /rechoir@0.8.0: - resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} - engines: {node: '>= 10.13.0'} + rechoir@0.8.0: dependencies: resolve: 1.22.8 - /recursive-readdir@2.2.3: - resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} - engines: {node: '>=6.0.0'} + recursive-readdir@2.2.3: dependencies: minimatch: 3.1.2 - dev: false - /redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} + redent@3.0.0: dependencies: indent-string: 4.0.0 strip-indent: 3.0.0 - dev: true - /redis-errors@1.2.0: - resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} - engines: {node: '>=4'} + redis-errors@1.2.0: {} - /redis-parser@3.0.0: - resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} - engines: {node: '>=4'} + redis-parser@3.0.0: dependencies: redis-errors: 1.2.0 - /reflect.getprototypeof@1.0.6: - resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} - engines: {node: '>= 0.4'} + reflect.getprototypeof@1.0.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -22016,47 +27528,32 @@ packages: globalthis: 1.0.4 which-builtin-type: 1.1.4 - /regenerate-unicode-properties@10.1.1: - resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} - engines: {node: '>=4'} + regenerate-unicode-properties@10.1.1: dependencies: regenerate: 1.4.2 - /regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + regenerate@1.4.2: {} - /regenerator-runtime@0.10.5: - resolution: {integrity: sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==} - dev: false + regenerator-runtime@0.10.5: {} - /regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - dev: false + regenerator-runtime@0.13.11: {} - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + regenerator-runtime@0.14.1: {} - /regenerator-transform@0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + regenerator-transform@0.15.2: dependencies: '@babel/runtime': 7.25.0 - /regex-parser@2.3.0: - resolution: {integrity: sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==} - dev: false + regex-parser@2.3.0: {} - /regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} + regexp.prototype.flags@1.5.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-errors: 1.3.0 set-function-name: 2.0.2 - /regexpu-core@5.3.2: - resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} - engines: {node: '>=4'} + regexpu-core@5.3.2: dependencies: '@babel/regjsgen': 0.8.0 regenerate: 1.4.2 @@ -22065,130 +27562,78 @@ packages: unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.1.0 - /regjsparser@0.9.1: - resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} - hasBin: true + regjsparser@0.9.1: dependencies: jsesc: 0.5.0 - /relateurl@0.2.7: - resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} - engines: {node: '>= 0.10'} - dev: false + relateurl@0.2.7: {} - /remove-trailing-separator@1.1.0: - resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + remove-trailing-separator@1.1.0: {} - /renderkid@3.0.0: - resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} + renderkid@3.0.0: dependencies: css-select: 4.3.0 dom-converter: 0.2.0 htmlparser2: 6.1.0 lodash: 4.17.21 strip-ansi: 6.0.1 - dev: false - /replace-ext@1.0.1: - resolution: {integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==} - engines: {node: '>= 0.10'} + replace-ext@1.0.1: {} - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + require-directory@2.1.1: {} - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} + require-from-string@2.0.2: {} - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: false + requires-port@1.0.0: {} - /resize-observer-polyfill@1.5.1: - resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + resize-observer-polyfill@1.5.1: {} - /resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} + resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 - /resolve-from@3.0.0: - resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} - engines: {node: '>=4'} - dev: true + resolve-from@3.0.0: {} - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} + resolve-from@4.0.0: {} - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} + resolve-from@5.0.0: {} - /resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve-pkg-maps@1.0.0: {} - /resolve-url-loader@4.0.0: - resolution: {integrity: sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==} - engines: {node: '>=8.9'} - peerDependencies: - rework: 1.0.1 - rework-visit: 1.0.0 - peerDependenciesMeta: - rework: - optional: true - rework-visit: - optional: true + resolve-url-loader@4.0.0: dependencies: adjust-sourcemap-loader: 4.0.0 convert-source-map: 1.9.0 loader-utils: 2.0.4 postcss: 7.0.39 source-map: 0.6.1 - dev: false - /resolve.exports@1.1.1: - resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} - engines: {node: '>=10'} + resolve.exports@1.1.1: {} - /resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} - engines: {node: '>=10'} + resolve.exports@2.0.2: {} - /resolve@1.12.0: - resolution: {integrity: sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==} + resolve@1.12.0: dependencies: path-parse: 1.0.7 - dev: true - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true + resolve@1.22.8: dependencies: is-core-module: 2.15.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - /resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true + resolve@2.0.0-next.5: dependencies: is-core-module: 2.15.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + restore-cursor@3.1.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - /retry-request@7.0.2: - resolution: {integrity: sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==} - engines: {node: '>=14'} + retry-request@7.0.2: dependencies: '@types/request': 2.48.12 extend: 3.0.2 @@ -22196,58 +27641,30 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false - /retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} + retry@0.12.0: {} - /retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} - dev: false + retry@0.13.1: {} - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + reusify@1.0.4: {} - /rgb-regex@1.0.1: - resolution: {integrity: sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w==} - dev: true + rgb-regex@1.0.1: {} - /rgba-regex@1.0.0: - resolution: {integrity: sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg==} - dev: true + rgba-regex@1.0.0: {} - /rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true + rimraf@2.7.1: dependencies: glob: 7.2.3 - dev: true - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true + rimraf@3.0.2: dependencies: glob: 7.2.3 - /rimraf@5.0.9: - resolution: {integrity: sha512-3i7b8OcswU6CpU8Ej89quJD4O98id7TtVM5U4Mybh84zQXdrFmDLouWBEEaD/QfO3gDDfH+AGFCGsR7kngzQnA==} - engines: {node: 14 >=14.20 || 16 >=16.20 || >=18} - hasBin: true + rimraf@5.0.9: dependencies: glob: 10.4.5 - dev: false - /rollup-plugin-babel@4.4.0(@babel/core@7.25.2)(rollup@1.32.1): - resolution: {integrity: sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==} - deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-babel. - peerDependencies: - '@babel/core': 7 || ^7.0.0-rc.2 - rollup: '>=0.60.0 <3' + rollup-plugin-babel@4.4.0(@babel/core@7.25.2)(rollup@1.32.1): dependencies: '@babel/core': 7.25.2 '@babel/helper-module-imports': 7.24.7 @@ -22255,24 +27672,17 @@ packages: rollup-pluginutils: 2.8.2 transitivePeerDependencies: - supports-color - dev: true - /rollup-plugin-bundle-size@1.0.3: - resolution: {integrity: sha512-aWj0Pvzq90fqbI5vN1IvUrlf4utOqy+AERYxwWjegH1G8PzheMnrRIgQ5tkwKVtQMDP0bHZEACW/zLDF+XgfXQ==} + rollup-plugin-bundle-size@1.0.3: dependencies: chalk: 1.1.3 maxmin: 2.1.0 - dev: true - /rollup-plugin-es3@1.1.0: - resolution: {integrity: sha512-jTMqQgMZ/tkjRW4scf4ln5c0OiTSi+Lx/IEyFd41ldgGoLvvg9AQxmVOl93+KaoyB7XRYToYjiHDvO40NPF/fA==} + rollup-plugin-es3@1.1.0: dependencies: magic-string: 0.22.5 - dev: true - /rollup-plugin-postcss@2.9.0: - resolution: {integrity: sha512-Y7qDwlqjZMBexbB1kRJf+jKIQL8HR6C+ay53YzN+nNJ64hn1PNZfBE3c61hFUhD//zrMwmm7uBW30RuTi+CD0w==} - engines: {node: '>=10'} + rollup-plugin-postcss@2.9.0: dependencies: chalk: 4.1.2 concat-with-sourcemaps: 1.1.0 @@ -22287,13 +27697,9 @@ packages: resolve: 1.22.8 rollup-pluginutils: 2.8.2 safe-identifier: 0.4.2 - style-inject: 0.3.0 - dev: true - - /rollup-plugin-smart-asset@2.1.2(rollup@1.32.1): - resolution: {integrity: sha512-Y/gD3abliw3F20uY6ILpmH6sokXKntuTFKvDdLEJxHFcyQRsTb12u2KbsapqPZDa4JN/Nxx7BslYlZ/KmYAtPg==} - peerDependencies: - rollup: '>0.60' + style-inject: 0.3.0 + + rollup-plugin-smart-asset@2.1.2(rollup@1.32.1): dependencies: big.js: 6.2.1 magic-string: 0.25.9 @@ -22301,13 +27707,8 @@ packages: mkdirp: 1.0.4 rollup: 1.32.1 rollup-pluginutils: 2.8.2 - dev: true - /rollup-plugin-terser@5.3.1(rollup@1.32.1): - resolution: {integrity: sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w==} - deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser - peerDependencies: - rollup: '>=0.66.0 <3' + rollup-plugin-terser@5.3.1(rollup@1.32.1): dependencies: '@babel/code-frame': 7.24.7 jest-worker: 24.9.0 @@ -22315,26 +27716,16 @@ packages: rollup-pluginutils: 2.8.2 serialize-javascript: 4.0.0 terser: 4.8.1 - dev: true - /rollup-plugin-terser@7.0.2(rollup@2.79.1): - resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} - deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser - peerDependencies: - rollup: ^2.0.0 + rollup-plugin-terser@7.0.2(rollup@2.79.1): dependencies: '@babel/code-frame': 7.24.7 jest-worker: 26.6.2 rollup: 2.79.1 serialize-javascript: 4.0.0 terser: 5.31.3 - dev: false - /rollup-plugin-typescript2@0.25.3(rollup@1.32.1)(typescript@3.9.10): - resolution: {integrity: sha512-ADkSaidKBovJmf5VBnZBZe+WzaZwofuvYdzGAKTN/J4hN7QJCFYAq7IrH9caxlru6T5qhX41PNFS1S4HqhsGQg==} - peerDependencies: - rollup: '>=1.26.3' - typescript: '>=2.4.0' + rollup-plugin-typescript2@0.25.3(rollup@1.32.1)(typescript@3.9.10): dependencies: find-cache-dir: 3.3.2 fs-extra: 8.1.0 @@ -22343,57 +27734,34 @@ packages: rollup-pluginutils: 2.8.1 tslib: 1.10.0 typescript: 3.9.10 - dev: true - /rollup-pluginutils@2.8.1: - resolution: {integrity: sha512-J5oAoysWar6GuZo0s+3bZ6sVZAC0pfqKz68De7ZgDi5z63jOVZn1uJL/+z1jeKHNbGII8kAyHF5q8LnxSX5lQg==} + rollup-pluginutils@2.8.1: dependencies: estree-walker: 0.6.1 - dev: true - /rollup-pluginutils@2.8.2: - resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} + rollup-pluginutils@2.8.2: dependencies: estree-walker: 0.6.1 - dev: true - /rollup@1.32.1: - resolution: {integrity: sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==} - hasBin: true + rollup@1.32.1: dependencies: '@types/estree': 1.0.5 '@types/node': 18.19.42 acorn: 7.4.1 - dev: true - /rollup@2.78.0: - resolution: {integrity: sha512-4+YfbQC9QEVvKTanHhIAFVUFSRsezvQF8vFOJwtGfb9Bb+r014S+qryr9PSmw8x6sMnPkmFBGAvIFVQxvJxjtg==} - engines: {node: '>=10.0.0'} - hasBin: true + rollup@2.78.0: optionalDependencies: fsevents: 2.3.3 - dev: false - /rollup@2.79.1: - resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} - engines: {node: '>=10.0.0'} - hasBin: true + rollup@2.79.1: optionalDependencies: fsevents: 2.3.3 - dev: false - /rollup@3.29.4: - resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true + rollup@3.29.4: optionalDependencies: fsevents: 2.3.3 - dev: true - /rollup@4.19.1: - resolution: {integrity: sha512-K5vziVlg7hTpYfFBI+91zHBEMo6jafYXpkMlqZjg7/zhIG9iHqazBf4xz9AVdjS9BruRn280ROqLI7G3OFRIlw==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true + rollup@4.19.1: dependencies: '@types/estree': 1.0.5 optionalDependencies: @@ -22414,215 +27782,127 @@ packages: '@rollup/rollup-win32-ia32-msvc': 4.19.1 '@rollup/rollup-win32-x64-msvc': 4.19.1 fsevents: 2.3.3 - dev: true - /rtl-css-js@1.16.1: - resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} + rtl-css-js@1.16.1: dependencies: '@babel/runtime': 7.25.0 - dev: false - /run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} + run-async@2.4.1: {} - /run-async@3.0.0: - resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} - engines: {node: '>=0.12.0'} - dev: true + run-async@3.0.0: {} - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - /rusha@0.8.14: - resolution: {integrity: sha512-cLgakCUf6PedEu15t8kbsjnwIFFR2D4RfL+W3iWFJ4iac7z4B0ZI8fxy4R3J956kAI68HclCFGL8MPoUVC3qVA==} - dev: false + rusha@0.8.14: {} - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + rxjs@7.8.1: dependencies: tslib: 2.6.3 - /sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} + sade@1.8.1: dependencies: mri: 1.2.0 - dev: true - /safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} + safe-array-concat@1.1.2: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 has-symbols: 1.0.3 isarray: 2.0.5 - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.1.2: {} - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-buffer@5.2.1: {} - /safe-identifier@0.4.2: - resolution: {integrity: sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==} - dev: true + safe-identifier@0.4.2: {} - /safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} + safe-regex-test@1.0.3: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-regex: 1.1.4 - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + safer-buffer@2.1.2: {} - /sanitize.css@13.0.0: - resolution: {integrity: sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==} - dev: false + sanitize.css@13.0.0: {} - /sass-loader@12.6.0(webpack@5.93.0): - resolution: {integrity: sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==} - engines: {node: '>= 12.13.0'} - peerDependencies: - fibers: '>= 3.1.0' - node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - sass: ^1.3.0 - sass-embedded: '*' - webpack: ^5.0.0 - peerDependenciesMeta: - fibers: - optional: true - node-sass: - optional: true - sass: - optional: true - sass-embedded: - optional: true + sass-loader@12.6.0(webpack@5.93.0): dependencies: klona: 2.0.6 neo-async: 2.6.2 webpack: 5.93.0(webpack-cli@5.1.4) - dev: false - /sax@1.2.4: - resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + sax@1.2.4: {} - /sax@1.4.1: - resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} - requiresBuild: true - dev: true + sax@1.4.1: optional: true - /saxes@5.0.1: - resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} - engines: {node: '>=10'} + saxes@5.0.1: dependencies: xmlchars: 2.2.0 - dev: false - /scheduler@0.20.2: - resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==} + scheduler@0.20.2: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 - dev: false - /scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + scheduler@0.23.2: dependencies: loose-envify: 1.4.0 - /schema-utils@2.7.0: - resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==} - engines: {node: '>= 8.9.0'} + schema-utils@2.7.0: dependencies: '@types/json-schema': 7.0.15 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - dev: false - /schema-utils@2.7.1: - resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} - engines: {node: '>= 8.9.0'} + schema-utils@2.7.1: dependencies: '@types/json-schema': 7.0.15 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - dev: false - /schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} + schema-utils@3.3.0: dependencies: '@types/json-schema': 7.0.15 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - /schema-utils@4.2.0: - resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} - engines: {node: '>= 12.13.0'} + schema-utils@4.2.0: dependencies: '@types/json-schema': 7.0.15 ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) ajv-keywords: 5.1.0(ajv@8.12.0) - /scoped-regex@2.1.0: - resolution: {integrity: sha512-g3WxHrqSWCZHGHlSrF51VXFdjImhwvH8ZO/pryFH56Qi0cDsZfylQa/t0jCzVQFNbNvM00HfHjkDPEuarKDSWQ==} - engines: {node: '>=8'} + scoped-regex@2.1.0: {} - /screenfull@5.2.0: - resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} - engines: {node: '>=0.10.0'} - dev: false + screenfull@5.2.0: {} - /scroll-into-view-if-needed@3.1.0: - resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} + scroll-into-view-if-needed@3.1.0: dependencies: compute-scroll-into-view: 3.1.0 - /select-hose@2.0.0: - resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} - dev: false + select-hose@2.0.0: {} - /selfsigned@2.4.1: - resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} - engines: {node: '>=10'} + selfsigned@2.4.1: dependencies: '@types/node-forge': 1.3.11 node-forge: 1.3.1 - dev: false - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true + semver@5.7.2: {} - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true + semver@6.3.1: {} - /semver@7.3.5: - resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} - engines: {node: '>=10'} - hasBin: true + semver@7.3.5: dependencies: lru-cache: 6.0.0 - dev: true - /semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} - engines: {node: '>=10'} - hasBin: true + semver@7.6.3: {} - /send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} + send@0.18.0: dependencies: debug: 2.6.9 depd: 2.0.0 @@ -22640,19 +27920,15 @@ packages: transitivePeerDependencies: - supports-color - /serialize-javascript@4.0.0: - resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} + serialize-javascript@4.0.0: dependencies: randombytes: 2.1.0 - /serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 - /serve-index@1.9.1: - resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} - engines: {node: '>= 0.8.0'} + serve-index@1.9.1: dependencies: accepts: 1.3.8 batch: 0.6.1 @@ -22663,11 +27939,8 @@ packages: parseurl: 1.3.3 transitivePeerDependencies: - supports-color - dev: false - /serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} + serve-static@1.15.0: dependencies: encodeurl: 1.0.2 escape-html: 1.0.3 @@ -22676,12 +27949,9 @@ packages: transitivePeerDependencies: - supports-color - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + set-blocking@2.0.0: {} - /set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 @@ -22690,93 +27960,57 @@ packages: gopd: 1.0.1 has-property-descriptors: 1.0.2 - /set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + set-function-name@2.0.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - /set-harmonic-interval@1.0.1: - resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==} - engines: {node: '>=6.9'} - dev: false + set-harmonic-interval@1.0.1: {} - /setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - dev: false + setimmediate@1.0.5: {} - /setprototypeof@1.1.0: - resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} - dev: false + setprototypeof@1.1.0: {} - /setprototypeof@1.1.1: - resolution: {integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==} - dev: true + setprototypeof@1.1.1: {} - /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + setprototypeof@1.2.0: {} - /shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} + shallow-clone@3.0.1: dependencies: kind-of: 6.0.3 - /shallowequal@1.1.0: - resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} - dev: false + shallowequal@1.1.0: {} - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + shebang-regex@3.0.0: {} - /shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - dev: false + shell-quote@1.8.1: {} - /shelljs@0.8.5: - resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} - engines: {node: '>=4'} - hasBin: true + shelljs@0.8.5: dependencies: glob: 7.2.3 interpret: 1.4.0 rechoir: 0.6.2 - /side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} + side-channel@1.0.6: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 object-inspect: 1.13.2 - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@3.0.7: {} - /signal-exit@4.0.2: - resolution: {integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==} - engines: {node: '>=14'} - dev: true + signal-exit@4.0.2: {} - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + signal-exit@4.1.0: {} - /sigstore@1.9.0: - resolution: {integrity: sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true + sigstore@1.9.0: dependencies: '@sigstore/bundle': 1.1.0 '@sigstore/protobuf-specs': 0.2.1 @@ -22786,92 +28020,59 @@ packages: transitivePeerDependencies: - supports-color - /simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - dev: false + simple-concat@1.0.1: {} - /simple-get@3.1.1: - resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} + simple-get@3.1.1: dependencies: decompress-response: 4.2.1 once: 1.4.0 simple-concat: 1.0.1 - dev: false - /simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + simple-get@4.0.1: dependencies: decompress-response: 6.0.0 once: 1.4.0 simple-concat: 1.0.1 - dev: false - /simple-git@3.25.0: - resolution: {integrity: sha512-KIY5sBnzc4yEcJXW7Tdv4viEz8KyG+nU0hay+DWZasvdFOYKeUZ6Xc25LUHHjw0tinPT7O1eY6pzX7pRT1K8rw==} + simple-git@3.25.0: dependencies: '@kwsites/file-exists': 1.1.1 '@kwsites/promise-deferred': 1.1.1 debug: 4.3.6(supports-color@5.5.0) transitivePeerDependencies: - supports-color - dev: false - /simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 - /simple-update-notifier@2.0.0: - resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} - engines: {node: '>=10'} + simple-update-notifier@2.0.0: dependencies: semver: 7.6.3 - dev: true - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + sisteransi@1.0.5: {} - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + slash@3.0.0: {} - /slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - dev: false + slash@4.0.0: {} - /slash@5.1.0: - resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} - engines: {node: '>=14.16'} - dev: true + slash@5.1.0: {} - /slick@1.12.2: - resolution: {integrity: sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==} - dev: false + slick@1.12.2: {} - /smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + smart-buffer@4.2.0: {} - /smob@1.5.0: - resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} - dev: true + smob@1.5.0: {} - /snappyjs@0.6.1: - resolution: {integrity: sha512-YIK6I2lsH072UE0aOFxxY1dPDCS43I5ktqHpeAsuLNYWkE5pGxRGWfDM4/vSUfNzXjC1Ivzt3qx31PCLmc9yqg==} - dev: false + snappyjs@0.6.1: {} - /sockjs@0.3.24: - resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + sockjs@0.3.24: dependencies: faye-websocket: 0.11.4 uuid: 8.3.2 websocket-driver: 0.7.4 - dev: false - /socks-proxy-agent@6.2.1: - resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} - engines: {node: '>= 10'} + socks-proxy-agent@6.2.1: dependencies: agent-base: 6.0.2 debug: 4.3.6(supports-color@5.5.0) @@ -22879,9 +28080,7 @@ packages: transitivePeerDependencies: - supports-color - /socks-proxy-agent@7.0.0: - resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} - engines: {node: '>= 10'} + socks-proxy-agent@7.0.0: dependencies: agent-base: 6.0.2 debug: 4.3.6(supports-color@5.5.0) @@ -22889,106 +28088,69 @@ packages: transitivePeerDependencies: - supports-color - /socks@2.8.3: - resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + socks@2.8.3: dependencies: ip-address: 9.0.5 smart-buffer: 4.2.0 - /sort-keys@4.2.0: - resolution: {integrity: sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==} - engines: {node: '>=8'} + sort-keys@4.2.0: dependencies: is-plain-obj: 2.1.0 - /source-list-map@2.0.1: - resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} - dev: false + source-list-map@2.0.1: {} - /source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} + source-map-js@1.2.0: {} - /source-map-loader@3.0.2(webpack@5.93.0): - resolution: {integrity: sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^5.0.0 + source-map-loader@3.0.2(webpack@5.93.0): dependencies: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.2.0 webpack: 5.93.0(webpack-cli@5.1.4) - dev: false - /source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + source-map-support@0.5.13: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - /source-map@0.5.6: - resolution: {integrity: sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==} - engines: {node: '>=0.10.0'} - dev: false + source-map@0.5.6: {} - /source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - dev: true + source-map@0.5.7: {} - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + source-map@0.6.1: {} - /source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} + source-map@0.7.4: {} - /source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} + source-map@0.8.0-beta.0: dependencies: whatwg-url: 7.1.0 - dev: false - /sourcemap-codec@1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - deprecated: Please use @jridgewell/sourcemap-codec instead + sourcemap-codec@1.4.8: {} - /sparse-bitfield@3.0.3: - resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} + sparse-bitfield@3.0.3: dependencies: memory-pager: 1.5.0 - dev: false - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.18 - /spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + spdx-exceptions@2.5.0: {} - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 spdx-license-ids: 3.0.18 - /spdx-license-ids@3.0.18: - resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==} + spdx-license-ids@3.0.18: {} - /spdy-transport@3.0.0: - resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + spdy-transport@3.0.0: dependencies: debug: 4.3.6(supports-color@5.5.0) detect-node: 2.1.0 @@ -22998,11 +28160,8 @@ packages: wbuf: 1.7.3 transitivePeerDependencies: - supports-color - dev: false - /spdy@4.0.2: - resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} - engines: {node: '>=6.0.0'} + spdy@4.0.2: dependencies: debug: 4.3.6(supports-color@5.5.0) handle-thing: 2.0.1 @@ -23011,253 +28170,161 @@ packages: spdy-transport: 3.0.0 transitivePeerDependencies: - supports-color - dev: false - /spex@3.3.0: - resolution: {integrity: sha512-VNiXjFp6R4ldPbVRYbpxlD35yRHceecVXlct1J4/X80KuuPnW2AXMq3sGwhnJOhKkUsOxAT6nRGfGE5pocVw5w==} - engines: {node: '>=10.0.0'} - dev: false + spex@3.3.0: {} - /split-ca@1.0.1: - resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==} - dev: true + split-ca@1.0.1: {} - /split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} + split2@4.2.0: {} - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sprintf-js@1.0.3: {} - /sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + sprintf-js@1.1.3: {} - /ssh-remote-port-forward@1.0.4: - resolution: {integrity: sha512-x0LV1eVDwjf1gmG7TTnfqIzf+3VPRz7vrNIjX6oYLbeCrf/PeVY6hkT68Mg+q02qXxQhrLjB0jfgvhevoCRmLQ==} + ssh-remote-port-forward@1.0.4: dependencies: '@types/ssh2': 0.5.52 ssh2: 1.15.0 - dev: true - /ssh2@1.15.0: - resolution: {integrity: sha512-C0PHgX4h6lBxYx7hcXwu3QWdh4tg6tZZsTfXcdvc5caW/EMxaB4H9dWsl7qk+F7LAW762hp8VbXOX7x4xUYvEw==} - engines: {node: '>=10.16.0'} - requiresBuild: true + ssh2@1.15.0: dependencies: asn1: 0.2.6 bcrypt-pbkdf: 1.0.2 optionalDependencies: cpu-features: 0.0.10 nan: 2.20.0 - dev: true - /ssri@10.0.6: - resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ssri@10.0.6: dependencies: minipass: 7.1.2 - /ssri@8.0.1: - resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} - engines: {node: '>= 8'} + ssri@8.0.1: dependencies: minipass: 3.3.6 - /ssri@9.0.1: - resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + ssri@9.0.1: dependencies: minipass: 3.3.6 - /stable-hash@0.0.3: - resolution: {integrity: sha512-c63fvNCQ7ip1wBfPv54MflMA5L6OE5J0p6Fg13IpKft4JAFoNal8+s/jtJ8PibrwqXm4onnbeQsADs8k0NQGUA==} - dev: false + stable-hash@0.0.3: {} - /stable@0.1.8: - resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} - deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + stable@0.1.8: {} - /stack-generator@2.0.10: - resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} + stack-generator@2.0.10: dependencies: stackframe: 1.3.4 - dev: false - /stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} + stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 - /stackframe@1.3.4: - resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} - dev: false + stackframe@1.3.4: {} - /stacktrace-gps@3.1.2: - resolution: {integrity: sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==} + stacktrace-gps@3.1.2: dependencies: source-map: 0.5.6 stackframe: 1.3.4 - dev: false - /stacktrace-js@2.0.2: - resolution: {integrity: sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==} + stacktrace-js@2.0.2: dependencies: error-stack-parser: 2.1.4 stack-generator: 2.0.10 stacktrace-gps: 3.1.2 - dev: false - /stacktrace-parser@0.1.10: - resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} - engines: {node: '>=6'} + stacktrace-parser@0.1.10: dependencies: type-fest: 0.7.1 - dev: false - /standard-as-callback@2.1.0: - resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + standard-as-callback@2.1.0: {} - /stat-mode@0.3.0: - resolution: {integrity: sha512-QjMLR0A3WwFY2aZdV0okfFEJB5TRjkggXZjxP3A1RsWsNHNu3YPv8btmtc6iCFZ0Rul3FE93OYogvhOUClU+ng==} - dev: true + stat-mode@0.3.0: {} - /state-local@1.0.7: - resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} - dev: false + state-local@1.0.7: {} - /static-eval@2.0.2: - resolution: {integrity: sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==} + static-eval@2.0.2: dependencies: escodegen: 1.14.3 - dev: false - /statuses@1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} + statuses@1.5.0: {} - /statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} + statuses@2.0.1: {} - /stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} + stop-iteration-iterator@1.0.0: dependencies: internal-slot: 1.0.7 - /stopwatch-node@1.1.0: - resolution: {integrity: sha512-TpRTztFjiq/B5wn84oKK0YHHtprgrC8pLOUkqVU+MN+2DgdBMaEIeSyGeAn2n+7mT9zrfJyhM33Yw4j/rRV2Bg==} - dev: false + stopwatch-node@1.1.0: {} - /stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - dev: false + stream-chain@2.2.5: {} - /stream-events@1.0.5: - resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==} + stream-events@1.0.5: dependencies: stubs: 3.0.0 - dev: false - /stream-json@1.8.0: - resolution: {integrity: sha512-HZfXngYHUAr1exT4fxlbc1IOce1RYxp2ldeaf97LYCOPSoOqY/1Psp7iGvpb+6JIOgkra9zDYnPX01hGAHzEPw==} + stream-json@1.8.0: dependencies: stream-chain: 2.2.5 - dev: false - /stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - dev: false + stream-shift@1.0.3: {} - /stream-to-array@2.3.0: - resolution: {integrity: sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==} + stream-to-array@2.3.0: dependencies: any-promise: 1.3.0 - dev: true - /stream-to-promise@2.2.0: - resolution: {integrity: sha512-HAGUASw8NT0k8JvIVutB2Y/9iBk7gpgEyAudXwNJmZERdMITGdajOa4VJfD/kNiA3TppQpTP4J+CtcHwdzKBAw==} + stream-to-promise@2.2.0: dependencies: any-promise: 1.3.0 end-of-stream: 1.1.0 stream-to-array: 2.3.0 - dev: true - /streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - dev: false + streamsearch@1.1.0: {} - /string-convert@0.2.1: - resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==} + string-convert@0.2.1: {} - /string-hash@1.1.3: - resolution: {integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==} - dev: true + string-hash@1.1.3: {} - /string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} + string-length@4.0.2: dependencies: char-regex: 1.0.2 strip-ansi: 6.0.1 - /string-length@5.0.1: - resolution: {integrity: sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==} - engines: {node: '>=12.20'} + string-length@5.0.1: dependencies: char-regex: 2.0.1 strip-ansi: 7.1.0 - dev: false - /string-natural-compare@3.0.1: - resolution: {integrity: sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==} - dev: false + string-natural-compare@3.0.1: {} - /string-width@1.0.2: - resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} - engines: {node: '>=0.10.0'} + string-width@1.0.2: dependencies: code-point-at: 1.1.0 is-fullwidth-code-point: 1.0.0 strip-ansi: 3.0.1 - dev: false - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 - /string-width@7.2.0: - resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} - engines: {node: '>=18'} + string-width@7.2.0: dependencies: emoji-regex: 10.3.0 get-east-asian-width: 1.2.0 strip-ansi: 7.1.0 - dev: false - /string.prototype.includes@2.0.0: - resolution: {integrity: sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==} + string.prototype.includes@2.0.0: dependencies: define-properties: 1.2.1 es-abstract: 1.23.3 - /string.prototype.matchall@4.0.11: - resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} - engines: {node: '>= 0.4'} + string.prototype.matchall@4.0.11: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -23272,197 +28339,121 @@ packages: set-function-name: 2.0.2 side-channel: 1.0.6 - /string.prototype.repeat@1.0.0: - resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 es-abstract: 1.23.3 - /string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} + string.prototype.trim@1.2.9: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.0.0 - /string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + string.prototype.trimend@1.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - /string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} + string.prototype.trimstart@1.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - /stringify-object@3.3.0: - resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} - engines: {node: '>=4'} + stringify-object@3.3.0: dependencies: get-own-enumerable-property-symbols: 3.0.2 is-obj: 1.0.1 is-regexp: 1.0.0 - dev: false - /strip-ansi@3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} + strip-ansi@3.0.1: dependencies: ansi-regex: 2.1.1 - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + strip-ansi@7.1.0: dependencies: ansi-regex: 6.0.1 - /strip-bom-buf@1.0.0: - resolution: {integrity: sha512-1sUIL1jck0T1mhOLP2c696BIznzT525Lkub+n4jjMHjhjhoAQA6Ye659DxdlZBr0aLDMQoTxKIpnlqxgtwjsuQ==} - engines: {node: '>=4'} + strip-bom-buf@1.0.0: dependencies: is-utf8: 0.2.1 - /strip-bom-stream@2.0.0: - resolution: {integrity: sha512-yH0+mD8oahBZWnY43vxs4pSinn8SMKAdml/EOGBewoe1Y0Eitd0h2Mg3ZRiXruUW6L4P+lvZiEgbh0NgUGia1w==} - engines: {node: '>=0.10.0'} + strip-bom-stream@2.0.0: dependencies: first-chunk-stream: 2.0.0 strip-bom: 2.0.0 - /strip-bom@2.0.0: - resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} - engines: {node: '>=0.10.0'} + strip-bom@2.0.0: dependencies: is-utf8: 0.2.1 - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} + strip-bom@3.0.0: {} - /strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} + strip-bom@4.0.0: {} - /strip-comments@2.0.1: - resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} - engines: {node: '>=10'} - dev: false + strip-comments@2.0.1: {} - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} + strip-final-newline@2.0.0: {} - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} + strip-indent@3.0.0: dependencies: min-indent: 1.0.1 - dev: true - /strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} + strip-json-comments@2.0.1: {} - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} + strip-json-comments@3.1.1: {} - /stripe@11.18.0: - resolution: {integrity: sha512-OUA32uhNoSoM6wOodyFbV+3IBCoO140uzdXmBArQ0S88D4EbH91xl2v+Ml1sKalcFKUBadHLeHfU/p9AbsOfGw==} - engines: {node: '>=12.*'} + stripe@11.18.0: dependencies: '@types/node': 18.19.42 qs: 6.12.3 - /strnum@1.0.5: - resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} - dev: false + strnum@1.0.5: {} - /stubs@3.0.0: - resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} - dev: false + stubs@3.0.0: {} - /style-inject@0.3.0: - resolution: {integrity: sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==} - dev: true + style-inject@0.3.0: {} - /style-loader@3.3.4(webpack@5.93.0): - resolution: {integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^5.0.0 + style-loader@3.3.4(webpack@5.93.0): dependencies: webpack: 5.93.0(webpack-cli@5.1.4) - dev: false - /styled-jsx@5.1.1(@babel/core@7.25.2)(react@18.3.1): - resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true + styled-jsx@5.1.1(@babel/core@7.25.2)(react@18.3.1): dependencies: '@babel/core': 7.25.2 client-only: 0.0.1 react: 18.3.1 - dev: false - /stylehacks@4.0.3: - resolution: {integrity: sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==} - engines: {node: '>=6.9.0'} + stylehacks@4.0.3: dependencies: browserslist: 4.23.2 postcss: 7.0.39 postcss-selector-parser: 3.1.2 - dev: true - /stylehacks@5.1.1(postcss@8.4.41): - resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + stylehacks@5.1.1(postcss@8.4.41): dependencies: browserslist: 4.23.2 postcss: 8.4.41 postcss-selector-parser: 6.1.1 - dev: false - /stylis@4.3.2: - resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==} + stylis@4.3.2: {} - /sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.5 commander: 4.1.1 @@ -23472,62 +28463,38 @@ packages: pirates: 4.0.6 ts-interface-checker: 0.1.13 - /supports-color@2.0.0: - resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} - engines: {node: '>=0.8.0'} - dev: true + supports-color@2.0.0: {} - /supports-color@3.2.3: - resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} - engines: {node: '>=0.8.0'} + supports-color@3.2.3: dependencies: has-flag: 1.0.0 - dev: true - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - /supports-color@6.1.0: - resolution: {integrity: sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==} - engines: {node: '>=6'} + supports-color@6.1.0: dependencies: has-flag: 3.0.0 - dev: true - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + supports-color@8.1.1: dependencies: has-flag: 4.0.0 - /supports-hyperlinks@2.3.0: - resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} - engines: {node: '>=8'} + supports-hyperlinks@2.3.0: dependencies: has-flag: 4.0.0 supports-color: 7.2.0 - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + supports-preserve-symlinks-flag@1.0.0: {} - /svg-parser@2.0.4: - resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + svg-parser@2.0.4: {} - /svgo@1.3.2: - resolution: {integrity: sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==} - engines: {node: '>=4.0.0'} - deprecated: This SVGO version is no longer supported. Upgrade to v2.x.x. - hasBin: true + svgo@1.3.2: dependencies: chalk: 2.4.2 coa: 2.0.2 @@ -23543,10 +28510,7 @@ packages: unquote: 1.1.1 util.promisify: 1.0.1 - /svgo@2.8.0: - resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} - engines: {node: '>=10.13.0'} - hasBin: true + svgo@2.8.0: dependencies: '@trysound/sax': 0.2.0 commander: 7.2.0 @@ -23555,16 +28519,10 @@ packages: csso: 4.2.0 picocolors: 1.0.1 stable: 0.1.8 - dev: false - /symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - dev: false + symbol-tree@3.2.4: {} - /tailwindcss@3.4.7(ts-node@10.9.2): - resolution: {integrity: sha512-rxWZbe87YJb4OcSopb7up2Ba4U82BoiSGUdoDr3Ydrg9ckxFS/YWsvhN323GMcddgU65QRy7JndC7ahhInhvlQ==} - engines: {node: '>=14.0.0'} - hasBin: true + tailwindcss@3.4.7(ts-node@10.9.2): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -23591,35 +28549,25 @@ packages: transitivePeerDependencies: - ts-node - /tapable@1.1.3: - resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} - engines: {node: '>=6'} - dev: false + tapable@1.1.3: {} - /tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} + tapable@2.2.1: {} - /tar-fs@2.0.1: - resolution: {integrity: sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==} + tar-fs@2.0.1: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 pump: 3.0.0 tar-stream: 2.2.0 - dev: true - /tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + tar-fs@2.1.1: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 pump: 3.0.0 tar-stream: 2.2.0 - /tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} + tar-stream@2.2.0: dependencies: bl: 4.1.0 end-of-stream: 1.4.4 @@ -23627,9 +28575,7 @@ packages: inherits: 2.0.4 readable-stream: 3.6.2 - /tar@4.4.18: - resolution: {integrity: sha512-ZuOtqqmkV9RE1+4odd+MhBpibmCxNP6PJhH/h2OqNuotTX7/XHPZQJv2pKvWMplFH9SIZZhitehh6vBH6LO8Pg==} - engines: {node: '>=4.5'} + tar@4.4.18: dependencies: chownr: 1.1.4 fs-minipass: 1.2.7 @@ -23638,11 +28584,8 @@ packages: mkdirp: 0.5.6 safe-buffer: 5.2.1 yallist: 3.1.1 - dev: true - /tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} + tar@6.2.1: dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 @@ -23651,9 +28594,7 @@ packages: mkdirp: 1.0.4 yallist: 4.0.0 - /tar@7.4.3: - resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} - engines: {node: '>=18'} + tar@7.4.3: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 @@ -23661,17 +28602,12 @@ packages: minizlib: 3.0.1 mkdirp: 3.0.1 yallist: 5.0.0 - dev: false - /tdigest@0.1.2: - resolution: {integrity: sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==} + tdigest@0.1.2: dependencies: bintrees: 1.0.2 - dev: false - /teeny-request@9.0.0: - resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==} - engines: {node: '>=14'} + teeny-request@9.0.0: dependencies: http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 @@ -23681,45 +28617,22 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false - /temp-dir@2.0.0: - resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} - engines: {node: '>=8'} - dev: false + temp-dir@2.0.0: {} - /tempy@0.6.0: - resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} - engines: {node: '>=10'} + tempy@0.6.0: dependencies: is-stream: 2.0.1 temp-dir: 2.0.0 type-fest: 0.16.0 unique-string: 2.0.0 - dev: false - /terminal-link@2.1.1: - resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} - engines: {node: '>=8'} + terminal-link@2.1.1: dependencies: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - /terser-webpack-plugin@5.3.10(webpack@5.93.0): - resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true + terser-webpack-plugin@5.3.10(webpack@5.93.0): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 @@ -23728,38 +28641,27 @@ packages: terser: 5.31.3 webpack: 5.93.0(webpack-cli@5.1.4) - /terser@4.8.1: - resolution: {integrity: sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==} - engines: {node: '>=6.0.0'} - hasBin: true + terser@4.8.1: dependencies: acorn: 8.12.1 commander: 2.20.3 source-map: 0.6.1 source-map-support: 0.5.21 - dev: true - /terser@5.31.3: - resolution: {integrity: sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==} - engines: {node: '>=10'} - hasBin: true + terser@5.31.3: dependencies: '@jridgewell/source-map': 0.3.6 acorn: 8.12.1 commander: 2.20.3 source-map-support: 0.5.21 - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} + test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 minimatch: 3.1.2 - /testcontainers@9.12.0: - resolution: {integrity: sha512-zmjLTAUqCiDvhDq7TCwcyhI3m/cXXKGnhyLLJ9pgh53VgG9O+P+opX1pIx28aYTUQ7Yu6b5sJf0xoIuxoiclWg==} - engines: {node: '>= 10.16'} + testcontainers@9.12.0: dependencies: '@balena/dockerignore': 1.0.2 '@types/archiver': 5.3.4 @@ -23780,235 +28682,118 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: true - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + text-table@0.2.0: {} - /textextensions@5.16.0: - resolution: {integrity: sha512-7D/r3s6uPZyU//MCYrX6I14nzauDwJ5CxazouuRGNuvSCihW87ufN6VLoROLCrHg6FblLuJrT6N2BVaPVzqElw==} - engines: {node: '>=0.8'} + textextensions@5.16.0: {} - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} + thenify-all@1.6.0: dependencies: thenify: 3.3.1 - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thenify@3.3.1: dependencies: any-promise: 1.3.0 - /throat@6.0.2: - resolution: {integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==} - dev: false + throat@6.0.2: {} - /throttle-debounce@3.0.1: - resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} - engines: {node: '>=10'} - dev: false + throttle-debounce@3.0.1: {} - /throttle-debounce@5.0.2: - resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==} - engines: {node: '>=12.22'} + throttle-debounce@5.0.2: {} - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + through@2.3.8: {} - /thunky@1.1.0: - resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} - dev: false + thunky@1.1.0: {} - /time-span@4.0.0: - resolution: {integrity: sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==} - engines: {node: '>=10'} + time-span@4.0.0: dependencies: convert-hrtime: 3.0.0 - dev: true - /timezones-list@3.0.3: - resolution: {integrity: sha512-C+Vdvvj2c1xB6pu81pOX8geo6mrk/QsudFVlTVQET7QQwu8WAIyhDNeCrK5grU7EMzmbKLWqz7uU6dN8fvQvPQ==} - dev: false + timezones-list@3.0.3: {} - /timsort@0.3.0: - resolution: {integrity: sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==} - dev: true + timsort@0.3.0: {} - /tiny-glob@0.2.9: - resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} + tiny-glob@0.2.9: dependencies: globalyzer: 0.1.0 globrex: 0.1.2 - dev: true - /tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - dev: false + tiny-invariant@1.3.3: {} - /tiny-lru@11.2.6: - resolution: {integrity: sha512-0PU3c9PjMnltZaFo2sGYv/nnJsMjG0Cxx8X6FXHPPGjFyoo1SJDxvUXW1207rdiSxYizf31roo+GrkIByQeZoA==} - engines: {node: '>=12'} - dev: false + tiny-lru@11.2.6: {} - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 - /tmp@0.2.3: - resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} - engines: {node: '>=14.14'} - dev: true + tmp@0.2.3: {} - /tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + tmpl@1.0.5: {} - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} + to-fast-properties@2.0.0: {} - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - /toggle-selection@1.0.6: - resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + toggle-selection@1.0.6: {} - /toidentifier@1.0.0: - resolution: {integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==} - engines: {node: '>=0.6'} - dev: true + toidentifier@1.0.0: {} - /toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} + toidentifier@1.0.1: {} - /touch@3.1.1: - resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} - hasBin: true - dev: true + touch@3.1.1: {} - /tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} + tough-cookie@4.1.4: dependencies: psl: 1.9.0 punycode: 2.3.1 universalify: 0.2.0 url-parse: 1.5.10 - dev: false - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@0.0.3: {} - /tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + tr46@1.0.1: dependencies: punycode: 2.3.1 - dev: false - /tr46@2.1.0: - resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} - engines: {node: '>=8'} + tr46@2.1.0: dependencies: punycode: 2.3.1 - dev: false - /tr46@4.1.1: - resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} - engines: {node: '>=14'} + tr46@4.1.1: dependencies: punycode: 2.3.1 - dev: false - - /tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - dev: true - /treeverse@1.0.4: - resolution: {integrity: sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==} - - /tryer@1.0.1: - resolution: {integrity: sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==} - dev: false - - /ts-api-utils@1.3.0(typescript@5.5.4): - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' - dependencies: - typescript: 5.5.4 + tree-kill@1.2.2: {} - /ts-easing@0.2.0: - resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==} - dev: false + treeverse@1.0.4: {} - /ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + tryer@1.0.1: {} - /ts-jest@29.0.5(@babel/core@7.25.2)(jest@29.7.0)(typescript@5.5.4): - resolution: {integrity: sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true + ts-api-utils@1.3.0(typescript@5.5.4): dependencies: - '@babel/core': 7.25.2 - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) - jest-util: 29.7.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.6.3 typescript: 5.5.4 - yargs-parser: 21.1.1 - dev: true - - /ts-jest@29.2.3(@babel/core@7.25.2)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.5.4): - resolution: {integrity: sha512-yCcfVdiBFngVz9/keHin9EnsrQtQtEu3nRykNy9RVp+FiPFFbPJ3Sg6Qg4+TkmH0vMP5qsTKgXSsk80HRwvdgQ==} - engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/transform': ^29.0.0 - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/transform': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true + + ts-easing@0.2.0: {} + + ts-interface-checker@0.1.13: {} + + ts-jest@29.0.5(@babel/core@7.25.2)(jest@29.7.0)(typescript@5.5.4): + dependencies: + '@babel/core': 7.25.2 + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.3 + typescript: 5.5.4 + yargs-parser: 21.1.1 + + ts-jest@29.2.3(@babel/core@7.25.2)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.5.4): dependencies: '@babel/core': 7.25.2 '@jest/types': 29.6.3 @@ -24023,14 +28808,8 @@ packages: semver: 7.6.3 typescript: 5.5.4 yargs-parser: 21.1.1 - dev: true - /ts-loader@9.5.1(typescript@5.5.4)(webpack@5.93.0): - resolution: {integrity: sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==} - engines: {node: '>=12.0.0'} - peerDependencies: - typescript: '*' - webpack: ^5.0.0 + ts-loader@9.5.1(typescript@5.5.4)(webpack@5.93.0): dependencies: chalk: 4.1.2 enhanced-resolve: 5.17.1 @@ -24039,32 +28818,18 @@ packages: source-map: 0.7.4 typescript: 5.5.4 webpack: 5.93.0(webpack-cli@5.1.4) - dev: true - /ts-morph@12.0.0: - resolution: {integrity: sha512-VHC8XgU2fFW7yO1f/b3mxKDje1vmyzFXHWzOYmKEkCEwcLjDtbdLgBQviqj4ZwP4MJkQtRo6Ha2I29lq/B+VxA==} + ts-morph@12.0.0: dependencies: '@ts-morph/common': 0.11.1 code-block-writer: 10.1.1 - dev: true - /ts-morph@13.0.3: - resolution: {integrity: sha512-pSOfUMx8Ld/WUreoSzvMFQG5i9uEiWIsBYjpU9+TTASOeUa89j5HykomeqVULm1oqWtBdleI3KEFRLrlA3zGIw==} + ts-morph@13.0.3: dependencies: '@ts-morph/common': 0.12.3 code-block-writer: 11.0.3 - dev: true - /ts-node-dev@2.0.0(@types/node@18.19.42)(typescript@5.5.4): - resolution: {integrity: sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==} - engines: {node: '>=0.8.0'} - hasBin: true - peerDependencies: - node-notifier: '*' - typescript: '*' - peerDependenciesMeta: - node-notifier: - optional: true + ts-node-dev@2.0.0(@types/node@18.19.42)(typescript@5.5.4): dependencies: chokidar: 3.6.0 dynamic-dedupe: 0.3.0 @@ -24081,21 +28846,8 @@ packages: - '@swc/core' - '@swc/wasm' - '@types/node' - dev: true - /ts-node@10.9.1(@types/node@16.18.11)(typescript@4.9.5): - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true + ts-node@10.9.1(@types/node@16.18.11)(typescript@4.9.5): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -24112,21 +28864,8 @@ packages: typescript: 4.9.5 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - dev: true - /ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4): - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true + ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -24144,54 +28883,36 @@ packages: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - /ts-toolbelt@6.15.5: - resolution: {integrity: sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==} - dev: true + ts-toolbelt@6.15.5: {} - /ts-toolbelt@9.6.0: - resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} - dev: true + ts-toolbelt@9.6.0: {} - /tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 - /tsconfig@7.0.0: - resolution: {integrity: sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==} + tsconfig@7.0.0: dependencies: '@types/strip-bom': 3.0.0 '@types/strip-json-comments': 0.0.30 strip-bom: 3.0.0 strip-json-comments: 2.0.1 - dev: true - /tslib@1.10.0: - resolution: {integrity: sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==} - dev: true + tslib@1.10.0: {} - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + tslib@1.14.1: {} - /tslib@2.6.3: - resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + tslib@2.6.3: {} - /tsutils@3.21.0(typescript@5.5.4): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + tsutils@3.21.0(typescript@5.5.4): dependencies: tslib: 1.14.1 typescript: 5.5.4 - dev: false - /tuf-js@1.1.7: - resolution: {integrity: sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + tuf-js@1.1.7: dependencies: '@tufjs/models': 1.0.4 debug: 4.3.6(supports-color@5.5.0) @@ -24199,120 +28920,50 @@ packages: transitivePeerDependencies: - supports-color - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 - dev: false - /turbo-darwin-64@1.2.16: - resolution: {integrity: sha512-dyitLQJdH3uLVdlH9jAkP4LqEO/K+wOXjUqOzjTciRLjQPzmsNY60/bmFHODADK4eBBl1nxbtn7tmmoT4vS1qA==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + turbo-darwin-64@1.2.16: optional: true - /turbo-darwin-arm64@1.2.16: - resolution: {integrity: sha512-Ex6uM4HU7rGXdhvJMpzNpp6qxglJ98nWeIi5qR/lBXHLjK3UCvSW8BEALArUJYJTXS9FZBq1a5LowFqXYsfDcA==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + turbo-darwin-arm64@1.2.16: optional: true - /turbo-freebsd-64@1.2.16: - resolution: {integrity: sha512-onRGKMvog8B3XDssSBIAg+FrEq9pcBoAybP7bpi/uYIH1L/WQ7YMmLn88X9JX19ehYuVOVZrjap4jWH2GIkU8A==} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true + turbo-freebsd-64@1.2.16: optional: true - /turbo-freebsd-arm64@1.2.16: - resolution: {integrity: sha512-S0EqPqxwnJuVNNXRgcHB0r8ai8LSrpHdihVJKRM7WYmIR7isccBEf/G9agrt73sCXwjvenxFs4HDR7cSvGt14Q==} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true + turbo-freebsd-arm64@1.2.16: optional: true - /turbo-linux-32@1.2.16: - resolution: {integrity: sha512-ecbqmGOxgTWePGrowtwyvZGfvwaLxFWmPK21cU0PS+fzoZBaVmzYmniTdd/2EkGCw7TOPhtiT22v96fWcnRycA==} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true + turbo-linux-32@1.2.16: optional: true - /turbo-linux-64@1.2.16: - resolution: {integrity: sha512-q6gtdMWCzM0Sktkd73zcaQjNoeM1MjtrbwQBctWN/Sgj0eiPBPnzpIvokvx98x7RLf4qyI99/mlme0Dn5fx21A==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + turbo-linux-64@1.2.16: optional: true - /turbo-linux-arm64@1.2.16: - resolution: {integrity: sha512-gUf67tYJ/N09WAZTTmtUWYrqm381tZxiulnRGAIM+iRsaTrweyUKZaYXwJvlPpI/cQOw25wCG9/IyvxLeagL8A==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + turbo-linux-arm64@1.2.16: optional: true - /turbo-linux-arm@1.2.16: - resolution: {integrity: sha512-du7uvExELNb89V3g7iM0XP21fR1Yl3EoHRcOfQz32oUqnS7idCKvbEowM9LtiluQl1dKcOIJjn1nlvvsqzkhOg==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + turbo-linux-arm@1.2.16: optional: true - /turbo-linux-mips64le@1.2.16: - resolution: {integrity: sha512-U5BM+Ql3z13uRtwMmKH/8eL+9DdTgyijC2gaX4xP0RTlcN7WfAstg8Fg/Tn2Vw9vtpVDdxwpw7dvX4kw2ghhpA==} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true + turbo-linux-mips64le@1.2.16: optional: true - /turbo-linux-ppc64le@1.2.16: - resolution: {integrity: sha512-HQWSCmVZyc5chw7Ie2ZcfZPfmM06mbEEu0Wl11Y5QWh1ZzhPNQHs/TsF4I9r146wHi62XgcrKFjkw4ARZiWsLA==} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true + turbo-linux-ppc64le@1.2.16: optional: true - /turbo-windows-32@1.2.16: - resolution: {integrity: sha512-0ZtPz5FK2qZjznMG4vvRyaabrhO8BgbN+tBx1wjXSuoICTAjYi5TwRVVRh59c3x7qQmR21Cv33CrhLBPRfeAlg==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + turbo-windows-32@1.2.16: optional: true - /turbo-windows-64@1.2.16: - resolution: {integrity: sha512-j8iAIixq/rGfBpHNbYOosxMasZrGuMzLILEuQGDxZgKNpYgobJ15QFHQlGR9sit1b8qPU5zZX4CtByRtkgH1Bw==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + turbo-windows-64@1.2.16: optional: true - /turbo-windows-arm64@1.2.16: - resolution: {integrity: sha512-4GpcJG3B8R9WDhwfT8fu6ZmOOfseCg6Q1cy/G8/zpJQk769yYcSnD8MgQhYgHB58aVFxZcMxBvLL6UA0UrpgWA==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + turbo-windows-arm64@1.2.16: optional: true - /turbo@1.2.16: - resolution: {integrity: sha512-PPUa2COKgFkyb6N3uF9AnIY3l9FZkF15QQ3U1K2wpI01D3gyGKQO0Q3DUQ4ipmciP0teBfL7H+l/QTrUA9IVvQ==} - hasBin: true - requiresBuild: true + turbo@1.2.16: optionalDependencies: turbo-darwin-64: 1.2.16 turbo-darwin-arm64: 1.2.16 @@ -24327,83 +28978,47 @@ packages: turbo-windows-32: 1.2.16 turbo-windows-64: 1.2.16 turbo-windows-arm64: 1.2.16 - dev: true - /tweetnacl@0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} - dev: true + tweetnacl@0.14.5: {} - /type-check@0.3.2: - resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} - engines: {node: '>= 0.8.0'} + type-check@0.3.2: dependencies: prelude-ls: 1.1.2 - dev: false - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} + type-detect@4.0.8: {} - /type-fest@0.16.0: - resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} - engines: {node: '>=10'} - dev: false + type-fest@0.16.0: {} - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} + type-fest@0.20.2: {} - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} + type-fest@0.21.3: {} - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} + type-fest@0.6.0: {} - /type-fest@0.7.1: - resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} - engines: {node: '>=8'} - dev: false + type-fest@0.7.1: {} - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} + type-fest@0.8.1: {} - /type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - dev: false + type-fest@2.19.0: {} - /type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} - dev: true + type-fest@3.13.1: {} - /type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} + type-is@1.6.18: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 - /typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} + typed-array-buffer@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-typed-array: 1.1.13 - /typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} + typed-array-byte-length@1.0.1: dependencies: call-bind: 1.0.7 for-each: 0.3.3 @@ -24411,9 +29026,7 @@ packages: has-proto: 1.0.3 is-typed-array: 1.1.13 - /typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} + typed-array-byte-offset@1.0.2: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 @@ -24422,9 +29035,7 @@ packages: has-proto: 1.0.3 is-typed-array: 1.1.13 - /typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} + typed-array-length@1.0.6: dependencies: call-bind: 1.0.7 for-each: 0.3.3 @@ -24433,382 +29044,216 @@ packages: is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 - /typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + typedarray-to-buffer@3.1.5: dependencies: is-typedarray: 1.0.0 - dev: false - /typescript@3.9.10: - resolution: {integrity: sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==} - engines: {node: '>=4.2.0'} - hasBin: true - dev: true + typescript@3.9.10: {} - /typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - dev: true + typescript@4.9.5: {} - /typescript@5.5.4: - resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} - engines: {node: '>=14.17'} - hasBin: true + typescript@5.5.4: {} - /ua-parser-js@1.0.38: - resolution: {integrity: sha512-Aq5ppTOfvrCMgAPneW1HfWj66Xi7XL+/mIy996R1/CLS/rcyJQm6QZdsKrUeivDFQ+Oc9Wyuwor8Ze8peEoUoQ==} - dev: false + ua-parser-js@1.0.38: {} - /uglify-js@3.19.1: - resolution: {integrity: sha512-y/2wiW+ceTYR2TSSptAhfnEtpLaQ4Ups5zrjB2d3kuVxHj16j/QJwPl5PvuGy9uARb39J0+iKxcRPvtpsx4A4A==} - engines: {node: '>=0.8.0'} - hasBin: true - dev: false + uglify-js@3.19.1: {} - /uid-promise@1.0.0: - resolution: {integrity: sha512-R8375j0qwXyIu/7R0tjdF06/sElHqbmdmWC9M2qQHpEVbvE4I5+38KJI7LUUmQMp7NVq4tKHiBMkT0NFM453Ig==} - dev: true + uid-promise@1.0.0: {} - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.0.2: dependencies: call-bind: 1.0.7 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - /undefsafe@2.0.5: - resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} - dev: true + undefsafe@2.0.5: {} - /underscore@1.12.1: - resolution: {integrity: sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==} - dev: false + underscore@1.12.1: {} - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@5.26.5: {} - /undici@5.28.4: - resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} - engines: {node: '>=14.0'} + undici@5.28.4: dependencies: '@fastify/busboy': 2.1.1 - /unfetch@3.1.2: - resolution: {integrity: sha512-L0qrK7ZeAudGiKYw6nzFjnJ2D5WHblUBwmHIqtPS6oKUd+Hcpk7/hKsSmcHsTlpd1TbTNsiRBUKRq3bHLNIqIw==} - dev: true + unfetch@3.1.2: {} - /unfetch@4.2.0: - resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} - dev: true + unfetch@4.2.0: {} - /unicode-canonical-property-names-ecmascript@2.0.0: - resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} - engines: {node: '>=4'} + unicode-canonical-property-names-ecmascript@2.0.0: {} - /unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} + unicode-match-property-ecmascript@2.0.0: dependencies: unicode-canonical-property-names-ecmascript: 2.0.0 unicode-property-aliases-ecmascript: 2.1.0 - /unicode-match-property-value-ecmascript@2.1.0: - resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} - engines: {node: '>=4'} + unicode-match-property-value-ecmascript@2.1.0: {} - /unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} - engines: {node: '>=4'} + unicode-property-aliases-ecmascript@2.1.0: {} - /unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} - engines: {node: '>=18'} - dev: true + unicorn-magic@0.1.0: {} - /uniq@1.0.1: - resolution: {integrity: sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==} - dev: true + uniq@1.0.1: {} - /uniqs@2.0.0: - resolution: {integrity: sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ==} - dev: true + uniqs@2.0.0: {} - /unique-filename@1.1.1: - resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} + unique-filename@1.1.1: dependencies: unique-slug: 2.0.2 - /unique-filename@2.0.1: - resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + unique-filename@2.0.1: dependencies: unique-slug: 3.0.0 - /unique-filename@3.0.0: - resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + unique-filename@3.0.0: dependencies: unique-slug: 4.0.0 - /unique-slug@2.0.2: - resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} + unique-slug@2.0.2: dependencies: imurmurhash: 0.1.4 - /unique-slug@3.0.0: - resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + unique-slug@3.0.0: dependencies: imurmurhash: 0.1.4 - /unique-slug@4.0.0: - resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + unique-slug@4.0.0: dependencies: imurmurhash: 0.1.4 - /unique-string@2.0.0: - resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} - engines: {node: '>=8'} + unique-string@2.0.0: dependencies: crypto-random-string: 2.0.0 - dev: false - /universal-user-agent@6.0.1: - resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} + universal-user-agent@6.0.1: {} - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - dev: true + universalify@0.1.2: {} - /universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - dev: false + universalify@0.2.0: {} - /universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} + universalify@2.0.1: {} - /unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} + unpipe@1.0.0: {} - /unquote@1.1.1: - resolution: {integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==} + unquote@1.1.1: {} - /untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} + untildify@4.0.0: {} - /upath@1.2.0: - resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} - engines: {node: '>=4'} - dev: false + upath@1.2.0: {} - /update-browserslist-db@1.1.0(browserslist@4.23.2): - resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + update-browserslist-db@1.1.0(browserslist@4.23.2): dependencies: browserslist: 4.23.2 escalade: 3.1.2 picocolors: 1.0.1 - /update-browserslist-db@1.1.0(browserslist@4.23.3): - resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + update-browserslist-db@1.1.0(browserslist@4.23.3): dependencies: browserslist: 4.23.3 escalade: 3.1.2 picocolors: 1.0.1 - /upper-case@1.1.3: - resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==} - dev: false + upper-case@1.1.3: {} - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + uri-js@4.4.1: dependencies: punycode: 2.3.1 - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + url-parse@1.5.10: dependencies: querystringify: 2.2.0 requires-port: 1.0.0 - dev: false - /url-template@2.0.8: - resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==} - dev: false + url-template@2.0.8: {} - /use-composed-ref@1.3.0(react@18.3.1): - resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + use-composed-ref@1.3.0(react@18.3.1): dependencies: react: 18.3.1 - dev: false - /use-isomorphic-layout-effect@1.1.2(@types/react@18.3.3)(react@18.3.1): - resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + use-isomorphic-layout-effect@1.1.2(@types/react@18.3.3)(react@18.3.1): dependencies: '@types/react': 18.3.3 react: 18.3.1 - dev: false - /use-latest@1.2.1(@types/react@18.3.3)(react@18.3.1): - resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + use-latest@1.2.1(@types/react@18.3.3)(react@18.3.1): dependencies: '@types/react': 18.3.3 react: 18.3.1 use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.3)(react@18.3.1) - dev: false - /use-sync-external-store@1.2.2(react@18.3.1): - resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + use-sync-external-store@1.2.2(react@18.3.1): dependencies: react: 18.3.1 - dev: false - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + util-deprecate@1.0.2: {} - /util.promisify@1.0.1: - resolution: {integrity: sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==} + util.promisify@1.0.1: dependencies: define-properties: 1.2.1 es-abstract: 1.23.3 has-symbols: 1.0.3 object.getownpropertydescriptors: 2.1.8 - /utila@0.4.0: - resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} - dev: false + utila@0.4.0: {} - /utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} + utils-merge@1.0.1: {} - /uuid@10.0.0: - resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} - hasBin: true - dev: false + uuid@10.0.0: {} - /uuid@3.3.2: - resolution: {integrity: sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==} - deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. - hasBin: true - dev: true + uuid@3.3.2: {} - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - dev: false + uuid@8.3.2: {} - /uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - dev: false + uuid@9.0.1: {} - /v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + v8-compile-cache-lib@3.0.1: {} - /v8-to-istanbul@8.1.1: - resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} - engines: {node: '>=10.12.0'} + v8-to-istanbul@8.1.1: dependencies: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 1.9.0 source-map: 0.7.4 - dev: false - /v8-to-istanbul@9.3.0: - resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} - engines: {node: '>=10.12.0'} + v8-to-istanbul@9.3.0: dependencies: '@jridgewell/trace-mapping': 0.3.25 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - /valid-data-url@3.0.1: - resolution: {integrity: sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA==} - engines: {node: '>=10'} - dev: false + valid-data-url@3.0.1: {} - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - /validate-npm-package-name@3.0.0: - resolution: {integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==} + validate-npm-package-name@3.0.0: dependencies: builtins: 1.0.3 - /validate-npm-package-name@5.0.1: - resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + validate-npm-package-name@5.0.1: {} - /validate.io-array@1.0.6: - resolution: {integrity: sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg==} - dev: false + validate.io-array@1.0.6: {} - /validate.io-function@1.0.2: - resolution: {integrity: sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ==} - dev: false + validate.io-function@1.0.2: {} - /validate.io-integer-array@1.0.0: - resolution: {integrity: sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA==} + validate.io-integer-array@1.0.0: dependencies: validate.io-array: 1.0.6 validate.io-integer: 1.0.5 - dev: false - /validate.io-integer@1.0.5: - resolution: {integrity: sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ==} + validate.io-integer@1.0.5: dependencies: validate.io-number: 1.0.3 - dev: false - /validate.io-number@1.0.3: - resolution: {integrity: sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg==} - dev: false + validate.io-number@1.0.3: {} - /vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} + vary@1.1.2: {} - /vendors@1.0.4: - resolution: {integrity: sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==} - dev: true + vendors@1.0.4: {} - /vercel@35.2.3: - resolution: {integrity: sha512-sfDUnP7dmerNZ/2PrUXLC9dJnJASFMy/UGW7Y2W0LVZbMtwH+jdLnViioRUEQaA2zbkkAipKza6w9rvD4sDvrA==} - engines: {node: '>= 16'} - hasBin: true + vercel@35.2.3: dependencies: '@vercel/build-utils': 8.3.6 '@vercel/fun': 1.1.0 @@ -24827,19 +29272,14 @@ packages: - '@swc/wasm' - encoding - supports-color - dev: true - /verror@1.10.0: - resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} - engines: {'0': node >=0.6.0} + verror@1.10.0: dependencies: assert-plus: 1.0.0 core-util-is: 1.0.2 extsprintf: 1.3.0 - dev: false - /victory-vendor@36.9.2: - resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==} + victory-vendor@36.9.2: dependencies: '@types/d3-array': 3.2.1 '@types/d3-ease': 3.0.2 @@ -24855,11 +29295,8 @@ packages: d3-shape: 3.2.0 d3-time: 3.1.0 d3-timer: 3.0.1 - dev: false - /vinyl-file@3.0.0: - resolution: {integrity: sha512-BoJDj+ca3D9xOuPEM6RWVtWQtvEPQiQYn82LvdxhLWplfQsBzBqtgK0yhCP0s1BNTi6dH9BO+dzybvyQIacifg==} - engines: {node: '>=4'} + vinyl-file@3.0.0: dependencies: graceful-fs: 4.2.11 pify: 2.3.0 @@ -24867,9 +29304,7 @@ packages: strip-bom-stream: 2.0.0 vinyl: 2.2.1 - /vinyl@2.2.1: - resolution: {integrity: sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==} - engines: {node: '>= 0.10'} + vinyl@2.2.1: dependencies: clone: 2.1.2 clone-buffer: 1.0.0 @@ -24878,53 +29313,36 @@ packages: remove-trailing-separator: 1.1.0 replace-ext: 1.0.1 - /vlq@0.2.3: - resolution: {integrity: sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==} - dev: true + vlq@0.2.3: {} - /w3c-hr-time@1.0.2: - resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} - deprecated: Use your platform's native performance.now() and performance.timeOrigin. + w3c-hr-time@1.0.2: dependencies: browser-process-hrtime: 1.0.0 - dev: false - /w3c-xmlserializer@2.0.0: - resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} - engines: {node: '>=10'} + w3c-xmlserializer@2.0.0: dependencies: xml-name-validator: 3.0.0 - dev: false - /walk-up-path@1.0.0: - resolution: {integrity: sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==} + walk-up-path@1.0.0: {} - /walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + walker@1.0.8: dependencies: makeerror: 1.0.12 - /watchpack@2.4.1: - resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} - engines: {node: '>=10.13.0'} + watchpack@2.4.1: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - /wbuf@1.7.3: - resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + wbuf@1.7.3: dependencies: minimalistic-assert: 1.0.1 - dev: false - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + wcwidth@1.0.1: dependencies: defaults: 1.0.4 - /web-resource-inliner@6.0.1: - resolution: {integrity: sha512-kfqDxt5dTB1JhqsCUQVFDj0rmY+4HLwGQIsLPbyrsN9y9WV/1oFDSx3BQ4GfCv9X+jVeQ7rouTqwK53rA/7t8A==} - engines: {node: '>=10.0.0'} + web-resource-inliner@6.0.1: dependencies: ansi-colors: 4.1.3 escape-goat: 3.0.0 @@ -24934,58 +29352,24 @@ packages: valid-data-url: 3.0.1 transitivePeerDependencies: - encoding - dev: false - /web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} + web-streams-polyfill@3.3.3: {} - /web-vitals@0.2.4: - resolution: {integrity: sha512-6BjspCO9VriYy12z356nL6JBS0GYeEcA457YyRzD+dD6XYCQ75NKhcOHUMHentOE7OcVCIXXDvOm0jKFfQG2Gg==} - dev: true + web-vitals@0.2.4: {} - /web-vitals@2.1.4: - resolution: {integrity: sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==} - dev: false + web-vitals@2.1.4: {} - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@3.0.1: {} - /webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - dev: false + webidl-conversions@4.0.2: {} - /webidl-conversions@5.0.0: - resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} - engines: {node: '>=8'} - dev: false + webidl-conversions@5.0.0: {} - /webidl-conversions@6.1.0: - resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} - engines: {node: '>=10.4'} - dev: false + webidl-conversions@6.1.0: {} - /webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - dev: false + webidl-conversions@7.0.0: {} - /webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0): - resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} - engines: {node: '>=14.15.0'} - hasBin: true - peerDependencies: - '@webpack-cli/generators': '*' - webpack: 5.x.x - webpack-bundle-analyzer: '*' - webpack-dev-server: '*' - peerDependenciesMeta: - '@webpack-cli/generators': - optional: true - webpack-bundle-analyzer: - optional: true - webpack-dev-server: - optional: true + webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0): dependencies: '@discoveryjs/json-ext': 0.5.7 '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.93.0) @@ -25003,11 +29387,7 @@ packages: webpack: 5.93.0(webpack-cli@5.1.4) webpack-merge: 5.10.0 - /webpack-dev-middleware@5.3.4(webpack@5.93.0): - resolution: {integrity: sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 + webpack-dev-middleware@5.3.4(webpack@5.93.0): dependencies: colorette: 2.0.20 memfs: 3.5.3 @@ -25015,20 +29395,8 @@ packages: range-parser: 1.2.1 schema-utils: 4.2.0 webpack: 5.93.0(webpack-cli@5.1.4) - dev: false - /webpack-dev-server@4.15.2(webpack@5.93.0): - resolution: {integrity: sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==} - engines: {node: '>= 12.13.0'} - hasBin: true - peerDependencies: - webpack: ^4.37.0 || ^5.0.0 - webpack-cli: '*' - peerDependenciesMeta: - webpack: - optional: true - webpack-cli: - optional: true + webpack-dev-server@4.15.2(webpack@5.93.0): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -25066,55 +29434,32 @@ packages: - debug - supports-color - utf-8-validate - dev: false - /webpack-manifest-plugin@4.1.1(webpack@5.93.0): - resolution: {integrity: sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==} - engines: {node: '>=12.22.0'} - peerDependencies: - webpack: ^4.44.2 || ^5.47.0 + webpack-manifest-plugin@4.1.1(webpack@5.93.0): dependencies: tapable: 2.2.1 webpack: 5.93.0(webpack-cli@5.1.4) webpack-sources: 2.3.1 - dev: false - /webpack-merge@5.10.0: - resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} - engines: {node: '>=10.0.0'} + webpack-merge@5.10.0: dependencies: clone-deep: 4.0.1 flat: 5.0.2 wildcard: 2.0.1 - /webpack-sources@1.4.3: - resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} + webpack-sources@1.4.3: dependencies: source-list-map: 2.0.1 source-map: 0.6.1 - dev: false - /webpack-sources@2.3.1: - resolution: {integrity: sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==} - engines: {node: '>=10.13.0'} + webpack-sources@2.3.1: dependencies: source-list-map: 2.0.1 source-map: 0.6.1 - dev: false - /webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} + webpack-sources@3.2.3: {} - /webpack@5.93.0(webpack-cli@5.1.4): - resolution: {integrity: sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true + webpack@5.93.0(webpack-cli@5.1.4): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 @@ -25146,65 +29491,45 @@ packages: - esbuild - uglify-js - /websocket-driver@0.7.4: - resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} - engines: {node: '>=0.8.0'} + websocket-driver@0.7.4: dependencies: http-parser-js: 0.5.8 safe-buffer: 5.2.1 websocket-extensions: 0.1.4 - /websocket-extensions@0.1.4: - resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} - engines: {node: '>=0.8.0'} + websocket-extensions@0.1.4: {} - /whatwg-encoding@1.0.5: - resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + whatwg-encoding@1.0.5: dependencies: iconv-lite: 0.4.24 - dev: false - /whatwg-fetch@3.6.20: - resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} - dev: false + whatwg-fetch@3.6.20: {} - /whatwg-mimetype@2.3.0: - resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} - dev: false + whatwg-mimetype@2.3.0: {} - /whatwg-url@13.0.0: - resolution: {integrity: sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==} - engines: {node: '>=16'} + whatwg-url@13.0.0: dependencies: tr46: 4.1.1 webidl-conversions: 7.0.0 - dev: false - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - /whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + whatwg-url@7.1.0: dependencies: lodash.sortby: 4.7.0 tr46: 1.0.1 webidl-conversions: 4.0.2 - dev: false - /whatwg-url@8.7.0: - resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} - engines: {node: '>=10'} + whatwg-url@8.7.0: dependencies: lodash: 4.17.21 tr46: 2.1.0 webidl-conversions: 6.1.0 - dev: false - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 @@ -25212,9 +29537,7 @@ packages: is-string: 1.0.7 is-symbol: 1.0.4 - /which-builtin-type@1.1.4: - resolution: {integrity: sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==} - engines: {node: '>= 0.4'} + which-builtin-type@1.1.4: dependencies: function.prototype.name: 1.1.6 has-tostringtag: 1.0.2 @@ -25229,30 +29552,21 @@ packages: which-collection: 1.0.2 which-typed-array: 1.1.15 - /which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} + which-collection@1.0.2: dependencies: is-map: 2.0.3 is-set: 2.0.3 is-weakmap: 2.0.2 is-weakset: 2.0.3 - /which-pm-runs@1.1.0: - resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} - engines: {node: '>=4'} - dev: false + which-pm-runs@1.1.0: {} - /which-pm@2.2.0: - resolution: {integrity: sha512-MOiaDbA5ZZgUjkeMWM5EkJp4loW5ZRoa5bc3/aeMox/PJelMhE6t7S/mLuiY43DBupyxH+S0U1bTui9kWUlmsw==} - engines: {node: '>=8.15'} + which-pm@2.2.0: dependencies: load-yaml-file: 0.2.0 path-exists: 4.0.0 - /which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} + which-typed-array@1.1.15: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 @@ -25260,62 +29574,40 @@ packages: gopd: 1.0.1 has-tostringtag: 1.0.2 - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true + which@1.3.1: dependencies: isexe: 2.0.0 - dev: false - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - /which@3.0.1: - resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true + which@3.0.1: dependencies: isexe: 2.0.0 - /wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + wide-align@1.1.5: dependencies: string-width: 4.2.3 - /widest-line@4.0.1: - resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} - engines: {node: '>=12'} + widest-line@4.0.1: dependencies: string-width: 5.1.2 - dev: false - /wildcard@2.0.1: - resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + wildcard@2.0.1: {} - /word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} + word-wrap@1.2.5: {} - /workbox-background-sync@6.6.0: - resolution: {integrity: sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==} + workbox-background-sync@6.6.0: dependencies: idb: 7.1.1 workbox-core: 6.6.0 - dev: false - /workbox-broadcast-update@6.6.0: - resolution: {integrity: sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==} + workbox-broadcast-update@6.6.0: dependencies: workbox-core: 6.6.0 - dev: false - /workbox-build@6.6.0: - resolution: {integrity: sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==} - engines: {node: '>=10.0.0'} + workbox-build@6.6.0: dependencies: '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0) '@babel/core': 7.25.2 @@ -25357,58 +29649,40 @@ packages: transitivePeerDependencies: - '@types/babel__core' - supports-color - dev: false - /workbox-cacheable-response@6.6.0: - resolution: {integrity: sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==} - deprecated: workbox-background-sync@6.6.0 + workbox-cacheable-response@6.6.0: dependencies: workbox-core: 6.6.0 - dev: false - /workbox-core@6.6.0: - resolution: {integrity: sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==} - dev: false + workbox-core@6.6.0: {} - /workbox-expiration@6.6.0: - resolution: {integrity: sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==} + workbox-expiration@6.6.0: dependencies: idb: 7.1.1 workbox-core: 6.6.0 - dev: false - /workbox-google-analytics@6.6.0: - resolution: {integrity: sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==} - deprecated: It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained + workbox-google-analytics@6.6.0: dependencies: workbox-background-sync: 6.6.0 workbox-core: 6.6.0 workbox-routing: 6.6.0 workbox-strategies: 6.6.0 - dev: false - /workbox-navigation-preload@6.6.0: - resolution: {integrity: sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==} + workbox-navigation-preload@6.6.0: dependencies: workbox-core: 6.6.0 - dev: false - /workbox-precaching@6.6.0: - resolution: {integrity: sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==} + workbox-precaching@6.6.0: dependencies: workbox-core: 6.6.0 workbox-routing: 6.6.0 workbox-strategies: 6.6.0 - dev: false - /workbox-range-requests@6.6.0: - resolution: {integrity: sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==} + workbox-range-requests@6.6.0: dependencies: workbox-core: 6.6.0 - dev: false - /workbox-recipes@6.6.0: - resolution: {integrity: sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==} + workbox-recipes@6.6.0: dependencies: workbox-cacheable-response: 6.6.0 workbox-core: 6.6.0 @@ -25416,36 +29690,23 @@ packages: workbox-precaching: 6.6.0 workbox-routing: 6.6.0 workbox-strategies: 6.6.0 - dev: false - /workbox-routing@6.6.0: - resolution: {integrity: sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==} + workbox-routing@6.6.0: dependencies: workbox-core: 6.6.0 - dev: false - /workbox-strategies@6.6.0: - resolution: {integrity: sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==} + workbox-strategies@6.6.0: dependencies: workbox-core: 6.6.0 - dev: false - /workbox-streams@6.6.0: - resolution: {integrity: sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==} + workbox-streams@6.6.0: dependencies: workbox-core: 6.6.0 workbox-routing: 6.6.0 - dev: false - /workbox-sw@6.6.0: - resolution: {integrity: sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==} - dev: false + workbox-sw@6.6.0: {} - /workbox-webpack-plugin@6.6.0(webpack@5.93.0): - resolution: {integrity: sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==} - engines: {node: '>=10.0.0'} - peerDependencies: - webpack: ^4.4.0 || ^5.9.0 + workbox-webpack-plugin@6.6.0(webpack@5.93.0): dependencies: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 @@ -25456,146 +29717,79 @@ packages: transitivePeerDependencies: - '@types/babel__core' - supports-color - dev: false - /workbox-window@6.6.0: - resolution: {integrity: sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==} + workbox-window@6.6.0: dependencies: '@types/trusted-types': 2.0.7 workbox-core: 6.6.0 - dev: false - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + wrappy@1.0.2: {} - /write-file-atomic@3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + write-file-atomic@3.0.3: dependencies: imurmurhash: 0.1.4 is-typedarray: 1.0.0 signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 - dev: false - /write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + write-file-atomic@4.0.2: dependencies: imurmurhash: 0.1.4 signal-exit: 3.0.7 - /ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: false + ws@7.5.10: {} - /ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: false + ws@8.18.0: {} - /xdg-app-paths@5.1.0: - resolution: {integrity: sha512-RAQ3WkPf4KTU1A8RtFx3gWywzVKe00tfOPFfl2NDGqbIFENQO4kqAJp7mhQjNj/33W5x5hiWWUdyfPq/5SU3QA==} - engines: {node: '>=6'} + xdg-app-paths@5.1.0: dependencies: xdg-portable: 7.3.0 - dev: true - /xdg-portable@7.3.0: - resolution: {integrity: sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw==} - engines: {node: '>= 6.0'} + xdg-portable@7.3.0: dependencies: os-paths: 4.4.0 - dev: true - /xml-name-validator@3.0.0: - resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} - dev: false + xml-name-validator@3.0.0: {} - /xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - dev: false + xmlchars@2.2.0: {} - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} + xtend@4.0.2: {} - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + y18n@5.0.8: {} - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@3.1.1: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@4.0.0: {} - /yallist@5.0.0: - resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} - engines: {node: '>=18'} - dev: false + yallist@5.0.0: {} - /yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} + yaml@1.10.2: {} - /yaml@2.5.0: - resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} - engines: {node: '>= 14'} - hasBin: true + yaml@2.5.0: {} - /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - dev: false + yargs-parser@20.2.9: {} - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + yargs-parser@21.1.1: {} - /yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} + yargs@16.2.0: dependencies: cliui: 7.0.4 escalade: 3.1.2 @@ -25604,11 +29798,8 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.9 - dev: false - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + yargs@17.7.2: dependencies: cliui: 8.0.1 escalade: 3.1.2 @@ -25618,32 +29809,21 @@ packages: y18n: 5.0.8 yargs-parser: 21.1.1 - /yauzl-clone@1.0.4: - resolution: {integrity: sha512-igM2RRCf3k8TvZoxR2oguuw4z1xasOnA31joCqHIyLkeWrvAc2Jgay5ISQ2ZplinkoGaJ6orCz56Ey456c5ESA==} - engines: {node: '>=6'} + yauzl-clone@1.0.4: dependencies: events-intercept: 2.0.0 - dev: true - /yauzl-promise@2.1.3: - resolution: {integrity: sha512-A1pf6fzh6eYkK0L4Qp7g9jzJSDrM6nN0bOn5T0IbY4Yo3w+YkWlHFkJP7mzknMXjqusHFHlKsK2N+4OLsK2MRA==} - engines: {node: '>=6'} + yauzl-promise@2.1.3: dependencies: yauzl: 2.10.0 yauzl-clone: 1.0.4 - dev: true - /yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + yauzl@2.10.0: dependencies: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 - dev: true - /yeoman-environment@3.19.3: - resolution: {integrity: sha512-/+ODrTUHtlDPRH9qIC0JREH8+7nsRcjDl3Bxn2Xo/rvAaVvixH5275jHwg0C85g4QsF4P6M2ojfScPPAl+pLAg==} - engines: {node: '>=12.10.0'} - hasBin: true + yeoman-environment@3.19.3: dependencies: '@npmcli/arborist': 4.3.1 are-we-there-yet: 2.0.0 @@ -25686,14 +29866,7 @@ packages: - bluebird - supports-color - /yeoman-generator@5.10.0(yeoman-environment@3.19.3): - resolution: {integrity: sha512-iDUKykV7L4nDNzeYSedRmSeJ5eMYFucnKDi6KN1WNASXErgPepKqsQw55TgXPHnmpcyOh2Dd/LAZkyc+f0qaAw==} - engines: {node: '>=12.10.0'} - peerDependencies: - yeoman-environment: ^3.2.0 - peerDependenciesMeta: - yeoman-environment: - optional: true + yeoman-generator@5.10.0(yeoman-environment@3.19.3): dependencies: chalk: 4.1.2 dargs: 7.0.0 @@ -25717,68 +29890,36 @@ packages: - mem-fs - supports-color - /yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} + yn@3.1.1: {} - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + yocto-queue@0.1.0: {} - /yocto-queue@1.1.1: - resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} - engines: {node: '>=12.20'} - dev: true + yocto-queue@1.1.1: {} - /yoctocolors-cjs@2.1.2: - resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} - engines: {node: '>=18'} - dev: true + yoctocolors-cjs@2.1.2: {} - /zip-stream@4.1.1: - resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} - engines: {node: '>= 10'} + zip-stream@4.1.1: dependencies: archiver-utils: 3.0.4 compress-commons: 4.1.2 readable-stream: 3.6.2 - dev: true - /zod-prisma@0.5.4(prisma@5.17.0)(zod@3.23.8): - resolution: {integrity: sha512-5Ca4Qd1a1jy1T/NqCEpbr0c+EsbjJfJ/7euEHob3zDvtUK2rTuD1Rc/vfzH8q8PtaR2TZbysD88NHmrLwpv3Xg==} - engines: {node: '>=14'} - hasBin: true - peerDependencies: - decimal.js: ^10.0.0 - prisma: ^3.0.0 - zod: ^3.0.0 - peerDependenciesMeta: - decimal.js: - optional: true + zod-prisma@0.5.4(prisma@5.17.0)(zod@3.23.8): dependencies: '@prisma/generator-helper': 3.8.1 parenthesis: 3.1.8 prisma: 5.17.0 ts-morph: 13.0.3 zod: 3.23.8 - dev: true - /zod-to-json-schema@3.23.2(zod@3.23.8): - resolution: {integrity: sha512-uSt90Gzc/tUfyNqxnjlfBs8W6WSGpNBv0rVsNxP/BVSMHMKGdthPYff4xtCHYloJGM0CFxFsb3NbC0eqPhfImw==} - peerDependencies: - zod: ^3.23.3 + zod-to-json-schema@3.23.2(zod@3.23.8): dependencies: zod: 3.23.8 - dev: false - /zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + zod@3.23.8: {} - /zstd-napi@0.0.6: - resolution: {integrity: sha512-CKYrptAvjMhxQTuC7J42UXdmgKc73piuZHNGg0dya6qYZzPmaH31fXxuFv7B9QGAWX8tBmFlDJo9aXne7bmx3g==} - requiresBuild: true + zstd-napi@0.0.6: dependencies: '@types/node': 18.19.42 node-addon-api: 2.0.2 prebuild-install: 5.3.6 - dev: false diff --git a/webapps/console/lib/server/firebase-server.ts b/webapps/console/lib/server/firebase-server.ts index caadc877d..e57722333 100644 --- a/webapps/console/lib/server/firebase-server.ts +++ b/webapps/console/lib/server/firebase-server.ts @@ -62,7 +62,7 @@ export function firebase(): admin.app.App { return requireDefined(firebaseService(), `Something went wrong, firebaseService is not initialized`); } -export const firebaseAuthCookieName = "fb-auth2"; +export const firebaseAuthCookieName = "jitsu-auth"; export type FirebaseToken = { idToken: string; cookieToken?: never } | { idToken?: never; cookieToken: string }; diff --git a/webapps/console/pages/api/fb-auth/create-session.ts b/webapps/console/pages/api/fb-auth/create-session.ts index 1403c41b5..27d1a0592 100644 --- a/webapps/console/pages/api/fb-auth/create-session.ts +++ b/webapps/console/pages/api/fb-auth/create-session.ts @@ -4,7 +4,7 @@ import { createSessionCookie, firebaseAuthCookieName } from "../../../lib/server import { ApiError } from "../../../lib/shared/errors"; import { CookieSerializeOptions, serialize } from "cookie"; import { getAppEndpoint } from "../../../lib/domains"; -import { getRequestHost, getTopLevelDomain } from "../../../lib/server/origin"; +import { getRequestHost } from "../../../lib/server/origin"; import { getServerLog } from "../../../lib/server/log"; import { getLog } from "juava"; @@ -32,7 +32,7 @@ export const api: Api = { } const { cookie, expiresIn } = await createSessionCookie(idToken); //we need to split() since the domain might contain a port, not good for cookies - const domain = "." + getTopLevelDomain(getRequestHost(req)).split(":")[0]; + const domain = getRequestHost(req).split(":")[0]; getLog().atDebug().log(`Setting firebase auth cookie for '${domain}': ${cookie}`); const options: CookieSerializeOptions = { maxAge: expiresIn, From 5d4cd11037fad324de79faa7b4d09c70c0a03456 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 15 Aug 2024 11:53:26 +0400 Subject: [PATCH 0846/1353] fix --- webapps/console/pages/[workspaceId]/syncs/tasks.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx index c7c1605bb..f4378388c 100644 --- a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx @@ -393,7 +393,7 @@ function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap, re } }; const tasksMapped = useMemo(() => { - return tasks.map(task => { + return (tasks ?? []).map(task => { return { key: task.task_id, ...processTaskStatus(task), From c2bcb0901a3aff0c0e3476684566a22eeec2e9bc Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 15 Aug 2024 16:50:21 +0400 Subject: [PATCH 0847/1353] console: SyncEditor: Normalize Names option (toSameCase) --- .../SyncEditorPage/SyncEditorPage.tsx | 41 ++++++++++++++++--- webapps/console/lib/server/sync.ts | 1 + 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx index 5c1df8e50..26c1cbffe 100644 --- a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx +++ b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx @@ -91,6 +91,7 @@ type SyncOptionsType = { streams?: SelectedStreams; namespace?: string; tableNamePrefix?: string; + toSameCase?: boolean; schedule?: string; timezone?: string; }; @@ -233,6 +234,10 @@ function SyncEditor({ : (syncOptions?.tableNamePrefix ?? "") + "${SOURCE_NAMESPACE}_" : undefined; + const nameTransformer = syncOptions?.toSameCase + ? (s: string) => (destinationType.id === "snowflake" ? s.toUpperCase() : s.toLowerCase()) + : (s: string) => s; + const destinationNamespaces = (sourceNamespaces?.length > 0 ? sourceNamespaces : [""]) .map(ns => (syncOptions?.namespace ? syncOptions?.namespace.replaceAll("${SOURCE_NAMESPACE}", ns ?? "") : "")) .map(ns => ns?.trim()) @@ -558,6 +563,32 @@ function SyncEditor({ ), } : undefined, + destinationType.usesBulker && destinationType.id !== "s3" && destinationType.id !== "gcs" + ? { + name: "Normalize Names", + documentation: ( + <> + By default, Jitsu syncs table and column names exactly as they appear in the source. For instance, if a + source table is named MyTableName, Jitsu will create a table with the same case-sensitive + name. This means that when querying in SQL, you’ll need to use quotes, like so:{" "} + select * from "MyTableName"; +
      +
      + However, if you enable tis option, Jitsu will automatically convert all table and column names to{" "} + {`${destinationType.id === "snowflake" ? "UPPERCASE" : "lowercase"}`}. + + ), + component: ( +
      + updateOptions({ toSameCase: e })} + /> +
      + ), + } + : undefined, ].filter(Boolean) as EditorItem[]; if (appConfig.syncs.scheduler.enabled) { const disableScheduling = @@ -777,12 +808,12 @@ function SyncEditor({ style={{ minWidth: "15rem" }} disabled={!syncOptions?.streams?.[name]} onChange={e => updateSelectedStream(name, "table_name", e.target.value)} - value={ + value={nameTransformer( syncOptions?.streams?.[name]?.table_name || - (syncOptions?.tableNamePrefix - ? syncOptions?.tableNamePrefix.replaceAll("${SOURCE_NAMESPACE}", stream.namespace ?? "") - : "") + tableName - } + (syncOptions?.tableNamePrefix + ? syncOptions?.tableNamePrefix.replaceAll("${SOURCE_NAMESPACE}", stream.namespace ?? "") + : "") + tableName + )} >
      diff --git a/webapps/console/lib/server/sync.ts b/webapps/console/lib/server/sync.ts index 18d642d98..896a2e54b 100644 --- a/webapps/console/lib/server/sync.ts +++ b/webapps/console/lib/server/sync.ts @@ -616,6 +616,7 @@ export async function scheduleSync({ fullSync: fullSync ? "true" : "false", startedBy: JSON.stringify(startedBy), namespace: typeof sync.data?.["namespace"] !== "undefined" ? sync.data?.["namespace"] : "${LEGACY}", + toSameCase: sync.data?.["toSameCase"] ? "true" : "false", tableNamePrefix: sync.data?.["tableNamePrefix"] ?? "", }, body: { From 2fc4e940e74d99da44d7734915cc2b2ec0cee71c Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 16 Aug 2024 16:07:23 +0400 Subject: [PATCH 0848/1353] docker: remove syncctl dependency on bulker --- docker/.env.example | 2 -- docker/SYNCS_README.md | 3 +-- docker/docker-compose.yml | 4 ---- 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/docker/.env.example b/docker/.env.example index ebd3105b2..16336085d 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -41,8 +41,6 @@ GITHUB_CLIENT_SECRET= #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SYNCS_ENABLED=false -EXTERNAL_BULKER_HOST=host.minikube.internal -EXTERNAL_BULKER_PORT=3042 # sync controller is running using host network to access 'minikube' w/o problems. EXTERNAL_SYNCS_PORT=3043 diff --git a/docker/SYNCS_README.md b/docker/SYNCS_README.md index 68bff9420..2da819c45 100644 --- a/docker/SYNCS_README.md +++ b/docker/SYNCS_README.md @@ -11,7 +11,6 @@ Jitsu runs sync jobs in kubernetes cluster. So we need to connect `syncctl` serv * `SYNCS_ENABLED` - set to `true` to enable syncs on UI side * `SYNCCTL_KUBERNETES_CLIENT_CONFIG` - path to kubernetes config file or kubernetes config in yaml format -* `EXTERNAL_BULKER_HOST` - host of `bulker` service as it is reachable from kubernetes cluster * `EXTERNAL_POSTGRES_HOST`- host of `postgres` service as it is reachable from kubernetes cluster # How to run @@ -38,7 +37,7 @@ Put the modified config payload to `SYNCCTL_KUBERNETES_CLIENT_CONFIG` env variab **Adjust `.env` config** -* Set `EXTERNAL_BULKER_HOST` and `EXTERNAL_POSTGRES_HOST` to: `host.minikube.internal` as it is how these services will be reachable from minikube +* Set `EXTERNAL_POSTGRES_HOST` to: `host.minikube.internal` as it is how these services will be reachable from minikube * Set `SYNCS_ENABLED` to `true` **Start Jitsu** diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 77bb59fe6..1ba151ed3 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -148,8 +148,6 @@ services: interval: 2s timeout: 10s retries: 15 - ports: - - "${EXTERNAL_BULKER_PORT:-3042}:3042" depends_on: console: condition: service_healthy @@ -231,8 +229,6 @@ services: SYNCCTL_RAW_AUTH_TOKENS: ${SYNCCTL_TOKEN:-default} SYNCCTL_DATABASE_URL: "postgresql://postgres:${POSTGRES_PASSWORD:-default}@127.0.0.1:${EXTERNAL_POSTGRES_PORT:-5432}/postgres?search_path=newjitsu" SYNCCTL_SIDECAR_DATABASE_URL: "postgresql://postgres:${POSTGRES_PASSWORD:-default}@${EXTERNAL_POSTGRES_HOST}:${EXTERNAL_POSTGRES_PORT:-5432}/postgres?search_path=newjitsu" - SYNCCTL_BULKER_URL: "http://${EXTERNAL_BULKER_HOST}:${EXTERNAL_BULKER_PORT:-3042}" - SYNCCTL_BULKER_AUTH_TOKEN: ${BULKER_TOKEN:-default} SYNCCTL_KUBERNETES_CLIENT_CONFIG: "${SYNCCTL_KUBERNETES_CLIENT_CONFIG:-local}" SYNCCTL_KUBERNETES_CONTEXT: "${SYNCCTL_KUBERNETES_CONTEXT}" network_mode: "host" From 8d6aaca34b1aea402fd168bcac39ab35c90c3a0c Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Fri, 16 Aug 2024 15:09:49 -0400 Subject: [PATCH 0849/1353] feat (jitsu/ee): optional caching of workspace stat --- webapps/console/lib/useApi.ts | 2 +- .../console/pages/admin/overage-billing.tsx | 3 - webapps/ee-api/lib/services.ts | 1 + webapps/ee-api/pages/api/report/overage.ts | 13 +- .../ee-api/pages/api/report/workspace-stat.ts | 112 +++++++++++++----- webapps/ee-api/pages/api/sync-cache.ts | 69 +++++++++++ webapps/ee-api/scripts/sql/05-stat-cache.sql | 12 ++ 7 files changed, 175 insertions(+), 37 deletions(-) create mode 100644 webapps/ee-api/pages/api/sync-cache.ts create mode 100644 webapps/ee-api/scripts/sql/05-stat-cache.sql diff --git a/webapps/console/lib/useApi.ts b/webapps/console/lib/useApi.ts index e96a521a7..bc0d81341 100644 --- a/webapps/console/lib/useApi.ts +++ b/webapps/console/lib/useApi.ts @@ -137,7 +137,7 @@ export function useApi = } return zodParsed.data; }, - { retry: false, cacheTime: 0, staleTime: 0 } + { retry: false, cacheTime: 0, staleTime: 0, refetchOnWindowFocus: false, refetchOnMount: false } ); return { ...queryResult, reload: () => setVersion(version + 1) }; } diff --git a/webapps/console/pages/admin/overage-billing.tsx b/webapps/console/pages/admin/overage-billing.tsx index 9b2cb164a..8e27c15ad 100644 --- a/webapps/console/pages/admin/overage-billing.tsx +++ b/webapps/console/pages/admin/overage-billing.tsx @@ -1,5 +1,4 @@ import { useApi } from "../../lib/useApi"; -import { useRouter } from "next/router"; import { ExternalLink } from "lucide-react"; import { ErrorCard } from "../../components/GlobalError/GlobalError"; import { ColumnOption, JsonAsTable } from "../../components/JsonAsTable/JsonAsTable"; @@ -38,7 +37,6 @@ const dateFormat: ColumnOption = { }; const View = ({ data, workspaces }) => { - const router = useRouter(); const workspacesMap = workspaces.reduce( (acc, w) => ({ ...acc, @@ -46,7 +44,6 @@ const View = ({ data, workspaces }) => { }), {} ); - console.log("workspacesMap", workspacesMap); return (
      diff --git a/webapps/ee-api/lib/services.ts b/webapps/ee-api/lib/services.ts index 354acf749..014de9da2 100644 --- a/webapps/ee-api/lib/services.ts +++ b/webapps/ee-api/lib/services.ts @@ -15,6 +15,7 @@ export const clickhouse = createClient({ url: requireDefined(process.env.CLICKHOUSE_URL, `env CLICKHOUSE_URL is not defined`), username: process.env.CLICKHOUSE_USERNAME || "default", password: requireDefined(process.env.CLICKHOUSE_PASSWORD, `env CLICKHOUSE_PASSWORD is not defined`), + request_timeout: 600_000, }); export const s3client = new S3Client({ diff --git a/webapps/ee-api/pages/api/report/overage.ts b/webapps/ee-api/pages/api/report/overage.ts index 3fa4f0faf..a9d3db27a 100644 --- a/webapps/ee-api/pages/api/report/overage.ts +++ b/webapps/ee-api/pages/api/report/overage.ts @@ -8,7 +8,6 @@ import { getInvoiceEndDate, getInvoiceStartDate, listAllInvoices, - stripe, stripeDataTable, stripeLink, } from "../../../lib/stripe"; @@ -83,10 +82,16 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse const allInvoices = await listAllInvoices(); const allCustomers = new Set(allWorkspaces.map(w => w.obj.stripeCustomerId)); const eligibleInvoices = allInvoices.filter(i => allCustomers.has(i.customer)).filter(i => i.lines.data.length > 0); - const minDate = eligibleInvoices.map(i => getInvoiceStartDate(i)).sort((a, b) => a.getTime() - b.getTime())[0]; + const minDate = dayjs().utc().add(-60, "d"); // eligibleInvoices.map(i => getInvoiceStartDate(i)).sort((a, b) => a.getTime() - b.getTime())[0]; const timer = Date.now(); - const report = await buildWorkspaceReport(minDate.toISOString(), new Date().toISOString(), "day", workspaceId); + const report = await buildWorkspaceReport({ + start: minDate.toISOString(), + end: new Date().toISOString(), + granularity: "day", + workspaceId, + useCache: req.query.cache === "true", + }); getLog() .atInfo() .log(`Build workspace report from ${minDate.toISOString()}. Took ${Date.now() - timer}ms`); @@ -199,7 +204,7 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse }; export const config = { - maxDuration: 120, //2 mins, mostly becasue of workspace-stat call + maxDuration: 180, //2 mins, mostly becasue of workspace-stat call }; export default withErrorHandler(handler); diff --git a/webapps/ee-api/pages/api/report/workspace-stat.ts b/webapps/ee-api/pages/api/report/workspace-stat.ts index 5840ee6dd..1bd5d94ff 100644 --- a/webapps/ee-api/pages/api/report/workspace-stat.ts +++ b/webapps/ee-api/pages/api/report/workspace-stat.ts @@ -1,5 +1,13 @@ import type { NextApiRequest, NextApiResponse } from "next"; -import { assertDefined, assertTrue, namedParameters, requireDefined, SqlQueryParameters, unrollParams } from "juava"; +import { + assertDefined, + assertTrue, + getErrorMessage, + getLog, + namedParameters, + requireDefined, + SqlQueryParameters, +} from "juava"; import { withErrorHandler } from "../../../lib/error-handler"; import { auth } from "../../../lib/auth"; import { clickhouse, pg, store } from "../../../lib/services"; @@ -64,7 +72,33 @@ async function getSyncs() { ); } -async function getEventsReport({ granularity, start, end, workspaceId }: ReportParams): Promise { +export async function getEventsReportFromCache({ + start, + end, + workspaceId, +}: ReportParams): Promise { + const sql = `select + period, "workspaceId", events + from newjitsuee.stat_cache + where period >= :start and period <= :end + ${workspaceId ? 'and "workspaceId" = {workspaceId:String}' : ""} + order by period;`; + log.atInfo().log(`Getting events report from cache for [${start}, ${end}]. Workspace: ${workspaceId || "all"}`); + return ( + (await query(pg, sql, { + start, + end, + workspaceId, + })) as any + ).map(({ events, ...rest }) => ({ events: Number(events), ...rest })); +} + +export async function getEventsReport({ + granularity, + start, + end, + workspaceId, +}: ReportParams): Promise { const timer = Date.now(); const metricsSchema = process.env.CLICKHOUSE_METRICS_SCHEMA || process.env.CLICKHOUSE_DATABASE || "newjitsu_metrics"; const query = `select @@ -83,28 +117,39 @@ async function getEventsReport({ granularity, start, end, workspaceId }: ReportP `; const queryParams = removeUndefined({ start: isoDateTOClickhouse(dayjs(start).utc().startOf("day").toISOString()), - end: isoDateTOClickhouse(dayjs(end).utc().endOf("day").add(-1, "millisecond").toISOString()), + end: isoDateTOClickhouse(dayjs(end).utc().endOf("day").toISOString()), granularity, workspaceId, }); - // getLog() - // .atDebug() - // .log(`Running Clickhouse query with ${JSON.stringify(queryParams)} : ${query}`); - const resultSet = await clickhouse.query({ - query, - clickhouse_settings: { - wait_end_of_query: 1, - }, - query_params: queryParams, - }); - const rows: any[] = ((await resultSet.json()) as any).data; - log.atInfo().log(`Clickhouse query took ${Date.now() - timer}ms. Rows in result: ${rows.length}`); + getLog() + .atDebug() + .log(`Running Clickhouse query with ${JSON.stringify(queryParams)} : ${query}`); + log.atInfo().log(`Running Clickhouse events report for [${start}, ${end}]. Workspace: ${workspaceId || "all"}`); + try { + const resultSet = await clickhouse.query({ + query, + clickhouse_settings: { + wait_end_of_query: 1, + max_execution_time: 600, + timeout_overflow_mode: "throw", + }, + query_params: queryParams, + }); + const rows: any[] = ((await resultSet.json()) as any).data; + log.atInfo().log(`Clickhouse query took ${Date.now() - timer}ms. Rows in result: ${rows.length}`); - return rows.map(({ events, period, ...rest }) => ({ - events: Number(events), - period: period.replace(" ", "T") + ".000Z", - ...rest, - })); + return rows.map(({ events, period, ...rest }) => ({ + events: Number(events), + period: period.replace(" ", "T") + ".000Z", + ...rest, + })); + } catch (e) { + log + .atError() + .withCause(e) + .log(`Error running Clickhouse query for [${start}, ${end}]: ${getErrorMessage(e)}\n Query:\n${query}`); + throw e; + } } function getDate(param: string | undefined, defaultVal?: string): Date { @@ -113,7 +158,7 @@ function getDate(param: string | undefined, defaultVal?: string): Date { export async function query(pg: PG.Pool, sql: string, params: SqlQueryParameters = []): Promise[]> { const { query, values } = namedParameters(sql, params); - log.atInfo().log(`Querying: ${unrollParams(query, values)}`); + //log.atInfo().log(`Querying: ${unrollParams(query, values)}`); return await pg.query({ text: query, values }).then(res => { return res.rows; }); @@ -132,14 +177,17 @@ type WorkspaceInfo = { type ExtendedWorkspaceReportRow = WorkspaceReportRow & WorkspaceInfo; -export async function buildWorkspaceReport( - start: string, - end: string, - granularity: "day", - workspaceId: string | undefined -): Promise { +export async function buildWorkspaceReport({ + start, + end, + granularity, + workspaceId, + useCache = false, +}: ReportParams & { useCache?: boolean }): Promise { const [eventsReport, syncs] = await Promise.all([ - getEventsReport({ start, end, granularity, workspaceId }), + useCache + ? getEventsReportFromCache({ start, end, granularity, workspaceId }) + : getEventsReport({ start, end, granularity, workspaceId }), getSyncs(), ]); const report = new Map(); @@ -195,7 +243,13 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse const granularity = "day"; // = ((req.query.granularity as string) || "day").toLowerCase(); const timer = Date.now(); log.atInfo().log("Building workspace report"); - const reportResult = await buildWorkspaceReport(start, end, granularity, workspaceId); + const reportResult = await buildWorkspaceReport({ + start, + end, + granularity, + workspaceId, + useCache: req.query.cache === "true", + }); log.atInfo().log(`Workspace report built in ${Date.now() - timer}ms. Rows in result: ${reportResult.length}`); let records = extended ? await extend(reportResult) : reportResult; if (req.query.billing === "true") { diff --git a/webapps/ee-api/pages/api/sync-cache.ts b/webapps/ee-api/pages/api/sync-cache.ts new file mode 100644 index 000000000..5bc687e51 --- /dev/null +++ b/webapps/ee-api/pages/api/sync-cache.ts @@ -0,0 +1,69 @@ +import { NextApiRequest, NextApiResponse } from "next"; +import { withErrorHandler } from "../../lib/error-handler"; +import dayjs from "dayjs"; +import { auth } from "../../lib/auth"; +import { getLog } from "juava"; +import { getEventsReport } from "./report/workspace-stat"; +import { pg } from "../../lib/services"; + +const log = getLog(); + +const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { + const claims = await auth(req, res); + if (claims?.type !== "admin") { + throw new Error("Unauthorized"); + } + const logResult: Record = {}; + const granularity = ((req.query.granularity as string) || "month") as "month" | "day"; + const full = req.query.full === "true" || req.query.full === "1"; + const now = dayjs().utc(); + let startOfCurrentPeriod = now.startOf(granularity); + const lookbackMonths = 12; + const min = full + ? now.startOf(granularity).subtract(lookbackMonths, "month") + : now.get("day") > 1 + ? now.startOf(granularity) + : now.startOf(granularity).subtract(1, granularity); + log.atInfo().log(`Starting cache sync from ${min.toISOString()} to ${startOfCurrentPeriod.toISOString()}`); + while (startOfCurrentPeriod.isAfter(min) || startOfCurrentPeriod.isSame(min)) { + const start = startOfCurrentPeriod; + const end = startOfCurrentPeriod.add(1, granularity); + const timer = Date.now(); + log.atInfo().log(`Building report for [${start.toISOString()}, ${end.toISOString()}]`); + const report = await getEventsReport({ start: start.toISOString(), end: end.toISOString(), granularity: "day" }); + const ellapsed = Date.now() - timer; + log + .atInfo() + .log( + `Built report for [${start.toISOString()}, ${end.toISOString()}] in ${ellapsed}ms. Rows: ${ + report.length + } Adding data to cache` + ); + const query = ` + insert into newjitsuee.stat_cache ("workspaceId", "period", "events", "syncs") + values + ${report.map((_, i) => `($${i * 4 + 1}, $${i * 4 + 2}, $${i * 4 + 3}, $${i * 4 + 4})`).join(", ")} + on conflict ("workspaceId", "period") + do update set + "events" = EXCLUDED."events", + "syncs" = EXCLUDED."syncs"; + `; + const values = report.flatMap(({ workspaceId, period, events, syncs }) => [ + workspaceId, + period, + events, + syncs || 0, + ]); + log.atDebug().log(`Running batch insert for ${values.length / 4} rows`); + await pg.query(query, values); + logResult[start.toISOString()] = { + start: start.toISOString(), + end: end.toISOString(), + ms: Date.now() - timer, + }; + startOfCurrentPeriod = startOfCurrentPeriod.subtract(1, granularity).startOf(granularity); + } + res.json({ ok: true, log: logResult }); +}; + +export default withErrorHandler(handler); diff --git a/webapps/ee-api/scripts/sql/05-stat-cache.sql b/webapps/ee-api/scripts/sql/05-stat-cache.sql new file mode 100644 index 000000000..a2b7b9d9c --- /dev/null +++ b/webapps/ee-api/scripts/sql/05-stat-cache.sql @@ -0,0 +1,12 @@ +CREATE SCHEMA IF NOT EXISTS newjitsuee; + +CREATE TABLE IF NOT EXISTS newjitsuee.stat_cache +( + "workspaceId" TEXT NOT NULL, + "period" TIMESTAMP WITHOUT TIME ZONE, + "events" NUMERIC NOT NULL +); + +--ALTER TABLE newjitsuee.stat_cache add CONSTRAINT stat_cache_pk PRIMARY KEY ("workspaceId", "period"); +ALTER TABLE newjitsuee.stat_cache ADD COlUMN IF NOT EXISTS "syncs" NUMERIC NOT NULL DEFAULT 0; + From 14c87b0f3bb5106af14425aa4a7cb77eed773512 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 26 Aug 2024 17:53:01 +0400 Subject: [PATCH 0850/1353] docker-compose: use FORCE_UPDATE_DB flag --- docker-start-console.sh | 5 ++++- docker/docker-compose.yml | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/docker-start-console.sh b/docker-start-console.sh index 4b663c187..90386e0b1 100755 --- a/docker-start-console.sh +++ b/docker-start-console.sh @@ -96,7 +96,10 @@ main() { cmd=$1 export SIGNALS_LYFECICLE=1 if [ -z "$cmd" ]; then - if [ "$UPDATE_DB" = "1" ] || [ "$UPDATE_DB" = "yes" ] || [ "$UPDATE_DB" = "true" ]; then + if [ "$FORCE_UPDATE_DB" = "1" ] || [ "$FORCE_UPDATE_DB" = "yes" ] || [ "$FORCE_UPDATE_DB" = "true" ]; then + echo "FORCE_UPDATE_DB is set, updating database schema..." + prisma db push --skip-generate --schema schema.prisma --accept-data-loss + elif [ "$UPDATE_DB" = "1" ] || [ "$UPDATE_DB" = "yes" ] || [ "$UPDATE_DB" = "true" ]; then echo "UPDATE_DB is set, updating database schema..." prisma db push --skip-generate --schema schema.prisma fi diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 1ba151ed3..db939ca02 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -100,7 +100,7 @@ services: CLICKHOUSE_HOST: "clickhouse:8123" CLICKHOUSE_PASSWORD: "${CLICKHOUSE_PASSWORD:-default}" CLICKHOUSE_DATABASE: "newjitsu_metrics" - UPDATE_DB: "true" + FORCE_UPDATE_DB: "true" healthcheck: test: ["CMD", "curl", "-f", "http://console:3000/api/healthcheck"] interval: 2s From a86b014d378d46b29249c81b9f5df41d6de9813b Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 26 Aug 2024 17:55:41 +0400 Subject: [PATCH 0851/1353] console: lib/api fix bug: API endpoint without explicit body type does not accept json content type --- webapps/console/lib/api.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/lib/api.ts b/webapps/console/lib/api.ts index ce34dfd25..a6a323187 100644 --- a/webapps/console/lib/api.ts +++ b/webapps/console/lib/api.ts @@ -188,7 +188,7 @@ export function nextJsApiHandler(api: Api): NextApiHandler { body = parseResult.data; } else if (req.body) { try { - body = JSON.parse(req.body); + body = parseIfNeeded(req.body); } catch (e) { throw new ApiError(`Body ${req.method} ${req.url} is not a JSON object: ${getErrorMessage(e)}`, { body: req.body, From b5d07a5c55d0a63d4315a6fed314496e16ceb81a Mon Sep 17 00:00:00 2001 From: Jacob Spizziri Date: Thu, 29 Aug 2024 03:51:55 -0400 Subject: [PATCH 0852/1353] posthog-destination: support $screen_name for screen event (#1122) --- libs/core-functions/src/functions/posthog-destination.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/core-functions/src/functions/posthog-destination.ts b/libs/core-functions/src/functions/posthog-destination.ts index 92b4ecab7..965b7bff6 100644 --- a/libs/core-functions/src/functions/posthog-destination.ts +++ b/libs/core-functions/src/functions/posthog-destination.ts @@ -40,6 +40,7 @@ function getEventProperties(event: AnalyticsServerEvent) { $current_url: event.context?.page?.url, $host: event.context?.page?.host || getHostFromUrl(event.context?.page?.url), $pathname: event.context?.page?.path || getPathFromUrl(event.context?.page?.url), + $screen_name: event.type === 'screen' ? event.name : undefined, $browser: browser?.name, $device: browser?.deviceType, From b670dab181947f06e1cc6ac46469e0d990b3588c Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 29 Aug 2024 12:14:18 +0400 Subject: [PATCH 0853/1353] posthog-destination: get $device from context.device first --- .../src/functions/posthog-destination.ts | 37 ++++++++++--------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/libs/core-functions/src/functions/posthog-destination.ts b/libs/core-functions/src/functions/posthog-destination.ts index 965b7bff6..895695d10 100644 --- a/libs/core-functions/src/functions/posthog-destination.ts +++ b/libs/core-functions/src/functions/posthog-destination.ts @@ -30,22 +30,24 @@ function getPathFromUrl(url: string | undefined): string | undefined { function getEventProperties(event: AnalyticsServerEvent) { //see https://github.com/PostHog/posthog-js-lite/blob/master/posthog-web/src/context.ts - const browser = event.context?.userAgent - ? parseUserAgentLegacy(event.context?.userAgent, event.context?.userAgentVendor) - : undefined; - const geo = event.context?.geo || {}; + const analyticsContext = event.context || {}; + const page = analyticsContext.page || {}; + const browser = analyticsContext.userAgent + ? parseUserAgentLegacy(analyticsContext.userAgent, analyticsContext.userAgentVendor) + : ({} as any); + const geo = analyticsContext.geo || {}; return { - $referrer: event.context?.page?.referrer, - $referring_domain: event.context?.page?.referring_domain || getHostFromUrl(event.context?.page?.referrer), - $current_url: event.context?.page?.url, - $host: event.context?.page?.host || getHostFromUrl(event.context?.page?.url), - $pathname: event.context?.page?.path || getPathFromUrl(event.context?.page?.url), - $screen_name: event.type === 'screen' ? event.name : undefined, + $referrer: page.referrer, + $referring_domain: page.referring_domain || getHostFromUrl(page.referrer), + $current_url: page.url, + $host: page.host || getHostFromUrl(page.url), + $pathname: page.path || getPathFromUrl(page.url), + ...(event.type === "screen" ? { $screen_name: event.name } : {}), - $browser: browser?.name, - $device: browser?.deviceType, - $os: browser?.os, - $browser_version: browser?.browserVersion, + $browser: browser.name, + $device: analyticsContext.device?.type || browser.deviceType, + $os: browser.os, + $browser_version: browser.browserVersion, $geoip_city_name: geo.city?.name, $geoip_country_name: geo.country?.name, @@ -55,9 +57,10 @@ function getEventProperties(event: AnalyticsServerEvent) { $geoip_time_zone: geo.location?.timezone, //implement when it's implemented on a client, doesn't seem like a very important data points - $screen_dpi: event.context?.screen?.density, - $screen_height: event.context?.screen?.height, - $screen_width: event.context?.screen?.width, + $screen_dpi: analyticsContext.screen?.density, + $screen_height: analyticsContext.screen?.height, + $screen_width: analyticsContext.screen?.width, + ...getEventCustomProperties(event, { exclude: obj => { delete obj.referer; From c58e322d89ce8c920b89166cc7c2570a494e2a20 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 29 Aug 2024 18:06:37 +0400 Subject: [PATCH 0854/1353] posthog-destination: fill timestamp from event --- libs/core-functions/src/functions/posthog-destination.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libs/core-functions/src/functions/posthog-destination.ts b/libs/core-functions/src/functions/posthog-destination.ts index 895695d10..a97d7279e 100644 --- a/libs/core-functions/src/functions/posthog-destination.ts +++ b/libs/core-functions/src/functions/posthog-destination.ts @@ -2,7 +2,7 @@ import { JitsuFunction } from "@jitsu/protocols/functions"; import { RetryError } from "@jitsu/functions-lib"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import { PostHog } from "posthog-node"; -import { getEventCustomProperties } from "./lib"; +import { eventTimeSafeMs, getEventCustomProperties } from "./lib"; import { parseUserAgentLegacy } from "./lib/browser"; import { POSTHOG_DEFAULT_HOST, PosthogDestinationConfig } from "../meta"; @@ -139,6 +139,7 @@ const PosthogDestination: JitsuFunction Date: Mon, 2 Sep 2024 02:49:00 -0400 Subject: [PATCH 0855/1353] facebook-conversions: map page & screen events to "ViewContent" events (#1124) --- .../src/functions/facebook-conversions.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/libs/core-functions/src/functions/facebook-conversions.ts b/libs/core-functions/src/functions/facebook-conversions.ts index 22382b04d..7b2824dfa 100644 --- a/libs/core-functions/src/functions/facebook-conversions.ts +++ b/libs/core-functions/src/functions/facebook-conversions.ts @@ -37,6 +37,19 @@ function toPrettyString(responseJson: any) { return typeof responseJson === "string" ? responseJson : JSON.stringify(responseJson, null, 2); } +// https://developers.facebook.com/docs/meta-pixel/reference#standard-events +function eventNameFromEvent(event: AnalyticsServerEvent) { + switch (event.type) { + case "page": + case "screen": + return "ViewContent"; + case "track": + return event.event; + default: + return event.type; + } +} + /** * See https://developers.facebook.com/docs/marketing-api/conversions-api/using-the-api * and https://developers.facebook.com/docs/marketing-api/conversions-api/parameters @@ -50,7 +63,7 @@ const FacebookConversionsApi: JitsuFunction Date: Tue, 3 Sep 2024 17:26:28 +0400 Subject: [PATCH 0856/1353] rotor: facebook-conversions: provide app_data for actionSource=app --- .../src/functions/facebook-conversions.ts | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/libs/core-functions/src/functions/facebook-conversions.ts b/libs/core-functions/src/functions/facebook-conversions.ts index 7b2824dfa..914f4d2a5 100644 --- a/libs/core-functions/src/functions/facebook-conversions.ts +++ b/libs/core-functions/src/functions/facebook-conversions.ts @@ -59,6 +59,12 @@ const FacebookConversionsApi: JitsuFunction { if (["track", "page", "screen"].includes(event.type)) { + const actionSource = ctx.props?.actionSource || "website"; + const analyticsContext = event.context || ({} as any); + const device = analyticsContext.device || ({} as any); + const app = analyticsContext.app || ({} as any); + const screen = analyticsContext.screen || ({} as any); + const os = (analyticsContext.os?.name ?? "").toLowerCase(); const filter = createFilter(ctx.props.events || ""); if (!filter(event.type, event.event)) return; @@ -66,7 +72,32 @@ const FacebookConversionsApi: JitsuFunction Date: Tue, 3 Sep 2024 17:41:00 +0400 Subject: [PATCH 0857/1353] rotor: facebook-conversions: rollback event name changes --- .../src/functions/facebook-conversions.ts | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/libs/core-functions/src/functions/facebook-conversions.ts b/libs/core-functions/src/functions/facebook-conversions.ts index 914f4d2a5..b00f89514 100644 --- a/libs/core-functions/src/functions/facebook-conversions.ts +++ b/libs/core-functions/src/functions/facebook-conversions.ts @@ -37,19 +37,6 @@ function toPrettyString(responseJson: any) { return typeof responseJson === "string" ? responseJson : JSON.stringify(responseJson, null, 2); } -// https://developers.facebook.com/docs/meta-pixel/reference#standard-events -function eventNameFromEvent(event: AnalyticsServerEvent) { - switch (event.type) { - case "page": - case "screen": - return "ViewContent"; - case "track": - return event.event; - default: - return event.type; - } -} - /** * See https://developers.facebook.com/docs/marketing-api/conversions-api/using-the-api * and https://developers.facebook.com/docs/marketing-api/conversions-api/parameters @@ -69,7 +56,7 @@ const FacebookConversionsApi: JitsuFunction Date: Fri, 6 Sep 2024 12:05:01 +0400 Subject: [PATCH 0858/1353] console: Table Name Prefix display fix --- .../console/components/SyncEditorPage/SyncEditorPage.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx index 26c1cbffe..5a842262b 100644 --- a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx +++ b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx @@ -226,7 +226,11 @@ function SyncEditor({ } const legacyMode = !!existingLink && typeof syncOptions?.namespace === "undefined"; - const sourceNamespaces: string[] = catalog?.streams?.map((s: any) => s.namespace).filter(onlyUnique) || []; + const sourceNamespaces: string[] = + catalog?.streams + ?.map((s: any) => s.namespace) + .filter(n => !!n) + .filter(onlyUnique) || []; const legacyPrefix = legacyMode && sourceNamespaces?.length > 0 ? sourceNamespaces?.length === 1 From 2498e1805f5a6ea463b89b98afbc7919a98219f2 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 6 Sep 2024 15:55:52 +0400 Subject: [PATCH 0859/1353] console,rotor: Braze destination --- .../src/functions/braze-destination.ts | 278 ++++++++++++++++++ libs/core-functions/src/index.ts | 2 + libs/core-functions/src/meta.ts | 42 +++ webapps/console/lib/schema/destinations.tsx | 10 + webapps/console/lib/schema/icons/blaze.tsx | 11 + 5 files changed, 343 insertions(+) create mode 100644 libs/core-functions/src/functions/braze-destination.ts create mode 100644 webapps/console/lib/schema/icons/blaze.tsx diff --git a/libs/core-functions/src/functions/braze-destination.ts b/libs/core-functions/src/functions/braze-destination.ts new file mode 100644 index 000000000..ed845f59b --- /dev/null +++ b/libs/core-functions/src/functions/braze-destination.ts @@ -0,0 +1,278 @@ +import { FullContext, JitsuFunction } from "@jitsu/protocols/functions"; +import { RetryError } from "@jitsu/functions-lib"; +import type { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; +import { BrazeCredentials } from "../meta"; +import { eventTimeSafeMs } from "./lib"; +import omit from "lodash/omit"; +import { pick } from "lodash"; +import { identify } from "../../__tests__/lib/datalayout-test-data"; + +const endpoints = { + "US-01 : dashboard-01.braze.com": "https://rest.iad-01.braze.com", + "US-02 : dashboard-02.braze.com": "https://rest.iad-02.braze.com", + "US-03 : dashboard-03.braze.com": "https://rest.iad-03.braze.com", + "US-04 : dashboard-04.braze.com": "https://rest.iad-04.braze.com", + "US-05 : dashboard-05.braze.com": "https://rest.iad-05.braze.com", + "US-06 : dashboard-06.braze.com": "https://rest.iad-06.braze.com", + "US-07 : dashboard-07.braze.com": "https://rest.iad-07.braze.com", + "US-08 : dashboard-08.braze.com": "https://rest.iad-08.braze.com", + "US-09 : dashboard-09.braze.com": "https://rest.iad-09.braze.com", + "EU-01 : dashboard-01.braze.eu": "https://rest.fra-01.braze.eu", + "EU-02 : dashboard-02.braze.eu": "https://rest.fra-02.braze.eu", +}; +export type HttpRequest = { + method?: string; + url: string; + payload?: any; + headers?: Record; +}; + +function toBrazeGender(gender: string | null | undefined): string | null | undefined { + if (!gender) { + return gender; + } + + const genders: Record = { + M: ["man", "male", "m"], + F: ["woman", "female", "w", "f"], + O: ["other", "o"], + N: ["not applicable", "n"], + P: ["prefer not to say", "p"], + }; + + const brazeGender = Object.keys(genders).find(key => genders[key].includes(gender.toLowerCase())); + return brazeGender || gender; +} + +function getAnonymousIdAlias(event: AnalyticsServerEvent, ctx: FullContext) { + if (ctx.props.useJitsuAnonymousIdAlias && event.anonymousId) { + return { + alias_name: event.anonymousId, + alias_label: "anonymous_id", + }; + } +} + +function getIdPart(event: AnalyticsServerEvent, ctx: FullContext) { + let idPart = {} as any; + const traits = event.traits || event.context?.traits || {}; + const user_alias = traits.user_alias || event.properties?.user_alias || getAnonymousIdAlias(event, ctx); + const braze_id = traits.braze_id || event.properties?.braze_id; + if (event.userId) { + idPart.external_id = event.userId; + } else if (user_alias) { + idPart.user_alias = user_alias; + } else if (braze_id) { + idPart.braze_id = braze_id; + } + idPart.email = traits.email; + idPart.phone = traits.phone; + if (Object.keys(idPart).length === 0) { + throw new Error('One of "external_id", "user_alias", "braze_id", "email" or "phone" is required.'); + } + return idPart; +} + +function trackEvent(event: AnalyticsServerEvent, ctx: FullContext): any { + return { + events: [ + { + ...getIdPart(event, ctx), + app_id: ctx.props.appId, + name: event.event, + time: new Date(eventTimeSafeMs(event)).toISOString(), + properties: event.properties, + _update_existing_only: false, + }, + ], + }; +} + +function trackPurchase(event: AnalyticsServerEvent, ctx: FullContext): any { + const products = event.properties?.products as any[]; + if (!products || !products.length) { + return; + } + const reservedKeys = ["product_id", "currency", "price", "quantity"]; + const event_properties = omit(event.properties, ["products"]); + const base = { + ...getIdPart(event, ctx), + app_id: ctx.props.appId, + time: new Date(eventTimeSafeMs(event)).toISOString(), + _update_existing_only: false, + }; + return { + purchases: products.map(product => ({ + ...base, + product_id: product.product_id, + currency: product.currency ?? "USD", + price: product.price, + quantity: product.quantity, + properties: { + ...omit(product, reservedKeys), + ...event_properties, + }, + })), + }; +} + +function updateUserProfile(event: AnalyticsServerEvent, ctx: FullContext): any { + const geo = ctx.geo || ({} as any); + const traits = event.traits || ({} as any); + const knownProps = [ + "country", + "current_location", + "date_of_first_session", + "date_of_last_session", + "dob", + "email", + "email_subscribe", + "email_open_tracking_disabled", + "email_click_tracking_disabled", + "facebook", + "first_name", + "home_city", + "image_url", + "language", + "last_name", + "marked_email_as_spam_at", + "phone", + "push_subscribe", + "push_tokens", + "time_zone", + "twitter", + "subscription_groups", + ]; + return { + attributes: [ + { + ...getIdPart(event, ctx), + country: ctx.geo?.country?.name, + current_location: + geo.location?.latitude && geo.location?.longitude + ? { + latitude: geo.location?.latitude, + longitude: geo.location?.longitude, + } + : undefined, + first_name: traits.firstName, + last_name: traits.lastName, + home_city: traits.address?.city, + image_url: traits.avatar, + time_zone: geo.location?.timezone, + gender: toBrazeGender(traits.gender), + ...pick(traits, knownProps), + custom_attributes: omit(traits, knownProps), + _update_existing_only: false, + }, + ], + }; +} + +function identifyUser(event: AnalyticsServerEvent, ctx: FullContext): any { + const external_id = event.userId; + const user_alias = event.traits?.user_alias || getAnonymousIdAlias(event, ctx); + if (!external_id || !user_alias) { + return; + } + return { + aliases_to_identify: [ + { + external_id, + user_alias, + }, + ], + merge_behavior: "merge", + }; +} + +const BrazeDestination: JitsuFunction = async (event, ctx) => { + const endpoint = endpoints[ctx.props.endpoint]; + if (!endpoint) { + throw new Error(`Unknown endpoint ${ctx.props.endpoint}`); + } + try { + let httpRequests: HttpRequest[] = []; + const headers = { + "Content-type": "application/json", + Authorization: `Bearer ${ctx.props.apiKey}`, + }; + const url = `${endpoint}/users/track`; + try { + if (event.type === "identify") { + httpRequests.push({ + url, + payload: updateUserProfile(event, ctx), + headers, + }); + const identify = identifyUser(event, ctx); + if (identify) { + httpRequests.push({ + url: `${endpoint}/users/identify`, + payload: identify, + headers, + }); + } + } else if (event.type === "track" && event.event != "Order Completed") { + httpRequests.push({ + url, + payload: trackEvent(event, ctx), + headers, + }); + } else if (event.type === "track" && event.event === "Order Completed") { + httpRequests.push({ + url, + payload: trackPurchase(event, ctx), + headers, + }); + } else if ((event.type === "page" || event.type === "screen") && ctx.props.sendPageEvents) { + const track = { ...event }; + track.event = event.type; + const props = { ...event.properties }; + if (event.name) { + props[`${event.type}_name`] = event.name; + } + if (event.category) { + props[`${event.type}_category`] = event.category; + } + track.properties = props; + httpRequests.push({ + url, + payload: trackEvent(track, ctx), + headers, + }); + } + } catch (e: any) { + ctx.log.error(e); + return false; + } + + for (const httpRequest of httpRequests) { + if (httpRequest.payload) { + const method = httpRequest.method || "POST"; + const result = await ctx.fetch(httpRequest.url, { + method, + headers: httpRequest.headers, + ...(httpRequest.payload ? { body: JSON.stringify(httpRequest.payload) } : {}), + }); + if (result.status !== 200 && result.status !== 201) { + throw new Error( + `Braze ${method} ${httpRequest.url}:${ + httpRequest.payload ? `${JSON.stringify(httpRequest.payload)} --> ` : "" + }${result.status} ${await result.text()}` + ); + } else { + ctx.log.debug(`Braze ${method} ${httpRequest.url}: ${result.status} ${await result.text()}`); + } + } + } + } catch (e: any) { + throw new RetryError(e.message); + } +}; + +BrazeDestination.displayName = "braze-destination"; + +BrazeDestination.description = "This functions covers jitsu events and sends them to Braze"; + +export default BrazeDestination; diff --git a/libs/core-functions/src/index.ts b/libs/core-functions/src/index.ts index 0c5e044b4..6930bc967 100644 --- a/libs/core-functions/src/index.ts +++ b/libs/core-functions/src/index.ts @@ -18,6 +18,7 @@ import AmplitudeDestination from "./functions/amplitude-destination"; import FacebookConversionsApi from "./functions/facebook-conversions"; import IntercomDestination from "./functions/intercom-destination"; import HubspotDestination from "./functions/hubspot-destination"; +import BrazeDestination from "./functions/braze-destination"; const builtinDestinations: Record = { "builtin.destination.bulker": BulkerDestination as JitsuFunction, @@ -25,6 +26,7 @@ const builtinDestinations: Record "builtin.destination.intercom": IntercomDestination as JitsuFunction, "builtin.destination.segment-proxy": SegmentDestination as JitsuFunction, "builtin.destination.june": JuneDestination as JitsuFunction, + "builtin.destination.braze": BrazeDestination as JitsuFunction, "builtin.destination.ga4": Ga4Destination as JitsuFunction, "builtin.destination.webhook": WebhookDestination as JitsuFunction, "builtin.destination.posthog": PosthogDestination as JitsuFunction, diff --git a/libs/core-functions/src/meta.ts b/libs/core-functions/src/meta.ts index 042ef8016..e1a13e1ac 100644 --- a/libs/core-functions/src/meta.ts +++ b/libs/core-functions/src/meta.ts @@ -135,6 +135,48 @@ export const JuneCredentials = z.object({ }); export type JuneCredentials = z.infer; +export const BrazeCredentials = z.object({ + apiKey: z.string().describe(`API Key::Created under Developer Console in the Braze Dashboard.`), + endpoint: z + .enum([ + "US-01 : dashboard-01.braze.com", + "US-02 : dashboard-02.braze.com", + "US-03 : dashboard-03.braze.com", + "US-04 : dashboard-04.braze.com", + "US-05 : dashboard-05.braze.com", + "US-06 : dashboard-06.braze.com", + "US-07 : dashboard-07.braze.com", + "US-08 : dashboard-08.braze.com", + "US-09 : dashboard-09.braze.com", + "EU-01 : dashboard-01.braze.eu", + "EU-02 : dashboard-02.braze.eu", + ]) + .optional() + .default("US-01 : dashboard-01.braze.com") + .describe( + "Your Braze REST endpoint. More details" + ), + appId: z + .string() + .optional() + .describe( + "App ID::The app identifier used to reference specific Apps in requests made to the Braze API. Created under Developer Console in the Braze Dashboard." + ), + useJitsuAnonymousIdAlias: z + .boolean() + .optional() + .default(false) + .describe( + "Use Jitsu anonymousId as an alias for identified and anonymous profiles. Enables support for anonymous (alias-only) profiles." + ), + sendPageEvents: z + .boolean() + .optional() + .default(false) + .describe("Send page and screen events as Braze Custom Events"), +}); +export type BrazeCredentials = z.infer; + export const SegmentCredentials = z.object({ apiBase: z.string().default("https://api.segment.io/v1").describe("API Base::Segment API Base"), writeKey: z diff --git a/webapps/console/lib/schema/destinations.tsx b/webapps/console/lib/schema/destinations.tsx index d4469840f..8cfc9bc7f 100644 --- a/webapps/console/lib/schema/destinations.tsx +++ b/webapps/console/lib/schema/destinations.tsx @@ -10,6 +10,7 @@ import hubspotIcon from "./icons/hubspot"; import mixpanelIcon from "./icons/mixpanel"; import facebookIcon from "./icons/facebook"; import juneIcon from "./icons/june"; +import blazeIcon from "./icons/blaze"; import mongodbIcon from "./icons/mongodb"; import ga4Icon from "./icons/ga4"; @@ -694,6 +695,15 @@ export const coreDestinations: DestinationType[] = [ credentials: meta.JuneCredentials, description: "June.so is a product analytics platform that provides insights into user behavior.", }, + { + id: "braze", + icon: blazeIcon, + title: "Braze", + tags: "Product Analytics", + connectionOptions: CloudDestinationsConnectionOptions, + credentials: meta.BrazeCredentials, + description: "Braze is a customer engagement platform used by businesses for multichannel marketing.", + }, { id: "mongodb", icon: mongodbIcon, diff --git a/webapps/console/lib/schema/icons/blaze.tsx b/webapps/console/lib/schema/icons/blaze.tsx new file mode 100644 index 000000000..646439a47 --- /dev/null +++ b/webapps/console/lib/schema/icons/blaze.tsx @@ -0,0 +1,11 @@ +export default ( + + + + + +); From f276c7c01cbdc9e53ccaeb80efc4f688decfe112 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 6 Sep 2024 15:59:55 +0400 Subject: [PATCH 0860/1353] console,rotor: Braze destination --- libs/core-functions/src/functions/braze-destination.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/libs/core-functions/src/functions/braze-destination.ts b/libs/core-functions/src/functions/braze-destination.ts index ed845f59b..9b5280d43 100644 --- a/libs/core-functions/src/functions/braze-destination.ts +++ b/libs/core-functions/src/functions/braze-destination.ts @@ -5,7 +5,6 @@ import { BrazeCredentials } from "../meta"; import { eventTimeSafeMs } from "./lib"; import omit from "lodash/omit"; import { pick } from "lodash"; -import { identify } from "../../__tests__/lib/datalayout-test-data"; const endpoints = { "US-01 : dashboard-01.braze.com": "https://rest.iad-01.braze.com", From 7dd1f743e6633abe8c8eba3e7e59f9db26a94f91 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Sat, 7 Sep 2024 11:52:14 +0400 Subject: [PATCH 0861/1353] console: Streams added Strict toggle (#1123) * console: Streams added Strict toggle * console: EventsBrowser: choose correct ingest type icon * console: improve Stream Api key editor, automatically save added write keys --- .../components/ApiKeyEditor/ApiKeyEditor.tsx | 138 +++++++++++++++++- .../ConfigObjectEditor/ConfigEditor.tsx | 9 +- .../components/DataView/EventsBrowser.tsx | 2 +- webapps/console/lib/schema/index.ts | 1 + .../console/pages/[workspaceId]/streams.tsx | 32 +++- .../api/[workspaceId]/config/[type]/[id].ts | 6 +- 6 files changed, 173 insertions(+), 15 deletions(-) diff --git a/webapps/console/components/ApiKeyEditor/ApiKeyEditor.tsx b/webapps/console/components/ApiKeyEditor/ApiKeyEditor.tsx index e929ec97c..597dbf35a 100644 --- a/webapps/console/components/ApiKeyEditor/ApiKeyEditor.tsx +++ b/webapps/console/components/ApiKeyEditor/ApiKeyEditor.tsx @@ -2,9 +2,13 @@ import { ApiKey } from "../../lib/schema"; import { useState } from "react"; import { Button, Table, Tooltip } from "antd"; import { branding } from "../../lib/branding"; -import { confirmOp, copyTextToClipboard } from "../../lib/ui"; +import { confirmOp, copyTextToClipboard, feedbackSuccess } from "../../lib/ui"; import { FaCopy, FaPlus, FaTrash } from "react-icons/fa"; import { randomId } from "juava"; +import { WidgetProps } from "@rjsf/utils"; +import { getConfigApi } from "../../lib/useApi"; +import { useWorkspace } from "../../lib/context"; +import { RefreshCw } from "lucide-react"; import { CustomWidgetProps } from "../ConfigObjectEditor/Editors"; const CopyToClipboard: React.FC<{ text: string }> = ({ text }) => { @@ -160,6 +164,134 @@ export const ApiKeysEditor: React.FC & { compact?: b ); }; -export const BrowserKeysEditor: React.FC & { compact?: boolean }> = (props: any) => { - return ; +export const StreamKeysEditor: React.FC> = props => { + const context = props.formContext; + const workspace = useWorkspace(); + const type = context?.type; + const [loading, setLoading] = useState(false); + const [keys, setKeys] = useState(props.value || []); + const columns: any[] = [ + { + title: "Key", + key: "id", + width: "90%", + render: (key: ApiKey) => { + return key.plaintext && key.id !== "Generating key" ? ( +
      + + {" "} + Key generated! Copy this key and store it in a safe place. You will not be able to + see it again. + + } + > + + {key.id}:{key.plaintext} + + + +
      + ) : ( + <> + + {branding.productName} doesn't store full version of a key. If you haven't recorded the key, generate + a new one + + } + > + + {key.id}:{key?.hint?.replace("*", "*".repeat(32 - 6))} + + + + ); + }, + }, + ]; + columns.push({ + title: "", + className: "text-right", + key: "actions", + render: (key: ApiKey) => { + if (key.id === "Generating key") { + return <>; + } + return ( +
      + +
      + ); + }, + }); + return ( +
      + {keys.length === 0 && !loading &&
      Keys list is empty
      } + {(keys.length > 0 || loading) && ( +
    k.id} + /> + )} +
    + {keys.find(key => !!key.plaintext) ? ( +
    + Congrats! You're generated a new key(s). Copy it an keep in the safe place. +
    + You will not be able to see it again once you leave the page +
    + ) : ( +
    + )} + +
    + + ); }; diff --git a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx index d3d565d80..744cb09f5 100644 --- a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx +++ b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx @@ -189,7 +189,7 @@ const FormList: React.FC = props => { ); }; -const CustomCheckbox = function (props) { +export const CustomCheckbox = function (props) { return props.onChange(!props.value)} />; }; @@ -247,7 +247,7 @@ const EditorComponent: React.FC = props => { const schema = zodToJsonSchema(objectTypeFactory(object)); const [formState, setFormState] = useState(undefined); const hasErrors = formState?.errors?.length > 0; - const isTouched = formState !== undefined || !!createNew; + const [isTouched, setTouched] = useState(!!createNew); const [testResult, setTestResult] = useState(undefined); const uiSchema = getUiSchema(schema, fields); @@ -257,6 +257,7 @@ const EditorComponent: React.FC = props => { const onFormChange = state => { setFormState(state); setTestResult(undefined); + setTouched(true); log.atDebug().log(`Updating editor form state`, state); }; const withLoading = (fn: () => Promise) => async () => { @@ -291,11 +292,11 @@ const EditorComponent: React.FC = props => { liveValidate={true} validator={validator} onSubmit={async ({ formData }) => { - if (onTest && testConnectionEnabled && testConnectionEnabled(formData || object)) { + if (onTest && (typeof testConnectionEnabled === "undefined" || testConnectionEnabled(formData || object))) { const testRes = testResult || (await onTest(formState?.formData || object)); if (!testRes.ok) { modal.confirm({ - title: "Connection test failed", + title: "Check failed", content: testRes.error, okText: "Save anyway", okType: "danger", diff --git a/webapps/console/components/DataView/EventsBrowser.tsx b/webapps/console/components/DataView/EventsBrowser.tsx index bdb757cf5..3735fe76e 100644 --- a/webapps/console/components/DataView/EventsBrowser.tsx +++ b/webapps/console/components/DataView/EventsBrowser.tsx @@ -1174,7 +1174,7 @@ const IncomingEventsTable = ({ loadEvents, loading, streamType, entityType, acto //dataIndex: "type", render: (d: IncomingEvent) => { const eventName = d.type === "track" ? d.event?.event || d.type : d.type; - const isDeviceEvent = d.pagePath; + const isDeviceEvent = d.ingestType === "browser"; return ( ; diff --git a/webapps/console/pages/[workspaceId]/streams.tsx b/webapps/console/pages/[workspaceId]/streams.tsx index b34126479..6b70b9b2f 100644 --- a/webapps/console/pages/[workspaceId]/streams.tsx +++ b/webapps/console/pages/[workspaceId]/streams.tsx @@ -1,6 +1,6 @@ import { WorkspacePageLayout } from "../../components/PageLayout/WorkspacePageLayout"; import { Button, Input, notification, Tag, Tooltip } from "antd"; -import { ConfigEditor, ConfigEditorProps } from "../../components/ConfigObjectEditor/ConfigEditor"; +import { ConfigEditor, ConfigEditorProps, CustomCheckbox } from "../../components/ConfigObjectEditor/ConfigEditor"; import { StreamConfig } from "../../lib/schema"; import { useAppConfig, useWorkspace } from "../../lib/context"; import React, { PropsWithChildren, useMemo, useState } from "react"; @@ -9,7 +9,7 @@ import { FaExternalLinkAlt, FaSpinner, FaTrash, FaWrench } from "react-icons/fa" import { branding } from "../../lib/branding"; import { useRouter } from "next/router"; import { TrackingIntegrationDocumentation } from "../../components/TrackingIntegrationDocumentation/TrackingIntegrationDocumentation"; -import { BrowserKeysEditor } from "../../components/ApiKeyEditor/ApiKeyEditor"; +import { StreamKeysEditor } from "../../components/ApiKeyEditor/ApiKeyEditor"; import { useQuery } from "@tanstack/react-query"; import { getEeClient } from "../../lib/ee-client"; import { requireDefined } from "juava"; @@ -510,11 +510,35 @@ const StreamsList: React.FC<{}> = () => { }, }, ], + onTest: async (stream: StreamConfig) => { + if (stream.strict) { + if ( + (!stream.privateKeys || stream.privateKeys.length === 0) && + (!stream.publicKeys || stream.publicKeys.length === 0) + ) { + return { ok: false, error: "At least one writeKey required in Strict Mode." }; + } + } + return { ok: true }; + }, fields: { type: { constant: "stream" }, workspaceId: { constant: workspace.id }, + strict: { + editor: CustomCheckbox, + displayName: "Strict Mode", + advanced: false, + documentation: ( + <> + In Strict Mode, Jitsu requires a valid writeKey to ingest events into the current stream. +
    + Without Strict Mode, if a correct writeKey is not provided, Jitsu may attempt to identify the stream based + on the domain or, if there is only one stream in the workspace, it will automatically select that stream. + + ), + }, privateKeys: { - editor: BrowserKeysEditor, + editor: StreamKeysEditor, displayName: "Server-to-server Write Keys", advanced: false, documentation: ( @@ -522,7 +546,7 @@ const StreamsList: React.FC<{}> = () => { ), }, publicKeys: { - editor: BrowserKeysEditor, + editor: StreamKeysEditor, displayName: "Browser Write Keys", advanced: false, documentation: ( diff --git a/webapps/console/pages/api/[workspaceId]/config/[type]/[id].ts b/webapps/console/pages/api/[workspaceId]/config/[type]/[id].ts index 4f0342821..56529e3ea 100644 --- a/webapps/console/pages/api/[workspaceId]/config/[type]/[id].ts +++ b/webapps/console/pages/api/[workspaceId]/config/[type]/[id].ts @@ -62,9 +62,9 @@ export const api: Api = { if (!object) { throw new ApiError(`${type} with id ${id} does not exist`); } - const data = parseObject(type, body); - const merged = configObjectType.merge(object.config, data); - const filtered = await configObjectType.inputFilter(merged, "update"); + const merged = configObjectType.merge(object.config, { ...body, id, workspaceId }); + const data = parseObject(type, merged); + const filtered = await configObjectType.inputFilter(data, "update"); delete filtered.id; delete filtered.workspaceId; From 7500ba2119472064b70f6e3a0190193899f8f931 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Sat, 7 Sep 2024 16:32:30 +0400 Subject: [PATCH 0862/1353] docker-compose.yml bring back setting for compatibility purpose --- docker/docker-compose.yml | 1 + libs/core-functions/src/meta.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index db939ca02..68adb6954 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -100,6 +100,7 @@ services: CLICKHOUSE_HOST: "clickhouse:8123" CLICKHOUSE_PASSWORD: "${CLICKHOUSE_PASSWORD:-default}" CLICKHOUSE_DATABASE: "newjitsu_metrics" + UPDATE_DB: "true" FORCE_UPDATE_DB: "true" healthcheck: test: ["CMD", "curl", "-f", "http://console:3000/api/healthcheck"] diff --git a/libs/core-functions/src/meta.ts b/libs/core-functions/src/meta.ts index e1a13e1ac..f9f65a9a7 100644 --- a/libs/core-functions/src/meta.ts +++ b/libs/core-functions/src/meta.ts @@ -167,7 +167,7 @@ export const BrazeCredentials = z.object({ .optional() .default(false) .describe( - "Use Jitsu anonymousId as an alias for identified and anonymous profiles. Enables support for anonymous (alias-only) profiles." + "Use Anonymous Id Alias::Use Jitsu anonymousId as an alias for identified and anonymous profiles. Enables support for anonymous (alias-only) profiles." ), sendPageEvents: z .boolean() From cbfe055e227c0ddc6ff527fd9a90c8ba95dd210e Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 17 Sep 2024 16:14:55 +0400 Subject: [PATCH 0863/1353] console,rotor: keep original names option --- .../src/functions/bulker-destination.ts | 123 ++++++++++-------- services/rotor/src/lib/functions-chain.ts | 1 + .../ConnectionEditorPage.tsx | 68 +++++++--- webapps/console/lib/schema/destinations.tsx | 1 + 4 files changed, 123 insertions(+), 70 deletions(-) diff --git a/libs/core-functions/src/functions/bulker-destination.ts b/libs/core-functions/src/functions/bulker-destination.ts index 8f645e176..1d418c302 100644 --- a/libs/core-functions/src/functions/bulker-destination.ts +++ b/libs/core-functions/src/functions/bulker-destination.ts @@ -55,6 +55,8 @@ export function removeUndefined(param: any): any { } export function jitsuLegacy(event: AnalyticsServerEvent, ctx: FullContext): MappedEvent { + const keepOriginalNames = !!ctx.props.keepOriginalNames; + const translateFunc = keepOriginalNames ? (p: any) => p : toSnakeCase; let url: URL | undefined = undefined; const analyticsContext = event.context || {}; const urlStr = analyticsContext.page?.url || event.properties?.url; @@ -66,7 +68,7 @@ export function jitsuLegacy(event: AnalyticsServerEvent, ctx: FullContext +): MappedEvent[] | MappedEvent { let transformed: any; //track without properties for segment multi-table layout, because full track event is stored in the table with event name let baseTrackFlat: any; + const keepOriginalNames = !!ctx.props.keepOriginalNames; + const transferFunc = keepOriginalNames ? transfer : transferAsSnakeCase; + const transferValueFunc = keepOriginalNames ? transferValue : transferValueAsSnakeCase; switch (event.type) { case "identify": if (singleTable) { @@ -161,25 +170,25 @@ export function segmentLayout(event: AnalyticsServerEvent, singleTable: boolean) traits: {}, }, }; - transferAsSnakeCase(transformed.context, event.context, ["groupId", "traits"]); - transferAsSnakeCase(transformed.context.traits, event.context?.traits, ["groupId"]); - transferAsSnakeCase(transformed.context.traits, event.traits, ["groupId"]); - transferValueAsSnakeCase( + transferFunc(transformed.context, event.context, ["groupId", "traits"]); + transferFunc(transformed.context.traits, event.context?.traits, ["groupId"]); + transferFunc(transformed.context.traits, event.traits, ["groupId"]); + transferValueFunc( transformed.context, "group_id", event.context?.groupId || event.traits?.groupId || event.context?.traits?.groupId ); - transferAsSnakeCase(transformed, event.properties); - transferAsSnakeCase(transformed, event, ["context", "properties", "traits", "type", TableNameParameter]); + transferFunc(transformed, event.properties); + transferFunc(transformed, event, ["context", "properties", "traits", "type", TableNameParameter]); } else { transformed = { context: {}, }; - transferAsSnakeCase(transformed.context, event.context, ["traits"]); - transferAsSnakeCase(transformed, event.properties); - transferAsSnakeCase(transformed, event.context?.traits); - transferAsSnakeCase(transformed, event.traits); - transferAsSnakeCase(transformed, event, ["context", "properties", "traits", "type", TableNameParameter]); + transferFunc(transformed.context, event.context, ["traits"]); + transferFunc(transformed, event.properties); + transferFunc(transformed, event.context?.traits); + transferFunc(transformed, event.traits); + transferFunc(transformed, event, ["context", "properties", "traits", "type", TableNameParameter]); } break; case "group": @@ -189,26 +198,19 @@ export function segmentLayout(event: AnalyticsServerEvent, singleTable: boolean) group: {}, }, }; - transferAsSnakeCase(transformed.context, event.context); - transferAsSnakeCase(transformed.context.group, event.traits); - transferValueAsSnakeCase(transformed.context, "group_id", event.groupId); - transferAsSnakeCase(transformed, event.properties); - transferAsSnakeCase(transformed, event, [ - "context", - "properties", - "traits", - "type", - "groupId", - TableNameParameter, - ]); + transferFunc(transformed.context, event.context); + transferFunc(transformed.context.group, event.traits); + transferValueFunc(transformed.context, "group_id", event.groupId); + transferFunc(transformed, event.properties); + transferFunc(transformed, event, ["context", "properties", "traits", "type", "groupId", TableNameParameter]); } else { transformed = { context: {}, }; - transferAsSnakeCase(transformed.context, event.context, ["traits"]); - transferAsSnakeCase(transformed, event.properties); - transferAsSnakeCase(transformed, event.traits); - transferAsSnakeCase(transformed, event, ["context", "properties", "traits", "type", TableNameParameter]); + transferFunc(transformed.context, event.context, ["traits"]); + transferFunc(transformed, event.properties); + transferFunc(transformed, event.traits); + transferFunc(transformed, event, ["context", "properties", "traits", "type", TableNameParameter]); } break; case "track": @@ -218,22 +220,18 @@ export function segmentLayout(event: AnalyticsServerEvent, singleTable: boolean) traits: {}, }, }; - transferAsSnakeCase(transformed.context, event.context, ["groupId", "traits"]); - transferAsSnakeCase(transformed.context.traits, event.context?.traits, ["groupId"]); - transferAsSnakeCase(transformed.context.traits, event.properties?.traits, ["groupId"]); - transferValueAsSnakeCase( - transformed.context, - "group_id", - event.context?.groupId || event.context?.traits?.groupId - ); - transferAsSnakeCase(transformed, event.properties, ["traits"]); - transferAsSnakeCase(transformed, event, ["context", "properties", "type", TableNameParameter]); + transferFunc(transformed.context, event.context, ["groupId", "traits"]); + transferFunc(transformed.context.traits, event.context?.traits, ["groupId"]); + transferFunc(transformed.context.traits, event.properties?.traits, ["groupId"]); + transferValueFunc(transformed.context, "group_id", event.context?.groupId || event.context?.traits?.groupId); + transferFunc(transformed, event.properties, ["traits"]); + transferFunc(transformed, event, ["context", "properties", "type", TableNameParameter]); } else { baseTrackFlat = {}; - transferAsSnakeCase(baseTrackFlat, event, ["properties", "type", TableNameParameter]); + transferFunc(baseTrackFlat, event, ["properties", "type", TableNameParameter]); transformed = {}; - transferAsSnakeCase(transformed, event.properties); - transferAsSnakeCase(transformed, event, ["properties", "type", TableNameParameter]); + transferFunc(transformed, event.properties); + transferFunc(transformed, event, ["properties", "type", TableNameParameter]); } break; default: @@ -243,19 +241,15 @@ export function segmentLayout(event: AnalyticsServerEvent, singleTable: boolean) traits: {}, }, }; - transferAsSnakeCase(transformed.context, event.context, ["groupId", "traits"]); - transferAsSnakeCase(transformed.context.traits, event.context?.traits, ["groupId"]); - transferValueAsSnakeCase( - transformed.context, - "group_id", - event.context?.groupId || event.context?.traits?.groupId - ); - transferAsSnakeCase(transformed, event.properties); - transferAsSnakeCase(transformed, event, ["context", "properties", TableNameParameter]); + transferFunc(transformed.context, event.context, ["groupId", "traits"]); + transferFunc(transformed.context.traits, event.context?.traits, ["groupId"]); + transferValueFunc(transformed.context, "group_id", event.context?.groupId || event.context?.traits?.groupId); + transferFunc(transformed, event.properties); + transferFunc(transformed, event, ["context", "properties", TableNameParameter]); } else { transformed = {}; - transferAsSnakeCase(transformed, event.properties); - transferAsSnakeCase(transformed, event, ["properties", TableNameParameter]); + transferFunc(transformed, event.properties); + transferFunc(transformed, event, ["properties", TableNameParameter]); } } if (event[TableNameParameter]) { @@ -288,6 +282,17 @@ function transferAsSnakeCase(target: Record, source: any, omit?: st } } +function transfer(target: Record, source: any, omit?: string[]) { + if (typeof source !== "object") { + return; + } + for (const [k, v] of Object.entries(source)) { + if (!omit || !omit.includes(k)) { + target[k] = v; + } + } +} + function transferValueAsSnakeCase(target: Record, property: string, source: any) { if (typeof source === "undefined") { return; @@ -295,6 +300,13 @@ function transferValueAsSnakeCase(target: Record, property: string, target[property] = toSnakeCase(source); } +function transferValue(target: Record, property: string, source: any) { + if (typeof source === "undefined") { + return; + } + target[property] = source; +} + export function plural(s: string) { switch (s) { case "identify": @@ -311,8 +323,8 @@ export function plural(s: string) { } export const dataLayouts: Record> = { - segment: event => segmentLayout(event, false), - "segment-single-table": event => segmentLayout(event, true), + segment: (event, ctx) => segmentLayout(event, false, ctx), + "segment-single-table": (event, ctx) => segmentLayout(event, true, ctx), "jitsu-legacy": jitsuLegacy, passthrough: event => ({ event: omit(event, TableNameParameter), table: event[TableNameParameter] ?? "events" }), }; @@ -322,6 +334,7 @@ export type BulkerDestinationConfig = { destinationId: string; authToken: string; dataLayout?: DataLayoutType; + keepOriginalNames?: boolean; }; const BulkerDestination: JitsuFunction = async (event, ctx) => { diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index 87b2b564a..62949b35c 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -116,6 +116,7 @@ export function buildFunctionChain( destinationId: connection.id, authToken: bulkerAuthKey, dataLayout: connectionData.dataLayout ?? "segment-single-table", + keepOriginalNames: connectionData.keepOriginalNames, }, }; } else { diff --git a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx index 8d56c3b8f..75c95c6f9 100644 --- a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx +++ b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx @@ -7,7 +7,7 @@ import { ConfigurationObjectLinkDbModel } from "../../prisma/schema"; import { useRouter } from "next/router"; import { assertTrue, getLog, requireDefined } from "juava"; import { Disable } from "../Disable/Disable"; -import { Button, Input, InputNumber, Radio, Select, Switch } from "antd"; +import { Button, Input, InputNumber, Radio, Select, Switch, Tooltip } from "antd"; import { WLink } from "../Workspace/WLink"; import { FaExternalLinkAlt } from "react-icons/fa"; import { BaseBulkerConnectionOptions, getCoreDestinationType } from "../../lib/schema/destinations"; @@ -444,13 +444,16 @@ function ConnectionEditor({ ), component: ( - { - updateOptions({ primaryKey, ...(primaryKey === "" ? { deduplicate: false } : {}) }); - }} - /> + + { + updateOptions({ primaryKey, ...(primaryKey === "" ? { deduplicate: false } : {}) }); + }} + /> + ), }); } @@ -519,13 +522,16 @@ function ConnectionEditor({ ), name: "Timestamp Column", component: ( - { - updateOptions({ timestampColumn }); - }} - /> + + { + updateOptions({ timestampColumn }); + }} + /> + ), }); } @@ -589,6 +595,38 @@ function ConnectionEditor({ ), }); } + if (hasZodFields(connectionOptionsZodType, "keepOriginalNames")) { + configItems.push({ + group: "Advanced", + documentation: ( + <> + By default, Jitsu translate all event properties to snakeCase, e.g.: myPropertyName is translated + to my_property_name.
    + Enable this option if you want to keep original names + + ), + name: "Keep Original Names", + component: ( + + {" "} + { + const opts = { keepOriginalNames: sf }; + if (sf && connectionOptions.primaryKey === "message_id") { + opts.primaryKey = "messageId"; + } else if (!sf && connectionOptions.primaryKey === "messageId") { + opts.primaryKey = "message_id"; + } + updateOptions(opts); + }} + /> + + ), + }); + } if (hasZodFields(connectionOptionsZodType, "events")) { configItems.push({ documentation: ( diff --git a/webapps/console/lib/schema/destinations.tsx b/webapps/console/lib/schema/destinations.tsx index 8cfc9bc7f..a125bd946 100644 --- a/webapps/console/lib/schema/destinations.tsx +++ b/webapps/console/lib/schema/destinations.tsx @@ -141,6 +141,7 @@ export const BaseBulkerConnectionOptions = z .enum(["segment", "jitsu-legacy", "segment-single-table", "passthrough"]) .default("segment-single-table"), schemaFreeze: z.boolean().default(false), + keepOriginalNames: z.boolean().default(false), }) .merge(BatchModeOptions) .merge(FunctionsConnectionOptions); From 4464b220a7e3251955e2db1959ccdaaf9e694bef Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 17 Sep 2024 16:23:18 +0400 Subject: [PATCH 0864/1353] console,rotor: keep original names option --- .../components/ConnectionEditorPage/ConnectionEditorPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx index 75c95c6f9..86a8835fa 100644 --- a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx +++ b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx @@ -614,7 +614,7 @@ function ConnectionEditor({ className="max-w-xs" value={connectionOptions.keepOriginalNames} onChange={sf => { - const opts = { keepOriginalNames: sf }; + const opts = { keepOriginalNames: sf } as any; if (sf && connectionOptions.primaryKey === "message_id") { opts.primaryKey = "messageId"; } else if (!sf && connectionOptions.primaryKey === "messageId") { From 45733dd3d9728d15b8437a2245f997a57f9138e7 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 17 Sep 2024 16:37:33 +0400 Subject: [PATCH 0865/1353] console,rotor: keep original names option --- .../__tests__/datalayout-jitsu-legacy.test.ts | 4 ++-- .../__tests__/datalayout-segment.test.ts | 21 +++++++++++-------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/libs/core-functions/__tests__/datalayout-jitsu-legacy.test.ts b/libs/core-functions/__tests__/datalayout-jitsu-legacy.test.ts index bb5c66cf8..9bec6f309 100644 --- a/libs/core-functions/__tests__/datalayout-jitsu-legacy.test.ts +++ b/libs/core-functions/__tests__/datalayout-jitsu-legacy.test.ts @@ -178,8 +178,8 @@ const legacyPageExpected = { }; test("legacy event", () => { - const identifyLegacyResult = jitsuLegacy(identify, {} as FullContext).event; - const pageLegacyResult = jitsuLegacy(page, {} as FullContext).event; + const identifyLegacyResult = jitsuLegacy(identify, { props: {} } as FullContext).event; + const pageLegacyResult = jitsuLegacy(page, { props: {} } as FullContext).event; console.log(JSON.stringify(identifyLegacyResult, null, 2)); expect(identifyLegacyResult).toStrictEqual(legacyIdentifyExpected); diff --git a/libs/core-functions/__tests__/datalayout-segment.test.ts b/libs/core-functions/__tests__/datalayout-segment.test.ts index f2c14abcc..6e8687164 100644 --- a/libs/core-functions/__tests__/datalayout-segment.test.ts +++ b/libs/core-functions/__tests__/datalayout-segment.test.ts @@ -1,4 +1,4 @@ -import { MappedEvent, segmentLayout } from "../src/functions/bulker-destination"; +import { BulkerDestinationConfig, MappedEvent, segmentLayout } from "../src/functions/bulker-destination"; import { group, @@ -14,27 +14,29 @@ import { trackExpected, trackExpectedSingleTable, } from "./lib/datalayout-test-data"; +import { FullContext } from "@jitsu/protocols/functions"; test("segment event", () => { - const pageResult = segmentLayout(page, false); + const ctx = { props: {} } as FullContext; + const pageResult = segmentLayout(page, false, ctx); expect(Array.isArray(pageResult)).toBe(false); const pageEvent = (pageResult as MappedEvent).event; console.log(JSON.stringify(pageEvent, null, 2)); expect(pageEvent).toStrictEqual(pageExpected); - const identifyResult = segmentLayout(identify, false); + const identifyResult = segmentLayout(identify, false, ctx); expect(Array.isArray(identifyResult)).toBe(false); const identifyEvent = (identifyResult as MappedEvent).event; console.log(JSON.stringify(identifyEvent, null, 2)); expect(identifyEvent).toStrictEqual(identifyExpected); - const trackResult = segmentLayout(track, false); + const trackResult = segmentLayout(track, false, ctx); expect(Array.isArray(trackResult)).toBe(true); const trackEvents = (trackResult as MappedEvent[]).map(t => t.event); console.log(JSON.stringify(trackEvents, null, 2)); expect(trackEvents).toStrictEqual(trackExpected); - const groupResult = segmentLayout(group, false); + const groupResult = segmentLayout(group, false, ctx); expect(Array.isArray(groupResult)).toBe(false); const groupEvents = (groupResult as MappedEvent).event; console.log(JSON.stringify(groupEvents, null, 2)); @@ -42,25 +44,26 @@ test("segment event", () => { }); test("segment event single table", () => { - const pageResult = segmentLayout(page, true); + const ctx = { props: {} } as FullContext; + const pageResult = segmentLayout(page, true, ctx); expect(Array.isArray(pageResult)).toBe(false); const pageEvent = (pageResult as MappedEvent).event; console.log(JSON.stringify(pageEvent, null, 2)); expect(pageEvent).toStrictEqual(pageExpectedSingleTable); - const identifyResult = segmentLayout(identify, true); + const identifyResult = segmentLayout(identify, true, ctx); expect(Array.isArray(identifyResult)).toBe(false); const identifyEvent = (identifyResult as MappedEvent).event; console.log(JSON.stringify(identifyEvent, null, 2)); expect(identifyEvent).toStrictEqual(identifyExpectedSingleTable); - const trackResult = segmentLayout(track, true); + const trackResult = segmentLayout(track, true, ctx); expect(Array.isArray(trackResult)).toBe(false); const trackEvent = (trackResult as MappedEvent).event; console.log(JSON.stringify(trackEvent, null, 2)); expect(trackEvent).toStrictEqual(trackExpectedSingleTable); - const groupResult = segmentLayout(group, true); + const groupResult = segmentLayout(group, true, ctx); expect(Array.isArray(groupResult)).toBe(false); const groupEvents = (groupResult as MappedEvent).event; console.log(JSON.stringify(groupEvents, null, 2)); From 3b42c4d139e1bfca56acb596a5393b4f9f80f361 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 17 Sep 2024 18:52:22 +0400 Subject: [PATCH 0866/1353] console: SyncEditor support for custom schedule --- webapps/console/components/SyncEditorPage/SyncEditorPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx index 5a842262b..d081791d1 100644 --- a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx +++ b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx @@ -616,7 +616,7 @@ function SyncEditor({ const optionDisabled = billing.enabled && !billing.loading && - billing.settings.maximumSyncFrequency && + typeof billing.settings.maximumSyncFrequency !== "undefined" && minuteFrequency < billing.settings.maximumSyncFrequency; return { ...rest, From 7f9b1fdf33949208463e75217165a94392f0823c Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 19 Sep 2024 22:18:10 +0400 Subject: [PATCH 0867/1353] console: SchemaForm: support for date patterns --- webapps/console/components/ConfigObjectEditor/SchemaForm.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx b/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx index c15fff22c..cf3597e2f 100644 --- a/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx +++ b/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx @@ -178,6 +178,9 @@ export const SchemaForm: React.FC<{ case "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}Z$": format = "YYYY-MM-DDTHH:mm:ss.SSS[Z]"; break; + case "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{6}Z$": + format = "YYYY-MM-DDTHH:mm:ss.SSSSSS[Z]"; + break; } return ; } From 4b3dbece77f3b76e8fa627b0ef1c44140a0cd48e Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 20 Sep 2024 12:10:19 +0400 Subject: [PATCH 0868/1353] console: docker image: run events-log-trim on cron --- all.Dockerfile | 7 ++++++- console.cron | 1 + webapps/console/pages/api/admin/events-log-trim.ts | 10 ++++++++-- 3 files changed, 15 insertions(+), 3 deletions(-) create mode 100755 console.cron diff --git a/all.Dockerfile b/all.Dockerfile index bcfd32918..98bad1d59 100644 --- a/all.Dockerfile +++ b/all.Dockerfile @@ -6,7 +6,7 @@ FROM node:22-bookworm as base WORKDIR /app RUN apt-get update -y -RUN apt-get install nano curl bash netcat-traditional procps jq -y +RUN apt-get install nano curl cron bash netcat-traditional procps jq -y FROM base as builder @@ -43,6 +43,11 @@ COPY --from=builder /app/webapps/console/.next/standalone ./ COPY --from=builder /app/webapps/console/.next/static ./webapps/console/.next/static COPY --from=builder /app/webapps/console/public ./webapps/console/public +COPY --from=builder /app/console.cron /etc/cron.d/console.cron +RUN chmod 0644 /etc/cron.d/console.cron +RUN crontab /etc/cron.d/console.cron +RUN cron + EXPOSE 3000 HEALTHCHECK CMD curl --fail http://localhost:3000/api/healthcheck || exit 1 diff --git a/console.cron b/console.cron new file mode 100755 index 000000000..4c33b24e0 --- /dev/null +++ b/console.cron @@ -0,0 +1 @@ +*/3 * * * * curl --silent --show-error http://localhost:3000/api/admin/events-log-trim diff --git a/webapps/console/pages/api/admin/events-log-trim.ts b/webapps/console/pages/api/admin/events-log-trim.ts index 8f7ce1e3f..9c5c22688 100644 --- a/webapps/console/pages/api/admin/events-log-trim.ts +++ b/webapps/console/pages/api/admin/events-log-trim.ts @@ -2,6 +2,7 @@ import { createRoute, verifyAdmin } from "../../../lib/api"; import { getLog, stopwatch } from "juava"; import { clickhouse } from "../../../lib/server/clickhouse"; import dayjs from "dayjs"; +import { ApiError } from "../../../lib/shared/errors"; export const log = getLog("events-log-trim"); @@ -10,8 +11,13 @@ export default createRoute() auth: true, streaming: true, }) - .handler(async ({ res, user }) => { - await verifyAdmin(user); + .handler(async ({ req, res, user }) => { + //check if coming from localhost + const isLocalhost = req.socket.remoteAddress === "127.0.0.1"; + if (!isLocalhost) { + log.atInfo().log("Check admin user from: " + req.socket.remoteAddress); + await verifyAdmin(user); + } log.atInfo().log(`Trimming events log`); const metricsSchema = process.env.CLICKHOUSE_METRICS_SCHEMA || process.env.CLICKHOUSE_DATABASE || "newjitsu_metrics"; From e55d048539d65a9c0f8f6f67ee2de6617a2bb6b9 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 20 Sep 2024 12:12:32 +0400 Subject: [PATCH 0869/1353] console: docker image: run events-log-trim on cron --- webapps/console/pages/api/admin/events-log-trim.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/webapps/console/pages/api/admin/events-log-trim.ts b/webapps/console/pages/api/admin/events-log-trim.ts index 9c5c22688..fe4c1e45b 100644 --- a/webapps/console/pages/api/admin/events-log-trim.ts +++ b/webapps/console/pages/api/admin/events-log-trim.ts @@ -2,7 +2,6 @@ import { createRoute, verifyAdmin } from "../../../lib/api"; import { getLog, stopwatch } from "juava"; import { clickhouse } from "../../../lib/server/clickhouse"; import dayjs from "dayjs"; -import { ApiError } from "../../../lib/shared/errors"; export const log = getLog("events-log-trim"); From c9c781fa0f46414bc9fd63767c44e8010614dd5d Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 20 Sep 2024 12:35:02 +0400 Subject: [PATCH 0870/1353] console: docker image: run events-log-trim on cron --- all.Dockerfile | 1 - docker-start-console.sh | 2 ++ webapps/console/pages/api/admin/events-log-trim.ts | 8 ++++++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/all.Dockerfile b/all.Dockerfile index 98bad1d59..da78a0a98 100644 --- a/all.Dockerfile +++ b/all.Dockerfile @@ -46,7 +46,6 @@ COPY --from=builder /app/webapps/console/public ./webapps/console/public COPY --from=builder /app/console.cron /etc/cron.d/console.cron RUN chmod 0644 /etc/cron.d/console.cron RUN crontab /etc/cron.d/console.cron -RUN cron EXPOSE 3000 diff --git a/docker-start-console.sh b/docker-start-console.sh index 90386e0b1..5f89c8019 100755 --- a/docker-start-console.sh +++ b/docker-start-console.sh @@ -10,6 +10,8 @@ init() { echo "Initializing console..." inited="1" curl --silent --show-error http://localhost:3000/api/admin/events-log-init?token=$CONSOLE_INIT_TOKEN + echo "Starting cron..." + cron echo "" fi } diff --git a/webapps/console/pages/api/admin/events-log-trim.ts b/webapps/console/pages/api/admin/events-log-trim.ts index fe4c1e45b..2ec522dba 100644 --- a/webapps/console/pages/api/admin/events-log-trim.ts +++ b/webapps/console/pages/api/admin/events-log-trim.ts @@ -1,4 +1,4 @@ -import { createRoute, verifyAdmin } from "../../../lib/api"; +import { createRoute, getUser, verifyAdmin } from "../../../lib/api"; import { getLog, stopwatch } from "juava"; import { clickhouse } from "../../../lib/server/clickhouse"; import dayjs from "dayjs"; @@ -7,7 +7,6 @@ export const log = getLog("events-log-trim"); export default createRoute() .GET({ - auth: true, streaming: true, }) .handler(async ({ req, res, user }) => { @@ -15,6 +14,11 @@ export default createRoute() const isLocalhost = req.socket.remoteAddress === "127.0.0.1"; if (!isLocalhost) { log.atInfo().log("Check admin user from: " + req.socket.remoteAddress); + const user = await getUser(res, req); + if (!user) { + res.status(401).send({ error: "Authorization Required" }); + return; + } await verifyAdmin(user); } log.atInfo().log(`Trimming events log`); From 8e355c302bb34ef7b7ef7750a035fbfa7493a89f Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 20 Sep 2024 12:46:16 +0400 Subject: [PATCH 0871/1353] console: docker image: run events-log-trim on cron --- docker-start-console.sh | 2 +- webapps/console/pages/api/admin/events-log-trim.ts | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/docker-start-console.sh b/docker-start-console.sh index 5f89c8019..ec856d107 100755 --- a/docker-start-console.sh +++ b/docker-start-console.sh @@ -10,9 +10,9 @@ init() { echo "Initializing console..." inited="1" curl --silent --show-error http://localhost:3000/api/admin/events-log-init?token=$CONSOLE_INIT_TOKEN + echo "" echo "Starting cron..." cron - echo "" fi } diff --git a/webapps/console/pages/api/admin/events-log-trim.ts b/webapps/console/pages/api/admin/events-log-trim.ts index 2ec522dba..74e556ff1 100644 --- a/webapps/console/pages/api/admin/events-log-trim.ts +++ b/webapps/console/pages/api/admin/events-log-trim.ts @@ -9,14 +9,17 @@ export default createRoute() .GET({ streaming: true, }) - .handler(async ({ req, res, user }) => { + .handler(async ({ req, res }) => { //check if coming from localhost - const isLocalhost = req.socket.remoteAddress === "127.0.0.1"; + const isLocalhost = + req.socket.remoteAddress === "127.0.0.1" || + req.socket.remoteAddress === "0:0:0:0:0:0:0:1" || + req.socket.remoteAddress === "::1"; if (!isLocalhost) { log.atInfo().log("Check admin user from: " + req.socket.remoteAddress); const user = await getUser(res, req); if (!user) { - res.status(401).send({ error: "Authorization Required" }); + res.status(401).send({ error: "Authorization Required: " + req.socket.remoteAddress }); return; } await verifyAdmin(user); From 3eb964792223a76f8ef3e2d363bdd7619a4201be Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 20 Sep 2024 12:48:06 +0400 Subject: [PATCH 0872/1353] console: docker image: run events-log-trim on cron --- webapps/console/pages/api/admin/events-log-init.ts | 5 +++-- webapps/console/pages/api/admin/events-log-trim.ts | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/webapps/console/pages/api/admin/events-log-init.ts b/webapps/console/pages/api/admin/events-log-init.ts index eab6bda12..42605d8a2 100644 --- a/webapps/console/pages/api/admin/events-log-init.ts +++ b/webapps/console/pages/api/admin/events-log-init.ts @@ -1,9 +1,10 @@ import { createRoute, getUser, verifyAdmin } from "../../../lib/api"; -import { checkRawToken, getLog } from "juava"; +import { checkRawToken } from "juava"; import { clickhouse } from "../../../lib/server/clickhouse"; import { z } from "zod"; +import { getServerLog } from "../../../lib/server/log"; -export const log = getLog("events-log-init"); +export const log = getServerLog("events-log-init"); export default createRoute() .GET({ diff --git a/webapps/console/pages/api/admin/events-log-trim.ts b/webapps/console/pages/api/admin/events-log-trim.ts index 74e556ff1..eda54c11b 100644 --- a/webapps/console/pages/api/admin/events-log-trim.ts +++ b/webapps/console/pages/api/admin/events-log-trim.ts @@ -1,9 +1,10 @@ import { createRoute, getUser, verifyAdmin } from "../../../lib/api"; -import { getLog, stopwatch } from "juava"; +import { stopwatch } from "juava"; import { clickhouse } from "../../../lib/server/clickhouse"; import dayjs from "dayjs"; +import { getServerLog } from "../../../lib/server/log"; -export const log = getLog("events-log-trim"); +export const log = getServerLog("events-log-trim"); export default createRoute() .GET({ From 225af9a8bd986f73fccab0b5b3ca9cf8ed17e003 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 20 Sep 2024 13:13:29 +0400 Subject: [PATCH 0873/1353] console: docker image: run events-log-trim on cron --- docker-start-console.sh | 12 +----------- webapps/console/pages/api/admin/events-log-trim.ts | 9 ++++----- 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/docker-start-console.sh b/docker-start-console.sh index ec856d107..63513f29c 100755 --- a/docker-start-console.sh +++ b/docker-start-console.sh @@ -72,7 +72,6 @@ healthcheck() { fi echo "" fi - kill_console kill -9 $$ exit 1 fi @@ -81,19 +80,10 @@ healthcheck() { start_console() { cd /app/webapps/console - HOSTNAME="::" node server.js & echo $! > /app/console.pid + HOSTNAME="::" node server.js return $? } -kill_console() { - if [ -f /app/console.pid ]; then - pid=$(cat /app/console.pid) - echo "Killing console with pid $pid" - kill -9 $pid - #rm /app/console.pid - fi -} - main() { cmd=$1 export SIGNALS_LYFECICLE=1 diff --git a/webapps/console/pages/api/admin/events-log-trim.ts b/webapps/console/pages/api/admin/events-log-trim.ts index eda54c11b..65f9486db 100644 --- a/webapps/console/pages/api/admin/events-log-trim.ts +++ b/webapps/console/pages/api/admin/events-log-trim.ts @@ -6,21 +6,20 @@ import { getServerLog } from "../../../lib/server/log"; export const log = getServerLog("events-log-trim"); +const localIps = ["127.0.0.1", "0:0:0:0:0:0:0:1", "::1", "::ffff:127.0.0.1"]; + export default createRoute() .GET({ streaming: true, }) .handler(async ({ req, res }) => { //check if coming from localhost - const isLocalhost = - req.socket.remoteAddress === "127.0.0.1" || - req.socket.remoteAddress === "0:0:0:0:0:0:0:1" || - req.socket.remoteAddress === "::1"; + const isLocalhost = localIps.includes(req.socket.remoteAddress); if (!isLocalhost) { log.atInfo().log("Check admin user from: " + req.socket.remoteAddress); const user = await getUser(res, req); if (!user) { - res.status(401).send({ error: "Authorization Required: " + req.socket.remoteAddress }); + res.status(401).send({ error: "Authorization Required" }); return; } await verifyAdmin(user); From f3858ecb09b1dc3bc77fae3fc760cbd20eea0dbe Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 20 Sep 2024 13:15:56 +0400 Subject: [PATCH 0874/1353] console: docker image: run events-log-trim on cron --- webapps/console/pages/api/admin/events-log-trim.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/pages/api/admin/events-log-trim.ts b/webapps/console/pages/api/admin/events-log-trim.ts index 65f9486db..1f3b4ef25 100644 --- a/webapps/console/pages/api/admin/events-log-trim.ts +++ b/webapps/console/pages/api/admin/events-log-trim.ts @@ -14,7 +14,7 @@ export default createRoute() }) .handler(async ({ req, res }) => { //check if coming from localhost - const isLocalhost = localIps.includes(req.socket.remoteAddress); + const isLocalhost = localIps.includes(req.socket.remoteAddress || ""); if (!isLocalhost) { log.atInfo().log("Check admin user from: " + req.socket.remoteAddress); const user = await getUser(res, req); From eb8dadb48c6f869a17f2502f3782066f61609f3b Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 20 Sep 2024 13:42:11 +0400 Subject: [PATCH 0875/1353] console: docker image: run events-log-trim on cron --- docker-start-console.sh | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/docker-start-console.sh b/docker-start-console.sh index 63513f29c..f1d664159 100755 --- a/docker-start-console.sh +++ b/docker-start-console.sh @@ -78,15 +78,9 @@ healthcheck() { fi } -start_console() { - cd /app/webapps/console - HOSTNAME="::" node server.js - return $? -} - main() { cmd=$1 - export SIGNALS_LYFECICLE=1 + export SIGNALS_LIFECYCLE=1 if [ -z "$cmd" ]; then if [ "$FORCE_UPDATE_DB" = "1" ] || [ "$FORCE_UPDATE_DB" = "yes" ] || [ "$FORCE_UPDATE_DB" = "true" ]; then echo "FORCE_UPDATE_DB is set, updating database schema..." @@ -97,7 +91,11 @@ main() { fi echo "Starting the app" healthcheck $$ & - exit_code=$(start_console) + + cd /app/webapps/console + HOSTNAME="::" node server.js + exit_code=$? + sleep 1000 cancel_healthcheck="1" echo "App stopped with exit code ${exit_code}, exiting..." From 0263eb07515f672ba374cf264b8d97b47c25b9ae Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 20 Sep 2024 15:13:16 +0400 Subject: [PATCH 0876/1353] console: docker image: run events-log-trim on cron --- console.cron | 2 +- docker-start-console.sh | 22 ++++++++++++++----- .../pages/api/admin/events-log-trim.ts | 8 ++++++- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/console.cron b/console.cron index 4c33b24e0..fa3ab30a2 100755 --- a/console.cron +++ b/console.cron @@ -1 +1 @@ -*/3 * * * * curl --silent --show-error http://localhost:3000/api/admin/events-log-trim +*/15 * * * * curl --silent --show-error http://localhost:3000/api/admin/events-log-trim diff --git a/docker-start-console.sh b/docker-start-console.sh index f1d664159..78a04a5b3 100755 --- a/docker-start-console.sh +++ b/docker-start-console.sh @@ -72,12 +72,28 @@ healthcheck() { fi echo "" fi + kill_console kill -9 $$ exit 1 fi fi } +start_console() { + cd /app/webapps/console + HOSTNAME="::" node server.js & echo $! > /app/console.pid + return $? +} + +kill_console() { + if [ -f /app/console.pid ]; then + pid=$(cat /app/console.pid) + echo "Killing console with pid $pid" + kill -9 $pid + #rm /app/console.pid + fi +} + main() { cmd=$1 export SIGNALS_LIFECYCLE=1 @@ -91,11 +107,7 @@ main() { fi echo "Starting the app" healthcheck $$ & - - cd /app/webapps/console - HOSTNAME="::" node server.js - exit_code=$? - + exit_code=$(start_console) sleep 1000 cancel_healthcheck="1" echo "App stopped with exit code ${exit_code}, exiting..." diff --git a/webapps/console/pages/api/admin/events-log-trim.ts b/webapps/console/pages/api/admin/events-log-trim.ts index 1f3b4ef25..50f68df77 100644 --- a/webapps/console/pages/api/admin/events-log-trim.ts +++ b/webapps/console/pages/api/admin/events-log-trim.ts @@ -15,6 +15,7 @@ export default createRoute() .handler(async ({ req, res }) => { //check if coming from localhost const isLocalhost = localIps.includes(req.socket.remoteAddress || ""); + let admin = false; if (!isLocalhost) { log.atInfo().log("Check admin user from: " + req.socket.remoteAddress); const user = await getUser(res, req); @@ -23,6 +24,7 @@ export default createRoute() return; } await verifyAdmin(user); + admin = true; } log.atInfo().log(`Trimming events log`); const metricsSchema = @@ -150,7 +152,11 @@ export default createRoute() log.atError().withCause(e).log(`Failed to delete partition ${oldPartition}`); } log.atInfo().log(`Completed in ${sw.elapsedPretty()}`); - res.json(result); + if (admin) { + res.json(result); + } else { + res.json({ status: "ok" }); + } }) .toNextApiHandler(); export const config = { From a549e1056e7045dd4b4627ce28ef238fecab5350 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 20 Sep 2024 16:55:34 +0400 Subject: [PATCH 0877/1353] console: small UI fixes --- webapps/console/pages/[workspaceId]/syncs/index.tsx | 6 +++--- webapps/console/pages/[workspaceId]/syncs/tasks.tsx | 7 ++++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/webapps/console/pages/[workspaceId]/syncs/index.tsx b/webapps/console/pages/[workspaceId]/syncs/index.tsx index b7fe5ff85..9aac760f0 100644 --- a/webapps/console/pages/[workspaceId]/syncs/index.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/index.tsx @@ -241,7 +241,7 @@ function SyncsTable({ links, services, destinations }: RemoteEntitiesProps) { }, }, { - title:
    Updated (UTC)
    , + title:
    Started (UTC)
    , width: "12%", render: (text, link) => { if (tasks.error) { @@ -251,8 +251,8 @@ function SyncsTable({ links, services, destinations }: RemoteEntitiesProps) { return ( t && (
    - {`${dayjs(t.updated_at).fromNow(true)} ago`} -
    {t ? formatDate(t.updated_at) : ""}
    + {`${dayjs(t.started_at).fromNow(true)} ago`} +
    {t ? formatDate(t.started_at) : ""}
    ) ); diff --git a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx index f4378388c..62d36a95a 100644 --- a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx @@ -460,8 +460,13 @@ function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap, re key: "duration", width: "12%", render: (text, task) => { + //const hours = dayjs(task.updated_at).diff(dayjs(task.started_at), "hour", true); return ( -
    {dayjs(task.updated_at).from(dayjs(task.started_at), true)}
    + +
    + {dayjs(task.updated_at).from(dayjs(task.started_at), true)} +
    +
    ); }, }, From 9dc1de38ebf07c85de8956ac53e9a616b45a6b38 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 20 Sep 2024 21:04:12 +0400 Subject: [PATCH 0878/1353] juava: log: always log to console --- libs/juava/src/log.ts | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/libs/juava/src/log.ts b/libs/juava/src/log.ts index 52323c016..d829b681c 100644 --- a/libs/juava/src/log.ts +++ b/libs/juava/src/log.ts @@ -85,7 +85,7 @@ const levelColors: Record = { function inBrowser() { // @ts-ignore - return typeof window !== "undefined"; + return typeof document !== "undefined" && typeof window !== "undefined"; } export const logFormat = { @@ -107,12 +107,7 @@ export const logFormat = { }; //process.stdout is not available on Vercel's edge runtime -const writeln = process.stdout - ? (msg: string) => { - process.stdout.write(msg); - process.stdout.write("\n"); - } - : console.log; +const writeln = console.log; function dispatch(msg: LogMessage) { const levelColor = levelColors[msg.level]; From 13c2e568a967b5f6b0064338bdf6e6b10a69249c Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 20 Sep 2024 21:21:40 +0400 Subject: [PATCH 0879/1353] console: docker: fix logging --- docker-start-console.sh | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/docker-start-console.sh b/docker-start-console.sh index 78a04a5b3..f1d664159 100755 --- a/docker-start-console.sh +++ b/docker-start-console.sh @@ -72,28 +72,12 @@ healthcheck() { fi echo "" fi - kill_console kill -9 $$ exit 1 fi fi } -start_console() { - cd /app/webapps/console - HOSTNAME="::" node server.js & echo $! > /app/console.pid - return $? -} - -kill_console() { - if [ -f /app/console.pid ]; then - pid=$(cat /app/console.pid) - echo "Killing console with pid $pid" - kill -9 $pid - #rm /app/console.pid - fi -} - main() { cmd=$1 export SIGNALS_LIFECYCLE=1 @@ -107,7 +91,11 @@ main() { fi echo "Starting the app" healthcheck $$ & - exit_code=$(start_console) + + cd /app/webapps/console + HOSTNAME="::" node server.js + exit_code=$? + sleep 1000 cancel_healthcheck="1" echo "App stopped with exit code ${exit_code}, exiting..." From efffb0a0e95abb53b4cefb85ec5901b9bd02792d Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 20 Sep 2024 21:35:21 +0400 Subject: [PATCH 0880/1353] console: docker image: run events-log-trim on cron FIX --- webapps/console/pages/api/admin/events-log-trim.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/webapps/console/pages/api/admin/events-log-trim.ts b/webapps/console/pages/api/admin/events-log-trim.ts index 50f68df77..aed0938e8 100644 --- a/webapps/console/pages/api/admin/events-log-trim.ts +++ b/webapps/console/pages/api/admin/events-log-trim.ts @@ -29,7 +29,8 @@ export default createRoute() log.atInfo().log(`Trimming events log`); const metricsSchema = process.env.CLICKHOUSE_METRICS_SCHEMA || process.env.CLICKHOUSE_DATABASE || "newjitsu_metrics"; - const clickhouseCluster = process.env.CLICKHOUSE_CLUSTER || "jitsu_cluster"; + const metricsCluster = process.env.CLICKHOUSE_METRICS_CLUSTER || process.env.CLICKHOUSE_CLUSTER; + const onCluster = metricsCluster ? ` ON CLUSTER ${metricsCluster}` : ""; const eventsLogSize = process.env.EVENTS_LOG_SIZE ? parseInt(process.env.EVENTS_LOG_SIZE) : 200000; // trim logs to eventsLogSize only after exceeding threshold const thresholdSize = Math.floor(eventsLogSize * 1.25); @@ -49,7 +50,7 @@ export default createRoute() and timestamp < {timestamp :DateTime64};`; - const dropPartitionQuery: string = `alter table ${metricsSchema}.events_log on cluster ${clickhouseCluster} drop partition {partition:String}`; + const dropPartitionQuery: string = `alter table ${metricsSchema}.events_log ${onCluster} drop partition {partition:String}`; const result: any[] = []; const sw = stopwatch(); let actorsResult: any = {}; @@ -149,7 +150,7 @@ export default createRoute() }); log.atInfo().log(`Deleted partition ${oldPartition}`); } catch (e: any) { - log.atError().withCause(e).log(`Failed to delete partition ${oldPartition}`); + log.atDebug().withCause(e).log(`Failed to delete partition ${oldPartition}`); } log.atInfo().log(`Completed in ${sw.elapsedPretty()}`); if (admin) { From 5b138a806893a05aead814811744a198bb06380a Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 23 Sep 2024 17:02:15 +0400 Subject: [PATCH 0881/1353] console: Disable Destination database setting for provisioned clickhouse --- webapps/console/components/SyncEditorPage/SyncEditorPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx index d081791d1..32af2c26a 100644 --- a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx +++ b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx @@ -497,7 +497,7 @@ function SyncEditor({ /> ), }, - destinationType.usesBulker + destinationType.usesBulker && !destination.provisioned ? { name: `Destination ${capitalize(namespaceImpl.name)}`, documentation: ( From f9611c1de283df9ed23d4f752e31f54bfaddefb5 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 25 Sep 2024 15:33:29 +0400 Subject: [PATCH 0882/1353] rotor: add subset of crypto lib to user functions --- .../src/functions/lib/crypto-code.ts | 30 +++++++++++++++++++ .../src/functions/lib/crypto-code.txtjs | 29 ++++++++++++++++++ .../src/functions/udf_wrapper.ts | 11 +++++++ 3 files changed, 70 insertions(+) create mode 100644 libs/core-functions/src/functions/lib/crypto-code.ts create mode 100644 libs/core-functions/src/functions/lib/crypto-code.txtjs diff --git a/libs/core-functions/src/functions/lib/crypto-code.ts b/libs/core-functions/src/functions/lib/crypto-code.ts new file mode 100644 index 000000000..472518d60 --- /dev/null +++ b/libs/core-functions/src/functions/lib/crypto-code.ts @@ -0,0 +1,30 @@ +export const cryptoCode = `const randomUUID = (options) => { + return _jitsu_crypto.getSync("randomUUID", {accessors: true, reference: true}).applySync(undefined, [options], { + arguments: { copy: true }, + result: { copy: true } + }); +} + +const randomBytes = (size) => { + return _jitsu_crypto.getSync("randomBytes", {accessors: true, reference: true}).applySync(undefined, [size], { + arguments: { copy: true }, + result: { copy: true } + }); +} + +const randomInt = (min, max) => { + return _jitsu_crypto.getSync("randomInt", {accessors: true, reference: true}).applySync(undefined, [min, max], { + arguments: { copy: true }, + result: { copy: true } + }); +} + +const hash = (algorithm, input , encoding) => { + return _jitsu_crypto.getSync("hash", {accessors: true, reference: true}).applySync(undefined, [algorithm, input, encoding], { + arguments: { copy: true }, + result: { copy: true } + }); +} + +export {hash, randomUUID, randomBytes, randomInt }; +`; diff --git a/libs/core-functions/src/functions/lib/crypto-code.txtjs b/libs/core-functions/src/functions/lib/crypto-code.txtjs new file mode 100644 index 000000000..0d666a9d3 --- /dev/null +++ b/libs/core-functions/src/functions/lib/crypto-code.txtjs @@ -0,0 +1,29 @@ +const randomUUID = (options) => { + return _jitsu_crypto.getSync("randomUUID", {accessors: true, reference: true}).applySync(undefined, [options], { + arguments: { copy: true }, + result: { copy: true } + }); +} + +const randomBytes = (size) => { + return _jitsu_crypto.getSync("randomBytes", {accessors: true, reference: true}).applySync(undefined, [size], { + arguments: { copy: true }, + result: { copy: true } + }); +} + +const randomInt = (min, max) => { + return _jitsu_crypto.getSync("randomInt", {accessors: true, reference: true}).applySync(undefined, [min, max], { + arguments: { copy: true }, + result: { copy: true } + }); +} + +const hash = (algorithm, input , encoding) => { + return _jitsu_crypto.getSync("hash", {accessors: true, reference: true}).applySync(undefined, [algorithm, input, encoding], { + arguments: { copy: true }, + result: { copy: true } + }); +} + +export {hash, randomUUID, randomBytes, randomInt }; diff --git a/libs/core-functions/src/functions/udf_wrapper.ts b/libs/core-functions/src/functions/udf_wrapper.ts index 65babbdfe..4ad01fa2e 100644 --- a/libs/core-functions/src/functions/udf_wrapper.ts +++ b/libs/core-functions/src/functions/udf_wrapper.ts @@ -18,6 +18,8 @@ import { parseUserAgent } from "./lib/ua"; import { RetryError } from "@jitsu/functions-lib"; import { JitsuFunctionWrapper } from "./lib"; import { clearTimeout } from "node:timers"; +import * as crypto from "node:crypto"; +import { cryptoCode } from "./lib/crypto-code"; const log = getLog("udf-wrapper"); @@ -72,6 +74,7 @@ export const UDFWrapper = ( }).copyInto({ release: true, transferIn: true }) ); jail.setSync("_jitsu_fetch_log_level", chainCtx.connectionOptions?.fetchLogLevel || "info"); + jail.setSync("_jitsu_crypto", new Reference(crypto)); jail.setSync( "_jitsu_fetch", makeReference(refs, async (url: string, opts?: FetchOpts, extra?: any) => { @@ -116,6 +119,12 @@ export const UDFWrapper = ( functionsLib.instantiateSync(context, (specifier: string) => { throw new Error(`import is not allowed: ${specifier}`); }); + const cryptoLib = isolate.compileModuleSync(cryptoCode, { + filename: "crypto.js", + }); + cryptoLib.instantiateSync(context, (specifier: string) => { + throw new Error(`import is not allowed: ${specifier}`); + }); const udfModules: Record = {}; for (let i = 0; i < functions.length; i++) { const sw = stopwatch(); @@ -126,6 +135,8 @@ export const UDFWrapper = ( udf.instantiateSync(context, (specifier: string) => { if (specifier === "@jitsu/functions-lib") { return functionsLib; + } else if (specifier === "crypto") { + return cryptoLib; } throw new Error(`import is not allowed: ${specifier}`); }); From f800f498846566cbedc2e2d78ddba47ca572bcfc Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 25 Sep 2024 19:03:57 +0400 Subject: [PATCH 0883/1353] rotor: udf: suggest using import instead of require --- libs/core-functions/src/functions/udf_wrapper.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libs/core-functions/src/functions/udf_wrapper.ts b/libs/core-functions/src/functions/udf_wrapper.ts index 4ad01fa2e..f5c302220 100644 --- a/libs/core-functions/src/functions/udf_wrapper.ts +++ b/libs/core-functions/src/functions/udf_wrapper.ts @@ -20,6 +20,7 @@ import { JitsuFunctionWrapper } from "./lib"; import { clearTimeout } from "node:timers"; import * as crypto from "node:crypto"; import { cryptoCode } from "./lib/crypto-code"; +import { throws } from "node:assert"; const log = getLog("udf-wrapper"); @@ -74,7 +75,10 @@ export const UDFWrapper = ( }).copyInto({ release: true, transferIn: true }) ); jail.setSync("_jitsu_fetch_log_level", chainCtx.connectionOptions?.fetchLogLevel || "info"); - jail.setSync("_jitsu_crypto", new Reference(crypto)); + jail.setSync("_jitsu_crypto", makeReference(refs, crypto)); + jail.setSync("require", () => { + throw new Error("'require' is not supported. Please use 'import' instead"); + }); jail.setSync( "_jitsu_fetch", makeReference(refs, async (url: string, opts?: FetchOpts, extra?: any) => { From 01046a0a7a0364ba57b6ee70c8bbd9ee2e663f22 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 26 Sep 2024 12:20:05 +0400 Subject: [PATCH 0884/1353] rotor: stick with node 22.8 --- all.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/all.Dockerfile b/all.Dockerfile index da78a0a98..fe186dd18 100644 --- a/all.Dockerfile +++ b/all.Dockerfile @@ -2,7 +2,7 @@ # Build & push it with # docker buildx build --platform linux/amd64 . -f console.Dockerfile --push -t jitsucom/console:latest -FROM node:22-bookworm as base +FROM node:22.8-bookworm as base WORKDIR /app RUN apt-get update -y From 6ccb245f130dbd9e4cc05ea29f6880fbaaafd8d4 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Sat, 28 Sep 2024 15:35:14 -0400 Subject: [PATCH 0885/1353] feat (jitsu/ee): welcome email implementation --- libs/juava/src/asserts.ts | 2 +- pnpm-lock.yaml | 2916 ++++++++++++----- webapps/console/lib/nextauth.config.ts | 2 + webapps/console/lib/server/ee.ts | 38 +- webapps/console/lib/server/mail.tsx | 6 + webapps/console/pages/api/init-user.ts | 2 + webapps/ee-api/components/email-component.tsx | 45 + webapps/ee-api/emails/welcome.tsx | 109 + webapps/ee-api/lib/email.tsx | 184 ++ .../{error-handler.ts => route-helpers.ts} | 12 +- webapps/ee-api/package.json | 8 +- .../ee-api/pages/api/billing/custom-plan.ts | 2 +- webapps/ee-api/pages/api/billing/manage.ts | 2 +- webapps/ee-api/pages/api/billing/plans.ts | 2 +- .../api/billing/rotate-stripe-customer.ts | 2 +- webapps/ee-api/pages/api/billing/settings.ts | 2 +- webapps/ee-api/pages/api/billing/upgrade.ts | 2 +- .../ee-api/pages/api/billing/workspaces.ts | 3 +- webapps/ee-api/pages/api/custom-token.ts | 2 +- webapps/ee-api/pages/api/email.tsx | 57 + webapps/ee-api/pages/api/is-active.ts | 2 +- .../marketing-automation/intercom/export.ts | 79 - webapps/ee-api/pages/api/provision-db.ts | 2 +- webapps/ee-api/pages/api/quotas/sync.ts | 2 +- webapps/ee-api/pages/api/report/overage.ts | 2 +- .../ee-api/pages/api/report/workspace-stat.ts | 2 +- webapps/ee-api/pages/api/s3-connections.ts | 2 +- webapps/ee-api/pages/api/s3-init.ts | 2 +- webapps/ee-api/pages/api/sync-cache.ts | 2 +- webapps/ee-api/pages/api/unsubscribe.ts | 30 + webapps/ee-api/pages/api/user-created.ts | 28 + 31 files changed, 2703 insertions(+), 848 deletions(-) create mode 100644 webapps/ee-api/components/email-component.tsx create mode 100644 webapps/ee-api/emails/welcome.tsx create mode 100644 webapps/ee-api/lib/email.tsx rename webapps/ee-api/lib/{error-handler.ts => route-helpers.ts} (58%) create mode 100644 webapps/ee-api/pages/api/email.tsx delete mode 100644 webapps/ee-api/pages/api/marketing-automation/intercom/export.ts create mode 100644 webapps/ee-api/pages/api/unsubscribe.ts create mode 100644 webapps/ee-api/pages/api/user-created.ts diff --git a/libs/juava/src/asserts.ts b/libs/juava/src/asserts.ts index bc14f2930..599995769 100644 --- a/libs/juava/src/asserts.ts +++ b/libs/juava/src/asserts.ts @@ -18,7 +18,7 @@ export function assertTrue(obj: boolean | null | undefined, error?: ErrorLike } } -export function assertFalse(obj: boolean, error?: ErrorLike): asserts obj is false { +export function assertFalse(obj: boolean, error?: ErrorLike): asserts obj is false { if (obj === true) { throw toError(error || "Object is true"); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 222bf26b0..122c3ec4e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,7 +25,7 @@ importers: version: 2.8.8 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) + version: 10.9.2(@types/node@16.18.11)(typescript@5.5.4) turbo: specifier: ~1.2.16 version: 1.2.16 @@ -34,7 +34,7 @@ importers: version: 5.5.4 vercel: specifier: ^35.2.3 - version: 35.2.3 + version: 35.2.3(encoding@0.1.13) cli/build-scripts: dependencies: @@ -80,7 +80,7 @@ importers: version: link:../../libs/juava webpack: specifier: ^5.91.0 - version: 5.93.0(webpack-cli@5.1.4) + version: 5.93.0 cli/jitsu-cli: dependencies: @@ -89,7 +89,7 @@ importers: version: 1.7.0 jest-cli: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + version: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) tslib: specifier: ^2.6.3 version: 2.6.3 @@ -147,13 +147,13 @@ importers: version: 18.19.42 '@types/webpack': specifier: ^5.28.5 - version: 5.28.5(webpack-cli@5.1.4) + version: 5.28.5(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) '@webpack-cli/generators': specifier: ^3.0.7 - version: 3.0.7(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0) + version: 3.0.7(encoding@0.1.13)(mem-fs@2.3.0)(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0) babel-loader: specifier: ^9.1.3 - version: 9.1.3(@babel/core@7.25.2)(webpack@5.93.0) + version: 9.1.3(@babel/core@7.25.2)(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) chalk: specifier: ^5.3.0 version: 5.3.0 @@ -162,7 +162,7 @@ importers: version: 11.1.0 cross-fetch: specifier: ^4.0.0 - version: 4.0.0 + version: 4.0.0(encoding@0.1.13) cuid: specifier: ^2.1.8 version: 2.1.8 @@ -174,7 +174,7 @@ importers: version: 9.3.6 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + version: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) json5: specifier: ^2.2.3 version: 2.2.3 @@ -189,7 +189,7 @@ importers: version: 3.3.2 node-loader: specifier: ^2.0.0 - version: 2.0.0(webpack@5.93.0) + version: 2.0.0(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) prismjs: specifier: ^1.29.0 version: 1.29.0 @@ -201,16 +201,16 @@ importers: version: 7.6.3 ts-jest: specifier: ^29.1.1 - version: 29.2.3(@babel/core@7.25.2)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.5.4) + version: 29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4) ts-loader: specifier: ^9.4.4 - version: 9.5.1(typescript@5.5.4)(webpack@5.93.0) + version: 9.5.1(typescript@5.5.4)(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) webpack: specifier: ^5.91.0 - version: 5.93.0(webpack-cli@5.1.4) + version: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) webpack-cli: specifier: ^5.1.4 version: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) @@ -234,7 +234,7 @@ importers: version: 5.4.1 jest: specifier: ^29.3.1 - version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + version: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) json5: specifier: ^2.1.0 version: 2.2.3 @@ -246,10 +246,10 @@ importers: version: 0.6.2 testcontainers: specifier: ^9.0.0 - version: 9.12.0 + version: 9.12.0(encoding@0.1.13) ts-jest: specifier: 29.0.5 - version: 29.0.5(@babel/core@7.25.2)(jest@29.7.0)(typescript@5.5.4) + version: 29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)))(typescript@5.5.4) tslib: specifier: ^2.6.3 version: 2.6.3 @@ -276,10 +276,10 @@ importers: version: 6.25.1(react@18.3.1) react-router-dom: specifier: ^6.25.1 - version: 6.25.1(react-dom@18.3.1)(react@18.3.1) + version: 6.25.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-scripts: specifier: ^5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0)(react@18.3.1)(ts-node@10.9.2)(typescript@5.5.4) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(@types/babel__core@7.20.5)(@types/webpack@5.28.5)(eslint@8.57.0)(react@18.3.1)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))(type-fest@3.13.1)(typescript@5.5.4) web-vitals: specifier: ^2.1.4 version: 2.1.4 @@ -295,7 +295,7 @@ importers: version: 18.3.0 tailwindcss: specifier: ^3.0.24 - version: 3.4.7(ts-node@10.9.2) + version: 3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) typescript: specifier: ^5.5.4 version: 5.5.4 @@ -307,7 +307,7 @@ importers: version: 0.7.33 '@hubspot/api-client': specifier: ^11.1.0 - version: 11.1.0 + version: 11.1.0(encoding@0.1.13) '@mongodb-js/zstd': specifier: ^1.2.0 version: 1.2.0 @@ -319,7 +319,7 @@ importers: version: 1.11.12 google-ads-api: specifier: ^16.0.0-rest-beta3 - version: 16.0.0-rest-beta3 + version: 16.0.0-rest-beta3(encoding@0.1.13) ioredis: specifier: ^5.3.2 version: 5.4.1 @@ -334,7 +334,7 @@ importers: version: 4.17.21 mongodb: specifier: ^6.7.0 - version: 6.8.0(@mongodb-js/zstd@1.2.0) + version: 6.8.0(@mongodb-js/zstd@1.2.0)(socks@2.8.3) node-cache: specifier: ^5.1.2 version: 5.1.2 @@ -374,7 +374,7 @@ importers: version: 4.19.2 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) json5: specifier: ^2.1.0 version: 2.2.3 @@ -383,7 +383,7 @@ importers: version: 3.3.2 ts-jest: specifier: ^29.2.3 - version: 29.2.3(@babel/core@7.25.2)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.5.4) + version: 29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4) libs/functions: dependencies: @@ -405,13 +405,13 @@ importers: version: 18.19.42 jest: specifier: ^29.1.2 - version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) rollup: specifier: ^4.1.4 version: 4.19.1 ts-jest: specifier: 29.0.5 - version: 29.0.5(@babel/core@7.25.2)(jest@29.7.0)(typescript@5.5.4) + version: 29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4) libs/jitsu-js: dependencies: @@ -445,7 +445,7 @@ importers: version: 0.1.0(rollup@3.29.4) '@segment/analytics-next': specifier: ^1.46.0 - version: 1.72.1 + version: 1.72.1(encoding@0.1.13) '@types/chalk': specifier: ^2.2.0 version: 2.2.0 @@ -469,7 +469,7 @@ importers: version: 4.19.2 jest: specifier: ^29.2.2 - version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) jsondiffpatch: specifier: workspace:* version: link:../jsondiffpatch @@ -487,7 +487,7 @@ importers: version: 3.29.4 ts-jest: specifier: 29.0.5 - version: 29.0.5(@babel/core@7.25.2)(jest@29.7.0)(typescript@5.5.4) + version: 29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4) tslib: specifier: ^2.6.3 version: 2.6.3 @@ -508,7 +508,7 @@ importers: version: 18.3.1 react-router-dom: specifier: 5.x || 6.x - version: 6.25.1(react-dom@18.3.1)(react@18.3.1) + version: 6.25.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) devDependencies: '@babel/plugin-transform-regenerator': specifier: ^7.22.10 @@ -518,7 +518,7 @@ importers: version: 6.4.8 '@testing-library/react': specifier: ^13.4.0 - version: 13.4.0(react-dom@18.3.1)(react@18.3.1) + version: 13.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@testing-library/user-event': specifier: ^14.4.3 version: 14.5.2(@testing-library/dom@10.4.0) @@ -545,7 +545,7 @@ importers: version: 29.5.12 '@typescript-eslint/eslint-plugin': specifier: ^7.18.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.0)(typescript@5.5.4) + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/parser': specifier: ^7.18.0 version: 7.18.0(eslint@8.57.0)(typescript@5.5.4) @@ -557,10 +557,10 @@ importers: version: 9.1.0(eslint@8.57.0) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + version: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) ts-jest: specifier: ^29.1.1 - version: 29.2.3(@babel/core@7.25.2)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.5.4) + version: 29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)))(typescript@5.5.4) tslib: specifier: ^2.6.3 version: 2.6.3 @@ -585,10 +585,10 @@ importers: version: 18.19.42 jest: specifier: ^29.1.2 - version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) ts-jest: specifier: 29.0.5 - version: 29.0.5(@babel/core@7.25.2)(jest@29.7.0)(typescript@5.5.4) + version: 29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4) services/rotor: dependencies: @@ -709,19 +709,19 @@ importers: version: 0.0.152 '@types/webpack': specifier: ^5.28.5 - version: 5.28.5(webpack-cli@5.1.4) + version: 5.28.5(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) '@webpack-cli/generators': specifier: ^3.0.7 - version: 3.0.7(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0) + version: 3.0.7(encoding@0.1.13)(mem-fs@2.3.0)(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0) babel-loader: specifier: ^9.1.3 - version: 9.1.3(@babel/core@7.25.2)(webpack@5.93.0) + version: 9.1.3(@babel/core@7.25.2)(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) clean-webpack-plugin: specifier: ^4.0.0 - version: 4.0.0(webpack@5.93.0) + version: 4.0.0(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) copy-webpack-plugin: specifier: ^12.0.2 - version: 12.0.2(webpack@5.93.0) + version: 12.0.2(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) declaration-bundler-webpack-plugin: specifier: ^1.0.3 version: 1.0.3 @@ -730,22 +730,22 @@ importers: version: 7.4.2 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) lodash: specifier: ^4.17.21 version: 4.17.21 node-loader: specifier: ^2.0.0 - version: 2.0.0(webpack@5.93.0) + version: 2.0.0(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) nodemon: specifier: ^3.1.4 version: 3.1.4 ts-jest: specifier: ^29.2.3 - version: 29.2.3(@babel/core@7.25.2)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.5.4) + version: 29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4) ts-loader: specifier: ^9.4.2 - version: 9.5.1(typescript@5.5.4)(webpack@5.93.0) + version: 9.5.1(typescript@5.5.4)(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) @@ -757,7 +757,7 @@ importers: version: 5.5.4 webpack: specifier: ^5.93.0 - version: 5.93.0(webpack-cli@5.1.4) + version: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) webpack-cli: specifier: ^5.1.4 version: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) @@ -768,19 +768,19 @@ importers: dependencies: '@ant-design/cssinjs': specifier: ^1.5.6 - version: 1.21.0(react-dom@18.3.1)(react@18.3.1) + version: 1.21.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@clickhouse/client': specifier: ^1.4.0 version: 1.4.0 '@dnd-kit/core': specifier: ^6.0.8 - version: 6.1.0(react-dom@18.3.1)(react@18.3.1) + version: 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@dnd-kit/modifiers': specifier: ^6.0.1 - version: 6.0.1(@dnd-kit/core@6.1.0)(react@18.3.1) + version: 6.0.1(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@dnd-kit/sortable': specifier: ^7.0.2 - version: 7.0.2(@dnd-kit/core@6.1.0)(react@18.3.1) + version: 7.0.2(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@dnd-kit/utilities': specifier: ^3.2.1 version: 3.2.2(react@18.3.1) @@ -792,7 +792,7 @@ importers: version: 4.5.10 '@google-cloud/scheduler': specifier: ^4.0.0 - version: 4.3.0 + version: 4.3.0(encoding@0.1.13) '@jitsu/core-functions': specifier: workspace:* version: link:../../libs/core-functions @@ -813,7 +813,7 @@ importers: version: 5.16.4(react@18.3.1) '@monaco-editor/react': specifier: ^4.6.0 - version: 4.6.0(monaco-editor@0.50.0)(react-dom@18.3.1)(react@18.3.1) + version: 4.6.0(monaco-editor@0.50.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@nangohq/frontend': specifier: ^0.21.11 version: 0.21.17 @@ -822,22 +822,22 @@ importers: version: 5.17.0(prisma@5.17.0) '@rjsf/antd': specifier: ^5.19.4 - version: 5.19.4(@ant-design/icons@5.4.0)(@rjsf/core@5.10.0)(@rjsf/utils@5.10.0)(antd@5.19.4)(dayjs@1.11.12)(react-dom@18.3.1)(react@18.3.1) + version: 5.19.4(@ant-design/icons@5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rjsf/core@5.10.0(@rjsf/utils@5.10.0(react@18.3.1))(react@18.3.1))(@rjsf/utils@5.10.0(react@18.3.1))(antd@5.19.4(date-fns@2.30.0)(moment@2.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@rjsf/core': specifier: 5.10.0 - version: 5.10.0(@rjsf/utils@5.10.0)(react@18.3.1) + version: 5.10.0(@rjsf/utils@5.10.0(react@18.3.1))(react@18.3.1) '@rjsf/utils': specifier: 5.10.0 version: 5.10.0(react@18.3.1) '@rjsf/validator-ajv6': specifier: 5.10.0 - version: 5.10.0(@rjsf/utils@5.10.0) + version: 5.10.0(@rjsf/utils@5.10.0(react@18.3.1)) '@sentry/nextjs': specifier: ^7.70.0 - version: 7.118.0(next@14.2.5)(react@18.3.1)(webpack@5.93.0) + version: 7.118.0(encoding@0.1.13)(next@14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.93.0) '@tanstack/react-query': specifier: ^4.2.1 - version: 4.36.1(react-dom@18.3.1)(react@18.3.1) + version: 4.36.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/cookie': specifier: ^0.5.1 version: 0.5.4 @@ -873,13 +873,13 @@ importers: version: 10.12.5 firebase-admin: specifier: ^12.3.0 - version: 12.3.0 + version: 12.3.0(encoding@0.1.13) google-ads-api: specifier: ^16.0.0-rest-beta3 - version: 16.0.0-rest-beta3 + version: 16.0.0-rest-beta3(encoding@0.1.13) googleapis: specifier: ^126.0.1 - version: 126.0.1 + version: 126.0.1(encoding@0.1.13) highlight.js: specifier: ^11.6.0 version: 11.10.0 @@ -909,19 +909,19 @@ importers: version: 0.263.1(react@18.3.1) mjml: specifier: ^4.15.3 - version: 4.15.3 + version: 4.15.3(encoding@0.1.13) mjml-react: specifier: ^2.0.8 - version: 2.0.8(mjml@4.15.3)(react-dom@18.3.1)(react@18.3.1) + version: 2.0.8(mjml@4.15.3(encoding@0.1.13))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) monaco-editor: specifier: ^0.50.0 version: 0.50.0 next: specifier: ^14.2.5 - version: 14.2.5(@babel/core@7.25.2)(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1) + version: 14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-auth: specifier: ^4.23.2 - version: 4.24.7(next@14.2.5)(nodemailer@6.9.14)(react-dom@18.3.1)(react@18.3.1) + version: 4.24.7(next@14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nodemailer@6.9.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) node-fetch-commonjs: specifier: ^3.3.2 version: 3.3.2 @@ -954,13 +954,13 @@ importers: version: 4.12.0(react@18.3.1) react-json-view: specifier: ^1.19.1 - version: 1.21.3(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + version: 1.21.3(@types/react@18.3.3)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-use: specifier: ^17.4.0 - version: 17.5.1(react-dom@18.3.1)(react@18.3.1) + version: 17.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) recharts: specifier: ^2.10.4 - version: 2.12.7(react-dom@18.3.1)(react@18.3.1) + version: 2.12.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) stable-hash: specifier: 0.0.3 version: 0.0.3 @@ -982,16 +982,16 @@ importers: devDependencies: '@ant-design/icons': specifier: ^5.4.0 - version: 5.4.0(react-dom@18.3.1)(react@18.3.1) + version: 5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tailwindcss/typography': specifier: ^0.5.7 - version: 0.5.13(tailwindcss@3.4.7) + version: 0.5.13(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))) '@testing-library/jest-dom': specifier: ^6.1.3 version: 6.4.8 '@testing-library/react': specifier: ^13.1.1 - version: 13.4.0(react-dom@18.3.1)(react@18.3.1) + version: 13.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/cli-progress': specifier: ^3.11.0 version: 3.11.6 @@ -1027,7 +1027,7 @@ importers: version: 0.7.2 antd: specifier: ^5.19.4 - version: 5.19.4(react-dom@18.3.1)(react@18.3.1) + version: 5.19.4(date-fns@2.30.0)(moment@2.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) autoprefixer: specifier: ^10.4.20 version: 10.4.20(postcss@8.4.41) @@ -1045,7 +1045,7 @@ importers: version: 4.0.1(eslint@8.57.0) jest: specifier: ^28.0.0 - version: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2) + version: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) less: specifier: ^4.1.2 version: 4.2.0 @@ -1066,7 +1066,7 @@ importers: version: 4.0.2(webpack@5.93.0) tailwindcss: specifier: ^3.0.24 - version: 3.4.7(ts-node@10.9.2) + version: 3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) @@ -1078,7 +1078,7 @@ importers: version: 5.5.4 zod-prisma: specifier: ^0.5.4 - version: 0.5.4(prisma@5.17.0)(zod@3.23.8) + version: 0.5.4(decimal.js@10.4.3)(prisma@5.17.0)(zod@3.23.8) webapps/ee-api: dependencies: @@ -1088,6 +1088,9 @@ importers: '@clickhouse/client': specifier: ^1.4.0 version: 1.4.0 + '@react-email/components': + specifier: ^0.0.25 + version: 0.0.25(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/node': specifier: ^18.15.3 version: 18.19.42 @@ -1111,7 +1114,7 @@ importers: version: 14.2.5(eslint@8.57.0)(typescript@5.5.4) firebase-admin: specifier: ^12.3.0 - version: 12.3.0 + version: 12.3.0(encoding@0.1.13) intercom-client: specifier: ^5.0.0 version: 5.0.0 @@ -1132,7 +1135,7 @@ importers: version: 4.17.21 next: specifier: ^14.2.5 - version: 14.2.5(@babel/core@7.25.2)(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1) + version: 14.2.5(@babel/core@7.24.5)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) node-fetch-commonjs: specifier: ^3.3.2 version: 3.3.2 @@ -1145,12 +1148,18 @@ importers: react-dom: specifier: 18.3.1 version: 18.3.1(react@18.3.1) + resend: + specifier: ^4.0.0 + version: 4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) stripe: specifier: ^11.15.0 version: 11.18.0 tslib: specifier: ^2.6.3 version: 2.6.3 + zod: + specifier: ^3.23.8 + version: 3.23.8 devDependencies: '@types/crypto-js': specifier: ^4.1.1 @@ -1176,9 +1185,15 @@ importers: raw-loader: specifier: ^4.0.2 version: 4.0.2(webpack@5.93.0) + react-email: + specifier: ^3.0.1 + version: 3.0.1(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) + type-fest: + specifier: ^3.5.7 + version: 3.13.1 typescript: specifier: ^5.5.4 version: 5.5.4 @@ -1431,6 +1446,10 @@ packages: resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==} engines: {node: '>=6.9.0'} + '@babel/core@7.24.5': + resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} + engines: {node: '>=6.9.0'} + '@babel/core@7.25.2': resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} engines: {node: '>=6.9.0'} @@ -1541,6 +1560,11 @@ packages: resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} + '@babel/parser@7.24.5': + resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/parser@7.25.0': resolution: {integrity: sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA==} engines: {node: '>=6.0.0'} @@ -2323,6 +2347,144 @@ packages: '@emotion/unitless@0.7.5': resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + '@esbuild/aix-ppc64@0.19.11': + resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.19.11': + resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.19.11': + resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.19.11': + resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.19.11': + resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.11': + resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.19.11': + resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.19.11': + resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.19.11': + resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.19.11': + resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.19.11': + resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.19.11': + resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.19.11': + resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.19.11': + resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.19.11': + resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.19.11': + resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.19.11': + resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.19.11': + resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.19.11': + resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.19.11': + resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.19.11': + resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.19.11': + resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.19.11': + resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2949,60 +3111,117 @@ packages: '@nangohq/frontend@0.21.17': resolution: {integrity: sha512-utnO6JkRIQVqZBo472Yynf0nBl5Pc3QCMlC9L5LsIWApCD1pSkqZCA7cZKIJiX2p3tiB8Hzav31o0lAsnTZ1AQ==} + '@next/env@14.2.3': + resolution: {integrity: sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==} + '@next/env@14.2.5': resolution: {integrity: sha512-/zZGkrTOsraVfYjGP8uM0p6r0BDT6xWpkjdVbcz66PJVSpwXX3yNiRycxAuDfBKGWBrZBXRuK/YVlkNgxHGwmA==} '@next/eslint-plugin-next@14.2.5': resolution: {integrity: sha512-LY3btOpPh+OTIpviNojDpUdIbHW9j0JBYBjsIp8IxtDFfYFyORvw3yNq6N231FVqQA7n7lwaf7xHbVJlA1ED7g==} + '@next/swc-darwin-arm64@14.2.3': + resolution: {integrity: sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + '@next/swc-darwin-arm64@14.2.5': resolution: {integrity: sha512-/9zVxJ+K9lrzSGli1///ujyRfon/ZneeZ+v4ptpiPoOU+GKZnm8Wj8ELWU1Pm7GHltYRBklmXMTUqM/DqQ99FQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] + '@next/swc-darwin-x64@14.2.3': + resolution: {integrity: sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + '@next/swc-darwin-x64@14.2.5': resolution: {integrity: sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] + '@next/swc-linux-arm64-gnu@14.2.3': + resolution: {integrity: sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@next/swc-linux-arm64-gnu@14.2.5': resolution: {integrity: sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + '@next/swc-linux-arm64-musl@14.2.3': + resolution: {integrity: sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@next/swc-linux-arm64-musl@14.2.5': resolution: {integrity: sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + '@next/swc-linux-x64-gnu@14.2.3': + resolution: {integrity: sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@next/swc-linux-x64-gnu@14.2.5': resolution: {integrity: sha512-8XFikMSxWleYNryWIjiCX+gU201YS+erTUidKdyOVYi5qUQo/gRxv/3N1oZFCgqpesN6FPeqGM72Zve+nReVXQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + '@next/swc-linux-x64-musl@14.2.3': + resolution: {integrity: sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@next/swc-linux-x64-musl@14.2.5': resolution: {integrity: sha512-6QLwi7RaYiQDcRDSU/os40r5o06b5ue7Jsk5JgdRBGGp8l37RZEh9JsLSM8QF0YDsgcosSeHjglgqi25+m04IQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + '@next/swc-win32-arm64-msvc@14.2.3': + resolution: {integrity: sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + '@next/swc-win32-arm64-msvc@14.2.5': resolution: {integrity: sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] + '@next/swc-win32-ia32-msvc@14.2.3': + resolution: {integrity: sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + '@next/swc-win32-ia32-msvc@14.2.5': resolution: {integrity: sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] + '@next/swc-win32-x64-msvc@14.2.3': + resolution: {integrity: sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@next/swc-win32-x64-msvc@14.2.5': resolution: {integrity: sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==} engines: {node: '>= 10'} @@ -3304,6 +3523,138 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' + '@react-email/body@0.0.10': + resolution: {integrity: sha512-dMJyL9aU25ieatdPtVjCyQ/WHZYHwNc+Hy/XpF8Cc18gu21cUynVEeYQzFSeigDRMeBQ3PGAyjVDPIob7YlGwA==} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/button@0.0.17': + resolution: {integrity: sha512-ioHdsk+BpGS/PqjU6JS7tUrVy9yvbUx92Z+Cem2+MbYp55oEwQ9VHf7u4f5NoM0gdhfKSehBwRdYlHt/frEMcg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/code-block@0.0.9': + resolution: {integrity: sha512-Zrhc71VYrSC1fVXJuaViKoB/dBjxLw6nbE53Bm/eUuZPdnnZ1+ZUIh8jfaRKC5MzMjgnLGQTweGXVnfIrhyxtQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/code-inline@0.0.4': + resolution: {integrity: sha512-zj3oMQiiUCZbddSNt3k0zNfIBFK0ZNDIzzDyBaJKy6ZASTtWfB+1WFX0cpTX8q0gUiYK+A94rk5Qp68L6YXjXQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/column@0.0.12': + resolution: {integrity: sha512-Rsl7iSdDaeHZO938xb+0wR5ud0Z3MVfdtPbNKJNojZi2hApwLAQXmDrnn/AcPDM5Lpl331ZljJS8vHTWxxkvKw==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/components@0.0.25': + resolution: {integrity: sha512-lnfVVrThEcET5NPoeaXvrz9UxtWpGRcut2a07dLbyKgNbP7vj/cXTI5TuHtanCvhCddFpMDnElNRghDOfPzwUg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/container@0.0.14': + resolution: {integrity: sha512-NgoaJJd9tTtsrveL86Ocr/AYLkGyN3prdXKd/zm5fQpfDhy/NXezyT3iF6VlwAOEUIu64ErHpAJd+P6ygR+vjg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/font@0.0.8': + resolution: {integrity: sha512-fSBEqYyVPAyyACBBHcs3wEYzNknpHMuwcSAAKE8fOoDfGqURr/vSxKPdh4tOa9z7G4hlcEfgGrCYEa2iPT22cw==} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/head@0.0.11': + resolution: {integrity: sha512-skw5FUgyamIMK+LN+fZQ5WIKQYf0dPiRAvsUAUR2eYoZp9oRsfkIpFHr0GWPkKAYjFEj+uJjaxQ/0VzQH7svVg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/heading@0.0.14': + resolution: {integrity: sha512-jZM7IVuZOXa0G110ES8OkxajPTypIKlzlO1K1RIe1auk76ukQRiCg1IRV4HZlWk1GGUbec5hNxsvZa2kU8cb9w==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/hr@0.0.10': + resolution: {integrity: sha512-3AA4Yjgl3zEid/KVx6uf6TuLJHVZvUc2cG9Wm9ZpWeAX4ODA+8g9HyuC0tfnjbRsVMhMcCGiECuWWXINi+60vA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/html@0.0.10': + resolution: {integrity: sha512-06uiuSKJBWQJfhCKv4MPupELei4Lepyz9Sth7Yq7Fq29CAeB1ejLgKkGqn1I+FZ72hQxPLdYF4iq4yloKv3JCg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/img@0.0.10': + resolution: {integrity: sha512-pJ8glJjDNaJ53qoM95pvX9SK05yh0bNQY/oyBKmxlBDdUII6ixuMc3SCwYXPMl+tgkQUyDgwEBpSTrLAnjL3hA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/link@0.0.10': + resolution: {integrity: sha512-tva3wvAWSR10lMJa9fVA09yRn7pbEki0ZZpHE6GD1jKbFhmzt38VgLO9B797/prqoDZdAr4rVK7LJFcdPx3GwA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/markdown@0.0.12': + resolution: {integrity: sha512-wsuvj1XAb6O63aizCLNEeqVgKR3oFjAwt9vjfg2y2oh4G1dZeo8zonZM2x1fmkEkBZhzwSHraNi70jSXhA3A9w==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/preview@0.0.11': + resolution: {integrity: sha512-7O/CT4b16YlSGrj18htTPx3Vbhu2suCGv/cSe5c+fuSrIM/nMiBSZ3Js16Vj0XJbAmmmlVmYFZw9L20wXJ+LjQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/render@0.0.17': + resolution: {integrity: sha512-xBQ+/73+WsGuXKY7r1U73zMBNV28xdV0cp9cFjhNYipBReDHhV97IpA6v7Hl0dDtDzt+yS/72dY5vYXrF1v8NA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + react-dom: ^18.2.0 + + '@react-email/render@1.0.1': + resolution: {integrity: sha512-W3gTrcmLOVYnG80QuUp22ReIT/xfLsVJ+n7ghSlG2BITB8evNABn1AO2rGQoXuK84zKtDAlxCdm3hRyIpZdGSA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/row@0.0.10': + resolution: {integrity: sha512-jPyEhG3gsLX+Eb9U+A30fh0gK6hXJwF4ghJ+ZtFQtlKAKqHX+eCpWlqB3Xschd/ARJLod8WAswg0FB+JD9d0/A==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/section@0.0.14': + resolution: {integrity: sha512-+fYWLb4tPU1A/+GE5J1+SEMA7/wR3V30lQ+OR9t2kAJqNrARDbMx0bLnYnR1QL5TiFRz0pCF05SQUobk6gHEDQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/tailwind@0.1.0': + resolution: {integrity: sha512-qysVUEY+M3SKUvu35XDpzn7yokhqFOT3tPU6Mj/pgc62TL5tQFj6msEbBtwoKs2qO3WZvai0DIHdLhaOxBQSow==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/text@0.0.10': + resolution: {integrity: sha512-wNAnxeEAiFs6N+SxS0y6wTJWfewEzUETuyS2aZmT00xk50VijwyFRuhm4sYSjusMyshevomFwz5jNISCxRsGWw==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + '@remix-run/router@1.18.0': resolution: {integrity: sha512-L3jkqmqoSVBVKHfpGZmLrex0lxR5SucGA0sUfFzGctehw+S/ggL9L/0NnC5mw6P8HUWpFZ3nQw3cRApjjWx9Sw==} engines: {node: '>=14.0.0'} @@ -3618,6 +3969,9 @@ packages: '@segment/isodate@1.0.3': resolution: {integrity: sha512-BtanDuvJqnACFkeeYje7pWULVv8RgZaqKHWwGFnL/g/TH/CcZjkIVTfGDp/MAxmilYHUkrX70SqwnYSTNEaN7A==} + '@selderee/plugin-htmlparser2@0.11.0': + resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} + '@sensejs/kafkajs-zstd-support@0.11.0': resolution: {integrity: sha512-qWTaL7wUOUv/HLW8zBmfReVWFn1qOUvubqdhbjMzf1mD6at0dkOFF5g+QSi8Nb3RXWJeNb0KhgIwbOm/S+wPaQ==} peerDependencies: @@ -3940,6 +4294,9 @@ packages: resolution: {integrity: sha512-4pP0EV3iTsexDx+8PPGAKCQpd/6hsQBaQhqWzU4hqKPHN5epPsxKbvUTIiYIHTxaKt6/kEaqPBpu/ufvfbrRzw==} engines: {node: '>=16.0.0'} + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + '@surma/rollup-plugin-off-main-thread@2.2.3': resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} @@ -4136,9 +4493,15 @@ packages: '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/cookie@0.4.1': + resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + '@types/cookie@0.5.4': resolution: {integrity: sha512-7z/eR6O859gyWIAjuvBWFzNURmf2oPBmJlfVWkwehU5nzIyjwBsTh7WMmEEV4JFnHuQ3ex4oyTvfKzcyJVDBNA==} + '@types/cors@2.8.17': + resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} + '@types/cross-spawn@6.0.2': resolution: {integrity: sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==} @@ -5225,6 +5588,10 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} @@ -5830,6 +6197,10 @@ packages: core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + cosmiconfig@5.2.1: resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} engines: {node: '>=4'} @@ -6140,6 +6511,10 @@ packages: dayjs@1.11.12: resolution: {integrity: sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg==} + debounce@2.0.0: + resolution: {integrity: sha512-xRetU6gL1VJbs85Mc4FoEGSjQxzpdxRyFhe3lmWFyy2EzydIcD4xzUvRJMD+NPDfMwKNhxa3PvsIOU32luIWeA==} + engines: {node: '>=18'} + debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -6526,6 +6901,14 @@ packages: end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + + engine.io@6.5.5: + resolution: {integrity: sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==} + engines: {node: '>=10.2.0'} + enhanced-resolve@5.17.1: resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} engines: {node: '>=10.13.0'} @@ -6736,6 +7119,11 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.19.11: + resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==} + engines: {node: '>=12'} + hasBin: true + escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} @@ -7036,6 +7424,9 @@ packages: resolution: {integrity: sha512-6ypT4XfgqJk/F3Yuv4SX26I3doUjt0GTG4a+JgWxXQpxXzTBq8fPUeGHfcYMMDPHJHm3yPOSjaeBwBGAHWXCdA==} engines: {node: '>=18.0.0'} + fast-deep-equal@2.0.1: + resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -7428,6 +7819,11 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true + glob@10.3.4: + resolution: {integrity: sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true @@ -7653,6 +8049,10 @@ packages: engines: {node: '>=6'} hasBin: true + html-to-text@9.0.5: + resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==} + engines: {node: '>=14'} + html-webpack-plugin@5.6.0: resolution: {integrity: sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==} engines: {node: '>=10.13.0'} @@ -8730,7 +9130,6 @@ packages: resolution: {integrity: sha512-Quz3MvAwHxVYNXsOByL7xI5EB2WYOeFswqaHIA3qOK3isRWTxiplBEocmmru6XmxDB2L7jDNYtYA4FyimoAFEw==} engines: {node: '>=8.17.0'} hasBin: true - bundledDependencies: [] jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -8825,6 +9224,9 @@ packages: resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} engines: {node: '>= 0.6.3'} + leac@0.6.0: + resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} + less-loader@10.2.0: resolution: {integrity: sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg==} engines: {node: '>= 12.13.0'} @@ -9079,6 +9481,11 @@ packages: peerDependencies: react: '>= 0.14.0' + marked@7.0.4: + resolution: {integrity: sha512-t8eP0dXRJMtMvBojtkcsA7n48BkauktUKzfkPSCq85ZMTJ0v76Rke4DYz01omYpPTUh4p/f7HePgRo3ebG8+QQ==} + engines: {node: '>= 16'} + hasBin: true + matched@5.0.1: resolution: {integrity: sha512-E1fhSTPRyhAlNaNvGXAgZQlq1hL0bgYMTk/6bktVlIhzUnX/SZs7296ACdVeNJE8xFNGSuvd9IpI7vSnmcqLvw==} engines: {node: '>=10'} @@ -9091,6 +9498,11 @@ packages: resolution: {integrity: sha512-xwnLGghs96DyNK3ANs1jzW8+JwS6pBQ3eTh3kNsi23n5wySZb9FgqCghmde5JZFOv23bxGehcyh6lT522llNKw==} engines: {node: '>=12', npm: '>=6'} + md-to-react-email@5.0.2: + resolution: {integrity: sha512-x6kkpdzIzUhecda/yahltfEl53mH26QdWu4abUF9+S0Jgam8P//Ciro8cdhyMHnT5MQUJYrIbO6ORM2UxPiNNA==} + peerDependencies: + react: 18.x + mdn-data@2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} @@ -9549,6 +9961,24 @@ packages: next-transpile-modules@10.0.1: resolution: {integrity: sha512-4VX/LCMofxIYAVV58UmD+kr8jQflpLWvas/BQ4Co0qWLWzVh06FoZkECkrX5eEZT6oJFqie6+kfbTA3EZCVtdQ==} + next@14.2.3: + resolution: {integrity: sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==} + engines: {node: '>=18.17.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + sass: + optional: true + next@14.2.5: resolution: {integrity: sha512-0f8aRfBVL+mpzfBjYfQuLWh2WyAwtJXCRfkPF4UJ5qd2YwrHczsrSzXU4tRMV0OAxR8ZJZWPFn6uhSC56UTsLA==} engines: {node: '>=18.17.0'} @@ -10035,6 +10465,9 @@ packages: parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + parseley@0.12.1: + resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==} + parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -10098,6 +10531,9 @@ packages: resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} engines: {node: '>=12'} + peberminta@0.9.0: + resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} + pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} @@ -11356,7 +11792,12 @@ packages: peerDependencies: react: ^18.3.1 - react-error-overlay@6.0.11: + react-email@3.0.1: + resolution: {integrity: sha512-G4Bkx2ULIScy/0Z8nnWywHt0W1iTkaYCdh9rWNuQ3eVZ6B3ttTUDE9uUy3VNQ8dtQbmG0cpt8+XmImw7mMBW6Q==} + engines: {node: '>=18.0.0'} + hasBin: true + + react-error-overlay@6.0.11: resolution: {integrity: sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==} react-icons@4.12.0: @@ -11382,6 +11823,9 @@ packages: react-lifecycles-compat@3.0.4: resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} + react-promise-suspense@0.3.4: + resolution: {integrity: sha512-I42jl7L3Ze6kZaq+7zXWSunBa3b1on5yfvUW6Eo/3fFOj6dZ5Bqmcd264nJbTK/gn1HjjILAjSwnZbV4RpSaNQ==} + react-reconciler@0.26.2: resolution: {integrity: sha512-nK6kgY28HwrMNwDnMui3dvm3rCFjZrcGiuwLc5COUipBK5hWHLOxMJhSnSomirqWwjPBJKV1QcbkI0VJr7Gl1Q==} engines: {node: '>=0.10.0'} @@ -11602,6 +12046,10 @@ packages: requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + resend@4.0.0: + resolution: {integrity: sha512-rDX0rspl/XcmC2JV2V5obQvRX2arzxXUvNFUDMOv5ObBLR68+7kigCOysb7+dlkb0JE3erhQG0nHrbBt/ZCWIg==} + engines: {node: '>=18'} + resize-observer-polyfill@1.5.1: resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} @@ -11875,6 +12323,9 @@ packages: scroll-into-view-if-needed@3.1.0: resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} + selderee@0.11.0: + resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} + select-hose@2.0.0: resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} @@ -12035,6 +12486,17 @@ packages: snappyjs@0.6.1: resolution: {integrity: sha512-YIK6I2lsH072UE0aOFxxY1dPDCS43I5ktqHpeAsuLNYWkE5pGxRGWfDM4/vSUfNzXjC1Ivzt3qx31PCLmc9yqg==} + socket.io-adapter@2.5.5: + resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} + + socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + + socket.io@4.7.5: + resolution: {integrity: sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==} + engines: {node: '>=10.2.0'} + sockjs@0.3.24: resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} @@ -13501,6 +13963,18 @@ packages: utf-8-validate: optional: true + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + ws@8.18.0: resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} @@ -13689,35 +14163,35 @@ snapshots: dependencies: '@ctrl/tinycolor': 3.6.1 - '@ant-design/cssinjs-utils@1.0.3(react-dom@18.3.1)(react@18.3.1)': + '@ant-design/cssinjs-utils@1.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@ant-design/cssinjs': 1.21.0(react-dom@18.3.1)(react@18.3.1) + '@ant-design/cssinjs': 1.21.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@babel/runtime': 7.25.0 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@ant-design/cssinjs@1.21.0(react-dom@18.3.1)(react@18.3.1)': + '@ant-design/cssinjs@1.21.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 '@emotion/hash': 0.8.0 '@emotion/unitless': 0.7.5 classnames: 2.5.1 csstype: 3.1.3 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) stylis: 4.3.2 '@ant-design/icons-svg@4.4.2': {} - '@ant-design/icons@5.4.0(react-dom@18.3.1)(react@18.3.1)': + '@ant-design/icons@5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@ant-design/colors': 7.1.0 '@ant-design/icons-svg': 4.4.2 '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -13792,7 +14266,7 @@ snapshots: '@aws-sdk/client-sso-oidc': 3.621.0(@aws-sdk/client-sts@3.621.0) '@aws-sdk/client-sts': 3.621.0 '@aws-sdk/core': 3.621.0 - '@aws-sdk/credential-provider-node': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0)(@aws-sdk/client-sts@3.621.0) + '@aws-sdk/credential-provider-node': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0))(@aws-sdk/client-sts@3.621.0) '@aws-sdk/middleware-bucket-endpoint': 3.620.0 '@aws-sdk/middleware-expect-continue': 3.620.0 '@aws-sdk/middleware-flexible-checksums': 3.620.0 @@ -13853,7 +14327,7 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-sdk/client-sts': 3.621.0 '@aws-sdk/core': 3.621.0 - '@aws-sdk/credential-provider-node': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0)(@aws-sdk/client-sts@3.621.0) + '@aws-sdk/credential-provider-node': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0))(@aws-sdk/client-sts@3.621.0) '@aws-sdk/middleware-host-header': 3.620.0 '@aws-sdk/middleware-logger': 3.609.0 '@aws-sdk/middleware-recursion-detection': 3.620.0 @@ -13941,7 +14415,7 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-sdk/client-sso-oidc': 3.621.0(@aws-sdk/client-sts@3.621.0) '@aws-sdk/core': 3.621.0 - '@aws-sdk/credential-provider-node': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0)(@aws-sdk/client-sts@3.621.0) + '@aws-sdk/credential-provider-node': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0))(@aws-sdk/client-sts@3.621.0) '@aws-sdk/middleware-host-header': 3.620.0 '@aws-sdk/middleware-logger': 3.609.0 '@aws-sdk/middleware-recursion-detection': 3.620.0 @@ -14011,13 +14485,13 @@ snapshots: '@smithy/util-stream': 3.1.3 tslib: 2.6.3 - '@aws-sdk/credential-provider-ini@3.621.0(@aws-sdk/client-sso-oidc@3.621.0)(@aws-sdk/client-sts@3.621.0)': + '@aws-sdk/credential-provider-ini@3.621.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0))(@aws-sdk/client-sts@3.621.0)': dependencies: '@aws-sdk/client-sts': 3.621.0 '@aws-sdk/credential-provider-env': 3.620.1 '@aws-sdk/credential-provider-http': 3.621.0 '@aws-sdk/credential-provider-process': 3.620.1 - '@aws-sdk/credential-provider-sso': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0) + '@aws-sdk/credential-provider-sso': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0)) '@aws-sdk/credential-provider-web-identity': 3.621.0(@aws-sdk/client-sts@3.621.0) '@aws-sdk/types': 3.609.0 '@smithy/credential-provider-imds': 3.2.0 @@ -14029,13 +14503,13 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-node@3.621.0(@aws-sdk/client-sso-oidc@3.621.0)(@aws-sdk/client-sts@3.621.0)': + '@aws-sdk/credential-provider-node@3.621.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0))(@aws-sdk/client-sts@3.621.0)': dependencies: '@aws-sdk/credential-provider-env': 3.620.1 '@aws-sdk/credential-provider-http': 3.621.0 - '@aws-sdk/credential-provider-ini': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0)(@aws-sdk/client-sts@3.621.0) + '@aws-sdk/credential-provider-ini': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0))(@aws-sdk/client-sts@3.621.0) '@aws-sdk/credential-provider-process': 3.620.1 - '@aws-sdk/credential-provider-sso': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0) + '@aws-sdk/credential-provider-sso': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0)) '@aws-sdk/credential-provider-web-identity': 3.621.0(@aws-sdk/client-sts@3.621.0) '@aws-sdk/types': 3.609.0 '@smithy/credential-provider-imds': 3.2.0 @@ -14056,10 +14530,10 @@ snapshots: '@smithy/types': 3.3.0 tslib: 2.6.3 - '@aws-sdk/credential-provider-sso@3.621.0(@aws-sdk/client-sso-oidc@3.621.0)': + '@aws-sdk/credential-provider-sso@3.621.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0))': dependencies: '@aws-sdk/client-sso': 3.621.0 - '@aws-sdk/token-providers': 3.614.0(@aws-sdk/client-sso-oidc@3.621.0) + '@aws-sdk/token-providers': 3.614.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0)) '@aws-sdk/types': 3.609.0 '@smithy/property-provider': 3.1.3 '@smithy/shared-ini-file-loader': 3.1.4 @@ -14187,7 +14661,7 @@ snapshots: '@smithy/types': 3.3.0 tslib: 2.6.3 - '@aws-sdk/token-providers@3.614.0(@aws-sdk/client-sso-oidc@3.621.0)': + '@aws-sdk/token-providers@3.614.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0))': dependencies: '@aws-sdk/client-sso-oidc': 3.621.0(@aws-sdk/client-sts@3.621.0) '@aws-sdk/types': 3.609.0 @@ -14242,6 +14716,26 @@ snapshots: '@babel/compat-data@7.25.2': {} + '@babel/core@7.24.5': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.0 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.24.5) + '@babel/helpers': 7.25.0 + '@babel/parser': 7.25.0 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.2 + '@babel/types': 7.25.2 + convert-source-map: 2.0.0 + debug: 4.3.6 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/core@7.25.2': dependencies: '@ampproject/remapping': 2.3.0 @@ -14341,6 +14835,16 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.25.2(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.2 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -14415,6 +14919,10 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.0.1 + '@babel/parser@7.24.5': + dependencies: + '@babel/types': 7.25.2 + '@babel/parser@7.25.0': dependencies: '@babel/types': 7.25.2 @@ -15175,7 +15683,7 @@ snapshots: '@babel/parser': 7.25.0 '@babel/template': 7.25.0 '@babel/types': 7.25.2 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.6 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -15289,7 +15797,7 @@ snapshots: react: 18.3.1 tslib: 2.6.3 - '@dnd-kit/core@6.1.0(react-dom@18.3.1)(react@18.3.1)': + '@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@dnd-kit/accessibility': 3.1.0(react@18.3.1) '@dnd-kit/utilities': 3.2.2(react@18.3.1) @@ -15297,16 +15805,16 @@ snapshots: react-dom: 18.3.1(react@18.3.1) tslib: 2.6.3 - '@dnd-kit/modifiers@6.0.1(@dnd-kit/core@6.1.0)(react@18.3.1)': + '@dnd-kit/modifiers@6.0.1(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@dnd-kit/core': 6.1.0(react-dom@18.3.1)(react@18.3.1) + '@dnd-kit/core': 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@dnd-kit/utilities': 3.2.2(react@18.3.1) react: 18.3.1 tslib: 2.6.3 - '@dnd-kit/sortable@7.0.2(@dnd-kit/core@6.1.0)(react@18.3.1)': + '@dnd-kit/sortable@7.0.2(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@dnd-kit/core': 6.1.0(react-dom@18.3.1)(react@18.3.1) + '@dnd-kit/core': 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@dnd-kit/utilities': 3.2.2(react@18.3.1) react: 18.3.1 tslib: 2.6.3 @@ -15332,6 +15840,75 @@ snapshots: '@emotion/unitless@0.7.5': {} + '@esbuild/aix-ppc64@0.19.11': + optional: true + + '@esbuild/android-arm64@0.19.11': + optional: true + + '@esbuild/android-arm@0.19.11': + optional: true + + '@esbuild/android-x64@0.19.11': + optional: true + + '@esbuild/darwin-arm64@0.19.11': + optional: true + + '@esbuild/darwin-x64@0.19.11': + optional: true + + '@esbuild/freebsd-arm64@0.19.11': + optional: true + + '@esbuild/freebsd-x64@0.19.11': + optional: true + + '@esbuild/linux-arm64@0.19.11': + optional: true + + '@esbuild/linux-arm@0.19.11': + optional: true + + '@esbuild/linux-ia32@0.19.11': + optional: true + + '@esbuild/linux-loong64@0.19.11': + optional: true + + '@esbuild/linux-mips64el@0.19.11': + optional: true + + '@esbuild/linux-ppc64@0.19.11': + optional: true + + '@esbuild/linux-riscv64@0.19.11': + optional: true + + '@esbuild/linux-s390x@0.19.11': + optional: true + + '@esbuild/linux-x64@0.19.11': + optional: true + + '@esbuild/netbsd-x64@0.19.11': + optional: true + + '@esbuild/openbsd-x64@0.19.11': + optional: true + + '@esbuild/sunos-x64@0.19.11': + optional: true + + '@esbuild/win32-arm64@0.19.11': + optional: true + + '@esbuild/win32-ia32@0.19.11': + optional: true + + '@esbuild/win32-x64@0.19.11': + optional: true + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': dependencies: eslint: 8.57.0 @@ -15342,7 +15919,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.6 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.1 @@ -15697,11 +16274,11 @@ snapshots: '@gar/promisify@1.1.3': {} - '@google-cloud/firestore@7.9.0': + '@google-cloud/firestore@7.9.0(encoding@0.1.13)': dependencies: fast-deep-equal: 3.1.3 functional-red-black-tree: 1.0.1 - google-gax: 4.3.8 + google-gax: 4.3.8(encoding@0.1.13) protobufjs: 7.3.2 transitivePeerDependencies: - encoding @@ -15720,14 +16297,14 @@ snapshots: '@google-cloud/promisify@4.0.0': optional: true - '@google-cloud/scheduler@4.3.0': + '@google-cloud/scheduler@4.3.0(encoding@0.1.13)': dependencies: - google-gax: 4.3.8 + google-gax: 4.3.8(encoding@0.1.13) transitivePeerDependencies: - encoding - supports-color - '@google-cloud/storage@7.12.1': + '@google-cloud/storage@7.12.1(encoding@0.1.13)': dependencies: '@google-cloud/paginator': 5.0.2 '@google-cloud/projectify': 4.0.0 @@ -15736,13 +16313,13 @@ snapshots: async-retry: 1.3.3 duplexify: 4.1.3 fast-xml-parser: 4.4.1 - gaxios: 6.7.0 - google-auth-library: 9.12.0 + gaxios: 6.7.0(encoding@0.1.13) + google-auth-library: 9.12.0(encoding@0.1.13) html-entities: 2.5.2 mime: 3.0.0 p-limit: 3.1.0 - retry-request: 7.0.2 - teeny-request: 9.0.0 + retry-request: 7.0.2(encoding@0.1.13) + teeny-request: 9.0.0(encoding@0.1.13) uuid: 8.3.2 transitivePeerDependencies: - encoding @@ -15766,7 +16343,7 @@ snapshots: protobufjs: 7.3.2 yargs: 17.7.2 - '@hubspot/api-client@11.1.0': + '@hubspot/api-client@11.1.0(encoding@0.1.13)': dependencies: '@types/node-fetch': 2.6.11 bottleneck: 2.19.5 @@ -15774,7 +16351,7 @@ snapshots: form-data: 2.5.1 lodash.get: 4.4.2 lodash.merge: 4.6.2 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) url-parse: 1.5.10 transitivePeerDependencies: - encoding @@ -15782,7 +16359,7 @@ snapshots: '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.6 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -15849,7 +16426,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@27.5.1(ts-node@10.9.2)': + '@jest/core@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))': dependencies: '@jest/console': 27.5.1 '@jest/reporters': 27.5.1 @@ -15863,7 +16440,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 27.5.1 - jest-config: 27.5.1(ts-node@10.9.2) + jest-config: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) jest-haste-map: 27.5.1 jest-message-util: 27.5.1 jest-regex-util: 27.5.1 @@ -15886,7 +16463,7 @@ snapshots: - ts-node - utf-8-validate - '@jest/core@28.1.3(ts-node@10.9.2)': + '@jest/core@28.1.3(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))': dependencies: '@jest/console': 28.1.3 '@jest/reporters': 28.1.3 @@ -15900,7 +16477,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 28.1.3 - jest-config: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2) + jest-config: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) jest-haste-map: 28.1.3 jest-message-util: 28.1.3 jest-regex-util: 28.0.2 @@ -15921,7 +16498,77 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(ts-node@10.9.2)': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.19.42 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.7 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4))': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.19.42 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.7 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -15935,7 +16582,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -16350,12 +16997,12 @@ snapshots: dependencies: '@lukeed/csprng': 1.1.0 - '@mapbox/node-pre-gyp@1.0.11': + '@mapbox/node-pre-gyp@1.0.11(encoding@0.1.13)': dependencies: detect-libc: 2.0.3 https-proxy-agent: 5.0.1 make-dir: 3.1.0 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 @@ -16375,7 +17022,7 @@ snapshots: monaco-editor: 0.50.0 state-local: 1.0.7 - '@monaco-editor/react@4.6.0(monaco-editor@0.50.0)(react-dom@18.3.1)(react@18.3.1)': + '@monaco-editor/react@4.6.0(monaco-editor@0.50.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@monaco-editor/loader': 1.4.0(monaco-editor@0.50.0) monaco-editor: 0.50.0 @@ -16419,36 +17066,65 @@ snapshots: '@nangohq/frontend@0.21.17': {} + '@next/env@14.2.3': {} + '@next/env@14.2.5': {} '@next/eslint-plugin-next@14.2.5': dependencies: glob: 10.3.10 + '@next/swc-darwin-arm64@14.2.3': + optional: true + '@next/swc-darwin-arm64@14.2.5': optional: true + '@next/swc-darwin-x64@14.2.3': + optional: true + '@next/swc-darwin-x64@14.2.5': optional: true + '@next/swc-linux-arm64-gnu@14.2.3': + optional: true + '@next/swc-linux-arm64-gnu@14.2.5': optional: true + '@next/swc-linux-arm64-musl@14.2.3': + optional: true + '@next/swc-linux-arm64-musl@14.2.5': optional: true + '@next/swc-linux-x64-gnu@14.2.3': + optional: true + '@next/swc-linux-x64-gnu@14.2.5': optional: true + '@next/swc-linux-x64-musl@14.2.3': + optional: true + '@next/swc-linux-x64-musl@14.2.5': optional: true + '@next/swc-win32-arm64-msvc@14.2.3': + optional: true + '@next/swc-win32-arm64-msvc@14.2.5': optional: true + '@next/swc-win32-ia32-msvc@14.2.3': + optional: true + '@next/swc-win32-ia32-msvc@14.2.5': optional: true + '@next/swc-win32-x64-msvc@14.2.3': + optional: true + '@next/swc-win32-x64-msvc@14.2.5': optional: true @@ -16626,11 +17302,11 @@ snapshots: dependencies: '@octokit/types': 6.41.0 - '@octokit/core@3.6.0': + '@octokit/core@3.6.0(encoding@0.1.13)': dependencies: '@octokit/auth-token': 2.5.0 - '@octokit/graphql': 4.8.0 - '@octokit/request': 5.6.3 + '@octokit/graphql': 4.8.0(encoding@0.1.13) + '@octokit/request': 5.6.3(encoding@0.1.13) '@octokit/request-error': 2.1.0 '@octokit/types': 6.41.0 before-after-hook: 2.2.3 @@ -16644,9 +17320,9 @@ snapshots: is-plain-object: 5.0.0 universal-user-agent: 6.0.1 - '@octokit/graphql@4.8.0': + '@octokit/graphql@4.8.0(encoding@0.1.13)': dependencies: - '@octokit/request': 5.6.3 + '@octokit/request': 5.6.3(encoding@0.1.13) '@octokit/types': 6.41.0 universal-user-agent: 6.0.1 transitivePeerDependencies: @@ -16654,18 +17330,18 @@ snapshots: '@octokit/openapi-types@12.11.0': {} - '@octokit/plugin-paginate-rest@2.21.3(@octokit/core@3.6.0)': + '@octokit/plugin-paginate-rest@2.21.3(@octokit/core@3.6.0(encoding@0.1.13))': dependencies: - '@octokit/core': 3.6.0 + '@octokit/core': 3.6.0(encoding@0.1.13) '@octokit/types': 6.41.0 - '@octokit/plugin-request-log@1.0.4(@octokit/core@3.6.0)': + '@octokit/plugin-request-log@1.0.4(@octokit/core@3.6.0(encoding@0.1.13))': dependencies: - '@octokit/core': 3.6.0 + '@octokit/core': 3.6.0(encoding@0.1.13) - '@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0)': + '@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0(encoding@0.1.13))': dependencies: - '@octokit/core': 3.6.0 + '@octokit/core': 3.6.0(encoding@0.1.13) '@octokit/types': 6.41.0 deprecation: 2.3.1 @@ -16675,23 +17351,23 @@ snapshots: deprecation: 2.3.1 once: 1.4.0 - '@octokit/request@5.6.3': + '@octokit/request@5.6.3(encoding@0.1.13)': dependencies: '@octokit/endpoint': 6.0.12 '@octokit/request-error': 2.1.0 '@octokit/types': 6.41.0 is-plain-object: 5.0.0 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) universal-user-agent: 6.0.1 transitivePeerDependencies: - encoding - '@octokit/rest@18.12.0': + '@octokit/rest@18.12.0(encoding@0.1.13)': dependencies: - '@octokit/core': 3.6.0 - '@octokit/plugin-paginate-rest': 2.21.3(@octokit/core@3.6.0) - '@octokit/plugin-request-log': 1.0.4(@octokit/core@3.6.0) - '@octokit/plugin-rest-endpoint-methods': 5.16.2(@octokit/core@3.6.0) + '@octokit/core': 3.6.0(encoding@0.1.13) + '@octokit/plugin-paginate-rest': 2.21.3(@octokit/core@3.6.0(encoding@0.1.13)) + '@octokit/plugin-request-log': 1.0.4(@octokit/core@3.6.0(encoding@0.1.13)) + '@octokit/plugin-rest-endpoint-methods': 5.16.2(@octokit/core@3.6.0(encoding@0.1.13)) transitivePeerDependencies: - encoding @@ -16712,7 +17388,7 @@ snapshots: dependencies: playwright: 1.39.0 - '@pmmmwh/react-refresh-webpack-plugin@0.5.15(react-refresh@0.11.0)(webpack-dev-server@4.15.2)(webpack@5.93.0)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.15(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@3.13.1)(webpack-dev-server@4.15.2(webpack@5.93.0))(webpack@5.93.0)': dependencies: ansi-html: 0.0.9 core-js-pure: 3.37.1 @@ -16722,11 +17398,14 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.2.0 source-map: 0.7.4 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 + optionalDependencies: + '@types/webpack': 5.28.5 + type-fest: 3.13.1 webpack-dev-server: 4.15.2(webpack@5.93.0) '@prisma/client@5.17.0(prisma@5.17.0)': - dependencies: + optionalDependencies: prisma: 5.17.0 '@prisma/debug@3.8.1': @@ -16790,19 +17469,19 @@ snapshots: dependencies: '@babel/runtime': 7.25.0 - '@rc-component/color-picker@1.5.3(react-dom@18.3.1)(react@18.3.1)': + '@rc-component/color-picker@1.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 '@ctrl/tinycolor': 3.6.1 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@rc-component/context@1.4.0(react-dom@18.3.1)(react@18.3.1)': + '@rc-component/context@1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -16810,127 +17489,250 @@ snapshots: dependencies: '@babel/runtime': 7.25.0 - '@rc-component/mutate-observer@1.1.0(react-dom@18.3.1)(react@18.3.1)': + '@rc-component/mutate-observer@1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@rc-component/portal@1.1.2(react-dom@18.3.1)(react@18.3.1)': + '@rc-component/portal@1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@rc-component/qrcode@1.0.0(react-dom@18.3.1)(react@18.3.1)': + '@rc-component/qrcode@1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@rc-component/tour@1.15.0(react-dom@18.3.1)(react@18.3.1)': + '@rc-component/tour@1.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 - '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) - '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) + '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@rc-component/trigger@2.2.0(react-dom@18.3.1)(react@18.3.1)': + '@rc-component/trigger@2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 - '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) + '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) - rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@remix-run/router@1.18.0': {} + '@react-email/body@0.0.10(react@18.3.1)': + dependencies: + react: 18.3.1 - '@rjsf/antd@5.19.4(@ant-design/icons@5.4.0)(@rjsf/core@5.10.0)(@rjsf/utils@5.10.0)(antd@5.19.4)(dayjs@1.11.12)(react-dom@18.3.1)(react@18.3.1)': + '@react-email/button@0.0.17(react@18.3.1)': dependencies: - '@ant-design/icons': 5.4.0(react-dom@18.3.1)(react@18.3.1) - '@rjsf/core': 5.10.0(@rjsf/utils@5.10.0)(react@18.3.1) - '@rjsf/utils': 5.10.0(react@18.3.1) - antd: 5.19.4(react-dom@18.3.1)(react@18.3.1) - classnames: 2.5.1 - dayjs: 1.11.12 - lodash: 4.17.21 - lodash-es: 4.17.21 - rc-picker: 2.7.6(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + + '@react-email/code-block@0.0.9(react@18.3.1)': + dependencies: + prismjs: 1.29.0 + react: 18.3.1 + + '@react-email/code-inline@0.0.4(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/column@0.0.12(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/components@0.0.25(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-email/body': 0.0.10(react@18.3.1) + '@react-email/button': 0.0.17(react@18.3.1) + '@react-email/code-block': 0.0.9(react@18.3.1) + '@react-email/code-inline': 0.0.4(react@18.3.1) + '@react-email/column': 0.0.12(react@18.3.1) + '@react-email/container': 0.0.14(react@18.3.1) + '@react-email/font': 0.0.8(react@18.3.1) + '@react-email/head': 0.0.11(react@18.3.1) + '@react-email/heading': 0.0.14(react@18.3.1) + '@react-email/hr': 0.0.10(react@18.3.1) + '@react-email/html': 0.0.10(react@18.3.1) + '@react-email/img': 0.0.10(react@18.3.1) + '@react-email/link': 0.0.10(react@18.3.1) + '@react-email/markdown': 0.0.12(react@18.3.1) + '@react-email/preview': 0.0.11(react@18.3.1) + '@react-email/render': 1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-email/row': 0.0.10(react@18.3.1) + '@react-email/section': 0.0.14(react@18.3.1) + '@react-email/tailwind': 0.1.0(react@18.3.1) + '@react-email/text': 0.0.10(react@18.3.1) react: 18.3.1 transitivePeerDependencies: - react-dom - '@rjsf/core@5.10.0(@rjsf/utils@5.10.0)(react@18.3.1)': + '@react-email/container@0.0.14(react@18.3.1)': dependencies: - '@rjsf/utils': 5.10.0(react@18.3.1) - lodash: 4.17.21 - lodash-es: 4.17.21 - markdown-to-jsx: 7.4.7(react@18.3.1) - nanoid: 3.3.7 - prop-types: 15.8.1 react: 18.3.1 - '@rjsf/utils@5.10.0(react@18.3.1)': + '@react-email/font@0.0.8(react@18.3.1)': dependencies: - json-schema-merge-allof: 0.8.1 - jsonpointer: 5.0.1 - lodash: 4.17.21 - lodash-es: 4.17.21 react: 18.3.1 - react-is: 18.3.1 - '@rjsf/validator-ajv6@5.10.0(@rjsf/utils@5.10.0)': + '@react-email/head@0.0.11(react@18.3.1)': dependencies: - '@rjsf/utils': 5.10.0(react@18.3.1) - ajv: 6.12.6 - lodash: 4.17.21 - lodash-es: 4.17.21 + react: 18.3.1 - '@rollup/plugin-alias@3.1.9(rollup@1.32.1)': + '@react-email/heading@0.0.14(react@18.3.1)': dependencies: - rollup: 1.32.1 - slash: 3.0.0 + react: 18.3.1 - '@rollup/plugin-babel@5.3.1(@babel/core@7.25.2)(rollup@2.79.1)': + '@react-email/hr@0.0.10(react@18.3.1)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-imports': 7.24.7 - '@rollup/pluginutils': 3.1.0(rollup@2.79.1) - rollup: 2.79.1 - transitivePeerDependencies: - - supports-color + react: 18.3.1 - '@rollup/plugin-commonjs@11.1.0(rollup@1.32.1)': + '@react-email/html@0.0.10(react@18.3.1)': dependencies: - '@rollup/pluginutils': 3.1.0(rollup@1.32.1) - commondir: 1.0.1 - estree-walker: 1.0.1 - glob: 7.2.3 - is-reference: 1.2.1 - magic-string: 0.25.9 - resolve: 1.22.8 - rollup: 1.32.1 + react: 18.3.1 - '@rollup/plugin-commonjs@23.0.7(rollup@3.29.4)': + '@react-email/img@0.0.10(react@18.3.1)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@3.29.4) - commondir: 1.0.1 + react: 18.3.1 + + '@react-email/link@0.0.10(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/markdown@0.0.12(react@18.3.1)': + dependencies: + md-to-react-email: 5.0.2(react@18.3.1) + react: 18.3.1 + + '@react-email/preview@0.0.11(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/render@0.0.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + html-to-text: 9.0.5 + js-beautify: 1.15.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-promise-suspense: 0.3.4 + + '@react-email/render@1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + html-to-text: 9.0.5 + js-beautify: 1.15.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-promise-suspense: 0.3.4 + + '@react-email/row@0.0.10(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/section@0.0.14(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/tailwind@0.1.0(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/text@0.0.10(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@remix-run/router@1.18.0': {} + + '@rjsf/antd@5.19.4(@ant-design/icons@5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rjsf/core@5.10.0(@rjsf/utils@5.10.0(react@18.3.1))(react@18.3.1))(@rjsf/utils@5.10.0(react@18.3.1))(antd@5.19.4(date-fns@2.30.0)(moment@2.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@ant-design/icons': 5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rjsf/core': 5.10.0(@rjsf/utils@5.10.0(react@18.3.1))(react@18.3.1) + '@rjsf/utils': 5.10.0(react@18.3.1) + antd: 5.19.4(date-fns@2.30.0)(moment@2.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + dayjs: 1.11.12 + lodash: 4.17.21 + lodash-es: 4.17.21 + rc-picker: 2.7.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + transitivePeerDependencies: + - react-dom + + '@rjsf/core@5.10.0(@rjsf/utils@5.10.0(react@18.3.1))(react@18.3.1)': + dependencies: + '@rjsf/utils': 5.10.0(react@18.3.1) + lodash: 4.17.21 + lodash-es: 4.17.21 + markdown-to-jsx: 7.4.7(react@18.3.1) + nanoid: 3.3.7 + prop-types: 15.8.1 + react: 18.3.1 + + '@rjsf/utils@5.10.0(react@18.3.1)': + dependencies: + json-schema-merge-allof: 0.8.1 + jsonpointer: 5.0.1 + lodash: 4.17.21 + lodash-es: 4.17.21 + react: 18.3.1 + react-is: 18.3.1 + + '@rjsf/validator-ajv6@5.10.0(@rjsf/utils@5.10.0(react@18.3.1))': + dependencies: + '@rjsf/utils': 5.10.0(react@18.3.1) + ajv: 6.12.6 + lodash: 4.17.21 + lodash-es: 4.17.21 + + '@rollup/plugin-alias@3.1.9(rollup@1.32.1)': + dependencies: + rollup: 1.32.1 + slash: 3.0.0 + + '@rollup/plugin-babel@5.3.1(@babel/core@7.25.2)(@types/babel__core@7.20.5)(rollup@2.79.1)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) + rollup: 2.79.1 + optionalDependencies: + '@types/babel__core': 7.20.5 + transitivePeerDependencies: + - supports-color + + '@rollup/plugin-commonjs@11.1.0(rollup@1.32.1)': + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@1.32.1) + commondir: 1.0.1 + estree-walker: 1.0.1 + glob: 7.2.3 + is-reference: 1.2.1 + magic-string: 0.25.9 + resolve: 1.22.8 + rollup: 1.32.1 + + '@rollup/plugin-commonjs@23.0.7(rollup@3.29.4)': + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@3.29.4) + commondir: 1.0.1 estree-walker: 2.0.2 glob: 8.1.0 is-reference: 1.2.1 magic-string: 0.27.0 + optionalDependencies: rollup: 3.29.4 '@rollup/plugin-commonjs@24.0.0(rollup@2.78.0)': @@ -16941,6 +17743,7 @@ snapshots: glob: 8.1.0 is-reference: 1.2.1 magic-string: 0.27.0 + optionalDependencies: rollup: 2.78.0 '@rollup/plugin-commonjs@25.0.8(rollup@3.29.4)': @@ -16951,6 +17754,7 @@ snapshots: glob: 8.1.0 is-reference: 1.2.1 magic-string: 0.30.11 + optionalDependencies: rollup: 3.29.4 '@rollup/plugin-json@4.1.0(rollup@1.32.1)': @@ -16961,17 +17765,20 @@ snapshots: '@rollup/plugin-json@5.0.2(rollup@3.29.4)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@3.29.4) + optionalDependencies: rollup: 3.29.4 '@rollup/plugin-json@6.1.0(rollup@3.29.4)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@3.29.4) + optionalDependencies: rollup: 3.29.4 '@rollup/plugin-multi-entry@6.0.1(rollup@3.29.4)': dependencies: '@rollup/plugin-virtual': 3.0.2(rollup@3.29.4) matched: 5.0.1 + optionalDependencies: rollup: 3.29.4 '@rollup/plugin-node-resolve@11.2.1(rollup@2.79.1)': @@ -16992,6 +17799,7 @@ snapshots: is-builtin-module: 3.2.1 is-module: 1.0.0 resolve: 1.22.8 + optionalDependencies: rollup: 3.29.4 '@rollup/plugin-node-resolve@6.1.0(rollup@1.32.1)': @@ -17013,38 +17821,43 @@ snapshots: dependencies: '@rollup/pluginutils': 5.1.0(rollup@3.29.4) magic-string: 0.30.11 + optionalDependencies: rollup: 3.29.4 '@rollup/plugin-terser@0.1.0(rollup@3.29.4)': dependencies: - rollup: 3.29.4 terser: 5.31.3 + optionalDependencies: + rollup: 3.29.4 '@rollup/plugin-terser@0.4.4(rollup@3.29.4)': dependencies: - rollup: 3.29.4 serialize-javascript: 6.0.2 smob: 1.5.0 terser: 5.31.3 + optionalDependencies: + rollup: 3.29.4 '@rollup/plugin-typescript@11.1.6(rollup@3.29.4)(tslib@2.6.3)(typescript@5.5.4)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@3.29.4) resolve: 1.22.8 + typescript: 5.5.4 + optionalDependencies: rollup: 3.29.4 tslib: 2.6.3 - typescript: 5.5.4 '@rollup/plugin-typescript@11.1.6(rollup@4.19.1)(tslib@2.6.3)(typescript@5.5.4)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.19.1) resolve: 1.22.8 + typescript: 5.5.4 + optionalDependencies: rollup: 4.19.1 tslib: 2.6.3 - typescript: 5.5.4 '@rollup/plugin-virtual@3.0.2(rollup@3.29.4)': - dependencies: + optionalDependencies: rollup: 3.29.4 '@rollup/pluginutils@3.1.0(rollup@1.32.1)': @@ -17071,6 +17884,7 @@ snapshots: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 + optionalDependencies: rollup: 2.78.0 '@rollup/pluginutils@5.1.0(rollup@3.29.4)': @@ -17078,6 +17892,7 @@ snapshots: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 + optionalDependencies: rollup: 3.29.4 '@rollup/pluginutils@5.1.0(rollup@4.19.1)': @@ -17085,6 +17900,7 @@ snapshots: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 + optionalDependencies: rollup: 4.19.1 '@rollup/rollup-android-arm-eabi@4.19.1': @@ -17148,7 +17964,7 @@ snapshots: dependencies: tslib: 2.6.3 - '@segment/analytics-next@1.72.1': + '@segment/analytics-next@1.72.1(encoding@0.1.13)': dependencies: '@lukeed/uuid': 2.0.1 '@segment/analytics-core': 1.6.0 @@ -17157,7 +17973,7 @@ snapshots: '@segment/facade': 3.4.10 dset: 3.1.3 js-cookie: 3.0.1 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) tslib: 2.6.3 unfetch: 4.2.0 transitivePeerDependencies: @@ -17180,6 +17996,11 @@ snapshots: '@segment/isodate@1.0.3': {} + '@selderee/plugin-htmlparser2@0.11.0': + dependencies: + domhandler: 5.0.3 + selderee: 0.11.0 + '@sensejs/kafkajs-zstd-support@0.11.0(kafkajs@2.2.4)': dependencies: kafkajs: 2.2.4 @@ -17216,11 +18037,11 @@ snapshots: '@sentry/types': 7.118.0 '@sentry/utils': 7.118.0 - '@sentry/cli@1.77.3': + '@sentry/cli@1.77.3(encoding@0.1.13)': dependencies: https-proxy-agent: 5.0.1 mkdirp: 0.5.6 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) progress: 2.0.3 proxy-from-env: 1.1.0 which: 2.0.2 @@ -17240,7 +18061,7 @@ snapshots: '@sentry/utils': 7.118.0 localforage: 1.10.0 - '@sentry/nextjs@7.118.0(next@14.2.5)(react@18.3.1)(webpack@5.93.0)': + '@sentry/nextjs@7.118.0(encoding@0.1.13)(next@14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.93.0)': dependencies: '@rollup/plugin-commonjs': 24.0.0(rollup@2.78.0) '@sentry/core': 7.118.0 @@ -17250,14 +18071,15 @@ snapshots: '@sentry/types': 7.118.0 '@sentry/utils': 7.118.0 '@sentry/vercel-edge': 7.118.0 - '@sentry/webpack-plugin': 1.21.0 + '@sentry/webpack-plugin': 1.21.0(encoding@0.1.13) chalk: 3.0.0 - next: 14.2.5(@babel/core@7.25.2)(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1) + next: 14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 resolve: 1.22.8 rollup: 2.78.0 stacktrace-parser: 0.1.10 - webpack: 5.93.0(webpack-cli@5.1.4) + optionalDependencies: + webpack: 5.93.0 transitivePeerDependencies: - encoding - supports-color @@ -17300,9 +18122,9 @@ snapshots: '@sentry/types': 7.118.0 '@sentry/utils': 7.118.0 - '@sentry/webpack-plugin@1.21.0': + '@sentry/webpack-plugin@1.21.0(encoding@0.1.13)': dependencies: - '@sentry/cli': 1.77.3 + '@sentry/cli': 1.77.3(encoding@0.1.13) webpack-sources: 3.2.3 transitivePeerDependencies: - encoding @@ -17686,6 +18508,8 @@ snapshots: '@smithy/types': 3.3.0 tslib: 2.6.3 + '@socket.io/component-emitter@3.1.2': {} + '@surma/rollup-plugin-off-main-thread@2.2.3': dependencies: ejs: 3.1.10 @@ -17780,22 +18604,23 @@ snapshots: '@swc/counter': 0.1.3 tslib: 2.6.3 - '@tailwindcss/typography@0.5.13(tailwindcss@3.4.7)': + '@tailwindcss/typography@0.5.13(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))': dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.7(ts-node@10.9.2) + tailwindcss: 3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) '@tanstack/query-core@4.36.1': {} - '@tanstack/react-query@4.36.1(react-dom@18.3.1)(react@18.3.1)': + '@tanstack/react-query@4.36.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/query-core': 4.36.1 react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) use-sync-external-store: 1.2.2(react@18.3.1) + optionalDependencies: + react-dom: 18.3.1(react@18.3.1) '@testing-library/dom@10.4.0': dependencies: @@ -17830,7 +18655,7 @@ snapshots: lodash: 4.17.21 redent: 3.0.0 - '@testing-library/react@13.4.0(react-dom@18.3.1)(react@18.3.1)': + '@testing-library/react@13.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 '@testing-library/dom': 8.20.1 @@ -17936,8 +18761,14 @@ snapshots: dependencies: '@types/node': 18.19.42 + '@types/cookie@0.4.1': {} + '@types/cookie@0.5.4': {} + '@types/cors@2.8.17': + dependencies: + '@types/node': 18.19.42 + '@types/cross-spawn@6.0.2': dependencies: '@types/node': 18.19.42 @@ -18242,11 +19073,23 @@ snapshots: '@types/webidl-conversions@7.0.3': {} - '@types/webpack@5.28.5(webpack-cli@5.1.4)': + '@types/webpack@5.28.5': dependencies: '@types/node': 18.19.42 tapable: 2.2.1 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + - webpack-cli + optional: true + + '@types/webpack@5.28.5(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))': + dependencies: + '@types/node': 18.19.42 + tapable: 2.2.1 + webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) transitivePeerDependencies: - '@swc/core' - esbuild @@ -18271,7 +19114,7 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@eslint-community/regexpp': 4.11.0 '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) @@ -18285,11 +19128,12 @@ snapshots: natural-compare-lite: 1.4.0 semver: 7.6.3 tsutils: 3.21.0(typescript@5.5.4) + optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@eslint-community/regexpp': 4.11.0 '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) @@ -18302,6 +19146,7 @@ snapshots: ignore: 5.3.1 natural-compare: 1.4.0 ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -18321,6 +19166,7 @@ snapshots: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) debug: 4.3.6(supports-color@5.5.0) eslint: 8.57.0 + optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -18333,6 +19179,7 @@ snapshots: '@typescript-eslint/visitor-keys': 7.18.0 debug: 4.3.6(supports-color@5.5.0) eslint: 8.57.0 + optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -18343,8 +19190,9 @@ snapshots: '@typescript-eslint/types': 7.2.0 '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.5.4) '@typescript-eslint/visitor-keys': 7.2.0 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.6 eslint: 8.57.0 + optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -18371,6 +19219,7 @@ snapshots: debug: 4.3.6(supports-color@5.5.0) eslint: 8.57.0 tsutils: 3.21.0(typescript@5.5.4) + optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -18382,6 +19231,7 @@ snapshots: debug: 4.3.6(supports-color@5.5.0) eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -18401,6 +19251,7 @@ snapshots: is-glob: 4.0.3 semver: 7.6.3 tsutils: 3.21.0(typescript@5.5.4) + optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -18415,6 +19266,7 @@ snapshots: minimatch: 9.0.5 semver: 7.6.3 ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -18423,12 +19275,13 @@ snapshots: dependencies: '@typescript-eslint/types': 7.2.0 '@typescript-eslint/visitor-keys': 7.2.0 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.6 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 semver: 7.6.3 ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -18480,7 +19333,7 @@ snapshots: '@vercel/error-utils@2.0.2': {} - '@vercel/fun@1.1.0': + '@vercel/fun@1.1.0(encoding@0.1.13)': dependencies: '@tootallnate/once': 2.0.0 async-listen: 1.2.0 @@ -18490,7 +19343,7 @@ snapshots: generic-pool: 3.4.2 micro: 9.3.5-canary.3 ms: 2.1.1 - node-fetch: 2.6.7 + node-fetch: 2.6.7(encoding@0.1.13) path-match: 1.2.4 promisepipe: 3.0.0 semver: 7.3.5 @@ -18526,16 +19379,16 @@ snapshots: '@vercel/static-config': 3.0.0 ts-morph: 12.0.0 - '@vercel/next@4.3.6': + '@vercel/next@4.3.6(encoding@0.1.13)': dependencies: - '@vercel/nft': 0.27.3 + '@vercel/nft': 0.27.3(encoding@0.1.13) transitivePeerDependencies: - encoding - supports-color - '@vercel/nft@0.27.3': + '@vercel/nft@0.27.3(encoding@0.1.13)': dependencies: - '@mapbox/node-pre-gyp': 1.0.11 + '@mapbox/node-pre-gyp': 1.0.11(encoding@0.1.13) '@rollup/pluginutils': 4.2.1 acorn: 8.12.1 acorn-import-attributes: 1.9.5(acorn@8.12.1) @@ -18551,7 +19404,7 @@ snapshots: - encoding - supports-color - '@vercel/node@3.2.8': + '@vercel/node@3.2.8(encoding@0.1.13)': dependencies: '@edge-runtime/node-utils': 2.3.0 '@edge-runtime/primitives': 4.1.0 @@ -18559,7 +19412,7 @@ snapshots: '@types/node': 16.18.11 '@vercel/build-utils': 8.3.6 '@vercel/error-utils': 2.0.2 - '@vercel/nft': 0.27.3 + '@vercel/nft': 0.27.3(encoding@0.1.13) '@vercel/static-config': 3.0.0 async-listen: 3.0.0 cjs-module-lexer: 1.2.3 @@ -18567,7 +19420,7 @@ snapshots: es-module-lexer: 1.4.1 esbuild: 0.14.47 etag: 1.8.1 - node-fetch: 2.6.9 + node-fetch: 2.6.9(encoding@0.1.13) path-to-regexp: 6.2.1 ts-morph: 12.0.0 ts-node: 10.9.1(@types/node@16.18.11)(typescript@4.9.5) @@ -18581,9 +19434,9 @@ snapshots: '@vercel/python@4.3.1': {} - '@vercel/redwood@2.1.3': + '@vercel/redwood@2.1.3(encoding@0.1.13)': dependencies: - '@vercel/nft': 0.27.3 + '@vercel/nft': 0.27.3(encoding@0.1.13) '@vercel/routing-utils': 3.1.0 '@vercel/static-config': 3.0.0 semver: 6.3.1 @@ -18592,10 +19445,10 @@ snapshots: - encoding - supports-color - '@vercel/remix-builder@2.2.3': + '@vercel/remix-builder@2.2.3(encoding@0.1.13)': dependencies: '@vercel/error-utils': 2.0.2 - '@vercel/nft': 0.27.3 + '@vercel/nft': 0.27.3(encoding@0.1.13) '@vercel/static-config': 3.0.0 ts-morph: 12.0.0 transitivePeerDependencies: @@ -18699,32 +19552,33 @@ snapshots: '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.93.0)': + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)))': dependencies: - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) - '@webpack-cli/generators@3.0.7(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0)': + '@webpack-cli/generators@3.0.7(encoding@0.1.13)(mem-fs@2.3.0)(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0)': dependencies: - prettier: 2.8.8 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) yeoman-environment: 3.19.3 - yeoman-generator: 5.10.0(yeoman-environment@3.19.3) + yeoman-generator: 5.10.0(encoding@0.1.13)(mem-fs@2.3.0)(yeoman-environment@3.19.3) + optionalDependencies: + prettier: 2.8.8 transitivePeerDependencies: - bluebird - encoding - mem-fs - supports-color - '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.93.0)': + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)))': dependencies: - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.93.0)': + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)))': dependencies: - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) '@xobotyi/scrollbar-width@1.9.5': {} @@ -18780,13 +19634,13 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.6 transitivePeerDependencies: - supports-color agent-base@7.1.1: dependencies: - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.6 transitivePeerDependencies: - supports-color @@ -18804,7 +19658,7 @@ snapshots: indent-string: 4.0.0 ajv-formats@2.1.1(ajv@8.12.0): - dependencies: + optionalDependencies: ajv: 8.12.0 ajv-keywords@3.5.2(ajv@6.12.6): @@ -18890,55 +19744,55 @@ snapshots: dependencies: entities: 2.2.0 - antd@5.19.4(react-dom@18.3.1)(react@18.3.1): + antd@5.19.4(date-fns@2.30.0)(moment@2.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@ant-design/colors': 7.1.0 - '@ant-design/cssinjs': 1.21.0(react-dom@18.3.1)(react@18.3.1) - '@ant-design/cssinjs-utils': 1.0.3(react-dom@18.3.1)(react@18.3.1) - '@ant-design/icons': 5.4.0(react-dom@18.3.1)(react@18.3.1) + '@ant-design/cssinjs': 1.21.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/cssinjs-utils': 1.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/icons': 5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@ant-design/react-slick': 1.1.2(react@18.3.1) '@babel/runtime': 7.25.0 '@ctrl/tinycolor': 3.6.1 - '@rc-component/color-picker': 1.5.3(react-dom@18.3.1)(react@18.3.1) - '@rc-component/mutate-observer': 1.1.0(react-dom@18.3.1)(react@18.3.1) - '@rc-component/qrcode': 1.0.0(react-dom@18.3.1)(react@18.3.1) - '@rc-component/tour': 1.15.0(react-dom@18.3.1)(react@18.3.1) - '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) + '@rc-component/color-picker': 1.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/mutate-observer': 1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/qrcode': 1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/tour': 1.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 copy-to-clipboard: 3.3.3 dayjs: 1.11.12 - rc-cascader: 3.27.0(react-dom@18.3.1)(react@18.3.1) - rc-checkbox: 3.3.0(react-dom@18.3.1)(react@18.3.1) - rc-collapse: 3.7.3(react-dom@18.3.1)(react@18.3.1) - rc-dialog: 9.5.2(react-dom@18.3.1)(react@18.3.1) - rc-drawer: 7.2.0(react-dom@18.3.1)(react@18.3.1) - rc-dropdown: 4.2.0(react-dom@18.3.1)(react@18.3.1) - rc-field-form: 2.2.1(react-dom@18.3.1)(react@18.3.1) - rc-image: 7.9.0(react-dom@18.3.1)(react@18.3.1) - rc-input: 1.5.1(react-dom@18.3.1)(react@18.3.1) - rc-input-number: 9.1.0(react-dom@18.3.1)(react@18.3.1) - rc-mentions: 2.14.0(react-dom@18.3.1)(react@18.3.1) - rc-menu: 9.14.1(react-dom@18.3.1)(react@18.3.1) - rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) - rc-notification: 5.6.0(react-dom@18.3.1)(react@18.3.1) - rc-pagination: 4.2.0(react-dom@18.3.1)(react@18.3.1) - rc-picker: 4.6.11(dayjs@1.11.12)(react-dom@18.3.1)(react@18.3.1) - rc-progress: 4.0.0(react-dom@18.3.1)(react@18.3.1) - rc-rate: 2.13.0(react-dom@18.3.1)(react@18.3.1) - rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) - rc-segmented: 2.3.0(react-dom@18.3.1)(react@18.3.1) - rc-select: 14.15.1(react-dom@18.3.1)(react@18.3.1) - rc-slider: 10.6.2(react-dom@18.3.1)(react@18.3.1) - rc-steps: 6.0.1(react-dom@18.3.1)(react@18.3.1) - rc-switch: 4.1.0(react-dom@18.3.1)(react@18.3.1) - rc-table: 7.45.7(react-dom@18.3.1)(react@18.3.1) - rc-tabs: 15.1.1(react-dom@18.3.1)(react@18.3.1) - rc-textarea: 1.7.0(react-dom@18.3.1)(react@18.3.1) - rc-tooltip: 6.2.0(react-dom@18.3.1)(react@18.3.1) - rc-tree: 5.8.8(react-dom@18.3.1)(react@18.3.1) - rc-tree-select: 5.22.1(react-dom@18.3.1)(react@18.3.1) - rc-upload: 4.6.0(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-cascader: 3.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-checkbox: 3.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-collapse: 3.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-dialog: 9.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-drawer: 7.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-dropdown: 4.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-field-form: 2.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-image: 7.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-input: 1.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-input-number: 9.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-mentions: 2.14.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-menu: 9.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-notification: 5.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-pagination: 4.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-picker: 4.6.11(date-fns@2.30.0)(dayjs@1.11.12)(moment@2.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-progress: 4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-rate: 2.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-segmented: 2.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-select: 14.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-slider: 10.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-steps: 6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-switch: 4.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-table: 7.45.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tabs: 15.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-textarea: 1.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tooltip: 6.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tree: 5.8.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tree-select: 5.22.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-upload: 4.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) scroll-into-view-if-needed: 3.1.0 @@ -19251,14 +20105,21 @@ snapshots: loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 + + babel-loader@9.1.3(@babel/core@7.25.2)(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))): + dependencies: + '@babel/core': 7.25.2 + find-cache-dir: 4.0.0 + schema-utils: 4.2.0 + webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) babel-loader@9.1.3(@babel/core@7.25.2)(webpack@5.93.0): dependencies: '@babel/core': 7.25.2 find-cache-dir: 4.0.0 schema-utils: 4.2.0 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 babel-plugin-istanbul@6.1.1: dependencies: @@ -19407,6 +20268,8 @@ snapshots: base64-js@1.5.1: {} + base64id@2.0.0: {} + batch@0.6.1: {} bcrypt-pbkdf@1.0.2: @@ -19677,7 +20540,7 @@ snapshots: caniuse-api@3.0.0: dependencies: browserslist: 4.23.2 - caniuse-lite: 1.0.30001645 + caniuse-lite: 1.0.30001649 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 @@ -19796,10 +20659,10 @@ snapshots: clean-stack@2.2.0: {} - clean-webpack-plugin@4.0.0(webpack@5.93.0): + clean-webpack-plugin@4.0.0(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))): dependencies: del: 4.1.1 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) cli-boxes@3.0.0: {} @@ -20023,7 +20886,7 @@ snapshots: dependencies: toggle-selection: 1.0.6 - copy-webpack-plugin@12.0.2(webpack@5.93.0): + copy-webpack-plugin@12.0.2(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))): dependencies: fast-glob: 3.3.2 glob-parent: 6.0.2 @@ -20031,7 +20894,7 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) core-js-compat@3.37.1: dependencies: @@ -20047,6 +20910,11 @@ snapshots: core-util-is@1.0.3: {} + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + cosmiconfig@5.2.1: dependencies: import-fresh: 2.0.0 @@ -20083,13 +20951,43 @@ snapshots: crc-32: 1.2.2 readable-stream: 3.6.2 - create-jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2): + create-jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + create-jest@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + create-jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -20100,15 +20998,15 @@ snapshots: create-require@1.1.1: {} - cross-fetch@3.1.8: + cross-fetch@3.1.8(encoding@0.1.13): dependencies: - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) transitivePeerDependencies: - encoding - cross-fetch@4.0.0: + cross-fetch@4.0.0(encoding@0.1.13): dependencies: - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) transitivePeerDependencies: - encoding @@ -20157,7 +21055,8 @@ snapshots: postcss-modules-values: 4.0.0(postcss@8.4.41) postcss-value-parser: 4.2.0 semver: 7.6.3 - webpack: 5.93.0(webpack-cli@5.1.4) + optionalDependencies: + webpack: 5.93.0 css-minimizer-webpack-plugin@3.4.1(webpack@5.93.0): dependencies: @@ -20167,7 +21066,7 @@ snapshots: schema-utils: 4.2.0 serialize-javascript: 6.0.2 source-map: 0.6.1 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 css-modules-loader-core@1.1.0: dependencies: @@ -20423,6 +21322,8 @@ snapshots: dayjs@1.11.12: {} + debounce@2.0.0: {} + debug@2.6.9: dependencies: ms: 2.0.0 @@ -20435,9 +21336,14 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.3.6: + dependencies: + ms: 2.1.2 + debug@4.3.6(supports-color@5.5.0): dependencies: ms: 2.1.2 + optionalDependencies: supports-color: 5.5.0 debuglog@1.0.1: {} @@ -20458,7 +21364,9 @@ snapshots: dedent@0.7.0: {} - dedent@1.5.3: {} + dedent@1.5.3(babel-plugin-macros@3.1.0): + optionalDependencies: + babel-plugin-macros: 3.1.0 deep-equal@2.2.3: dependencies: @@ -20789,6 +21697,25 @@ snapshots: dependencies: once: 1.4.0 + engine.io-parser@5.2.3: {} + + engine.io@6.5.5: + dependencies: + '@types/cookie': 0.4.1 + '@types/cors': 2.8.17 + '@types/node': 18.19.42 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.4.1 + cors: 2.8.5 + debug: 4.3.6 + engine.io-parser: 5.2.3 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + enhanced-resolve@5.17.1: dependencies: graceful-fs: 4.2.11 @@ -21016,6 +21943,32 @@ snapshots: esbuild-windows-64: 0.14.47 esbuild-windows-arm64: 0.14.47 + esbuild@0.19.11: + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.11 + '@esbuild/android-arm': 0.19.11 + '@esbuild/android-arm64': 0.19.11 + '@esbuild/android-x64': 0.19.11 + '@esbuild/darwin-arm64': 0.19.11 + '@esbuild/darwin-x64': 0.19.11 + '@esbuild/freebsd-arm64': 0.19.11 + '@esbuild/freebsd-x64': 0.19.11 + '@esbuild/linux-arm': 0.19.11 + '@esbuild/linux-arm64': 0.19.11 + '@esbuild/linux-ia32': 0.19.11 + '@esbuild/linux-loong64': 0.19.11 + '@esbuild/linux-mips64el': 0.19.11 + '@esbuild/linux-ppc64': 0.19.11 + '@esbuild/linux-riscv64': 0.19.11 + '@esbuild/linux-s390x': 0.19.11 + '@esbuild/linux-x64': 0.19.11 + '@esbuild/netbsd-x64': 0.19.11 + '@esbuild/openbsd-x64': 0.19.11 + '@esbuild/sunos-x64': 0.19.11 + '@esbuild/win32-arm64': 0.19.11 + '@esbuild/win32-ia32': 0.19.11 + '@esbuild/win32-x64': 0.19.11 + escalade@3.1.2: {} escape-goat@3.0.0: {} @@ -21052,11 +22005,12 @@ snapshots: '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) + optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - eslint-import-resolver-webpack @@ -21066,23 +22020,24 @@ snapshots: dependencies: eslint: 8.57.0 - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0)(jest@27.5.1)(typescript@5.5.4): + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(eslint@8.57.0)(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4): dependencies: '@babel/core': 7.25.2 '@babel/eslint-parser': 7.25.1(@babel/core@7.25.2)(eslint@8.57.0) '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 eslint: 8.57.0 - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0)(eslint@8.57.0) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.57.0)(jest@27.5.1)(typescript@5.5.4) + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) eslint-plugin-testing-library: 5.11.1(eslint@8.57.0)(typescript@5.5.4) + optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - '@babel/plugin-syntax-flow' @@ -21100,13 +22055,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0): dependencies: - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.6 enhanced-resolve: 5.17.1 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.6 is-core-module: 2.15.0 @@ -21117,26 +22072,28 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): dependencies: - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4) debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0) transitivePeerDependencies: - supports-color - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0): + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(eslint@8.57.0): dependencies: '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.25.2) '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2) @@ -21144,9 +22101,8 @@ snapshots: lodash: 4.17.21 string-natural-compare: 3.0.1 - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0)(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0): dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 @@ -21155,7 +22111,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.15.0 is-glob: 4.0.3 @@ -21165,14 +22121,15 @@ snapshots: object.values: 1.2.0 semver: 6.3.1 tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): dependencies: - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4) array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 @@ -21181,7 +22138,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.15.0 is-glob: 4.0.3 @@ -21191,17 +22148,20 @@ snapshots: object.values: 1.2.0 semver: 6.3.1 tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.57.0)(jest@27.5.1)(typescript@5.5.4): + eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4): dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) eslint: 8.57.0 - jest: 27.5.1(ts-node@10.9.2) + optionalDependencies: + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) + jest: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) transitivePeerDependencies: - supports-color - typescript @@ -21289,7 +22249,7 @@ snapshots: micromatch: 4.0.7 normalize-path: 3.0.0 schema-utils: 4.2.0 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 eslint@8.57.0: dependencies: @@ -21304,7 +22264,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.6 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -21486,6 +22446,8 @@ snapshots: farmhash-modern@1.1.0: {} + fast-deep-equal@2.0.1: {} + fast-deep-equal@3.1.3: {} fast-equals@5.0.1: {} @@ -21528,17 +22490,17 @@ snapshots: dependencies: bser: 2.1.1 - fbemitter@3.0.0: + fbemitter@3.0.0(encoding@0.1.13): dependencies: - fbjs: 3.0.5 + fbjs: 3.0.5(encoding@0.1.13) transitivePeerDependencies: - encoding fbjs-css-vars@1.0.2: {} - fbjs@3.0.5: + fbjs@3.0.5(encoding@0.1.13): dependencies: - cross-fetch: 3.1.8 + cross-fetch: 3.1.8(encoding@0.1.13) fbjs-css-vars: 1.0.2 loose-envify: 1.4.0 object-assign: 4.1.1 @@ -21576,7 +22538,7 @@ snapshots: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 file-uri-to-path@1.0.0: {} @@ -21641,7 +22603,7 @@ snapshots: micromatch: 4.0.7 pkg-dir: 4.2.0 - firebase-admin@12.3.0: + firebase-admin@12.3.0(encoding@0.1.13): dependencies: '@fastify/busboy': 3.0.0 '@firebase/database-compat': 1.0.6 @@ -21653,8 +22615,8 @@ snapshots: node-forge: 1.3.1 uuid: 10.0.0 optionalDependencies: - '@google-cloud/firestore': 7.9.0 - '@google-cloud/storage': 7.12.1 + '@google-cloud/firestore': 7.9.0(encoding@0.1.13) + '@google-cloud/storage': 7.12.1(encoding@0.1.13) transitivePeerDependencies: - encoding - supports-color @@ -21707,10 +22669,10 @@ snapshots: flatted@3.3.1: {} - flux@4.0.4(react@18.3.1): + flux@4.0.4(encoding@0.1.13)(react@18.3.1): dependencies: - fbemitter: 3.0.0 - fbjs: 3.0.5 + fbemitter: 3.0.0(encoding@0.1.13) + fbjs: 3.0.5(encoding@0.1.13) react: 18.3.1 transitivePeerDependencies: - encoding @@ -21734,7 +22696,6 @@ snapshots: chokidar: 3.6.0 cosmiconfig: 6.0.0 deepmerge: 4.3.1 - eslint: 8.57.0 fs-extra: 9.1.0 glob: 7.2.3 memfs: 3.5.3 @@ -21743,7 +22704,9 @@ snapshots: semver: 7.6.3 tapable: 1.1.3 typescript: 5.5.4 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 + optionalDependencies: + eslint: 8.57.0 form-data@2.5.1: dependencies: @@ -21873,39 +22836,39 @@ snapshots: strip-ansi: 6.0.1 wide-align: 1.1.5 - gaxios@4.3.3: + gaxios@4.3.3(encoding@0.1.13): dependencies: abort-controller: 3.0.0 extend: 3.0.2 https-proxy-agent: 5.0.1 is-stream: 2.0.1 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) transitivePeerDependencies: - encoding - supports-color - gaxios@6.7.0: + gaxios@6.7.0(encoding@0.1.13): dependencies: extend: 3.0.2 https-proxy-agent: 7.0.5 is-stream: 2.0.1 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) uuid: 10.0.0 transitivePeerDependencies: - encoding - supports-color - gcp-metadata@4.3.1: + gcp-metadata@4.3.1(encoding@0.1.13): dependencies: - gaxios: 4.3.3 + gaxios: 4.3.3(encoding@0.1.13) json-bigint: 1.0.0 transitivePeerDependencies: - encoding - supports-color - gcp-metadata@6.1.0: + gcp-metadata@6.1.0(encoding@0.1.13): dependencies: - gaxios: 6.7.0 + gaxios: 6.7.0(encoding@0.1.13) json-bigint: 1.0.0 transitivePeerDependencies: - encoding @@ -21955,9 +22918,9 @@ snapshots: github-from-package@0.0.0: {} - github-username@6.0.0: + github-username@6.0.0(encoding@0.1.13): dependencies: - '@octokit/rest': 18.12.0 + '@octokit/rest': 18.12.0(encoding@0.1.13) transitivePeerDependencies: - encoding @@ -21979,6 +22942,14 @@ snapshots: minipass: 7.1.2 path-scurry: 1.11.1 + glob@10.3.4: + dependencies: + foreground-child: 3.2.1 + jackspeak: 2.3.6 + minimatch: 9.0.5 + minipass: 7.1.2 + path-scurry: 1.11.1 + glob@10.4.5: dependencies: foreground-child: 3.2.1 @@ -22056,14 +23027,14 @@ snapshots: globrex@0.1.2: {} - google-ads-api@16.0.0-rest-beta3: + google-ads-api@16.0.0-rest-beta3(encoding@0.1.13): dependencies: '@isaacs/ttlcache': 1.4.1 axios: 1.7.2 circ-json: 1.0.4 - google-ads-node: 13.0.0 - google-auth-library: 7.14.1 - google-gax: 4.3.8 + google-ads-node: 13.0.0(encoding@0.1.13) + google-auth-library: 7.14.1(encoding@0.1.13) + google-gax: 4.3.8(encoding@0.1.13) long: 4.0.0 map-obj: 4.3.0 stream-json: 1.8.0 @@ -22072,54 +23043,54 @@ snapshots: - encoding - supports-color - google-ads-node@13.0.0: + google-ads-node@13.0.0(encoding@0.1.13): dependencies: - google-gax: 4.3.8 + google-gax: 4.3.8(encoding@0.1.13) lru-cache: 10.4.3 transitivePeerDependencies: - encoding - supports-color - google-auth-library@7.14.1: + google-auth-library@7.14.1(encoding@0.1.13): dependencies: arrify: 2.0.1 base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 fast-text-encoding: 1.0.6 - gaxios: 4.3.3 - gcp-metadata: 4.3.1 - gtoken: 5.3.2 + gaxios: 4.3.3(encoding@0.1.13) + gcp-metadata: 4.3.1(encoding@0.1.13) + gtoken: 5.3.2(encoding@0.1.13) jws: 4.0.0 lru-cache: 6.0.0 transitivePeerDependencies: - encoding - supports-color - google-auth-library@9.12.0: + google-auth-library@9.12.0(encoding@0.1.13): dependencies: base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 - gaxios: 6.7.0 - gcp-metadata: 6.1.0 - gtoken: 7.1.0 + gaxios: 6.7.0(encoding@0.1.13) + gcp-metadata: 6.1.0(encoding@0.1.13) + gtoken: 7.1.0(encoding@0.1.13) jws: 4.0.0 transitivePeerDependencies: - encoding - supports-color - google-gax@4.3.8: + google-gax@4.3.8(encoding@0.1.13): dependencies: '@grpc/grpc-js': 1.11.1 '@grpc/proto-loader': 0.7.13 '@types/long': 4.0.2 abort-controller: 3.0.0 duplexify: 4.1.3 - google-auth-library: 9.12.0 - node-fetch: 2.7.0 + google-auth-library: 9.12.0(encoding@0.1.13) + node-fetch: 2.7.0(encoding@0.1.13) object-hash: 3.0.0 proto3-json-serializer: 2.0.2 protobufjs: 7.3.2 - retry-request: 7.0.2 + retry-request: 7.0.2(encoding@0.1.13) uuid: 9.0.1 transitivePeerDependencies: - encoding @@ -22129,11 +23100,11 @@ snapshots: dependencies: node-forge: 1.3.1 - googleapis-common@7.2.0: + googleapis-common@7.2.0(encoding@0.1.13): dependencies: extend: 3.0.2 - gaxios: 6.7.0 - google-auth-library: 9.12.0 + gaxios: 6.7.0(encoding@0.1.13) + google-auth-library: 9.12.0(encoding@0.1.13) qs: 6.12.3 url-template: 2.0.8 uuid: 9.0.1 @@ -22141,10 +23112,10 @@ snapshots: - encoding - supports-color - googleapis@126.0.1: + googleapis@126.0.1(encoding@0.1.13): dependencies: - google-auth-library: 9.12.0 - googleapis-common: 7.2.0 + google-auth-library: 9.12.0(encoding@0.1.13) + googleapis-common: 7.2.0(encoding@0.1.13) transitivePeerDependencies: - encoding - supports-color @@ -22159,18 +23130,18 @@ snapshots: grouped-queue@2.0.0: {} - gtoken@5.3.2: + gtoken@5.3.2(encoding@0.1.13): dependencies: - gaxios: 4.3.3 + gaxios: 4.3.3(encoding@0.1.13) google-p12-pem: 3.1.4 jws: 4.0.0 transitivePeerDependencies: - encoding - supports-color - gtoken@7.1.0: + gtoken@7.1.0(encoding@0.1.13): dependencies: - gaxios: 6.7.0 + gaxios: 6.7.0(encoding@0.1.13) jws: 4.0.0 transitivePeerDependencies: - encoding @@ -22286,6 +23257,14 @@ snapshots: relateurl: 0.2.7 uglify-js: 3.19.1 + html-to-text@9.0.5: + dependencies: + '@selderee/plugin-htmlparser2': 0.11.0 + deepmerge: 4.3.1 + dom-serializer: 2.0.0 + htmlparser2: 8.0.2 + selderee: 0.11.0 + html-webpack-plugin@5.6.0(webpack@5.93.0): dependencies: '@types/html-minifier-terser': 6.1.0 @@ -22293,7 +23272,8 @@ snapshots: lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.93.0(webpack-cli@5.1.4) + optionalDependencies: + webpack: 5.93.0 htmlencode@0.0.4: {} @@ -22371,18 +23351,19 @@ snapshots: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.6 transitivePeerDependencies: - supports-color http-proxy-middleware@2.0.6(@types/express@4.17.21): dependencies: - '@types/express': 4.17.21 '@types/http-proxy': 1.17.14 http-proxy: 1.18.1 is-glob: 4.0.3 is-plain-obj: 3.0.0 micromatch: 4.0.7 + optionalDependencies: + '@types/express': 4.17.21 transitivePeerDependencies: - debug @@ -22397,14 +23378,14 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.6 transitivePeerDependencies: - supports-color https-proxy-agent@7.0.5: dependencies: agent-base: 7.1.1 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.6 transitivePeerDependencies: - supports-color @@ -22947,7 +23928,7 @@ snapshots: transitivePeerDependencies: - supports-color - jest-circus@29.7.0: + jest-circus@29.7.0(babel-plugin-macros@3.1.0): dependencies: '@jest/environment': 29.7.0 '@jest/expect': 29.7.0 @@ -22956,7 +23937,7 @@ snapshots: '@types/node': 18.19.42 chalk: 4.1.2 co: 4.6.0 - dedent: 1.5.3 + dedent: 1.5.3(babel-plugin-macros@3.1.0) is-generator-fn: 2.1.0 jest-each: 29.7.0 jest-matcher-utils: 29.7.0 @@ -22973,16 +23954,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@27.5.1(ts-node@10.9.2): + jest-cli@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): dependencies: - '@jest/core': 27.5.1(ts-node@10.9.2) + '@jest/core': 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.2.0 - jest-config: 27.5.1(ts-node@10.9.2) + jest-config: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) jest-util: 27.5.1 jest-validate: 27.5.1 prompts: 2.4.2 @@ -22994,16 +23975,16 @@ snapshots: - ts-node - utf-8-validate - jest-cli@28.1.3(@types/node@18.19.42)(ts-node@10.9.2): + jest-cli@28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): dependencies: - '@jest/core': 28.1.3(ts-node@10.9.2) + '@jest/core': 28.1.3(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) '@jest/test-result': 28.1.3 '@jest/types': 28.1.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.2.0 - jest-config: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2) + jest-config: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) jest-util: 28.1.3 jest-validate: 28.1.3 prompts: 2.4.2 @@ -23013,16 +23994,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@18.19.42)(ts-node@10.9.2): + jest-cli@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + create-jest: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -23032,7 +24013,45 @@ snapshots: - supports-color - ts-node - jest-config@27.5.1(ts-node@10.9.2): + jest-cli@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + dependencies: + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest-cli@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest-config@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): dependencies: '@babel/core': 7.25.2 '@jest/test-sequencer': 27.5.1 @@ -23058,6 +24077,7 @@ snapshots: pretty-format: 27.5.1 slash: 3.0.0 strip-json-comments: 3.1.1 + optionalDependencies: ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) transitivePeerDependencies: - bufferutil @@ -23065,12 +24085,11 @@ snapshots: - supports-color - utf-8-validate - jest-config@28.1.3(@types/node@18.19.42)(ts-node@10.9.2): + jest-config@28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): dependencies: '@babel/core': 7.25.2 '@jest/test-sequencer': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 18.19.42 babel-jest: 28.1.3(@babel/core@7.25.2) chalk: 4.1.2 ci-info: 3.9.0 @@ -23090,23 +24109,86 @@ snapshots: pretty-format: 28.1.3 slash: 3.0.0 strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 18.19.42 ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) transitivePeerDependencies: - supports-color - jest-config@29.7.0(@types/node@18.19.42)(ts-node@10.9.2): + jest-config@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)): + dependencies: + '@babel/core': 7.25.2 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 16.18.11 + ts-node: 10.9.2(@types/node@16.18.11)(typescript@5.5.4) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): dependencies: '@babel/core': 7.25.2 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: '@types/node': 18.19.42 + ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)): + dependencies: + '@babel/core': 7.25.2 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.25.2) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-circus: 29.7.0 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) jest-environment-node: 29.7.0 jest-get-type: 29.6.3 jest-regex-util: 29.6.3 @@ -23119,6 +24201,39 @@ snapshots: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 18.19.42 + ts-node: 10.9.2(@types/node@16.18.11)(typescript@5.5.4) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + dependencies: + '@babel/core': 7.25.2 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 18.19.42 ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) transitivePeerDependencies: - babel-plugin-macros @@ -23389,15 +24504,15 @@ snapshots: jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): - dependencies: + optionalDependencies: jest-resolve: 27.5.1 jest-pnp-resolver@1.2.3(jest-resolve@28.1.3): - dependencies: + optionalDependencies: jest-resolve: 28.1.3 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - dependencies: + optionalDependencies: jest-resolve: 29.7.0 jest-regex-util@27.5.1: {} @@ -23766,11 +24881,11 @@ snapshots: leven: 3.1.0 pretty-format: 29.7.0 - jest-watch-typeahead@1.1.0(jest@27.5.1): + jest-watch-typeahead@1.1.0(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))): dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 - jest: 27.5.1(ts-node@10.9.2) + jest: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) jest-regex-util: 28.0.2 jest-watcher: 28.1.3 slash: 4.0.0 @@ -23839,11 +24954,11 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@27.5.1(ts-node@10.9.2): + jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): dependencies: - '@jest/core': 27.5.1(ts-node@10.9.2) + '@jest/core': 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) import-local: 3.2.0 - jest-cli: 27.5.1(ts-node@10.9.2) + jest-cli: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) transitivePeerDependencies: - bufferutil - canvas @@ -23851,23 +24966,47 @@ snapshots: - ts-node - utf-8-validate - jest@28.1.3(@types/node@18.19.42)(ts-node@10.9.2): + jest@28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): dependencies: - '@jest/core': 28.1.3(ts-node@10.9.2) + '@jest/core': 28.1.3(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) '@jest/types': 28.1.3 import-local: 3.2.0 - jest-cli: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2) + jest-cli: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + + jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + '@jest/types': 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + dependencies: + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + '@jest/types': 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) transitivePeerDependencies: - '@types/node' + - babel-plugin-macros - supports-color - ts-node - jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2): + jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + jest-cli: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -24044,13 +25183,13 @@ snapshots: object.assign: 4.1.5 object.values: 1.2.0 - juice@10.0.0: + juice@10.0.0(encoding@0.1.13): dependencies: cheerio: 1.0.0-rc.12 commander: 6.2.1 mensch: 0.3.4 slick: 1.12.2 - web-resource-inliner: 6.0.1 + web-resource-inliner: 6.0.1(encoding@0.1.13) transitivePeerDependencies: - encoding @@ -24074,7 +25213,7 @@ snapshots: dependencies: '@types/express': 4.17.21 '@types/jsonwebtoken': 9.0.6 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.6 jose: 4.15.9 limiter: 1.1.5 lru-memoizer: 2.3.0 @@ -24122,11 +25261,13 @@ snapshots: dependencies: readable-stream: 2.3.8 + leac@0.6.0: {} + less-loader@10.2.0(less@4.2.0)(webpack@5.93.0): dependencies: klona: 2.0.6 less: 4.2.0 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 less@4.2.0: dependencies: @@ -24408,6 +25549,8 @@ snapshots: dependencies: react: 18.3.1 + marked@7.0.4: {} + matched@5.0.1: dependencies: glob: 7.2.3 @@ -24425,6 +25568,11 @@ snapshots: mmdb-lib: 2.1.1 tiny-lru: 11.2.6 + md-to-react-email@5.0.2(react@18.3.1): + dependencies: + marked: 7.0.4 + react: 18.3.1 + mdn-data@2.0.14: {} mdn-data@2.0.4: {} @@ -24439,11 +25587,12 @@ snapshots: ejs: 3.1.10 globby: 11.1.0 isbinaryfile: 5.0.2 - mem-fs: 2.3.0 minimatch: 7.4.6 multimatch: 5.0.0 normalize-path: 3.0.0 textextensions: 5.16.0 + optionalDependencies: + mem-fs: 2.3.0 mem-fs@2.3.0: dependencies: @@ -24552,7 +25701,7 @@ snapshots: dependencies: schema-utils: 4.2.0 tapable: 2.2.1 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 minimalistic-assert@1.0.1: {} @@ -24656,39 +25805,39 @@ snapshots: mixwith@0.1.1: {} - mjml-accordion@4.15.3: + mjml-accordion@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-body@4.15.3: + mjml-body@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-button@4.15.3: + mjml-button@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-carousel@4.15.3: + mjml-carousel@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-cli@4.15.3: + mjml-cli@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 chokidar: 3.6.0 @@ -24697,149 +25846,149 @@ snapshots: js-beautify: 1.15.1 lodash: 4.17.21 minimatch: 9.0.5 - mjml-core: 4.15.3 - mjml-migrate: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) + mjml-migrate: 4.15.3(encoding@0.1.13) mjml-parser-xml: 4.15.3 mjml-validator: 4.15.3 yargs: 17.7.2 transitivePeerDependencies: - encoding - mjml-column@4.15.3: + mjml-column@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-core@4.15.3: + mjml-core@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 cheerio: 1.0.0-rc.12 detect-node: 2.1.0 html-minifier: 4.0.0 js-beautify: 1.15.1 - juice: 10.0.0 + juice: 10.0.0(encoding@0.1.13) lodash: 4.17.21 - mjml-migrate: 4.15.3 + mjml-migrate: 4.15.3(encoding@0.1.13) mjml-parser-xml: 4.15.3 mjml-validator: 4.15.3 transitivePeerDependencies: - encoding - mjml-divider@4.15.3: + mjml-divider@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-group@4.15.3: + mjml-group@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-head-attributes@4.15.3: + mjml-head-attributes@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-head-breakpoint@4.15.3: + mjml-head-breakpoint@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-head-font@4.15.3: + mjml-head-font@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-head-html-attributes@4.15.3: + mjml-head-html-attributes@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-head-preview@4.15.3: + mjml-head-preview@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-head-style@4.15.3: + mjml-head-style@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-head-title@4.15.3: + mjml-head-title@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-head@4.15.3: + mjml-head@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-hero@4.15.3: + mjml-hero@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-image@4.15.3: + mjml-image@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-migrate@4.15.3: + mjml-migrate@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 js-beautify: 1.15.1 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) mjml-parser-xml: 4.15.3 yargs: 17.7.2 transitivePeerDependencies: - encoding - mjml-navbar@4.15.3: + mjml-navbar@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding @@ -24850,92 +25999,92 @@ snapshots: htmlparser2: 9.1.0 lodash: 4.17.21 - mjml-preset-core@4.15.3: + mjml-preset-core@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 - mjml-accordion: 4.15.3 - mjml-body: 4.15.3 - mjml-button: 4.15.3 - mjml-carousel: 4.15.3 - mjml-column: 4.15.3 - mjml-divider: 4.15.3 - mjml-group: 4.15.3 - mjml-head: 4.15.3 - mjml-head-attributes: 4.15.3 - mjml-head-breakpoint: 4.15.3 - mjml-head-font: 4.15.3 - mjml-head-html-attributes: 4.15.3 - mjml-head-preview: 4.15.3 - mjml-head-style: 4.15.3 - mjml-head-title: 4.15.3 - mjml-hero: 4.15.3 - mjml-image: 4.15.3 - mjml-navbar: 4.15.3 - mjml-raw: 4.15.3 - mjml-section: 4.15.3 - mjml-social: 4.15.3 - mjml-spacer: 4.15.3 - mjml-table: 4.15.3 - mjml-text: 4.15.3 - mjml-wrapper: 4.15.3 + mjml-accordion: 4.15.3(encoding@0.1.13) + mjml-body: 4.15.3(encoding@0.1.13) + mjml-button: 4.15.3(encoding@0.1.13) + mjml-carousel: 4.15.3(encoding@0.1.13) + mjml-column: 4.15.3(encoding@0.1.13) + mjml-divider: 4.15.3(encoding@0.1.13) + mjml-group: 4.15.3(encoding@0.1.13) + mjml-head: 4.15.3(encoding@0.1.13) + mjml-head-attributes: 4.15.3(encoding@0.1.13) + mjml-head-breakpoint: 4.15.3(encoding@0.1.13) + mjml-head-font: 4.15.3(encoding@0.1.13) + mjml-head-html-attributes: 4.15.3(encoding@0.1.13) + mjml-head-preview: 4.15.3(encoding@0.1.13) + mjml-head-style: 4.15.3(encoding@0.1.13) + mjml-head-title: 4.15.3(encoding@0.1.13) + mjml-hero: 4.15.3(encoding@0.1.13) + mjml-image: 4.15.3(encoding@0.1.13) + mjml-navbar: 4.15.3(encoding@0.1.13) + mjml-raw: 4.15.3(encoding@0.1.13) + mjml-section: 4.15.3(encoding@0.1.13) + mjml-social: 4.15.3(encoding@0.1.13) + mjml-spacer: 4.15.3(encoding@0.1.13) + mjml-table: 4.15.3(encoding@0.1.13) + mjml-text: 4.15.3(encoding@0.1.13) + mjml-wrapper: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-raw@4.15.3: + mjml-raw@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-react@2.0.8(mjml@4.15.3)(react-dom@18.3.1)(react@18.3.1): + mjml-react@2.0.8(mjml@4.15.3(encoding@0.1.13))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 babel-runtime: 6.25.0 color: 3.2.1 - mjml: 4.15.3 + mjml: 4.15.3(encoding@0.1.13) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-reconciler: 0.26.2(react@18.3.1) - mjml-section@4.15.3: + mjml-section@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-social@4.15.3: + mjml-social@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-spacer@4.15.3: + mjml-spacer@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-table@4.15.3: + mjml-table@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-text@4.15.3: + mjml-text@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding @@ -24943,22 +26092,22 @@ snapshots: dependencies: '@babel/runtime': 7.25.0 - mjml-wrapper@4.15.3: + mjml-wrapper@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 - mjml-section: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) + mjml-section: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml@4.15.3: + mjml@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 - mjml-cli: 4.15.3 - mjml-core: 4.15.3 - mjml-migrate: 4.15.3 - mjml-preset-core: 4.15.3 + mjml-cli: 4.15.3(encoding@0.1.13) + mjml-core: 4.15.3(encoding@0.1.13) + mjml-migrate: 4.15.3(encoding@0.1.13) + mjml-preset-core: 4.15.3(encoding@0.1.13) mjml-validator: 4.15.3 transitivePeerDependencies: - encoding @@ -24992,12 +26141,14 @@ snapshots: '@types/whatwg-url': 11.0.5 whatwg-url: 13.0.0 - mongodb@6.8.0(@mongodb-js/zstd@1.2.0): + mongodb@6.8.0(@mongodb-js/zstd@1.2.0)(socks@2.8.3): dependencies: '@mongodb-js/saslprep': 1.1.8 - '@mongodb-js/zstd': 1.2.0 bson: 6.8.0 mongodb-connection-string-url: 3.0.1 + optionalDependencies: + '@mongodb-js/zstd': 1.2.0 + socks: 2.8.3 monorel@0.4.2: dependencies: @@ -25040,7 +26191,7 @@ snapshots: nan@2.20.0: optional: true - nano-css@5.6.2(react-dom@18.3.1)(react@18.3.1): + nano-css@5.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@jridgewell/sourcemap-codec': 1.5.0 css-tree: 1.1.3 @@ -25075,14 +26226,13 @@ snapshots: dependencies: '@segment/isodate': 1.0.3 - next-auth@4.24.7(next@14.2.5)(nodemailer@6.9.14)(react-dom@18.3.1)(react@18.3.1): + next-auth@4.24.7(next@14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nodemailer@6.9.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 '@panva/hkdf': 1.2.1 cookie: 0.5.0 jose: 4.15.9 - next: 14.2.5(@babel/core@7.25.2)(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1) - nodemailer: 6.9.14 + next: 14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) oauth: 0.9.15 openid-client: 5.6.5 preact: 10.23.1 @@ -25090,15 +26240,68 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) uuid: 8.3.2 + optionalDependencies: + nodemailer: 6.9.14 next-transpile-modules@10.0.1: dependencies: enhanced-resolve: 5.17.1 - next@14.2.5(@babel/core@7.25.2)(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1): + next@14.2.3(@babel/core@7.24.5)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@next/env': 14.2.3 + '@swc/helpers': 0.5.5 + busboy: 1.6.0 + caniuse-lite: 1.0.30001649 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.24.5)(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 14.2.3 + '@next/swc-darwin-x64': 14.2.3 + '@next/swc-linux-arm64-gnu': 14.2.3 + '@next/swc-linux-arm64-musl': 14.2.3 + '@next/swc-linux-x64-gnu': 14.2.3 + '@next/swc-linux-x64-musl': 14.2.3 + '@next/swc-win32-arm64-msvc': 14.2.3 + '@next/swc-win32-ia32-msvc': 14.2.3 + '@next/swc-win32-x64-msvc': 14.2.3 + '@opentelemetry/api': 1.9.0 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + next@14.2.5(@babel/core@7.24.5)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@next/env': 14.2.5 + '@swc/helpers': 0.5.5 + busboy: 1.6.0 + caniuse-lite: 1.0.30001645 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.24.5)(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 14.2.5 + '@next/swc-darwin-x64': 14.2.5 + '@next/swc-linux-arm64-gnu': 14.2.5 + '@next/swc-linux-arm64-musl': 14.2.5 + '@next/swc-linux-x64-gnu': 14.2.5 + '@next/swc-linux-x64-musl': 14.2.5 + '@next/swc-win32-arm64-msvc': 14.2.5 + '@next/swc-win32-ia32-msvc': 14.2.5 + '@next/swc-win32-x64-msvc': 14.2.5 + '@opentelemetry/api': 1.9.0 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + next@14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.2.5 - '@playwright/test': 1.39.0 '@swc/helpers': 0.5.5 busboy: 1.6.0 caniuse-lite: 1.0.30001645 @@ -25117,6 +26320,8 @@ snapshots: '@next/swc-win32-arm64-msvc': 14.2.5 '@next/swc-win32-ia32-msvc': 14.2.5 '@next/swc-win32-x64-msvc': 14.2.5 + '@opentelemetry/api': 1.9.0 + '@playwright/test': 1.39.0 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -25151,17 +26356,23 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 3.3.3 - node-fetch@2.6.7: + node-fetch@2.6.7(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 - node-fetch@2.6.9: + node-fetch@2.6.9(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 - node-fetch@2.7.0: + node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 node-fetch@3.3.2: dependencies: @@ -25208,10 +26419,10 @@ snapshots: node-int64@0.4.0: {} - node-loader@2.0.0(webpack@5.93.0): + node-loader@2.0.0(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))): dependencies: loader-utils: 2.0.4 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) node-postgres@0.6.2: {} @@ -25689,6 +26900,11 @@ snapshots: dependencies: entities: 4.5.0 + parseley@0.12.1: + dependencies: + leac: 0.6.0 + peberminta: 0.9.0 + parseurl@1.3.3: {} pascal-case@3.1.2: @@ -25736,6 +26952,8 @@ snapshots: path-type@5.0.0: {} + peberminta@0.9.0: {} + pend@1.2.0: {} performance-now@2.1.0: {} @@ -26059,12 +27277,13 @@ snapshots: cosmiconfig: 5.2.1 import-cwd: 2.1.0 - postcss-load-config@4.0.2(postcss@8.4.40)(ts-node@10.9.2): + postcss-load-config@4.0.2(postcss@8.4.40)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): dependencies: lilconfig: 3.1.2 + yaml: 2.5.0 + optionalDependencies: postcss: 8.4.40 ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) - yaml: 2.5.0 postcss-loader@6.2.1(postcss@8.4.40)(webpack@5.93.0): dependencies: @@ -26072,7 +27291,7 @@ snapshots: klona: 2.0.6 postcss: 8.4.40 semver: 7.6.3 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 postcss-logical@5.0.4(postcss@8.4.40): dependencies: @@ -26796,356 +28015,359 @@ snapshots: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 - rc-align@4.0.15(react-dom@18.3.1)(react@18.3.1): + rc-align@4.0.15(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 dom-align: 1.12.4 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) resize-observer-polyfill: 1.5.1 - rc-cascader@3.27.0(react-dom@18.3.1)(react@18.3.1): + rc-cascader@3.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 array-tree-filter: 2.1.0 classnames: 2.5.1 - rc-select: 14.15.1(react-dom@18.3.1)(react@18.3.1) - rc-tree: 5.8.8(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-select: 14.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tree: 5.8.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-checkbox@3.3.0(react-dom@18.3.1)(react@18.3.1): + rc-checkbox@3.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-collapse@3.7.3(react-dom@18.3.1)(react@18.3.1): + rc-collapse@3.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-dialog@9.5.2(react-dom@18.3.1)(react@18.3.1): + rc-dialog@9.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) + '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-drawer@7.2.0(react-dom@18.3.1)(react@18.3.1): + rc-drawer@7.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) + '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-dropdown@4.2.0(react-dom@18.3.1)(react@18.3.1): + rc-dropdown@4.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) + '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-field-form@2.2.1(react-dom@18.3.1)(react@18.3.1): + rc-field-form@2.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 '@rc-component/async-validator': 5.0.4 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-image@7.9.0(react-dom@18.3.1)(react@18.3.1): + rc-image@7.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) + '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-dialog: 9.5.2(react-dom@18.3.1)(react@18.3.1) - rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-dialog: 9.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-input-number@9.1.0(react-dom@18.3.1)(react@18.3.1): + rc-input-number@9.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 '@rc-component/mini-decimal': 1.1.0 classnames: 2.5.1 - rc-input: 1.5.1(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-input: 1.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-input@1.5.1(react-dom@18.3.1)(react@18.3.1): + rc-input@1.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-mentions@2.14.0(react-dom@18.3.1)(react@18.3.1): + rc-mentions@2.14.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) + '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-input: 1.5.1(react-dom@18.3.1)(react@18.3.1) - rc-menu: 9.14.1(react-dom@18.3.1)(react@18.3.1) - rc-textarea: 1.7.0(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-input: 1.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-menu: 9.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-textarea: 1.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-menu@9.14.1(react-dom@18.3.1)(react@18.3.1): + rc-menu@9.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) + '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) - rc-overflow: 1.3.2(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-overflow: 1.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-motion@2.9.2(react-dom@18.3.1)(react@18.3.1): + rc-motion@2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-notification@5.6.0(react-dom@18.3.1)(react@18.3.1): + rc-notification@5.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-overflow@1.3.2(react-dom@18.3.1)(react@18.3.1): + rc-overflow@1.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-pagination@4.2.0(react-dom@18.3.1)(react@18.3.1): + rc-pagination@4.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-picker@2.7.6(react-dom@18.3.1)(react@18.3.1): + rc-picker@2.7.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 date-fns: 2.30.0 dayjs: 1.11.12 moment: 2.30.1 - rc-trigger: 5.3.4(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-trigger: 5.3.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) shallowequal: 1.1.0 - rc-picker@4.6.11(dayjs@1.11.12)(react-dom@18.3.1)(react@18.3.1): + rc-picker@4.6.11(date-fns@2.30.0)(dayjs@1.11.12)(moment@2.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) + '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - dayjs: 1.11.12 - rc-overflow: 1.3.2(react-dom@18.3.1)(react@18.3.1) - rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-overflow: 1.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + date-fns: 2.30.0 + dayjs: 1.11.12 + moment: 2.30.1 - rc-progress@4.0.0(react-dom@18.3.1)(react@18.3.1): + rc-progress@4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-rate@2.13.0(react-dom@18.3.1)(react@18.3.1): + rc-rate@2.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-resize-observer@1.4.0(react-dom@18.3.1)(react@18.3.1): + rc-resize-observer@1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) resize-observer-polyfill: 1.5.1 - rc-segmented@2.3.0(react-dom@18.3.1)(react@18.3.1): + rc-segmented@2.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-select@14.15.1(react-dom@18.3.1)(react@18.3.1): + rc-select@14.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) + '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) - rc-overflow: 1.3.2(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) - rc-virtual-list: 3.14.5(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-overflow: 1.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-virtual-list: 3.14.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-slider@10.6.2(react-dom@18.3.1)(react@18.3.1): + rc-slider@10.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-steps@6.0.1(react-dom@18.3.1)(react@18.3.1): + rc-steps@6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-switch@4.1.0(react-dom@18.3.1)(react@18.3.1): + rc-switch@4.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-table@7.45.7(react-dom@18.3.1)(react@18.3.1): + rc-table@7.45.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/context': 1.4.0(react-dom@18.3.1)(react@18.3.1) + '@rc-component/context': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) - rc-virtual-list: 3.14.5(react-dom@18.3.1)(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-virtual-list: 3.14.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-tabs@15.1.1(react-dom@18.3.1)(react@18.3.1): + rc-tabs@15.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-dropdown: 4.2.0(react-dom@18.3.1)(react@18.3.1) - rc-menu: 9.14.1(react-dom@18.3.1)(react@18.3.1) - rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) - rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-dropdown: 4.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-menu: 9.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-textarea@1.7.0(react-dom@18.3.1)(react@18.3.1): + rc-textarea@1.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-input: 1.5.1(react-dom@18.3.1)(react@18.3.1) - rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-input: 1.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-tooltip@6.2.0(react-dom@18.3.1)(react@18.3.1): + rc-tooltip@6.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) + '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-tree-select@5.22.1(react-dom@18.3.1)(react@18.3.1): + rc-tree-select@5.22.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-select: 14.15.1(react-dom@18.3.1)(react@18.3.1) - rc-tree: 5.8.8(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-select: 14.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tree: 5.8.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-tree@5.8.8(react-dom@18.3.1)(react@18.3.1): + rc-tree@5.8.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) - rc-virtual-list: 3.14.5(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-virtual-list: 3.14.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-trigger@5.3.4(react-dom@18.3.1)(react@18.3.1): + rc-trigger@5.3.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-align: 4.0.15(react-dom@18.3.1)(react@18.3.1) - rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-align: 4.0.15(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-upload@4.6.0(react-dom@18.3.1)(react@18.3.1): + rc-upload@4.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-util@5.43.0(react-dom@18.3.1)(react@18.3.1): + rc-util@5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-is: 18.3.1 - rc-virtual-list@3.14.5(react-dom@18.3.1)(react@18.3.1): + rc-virtual-list@3.14.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -27198,8 +28420,9 @@ snapshots: shell-quote: 1.8.1 strip-ansi: 6.0.1 text-table: 0.2.0 + webpack: 5.93.0 + optionalDependencies: typescript: 5.5.4 - webpack: 5.93.0(webpack-cli@5.1.4) transitivePeerDependencies: - eslint - supports-color @@ -27211,6 +28434,33 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 + react-email@3.0.1(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/core': 7.24.5 + '@babel/parser': 7.24.5 + chalk: 4.1.2 + chokidar: 3.6.0 + commander: 11.1.0 + debounce: 2.0.0 + esbuild: 0.19.11 + glob: 10.3.4 + log-symbols: 4.1.0 + mime-types: 2.1.35 + next: 14.2.3(@babel/core@7.24.5)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + normalize-path: 3.0.0 + ora: 5.4.1 + socket.io: 4.7.5 + transitivePeerDependencies: + - '@opentelemetry/api' + - '@playwright/test' + - babel-plugin-macros + - bufferutil + - react + - react-dom + - sass + - supports-color + - utf-8-validate + react-error-overlay@6.0.11: {} react-icons@4.12.0(react@18.3.1): @@ -27223,9 +28473,9 @@ snapshots: react-is@18.3.1: {} - react-json-view@1.21.3(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + react-json-view@1.21.3(@types/react@18.3.3)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - flux: 4.0.4(react@18.3.1) + flux: 4.0.4(encoding@0.1.13)(react@18.3.1) react: 18.3.1 react-base16-styling: 0.6.0 react-dom: 18.3.1(react@18.3.1) @@ -27237,6 +28487,10 @@ snapshots: react-lifecycles-compat@3.0.4: {} + react-promise-suspense@0.3.4: + dependencies: + fast-deep-equal: 2.0.1 + react-reconciler@0.26.2(react@18.3.1): dependencies: loose-envify: 1.4.0 @@ -27246,7 +28500,7 @@ snapshots: react-refresh@0.11.0: {} - react-router-dom@6.25.1(react-dom@18.3.1)(react@18.3.1): + react-router-dom@6.25.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@remix-run/router': 1.18.0 react: 18.3.1 @@ -27258,10 +28512,10 @@ snapshots: '@remix-run/router': 1.18.0 react: 18.3.1 - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0)(react@18.3.1)(ts-node@10.9.2)(typescript@5.5.4): + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(@types/babel__core@7.20.5)(@types/webpack@5.28.5)(eslint@8.57.0)(react@18.3.1)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))(type-fest@3.13.1)(typescript@5.5.4): dependencies: '@babel/core': 7.25.2 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.15(react-refresh@0.11.0)(webpack-dev-server@4.15.2)(webpack@5.93.0) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.15(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@3.13.1)(webpack-dev-server@4.15.2(webpack@5.93.0))(webpack@5.93.0) '@svgr/webpack': 5.5.0 babel-jest: 27.5.1(@babel/core@7.25.2) babel-loader: 8.3.0(@babel/core@7.25.2)(webpack@5.93.0) @@ -27276,15 +28530,15 @@ snapshots: dotenv: 10.0.0 dotenv-expand: 5.1.0 eslint: 8.57.0 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0)(jest@27.5.1)(typescript@5.5.4) + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(eslint@8.57.0)(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4) eslint-webpack-plugin: 3.2.0(eslint@8.57.0)(webpack@5.93.0) file-loader: 6.2.0(webpack@5.93.0) fs-extra: 10.1.0 html-webpack-plugin: 5.6.0(webpack@5.93.0) identity-obj-proxy: 3.0.0 - jest: 27.5.1(ts-node@10.9.2) + jest: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) jest-resolve: 27.5.1 - jest-watch-typeahead: 1.1.0(jest@27.5.1) + jest-watch-typeahead: 1.1.0(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))) mini-css-extract-plugin: 2.9.0(webpack@5.93.0) postcss: 8.4.40 postcss-flexbugs-fixes: 5.0.2(postcss@8.4.40) @@ -27302,15 +28556,15 @@ snapshots: semver: 7.6.3 source-map-loader: 3.0.2(webpack@5.93.0) style-loader: 3.3.4(webpack@5.93.0) - tailwindcss: 3.4.7(ts-node@10.9.2) + tailwindcss: 3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) terser-webpack-plugin: 5.3.10(webpack@5.93.0) - typescript: 5.5.4 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 webpack-dev-server: 4.15.2(webpack@5.93.0) webpack-manifest-plugin: 4.1.1(webpack@5.93.0) - workbox-webpack-plugin: 6.6.0(webpack@5.93.0) + workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.93.0) optionalDependencies: fsevents: 2.3.3 + typescript: 5.5.4 transitivePeerDependencies: - '@babel/plugin-syntax-flow' - '@babel/plugin-transform-react-jsx' @@ -27345,13 +28599,13 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - react-smooth@4.0.1(react-dom@18.3.1)(react@18.3.1): + react-smooth@4.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: fast-equals: 5.0.1 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-transition-group: 4.4.5(react-dom@18.3.1)(react@18.3.1) + react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-textarea-autosize@8.5.3(@types/react@18.3.3)(react@18.3.1): dependencies: @@ -27362,7 +28616,7 @@ snapshots: transitivePeerDependencies: - '@types/react' - react-transition-group@4.4.5(react-dom@18.3.1)(react@18.3.1): + react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 dom-helpers: 5.2.1 @@ -27376,7 +28630,7 @@ snapshots: react: 18.3.1 tslib: 2.6.3 - react-use@17.5.1(react-dom@18.3.1)(react@18.3.1): + react-use@17.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@types/js-cookie': 2.2.7 '@xobotyi/scrollbar-width': 1.9.5 @@ -27384,7 +28638,7 @@ snapshots: fast-deep-equal: 3.1.3 fast-shallow-equal: 1.0.0 js-cookie: 2.2.1 - nano-css: 5.6.2(react-dom@18.3.1)(react@18.3.1) + nano-css: 5.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-universal-interface: 0.6.2(react@18.3.1)(tslib@2.6.3) @@ -27482,7 +28736,7 @@ snapshots: dependencies: decimal.js-light: 2.5.1 - recharts@2.12.7(react-dom@18.3.1)(react@18.3.1): + recharts@2.12.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: clsx: 2.1.1 eventemitter3: 4.0.7 @@ -27490,7 +28744,7 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-is: 16.13.1 - react-smooth: 4.0.1(react-dom@18.3.1)(react@18.3.1) + react-smooth: 4.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) recharts-scale: 0.4.5 tiny-invariant: 1.3.3 victory-vendor: 36.9.2 @@ -27586,6 +28840,13 @@ snapshots: requires-port@1.0.0: {} + resend@4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@react-email/render': 0.0.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - react + - react-dom + resize-observer-polyfill@1.5.1: {} resolve-cwd@3.0.0: @@ -27633,11 +28894,11 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 - retry-request@7.0.2: + retry-request@7.0.2(encoding@0.1.13): dependencies: '@types/request': 2.48.12 extend: 3.0.2 - teeny-request: 9.0.0 + teeny-request: 9.0.0(encoding@0.1.13) transitivePeerDependencies: - encoding - supports-color @@ -27832,7 +29093,7 @@ snapshots: dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 sax@1.2.4: {} @@ -27885,6 +29146,10 @@ snapshots: dependencies: compute-scroll-into-view: 3.1.0 + selderee@0.11.0: + dependencies: + parseley: 0.12.1 + select-hose@2.0.0: {} selfsigned@2.4.1: @@ -28066,6 +29331,36 @@ snapshots: snappyjs@0.6.1: {} + socket.io-adapter@2.5.5: + dependencies: + debug: 4.3.6 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-parser@4.2.4: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.6 + transitivePeerDependencies: + - supports-color + + socket.io@4.7.5: + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + cors: 2.8.5 + debug: 4.3.6 + engine.io: 6.5.5 + socket.io-adapter: 2.5.5 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + sockjs@0.3.24: dependencies: faye-websocket: 0.11.4 @@ -28106,7 +29401,7 @@ snapshots: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.2.0 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 source-map-support@0.5.13: dependencies: @@ -28431,13 +29726,21 @@ snapshots: style-loader@3.3.4(webpack@5.93.0): dependencies: - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 + + styled-jsx@5.1.1(@babel/core@7.24.5)(react@18.3.1): + dependencies: + client-only: 0.0.1 + react: 18.3.1 + optionalDependencies: + '@babel/core': 7.24.5 styled-jsx@5.1.1(@babel/core@7.25.2)(react@18.3.1): dependencies: - '@babel/core': 7.25.2 client-only: 0.0.1 react: 18.3.1 + optionalDependencies: + '@babel/core': 7.25.2 stylehacks@4.0.3: dependencies: @@ -28522,7 +29825,7 @@ snapshots: symbol-tree@3.2.4: {} - tailwindcss@3.4.7(ts-node@10.9.2): + tailwindcss@3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -28541,7 +29844,7 @@ snapshots: postcss: 8.4.40 postcss-import: 15.1.0(postcss@8.4.40) postcss-js: 4.0.1(postcss@8.4.40) - postcss-load-config: 4.0.2(postcss@8.4.40)(ts-node@10.9.2) + postcss-load-config: 4.0.2(postcss@8.4.40)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) postcss-nested: 6.2.0(postcss@8.4.40) postcss-selector-parser: 6.1.1 resolve: 1.22.8 @@ -28607,11 +29910,11 @@ snapshots: dependencies: bintrees: 1.0.2 - teeny-request@9.0.0: + teeny-request@9.0.0(encoding@0.1.13): dependencies: http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) stream-events: 1.0.5 uuid: 9.0.1 transitivePeerDependencies: @@ -28632,6 +29935,15 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 + terser-webpack-plugin@5.3.10(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.31.3 + webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) + terser-webpack-plugin@5.3.10(webpack@5.93.0): dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -28639,7 +29951,7 @@ snapshots: schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.31.3 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 terser@4.8.1: dependencies: @@ -28661,7 +29973,7 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 - testcontainers@9.12.0: + testcontainers@9.12.0(encoding@0.1.13): dependencies: '@balena/dockerignore': 1.0.2 '@types/archiver': 5.3.4 @@ -28673,7 +29985,7 @@ snapshots: docker-compose: 0.24.8 dockerode: 3.3.5 get-port: 5.1.1 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) proper-lockfile: 4.1.2 properties-reader: 2.3.0 ssh-remote-port-forward: 1.0.4 @@ -28779,12 +30091,46 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.0.5(@babel/core@7.25.2)(jest@29.7.0)(typescript@5.5.4): + ts-jest@29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)))(typescript@5.5.4): + dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.3 + typescript: 5.5.4 + yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.25.2 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + + ts-jest@29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4): dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.3 + typescript: 5.5.4 + yargs-parser: 21.1.1 + optionalDependencies: '@babel/core': 7.25.2 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + + ts-jest@29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)))(typescript@5.5.4): + dependencies: bs-logger: 0.2.6 + ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + jest: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -28792,15 +30138,37 @@ snapshots: semver: 7.6.3 typescript: 5.5.4 yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.25.2 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) - ts-jest@29.2.3(@babel/core@7.25.2)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.5.4): + ts-jest@29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4): dependencies: + bs-logger: 0.2.6 + ejs: 3.1.10 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.3 + typescript: 5.5.4 + yargs-parser: 21.1.1 + optionalDependencies: '@babel/core': 7.25.2 + '@jest/transform': 29.7.0 '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + + ts-jest@29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4): + dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -28808,8 +30176,13 @@ snapshots: semver: 7.6.3 typescript: 5.5.4 yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.25.2 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) - ts-loader@9.5.1(typescript@5.5.4)(webpack@5.93.0): + ts-loader@9.5.1(typescript@5.5.4)(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))): dependencies: chalk: 4.1.2 enhanced-resolve: 5.17.1 @@ -28817,7 +30190,7 @@ snapshots: semver: 7.6.3 source-map: 0.7.4 typescript: 5.5.4 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) ts-morph@12.0.0: dependencies: @@ -28865,6 +30238,24 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 16.18.11 + acorn: 8.12.1 + acorn-walk: 8.3.3 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.5.4 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -29173,14 +30564,16 @@ snapshots: use-isomorphic-layout-effect@1.1.2(@types/react@18.3.3)(react@18.3.1): dependencies: - '@types/react': 18.3.3 react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 use-latest@1.2.1(@types/react@18.3.3)(react@18.3.1): dependencies: - '@types/react': 18.3.3 react: 18.3.1 use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.3)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 use-sync-external-store@1.2.2(react@18.3.1): dependencies: @@ -29253,17 +30646,17 @@ snapshots: vendors@1.0.4: {} - vercel@35.2.3: + vercel@35.2.3(encoding@0.1.13): dependencies: '@vercel/build-utils': 8.3.6 - '@vercel/fun': 1.1.0 + '@vercel/fun': 1.1.0(encoding@0.1.13) '@vercel/go': 3.1.1 '@vercel/hydrogen': 1.0.4 - '@vercel/next': 4.3.6 - '@vercel/node': 3.2.8 + '@vercel/next': 4.3.6(encoding@0.1.13) + '@vercel/node': 3.2.8(encoding@0.1.13) '@vercel/python': 4.3.1 - '@vercel/redwood': 2.1.3 - '@vercel/remix-builder': 2.2.3 + '@vercel/redwood': 2.1.3(encoding@0.1.13) + '@vercel/remix-builder': 2.2.3(encoding@0.1.13) '@vercel/ruby': 2.1.0 '@vercel/static-build': 2.5.18 chokidar: 3.3.1 @@ -29342,13 +30735,13 @@ snapshots: dependencies: defaults: 1.0.4 - web-resource-inliner@6.0.1: + web-resource-inliner@6.0.1(encoding@0.1.13): dependencies: ansi-colors: 4.1.3 escape-goat: 3.0.0 htmlparser2: 5.0.1 mime: 2.6.0 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) valid-data-url: 3.0.1 transitivePeerDependencies: - encoding @@ -29372,10 +30765,9 @@ snapshots: webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.93.0) - '@webpack-cli/generators': 3.0.7(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.93.0) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.93.0) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.3 @@ -29384,8 +30776,10 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) webpack-merge: 5.10.0 + optionalDependencies: + '@webpack-cli/generators': 3.0.7(encoding@0.1.13)(mem-fs@2.3.0)(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0) webpack-dev-middleware@5.3.4(webpack@5.93.0): dependencies: @@ -29394,7 +30788,7 @@ snapshots: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.2.0 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 webpack-dev-server@4.15.2(webpack@5.93.0): dependencies: @@ -29426,9 +30820,10 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.93.0(webpack-cli@5.1.4) webpack-dev-middleware: 5.3.4(webpack@5.93.0) ws: 8.18.0 + optionalDependencies: + webpack: 5.93.0 transitivePeerDependencies: - bufferutil - debug @@ -29438,7 +30833,7 @@ snapshots: webpack-manifest-plugin@4.1.1(webpack@5.93.0): dependencies: tapable: 2.2.1 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 webpack-sources: 2.3.1 webpack-merge@5.10.0: @@ -29459,7 +30854,7 @@ snapshots: webpack-sources@3.2.3: {} - webpack@5.93.0(webpack-cli@5.1.4): + webpack@5.93.0: dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 @@ -29468,7 +30863,7 @@ snapshots: '@webassemblyjs/wasm-parser': 1.12.1 acorn: 8.12.1 acorn-import-attributes: 1.9.5(acorn@8.12.1) - browserslist: 4.23.2 + browserslist: 4.23.3 chrome-trace-event: 1.0.4 enhanced-resolve: 5.17.1 es-module-lexer: 1.5.4 @@ -29484,13 +30879,45 @@ snapshots: tapable: 2.2.1 terser-webpack-plugin: 5.3.10(webpack@5.93.0) watchpack: 2.4.1 - webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js + webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.12.1 + acorn-import-attributes: 1.9.5(acorn@8.12.1) + browserslist: 4.23.2 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.1 + es-module-lexer: 1.5.4 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) + watchpack: 2.4.1 + webpack-sources: 3.2.3 + optionalDependencies: + webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + websocket-driver@0.7.4: dependencies: http-parser-js: 0.5.8 @@ -29607,13 +31034,13 @@ snapshots: dependencies: workbox-core: 6.6.0 - workbox-build@6.6.0: + workbox-build@6.6.0(@types/babel__core@7.20.5): dependencies: '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0) '@babel/core': 7.25.2 '@babel/preset-env': 7.25.2(@babel/core@7.25.2) '@babel/runtime': 7.25.0 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.25.2)(rollup@2.79.1) + '@rollup/plugin-babel': 5.3.1(@babel/core@7.25.2)(@types/babel__core@7.20.5)(rollup@2.79.1) '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1) '@rollup/plugin-replace': 2.4.2(rollup@2.79.1) '@surma/rollup-plugin-off-main-thread': 2.2.3 @@ -29706,14 +31133,14 @@ snapshots: workbox-sw@6.6.0: {} - workbox-webpack-plugin@6.6.0(webpack@5.93.0): + workbox-webpack-plugin@6.6.0(@types/babel__core@7.20.5)(webpack@5.93.0): dependencies: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 webpack-sources: 1.4.3 - workbox-build: 6.6.0 + workbox-build: 6.6.0(@types/babel__core@7.20.5) transitivePeerDependencies: - '@types/babel__core' - supports-color @@ -29757,6 +31184,8 @@ snapshots: ws@7.5.10: {} + ws@8.17.1: {} + ws@8.18.0: {} xdg-app-paths@5.1.0: @@ -29866,13 +31295,13 @@ snapshots: - bluebird - supports-color - yeoman-generator@5.10.0(yeoman-environment@3.19.3): + yeoman-generator@5.10.0(encoding@0.1.13)(mem-fs@2.3.0)(yeoman-environment@3.19.3): dependencies: chalk: 4.1.2 dargs: 7.0.0 debug: 4.3.6(supports-color@5.5.0) execa: 5.1.1 - github-username: 6.0.0 + github-username: 6.0.0(encoding@0.1.13) lodash: 4.17.21 mem-fs-editor: 9.7.0(mem-fs@2.3.0) minimist: 1.2.8 @@ -29883,6 +31312,7 @@ snapshots: shelljs: 0.8.5 sort-keys: 4.2.0 text-table: 0.2.0 + optionalDependencies: yeoman-environment: 3.19.3 transitivePeerDependencies: - bluebird @@ -29904,13 +31334,15 @@ snapshots: compress-commons: 4.1.2 readable-stream: 3.6.2 - zod-prisma@0.5.4(prisma@5.17.0)(zod@3.23.8): + zod-prisma@0.5.4(decimal.js@10.4.3)(prisma@5.17.0)(zod@3.23.8): dependencies: '@prisma/generator-helper': 3.8.1 parenthesis: 3.1.8 prisma: 5.17.0 ts-morph: 13.0.3 zod: 3.23.8 + optionalDependencies: + decimal.js: 10.4.3 zod-to-json-schema@3.23.2(zod@3.23.8): dependencies: diff --git a/webapps/console/lib/nextauth.config.ts b/webapps/console/lib/nextauth.config.ts index 4815d6ca4..42dad9cba 100644 --- a/webapps/console/lib/nextauth.config.ts +++ b/webapps/console/lib/nextauth.config.ts @@ -8,6 +8,7 @@ import { getServerLog } from "./server/log"; import { withProductAnalytics } from "./server/telemetry"; import { NextApiRequest } from "next"; import { isTruish } from "./shared/chores"; +import { onUserCreated } from "./server/ee"; const crypto = require("crypto"); @@ -125,6 +126,7 @@ export async function getOrCreateUser(opts: { user: { email, name, internalId: user.id, externalId, loginProvider }, req: opts.req, }); + await onUserCreated({ email, name }); } else if (user.name !== name || user.email !== email) { await db.prisma().userProfile.update({ where: { id: user.id }, data: { name, email } }); } diff --git a/webapps/console/lib/server/ee.ts b/webapps/console/lib/server/ee.ts index b0d8761b8..d60ae4336 100644 --- a/webapps/console/lib/server/ee.ts +++ b/webapps/console/lib/server/ee.ts @@ -1,4 +1,4 @@ -import { requireDefined } from "juava"; +import { getErrorMessage, getLog, requireDefined, rpc } from "juava"; import jwt from "jsonwebtoken"; export function isEEAvailable(): boolean { @@ -26,17 +26,18 @@ export function getEeConnection(): EeConnection { }; } -export function createJwt( - userId: string, - email: string, - workspaceId: string, - expireInSecs: number -): { +type JWTResult = { //JWT token, jwt: string; //Token expiration date as ISO UTC expiresAt: string; -} { +}; + +export function createSystemJwt(): JWTResult { + return createJwt("admin-service-account@jitsu.com", "admin-service-account@jitsu.com", "$all", 60); +} + +export function createJwt(userId: string, email: string, workspaceId: string, expireInSecs: number): JWTResult { if (!isEEAvailable()) { throw new Error("EE is not available"); } @@ -45,3 +46,24 @@ export function createJwt( const token = jwt.sign({ userId, email, workspaceId, exp: expiresSecondsTimestamp }, jwtSecret); return { jwt: token, expiresAt: new Date(expiresSecondsTimestamp * 1000).toISOString() }; } + +export async function onUserCreated(opts: { email: string; name?: string }) { + if (!isEEAvailable()) { + return; + } + const url = `${getEeConnection().host}api/user-created`; + try { + await rpc(url, { + method: "POST", + body: opts, + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${createSystemJwt().jwt}`, + }, + }); + } catch (e: any) { + getLog() + .atError() + .log(`Error sending user (${JSON.stringify(opts)}) created event to EE: ${getErrorMessage(e)}`, e); + } +} diff --git a/webapps/console/lib/server/mail.tsx b/webapps/console/lib/server/mail.tsx index c77a45560..b08b8db9a 100644 --- a/webapps/console/lib/server/mail.tsx +++ b/webapps/console/lib/server/mail.tsx @@ -75,6 +75,12 @@ export function isMailAvailable() { export async function sendEmail(mailOptions: Mail.Options) { if (!mailOptions.from) { mailOptions.from = { + name: "Jitsu Team", + address: "support@notify.jitsu.com", + }; + } + if (!mailOptions.replyTo) { + mailOptions.replyTo = { name: "Jitsu Team", address: "support@jitsu.com", }; diff --git a/webapps/console/pages/api/init-user.ts b/webapps/console/pages/api/init-user.ts index d82da2a5d..18f0e7bb5 100644 --- a/webapps/console/pages/api/init-user.ts +++ b/webapps/console/pages/api/init-user.ts @@ -8,6 +8,7 @@ import { getUserPreferenceService } from "../../lib/server/user-preferences"; import { ApiError } from "../../lib/shared/errors"; import { z } from "zod"; import { initTelemetry, withProductAnalytics } from "../../lib/server/telemetry"; +import { onUserCreated } from "../../lib/server/ee"; function capitalize(s: string) { return s.charAt(0).toUpperCase() + s.slice(1); @@ -113,6 +114,7 @@ export default createRoute() }, }); await withProductAnalytics(p => p.track("user_created"), { user: { ...newUser, internalId: newUser.id }, req }); + await onUserCreated({ email: user.email, name: user.name }); } const newWorkspace = await db .prisma() diff --git a/webapps/ee-api/components/email-component.tsx b/webapps/ee-api/components/email-component.tsx new file mode 100644 index 000000000..5e32675a3 --- /dev/null +++ b/webapps/ee-api/components/email-component.tsx @@ -0,0 +1,45 @@ +import React from "react"; +import { Hr, Text } from "@react-email/components"; + +export type UnsubscribeLinkProps = { unsubscribeLink?: string }; +export type EmailComponent

    = React.FC

    & { + defaultValues: Required

    ; + subject: ((props: P) => string) | string; + from?: string; + bcc?: string; + replyTo?: string; + plaintext: (props: P) => string; + isTransactional?: boolean; + scheduleAt?: (now: Date) => Date; +}; + +export const UnsubscribeLink: React.FC<{ unsubscribeLink?: string }> = ({ unsubscribeLink }) => { + if (!unsubscribeLink) { + return <>; + } + return ( + <> +


    + + Jitsu Labs Inc. 2261 Market Street #4109, San Francisco, CA 94114 +
    + + Unsubscribe + +
    + + ); +}; + +export function withDefaults(Component: EmailComponent): EmailComponent { + const Wrapper = p => { + const props = { ...Component.defaultValues, ...p }; + return ; + }; + const keys = Object.keys(Component) as (keyof EmailComponent)[]; + for (const key of keys) { + Wrapper[key] = Component[key]; + } + Wrapper.displayName = Component.displayName || "Email"; + return Wrapper as any; +} diff --git a/webapps/ee-api/emails/welcome.tsx b/webapps/ee-api/emails/welcome.tsx new file mode 100644 index 000000000..3e26f35cd --- /dev/null +++ b/webapps/ee-api/emails/welcome.tsx @@ -0,0 +1,109 @@ +import { EmailComponent, UnsubscribeLink, withDefaults } from "../components/email-component"; +import { Body, Head, Html, Preview, Text } from "@react-email/components"; +import React from "react"; +import Link from "next/link"; +import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; + +dayjs.extend(utc); + +export type WelcomeEmailProps = { + name?: string; + unsubscribeLink?: string; +}; + +function nextBusinessDay(now: Date): Date { + let day = dayjs(now).utc().add(1, "day"); + while (day.day() === 0 || day.day() === 6) { + // 0 = Sunday, 6 = Saturday + day = day.add(1, "day"); + } + day = day.hour(12).minute(23).second(0).millisecond(0); + + return day.toDate(); +} + +const main = { + fontFamily: + '-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif', + backgroundColor: "transparent", +}; + +const WelcomeEmail: EmailComponent = ({ name, unsubscribeLink }) => { + return ( + + + Thank you for trying out Jitsu! + + 👋 Hi {name || "there"}! + + I{"'"}m Vladimir, the CEO of Jitsu! Thank you for creating account + with Jitsu Cloud, and I wanted to say thank you for giving it a try! 👍 + + In order to help you discover Jitsu, I have prepared a list of useful resources for you: + + ✅ Learn how to{" "} + send clickstream event data to Jitsu. +
    ✅ Find out how to{" "} + transform events with Jitsu Functions. +
    ✅ Explore our various Jitsu Destinations. +
    + + If you{"'"}re curious about any other features or capabilities of the Jitsu platform, feel free to browse our{" "} + documentation website. + + + If you need any other assistance with configuring Jitsu, please let us know! We{"'"}re here to help. + Additionally, if you anticipate sending more than 10 million events per month, we can discuss volume + discounts. Just reply to this email, and I{"'"}ll get back to you as soon as possible. + + P. S: Yes, this is an automated email, but I{"'"}m a real person and will respond. + {unsubscribeLink && } + + + ); +}; + +WelcomeEmail.defaultValues = { + name: "John", + unsubscribeLink: "https://example.com/unsubscribe", +}; + +WelcomeEmail.from = "Vladimir from Jitsu "; +WelcomeEmail.replyTo = "Vladimir Klimontovich "; +WelcomeEmail.isTransactional = true; + +WelcomeEmail.subject = "Need any help with Jitsu? Let us know!"; + +WelcomeEmail.scheduleAt = nextBusinessDay; + +WelcomeEmail.plaintext = ({ name, unsubscribeLink }) => { + return ` +👋 Hi ${name || "there"}! + +I'm Vladimir, the CEO of Jitsu! Thank you for creating an account with us, and I wanted to say +thank you for giving it a try! 👍 + +In order to help you discover Jitsu, I have prepared a list of useful resources for you: + + ✅ Learn how to send clickstream event data to Jitsu: https://go.jitsu.com/em-wlc-clickstream + ✅ Find out how to transform events with Jitsu Functions: https://go.jitsu.com/em-wlc-func + ✅ Explore our various Jitsu Destinations: https://go.jitsu.com/em-wlc-dest + +If you're curious about any other features or capabilities of the Jitsu platform, feel free to +browse our documentation website: https://go.jitsu.com/em-wlc-docs + +If you need any other assistance with configuring Jitsu, please let us know! We're here to help. +Additionally, if you anticipate sending more than 10 million events per month, we can discuss +volume discounts. Just reply to this email, and I'll get back to you as soon as possible. + +P.S: Yes, this is an automated email, but I'm a real person and will respond. + +Best, +- Vladimir + +${unsubscribeLink ? `Unsubscribe here: ${unsubscribeLink}` : ""} +`; +}; + +export default withDefaults(WelcomeEmail); diff --git a/webapps/ee-api/lib/email.tsx b/webapps/ee-api/lib/email.tsx new file mode 100644 index 000000000..ae87c3fcf --- /dev/null +++ b/webapps/ee-api/lib/email.tsx @@ -0,0 +1,184 @@ +import { store } from "./services"; +import dayjs from "dayjs"; +import { z } from "zod"; +import utc from "dayjs/plugin/utc"; +import { Resend } from "resend"; +import { EmailComponent, UnsubscribeLinkProps } from "../components/email-component"; +import WelcomeEmail from "../emails/welcome"; +import { requireDefined } from "juava"; + +dayjs.extend(utc); +export const UnsubscribeCodes = z.object({ + codes: z.array( + z.object({ + code: z.string(), + expirationTime: z.string(), + }) + ), +}); + +export async function isUnsubscribed(email: string): Promise { + const key = `unsubscribed:${email}`; + const record = await store.getTable("email-subscriptions").get(key); + return !!record?.unsubscribed; +} + +export async function unsubscribe(email: string) { + const key = `unsubscribed:${email}`; + await store.getTable("email-subscriptions").put(key, { unsubscribed: true }); +} + +/** + * Parse an email address into a name and email. Accepts 'John Doe ' or just + * john.doe@gmail.com + * @param input + */ +function parseEmailAddress(input: string): { name?: string; email: string } { + const match = input.match(/^\s*(.*)\s*<([^<>]+)>\s*$/); + if (match) { + return { name: match[1].trim(), email: match[2].trim() }; + } + + return { email: input.trim() }; +} + +export const EmailEnvSettings = z.object({ + EMAIL_RESEND_KEY: z.string(), + EMAIL_MARKETING_DOMAIN: z.string(), + EMAIL_TRANSACTIONAL_DOMAIN: z.string(), + EMAIL_TRANSACTIONAL_SENDER: z.string(), + EMAIL_TRANSACTIONAL_REPLY_TO: z.string(), + EMAIL_MARKETING_SENDER: z.string(), + EMAIL_MARKETING_REPLY_TO: z.string(), + BCC_EMAIL: z.string().email(), +}); + +export type EmailEnvSettings = z.infer; + +export function getEmailEnvSettings(): EmailEnvSettings { + requireDefined(process.env.EMAIL_RESEND_KEY, "RESEND_KEY is required"); + return EmailEnvSettings.parse(process.env); +} + +export function isEmailAvailable(): boolean { + return !!process.env.EMAIL_RESEND_KEY; +} + +export const SendEmailRequest = z.object({ + template: z.string(), + from: z.string().optional(), + replyTo: z.string().optional(), + to: z.string().optional(), + workspaceId: z.string().optional(), + bcc: z.string().optional(), + variables: z.record(z.string()).optional(), + //Two flags below, of not set, will be inferred from the EmailTemplale.isTransactional property + allowUnsubscribe: z.boolean().optional(), + respectUnsubscribe: z.boolean().optional(), +}); + +export type Payload = z.infer; + +export function getComponent(template: string): EmailComponent { + switch (template) { + case "welcome": + return WelcomeEmail; + default: + throw new Error(`Unknown email template: ${template}`); + } +} + +function getVal

    (stringOrFactory: string | ((props: P) => string) | undefined, props: P): string | undefined { + if (!stringOrFactory) { + return undefined; + } + return typeof stringOrFactory === "string" ? stringOrFactory : stringOrFactory(props); +} + +export function newId() { + return Math.random().toString(36).slice(2) + Math.random().toString(36).slice(2); +} + +export async function getUnsubscribeCode( + email: string, + { rotateExpired }: { rotateExpired?: boolean } = {} +): Promise { + const key = `codes:${email}`; + const codes = UnsubscribeCodes.parse((await store.getTable("email-subscriptions").get(key)) || { codes: [] }); + //find the code with an expiration date in the future + const cutoff = dayjs().utc().add(7, "day"); + const code = codes.codes.find(code => dayjs(code.expirationTime).isAfter(cutoff)); + if (code) { + return code.code; + } else if (rotateExpired) { + const newCode = { code: newId(), expirationTime: dayjs().utc().add(14, "day") }; + const newCodes = { codes: [...codes.codes, newCode] }; + await store.getTable("email-subscriptions").put(key, newCodes); + return newCode.code; + } else { + return undefined; + } +} + +function getDomainFromEmail(email: string): string { + return parseEmailAddress(email).email.split("@")[1]; +} + +export async function sendEmail(payload: Omit & { to: string }) { + const env = getEmailEnvSettings(); + const resend = new Resend(env.EMAIL_RESEND_KEY); + const Component: EmailComponent = getComponent(payload.template); + const recepient = parseEmailAddress(payload.to).email.toLowerCase(); + const allowUnsubscribe = + payload.allowUnsubscribe !== undefined ? payload.allowUnsubscribe : !Component.isTransactional; + const respectUnsubscribe = + payload.allowUnsubscribe !== undefined ? payload.allowUnsubscribe : !Component.isTransactional; + const from = + payload.from || + Component.from || + (!Component.isTransactional || allowUnsubscribe ? env.EMAIL_MARKETING_SENDER : env.EMAIL_TRANSACTIONAL_SENDER); + const replyTo = + payload.replyTo || + Component.replyTo || + (!Component.isTransactional || allowUnsubscribe ? env.EMAIL_MARKETING_SENDER : env.EMAIL_TRANSACTIONAL_SENDER); + + if (!Component.isTransactional && respectUnsubscribe && (await isUnsubscribed(recepient))) { + console.log(`Not sending email to unsubscribed recipient: ${recepient}`); + return { unsubscribed: true, recipient: recepient, message: "Recipient is unsubscribed" }; + } + const domain = getDomainFromEmail(from); + const unsubscribeCode = await getUnsubscribeCode(recepient, { rotateExpired: true }); + const props = { + name: parseEmailAddress(payload.to).name?.split(" ")[0], + ...(payload.variables || {}), + unsubscribeLink: `https://${domain}/api/unsubscribe?email=${encodeURIComponent(recepient)}&code=${unsubscribeCode}`, + }; + const scheduledAt = WelcomeEmail.scheduleAt ? WelcomeEmail.scheduleAt(new Date()).toISOString() : undefined; + const subject = typeof Component.subject === "string" ? Component.subject : Component.subject(props); + console.log( + `Sending email to ${recepient}, scheduled at ${ + scheduledAt || "NOW" + }. From: ${from}, replyTo: ${replyTo}. Subject: ${subject}` + ); + const result = await resend.emails.send({ + from, + replyTo, + to: payload.to, + bcc: payload.bcc || getVal(Component.bcc, props) || env.BCC_EMAIL, + react: , + text: Component.plaintext(props), + headers: { + "Message-ID": `${newId()}@${domain}`, + }, + scheduledAt, + subject, + }); + if (result.error) { + throw new Error(`Error sending email: ${JSON.stringify(result.error)}`); + } + return { + unsubscribed: false, + recipient: recepient, + messageId: result.data?.id, + }; +} diff --git a/webapps/ee-api/lib/error-handler.ts b/webapps/ee-api/lib/route-helpers.ts similarity index 58% rename from webapps/ee-api/lib/error-handler.ts rename to webapps/ee-api/lib/route-helpers.ts index 0f6710349..bc57e9024 100644 --- a/webapps/ee-api/lib/error-handler.ts +++ b/webapps/ee-api/lib/route-helpers.ts @@ -1,5 +1,5 @@ import { getErrorMessage } from "juava"; -import { NextApiHandler } from "next"; +import { NextApiHandler, NextApiRequest } from "next"; import { getServerLog } from "./log"; const log = getServerLog("api-error"); @@ -23,3 +23,13 @@ export function withErrorHandler(handler: NextApiHandler): NextApiHandler { } }; } + +export function getOrigin(req: NextApiRequest) { + const forwardedProto = req.headers["x-forwarded-proto"]; + const forwardedHost = req.headers["x-forwarded-host"]; + const forwardedPort = req.headers["x-forwarded-port"]; + const protocol = forwardedProto || (process.env.NODE_ENV === "production" ? "https" : "http"); + const host = forwardedHost || req.headers["host"]; + const port = forwardedPort && !host?.includes(":") ? `:${forwardedPort}` : ""; + return `${protocol}://${host}${port}`; +} diff --git a/webapps/ee-api/package.json b/webapps/ee-api/package.json index 5e4b2187e..ae2eb739a 100644 --- a/webapps/ee-api/package.json +++ b/webapps/ee-api/package.json @@ -4,6 +4,7 @@ "private": true, "scripts": { "ee-api:dev": "next dev -p 3001", + "email:dev": "email dev -p 3901", "build": "next build", "lint": "next lint", "db:update-schema": "dotenv -e ../../.env.local -- ts-node ./scripts/sql-exec.ts ./scripts/sql" @@ -11,6 +12,7 @@ "dependencies": { "@aws-sdk/client-s3": "^3.418.0", "@clickhouse/client": "^1.4.0", + "@react-email/components": "^0.0.25", "@types/node": "^18.15.3", "@types/react": "18.3.3", "@types/react-dom": "18.3.0", @@ -30,8 +32,10 @@ "pg": "^8.11.3", "react": "18.3.1", "react-dom": "18.3.1", + "resend": "^4.0.0", "stripe": "^11.15.0", - "tslib": "^2.6.3" + "tslib": "^2.6.3", + "zod": "^3.23.8" }, "devDependencies": { "@types/crypto-js": "^4.1.1", @@ -42,7 +46,9 @@ "dotenv": "^16.3.1", "next-transpile-modules": "^10.0.1", "raw-loader": "^4.0.2", + "react-email": "^3.0.1", "ts-node": "^10.9.2", + "type-fest": "^3.5.7", "typescript": "^5.5.4" } } diff --git a/webapps/ee-api/pages/api/billing/custom-plan.ts b/webapps/ee-api/pages/api/billing/custom-plan.ts index 5a3990897..267509aaa 100644 --- a/webapps/ee-api/pages/api/billing/custom-plan.ts +++ b/webapps/ee-api/pages/api/billing/custom-plan.ts @@ -1,6 +1,6 @@ import { NextApiRequest, NextApiResponse } from "next"; import { getAvailableProducts, stripe } from "../../../lib/stripe"; -import { withErrorHandler } from "../../../lib/error-handler"; +import { withErrorHandler } from "../../../lib/route-helpers"; import { requireDefined } from "juava"; const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { diff --git a/webapps/ee-api/pages/api/billing/manage.ts b/webapps/ee-api/pages/api/billing/manage.ts index 0837c2e81..96237a497 100644 --- a/webapps/ee-api/pages/api/billing/manage.ts +++ b/webapps/ee-api/pages/api/billing/manage.ts @@ -1,7 +1,7 @@ import { NextApiRequest, NextApiResponse } from "next"; import { auth } from "../../../lib/auth"; import { requireDefined } from "juava"; -import { withErrorHandler } from "../../../lib/error-handler"; +import { withErrorHandler } from "../../../lib/route-helpers"; import { getOrCreatePortalConfiguration, getOrCreateCurrentSubscription, stripe } from "../../../lib/stripe"; import { getServerLog } from "../../../lib/log"; diff --git a/webapps/ee-api/pages/api/billing/plans.ts b/webapps/ee-api/pages/api/billing/plans.ts index 0b48b81d5..9ac52d370 100644 --- a/webapps/ee-api/pages/api/billing/plans.ts +++ b/webapps/ee-api/pages/api/billing/plans.ts @@ -2,7 +2,7 @@ import { NextApiRequest, NextApiResponse } from "next"; import { auth } from "../../../lib/auth"; import { getAvailableProducts, getOrCreateCurrentSubscription, stripe } from "../../../lib/stripe"; import { requireDefined } from "juava"; -import { withErrorHandler } from "../../../lib/error-handler"; +import { withErrorHandler } from "../../../lib/route-helpers"; import { getServerLog } from "../../../lib/log"; diff --git a/webapps/ee-api/pages/api/billing/rotate-stripe-customer.ts b/webapps/ee-api/pages/api/billing/rotate-stripe-customer.ts index a095e52e3..505baade5 100644 --- a/webapps/ee-api/pages/api/billing/rotate-stripe-customer.ts +++ b/webapps/ee-api/pages/api/billing/rotate-stripe-customer.ts @@ -3,7 +3,7 @@ import { ErrorResponse } from "./plans"; import assert from "assert"; import { auth } from "../../../lib/auth"; import { rotateStripeCustomer } from "../../../lib/stripe"; -import { withErrorHandler } from "../../../lib/error-handler"; +import { withErrorHandler } from "../../../lib/route-helpers"; const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { const workspaceId = req.query.workspaceId as string | undefined; diff --git a/webapps/ee-api/pages/api/billing/settings.ts b/webapps/ee-api/pages/api/billing/settings.ts index 2ac0b1b7d..333ce754c 100644 --- a/webapps/ee-api/pages/api/billing/settings.ts +++ b/webapps/ee-api/pages/api/billing/settings.ts @@ -1,7 +1,7 @@ import { NextApiRequest, NextApiResponse } from "next"; import { auth } from "../../../lib/auth"; import { requireDefined } from "juava"; -import { withErrorHandler } from "../../../lib/error-handler"; +import { withErrorHandler } from "../../../lib/route-helpers"; import { SubscriptionStatus, getOrCreateCurrentSubscription } from "../../../lib/stripe"; import { getServerLog } from "../../../lib/log"; diff --git a/webapps/ee-api/pages/api/billing/upgrade.ts b/webapps/ee-api/pages/api/billing/upgrade.ts index 8376c6853..532a37f9e 100644 --- a/webapps/ee-api/pages/api/billing/upgrade.ts +++ b/webapps/ee-api/pages/api/billing/upgrade.ts @@ -2,7 +2,7 @@ import { NextApiRequest, NextApiResponse } from "next"; import { auth } from "../../../lib/auth"; import { getActivePlan, getAvailableProducts, getOrCreateCurrentSubscription, stripe } from "../../../lib/stripe"; import { requireDefined } from "juava"; -import { withErrorHandler } from "../../../lib/error-handler"; +import { withErrorHandler } from "../../../lib/route-helpers"; import { getServerLog } from "../../../lib/log"; const log = getServerLog("/api/billing/create"); diff --git a/webapps/ee-api/pages/api/billing/workspaces.ts b/webapps/ee-api/pages/api/billing/workspaces.ts index 9aef286af..7827928a9 100644 --- a/webapps/ee-api/pages/api/billing/workspaces.ts +++ b/webapps/ee-api/pages/api/billing/workspaces.ts @@ -1,7 +1,7 @@ import { NextApiRequest, NextApiResponse } from "next"; import { auth } from "../../../lib/auth"; import { assertDefined, assertTrue, requireDefined } from "juava"; -import { withErrorHandler } from "../../../lib/error-handler"; +import { withErrorHandler } from "../../../lib/route-helpers"; import { store } from "../../../lib/services"; import { getStripeObjectTag, listAllSubscriptions, stripe, stripeDataTable, stripeLink } from "../../../lib/stripe"; import Stripe from "stripe"; @@ -67,6 +67,7 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse }, ]; } + const customerSubscriptions = subscriptions[w.obj.stripeCustomerId]; if (!customerSubscriptions) { return [w.id, undefined]; diff --git a/webapps/ee-api/pages/api/custom-token.ts b/webapps/ee-api/pages/api/custom-token.ts index 0d0425f6b..26c8cad77 100644 --- a/webapps/ee-api/pages/api/custom-token.ts +++ b/webapps/ee-api/pages/api/custom-token.ts @@ -1,5 +1,5 @@ import { NextApiRequest, NextApiResponse } from "next"; -import { withErrorHandler } from "../../lib/error-handler"; +import { withErrorHandler } from "../../lib/route-helpers"; import { createCustomToken } from "../../lib/firebase-auth"; const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { diff --git a/webapps/ee-api/pages/api/email.tsx b/webapps/ee-api/pages/api/email.tsx new file mode 100644 index 000000000..e2d0abd49 --- /dev/null +++ b/webapps/ee-api/pages/api/email.tsx @@ -0,0 +1,57 @@ +import { NextApiRequest, NextApiResponse } from "next"; +import { getOrigin, withErrorHandler } from "../../lib/route-helpers"; +import { assertDefined, assertTrue, requireDefined } from "juava"; +import { auth } from "../../lib/auth"; +import { pg } from "../../lib/services"; +import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; +import { result } from "lodash"; +import { sendEmail, SendEmailRequest } from "../../lib/email"; + +dayjs.extend(utc); + +async function getWorkspaceMembers(workspaceId: string | undefined) { + const query = ` + select profile.name, profile.email + from newjitsu."WorkspaceAccess" + join newjitsu."UserProfile" profile on profile.id = "WorkspaceAccess"."userId" + where "workspaceId" = $1`; + + return (await pg.query(query, [workspaceId])).rows; +} + +export function makeAddress({ name, email }): string { + assertDefined(email, "email is required"); + return name ? `${name} <${email}>` : email; +} + +const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { + if (req.method === "POST") { + const claims = requireDefined(await auth(req, res), `Auth is required`); + assertTrue(claims.type === "admin", "Invalid auth claims"); + const payload = SendEmailRequest.parse(req.body); + if (payload.workspaceId) { + const members = await getWorkspaceMembers(payload.workspaceId); + for (const member of members) { + try { + console.log(`Sending email to ${member.email} of workspace ${payload.workspaceId}`); + result[member.email] = await sendEmail({ ...payload, to: makeAddress(member) }); + } catch (e: any) { + result[member.email] = { error: e?.message }; + console.error(`Error sending email to ${member.email}: ${e?.message}`, e); + } + } + res.status(200).json(result); + } else { + requireDefined(payload.from, "from is required"); + assertDefined(payload.to, "to is required"); + const result = await sendEmail(payload as any); + res.status(200).json(result); + } + } else { + res.status(405).json({ error: "use POST" }); + res.end(); + } +}; + +export default withErrorHandler(handler); diff --git a/webapps/ee-api/pages/api/is-active.ts b/webapps/ee-api/pages/api/is-active.ts index a51114a40..6090b7c5b 100644 --- a/webapps/ee-api/pages/api/is-active.ts +++ b/webapps/ee-api/pages/api/is-active.ts @@ -1,6 +1,6 @@ import { NextApiRequest, NextApiResponse } from "next"; import { auth } from "../../lib/firebase-auth"; -import { withErrorHandler } from "../../lib/error-handler"; +import { withErrorHandler } from "../../lib/route-helpers"; import { telemetryDb } from "../../lib/services"; import { getServerLog } from "../../lib/log"; diff --git a/webapps/ee-api/pages/api/marketing-automation/intercom/export.ts b/webapps/ee-api/pages/api/marketing-automation/intercom/export.ts deleted file mode 100644 index 495b18bb9..000000000 --- a/webapps/ee-api/pages/api/marketing-automation/intercom/export.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { NextApiRequest, NextApiResponse } from "next"; -import { withErrorHandler } from "../../../../lib/error-handler"; -import { auth } from "../../../../lib/auth"; -import { assertTrue, getLog, requireDefined } from "juava"; -import { Client, Operators } from "intercom-client"; -import { pg, store } from "../../../../lib/services"; - -const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { - res.setHeader("Access-Control-Allow-Origin", req.headers.origin || "*"); - res.setHeader("Access-Control-Allow-Methods", "*"); - res.setHeader("Access-Control-Allow-Headers", "authorization, content-type, baggage, sentry-trace"); - res.setHeader("Access-Control-Allow-Credentials", "true"); - if (req.method === "OPTIONS") { - res.status(200).end(); - return; - } - const claims = await auth(req, res); - if (!claims) { - return; - } - assertTrue(claims.type === "admin", "Only admins can call this API"); - const client = new Client({ - tokenAuth: { token: requireDefined(process.env.INTERCOM_TOKEN, "INTERCOM_TOKEN env variable is not defined") }, - }); - const lookbackDays = req.query.lookbackDays ? parseInt(req.query.lookbackDays as string) : 30; - const result = await pg.query( - `select * from newjitsu."IntercomEventsExport" where timestamp > now() - interval '${lookbackDays} day'` - ); - getLog().atInfo().log(`Found ${result.rowCount} events to export to Intercom`); - let alreadySent = 0; - let newEvents = 0; - let invalidEvents = 0; - for (const { messageId, timestamp, email, eventName } of result.rows) { - const sentEventsTable = store.getTable("intercom-events:sent"); - const sentEvents = (await sentEventsTable.get(email as string)) || { eventIds: [] }; - if (sentEvents.eventIds.includes(messageId as string)) { - getLog().atInfo().log(`Event ${messageId} was already sent to Intercom`); - alreadySent++; - } else { - getLog().atInfo().log(`Sending event ${eventName} from ${email} to Intercom. Date: ${timestamp.toISOString()}`); - const searchResult = await client.contacts.search({ - data: { - query: { - field: "email", - operator: Operators.EQUALS, - value: email as string, - }, - }, - }); - if (searchResult.data.length === 0) { - getLog().atInfo().log(`Contact ${email} not found in Intercom. Skipping event`); - invalidEvents++; - continue; - } else if (searchResult.data.length > 1) { - getLog().atInfo().log(`Contact ${email} has ${searchResult.data.length} in Intercom, taking the first one`); - } - const intercomUserId = searchResult.data.map(d => d.id).find(id => id !== undefined); - if (!intercomUserId) { - getLog().atInfo().log(`Non of ${searchResult.data.length} contacts attached to ${email} doesn't have id`); - invalidEvents++; - continue; - } - await client.events.create({ - eventName: eventName as string, - createdAt: Math.round((timestamp as Date).getTime() / 1000), - id: intercomUserId, - }); - sentEvents.eventIds.push(messageId); - await sentEventsTable.put(email as string, sentEvents); - } - } - const apiResponse = { ok: true, alreadySent, newEvents, invalidEvents }; - getLog() - .atInfo() - .log(`Result: ${JSON.stringify(apiResponse, null, 2)}`); - return apiResponse; -}; - -export default withErrorHandler(handler); diff --git a/webapps/ee-api/pages/api/provision-db.ts b/webapps/ee-api/pages/api/provision-db.ts index f3cb7c342..ff91c00c0 100644 --- a/webapps/ee-api/pages/api/provision-db.ts +++ b/webapps/ee-api/pages/api/provision-db.ts @@ -1,7 +1,7 @@ import { NextApiRequest, NextApiResponse } from "next"; import { auth } from "../../lib/auth"; import { assertTrue, randomId, requireDefined } from "juava"; -import { withErrorHandler } from "../../lib/error-handler"; +import { withErrorHandler } from "../../lib/route-helpers"; import { clickhouse, store } from "../../lib/services"; import { getServerLog } from "../../lib/log"; diff --git a/webapps/ee-api/pages/api/quotas/sync.ts b/webapps/ee-api/pages/api/quotas/sync.ts index 450feb79f..2e0d8adda 100644 --- a/webapps/ee-api/pages/api/quotas/sync.ts +++ b/webapps/ee-api/pages/api/quotas/sync.ts @@ -1,7 +1,7 @@ import { NextApiRequest, NextApiResponse } from "next"; import { auth } from "../../../lib/auth"; import { assertTrue, requireDefined } from "juava"; -import { withErrorHandler } from "../../../lib/error-handler"; +import { withErrorHandler } from "../../../lib/route-helpers"; import { getOrCreateCurrentSubscription } from "../../../lib/stripe"; import { pg } from "../../../lib/services"; import { query } from "../report/workspace-stat"; diff --git a/webapps/ee-api/pages/api/report/overage.ts b/webapps/ee-api/pages/api/report/overage.ts index a9d3db27a..ec5bc3355 100644 --- a/webapps/ee-api/pages/api/report/overage.ts +++ b/webapps/ee-api/pages/api/report/overage.ts @@ -1,6 +1,6 @@ import type { NextApiRequest, NextApiResponse } from "next"; import { assertTrue, getLog } from "juava"; -import { withErrorHandler } from "../../../lib/error-handler"; +import { withErrorHandler } from "../../../lib/route-helpers"; import { auth } from "../../../lib/auth"; import { pg, store } from "../../../lib/services"; import { diff --git a/webapps/ee-api/pages/api/report/workspace-stat.ts b/webapps/ee-api/pages/api/report/workspace-stat.ts index 1bd5d94ff..3642a915e 100644 --- a/webapps/ee-api/pages/api/report/workspace-stat.ts +++ b/webapps/ee-api/pages/api/report/workspace-stat.ts @@ -8,7 +8,7 @@ import { requireDefined, SqlQueryParameters, } from "juava"; -import { withErrorHandler } from "../../../lib/error-handler"; +import { withErrorHandler } from "../../../lib/route-helpers"; import { auth } from "../../../lib/auth"; import { clickhouse, pg, store } from "../../../lib/services"; import * as PG from "pg"; diff --git a/webapps/ee-api/pages/api/s3-connections.ts b/webapps/ee-api/pages/api/s3-connections.ts index 8ecce5bc4..cecb8cec1 100644 --- a/webapps/ee-api/pages/api/s3-connections.ts +++ b/webapps/ee-api/pages/api/s3-connections.ts @@ -1,7 +1,7 @@ import { NextApiRequest, NextApiResponse } from "next"; import { auth } from "../../lib/auth"; import { assertTrue } from "juava"; -import { withErrorHandler } from "../../lib/error-handler"; +import { withErrorHandler } from "../../lib/route-helpers"; import { pg } from "../../lib/services"; import { getServerLog } from "../../lib/log"; import pick from "lodash/pick"; diff --git a/webapps/ee-api/pages/api/s3-init.ts b/webapps/ee-api/pages/api/s3-init.ts index ee751a9c1..cf8dc88b1 100644 --- a/webapps/ee-api/pages/api/s3-init.ts +++ b/webapps/ee-api/pages/api/s3-init.ts @@ -1,7 +1,7 @@ import { NextApiRequest, NextApiResponse } from "next"; import { auth } from "../../lib/auth"; import { assertTrue, requireDefined } from "juava"; -import { withErrorHandler } from "../../lib/error-handler"; +import { withErrorHandler } from "../../lib/route-helpers"; import { s3client, store } from "../../lib/services"; import { CreateBucketCommand, CreateBucketCommandInput } from "@aws-sdk/client-s3"; import { getServerLog } from "../../lib/log"; diff --git a/webapps/ee-api/pages/api/sync-cache.ts b/webapps/ee-api/pages/api/sync-cache.ts index 5bc687e51..2ed887abb 100644 --- a/webapps/ee-api/pages/api/sync-cache.ts +++ b/webapps/ee-api/pages/api/sync-cache.ts @@ -1,5 +1,5 @@ import { NextApiRequest, NextApiResponse } from "next"; -import { withErrorHandler } from "../../lib/error-handler"; +import { withErrorHandler } from "../../lib/route-helpers"; import dayjs from "dayjs"; import { auth } from "../../lib/auth"; import { getLog } from "juava"; diff --git a/webapps/ee-api/pages/api/unsubscribe.ts b/webapps/ee-api/pages/api/unsubscribe.ts new file mode 100644 index 000000000..13df22e4f --- /dev/null +++ b/webapps/ee-api/pages/api/unsubscribe.ts @@ -0,0 +1,30 @@ +import { NextApiRequest, NextApiResponse } from "next"; +import { withErrorHandler } from "../../lib/route-helpers"; +import { getUnsubscribeCode, isUnsubscribed, unsubscribe } from "../../lib/email"; + +const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { + const email = req.query.email as string; + const code = req.query.code as string; + const codeValidation = await getUnsubscribeCode(email.toLowerCase().trim(), { rotateExpired: false }); + if (codeValidation !== code) { + res.status(400); + res.write("ERROR: validation code is invalid or expired. Please try again."); + res.end(); + return; + } else if (await isUnsubscribed(email.toLowerCase().trim())) { + res.status(200); + res.write(`${email} is already unsubscribed. You can close this page.`); + res.end(); + } else { + await unsubscribe(email.toLowerCase().trim()); + res.status(200); + res.write(`${email} has been unsubscribed. You can close this page.`); + res.end(); + } + //res.setHeader("Content-Type", "html/text"); + res.status(200); + res.write("Hey!"); + res.end(); +}; + +export default withErrorHandler(handler); diff --git a/webapps/ee-api/pages/api/user-created.ts b/webapps/ee-api/pages/api/user-created.ts new file mode 100644 index 000000000..a346550ef --- /dev/null +++ b/webapps/ee-api/pages/api/user-created.ts @@ -0,0 +1,28 @@ +import { NextApiRequest, NextApiResponse } from "next"; +import { withErrorHandler } from "../../lib/route-helpers"; +import { assertDefined, assertTrue, requireDefined } from "juava"; +import { auth } from "../../lib/auth"; +import { sendEmail } from "../../lib/email"; +import { makeAddress } from "./email"; + +const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { + if (req.method === "POST") { + const claims = requireDefined(await auth(req, res), `Auth is required`); + assertTrue(claims.type === "admin", "Should be admin"); + const { email, name } = requireDefined(req.body, "Body is required"); + assertDefined(email, "email is required"); + await sendEmail({ + to: makeAddress({ name, email }), + template: "welcome", + //new user means new email, we don't allow to create multiple accounts with the same email + //no need to respect unsubscribe for welcome email + respectUnsubscribe: false, + allowUnsubscribe: true, + }); + } else { + res.status(405).json({ error: "use POST" }); + res.end(); + } +}; + +export default withErrorHandler(handler); From a6288912956a4264bf875db0c2573b1b91ab10a5 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Sat, 28 Sep 2024 16:33:36 -0400 Subject: [PATCH 0886/1353] feat (jitsu/ee): fixed syncs usage display --- webapps/console/pages/admin/overage-billing.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/pages/admin/overage-billing.tsx b/webapps/console/pages/admin/overage-billing.tsx index 8e27c15ad..4fd53b399 100644 --- a/webapps/console/pages/admin/overage-billing.tsx +++ b/webapps/console/pages/admin/overage-billing.tsx @@ -78,7 +78,7 @@ const View = ({ data, workspaces }) => { type: "custom", render: (val, row) => { return ( -

    row.monthlyActiveSyncs ? "font-bold text-error" : ""}> +
    row.monthlyActiveSyncsLimit ? "font-bold text-error" : ""}> {row.monthlyActiveSyncs} / {row.monthlyActiveSyncsLimit}{" "}
    ); From a6973cda2d8375a50abff8027741530e8c8e577d Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Sat, 28 Sep 2024 16:52:26 -0400 Subject: [PATCH 0887/1353] feat (jitsu/ee): minor - fixed email link --- webapps/ee-api/emails/welcome.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/ee-api/emails/welcome.tsx b/webapps/ee-api/emails/welcome.tsx index 3e26f35cd..df0958244 100644 --- a/webapps/ee-api/emails/welcome.tsx +++ b/webapps/ee-api/emails/welcome.tsx @@ -38,7 +38,7 @@ const WelcomeEmail: EmailComponent = ({ name, unsubscribeLink 👋 Hi {name || "there"}! I{"'"}m Vladimir, the CEO of Jitsu! Thank you for creating account - with Jitsu Cloud, and I wanted to say thank you for giving it a try! 👍 + with Jitsu Cloud, and I wanted to say thank you for giving it a try! 👍 In order to help you discover Jitsu, I have prepared a list of useful resources for you: From 25d8bea91730754816e14f2849e555c2f7f84bde Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Sat, 28 Sep 2024 16:52:26 -0400 Subject: [PATCH 0888/1353] feat (jitsu/ee): minor - fixed email link --- webapps/ee-api/emails/welcome.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/webapps/ee-api/emails/welcome.tsx b/webapps/ee-api/emails/welcome.tsx index 3e26f35cd..becca67c8 100644 --- a/webapps/ee-api/emails/welcome.tsx +++ b/webapps/ee-api/emails/welcome.tsx @@ -38,7 +38,8 @@ const WelcomeEmail: EmailComponent = ({ name, unsubscribeLink 👋 Hi {name || "there"}! I{"'"}m Vladimir, the CEO of Jitsu! Thank you for creating account - with Jitsu Cloud, and I wanted to say thank you for giving it a try! 👍 + with Jitsu Cloud, and I wanted to say thank you for giving it a try! + 👍 In order to help you discover Jitsu, I have prepared a list of useful resources for you: From 0d15f672b829fb294c83a33854ac7e32bd178be9 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Sat, 28 Sep 2024 16:56:46 -0400 Subject: [PATCH 0889/1353] feat (jitsu/ee): minor - fixed prettier issue --- webapps/ee-api/emails/welcome.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/webapps/ee-api/emails/welcome.tsx b/webapps/ee-api/emails/welcome.tsx index df0958244..becca67c8 100644 --- a/webapps/ee-api/emails/welcome.tsx +++ b/webapps/ee-api/emails/welcome.tsx @@ -38,7 +38,8 @@ const WelcomeEmail: EmailComponent = ({ name, unsubscribeLink 👋 Hi {name || "there"}! I{"'"}m Vladimir, the CEO of Jitsu! Thank you for creating account - with Jitsu Cloud, and I wanted to say thank you for giving it a try! 👍 + with Jitsu Cloud, and I wanted to say thank you for giving it a try! + 👍 In order to help you discover Jitsu, I have prepared a list of useful resources for you: From bd2748cadf5c9254b6f233ce5cbbc180eda37f1e Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 30 Sep 2024 12:01:56 +0400 Subject: [PATCH 0890/1353] rotor: facebook-conversions: support for custom event payload provided in 'facebookEvent' event --- .../src/functions/facebook-conversions.ts | 62 +- .../src/functions/udf_wrapper.ts | 12 +- libs/juava/src/index.ts | 1 + libs/juava/src/objects.ts | 12 + pnpm-lock.yaml | 1916 +++++++---------- 5 files changed, 781 insertions(+), 1222 deletions(-) create mode 100644 libs/juava/src/objects.ts diff --git a/libs/core-functions/src/functions/facebook-conversions.ts b/libs/core-functions/src/functions/facebook-conversions.ts index b00f89514..f39116db2 100644 --- a/libs/core-functions/src/functions/facebook-conversions.ts +++ b/libs/core-functions/src/functions/facebook-conversions.ts @@ -6,6 +6,7 @@ import crypto from "crypto"; import omit from "lodash/omit"; import { RetryError } from "@jitsu/functions-lib"; import { createFilter, eventTimeSafeMs } from "./lib"; +import { deepMerge } from "juava"; export function facebookHash(email: string) { return crypto.createHash("sha256").update(email.toLowerCase()).digest("hex"); @@ -55,11 +56,12 @@ const FacebookConversionsApi: JitsuFunction !!e)), - client_ip_address: event.context.ip, - client_user_agent: event.context.userAgent, - fbc: event.context.clientIds?.fbc, - fbp: event.context.clientIds?.fbp, - }, - custom_data: omit(event.properties, [ - "path", - "referrer", - "host", - "referring_domain", - "search", - "title", - "url", - "hash", - "height", - "width", - ]), }; + const fbEvent = + typeof event.facebookEvent === "object" && !Array.isArray(event.facebookEvent) + ? deepMerge(baseProps, event.facebookEvent) + : { + ...baseProps, + user_data: { + em: event.context.traits?.email + ? facebookHash(sanitizeEmail(event.context.traits.email + "")) + : undefined, + ph: + ctx.props?.phoneFieldName && event.context.traits?.[ctx.props.phoneFieldName] + ? facebookHash(sanitizePhone(String(event.context.traits[ctx.props.phoneFieldName]))) + : undefined, + external_id: reduceArray([event.userId, event.anonymousId].filter(e => !!e)), + client_ip_address: event.context.ip, + client_user_agent: event.context.userAgent, + fbc: event.context.clientIds?.fbc, + fbp: event.context.clientIds?.fbp, + }, + custom_data: omit(event.properties, [ + "path", + "referrer", + "host", + "referring_domain", + "search", + "title", + "url", + "hash", + "height", + "width", + ]), + }; + const baseUrl = `https://graph.facebook.com/v18.0/${ctx.props.pixelId}/events?access_token=`; const payload = { data: [fbEvent] }; const fetchResult = await ctx.fetch(`${baseUrl}${ctx.props.accessToken}`, { diff --git a/libs/core-functions/src/functions/udf_wrapper.ts b/libs/core-functions/src/functions/udf_wrapper.ts index f5c302220..ee2a10284 100644 --- a/libs/core-functions/src/functions/udf_wrapper.ts +++ b/libs/core-functions/src/functions/udf_wrapper.ts @@ -20,7 +20,7 @@ import { JitsuFunctionWrapper } from "./lib"; import { clearTimeout } from "node:timers"; import * as crypto from "node:crypto"; import { cryptoCode } from "./lib/crypto-code"; -import { throws } from "node:assert"; +import { randomInt } from "node:crypto"; const log = getLog("udf-wrapper"); @@ -75,7 +75,15 @@ export const UDFWrapper = ( }).copyInto({ release: true, transferIn: true }) ); jail.setSync("_jitsu_fetch_log_level", chainCtx.connectionOptions?.fetchLogLevel || "info"); - jail.setSync("_jitsu_crypto", makeReference(refs, crypto)); + jail.setSync( + "_jitsu_crypto", + makeReference(refs, { + hash: crypto["hash"], + randomUUID: crypto.randomUUID, + randomBytes: crypto.randomBytes, + randomInt: crypto.randomInt, + }) + ); jail.setSync("require", () => { throw new Error("'require' is not supported. Please use 'import' instead"); }); diff --git a/libs/juava/src/index.ts b/libs/juava/src/index.ts index 1e40ffb68..383105930 100644 --- a/libs/juava/src/index.ts +++ b/libs/juava/src/index.ts @@ -13,3 +13,4 @@ export * from "./sql-params"; export * from "./boolean"; export * from "./number"; export * from "./throttle"; +export * from "./objects"; diff --git a/libs/juava/src/objects.ts b/libs/juava/src/objects.ts new file mode 100644 index 000000000..d5d4069d2 --- /dev/null +++ b/libs/juava/src/objects.ts @@ -0,0 +1,12 @@ +export function deepMerge(target: any, source: any) { + if (typeof source !== "object" || source === null) { + return source; + } + if (typeof target !== "object" || target === null) { + return source; + } + return Object.entries(source).reduce((acc, [key, value]) => { + acc[key] = deepMerge(target[key], value); + return acc; + }, target); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 122c3ec4e..d7320530f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,7 +25,7 @@ importers: version: 2.8.8 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@16.18.11)(typescript@5.5.4) + version: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) turbo: specifier: ~1.2.16 version: 1.2.16 @@ -34,7 +34,7 @@ importers: version: 5.5.4 vercel: specifier: ^35.2.3 - version: 35.2.3(encoding@0.1.13) + version: 35.2.3 cli/build-scripts: dependencies: @@ -80,7 +80,7 @@ importers: version: link:../../libs/juava webpack: specifier: ^5.91.0 - version: 5.93.0 + version: 5.93.0(webpack-cli@5.1.4) cli/jitsu-cli: dependencies: @@ -89,7 +89,7 @@ importers: version: 1.7.0 jest-cli: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) tslib: specifier: ^2.6.3 version: 2.6.3 @@ -147,13 +147,13 @@ importers: version: 18.19.42 '@types/webpack': specifier: ^5.28.5 - version: 5.28.5(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) + version: 5.28.5(webpack-cli@5.1.4) '@webpack-cli/generators': specifier: ^3.0.7 - version: 3.0.7(encoding@0.1.13)(mem-fs@2.3.0)(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0) + version: 3.0.7(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0) babel-loader: specifier: ^9.1.3 - version: 9.1.3(@babel/core@7.25.2)(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) + version: 9.1.3(@babel/core@7.25.2)(webpack@5.93.0) chalk: specifier: ^5.3.0 version: 5.3.0 @@ -162,7 +162,7 @@ importers: version: 11.1.0 cross-fetch: specifier: ^4.0.0 - version: 4.0.0(encoding@0.1.13) + version: 4.0.0 cuid: specifier: ^2.1.8 version: 2.1.8 @@ -174,7 +174,7 @@ importers: version: 9.3.6 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) json5: specifier: ^2.2.3 version: 2.2.3 @@ -189,7 +189,7 @@ importers: version: 3.3.2 node-loader: specifier: ^2.0.0 - version: 2.0.0(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) + version: 2.0.0(webpack@5.93.0) prismjs: specifier: ^1.29.0 version: 1.29.0 @@ -201,16 +201,16 @@ importers: version: 7.6.3 ts-jest: specifier: ^29.1.1 - version: 29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4) + version: 29.2.3(@babel/core@7.25.2)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.5.4) ts-loader: specifier: ^9.4.4 - version: 9.5.1(typescript@5.5.4)(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) + version: 9.5.1(typescript@5.5.4)(webpack@5.93.0) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) webpack: specifier: ^5.91.0 - version: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) + version: 5.93.0(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 version: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) @@ -234,7 +234,7 @@ importers: version: 5.4.1 jest: specifier: ^29.3.1 - version: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) json5: specifier: ^2.1.0 version: 2.2.3 @@ -246,10 +246,10 @@ importers: version: 0.6.2 testcontainers: specifier: ^9.0.0 - version: 9.12.0(encoding@0.1.13) + version: 9.12.0 ts-jest: specifier: 29.0.5 - version: 29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)))(typescript@5.5.4) + version: 29.0.5(@babel/core@7.25.2)(jest@29.7.0)(typescript@5.5.4) tslib: specifier: ^2.6.3 version: 2.6.3 @@ -276,10 +276,10 @@ importers: version: 6.25.1(react@18.3.1) react-router-dom: specifier: ^6.25.1 - version: 6.25.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 6.25.1(react-dom@18.3.1)(react@18.3.1) react-scripts: specifier: ^5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(@types/babel__core@7.20.5)(@types/webpack@5.28.5)(eslint@8.57.0)(react@18.3.1)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))(type-fest@3.13.1)(typescript@5.5.4) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0)(react@18.3.1)(ts-node@10.9.2)(typescript@5.5.4) web-vitals: specifier: ^2.1.4 version: 2.1.4 @@ -295,7 +295,7 @@ importers: version: 18.3.0 tailwindcss: specifier: ^3.0.24 - version: 3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + version: 3.4.7(ts-node@10.9.2) typescript: specifier: ^5.5.4 version: 5.5.4 @@ -307,7 +307,7 @@ importers: version: 0.7.33 '@hubspot/api-client': specifier: ^11.1.0 - version: 11.1.0(encoding@0.1.13) + version: 11.1.0 '@mongodb-js/zstd': specifier: ^1.2.0 version: 1.2.0 @@ -319,7 +319,7 @@ importers: version: 1.11.12 google-ads-api: specifier: ^16.0.0-rest-beta3 - version: 16.0.0-rest-beta3(encoding@0.1.13) + version: 16.0.0-rest-beta3 ioredis: specifier: ^5.3.2 version: 5.4.1 @@ -334,7 +334,7 @@ importers: version: 4.17.21 mongodb: specifier: ^6.7.0 - version: 6.8.0(@mongodb-js/zstd@1.2.0)(socks@2.8.3) + version: 6.8.0(@mongodb-js/zstd@1.2.0) node-cache: specifier: ^5.1.2 version: 5.1.2 @@ -374,7 +374,7 @@ importers: version: 4.19.2 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) json5: specifier: ^2.1.0 version: 2.2.3 @@ -383,7 +383,7 @@ importers: version: 3.3.2 ts-jest: specifier: ^29.2.3 - version: 29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4) + version: 29.2.3(@babel/core@7.25.2)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.5.4) libs/functions: dependencies: @@ -405,13 +405,13 @@ importers: version: 18.19.42 jest: specifier: ^29.1.2 - version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) rollup: specifier: ^4.1.4 version: 4.19.1 ts-jest: specifier: 29.0.5 - version: 29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4) + version: 29.0.5(@babel/core@7.25.2)(jest@29.7.0)(typescript@5.5.4) libs/jitsu-js: dependencies: @@ -445,7 +445,7 @@ importers: version: 0.1.0(rollup@3.29.4) '@segment/analytics-next': specifier: ^1.46.0 - version: 1.72.1(encoding@0.1.13) + version: 1.72.1 '@types/chalk': specifier: ^2.2.0 version: 2.2.0 @@ -469,7 +469,7 @@ importers: version: 4.19.2 jest: specifier: ^29.2.2 - version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) jsondiffpatch: specifier: workspace:* version: link:../jsondiffpatch @@ -487,7 +487,7 @@ importers: version: 3.29.4 ts-jest: specifier: 29.0.5 - version: 29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4) + version: 29.0.5(@babel/core@7.25.2)(jest@29.7.0)(typescript@5.5.4) tslib: specifier: ^2.6.3 version: 2.6.3 @@ -508,7 +508,7 @@ importers: version: 18.3.1 react-router-dom: specifier: 5.x || 6.x - version: 6.25.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 6.25.1(react-dom@18.3.1)(react@18.3.1) devDependencies: '@babel/plugin-transform-regenerator': specifier: ^7.22.10 @@ -518,7 +518,7 @@ importers: version: 6.4.8 '@testing-library/react': specifier: ^13.4.0 - version: 13.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 13.4.0(react-dom@18.3.1)(react@18.3.1) '@testing-library/user-event': specifier: ^14.4.3 version: 14.5.2(@testing-library/dom@10.4.0) @@ -545,7 +545,7 @@ importers: version: 29.5.12 '@typescript-eslint/eslint-plugin': specifier: ^7.18.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) + version: 7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/parser': specifier: ^7.18.0 version: 7.18.0(eslint@8.57.0)(typescript@5.5.4) @@ -557,10 +557,10 @@ importers: version: 9.1.0(eslint@8.57.0) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) ts-jest: specifier: ^29.1.1 - version: 29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)))(typescript@5.5.4) + version: 29.2.3(@babel/core@7.25.2)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.5.4) tslib: specifier: ^2.6.3 version: 2.6.3 @@ -585,10 +585,10 @@ importers: version: 18.19.42 jest: specifier: ^29.1.2 - version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) ts-jest: specifier: 29.0.5 - version: 29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4) + version: 29.0.5(@babel/core@7.25.2)(jest@29.7.0)(typescript@5.5.4) services/rotor: dependencies: @@ -709,19 +709,19 @@ importers: version: 0.0.152 '@types/webpack': specifier: ^5.28.5 - version: 5.28.5(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) + version: 5.28.5(webpack-cli@5.1.4) '@webpack-cli/generators': specifier: ^3.0.7 - version: 3.0.7(encoding@0.1.13)(mem-fs@2.3.0)(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0) + version: 3.0.7(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0) babel-loader: specifier: ^9.1.3 - version: 9.1.3(@babel/core@7.25.2)(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) + version: 9.1.3(@babel/core@7.25.2)(webpack@5.93.0) clean-webpack-plugin: specifier: ^4.0.0 - version: 4.0.0(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) + version: 4.0.0(webpack@5.93.0) copy-webpack-plugin: specifier: ^12.0.2 - version: 12.0.2(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) + version: 12.0.2(webpack@5.93.0) declaration-bundler-webpack-plugin: specifier: ^1.0.3 version: 1.0.3 @@ -730,22 +730,22 @@ importers: version: 7.4.2 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) lodash: specifier: ^4.17.21 version: 4.17.21 node-loader: specifier: ^2.0.0 - version: 2.0.0(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) + version: 2.0.0(webpack@5.93.0) nodemon: specifier: ^3.1.4 version: 3.1.4 ts-jest: specifier: ^29.2.3 - version: 29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4) + version: 29.2.3(@babel/core@7.25.2)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.5.4) ts-loader: specifier: ^9.4.2 - version: 9.5.1(typescript@5.5.4)(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) + version: 9.5.1(typescript@5.5.4)(webpack@5.93.0) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) @@ -757,7 +757,7 @@ importers: version: 5.5.4 webpack: specifier: ^5.93.0 - version: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) + version: 5.93.0(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 version: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) @@ -768,19 +768,19 @@ importers: dependencies: '@ant-design/cssinjs': specifier: ^1.5.6 - version: 1.21.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.21.0(react-dom@18.3.1)(react@18.3.1) '@clickhouse/client': specifier: ^1.4.0 version: 1.4.0 '@dnd-kit/core': specifier: ^6.0.8 - version: 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 6.1.0(react-dom@18.3.1)(react@18.3.1) '@dnd-kit/modifiers': specifier: ^6.0.1 - version: 6.0.1(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 6.0.1(@dnd-kit/core@6.1.0)(react@18.3.1) '@dnd-kit/sortable': specifier: ^7.0.2 - version: 7.0.2(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 7.0.2(@dnd-kit/core@6.1.0)(react@18.3.1) '@dnd-kit/utilities': specifier: ^3.2.1 version: 3.2.2(react@18.3.1) @@ -792,7 +792,7 @@ importers: version: 4.5.10 '@google-cloud/scheduler': specifier: ^4.0.0 - version: 4.3.0(encoding@0.1.13) + version: 4.3.0 '@jitsu/core-functions': specifier: workspace:* version: link:../../libs/core-functions @@ -813,7 +813,7 @@ importers: version: 5.16.4(react@18.3.1) '@monaco-editor/react': specifier: ^4.6.0 - version: 4.6.0(monaco-editor@0.50.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 4.6.0(monaco-editor@0.50.0)(react-dom@18.3.1)(react@18.3.1) '@nangohq/frontend': specifier: ^0.21.11 version: 0.21.17 @@ -822,22 +822,22 @@ importers: version: 5.17.0(prisma@5.17.0) '@rjsf/antd': specifier: ^5.19.4 - version: 5.19.4(@ant-design/icons@5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rjsf/core@5.10.0(@rjsf/utils@5.10.0(react@18.3.1))(react@18.3.1))(@rjsf/utils@5.10.0(react@18.3.1))(antd@5.19.4(date-fns@2.30.0)(moment@2.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 5.19.4(@ant-design/icons@5.4.0)(@rjsf/core@5.10.0)(@rjsf/utils@5.10.0)(antd@5.19.4)(dayjs@1.11.12)(react-dom@18.3.1)(react@18.3.1) '@rjsf/core': specifier: 5.10.0 - version: 5.10.0(@rjsf/utils@5.10.0(react@18.3.1))(react@18.3.1) + version: 5.10.0(@rjsf/utils@5.10.0)(react@18.3.1) '@rjsf/utils': specifier: 5.10.0 version: 5.10.0(react@18.3.1) '@rjsf/validator-ajv6': specifier: 5.10.0 - version: 5.10.0(@rjsf/utils@5.10.0(react@18.3.1)) + version: 5.10.0(@rjsf/utils@5.10.0) '@sentry/nextjs': specifier: ^7.70.0 - version: 7.118.0(encoding@0.1.13)(next@14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.93.0) + version: 7.118.0(next@14.2.5)(react@18.3.1)(webpack@5.93.0) '@tanstack/react-query': specifier: ^4.2.1 - version: 4.36.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 4.36.1(react-dom@18.3.1)(react@18.3.1) '@types/cookie': specifier: ^0.5.1 version: 0.5.4 @@ -873,13 +873,13 @@ importers: version: 10.12.5 firebase-admin: specifier: ^12.3.0 - version: 12.3.0(encoding@0.1.13) + version: 12.3.0 google-ads-api: specifier: ^16.0.0-rest-beta3 - version: 16.0.0-rest-beta3(encoding@0.1.13) + version: 16.0.0-rest-beta3 googleapis: specifier: ^126.0.1 - version: 126.0.1(encoding@0.1.13) + version: 126.0.1 highlight.js: specifier: ^11.6.0 version: 11.10.0 @@ -909,19 +909,19 @@ importers: version: 0.263.1(react@18.3.1) mjml: specifier: ^4.15.3 - version: 4.15.3(encoding@0.1.13) + version: 4.15.3 mjml-react: specifier: ^2.0.8 - version: 2.0.8(mjml@4.15.3(encoding@0.1.13))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.0.8(mjml@4.15.3)(react-dom@18.3.1)(react@18.3.1) monaco-editor: specifier: ^0.50.0 version: 0.50.0 next: specifier: ^14.2.5 - version: 14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.5(@babel/core@7.25.2)(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1) next-auth: specifier: ^4.23.2 - version: 4.24.7(next@14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nodemailer@6.9.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 4.24.7(next@14.2.5)(nodemailer@6.9.14)(react-dom@18.3.1)(react@18.3.1) node-fetch-commonjs: specifier: ^3.3.2 version: 3.3.2 @@ -954,13 +954,13 @@ importers: version: 4.12.0(react@18.3.1) react-json-view: specifier: ^1.19.1 - version: 1.21.3(@types/react@18.3.3)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.21.3(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) react-use: specifier: ^17.4.0 - version: 17.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 17.5.1(react-dom@18.3.1)(react@18.3.1) recharts: specifier: ^2.10.4 - version: 2.12.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.12.7(react-dom@18.3.1)(react@18.3.1) stable-hash: specifier: 0.0.3 version: 0.0.3 @@ -982,16 +982,16 @@ importers: devDependencies: '@ant-design/icons': specifier: ^5.4.0 - version: 5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 5.4.0(react-dom@18.3.1)(react@18.3.1) '@tailwindcss/typography': specifier: ^0.5.7 - version: 0.5.13(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))) + version: 0.5.13(tailwindcss@3.4.7) '@testing-library/jest-dom': specifier: ^6.1.3 version: 6.4.8 '@testing-library/react': specifier: ^13.1.1 - version: 13.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 13.4.0(react-dom@18.3.1)(react@18.3.1) '@types/cli-progress': specifier: ^3.11.0 version: 3.11.6 @@ -1027,7 +1027,7 @@ importers: version: 0.7.2 antd: specifier: ^5.19.4 - version: 5.19.4(date-fns@2.30.0)(moment@2.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 5.19.4(react-dom@18.3.1)(react@18.3.1) autoprefixer: specifier: ^10.4.20 version: 10.4.20(postcss@8.4.41) @@ -1045,7 +1045,7 @@ importers: version: 4.0.1(eslint@8.57.0) jest: specifier: ^28.0.0 - version: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + version: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2) less: specifier: ^4.1.2 version: 4.2.0 @@ -1066,7 +1066,7 @@ importers: version: 4.0.2(webpack@5.93.0) tailwindcss: specifier: ^3.0.24 - version: 3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + version: 3.4.7(ts-node@10.9.2) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) @@ -1078,7 +1078,7 @@ importers: version: 5.5.4 zod-prisma: specifier: ^0.5.4 - version: 0.5.4(decimal.js@10.4.3)(prisma@5.17.0)(zod@3.23.8) + version: 0.5.4(prisma@5.17.0)(zod@3.23.8) webapps/ee-api: dependencies: @@ -1090,7 +1090,7 @@ importers: version: 1.4.0 '@react-email/components': specifier: ^0.0.25 - version: 0.0.25(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 0.0.25(react-dom@18.3.1)(react@18.3.1) '@types/node': specifier: ^18.15.3 version: 18.19.42 @@ -1114,7 +1114,7 @@ importers: version: 14.2.5(eslint@8.57.0)(typescript@5.5.4) firebase-admin: specifier: ^12.3.0 - version: 12.3.0(encoding@0.1.13) + version: 12.3.0 intercom-client: specifier: ^5.0.0 version: 5.0.0 @@ -1135,7 +1135,7 @@ importers: version: 4.17.21 next: specifier: ^14.2.5 - version: 14.2.5(@babel/core@7.24.5)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.5(@babel/core@7.24.5)(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1) node-fetch-commonjs: specifier: ^3.3.2 version: 3.3.2 @@ -1150,7 +1150,7 @@ importers: version: 18.3.1(react@18.3.1) resend: specifier: ^4.0.0 - version: 4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 4.0.0(react-dom@18.3.1)(react@18.3.1) stripe: specifier: ^11.15.0 version: 11.18.0 @@ -1187,7 +1187,7 @@ importers: version: 4.0.2(webpack@5.93.0) react-email: specifier: ^3.0.1 - version: 3.0.1(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.0.1(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) @@ -9130,6 +9130,7 @@ packages: resolution: {integrity: sha512-Quz3MvAwHxVYNXsOByL7xI5EB2WYOeFswqaHIA3qOK3isRWTxiplBEocmmru6XmxDB2L7jDNYtYA4FyimoAFEw==} engines: {node: '>=8.17.0'} hasBin: true + bundledDependencies: [] jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -14163,35 +14164,35 @@ snapshots: dependencies: '@ctrl/tinycolor': 3.6.1 - '@ant-design/cssinjs-utils@1.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@ant-design/cssinjs-utils@1.0.3(react-dom@18.3.1)(react@18.3.1)': dependencies: - '@ant-design/cssinjs': 1.21.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/cssinjs': 1.21.0(react-dom@18.3.1)(react@18.3.1) '@babel/runtime': 7.25.0 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@ant-design/cssinjs@1.21.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@ant-design/cssinjs@1.21.0(react-dom@18.3.1)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 '@emotion/hash': 0.8.0 '@emotion/unitless': 0.7.5 classnames: 2.5.1 csstype: 3.1.3 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) stylis: 4.3.2 '@ant-design/icons-svg@4.4.2': {} - '@ant-design/icons@5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@ant-design/icons@5.4.0(react-dom@18.3.1)(react@18.3.1)': dependencies: '@ant-design/colors': 7.1.0 '@ant-design/icons-svg': 4.4.2 '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -14266,7 +14267,7 @@ snapshots: '@aws-sdk/client-sso-oidc': 3.621.0(@aws-sdk/client-sts@3.621.0) '@aws-sdk/client-sts': 3.621.0 '@aws-sdk/core': 3.621.0 - '@aws-sdk/credential-provider-node': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0))(@aws-sdk/client-sts@3.621.0) + '@aws-sdk/credential-provider-node': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0)(@aws-sdk/client-sts@3.621.0) '@aws-sdk/middleware-bucket-endpoint': 3.620.0 '@aws-sdk/middleware-expect-continue': 3.620.0 '@aws-sdk/middleware-flexible-checksums': 3.620.0 @@ -14327,7 +14328,7 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-sdk/client-sts': 3.621.0 '@aws-sdk/core': 3.621.0 - '@aws-sdk/credential-provider-node': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0))(@aws-sdk/client-sts@3.621.0) + '@aws-sdk/credential-provider-node': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0)(@aws-sdk/client-sts@3.621.0) '@aws-sdk/middleware-host-header': 3.620.0 '@aws-sdk/middleware-logger': 3.609.0 '@aws-sdk/middleware-recursion-detection': 3.620.0 @@ -14415,7 +14416,7 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-sdk/client-sso-oidc': 3.621.0(@aws-sdk/client-sts@3.621.0) '@aws-sdk/core': 3.621.0 - '@aws-sdk/credential-provider-node': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0))(@aws-sdk/client-sts@3.621.0) + '@aws-sdk/credential-provider-node': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0)(@aws-sdk/client-sts@3.621.0) '@aws-sdk/middleware-host-header': 3.620.0 '@aws-sdk/middleware-logger': 3.609.0 '@aws-sdk/middleware-recursion-detection': 3.620.0 @@ -14485,13 +14486,13 @@ snapshots: '@smithy/util-stream': 3.1.3 tslib: 2.6.3 - '@aws-sdk/credential-provider-ini@3.621.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0))(@aws-sdk/client-sts@3.621.0)': + '@aws-sdk/credential-provider-ini@3.621.0(@aws-sdk/client-sso-oidc@3.621.0)(@aws-sdk/client-sts@3.621.0)': dependencies: '@aws-sdk/client-sts': 3.621.0 '@aws-sdk/credential-provider-env': 3.620.1 '@aws-sdk/credential-provider-http': 3.621.0 '@aws-sdk/credential-provider-process': 3.620.1 - '@aws-sdk/credential-provider-sso': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0)) + '@aws-sdk/credential-provider-sso': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0) '@aws-sdk/credential-provider-web-identity': 3.621.0(@aws-sdk/client-sts@3.621.0) '@aws-sdk/types': 3.609.0 '@smithy/credential-provider-imds': 3.2.0 @@ -14503,13 +14504,13 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-node@3.621.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0))(@aws-sdk/client-sts@3.621.0)': + '@aws-sdk/credential-provider-node@3.621.0(@aws-sdk/client-sso-oidc@3.621.0)(@aws-sdk/client-sts@3.621.0)': dependencies: '@aws-sdk/credential-provider-env': 3.620.1 '@aws-sdk/credential-provider-http': 3.621.0 - '@aws-sdk/credential-provider-ini': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0))(@aws-sdk/client-sts@3.621.0) + '@aws-sdk/credential-provider-ini': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0)(@aws-sdk/client-sts@3.621.0) '@aws-sdk/credential-provider-process': 3.620.1 - '@aws-sdk/credential-provider-sso': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0)) + '@aws-sdk/credential-provider-sso': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0) '@aws-sdk/credential-provider-web-identity': 3.621.0(@aws-sdk/client-sts@3.621.0) '@aws-sdk/types': 3.609.0 '@smithy/credential-provider-imds': 3.2.0 @@ -14530,10 +14531,10 @@ snapshots: '@smithy/types': 3.3.0 tslib: 2.6.3 - '@aws-sdk/credential-provider-sso@3.621.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0))': + '@aws-sdk/credential-provider-sso@3.621.0(@aws-sdk/client-sso-oidc@3.621.0)': dependencies: '@aws-sdk/client-sso': 3.621.0 - '@aws-sdk/token-providers': 3.614.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0)) + '@aws-sdk/token-providers': 3.614.0(@aws-sdk/client-sso-oidc@3.621.0) '@aws-sdk/types': 3.609.0 '@smithy/property-provider': 3.1.3 '@smithy/shared-ini-file-loader': 3.1.4 @@ -14661,7 +14662,7 @@ snapshots: '@smithy/types': 3.3.0 tslib: 2.6.3 - '@aws-sdk/token-providers@3.614.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0))': + '@aws-sdk/token-providers@3.614.0(@aws-sdk/client-sso-oidc@3.621.0)': dependencies: '@aws-sdk/client-sso-oidc': 3.621.0(@aws-sdk/client-sts@3.621.0) '@aws-sdk/types': 3.609.0 @@ -14729,7 +14730,7 @@ snapshots: '@babel/traverse': 7.25.2 '@babel/types': 7.25.2 convert-source-map: 2.0.0 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -15683,7 +15684,7 @@ snapshots: '@babel/parser': 7.25.0 '@babel/template': 7.25.0 '@babel/types': 7.25.2 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -15797,7 +15798,7 @@ snapshots: react: 18.3.1 tslib: 2.6.3 - '@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@dnd-kit/core@6.1.0(react-dom@18.3.1)(react@18.3.1)': dependencies: '@dnd-kit/accessibility': 3.1.0(react@18.3.1) '@dnd-kit/utilities': 3.2.2(react@18.3.1) @@ -15805,16 +15806,16 @@ snapshots: react-dom: 18.3.1(react@18.3.1) tslib: 2.6.3 - '@dnd-kit/modifiers@6.0.1(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@dnd-kit/modifiers@6.0.1(@dnd-kit/core@6.1.0)(react@18.3.1)': dependencies: - '@dnd-kit/core': 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dnd-kit/core': 6.1.0(react-dom@18.3.1)(react@18.3.1) '@dnd-kit/utilities': 3.2.2(react@18.3.1) react: 18.3.1 tslib: 2.6.3 - '@dnd-kit/sortable@7.0.2(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@dnd-kit/sortable@7.0.2(@dnd-kit/core@6.1.0)(react@18.3.1)': dependencies: - '@dnd-kit/core': 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dnd-kit/core': 6.1.0(react-dom@18.3.1)(react@18.3.1) '@dnd-kit/utilities': 3.2.2(react@18.3.1) react: 18.3.1 tslib: 2.6.3 @@ -15919,7 +15920,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.1 @@ -16274,11 +16275,11 @@ snapshots: '@gar/promisify@1.1.3': {} - '@google-cloud/firestore@7.9.0(encoding@0.1.13)': + '@google-cloud/firestore@7.9.0': dependencies: fast-deep-equal: 3.1.3 functional-red-black-tree: 1.0.1 - google-gax: 4.3.8(encoding@0.1.13) + google-gax: 4.3.8 protobufjs: 7.3.2 transitivePeerDependencies: - encoding @@ -16297,14 +16298,14 @@ snapshots: '@google-cloud/promisify@4.0.0': optional: true - '@google-cloud/scheduler@4.3.0(encoding@0.1.13)': + '@google-cloud/scheduler@4.3.0': dependencies: - google-gax: 4.3.8(encoding@0.1.13) + google-gax: 4.3.8 transitivePeerDependencies: - encoding - supports-color - '@google-cloud/storage@7.12.1(encoding@0.1.13)': + '@google-cloud/storage@7.12.1': dependencies: '@google-cloud/paginator': 5.0.2 '@google-cloud/projectify': 4.0.0 @@ -16313,13 +16314,13 @@ snapshots: async-retry: 1.3.3 duplexify: 4.1.3 fast-xml-parser: 4.4.1 - gaxios: 6.7.0(encoding@0.1.13) - google-auth-library: 9.12.0(encoding@0.1.13) + gaxios: 6.7.0 + google-auth-library: 9.12.0 html-entities: 2.5.2 mime: 3.0.0 p-limit: 3.1.0 - retry-request: 7.0.2(encoding@0.1.13) - teeny-request: 9.0.0(encoding@0.1.13) + retry-request: 7.0.2 + teeny-request: 9.0.0 uuid: 8.3.2 transitivePeerDependencies: - encoding @@ -16343,7 +16344,7 @@ snapshots: protobufjs: 7.3.2 yargs: 17.7.2 - '@hubspot/api-client@11.1.0(encoding@0.1.13)': + '@hubspot/api-client@11.1.0': dependencies: '@types/node-fetch': 2.6.11 bottleneck: 2.19.5 @@ -16351,7 +16352,7 @@ snapshots: form-data: 2.5.1 lodash.get: 4.4.2 lodash.merge: 4.6.2 - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 url-parse: 1.5.10 transitivePeerDependencies: - encoding @@ -16359,7 +16360,7 @@ snapshots: '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -16426,7 +16427,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))': + '@jest/core@27.5.1(ts-node@10.9.2)': dependencies: '@jest/console': 27.5.1 '@jest/reporters': 27.5.1 @@ -16440,7 +16441,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 27.5.1 - jest-config: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-config: 27.5.1(ts-node@10.9.2) jest-haste-map: 27.5.1 jest-message-util: 27.5.1 jest-regex-util: 27.5.1 @@ -16463,7 +16464,7 @@ snapshots: - ts-node - utf-8-validate - '@jest/core@28.1.3(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))': + '@jest/core@28.1.3(ts-node@10.9.2)': dependencies: '@jest/console': 28.1.3 '@jest/reporters': 28.1.3 @@ -16477,7 +16478,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 28.1.3 - jest-config: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-config: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2) jest-haste-map: 28.1.3 jest-message-util: 28.1.3 jest-regex-util: 28.0.2 @@ -16498,77 +16499,7 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))': - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.19.42 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.9.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.7 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - - '@jest/core@29.7.0(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4))': - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.19.42 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.9.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.7 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - - '@jest/core@29.7.0(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))': + '@jest/core@29.7.0(ts-node@10.9.2)': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -16582,7 +16513,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -16997,12 +16928,12 @@ snapshots: dependencies: '@lukeed/csprng': 1.1.0 - '@mapbox/node-pre-gyp@1.0.11(encoding@0.1.13)': + '@mapbox/node-pre-gyp@1.0.11': dependencies: detect-libc: 2.0.3 https-proxy-agent: 5.0.1 make-dir: 3.1.0 - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 @@ -17022,7 +16953,7 @@ snapshots: monaco-editor: 0.50.0 state-local: 1.0.7 - '@monaco-editor/react@4.6.0(monaco-editor@0.50.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@monaco-editor/react@4.6.0(monaco-editor@0.50.0)(react-dom@18.3.1)(react@18.3.1)': dependencies: '@monaco-editor/loader': 1.4.0(monaco-editor@0.50.0) monaco-editor: 0.50.0 @@ -17302,11 +17233,11 @@ snapshots: dependencies: '@octokit/types': 6.41.0 - '@octokit/core@3.6.0(encoding@0.1.13)': + '@octokit/core@3.6.0': dependencies: '@octokit/auth-token': 2.5.0 - '@octokit/graphql': 4.8.0(encoding@0.1.13) - '@octokit/request': 5.6.3(encoding@0.1.13) + '@octokit/graphql': 4.8.0 + '@octokit/request': 5.6.3 '@octokit/request-error': 2.1.0 '@octokit/types': 6.41.0 before-after-hook: 2.2.3 @@ -17320,9 +17251,9 @@ snapshots: is-plain-object: 5.0.0 universal-user-agent: 6.0.1 - '@octokit/graphql@4.8.0(encoding@0.1.13)': + '@octokit/graphql@4.8.0': dependencies: - '@octokit/request': 5.6.3(encoding@0.1.13) + '@octokit/request': 5.6.3 '@octokit/types': 6.41.0 universal-user-agent: 6.0.1 transitivePeerDependencies: @@ -17330,18 +17261,18 @@ snapshots: '@octokit/openapi-types@12.11.0': {} - '@octokit/plugin-paginate-rest@2.21.3(@octokit/core@3.6.0(encoding@0.1.13))': + '@octokit/plugin-paginate-rest@2.21.3(@octokit/core@3.6.0)': dependencies: - '@octokit/core': 3.6.0(encoding@0.1.13) + '@octokit/core': 3.6.0 '@octokit/types': 6.41.0 - '@octokit/plugin-request-log@1.0.4(@octokit/core@3.6.0(encoding@0.1.13))': + '@octokit/plugin-request-log@1.0.4(@octokit/core@3.6.0)': dependencies: - '@octokit/core': 3.6.0(encoding@0.1.13) + '@octokit/core': 3.6.0 - '@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0(encoding@0.1.13))': + '@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0)': dependencies: - '@octokit/core': 3.6.0(encoding@0.1.13) + '@octokit/core': 3.6.0 '@octokit/types': 6.41.0 deprecation: 2.3.1 @@ -17351,23 +17282,23 @@ snapshots: deprecation: 2.3.1 once: 1.4.0 - '@octokit/request@5.6.3(encoding@0.1.13)': + '@octokit/request@5.6.3': dependencies: '@octokit/endpoint': 6.0.12 '@octokit/request-error': 2.1.0 '@octokit/types': 6.41.0 is-plain-object: 5.0.0 - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 universal-user-agent: 6.0.1 transitivePeerDependencies: - encoding - '@octokit/rest@18.12.0(encoding@0.1.13)': + '@octokit/rest@18.12.0': dependencies: - '@octokit/core': 3.6.0(encoding@0.1.13) - '@octokit/plugin-paginate-rest': 2.21.3(@octokit/core@3.6.0(encoding@0.1.13)) - '@octokit/plugin-request-log': 1.0.4(@octokit/core@3.6.0(encoding@0.1.13)) - '@octokit/plugin-rest-endpoint-methods': 5.16.2(@octokit/core@3.6.0(encoding@0.1.13)) + '@octokit/core': 3.6.0 + '@octokit/plugin-paginate-rest': 2.21.3(@octokit/core@3.6.0) + '@octokit/plugin-request-log': 1.0.4(@octokit/core@3.6.0) + '@octokit/plugin-rest-endpoint-methods': 5.16.2(@octokit/core@3.6.0) transitivePeerDependencies: - encoding @@ -17388,7 +17319,7 @@ snapshots: dependencies: playwright: 1.39.0 - '@pmmmwh/react-refresh-webpack-plugin@0.5.15(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@3.13.1)(webpack-dev-server@4.15.2(webpack@5.93.0))(webpack@5.93.0)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.15(react-refresh@0.11.0)(webpack-dev-server@4.15.2)(webpack@5.93.0)': dependencies: ansi-html: 0.0.9 core-js-pure: 3.37.1 @@ -17398,14 +17329,11 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.2.0 source-map: 0.7.4 - webpack: 5.93.0 - optionalDependencies: - '@types/webpack': 5.28.5 - type-fest: 3.13.1 + webpack: 5.93.0(webpack-cli@5.1.4) webpack-dev-server: 4.15.2(webpack@5.93.0) '@prisma/client@5.17.0(prisma@5.17.0)': - optionalDependencies: + dependencies: prisma: 5.17.0 '@prisma/debug@3.8.1': @@ -17469,19 +17397,19 @@ snapshots: dependencies: '@babel/runtime': 7.25.0 - '@rc-component/color-picker@1.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@rc-component/color-picker@1.5.3(react-dom@18.3.1)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 '@ctrl/tinycolor': 3.6.1 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@rc-component/context@1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@rc-component/context@1.4.0(react-dom@18.3.1)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -17489,48 +17417,48 @@ snapshots: dependencies: '@babel/runtime': 7.25.0 - '@rc-component/mutate-observer@1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@rc-component/mutate-observer@1.1.0(react-dom@18.3.1)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@rc-component/portal@1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@rc-component/portal@1.1.2(react-dom@18.3.1)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@rc-component/qrcode@1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@rc-component/qrcode@1.0.0(react-dom@18.3.1)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@rc-component/tour@1.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@rc-component/tour@1.15.0(react-dom@18.3.1)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 - '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) + '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@rc-component/trigger@2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@rc-component/trigger@2.2.0(react-dom@18.3.1)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 - '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -17555,7 +17483,7 @@ snapshots: dependencies: react: 18.3.1 - '@react-email/components@0.0.25(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-email/components@0.0.25(react-dom@18.3.1)(react@18.3.1)': dependencies: '@react-email/body': 0.0.10(react@18.3.1) '@react-email/button': 0.0.17(react@18.3.1) @@ -17572,7 +17500,7 @@ snapshots: '@react-email/link': 0.0.10(react@18.3.1) '@react-email/markdown': 0.0.12(react@18.3.1) '@react-email/preview': 0.0.11(react@18.3.1) - '@react-email/render': 1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-email/render': 1.0.1(react-dom@18.3.1)(react@18.3.1) '@react-email/row': 0.0.10(react@18.3.1) '@react-email/section': 0.0.14(react@18.3.1) '@react-email/tailwind': 0.1.0(react@18.3.1) @@ -17622,7 +17550,7 @@ snapshots: dependencies: react: 18.3.1 - '@react-email/render@0.0.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-email/render@0.0.17(react-dom@18.3.1)(react@18.3.1)': dependencies: html-to-text: 9.0.5 js-beautify: 1.15.1 @@ -17630,7 +17558,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-promise-suspense: 0.3.4 - '@react-email/render@1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-email/render@1.0.1(react-dom@18.3.1)(react@18.3.1)': dependencies: html-to-text: 9.0.5 js-beautify: 1.15.1 @@ -17656,22 +17584,22 @@ snapshots: '@remix-run/router@1.18.0': {} - '@rjsf/antd@5.19.4(@ant-design/icons@5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rjsf/core@5.10.0(@rjsf/utils@5.10.0(react@18.3.1))(react@18.3.1))(@rjsf/utils@5.10.0(react@18.3.1))(antd@5.19.4(date-fns@2.30.0)(moment@2.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@rjsf/antd@5.19.4(@ant-design/icons@5.4.0)(@rjsf/core@5.10.0)(@rjsf/utils@5.10.0)(antd@5.19.4)(dayjs@1.11.12)(react-dom@18.3.1)(react@18.3.1)': dependencies: - '@ant-design/icons': 5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rjsf/core': 5.10.0(@rjsf/utils@5.10.0(react@18.3.1))(react@18.3.1) + '@ant-design/icons': 5.4.0(react-dom@18.3.1)(react@18.3.1) + '@rjsf/core': 5.10.0(@rjsf/utils@5.10.0)(react@18.3.1) '@rjsf/utils': 5.10.0(react@18.3.1) - antd: 5.19.4(date-fns@2.30.0)(moment@2.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + antd: 5.19.4(react-dom@18.3.1)(react@18.3.1) classnames: 2.5.1 dayjs: 1.11.12 lodash: 4.17.21 lodash-es: 4.17.21 - rc-picker: 2.7.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-picker: 2.7.6(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 transitivePeerDependencies: - react-dom - '@rjsf/core@5.10.0(@rjsf/utils@5.10.0(react@18.3.1))(react@18.3.1)': + '@rjsf/core@5.10.0(@rjsf/utils@5.10.0)(react@18.3.1)': dependencies: '@rjsf/utils': 5.10.0(react@18.3.1) lodash: 4.17.21 @@ -17690,7 +17618,7 @@ snapshots: react: 18.3.1 react-is: 18.3.1 - '@rjsf/validator-ajv6@5.10.0(@rjsf/utils@5.10.0(react@18.3.1))': + '@rjsf/validator-ajv6@5.10.0(@rjsf/utils@5.10.0)': dependencies: '@rjsf/utils': 5.10.0(react@18.3.1) ajv: 6.12.6 @@ -17702,14 +17630,12 @@ snapshots: rollup: 1.32.1 slash: 3.0.0 - '@rollup/plugin-babel@5.3.1(@babel/core@7.25.2)(@types/babel__core@7.20.5)(rollup@2.79.1)': + '@rollup/plugin-babel@5.3.1(@babel/core@7.25.2)(rollup@2.79.1)': dependencies: '@babel/core': 7.25.2 '@babel/helper-module-imports': 7.24.7 '@rollup/pluginutils': 3.1.0(rollup@2.79.1) rollup: 2.79.1 - optionalDependencies: - '@types/babel__core': 7.20.5 transitivePeerDependencies: - supports-color @@ -17732,7 +17658,6 @@ snapshots: glob: 8.1.0 is-reference: 1.2.1 magic-string: 0.27.0 - optionalDependencies: rollup: 3.29.4 '@rollup/plugin-commonjs@24.0.0(rollup@2.78.0)': @@ -17743,7 +17668,6 @@ snapshots: glob: 8.1.0 is-reference: 1.2.1 magic-string: 0.27.0 - optionalDependencies: rollup: 2.78.0 '@rollup/plugin-commonjs@25.0.8(rollup@3.29.4)': @@ -17754,7 +17678,6 @@ snapshots: glob: 8.1.0 is-reference: 1.2.1 magic-string: 0.30.11 - optionalDependencies: rollup: 3.29.4 '@rollup/plugin-json@4.1.0(rollup@1.32.1)': @@ -17765,20 +17688,17 @@ snapshots: '@rollup/plugin-json@5.0.2(rollup@3.29.4)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@3.29.4) - optionalDependencies: rollup: 3.29.4 '@rollup/plugin-json@6.1.0(rollup@3.29.4)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@3.29.4) - optionalDependencies: rollup: 3.29.4 '@rollup/plugin-multi-entry@6.0.1(rollup@3.29.4)': dependencies: '@rollup/plugin-virtual': 3.0.2(rollup@3.29.4) matched: 5.0.1 - optionalDependencies: rollup: 3.29.4 '@rollup/plugin-node-resolve@11.2.1(rollup@2.79.1)': @@ -17799,7 +17719,6 @@ snapshots: is-builtin-module: 3.2.1 is-module: 1.0.0 resolve: 1.22.8 - optionalDependencies: rollup: 3.29.4 '@rollup/plugin-node-resolve@6.1.0(rollup@1.32.1)': @@ -17821,43 +17740,38 @@ snapshots: dependencies: '@rollup/pluginutils': 5.1.0(rollup@3.29.4) magic-string: 0.30.11 - optionalDependencies: rollup: 3.29.4 '@rollup/plugin-terser@0.1.0(rollup@3.29.4)': dependencies: - terser: 5.31.3 - optionalDependencies: rollup: 3.29.4 + terser: 5.31.3 '@rollup/plugin-terser@0.4.4(rollup@3.29.4)': dependencies: + rollup: 3.29.4 serialize-javascript: 6.0.2 smob: 1.5.0 terser: 5.31.3 - optionalDependencies: - rollup: 3.29.4 '@rollup/plugin-typescript@11.1.6(rollup@3.29.4)(tslib@2.6.3)(typescript@5.5.4)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@3.29.4) resolve: 1.22.8 - typescript: 5.5.4 - optionalDependencies: rollup: 3.29.4 tslib: 2.6.3 + typescript: 5.5.4 '@rollup/plugin-typescript@11.1.6(rollup@4.19.1)(tslib@2.6.3)(typescript@5.5.4)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.19.1) resolve: 1.22.8 - typescript: 5.5.4 - optionalDependencies: rollup: 4.19.1 tslib: 2.6.3 + typescript: 5.5.4 '@rollup/plugin-virtual@3.0.2(rollup@3.29.4)': - optionalDependencies: + dependencies: rollup: 3.29.4 '@rollup/pluginutils@3.1.0(rollup@1.32.1)': @@ -17884,7 +17798,6 @@ snapshots: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 - optionalDependencies: rollup: 2.78.0 '@rollup/pluginutils@5.1.0(rollup@3.29.4)': @@ -17892,7 +17805,6 @@ snapshots: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 - optionalDependencies: rollup: 3.29.4 '@rollup/pluginutils@5.1.0(rollup@4.19.1)': @@ -17900,7 +17812,6 @@ snapshots: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 - optionalDependencies: rollup: 4.19.1 '@rollup/rollup-android-arm-eabi@4.19.1': @@ -17964,7 +17875,7 @@ snapshots: dependencies: tslib: 2.6.3 - '@segment/analytics-next@1.72.1(encoding@0.1.13)': + '@segment/analytics-next@1.72.1': dependencies: '@lukeed/uuid': 2.0.1 '@segment/analytics-core': 1.6.0 @@ -17973,7 +17884,7 @@ snapshots: '@segment/facade': 3.4.10 dset: 3.1.3 js-cookie: 3.0.1 - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 tslib: 2.6.3 unfetch: 4.2.0 transitivePeerDependencies: @@ -18037,11 +17948,11 @@ snapshots: '@sentry/types': 7.118.0 '@sentry/utils': 7.118.0 - '@sentry/cli@1.77.3(encoding@0.1.13)': + '@sentry/cli@1.77.3': dependencies: https-proxy-agent: 5.0.1 mkdirp: 0.5.6 - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 progress: 2.0.3 proxy-from-env: 1.1.0 which: 2.0.2 @@ -18061,7 +17972,7 @@ snapshots: '@sentry/utils': 7.118.0 localforage: 1.10.0 - '@sentry/nextjs@7.118.0(encoding@0.1.13)(next@14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.93.0)': + '@sentry/nextjs@7.118.0(next@14.2.5)(react@18.3.1)(webpack@5.93.0)': dependencies: '@rollup/plugin-commonjs': 24.0.0(rollup@2.78.0) '@sentry/core': 7.118.0 @@ -18071,15 +17982,14 @@ snapshots: '@sentry/types': 7.118.0 '@sentry/utils': 7.118.0 '@sentry/vercel-edge': 7.118.0 - '@sentry/webpack-plugin': 1.21.0(encoding@0.1.13) + '@sentry/webpack-plugin': 1.21.0 chalk: 3.0.0 - next: 14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.5(@babel/core@7.25.2)(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 resolve: 1.22.8 rollup: 2.78.0 stacktrace-parser: 0.1.10 - optionalDependencies: - webpack: 5.93.0 + webpack: 5.93.0(webpack-cli@5.1.4) transitivePeerDependencies: - encoding - supports-color @@ -18122,9 +18032,9 @@ snapshots: '@sentry/types': 7.118.0 '@sentry/utils': 7.118.0 - '@sentry/webpack-plugin@1.21.0(encoding@0.1.13)': + '@sentry/webpack-plugin@1.21.0': dependencies: - '@sentry/cli': 1.77.3(encoding@0.1.13) + '@sentry/cli': 1.77.3 webpack-sources: 3.2.3 transitivePeerDependencies: - encoding @@ -18604,23 +18514,22 @@ snapshots: '@swc/counter': 0.1.3 tslib: 2.6.3 - '@tailwindcss/typography@0.5.13(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))': + '@tailwindcss/typography@0.5.13(tailwindcss@3.4.7)': dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + tailwindcss: 3.4.7(ts-node@10.9.2) '@tanstack/query-core@4.36.1': {} - '@tanstack/react-query@4.36.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-query@4.36.1(react-dom@18.3.1)(react@18.3.1)': dependencies: '@tanstack/query-core': 4.36.1 react: 18.3.1 - use-sync-external-store: 1.2.2(react@18.3.1) - optionalDependencies: react-dom: 18.3.1(react@18.3.1) + use-sync-external-store: 1.2.2(react@18.3.1) '@testing-library/dom@10.4.0': dependencies: @@ -18655,7 +18564,7 @@ snapshots: lodash: 4.17.21 redent: 3.0.0 - '@testing-library/react@13.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@testing-library/react@13.4.0(react-dom@18.3.1)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 '@testing-library/dom': 8.20.1 @@ -19073,23 +18982,11 @@ snapshots: '@types/webidl-conversions@7.0.3': {} - '@types/webpack@5.28.5': - dependencies: - '@types/node': 18.19.42 - tapable: 2.2.1 - webpack: 5.93.0 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - webpack-cli - optional: true - - '@types/webpack@5.28.5(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))': + '@types/webpack@5.28.5(webpack-cli@5.1.4)': dependencies: '@types/node': 18.19.42 tapable: 2.2.1 - webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) + webpack: 5.93.0(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -19114,7 +19011,7 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@eslint-community/regexpp': 4.11.0 '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) @@ -19128,12 +19025,11 @@ snapshots: natural-compare-lite: 1.4.0 semver: 7.6.3 tsutils: 3.21.0(typescript@5.5.4) - optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@eslint-community/regexpp': 4.11.0 '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) @@ -19146,7 +19042,6 @@ snapshots: ignore: 5.3.1 natural-compare: 1.4.0 ts-api-utils: 1.3.0(typescript@5.5.4) - optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -19166,7 +19061,6 @@ snapshots: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) debug: 4.3.6(supports-color@5.5.0) eslint: 8.57.0 - optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -19179,7 +19073,6 @@ snapshots: '@typescript-eslint/visitor-keys': 7.18.0 debug: 4.3.6(supports-color@5.5.0) eslint: 8.57.0 - optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -19190,9 +19083,8 @@ snapshots: '@typescript-eslint/types': 7.2.0 '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.5.4) '@typescript-eslint/visitor-keys': 7.2.0 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) eslint: 8.57.0 - optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -19219,7 +19111,6 @@ snapshots: debug: 4.3.6(supports-color@5.5.0) eslint: 8.57.0 tsutils: 3.21.0(typescript@5.5.4) - optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -19231,7 +19122,6 @@ snapshots: debug: 4.3.6(supports-color@5.5.0) eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.5.4) - optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -19251,7 +19141,6 @@ snapshots: is-glob: 4.0.3 semver: 7.6.3 tsutils: 3.21.0(typescript@5.5.4) - optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -19266,7 +19155,6 @@ snapshots: minimatch: 9.0.5 semver: 7.6.3 ts-api-utils: 1.3.0(typescript@5.5.4) - optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -19275,13 +19163,12 @@ snapshots: dependencies: '@typescript-eslint/types': 7.2.0 '@typescript-eslint/visitor-keys': 7.2.0 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 semver: 7.6.3 ts-api-utils: 1.3.0(typescript@5.5.4) - optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -19333,7 +19220,7 @@ snapshots: '@vercel/error-utils@2.0.2': {} - '@vercel/fun@1.1.0(encoding@0.1.13)': + '@vercel/fun@1.1.0': dependencies: '@tootallnate/once': 2.0.0 async-listen: 1.2.0 @@ -19343,7 +19230,7 @@ snapshots: generic-pool: 3.4.2 micro: 9.3.5-canary.3 ms: 2.1.1 - node-fetch: 2.6.7(encoding@0.1.13) + node-fetch: 2.6.7 path-match: 1.2.4 promisepipe: 3.0.0 semver: 7.3.5 @@ -19379,16 +19266,16 @@ snapshots: '@vercel/static-config': 3.0.0 ts-morph: 12.0.0 - '@vercel/next@4.3.6(encoding@0.1.13)': + '@vercel/next@4.3.6': dependencies: - '@vercel/nft': 0.27.3(encoding@0.1.13) + '@vercel/nft': 0.27.3 transitivePeerDependencies: - encoding - supports-color - '@vercel/nft@0.27.3(encoding@0.1.13)': + '@vercel/nft@0.27.3': dependencies: - '@mapbox/node-pre-gyp': 1.0.11(encoding@0.1.13) + '@mapbox/node-pre-gyp': 1.0.11 '@rollup/pluginutils': 4.2.1 acorn: 8.12.1 acorn-import-attributes: 1.9.5(acorn@8.12.1) @@ -19404,7 +19291,7 @@ snapshots: - encoding - supports-color - '@vercel/node@3.2.8(encoding@0.1.13)': + '@vercel/node@3.2.8': dependencies: '@edge-runtime/node-utils': 2.3.0 '@edge-runtime/primitives': 4.1.0 @@ -19412,7 +19299,7 @@ snapshots: '@types/node': 16.18.11 '@vercel/build-utils': 8.3.6 '@vercel/error-utils': 2.0.2 - '@vercel/nft': 0.27.3(encoding@0.1.13) + '@vercel/nft': 0.27.3 '@vercel/static-config': 3.0.0 async-listen: 3.0.0 cjs-module-lexer: 1.2.3 @@ -19420,7 +19307,7 @@ snapshots: es-module-lexer: 1.4.1 esbuild: 0.14.47 etag: 1.8.1 - node-fetch: 2.6.9(encoding@0.1.13) + node-fetch: 2.6.9 path-to-regexp: 6.2.1 ts-morph: 12.0.0 ts-node: 10.9.1(@types/node@16.18.11)(typescript@4.9.5) @@ -19434,9 +19321,9 @@ snapshots: '@vercel/python@4.3.1': {} - '@vercel/redwood@2.1.3(encoding@0.1.13)': + '@vercel/redwood@2.1.3': dependencies: - '@vercel/nft': 0.27.3(encoding@0.1.13) + '@vercel/nft': 0.27.3 '@vercel/routing-utils': 3.1.0 '@vercel/static-config': 3.0.0 semver: 6.3.1 @@ -19445,10 +19332,10 @@ snapshots: - encoding - supports-color - '@vercel/remix-builder@2.2.3(encoding@0.1.13)': + '@vercel/remix-builder@2.2.3': dependencies: '@vercel/error-utils': 2.0.2 - '@vercel/nft': 0.27.3(encoding@0.1.13) + '@vercel/nft': 0.27.3 '@vercel/static-config': 3.0.0 ts-morph: 12.0.0 transitivePeerDependencies: @@ -19552,33 +19439,32 @@ snapshots: '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)))': + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.93.0)': dependencies: - webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) + webpack: 5.93.0(webpack-cli@5.1.4) webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) - '@webpack-cli/generators@3.0.7(encoding@0.1.13)(mem-fs@2.3.0)(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0)': + '@webpack-cli/generators@3.0.7(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0)': dependencies: - webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) + prettier: 2.8.8 + webpack: 5.93.0(webpack-cli@5.1.4) webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) yeoman-environment: 3.19.3 - yeoman-generator: 5.10.0(encoding@0.1.13)(mem-fs@2.3.0)(yeoman-environment@3.19.3) - optionalDependencies: - prettier: 2.8.8 + yeoman-generator: 5.10.0(yeoman-environment@3.19.3) transitivePeerDependencies: - bluebird - encoding - mem-fs - supports-color - '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)))': + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.93.0)': dependencies: - webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) + webpack: 5.93.0(webpack-cli@5.1.4) webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)))': + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.93.0)': dependencies: - webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) + webpack: 5.93.0(webpack-cli@5.1.4) webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) '@xobotyi/scrollbar-width@1.9.5': {} @@ -19634,13 +19520,13 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) transitivePeerDependencies: - supports-color agent-base@7.1.1: dependencies: - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -19658,7 +19544,7 @@ snapshots: indent-string: 4.0.0 ajv-formats@2.1.1(ajv@8.12.0): - optionalDependencies: + dependencies: ajv: 8.12.0 ajv-keywords@3.5.2(ajv@6.12.6): @@ -19744,55 +19630,55 @@ snapshots: dependencies: entities: 2.2.0 - antd@5.19.4(date-fns@2.30.0)(moment@2.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + antd@5.19.4(react-dom@18.3.1)(react@18.3.1): dependencies: '@ant-design/colors': 7.1.0 - '@ant-design/cssinjs': 1.21.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@ant-design/cssinjs-utils': 1.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@ant-design/icons': 5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/cssinjs': 1.21.0(react-dom@18.3.1)(react@18.3.1) + '@ant-design/cssinjs-utils': 1.0.3(react-dom@18.3.1)(react@18.3.1) + '@ant-design/icons': 5.4.0(react-dom@18.3.1)(react@18.3.1) '@ant-design/react-slick': 1.1.2(react@18.3.1) '@babel/runtime': 7.25.0 '@ctrl/tinycolor': 3.6.1 - '@rc-component/color-picker': 1.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rc-component/mutate-observer': 1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rc-component/qrcode': 1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rc-component/tour': 1.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/color-picker': 1.5.3(react-dom@18.3.1)(react@18.3.1) + '@rc-component/mutate-observer': 1.1.0(react-dom@18.3.1)(react@18.3.1) + '@rc-component/qrcode': 1.0.0(react-dom@18.3.1)(react@18.3.1) + '@rc-component/tour': 1.15.0(react-dom@18.3.1)(react@18.3.1) + '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) classnames: 2.5.1 copy-to-clipboard: 3.3.3 dayjs: 1.11.12 - rc-cascader: 3.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-checkbox: 3.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-collapse: 3.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-dialog: 9.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-drawer: 7.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-dropdown: 4.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-field-form: 2.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-image: 7.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-input: 1.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-input-number: 9.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-mentions: 2.14.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-menu: 9.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-notification: 5.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-pagination: 4.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-picker: 4.6.11(date-fns@2.30.0)(dayjs@1.11.12)(moment@2.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-progress: 4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-rate: 2.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-segmented: 2.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-select: 14.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-slider: 10.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-steps: 6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-switch: 4.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-table: 7.45.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tabs: 15.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-textarea: 1.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tooltip: 6.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tree: 5.8.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tree-select: 5.22.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-upload: 4.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-cascader: 3.27.0(react-dom@18.3.1)(react@18.3.1) + rc-checkbox: 3.3.0(react-dom@18.3.1)(react@18.3.1) + rc-collapse: 3.7.3(react-dom@18.3.1)(react@18.3.1) + rc-dialog: 9.5.2(react-dom@18.3.1)(react@18.3.1) + rc-drawer: 7.2.0(react-dom@18.3.1)(react@18.3.1) + rc-dropdown: 4.2.0(react-dom@18.3.1)(react@18.3.1) + rc-field-form: 2.2.1(react-dom@18.3.1)(react@18.3.1) + rc-image: 7.9.0(react-dom@18.3.1)(react@18.3.1) + rc-input: 1.5.1(react-dom@18.3.1)(react@18.3.1) + rc-input-number: 9.1.0(react-dom@18.3.1)(react@18.3.1) + rc-mentions: 2.14.0(react-dom@18.3.1)(react@18.3.1) + rc-menu: 9.14.1(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) + rc-notification: 5.6.0(react-dom@18.3.1)(react@18.3.1) + rc-pagination: 4.2.0(react-dom@18.3.1)(react@18.3.1) + rc-picker: 4.6.11(dayjs@1.11.12)(react-dom@18.3.1)(react@18.3.1) + rc-progress: 4.0.0(react-dom@18.3.1)(react@18.3.1) + rc-rate: 2.13.0(react-dom@18.3.1)(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) + rc-segmented: 2.3.0(react-dom@18.3.1)(react@18.3.1) + rc-select: 14.15.1(react-dom@18.3.1)(react@18.3.1) + rc-slider: 10.6.2(react-dom@18.3.1)(react@18.3.1) + rc-steps: 6.0.1(react-dom@18.3.1)(react@18.3.1) + rc-switch: 4.1.0(react-dom@18.3.1)(react@18.3.1) + rc-table: 7.45.7(react-dom@18.3.1)(react@18.3.1) + rc-tabs: 15.1.1(react-dom@18.3.1)(react@18.3.1) + rc-textarea: 1.7.0(react-dom@18.3.1)(react@18.3.1) + rc-tooltip: 6.2.0(react-dom@18.3.1)(react@18.3.1) + rc-tree: 5.8.8(react-dom@18.3.1)(react@18.3.1) + rc-tree-select: 5.22.1(react-dom@18.3.1)(react@18.3.1) + rc-upload: 4.6.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) scroll-into-view-if-needed: 3.1.0 @@ -20105,21 +19991,14 @@ snapshots: loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.93.0 - - babel-loader@9.1.3(@babel/core@7.25.2)(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))): - dependencies: - '@babel/core': 7.25.2 - find-cache-dir: 4.0.0 - schema-utils: 4.2.0 - webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) + webpack: 5.93.0(webpack-cli@5.1.4) babel-loader@9.1.3(@babel/core@7.25.2)(webpack@5.93.0): dependencies: '@babel/core': 7.25.2 find-cache-dir: 4.0.0 schema-utils: 4.2.0 - webpack: 5.93.0 + webpack: 5.93.0(webpack-cli@5.1.4) babel-plugin-istanbul@6.1.1: dependencies: @@ -20659,10 +20538,10 @@ snapshots: clean-stack@2.2.0: {} - clean-webpack-plugin@4.0.0(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))): + clean-webpack-plugin@4.0.0(webpack@5.93.0): dependencies: del: 4.1.1 - webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) + webpack: 5.93.0(webpack-cli@5.1.4) cli-boxes@3.0.0: {} @@ -20886,7 +20765,7 @@ snapshots: dependencies: toggle-selection: 1.0.6 - copy-webpack-plugin@12.0.2(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))): + copy-webpack-plugin@12.0.2(webpack@5.93.0): dependencies: fast-glob: 3.3.2 glob-parent: 6.0.2 @@ -20894,7 +20773,7 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) + webpack: 5.93.0(webpack-cli@5.1.4) core-js-compat@3.37.1: dependencies: @@ -20951,43 +20830,13 @@ snapshots: crc-32: 1.2.2 readable-stream: 3.6.2 - create-jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)): - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - create-jest@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - create-jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + create-jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -20998,15 +20847,15 @@ snapshots: create-require@1.1.1: {} - cross-fetch@3.1.8(encoding@0.1.13): + cross-fetch@3.1.8: dependencies: - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 transitivePeerDependencies: - encoding - cross-fetch@4.0.0(encoding@0.1.13): + cross-fetch@4.0.0: dependencies: - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 transitivePeerDependencies: - encoding @@ -21055,8 +20904,7 @@ snapshots: postcss-modules-values: 4.0.0(postcss@8.4.41) postcss-value-parser: 4.2.0 semver: 7.6.3 - optionalDependencies: - webpack: 5.93.0 + webpack: 5.93.0(webpack-cli@5.1.4) css-minimizer-webpack-plugin@3.4.1(webpack@5.93.0): dependencies: @@ -21066,7 +20914,7 @@ snapshots: schema-utils: 4.2.0 serialize-javascript: 6.0.2 source-map: 0.6.1 - webpack: 5.93.0 + webpack: 5.93.0(webpack-cli@5.1.4) css-modules-loader-core@1.1.0: dependencies: @@ -21336,14 +21184,9 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.3.6: - dependencies: - ms: 2.1.2 - debug@4.3.6(supports-color@5.5.0): dependencies: ms: 2.1.2 - optionalDependencies: supports-color: 5.5.0 debuglog@1.0.1: {} @@ -21364,9 +21207,7 @@ snapshots: dedent@0.7.0: {} - dedent@1.5.3(babel-plugin-macros@3.1.0): - optionalDependencies: - babel-plugin-macros: 3.1.0 + dedent@1.5.3: {} deep-equal@2.2.3: dependencies: @@ -21708,7 +21549,7 @@ snapshots: base64id: 2.0.0 cookie: 0.4.1 cors: 2.8.5 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) engine.io-parser: 5.2.3 ws: 8.17.1 transitivePeerDependencies: @@ -22005,12 +21846,11 @@ snapshots: '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) - optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - eslint-import-resolver-webpack @@ -22020,24 +21860,23 @@ snapshots: dependencies: eslint: 8.57.0 - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(eslint@8.57.0)(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4): + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0)(jest@27.5.1)(typescript@5.5.4): dependencies: '@babel/core': 7.25.2 '@babel/eslint-parser': 7.25.1(@babel/core@7.25.2)(eslint@8.57.0) '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 eslint: 8.57.0 - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4) + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0)(eslint@8.57.0) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.57.0)(jest@27.5.1)(typescript@5.5.4) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) eslint-plugin-testing-library: 5.11.1(eslint@8.57.0)(typescript@5.5.4) - optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - '@babel/plugin-syntax-flow' @@ -22055,13 +21894,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): dependencies: - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) enhanced-resolve: 5.17.1 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.6 is-core-module: 2.15.0 @@ -22072,28 +21911,26 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): dependencies: - debug: 3.2.7 - optionalDependencies: '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + debug: 3.2.7 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): dependencies: - debug: 3.2.7 - optionalDependencies: '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4) + debug: 3.2.7 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) transitivePeerDependencies: - supports-color - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(eslint@8.57.0): + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0): dependencies: '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.25.2) '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2) @@ -22101,8 +21938,9 @@ snapshots: lodash: 4.17.21 string-natural-compare: 3.0.1 - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0)(eslint@8.57.0): dependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 @@ -22111,7 +21949,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.15.0 is-glob: 4.0.3 @@ -22121,15 +21959,14 @@ snapshots: object.values: 1.2.0 semver: 6.3.1 tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): dependencies: + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4) array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 @@ -22138,7 +21975,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.15.0 is-glob: 4.0.3 @@ -22148,20 +21985,17 @@ snapshots: object.values: 1.2.0 semver: 6.3.1 tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4): + eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.57.0)(jest@27.5.1)(typescript@5.5.4): dependencies: + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) eslint: 8.57.0 - optionalDependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) - jest: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest: 27.5.1(ts-node@10.9.2) transitivePeerDependencies: - supports-color - typescript @@ -22249,7 +22083,7 @@ snapshots: micromatch: 4.0.7 normalize-path: 3.0.0 schema-utils: 4.2.0 - webpack: 5.93.0 + webpack: 5.93.0(webpack-cli@5.1.4) eslint@8.57.0: dependencies: @@ -22264,7 +22098,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -22490,17 +22324,17 @@ snapshots: dependencies: bser: 2.1.1 - fbemitter@3.0.0(encoding@0.1.13): + fbemitter@3.0.0: dependencies: - fbjs: 3.0.5(encoding@0.1.13) + fbjs: 3.0.5 transitivePeerDependencies: - encoding fbjs-css-vars@1.0.2: {} - fbjs@3.0.5(encoding@0.1.13): + fbjs@3.0.5: dependencies: - cross-fetch: 3.1.8(encoding@0.1.13) + cross-fetch: 3.1.8 fbjs-css-vars: 1.0.2 loose-envify: 1.4.0 object-assign: 4.1.1 @@ -22538,7 +22372,7 @@ snapshots: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.93.0 + webpack: 5.93.0(webpack-cli@5.1.4) file-uri-to-path@1.0.0: {} @@ -22603,7 +22437,7 @@ snapshots: micromatch: 4.0.7 pkg-dir: 4.2.0 - firebase-admin@12.3.0(encoding@0.1.13): + firebase-admin@12.3.0: dependencies: '@fastify/busboy': 3.0.0 '@firebase/database-compat': 1.0.6 @@ -22615,8 +22449,8 @@ snapshots: node-forge: 1.3.1 uuid: 10.0.0 optionalDependencies: - '@google-cloud/firestore': 7.9.0(encoding@0.1.13) - '@google-cloud/storage': 7.12.1(encoding@0.1.13) + '@google-cloud/firestore': 7.9.0 + '@google-cloud/storage': 7.12.1 transitivePeerDependencies: - encoding - supports-color @@ -22669,10 +22503,10 @@ snapshots: flatted@3.3.1: {} - flux@4.0.4(encoding@0.1.13)(react@18.3.1): + flux@4.0.4(react@18.3.1): dependencies: - fbemitter: 3.0.0(encoding@0.1.13) - fbjs: 3.0.5(encoding@0.1.13) + fbemitter: 3.0.0 + fbjs: 3.0.5 react: 18.3.1 transitivePeerDependencies: - encoding @@ -22696,6 +22530,7 @@ snapshots: chokidar: 3.6.0 cosmiconfig: 6.0.0 deepmerge: 4.3.1 + eslint: 8.57.0 fs-extra: 9.1.0 glob: 7.2.3 memfs: 3.5.3 @@ -22704,9 +22539,7 @@ snapshots: semver: 7.6.3 tapable: 1.1.3 typescript: 5.5.4 - webpack: 5.93.0 - optionalDependencies: - eslint: 8.57.0 + webpack: 5.93.0(webpack-cli@5.1.4) form-data@2.5.1: dependencies: @@ -22836,39 +22669,39 @@ snapshots: strip-ansi: 6.0.1 wide-align: 1.1.5 - gaxios@4.3.3(encoding@0.1.13): + gaxios@4.3.3: dependencies: abort-controller: 3.0.0 extend: 3.0.2 https-proxy-agent: 5.0.1 is-stream: 2.0.1 - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 transitivePeerDependencies: - encoding - supports-color - gaxios@6.7.0(encoding@0.1.13): + gaxios@6.7.0: dependencies: extend: 3.0.2 https-proxy-agent: 7.0.5 is-stream: 2.0.1 - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 uuid: 10.0.0 transitivePeerDependencies: - encoding - supports-color - gcp-metadata@4.3.1(encoding@0.1.13): + gcp-metadata@4.3.1: dependencies: - gaxios: 4.3.3(encoding@0.1.13) + gaxios: 4.3.3 json-bigint: 1.0.0 transitivePeerDependencies: - encoding - supports-color - gcp-metadata@6.1.0(encoding@0.1.13): + gcp-metadata@6.1.0: dependencies: - gaxios: 6.7.0(encoding@0.1.13) + gaxios: 6.7.0 json-bigint: 1.0.0 transitivePeerDependencies: - encoding @@ -22918,9 +22751,9 @@ snapshots: github-from-package@0.0.0: {} - github-username@6.0.0(encoding@0.1.13): + github-username@6.0.0: dependencies: - '@octokit/rest': 18.12.0(encoding@0.1.13) + '@octokit/rest': 18.12.0 transitivePeerDependencies: - encoding @@ -23027,14 +22860,14 @@ snapshots: globrex@0.1.2: {} - google-ads-api@16.0.0-rest-beta3(encoding@0.1.13): + google-ads-api@16.0.0-rest-beta3: dependencies: '@isaacs/ttlcache': 1.4.1 axios: 1.7.2 circ-json: 1.0.4 - google-ads-node: 13.0.0(encoding@0.1.13) - google-auth-library: 7.14.1(encoding@0.1.13) - google-gax: 4.3.8(encoding@0.1.13) + google-ads-node: 13.0.0 + google-auth-library: 7.14.1 + google-gax: 4.3.8 long: 4.0.0 map-obj: 4.3.0 stream-json: 1.8.0 @@ -23043,54 +22876,54 @@ snapshots: - encoding - supports-color - google-ads-node@13.0.0(encoding@0.1.13): + google-ads-node@13.0.0: dependencies: - google-gax: 4.3.8(encoding@0.1.13) + google-gax: 4.3.8 lru-cache: 10.4.3 transitivePeerDependencies: - encoding - supports-color - google-auth-library@7.14.1(encoding@0.1.13): + google-auth-library@7.14.1: dependencies: arrify: 2.0.1 base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 fast-text-encoding: 1.0.6 - gaxios: 4.3.3(encoding@0.1.13) - gcp-metadata: 4.3.1(encoding@0.1.13) - gtoken: 5.3.2(encoding@0.1.13) + gaxios: 4.3.3 + gcp-metadata: 4.3.1 + gtoken: 5.3.2 jws: 4.0.0 lru-cache: 6.0.0 transitivePeerDependencies: - encoding - supports-color - google-auth-library@9.12.0(encoding@0.1.13): + google-auth-library@9.12.0: dependencies: base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 - gaxios: 6.7.0(encoding@0.1.13) - gcp-metadata: 6.1.0(encoding@0.1.13) - gtoken: 7.1.0(encoding@0.1.13) + gaxios: 6.7.0 + gcp-metadata: 6.1.0 + gtoken: 7.1.0 jws: 4.0.0 transitivePeerDependencies: - encoding - supports-color - google-gax@4.3.8(encoding@0.1.13): + google-gax@4.3.8: dependencies: '@grpc/grpc-js': 1.11.1 '@grpc/proto-loader': 0.7.13 '@types/long': 4.0.2 abort-controller: 3.0.0 duplexify: 4.1.3 - google-auth-library: 9.12.0(encoding@0.1.13) - node-fetch: 2.7.0(encoding@0.1.13) + google-auth-library: 9.12.0 + node-fetch: 2.7.0 object-hash: 3.0.0 proto3-json-serializer: 2.0.2 protobufjs: 7.3.2 - retry-request: 7.0.2(encoding@0.1.13) + retry-request: 7.0.2 uuid: 9.0.1 transitivePeerDependencies: - encoding @@ -23100,11 +22933,11 @@ snapshots: dependencies: node-forge: 1.3.1 - googleapis-common@7.2.0(encoding@0.1.13): + googleapis-common@7.2.0: dependencies: extend: 3.0.2 - gaxios: 6.7.0(encoding@0.1.13) - google-auth-library: 9.12.0(encoding@0.1.13) + gaxios: 6.7.0 + google-auth-library: 9.12.0 qs: 6.12.3 url-template: 2.0.8 uuid: 9.0.1 @@ -23112,10 +22945,10 @@ snapshots: - encoding - supports-color - googleapis@126.0.1(encoding@0.1.13): + googleapis@126.0.1: dependencies: - google-auth-library: 9.12.0(encoding@0.1.13) - googleapis-common: 7.2.0(encoding@0.1.13) + google-auth-library: 9.12.0 + googleapis-common: 7.2.0 transitivePeerDependencies: - encoding - supports-color @@ -23130,18 +22963,18 @@ snapshots: grouped-queue@2.0.0: {} - gtoken@5.3.2(encoding@0.1.13): + gtoken@5.3.2: dependencies: - gaxios: 4.3.3(encoding@0.1.13) + gaxios: 4.3.3 google-p12-pem: 3.1.4 jws: 4.0.0 transitivePeerDependencies: - encoding - supports-color - gtoken@7.1.0(encoding@0.1.13): + gtoken@7.1.0: dependencies: - gaxios: 6.7.0(encoding@0.1.13) + gaxios: 6.7.0 jws: 4.0.0 transitivePeerDependencies: - encoding @@ -23272,8 +23105,7 @@ snapshots: lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - optionalDependencies: - webpack: 5.93.0 + webpack: 5.93.0(webpack-cli@5.1.4) htmlencode@0.0.4: {} @@ -23351,19 +23183,18 @@ snapshots: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) transitivePeerDependencies: - supports-color http-proxy-middleware@2.0.6(@types/express@4.17.21): dependencies: + '@types/express': 4.17.21 '@types/http-proxy': 1.17.14 http-proxy: 1.18.1 is-glob: 4.0.3 is-plain-obj: 3.0.0 micromatch: 4.0.7 - optionalDependencies: - '@types/express': 4.17.21 transitivePeerDependencies: - debug @@ -23378,14 +23209,14 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) transitivePeerDependencies: - supports-color https-proxy-agent@7.0.5: dependencies: agent-base: 7.1.1 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -23928,7 +23759,7 @@ snapshots: transitivePeerDependencies: - supports-color - jest-circus@29.7.0(babel-plugin-macros@3.1.0): + jest-circus@29.7.0: dependencies: '@jest/environment': 29.7.0 '@jest/expect': 29.7.0 @@ -23937,7 +23768,7 @@ snapshots: '@types/node': 18.19.42 chalk: 4.1.2 co: 4.6.0 - dedent: 1.5.3(babel-plugin-macros@3.1.0) + dedent: 1.5.3 is-generator-fn: 2.1.0 jest-each: 29.7.0 jest-matcher-utils: 29.7.0 @@ -23954,16 +23785,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + jest-cli@27.5.1(ts-node@10.9.2): dependencies: - '@jest/core': 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + '@jest/core': 27.5.1(ts-node@10.9.2) '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.2.0 - jest-config: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-config: 27.5.1(ts-node@10.9.2) jest-util: 27.5.1 jest-validate: 27.5.1 prompts: 2.4.2 @@ -23975,16 +23806,16 @@ snapshots: - ts-node - utf-8-validate - jest-cli@28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + jest-cli@28.1.3(@types/node@18.19.42)(ts-node@10.9.2): dependencies: - '@jest/core': 28.1.3(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + '@jest/core': 28.1.3(ts-node@10.9.2) '@jest/test-result': 28.1.3 '@jest/types': 28.1.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.2.0 - jest-config: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-config: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2) jest-util: 28.1.3 jest-validate: 28.1.3 prompts: 2.4.2 @@ -23994,16 +23825,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)): + jest-cli@29.7.0(@types/node@18.19.42)(ts-node@10.9.2): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + '@jest/core': 29.7.0(ts-node@10.9.2) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + create-jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -24013,50 +23844,12 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + jest-config@27.5.1(ts-node@10.9.2): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) - exit: 0.1.2 - import-local: 3.2.0 - jest-config: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - jest-cli@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) - exit: 0.1.2 - import-local: 3.2.0 - jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - jest-config@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): - dependencies: - '@babel/core': 7.25.2 - '@jest/test-sequencer': 27.5.1 - '@jest/types': 27.5.1 - babel-jest: 27.5.1(@babel/core@7.25.2) + '@babel/core': 7.25.2 + '@jest/test-sequencer': 27.5.1 + '@jest/types': 27.5.1 + babel-jest: 27.5.1(@babel/core@7.25.2) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -24077,7 +23870,6 @@ snapshots: pretty-format: 27.5.1 slash: 3.0.0 strip-json-comments: 3.1.1 - optionalDependencies: ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) transitivePeerDependencies: - bufferutil @@ -24085,11 +23877,12 @@ snapshots: - supports-color - utf-8-validate - jest-config@28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + jest-config@28.1.3(@types/node@18.19.42)(ts-node@10.9.2): dependencies: '@babel/core': 7.25.2 '@jest/test-sequencer': 28.1.3 '@jest/types': 28.1.3 + '@types/node': 18.19.42 babel-jest: 28.1.3(@babel/core@7.25.2) chalk: 4.1.2 ci-info: 3.9.0 @@ -24109,86 +23902,23 @@ snapshots: pretty-format: 28.1.3 slash: 3.0.0 strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 18.19.42 ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) transitivePeerDependencies: - supports-color - jest-config@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)): - dependencies: - '@babel/core': 7.25.2 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.25.2) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0(babel-plugin-macros@3.1.0) - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.7 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 16.18.11 - ts-node: 10.9.2(@types/node@16.18.11)(typescript@5.5.4) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-config@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + jest-config@29.7.0(@types/node@18.19.42)(ts-node@10.9.2): dependencies: '@babel/core': 7.25.2 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.25.2) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0(babel-plugin-macros@3.1.0) - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.7 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: '@types/node': 18.19.42 - ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-config@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)): - dependencies: - '@babel/core': 7.25.2 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.25.2) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-circus: 29.7.0(babel-plugin-macros@3.1.0) + jest-circus: 29.7.0 jest-environment-node: 29.7.0 jest-get-type: 29.6.3 jest-regex-util: 29.6.3 @@ -24201,39 +23931,6 @@ snapshots: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 18.19.42 - ts-node: 10.9.2(@types/node@16.18.11)(typescript@5.5.4) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-config@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): - dependencies: - '@babel/core': 7.25.2 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.25.2) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0(babel-plugin-macros@3.1.0) - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.7 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 18.19.42 ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) transitivePeerDependencies: - babel-plugin-macros @@ -24504,15 +24201,15 @@ snapshots: jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): - optionalDependencies: + dependencies: jest-resolve: 27.5.1 jest-pnp-resolver@1.2.3(jest-resolve@28.1.3): - optionalDependencies: + dependencies: jest-resolve: 28.1.3 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - optionalDependencies: + dependencies: jest-resolve: 29.7.0 jest-regex-util@27.5.1: {} @@ -24881,11 +24578,11 @@ snapshots: leven: 3.1.0 pretty-format: 29.7.0 - jest-watch-typeahead@1.1.0(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))): + jest-watch-typeahead@1.1.0(jest@27.5.1): dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 - jest: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest: 27.5.1(ts-node@10.9.2) jest-regex-util: 28.0.2 jest-watcher: 28.1.3 slash: 4.0.0 @@ -24954,11 +24651,11 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + jest@27.5.1(ts-node@10.9.2): dependencies: - '@jest/core': 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + '@jest/core': 27.5.1(ts-node@10.9.2) import-local: 3.2.0 - jest-cli: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-cli: 27.5.1(ts-node@10.9.2) transitivePeerDependencies: - bufferutil - canvas @@ -24966,47 +24663,23 @@ snapshots: - ts-node - utf-8-validate - jest@28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + jest@28.1.3(@types/node@18.19.42)(ts-node@10.9.2): dependencies: - '@jest/core': 28.1.3(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + '@jest/core': 28.1.3(ts-node@10.9.2) '@jest/types': 28.1.3 import-local: 3.2.0 - jest-cli: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-cli: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2) transitivePeerDependencies: - '@types/node' - supports-color - ts-node - jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)): + jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + '@jest/core': 29.7.0(ts-node@10.9.2) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - jest@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): - dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) - '@jest/types': 29.6.3 - import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) - '@jest/types': 29.6.3 - import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-cli: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -25183,13 +24856,13 @@ snapshots: object.assign: 4.1.5 object.values: 1.2.0 - juice@10.0.0(encoding@0.1.13): + juice@10.0.0: dependencies: cheerio: 1.0.0-rc.12 commander: 6.2.1 mensch: 0.3.4 slick: 1.12.2 - web-resource-inliner: 6.0.1(encoding@0.1.13) + web-resource-inliner: 6.0.1 transitivePeerDependencies: - encoding @@ -25213,7 +24886,7 @@ snapshots: dependencies: '@types/express': 4.17.21 '@types/jsonwebtoken': 9.0.6 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) jose: 4.15.9 limiter: 1.1.5 lru-memoizer: 2.3.0 @@ -25267,7 +24940,7 @@ snapshots: dependencies: klona: 2.0.6 less: 4.2.0 - webpack: 5.93.0 + webpack: 5.93.0(webpack-cli@5.1.4) less@4.2.0: dependencies: @@ -25587,12 +25260,11 @@ snapshots: ejs: 3.1.10 globby: 11.1.0 isbinaryfile: 5.0.2 + mem-fs: 2.3.0 minimatch: 7.4.6 multimatch: 5.0.0 normalize-path: 3.0.0 textextensions: 5.16.0 - optionalDependencies: - mem-fs: 2.3.0 mem-fs@2.3.0: dependencies: @@ -25701,7 +25373,7 @@ snapshots: dependencies: schema-utils: 4.2.0 tapable: 2.2.1 - webpack: 5.93.0 + webpack: 5.93.0(webpack-cli@5.1.4) minimalistic-assert@1.0.1: {} @@ -25805,39 +25477,39 @@ snapshots: mixwith@0.1.1: {} - mjml-accordion@4.15.3(encoding@0.1.13): + mjml-accordion@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) + mjml-core: 4.15.3 transitivePeerDependencies: - encoding - mjml-body@4.15.3(encoding@0.1.13): + mjml-body@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) + mjml-core: 4.15.3 transitivePeerDependencies: - encoding - mjml-button@4.15.3(encoding@0.1.13): + mjml-button@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) + mjml-core: 4.15.3 transitivePeerDependencies: - encoding - mjml-carousel@4.15.3(encoding@0.1.13): + mjml-carousel@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) + mjml-core: 4.15.3 transitivePeerDependencies: - encoding - mjml-cli@4.15.3(encoding@0.1.13): + mjml-cli@4.15.3: dependencies: '@babel/runtime': 7.25.0 chokidar: 3.6.0 @@ -25846,149 +25518,149 @@ snapshots: js-beautify: 1.15.1 lodash: 4.17.21 minimatch: 9.0.5 - mjml-core: 4.15.3(encoding@0.1.13) - mjml-migrate: 4.15.3(encoding@0.1.13) + mjml-core: 4.15.3 + mjml-migrate: 4.15.3 mjml-parser-xml: 4.15.3 mjml-validator: 4.15.3 yargs: 17.7.2 transitivePeerDependencies: - encoding - mjml-column@4.15.3(encoding@0.1.13): + mjml-column@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) + mjml-core: 4.15.3 transitivePeerDependencies: - encoding - mjml-core@4.15.3(encoding@0.1.13): + mjml-core@4.15.3: dependencies: '@babel/runtime': 7.25.0 cheerio: 1.0.0-rc.12 detect-node: 2.1.0 html-minifier: 4.0.0 js-beautify: 1.15.1 - juice: 10.0.0(encoding@0.1.13) + juice: 10.0.0 lodash: 4.17.21 - mjml-migrate: 4.15.3(encoding@0.1.13) + mjml-migrate: 4.15.3 mjml-parser-xml: 4.15.3 mjml-validator: 4.15.3 transitivePeerDependencies: - encoding - mjml-divider@4.15.3(encoding@0.1.13): + mjml-divider@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) + mjml-core: 4.15.3 transitivePeerDependencies: - encoding - mjml-group@4.15.3(encoding@0.1.13): + mjml-group@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) + mjml-core: 4.15.3 transitivePeerDependencies: - encoding - mjml-head-attributes@4.15.3(encoding@0.1.13): + mjml-head-attributes@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) + mjml-core: 4.15.3 transitivePeerDependencies: - encoding - mjml-head-breakpoint@4.15.3(encoding@0.1.13): + mjml-head-breakpoint@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) + mjml-core: 4.15.3 transitivePeerDependencies: - encoding - mjml-head-font@4.15.3(encoding@0.1.13): + mjml-head-font@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) + mjml-core: 4.15.3 transitivePeerDependencies: - encoding - mjml-head-html-attributes@4.15.3(encoding@0.1.13): + mjml-head-html-attributes@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) + mjml-core: 4.15.3 transitivePeerDependencies: - encoding - mjml-head-preview@4.15.3(encoding@0.1.13): + mjml-head-preview@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) + mjml-core: 4.15.3 transitivePeerDependencies: - encoding - mjml-head-style@4.15.3(encoding@0.1.13): + mjml-head-style@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) + mjml-core: 4.15.3 transitivePeerDependencies: - encoding - mjml-head-title@4.15.3(encoding@0.1.13): + mjml-head-title@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) + mjml-core: 4.15.3 transitivePeerDependencies: - encoding - mjml-head@4.15.3(encoding@0.1.13): + mjml-head@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) + mjml-core: 4.15.3 transitivePeerDependencies: - encoding - mjml-hero@4.15.3(encoding@0.1.13): + mjml-hero@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) + mjml-core: 4.15.3 transitivePeerDependencies: - encoding - mjml-image@4.15.3(encoding@0.1.13): + mjml-image@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) + mjml-core: 4.15.3 transitivePeerDependencies: - encoding - mjml-migrate@4.15.3(encoding@0.1.13): + mjml-migrate@4.15.3: dependencies: '@babel/runtime': 7.25.0 js-beautify: 1.15.1 lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) + mjml-core: 4.15.3 mjml-parser-xml: 4.15.3 yargs: 17.7.2 transitivePeerDependencies: - encoding - mjml-navbar@4.15.3(encoding@0.1.13): + mjml-navbar@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) + mjml-core: 4.15.3 transitivePeerDependencies: - encoding @@ -25999,92 +25671,92 @@ snapshots: htmlparser2: 9.1.0 lodash: 4.17.21 - mjml-preset-core@4.15.3(encoding@0.1.13): + mjml-preset-core@4.15.3: dependencies: '@babel/runtime': 7.25.0 - mjml-accordion: 4.15.3(encoding@0.1.13) - mjml-body: 4.15.3(encoding@0.1.13) - mjml-button: 4.15.3(encoding@0.1.13) - mjml-carousel: 4.15.3(encoding@0.1.13) - mjml-column: 4.15.3(encoding@0.1.13) - mjml-divider: 4.15.3(encoding@0.1.13) - mjml-group: 4.15.3(encoding@0.1.13) - mjml-head: 4.15.3(encoding@0.1.13) - mjml-head-attributes: 4.15.3(encoding@0.1.13) - mjml-head-breakpoint: 4.15.3(encoding@0.1.13) - mjml-head-font: 4.15.3(encoding@0.1.13) - mjml-head-html-attributes: 4.15.3(encoding@0.1.13) - mjml-head-preview: 4.15.3(encoding@0.1.13) - mjml-head-style: 4.15.3(encoding@0.1.13) - mjml-head-title: 4.15.3(encoding@0.1.13) - mjml-hero: 4.15.3(encoding@0.1.13) - mjml-image: 4.15.3(encoding@0.1.13) - mjml-navbar: 4.15.3(encoding@0.1.13) - mjml-raw: 4.15.3(encoding@0.1.13) - mjml-section: 4.15.3(encoding@0.1.13) - mjml-social: 4.15.3(encoding@0.1.13) - mjml-spacer: 4.15.3(encoding@0.1.13) - mjml-table: 4.15.3(encoding@0.1.13) - mjml-text: 4.15.3(encoding@0.1.13) - mjml-wrapper: 4.15.3(encoding@0.1.13) + mjml-accordion: 4.15.3 + mjml-body: 4.15.3 + mjml-button: 4.15.3 + mjml-carousel: 4.15.3 + mjml-column: 4.15.3 + mjml-divider: 4.15.3 + mjml-group: 4.15.3 + mjml-head: 4.15.3 + mjml-head-attributes: 4.15.3 + mjml-head-breakpoint: 4.15.3 + mjml-head-font: 4.15.3 + mjml-head-html-attributes: 4.15.3 + mjml-head-preview: 4.15.3 + mjml-head-style: 4.15.3 + mjml-head-title: 4.15.3 + mjml-hero: 4.15.3 + mjml-image: 4.15.3 + mjml-navbar: 4.15.3 + mjml-raw: 4.15.3 + mjml-section: 4.15.3 + mjml-social: 4.15.3 + mjml-spacer: 4.15.3 + mjml-table: 4.15.3 + mjml-text: 4.15.3 + mjml-wrapper: 4.15.3 transitivePeerDependencies: - encoding - mjml-raw@4.15.3(encoding@0.1.13): + mjml-raw@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) + mjml-core: 4.15.3 transitivePeerDependencies: - encoding - mjml-react@2.0.8(mjml@4.15.3(encoding@0.1.13))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + mjml-react@2.0.8(mjml@4.15.3)(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 babel-runtime: 6.25.0 color: 3.2.1 - mjml: 4.15.3(encoding@0.1.13) + mjml: 4.15.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-reconciler: 0.26.2(react@18.3.1) - mjml-section@4.15.3(encoding@0.1.13): + mjml-section@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) + mjml-core: 4.15.3 transitivePeerDependencies: - encoding - mjml-social@4.15.3(encoding@0.1.13): + mjml-social@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) + mjml-core: 4.15.3 transitivePeerDependencies: - encoding - mjml-spacer@4.15.3(encoding@0.1.13): + mjml-spacer@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) + mjml-core: 4.15.3 transitivePeerDependencies: - encoding - mjml-table@4.15.3(encoding@0.1.13): + mjml-table@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) + mjml-core: 4.15.3 transitivePeerDependencies: - encoding - mjml-text@4.15.3(encoding@0.1.13): + mjml-text@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) + mjml-core: 4.15.3 transitivePeerDependencies: - encoding @@ -26092,22 +25764,22 @@ snapshots: dependencies: '@babel/runtime': 7.25.0 - mjml-wrapper@4.15.3(encoding@0.1.13): + mjml-wrapper@4.15.3: dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - mjml-section: 4.15.3(encoding@0.1.13) + mjml-core: 4.15.3 + mjml-section: 4.15.3 transitivePeerDependencies: - encoding - mjml@4.15.3(encoding@0.1.13): + mjml@4.15.3: dependencies: '@babel/runtime': 7.25.0 - mjml-cli: 4.15.3(encoding@0.1.13) - mjml-core: 4.15.3(encoding@0.1.13) - mjml-migrate: 4.15.3(encoding@0.1.13) - mjml-preset-core: 4.15.3(encoding@0.1.13) + mjml-cli: 4.15.3 + mjml-core: 4.15.3 + mjml-migrate: 4.15.3 + mjml-preset-core: 4.15.3 mjml-validator: 4.15.3 transitivePeerDependencies: - encoding @@ -26141,14 +25813,12 @@ snapshots: '@types/whatwg-url': 11.0.5 whatwg-url: 13.0.0 - mongodb@6.8.0(@mongodb-js/zstd@1.2.0)(socks@2.8.3): + mongodb@6.8.0(@mongodb-js/zstd@1.2.0): dependencies: '@mongodb-js/saslprep': 1.1.8 + '@mongodb-js/zstd': 1.2.0 bson: 6.8.0 mongodb-connection-string-url: 3.0.1 - optionalDependencies: - '@mongodb-js/zstd': 1.2.0 - socks: 2.8.3 monorel@0.4.2: dependencies: @@ -26191,7 +25861,7 @@ snapshots: nan@2.20.0: optional: true - nano-css@5.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + nano-css@5.6.2(react-dom@18.3.1)(react@18.3.1): dependencies: '@jridgewell/sourcemap-codec': 1.5.0 css-tree: 1.1.3 @@ -26226,13 +25896,14 @@ snapshots: dependencies: '@segment/isodate': 1.0.3 - next-auth@4.24.7(next@14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nodemailer@6.9.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next-auth@4.24.7(next@14.2.5)(nodemailer@6.9.14)(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 '@panva/hkdf': 1.2.1 cookie: 0.5.0 jose: 4.15.9 - next: 14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.5(@babel/core@7.25.2)(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1) + nodemailer: 6.9.14 oauth: 0.9.15 openid-client: 5.6.5 preact: 10.23.1 @@ -26240,16 +25911,15 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) uuid: 8.3.2 - optionalDependencies: - nodemailer: 6.9.14 next-transpile-modules@10.0.1: dependencies: enhanced-resolve: 5.17.1 - next@14.2.3(@babel/core@7.24.5)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.3(@babel/core@7.24.5)(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1): dependencies: '@next/env': 14.2.3 + '@playwright/test': 1.39.0 '@swc/helpers': 0.5.5 busboy: 1.6.0 caniuse-lite: 1.0.30001649 @@ -26268,14 +25938,14 @@ snapshots: '@next/swc-win32-arm64-msvc': 14.2.3 '@next/swc-win32-ia32-msvc': 14.2.3 '@next/swc-win32-x64-msvc': 14.2.3 - '@opentelemetry/api': 1.9.0 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - next@14.2.5(@babel/core@7.24.5)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.5(@babel/core@7.24.5)(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1): dependencies: '@next/env': 14.2.5 + '@playwright/test': 1.39.0 '@swc/helpers': 0.5.5 busboy: 1.6.0 caniuse-lite: 1.0.30001645 @@ -26294,14 +25964,14 @@ snapshots: '@next/swc-win32-arm64-msvc': 14.2.5 '@next/swc-win32-ia32-msvc': 14.2.5 '@next/swc-win32-x64-msvc': 14.2.5 - '@opentelemetry/api': 1.9.0 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - next@14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.5(@babel/core@7.25.2)(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1): dependencies: '@next/env': 14.2.5 + '@playwright/test': 1.39.0 '@swc/helpers': 0.5.5 busboy: 1.6.0 caniuse-lite: 1.0.30001645 @@ -26320,8 +25990,6 @@ snapshots: '@next/swc-win32-arm64-msvc': 14.2.5 '@next/swc-win32-ia32-msvc': 14.2.5 '@next/swc-win32-x64-msvc': 14.2.5 - '@opentelemetry/api': 1.9.0 - '@playwright/test': 1.39.0 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -26356,23 +26024,17 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 3.3.3 - node-fetch@2.6.7(encoding@0.1.13): + node-fetch@2.6.7: dependencies: whatwg-url: 5.0.0 - optionalDependencies: - encoding: 0.1.13 - node-fetch@2.6.9(encoding@0.1.13): + node-fetch@2.6.9: dependencies: whatwg-url: 5.0.0 - optionalDependencies: - encoding: 0.1.13 - node-fetch@2.7.0(encoding@0.1.13): + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - optionalDependencies: - encoding: 0.1.13 node-fetch@3.3.2: dependencies: @@ -26419,10 +26081,10 @@ snapshots: node-int64@0.4.0: {} - node-loader@2.0.0(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))): + node-loader@2.0.0(webpack@5.93.0): dependencies: loader-utils: 2.0.4 - webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) + webpack: 5.93.0(webpack-cli@5.1.4) node-postgres@0.6.2: {} @@ -27277,13 +26939,12 @@ snapshots: cosmiconfig: 5.2.1 import-cwd: 2.1.0 - postcss-load-config@4.0.2(postcss@8.4.40)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + postcss-load-config@4.0.2(postcss@8.4.40)(ts-node@10.9.2): dependencies: lilconfig: 3.1.2 - yaml: 2.5.0 - optionalDependencies: postcss: 8.4.40 ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) + yaml: 2.5.0 postcss-loader@6.2.1(postcss@8.4.40)(webpack@5.93.0): dependencies: @@ -27291,7 +26952,7 @@ snapshots: klona: 2.0.6 postcss: 8.4.40 semver: 7.6.3 - webpack: 5.93.0 + webpack: 5.93.0(webpack-cli@5.1.4) postcss-logical@5.0.4(postcss@8.4.40): dependencies: @@ -28015,359 +27676,356 @@ snapshots: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.93.0 + webpack: 5.93.0(webpack-cli@5.1.4) - rc-align@4.0.15(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-align@4.0.15(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 dom-align: 1.12.4 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) resize-observer-polyfill: 1.5.1 - rc-cascader@3.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-cascader@3.27.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 array-tree-filter: 2.1.0 classnames: 2.5.1 - rc-select: 14.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tree: 5.8.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-select: 14.15.1(react-dom@18.3.1)(react@18.3.1) + rc-tree: 5.8.8(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-checkbox@3.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-checkbox@3.3.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-collapse@3.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-collapse@3.7.3(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-dialog@9.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-dialog@9.5.2(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-drawer@7.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-drawer@7.2.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-dropdown@4.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-dropdown@4.2.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-field-form@2.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-field-form@2.2.1(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 '@rc-component/async-validator': 5.0.4 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-image@7.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-image@7.9.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) classnames: 2.5.1 - rc-dialog: 9.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-dialog: 9.5.2(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-input-number@9.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-input-number@9.1.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 '@rc-component/mini-decimal': 1.1.0 classnames: 2.5.1 - rc-input: 1.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-input: 1.5.1(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-input@1.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-input@1.5.1(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-mentions@2.14.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-mentions@2.14.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) classnames: 2.5.1 - rc-input: 1.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-menu: 9.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-textarea: 1.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-input: 1.5.1(react-dom@18.3.1)(react@18.3.1) + rc-menu: 9.14.1(react-dom@18.3.1)(react@18.3.1) + rc-textarea: 1.7.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-menu@9.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-menu@9.14.1(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-overflow: 1.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) + rc-overflow: 1.3.2(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-motion@2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-motion@2.9.2(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-notification@5.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-notification@5.6.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-overflow@1.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-overflow@1.3.2(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-pagination@4.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-pagination@4.2.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-picker@2.7.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-picker@2.7.6(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 date-fns: 2.30.0 dayjs: 1.11.12 moment: 2.30.1 - rc-trigger: 5.3.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-trigger: 5.3.4(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) shallowequal: 1.1.0 - rc-picker@4.6.11(date-fns@2.30.0)(dayjs@1.11.12)(moment@2.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-picker@4.6.11(dayjs@1.11.12)(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) classnames: 2.5.1 - rc-overflow: 1.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + dayjs: 1.11.12 + rc-overflow: 1.3.2(react-dom@18.3.1)(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - date-fns: 2.30.0 - dayjs: 1.11.12 - moment: 2.30.1 - rc-progress@4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-progress@4.0.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-rate@2.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-rate@2.13.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-resize-observer@1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-resize-observer@1.4.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) resize-observer-polyfill: 1.5.1 - rc-segmented@2.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-segmented@2.3.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-select@14.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-select@14.15.1(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-overflow: 1.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-virtual-list: 3.14.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) + rc-overflow: 1.3.2(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-virtual-list: 3.14.5(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-slider@10.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-slider@10.6.2(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-steps@6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-steps@6.0.1(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-switch@4.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-switch@4.1.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-table@7.45.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-table@7.45.7(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/context': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/context': 1.4.0(react-dom@18.3.1)(react@18.3.1) classnames: 2.5.1 - rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-virtual-list: 3.14.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-virtual-list: 3.14.5(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-tabs@15.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-tabs@15.1.1(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-dropdown: 4.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-menu: 9.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-dropdown: 4.2.0(react-dom@18.3.1)(react@18.3.1) + rc-menu: 9.14.1(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-textarea@1.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-textarea@1.7.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-input: 1.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-input: 1.5.1(react-dom@18.3.1)(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-tooltip@6.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-tooltip@6.2.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) classnames: 2.5.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-tree-select@5.22.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-tree-select@5.22.1(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-select: 14.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tree: 5.8.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-select: 14.15.1(react-dom@18.3.1)(react@18.3.1) + rc-tree: 5.8.8(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-tree@5.8.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-tree@5.8.8(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-virtual-list: 3.14.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-virtual-list: 3.14.5(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-trigger@5.3.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-trigger@5.3.4(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-align: 4.0.15(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-align: 4.0.15(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-upload@4.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-upload@4.6.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-util@5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-util@5.43.0(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-is: 18.3.1 - rc-virtual-list@3.14.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-virtual-list@3.14.5(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -28420,9 +28078,8 @@ snapshots: shell-quote: 1.8.1 strip-ansi: 6.0.1 text-table: 0.2.0 - webpack: 5.93.0 - optionalDependencies: typescript: 5.5.4 + webpack: 5.93.0(webpack-cli@5.1.4) transitivePeerDependencies: - eslint - supports-color @@ -28434,7 +28091,7 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 - react-email@3.0.1(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-email@3.0.1(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/core': 7.24.5 '@babel/parser': 7.24.5 @@ -28446,7 +28103,7 @@ snapshots: glob: 10.3.4 log-symbols: 4.1.0 mime-types: 2.1.35 - next: 14.2.3(@babel/core@7.24.5)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.3(@babel/core@7.24.5)(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1) normalize-path: 3.0.0 ora: 5.4.1 socket.io: 4.7.5 @@ -28473,9 +28130,9 @@ snapshots: react-is@18.3.1: {} - react-json-view@1.21.3(@types/react@18.3.3)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-json-view@1.21.3(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): dependencies: - flux: 4.0.4(encoding@0.1.13)(react@18.3.1) + flux: 4.0.4(react@18.3.1) react: 18.3.1 react-base16-styling: 0.6.0 react-dom: 18.3.1(react@18.3.1) @@ -28500,7 +28157,7 @@ snapshots: react-refresh@0.11.0: {} - react-router-dom@6.25.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-router-dom@6.25.1(react-dom@18.3.1)(react@18.3.1): dependencies: '@remix-run/router': 1.18.0 react: 18.3.1 @@ -28512,10 +28169,10 @@ snapshots: '@remix-run/router': 1.18.0 react: 18.3.1 - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(@types/babel__core@7.20.5)(@types/webpack@5.28.5)(eslint@8.57.0)(react@18.3.1)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))(type-fest@3.13.1)(typescript@5.5.4): + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0)(react@18.3.1)(ts-node@10.9.2)(typescript@5.5.4): dependencies: '@babel/core': 7.25.2 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.15(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@3.13.1)(webpack-dev-server@4.15.2(webpack@5.93.0))(webpack@5.93.0) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.15(react-refresh@0.11.0)(webpack-dev-server@4.15.2)(webpack@5.93.0) '@svgr/webpack': 5.5.0 babel-jest: 27.5.1(@babel/core@7.25.2) babel-loader: 8.3.0(@babel/core@7.25.2)(webpack@5.93.0) @@ -28530,15 +28187,15 @@ snapshots: dotenv: 10.0.0 dotenv-expand: 5.1.0 eslint: 8.57.0 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(eslint@8.57.0)(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4) + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0)(jest@27.5.1)(typescript@5.5.4) eslint-webpack-plugin: 3.2.0(eslint@8.57.0)(webpack@5.93.0) file-loader: 6.2.0(webpack@5.93.0) fs-extra: 10.1.0 html-webpack-plugin: 5.6.0(webpack@5.93.0) identity-obj-proxy: 3.0.0 - jest: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest: 27.5.1(ts-node@10.9.2) jest-resolve: 27.5.1 - jest-watch-typeahead: 1.1.0(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))) + jest-watch-typeahead: 1.1.0(jest@27.5.1) mini-css-extract-plugin: 2.9.0(webpack@5.93.0) postcss: 8.4.40 postcss-flexbugs-fixes: 5.0.2(postcss@8.4.40) @@ -28556,15 +28213,15 @@ snapshots: semver: 7.6.3 source-map-loader: 3.0.2(webpack@5.93.0) style-loader: 3.3.4(webpack@5.93.0) - tailwindcss: 3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + tailwindcss: 3.4.7(ts-node@10.9.2) terser-webpack-plugin: 5.3.10(webpack@5.93.0) - webpack: 5.93.0 + typescript: 5.5.4 + webpack: 5.93.0(webpack-cli@5.1.4) webpack-dev-server: 4.15.2(webpack@5.93.0) webpack-manifest-plugin: 4.1.1(webpack@5.93.0) - workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.93.0) + workbox-webpack-plugin: 6.6.0(webpack@5.93.0) optionalDependencies: fsevents: 2.3.3 - typescript: 5.5.4 transitivePeerDependencies: - '@babel/plugin-syntax-flow' - '@babel/plugin-transform-react-jsx' @@ -28599,13 +28256,13 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - react-smooth@4.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-smooth@4.0.1(react-dom@18.3.1)(react@18.3.1): dependencies: fast-equals: 5.0.1 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-transition-group: 4.4.5(react-dom@18.3.1)(react@18.3.1) react-textarea-autosize@8.5.3(@types/react@18.3.3)(react@18.3.1): dependencies: @@ -28616,7 +28273,7 @@ snapshots: transitivePeerDependencies: - '@types/react' - react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-transition-group@4.4.5(react-dom@18.3.1)(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 dom-helpers: 5.2.1 @@ -28630,7 +28287,7 @@ snapshots: react: 18.3.1 tslib: 2.6.3 - react-use@17.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-use@17.5.1(react-dom@18.3.1)(react@18.3.1): dependencies: '@types/js-cookie': 2.2.7 '@xobotyi/scrollbar-width': 1.9.5 @@ -28638,7 +28295,7 @@ snapshots: fast-deep-equal: 3.1.3 fast-shallow-equal: 1.0.0 js-cookie: 2.2.1 - nano-css: 5.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + nano-css: 5.6.2(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-universal-interface: 0.6.2(react@18.3.1)(tslib@2.6.3) @@ -28736,7 +28393,7 @@ snapshots: dependencies: decimal.js-light: 2.5.1 - recharts@2.12.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + recharts@2.12.7(react-dom@18.3.1)(react@18.3.1): dependencies: clsx: 2.1.1 eventemitter3: 4.0.7 @@ -28744,7 +28401,7 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-is: 16.13.1 - react-smooth: 4.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-smooth: 4.0.1(react-dom@18.3.1)(react@18.3.1) recharts-scale: 0.4.5 tiny-invariant: 1.3.3 victory-vendor: 36.9.2 @@ -28840,9 +28497,9 @@ snapshots: requires-port@1.0.0: {} - resend@4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + resend@4.0.0(react-dom@18.3.1)(react@18.3.1): dependencies: - '@react-email/render': 0.0.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-email/render': 0.0.17(react-dom@18.3.1)(react@18.3.1) transitivePeerDependencies: - react - react-dom @@ -28894,11 +28551,11 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 - retry-request@7.0.2(encoding@0.1.13): + retry-request@7.0.2: dependencies: '@types/request': 2.48.12 extend: 3.0.2 - teeny-request: 9.0.0(encoding@0.1.13) + teeny-request: 9.0.0 transitivePeerDependencies: - encoding - supports-color @@ -29093,7 +28750,7 @@ snapshots: dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.93.0 + webpack: 5.93.0(webpack-cli@5.1.4) sax@1.2.4: {} @@ -29333,7 +28990,7 @@ snapshots: socket.io-adapter@2.5.5: dependencies: - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) ws: 8.17.1 transitivePeerDependencies: - bufferutil @@ -29343,7 +29000,7 @@ snapshots: socket.io-parser@4.2.4: dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -29352,7 +29009,7 @@ snapshots: accepts: 1.3.8 base64id: 2.0.0 cors: 2.8.5 - debug: 4.3.6 + debug: 4.3.6(supports-color@5.5.0) engine.io: 6.5.5 socket.io-adapter: 2.5.5 socket.io-parser: 4.2.4 @@ -29401,7 +29058,7 @@ snapshots: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.2.0 - webpack: 5.93.0 + webpack: 5.93.0(webpack-cli@5.1.4) source-map-support@0.5.13: dependencies: @@ -29726,21 +29383,19 @@ snapshots: style-loader@3.3.4(webpack@5.93.0): dependencies: - webpack: 5.93.0 + webpack: 5.93.0(webpack-cli@5.1.4) styled-jsx@5.1.1(@babel/core@7.24.5)(react@18.3.1): dependencies: + '@babel/core': 7.24.5 client-only: 0.0.1 react: 18.3.1 - optionalDependencies: - '@babel/core': 7.24.5 styled-jsx@5.1.1(@babel/core@7.25.2)(react@18.3.1): dependencies: + '@babel/core': 7.25.2 client-only: 0.0.1 react: 18.3.1 - optionalDependencies: - '@babel/core': 7.25.2 stylehacks@4.0.3: dependencies: @@ -29825,7 +29480,7 @@ snapshots: symbol-tree@3.2.4: {} - tailwindcss@3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + tailwindcss@3.4.7(ts-node@10.9.2): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -29844,7 +29499,7 @@ snapshots: postcss: 8.4.40 postcss-import: 15.1.0(postcss@8.4.40) postcss-js: 4.0.1(postcss@8.4.40) - postcss-load-config: 4.0.2(postcss@8.4.40)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + postcss-load-config: 4.0.2(postcss@8.4.40)(ts-node@10.9.2) postcss-nested: 6.2.0(postcss@8.4.40) postcss-selector-parser: 6.1.1 resolve: 1.22.8 @@ -29910,11 +29565,11 @@ snapshots: dependencies: bintrees: 1.0.2 - teeny-request@9.0.0(encoding@0.1.13): + teeny-request@9.0.0: dependencies: http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 stream-events: 1.0.5 uuid: 9.0.1 transitivePeerDependencies: @@ -29935,15 +29590,6 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - terser-webpack-plugin@5.3.10(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))): - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - jest-worker: 27.5.1 - schema-utils: 3.3.0 - serialize-javascript: 6.0.2 - terser: 5.31.3 - webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) - terser-webpack-plugin@5.3.10(webpack@5.93.0): dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -29951,7 +29597,7 @@ snapshots: schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.31.3 - webpack: 5.93.0 + webpack: 5.93.0(webpack-cli@5.1.4) terser@4.8.1: dependencies: @@ -29973,7 +29619,7 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 - testcontainers@9.12.0(encoding@0.1.13): + testcontainers@9.12.0: dependencies: '@balena/dockerignore': 1.0.2 '@types/archiver': 5.3.4 @@ -29985,7 +29631,7 @@ snapshots: docker-compose: 0.24.8 dockerode: 3.3.5 get-port: 5.1.1 - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 proper-lockfile: 4.1.2 properties-reader: 2.3.0 ssh-remote-port-forward: 1.0.4 @@ -30091,28 +29737,12 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)))(typescript@5.5.4): + ts-jest@29.0.5(@babel/core@7.25.2)(jest@29.7.0)(typescript@5.5.4): dependencies: - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) - jest-util: 29.7.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.6.3 - typescript: 5.5.4 - yargs-parser: 21.1.1 - optionalDependencies: '@babel/core': 7.25.2 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.25.2) - - ts-jest@29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4): - dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -30120,55 +29750,15 @@ snapshots: semver: 7.6.3 typescript: 5.5.4 yargs-parser: 21.1.1 - optionalDependencies: - '@babel/core': 7.25.2 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.25.2) - - ts-jest@29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)))(typescript@5.5.4): - dependencies: - bs-logger: 0.2.6 - ejs: 3.1.10 - fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) - jest-util: 29.7.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.6.3 - typescript: 5.5.4 - yargs-parser: 21.1.1 - optionalDependencies: - '@babel/core': 7.25.2 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.25.2) - ts-jest@29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4): + ts-jest@29.2.3(@babel/core@7.25.2)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.5.4): dependencies: - bs-logger: 0.2.6 - ejs: 3.1.10 - fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) - jest-util: 29.7.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.6.3 - typescript: 5.5.4 - yargs-parser: 21.1.1 - optionalDependencies: '@babel/core': 7.25.2 - '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.25.2) - - ts-jest@29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4): - dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -30176,13 +29766,8 @@ snapshots: semver: 7.6.3 typescript: 5.5.4 yargs-parser: 21.1.1 - optionalDependencies: - '@babel/core': 7.25.2 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.25.2) - ts-loader@9.5.1(typescript@5.5.4)(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))): + ts-loader@9.5.1(typescript@5.5.4)(webpack@5.93.0): dependencies: chalk: 4.1.2 enhanced-resolve: 5.17.1 @@ -30190,7 +29775,7 @@ snapshots: semver: 7.6.3 source-map: 0.7.4 typescript: 5.5.4 - webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) + webpack: 5.93.0(webpack-cli@5.1.4) ts-morph@12.0.0: dependencies: @@ -30238,24 +29823,6 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 16.18.11 - acorn: 8.12.1 - acorn-walk: 8.3.3 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.5.4 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -30564,16 +30131,14 @@ snapshots: use-isomorphic-layout-effect@1.1.2(@types/react@18.3.3)(react@18.3.1): dependencies: - react: 18.3.1 - optionalDependencies: '@types/react': 18.3.3 + react: 18.3.1 use-latest@1.2.1(@types/react@18.3.3)(react@18.3.1): dependencies: + '@types/react': 18.3.3 react: 18.3.1 use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.3)(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.3 use-sync-external-store@1.2.2(react@18.3.1): dependencies: @@ -30646,17 +30211,17 @@ snapshots: vendors@1.0.4: {} - vercel@35.2.3(encoding@0.1.13): + vercel@35.2.3: dependencies: '@vercel/build-utils': 8.3.6 - '@vercel/fun': 1.1.0(encoding@0.1.13) + '@vercel/fun': 1.1.0 '@vercel/go': 3.1.1 '@vercel/hydrogen': 1.0.4 - '@vercel/next': 4.3.6(encoding@0.1.13) - '@vercel/node': 3.2.8(encoding@0.1.13) + '@vercel/next': 4.3.6 + '@vercel/node': 3.2.8 '@vercel/python': 4.3.1 - '@vercel/redwood': 2.1.3(encoding@0.1.13) - '@vercel/remix-builder': 2.2.3(encoding@0.1.13) + '@vercel/redwood': 2.1.3 + '@vercel/remix-builder': 2.2.3 '@vercel/ruby': 2.1.0 '@vercel/static-build': 2.5.18 chokidar: 3.3.1 @@ -30735,13 +30300,13 @@ snapshots: dependencies: defaults: 1.0.4 - web-resource-inliner@6.0.1(encoding@0.1.13): + web-resource-inliner@6.0.1: dependencies: ansi-colors: 4.1.3 escape-goat: 3.0.0 htmlparser2: 5.0.1 mime: 2.6.0 - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 valid-data-url: 3.0.1 transitivePeerDependencies: - encoding @@ -30765,9 +30330,10 @@ snapshots: webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.93.0) + '@webpack-cli/generators': 3.0.7(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.93.0) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.93.0) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.3 @@ -30776,10 +30342,8 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) + webpack: 5.93.0(webpack-cli@5.1.4) webpack-merge: 5.10.0 - optionalDependencies: - '@webpack-cli/generators': 3.0.7(encoding@0.1.13)(mem-fs@2.3.0)(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0) webpack-dev-middleware@5.3.4(webpack@5.93.0): dependencies: @@ -30788,7 +30352,7 @@ snapshots: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.2.0 - webpack: 5.93.0 + webpack: 5.93.0(webpack-cli@5.1.4) webpack-dev-server@4.15.2(webpack@5.93.0): dependencies: @@ -30820,10 +30384,9 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 + webpack: 5.93.0(webpack-cli@5.1.4) webpack-dev-middleware: 5.3.4(webpack@5.93.0) ws: 8.18.0 - optionalDependencies: - webpack: 5.93.0 transitivePeerDependencies: - bufferutil - debug @@ -30833,7 +30396,7 @@ snapshots: webpack-manifest-plugin@4.1.1(webpack@5.93.0): dependencies: tapable: 2.2.1 - webpack: 5.93.0 + webpack: 5.93.0(webpack-cli@5.1.4) webpack-sources: 2.3.1 webpack-merge@5.10.0: @@ -30854,38 +30417,7 @@ snapshots: webpack-sources@3.2.3: {} - webpack@5.93.0: - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.5 - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/wasm-edit': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 - acorn: 8.12.1 - acorn-import-attributes: 1.9.5(acorn@8.12.1) - browserslist: 4.23.3 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.17.1 - es-module-lexer: 1.5.4 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(webpack@5.93.0) - watchpack: 2.4.1 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)): + webpack@5.93.0(webpack-cli@5.1.4): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 @@ -30908,11 +30440,10 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) + terser-webpack-plugin: 5.3.10(webpack@5.93.0) watchpack: 2.4.1 - webpack-sources: 3.2.3 - optionalDependencies: webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) + webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' - esbuild @@ -31034,13 +30565,13 @@ snapshots: dependencies: workbox-core: 6.6.0 - workbox-build@6.6.0(@types/babel__core@7.20.5): + workbox-build@6.6.0: dependencies: '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0) '@babel/core': 7.25.2 '@babel/preset-env': 7.25.2(@babel/core@7.25.2) '@babel/runtime': 7.25.0 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.25.2)(@types/babel__core@7.20.5)(rollup@2.79.1) + '@rollup/plugin-babel': 5.3.1(@babel/core@7.25.2)(rollup@2.79.1) '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1) '@rollup/plugin-replace': 2.4.2(rollup@2.79.1) '@surma/rollup-plugin-off-main-thread': 2.2.3 @@ -31133,14 +30664,14 @@ snapshots: workbox-sw@6.6.0: {} - workbox-webpack-plugin@6.6.0(@types/babel__core@7.20.5)(webpack@5.93.0): + workbox-webpack-plugin@6.6.0(webpack@5.93.0): dependencies: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 - webpack: 5.93.0 + webpack: 5.93.0(webpack-cli@5.1.4) webpack-sources: 1.4.3 - workbox-build: 6.6.0(@types/babel__core@7.20.5) + workbox-build: 6.6.0 transitivePeerDependencies: - '@types/babel__core' - supports-color @@ -31295,13 +30826,13 @@ snapshots: - bluebird - supports-color - yeoman-generator@5.10.0(encoding@0.1.13)(mem-fs@2.3.0)(yeoman-environment@3.19.3): + yeoman-generator@5.10.0(yeoman-environment@3.19.3): dependencies: chalk: 4.1.2 dargs: 7.0.0 debug: 4.3.6(supports-color@5.5.0) execa: 5.1.1 - github-username: 6.0.0(encoding@0.1.13) + github-username: 6.0.0 lodash: 4.17.21 mem-fs-editor: 9.7.0(mem-fs@2.3.0) minimist: 1.2.8 @@ -31312,7 +30843,6 @@ snapshots: shelljs: 0.8.5 sort-keys: 4.2.0 text-table: 0.2.0 - optionalDependencies: yeoman-environment: 3.19.3 transitivePeerDependencies: - bluebird @@ -31334,15 +30864,13 @@ snapshots: compress-commons: 4.1.2 readable-stream: 3.6.2 - zod-prisma@0.5.4(decimal.js@10.4.3)(prisma@5.17.0)(zod@3.23.8): + zod-prisma@0.5.4(prisma@5.17.0)(zod@3.23.8): dependencies: '@prisma/generator-helper': 3.8.1 parenthesis: 3.1.8 prisma: 5.17.0 ts-morph: 13.0.3 zod: 3.23.8 - optionalDependencies: - decimal.js: 10.4.3 zod-to-json-schema@3.23.2(zod@3.23.8): dependencies: From 2365c835d5b52a7a6d617616186a0f0f98fee042 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 30 Sep 2024 14:30:44 +0400 Subject: [PATCH 0891/1353] rotor: facebook-conversions: support for custom event payload provided in 'facebookEvent' event: merge user_data too rotor: facebook-conversions: fill geo properties --- .../src/functions/facebook-conversions.ts | 48 +++++++++++-------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/libs/core-functions/src/functions/facebook-conversions.ts b/libs/core-functions/src/functions/facebook-conversions.ts index f39116db2..c8f7b3f86 100644 --- a/libs/core-functions/src/functions/facebook-conversions.ts +++ b/libs/core-functions/src/functions/facebook-conversions.ts @@ -8,18 +8,17 @@ import { RetryError } from "@jitsu/functions-lib"; import { createFilter, eventTimeSafeMs } from "./lib"; import { deepMerge } from "juava"; -export function facebookHash(email: string) { - return crypto.createHash("sha256").update(email.toLowerCase()).digest("hex"); +export function facebookHash(input: string | undefined) { + if (!input) { + return undefined; + } + return crypto.createHash("sha256").update(input.trim().toLowerCase()).digest("hex"); } function reduceArray(strings: ID[]): ID[] | ID { return strings.length === 1 ? strings[0] : strings; } -function sanitizeEmail(em: string) { - return em.trim().toLowerCase(); -} - function sanitizePhone(ph: string) { let sanitizedPhone = ph.replace(/[^\d]/g, ""); sanitizedPhone = sanitizedPhone.replace(/^0+/, ""); @@ -55,6 +54,16 @@ const FacebookConversionsApi: JitsuFunction !!e)), + client_ip_address: event.context.ip, + client_user_agent: event.context.userAgent, + fbc: event.context.clientIds?.fbc, + fbp: event.context.clientIds?.fbp, + ...geoUserData, + }, app_data: actionSource === "app" ? { @@ -94,20 +116,6 @@ const FacebookConversionsApi: JitsuFunction !!e)), - client_ip_address: event.context.ip, - client_user_agent: event.context.userAgent, - fbc: event.context.clientIds?.fbc, - fbp: event.context.clientIds?.fbp, - }, custom_data: omit(event.properties, [ "path", "referrer", From 3ff17c396ee5a6ec237b52a502723d66eb99a00a Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Mon, 30 Sep 2024 14:54:28 -0400 Subject: [PATCH 0892/1353] feat (jitsu/ee): added email templates for churned users --- webapps/ee-api/components/email-component.tsx | 2 +- webapps/ee-api/emails/styles.ts | 5 +++ webapps/ee-api/emails/welcome.tsx | 7 +--- webapps/ee-api/lib/email.tsx | 34 ++++++++++++++++--- webapps/ee-api/pages/api/email.tsx | 14 +++++--- 5 files changed, 47 insertions(+), 15 deletions(-) create mode 100644 webapps/ee-api/emails/styles.ts diff --git a/webapps/ee-api/components/email-component.tsx b/webapps/ee-api/components/email-component.tsx index 5e32675a3..15f5fa99e 100644 --- a/webapps/ee-api/components/email-component.tsx +++ b/webapps/ee-api/components/email-component.tsx @@ -23,7 +23,7 @@ export const UnsubscribeLink: React.FC<{ unsubscribeLink?: string }> = ({ unsubs Jitsu Labs Inc. 2261 Market Street #4109, San Francisco, CA 94114
    - + Unsubscribe
    diff --git a/webapps/ee-api/emails/styles.ts b/webapps/ee-api/emails/styles.ts new file mode 100644 index 000000000..31b080ad5 --- /dev/null +++ b/webapps/ee-api/emails/styles.ts @@ -0,0 +1,5 @@ +export const main = { + fontFamily: + '-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif', + backgroundColor: "transparent", +}; diff --git a/webapps/ee-api/emails/welcome.tsx b/webapps/ee-api/emails/welcome.tsx index becca67c8..384e39684 100644 --- a/webapps/ee-api/emails/welcome.tsx +++ b/webapps/ee-api/emails/welcome.tsx @@ -4,6 +4,7 @@ import React from "react"; import Link from "next/link"; import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; +import { main } from "./styles"; dayjs.extend(utc); @@ -23,12 +24,6 @@ function nextBusinessDay(now: Date): Date { return day.toDate(); } -const main = { - fontFamily: - '-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif', - backgroundColor: "transparent", -}; - const WelcomeEmail: EmailComponent = ({ name, unsubscribeLink }) => { return ( diff --git a/webapps/ee-api/lib/email.tsx b/webapps/ee-api/lib/email.tsx index ae87c3fcf..2dc868dd2 100644 --- a/webapps/ee-api/lib/email.tsx +++ b/webapps/ee-api/lib/email.tsx @@ -1,4 +1,4 @@ -import { store } from "./services"; +import { pg, store } from "./services"; import dayjs from "dayjs"; import { z } from "zod"; import utc from "dayjs/plugin/utc"; @@ -6,6 +6,8 @@ import { Resend } from "resend"; import { EmailComponent, UnsubscribeLinkProps } from "../components/email-component"; import WelcomeEmail from "../emails/welcome"; import { requireDefined } from "juava"; +import Churned from "../emails/churned"; +import ChurnedCustomerEmail from "../emails/churned"; dayjs.extend(utc); export const UnsubscribeCodes = z.object({ @@ -75,6 +77,7 @@ export const SendEmailRequest = z.object({ //Two flags below, of not set, will be inferred from the EmailTemplale.isTransactional property allowUnsubscribe: z.boolean().optional(), respectUnsubscribe: z.boolean().optional(), + dryRun: z.boolean().optional(), }); export type Payload = z.infer; @@ -83,6 +86,8 @@ export function getComponent(template: string): EmailComponent { + const query = `select id as "workspaceId", slug as "workspaceSlug", name as "workspaceName" from newjitsu."Workspace" where id = $1 or slug = $1`; + const result = await pg.query(query, [workspaceIdOrSlug]); + return result.rows?.[0]; +} + export async function sendEmail(payload: Omit & { to: string }) { + let workspace; + if (payload.workspaceId) { + workspace = await getWorkspaceInfo(payload.workspaceId); + if (!workspace) { + throw new Error(`Workspace not found: ${payload.workspaceId}`); + } + } const env = getEmailEnvSettings(); const resend = new Resend(env.EMAIL_RESEND_KEY); const Component: EmailComponent = getComponent(payload.template); @@ -151,10 +171,16 @@ export async function sendEmail(payload: Omit & { to: string }) { const props = { name: parseEmailAddress(payload.to).name?.split(" ")[0], ...(payload.variables || {}), + ...(workspace || {}), unsubscribeLink: `https://${domain}/api/unsubscribe?email=${encodeURIComponent(recepient)}&code=${unsubscribeCode}`, }; - const scheduledAt = WelcomeEmail.scheduleAt ? WelcomeEmail.scheduleAt(new Date()).toISOString() : undefined; - const subject = typeof Component.subject === "string" ? Component.subject : Component.subject(props); + const scheduledAt = Component.scheduleAt ? Component.scheduleAt(new Date()).toISOString() : undefined; + let subject = typeof Component.subject === "string" ? Component.subject : Component.subject(props); + let to = payload.to; + if (payload.dryRun) { + subject = `[Test - for ${to}] ${subject}`; + to = env.BCC_EMAIL; + } console.log( `Sending email to ${recepient}, scheduled at ${ scheduledAt || "NOW" @@ -163,7 +189,7 @@ export async function sendEmail(payload: Omit & { to: string }) { const result = await resend.emails.send({ from, replyTo, - to: payload.to, + to, bcc: payload.bcc || getVal(Component.bcc, props) || env.BCC_EMAIL, react: , text: Component.plaintext(props), diff --git a/webapps/ee-api/pages/api/email.tsx b/webapps/ee-api/pages/api/email.tsx index e2d0abd49..9ddc48789 100644 --- a/webapps/ee-api/pages/api/email.tsx +++ b/webapps/ee-api/pages/api/email.tsx @@ -1,12 +1,12 @@ import { NextApiRequest, NextApiResponse } from "next"; -import { getOrigin, withErrorHandler } from "../../lib/route-helpers"; +import { withErrorHandler } from "../../lib/route-helpers"; import { assertDefined, assertTrue, requireDefined } from "juava"; import { auth } from "../../lib/auth"; import { pg } from "../../lib/services"; import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; import { result } from "lodash"; -import { sendEmail, SendEmailRequest } from "../../lib/email"; +import { getWorkspaceInfo, sendEmail, SendEmailRequest } from "../../lib/email"; dayjs.extend(utc); @@ -31,10 +31,16 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse assertTrue(claims.type === "admin", "Invalid auth claims"); const payload = SendEmailRequest.parse(req.body); if (payload.workspaceId) { - const members = await getWorkspaceMembers(payload.workspaceId); + const workspace = requireDefined( + await getWorkspaceInfo(payload.workspaceId), + `Workspace not found: ${payload.workspaceId}` + ); + const members = await getWorkspaceMembers(workspace.workspaceId); for (const member of members) { try { - console.log(`Sending email to ${member.email} of workspace ${payload.workspaceId}`); + console.log( + `Handling member ${member.email} of workspace ${workspace.workspaceId} / ${workspace.workspaceSlug}` + ); result[member.email] = await sendEmail({ ...payload, to: makeAddress(member) }); } catch (e: any) { result[member.email] = { error: e?.message }; From 377b0e1fef995b9cb910bfd37e09ba30ffe9a906 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Mon, 30 Sep 2024 15:54:13 -0400 Subject: [PATCH 0893/1353] feat (jitsu/ee): added cron job to export subscriptions --- webapps/ee-api/emails/churned.tsx | 79 +++++++++++++++ webapps/ee-api/lib/auth.ts | 3 + webapps/ee-api/lib/store.ts | 12 +++ webapps/ee-api/lib/stripe.ts | 97 +++++++++++++++---- .../pages/api/billing/export-subscriptions.ts | 26 +++++ webapps/ee-api/vercel.json | 8 ++ 6 files changed, 206 insertions(+), 19 deletions(-) create mode 100644 webapps/ee-api/emails/churned.tsx create mode 100644 webapps/ee-api/pages/api/billing/export-subscriptions.ts create mode 100644 webapps/ee-api/vercel.json diff --git a/webapps/ee-api/emails/churned.tsx b/webapps/ee-api/emails/churned.tsx new file mode 100644 index 000000000..b166791d8 --- /dev/null +++ b/webapps/ee-api/emails/churned.tsx @@ -0,0 +1,79 @@ +import { EmailComponent, UnsubscribeLink, UnsubscribeLinkProps, withDefaults } from "../components/email-component"; +import { Body, Head, Heading, Html, Preview, Text } from "@react-email/components"; +import React from "react"; +import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; +import Link from "next/link"; +import { main } from "./styles"; + +dayjs.extend(utc); + +export type ChurnedEmailProps = { + name?: string; + workspaceName?: string; + workspaceSlug?: string; +} & UnsubscribeLinkProps; + +const ChurnedCustomerEmail: EmailComponent = ({ + name, + workspaceName, + workspaceSlug, + unsubscribeLink, +}: ChurnedEmailProps) => ( + + We’d love to hear your feedback and invite you back to Jitsu + + 👋 Hi {name || "there"}! + + I{"'"}m Vladimir, the CEO of Jitsu! I noticed you recently canceled you + Jitsu Cloud subscription. Your workspace,{" "} + + {workspaceName} + + , is still there, and I’d love to know if there’s anything I could do to make Jitsu work better for you. If + something didn{"'"}t click, or you ran into issues, please let me know. Your feedback really helps us shape a + better platform. + + + If you ever want to come back, it’s super easy to manage your subscription. Just follow{" "} + + this link to resubscribe back + + + P. S: Yes, this is an automated email, but I{"'"}m a real person and will respond. + {unsubscribeLink && } + + +); +ChurnedCustomerEmail.defaultValues = { + name: "John", + workspaceSlug: "workspace-slug", + workspaceName: "Workspace Name", + unsubscribeLink: "https://example.com/unsubscribe", +}; + +ChurnedCustomerEmail.from = "Vladimir from Jitsu "; +ChurnedCustomerEmail.replyTo = "Vladimir Klimontovich "; +ChurnedCustomerEmail.isTransactional = true; + +ChurnedCustomerEmail.subject = "Let’s Make Jitsu Better for You – We’d Love to Have You Back!"; + +ChurnedCustomerEmail.plaintext = ({ name, workspaceName, workspaceSlug, unsubscribeLink }: ChurnedEmailProps) => { + return `👋 Hi ${name || "there"}! + +I noticed you recently unsubscribed from Jitsu. Your workspace, ${workspaceName}, is still there, and +I’d love to know if there’s anything I could do to make Jitsu work better for you. + +If something didn’t click, or you ran into issues, please let me know. Your feedback really helps us +shape a better platform. + +If you ever want to come back, it’s super easy to manage your subscription. Just follow this link to +resubscribe: https://use.jitsu.com/${workspaceSlug}/settings/billing. + +P.S: Yes, this is an automated email, but I'm a real person and will respond. + +${unsubscribeLink ? `If you’d like to unsubscribe, click here: ${unsubscribeLink}` : ""} +`; +}; + +export default withDefaults(ChurnedCustomerEmail); diff --git a/webapps/ee-api/lib/auth.ts b/webapps/ee-api/lib/auth.ts index 4c614f7d9..9d7e47d15 100644 --- a/webapps/ee-api/lib/auth.ts +++ b/webapps/ee-api/lib/auth.ts @@ -63,6 +63,9 @@ export async function auth(req: NextApiRequest, res: NextApiResponse): Promise; del(key: string): Promise; + + clear(): Promise; } /** @@ -151,6 +153,16 @@ export function getPostgresStore( return { getTable(tableName: string): KeyValueTable { return { + async clear() { + const result = await pgPool.query({ + text: `DELETE + FROM ${table} + WHERE namespace = $1`, + values: [tableName], + }); + return result.rowCount || 0; + }, + async list(keyPattern?: string) { await initIfNeeded(); diff --git a/webapps/ee-api/lib/stripe.ts b/webapps/ee-api/lib/stripe.ts index b6d965052..a0e506fe6 100644 --- a/webapps/ee-api/lib/stripe.ts +++ b/webapps/ee-api/lib/stripe.ts @@ -25,6 +25,8 @@ export type Day = `${number}${number}${number}${number}-${number}${number}-${num //entry of `stripe-settings` / `stripe-settings-test-mode` table export type StripeDataTableEntry = { + //active subscription of the workspace + activeSubscription?: Record; //always present even if billing is not managed through stripe stripeCustomerId: string; //if true - no restrictions on workspace, essentially "give everything for free @@ -152,6 +154,50 @@ export function stripeLink(entity: string, id: string) { return `https://dashboard.stripe.com/${entity}/${id}`; } +export async function exportSubscriptions(): Promise> { + const result = {}; + let starting_after: string | undefined = undefined; + const products = Object.fromEntries((await getAvailableProducts()).map(p => [p.id, p])); + console.log("Products", products) + const cus2sub: Record = {} + const sub2prod: Record = {} + while (true) { + const subscriptions = await stripe.subscriptions.list({ status: "all", limit: 100, starting_after }); + for (const sub of subscriptions.data) { + const productId = sub.items.data[0].price.product; + assertDefined(productId, `Can't get product from subscription ${sub.id}`); + assertTrue(typeof productId === "string", `Subscription ${sub.id} should have a string product id`); + const product = products[productId]; + if (!product) { + console.warn(`Product ${productId} not found for subscription ${sub.id}. It might be unrelated subscription. Skipping`); + } else { + cus2sub[sub.customer] = (cus2sub[sub.customer] || []).concat(sub); + sub2prod[sub.id] = product; + } + } + if (!subscriptions.has_more) { + break; + } else { + starting_after = subscriptions.data[subscriptions.data.length - 1].id; + } + } + + for (const [cus, subscriptions] of Object.entries(cus2sub)) { + //first, look for active non-legacy plans + const activeSubscription = subscriptions.find(sub => sub.status === "active"); + const pastDueSubscription = subscriptions.find(sub => sub.status === "past_due"); + const subscription = activeSubscription || pastDueSubscription || subscriptions[0]; + if (subscription) { + result[cus] = { + subscription, + customer: await stripe.customers.retrieve(cus), + product: sub2prod[subscription.id] + } + } + } + return result; +} + export async function getActivePlan(customerId: string): Promise { const subscriptions = await stripe.subscriptions.list({ customer: customerId, status: "all", limit: 10 }); const sub2product = new Map(); @@ -211,30 +257,43 @@ export function getStripeObjectTag() { return (process.env.STRIPE_OBJECT_TAG as string) || "jitsu2.0"; } -/** - * opts.custom - if custom priced products should be included - * @param opts - */ -export async function getAvailableProducts(opts: { custom?: boolean } = {}) { +export async function getAvailableProducts(opts: { custom?: boolean } = {}): Promise{ const stripeObjectTag = getStripeObjectTag(); - const products = (await stripe.products.list({ limit: 100 })).data - .filter(p => p.metadata?.object_tag === stripeObjectTag) - .filter(p => { - if (opts.custom) { - //include everything - return true; - } else { - //check if product is custom priced - const meta = p.metadata?.plan_data ? JSON.parse(p.metadata?.plan_data) : undefined; - return !meta?.custom; - } + let allProducts = []; + let hasMore = true; + let startingAfter: string | undefined = undefined; + + while (hasMore) { + const response = await stripe.products.list({ + limit: 100, + starting_after: startingAfter, }); - if (products.length === 0) { + + const products = response.data + .filter(p => p.metadata?.object_tag === stripeObjectTag) + .filter(p => { + if (opts.custom) { + return true; // include everything + } else { + const meta = p.metadata?.plan_data ? JSON.parse(p.metadata?.plan_data) : undefined; + return !meta?.custom; // exclude custom priced products if opts.custom is not set + } + }); + + allProducts = allProducts.concat(products); + + hasMore = response.has_more; + if (hasMore) { + startingAfter = response.data[response.data.length - 1].id; + } + } + + if (allProducts.length === 0) { throw new Error(`No products with tag ${stripeObjectTag} found`); } - return products; -} + return allProducts; +} export async function getOrCreatePortalConfiguration() { const configurations = await stripe.billingPortal.configurations.list({ limit: 10 }); const stripeObjectTag = getStripeObjectTag(); diff --git a/webapps/ee-api/pages/api/billing/export-subscriptions.ts b/webapps/ee-api/pages/api/billing/export-subscriptions.ts new file mode 100644 index 000000000..d5c880bb1 --- /dev/null +++ b/webapps/ee-api/pages/api/billing/export-subscriptions.ts @@ -0,0 +1,26 @@ +import { NextApiRequest, NextApiResponse } from "next"; +import { exportSubscriptions, getAvailableProducts, stripe } from "../../../lib/stripe"; +import { withErrorHandler } from "../../../lib/route-helpers"; +import { assertTrue, requireDefined } from "juava"; +import { auth } from "../../../lib/auth"; +import { store } from "../../../lib/services"; + +const extendedStripeData = + (process.env.STRIPE_SECRET_KEY as string)?.indexOf("_live_") >= 0 ? "stripe-customer-info" : "stripe-customer-info-test-mode"; + +const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { + const claims = await auth(req, res); + if (!claims) { + throw new Error("Unauthorized"); + } + assertTrue(claims.type === "admin", "Only admins can export subscriptions"); + const subscriptions = await exportSubscriptions(); + await store.getTable(extendedStripeData).clear(); + for (const [sub, data] of Object.entries(subscriptions)) { + await store.getTable(extendedStripeData).put(data.customer.id, data); + } + return res.json(subscriptions); + +}; + +export default withErrorHandler(handler); diff --git a/webapps/ee-api/vercel.json b/webapps/ee-api/vercel.json new file mode 100644 index 000000000..110faaa6e --- /dev/null +++ b/webapps/ee-api/vercel.json @@ -0,0 +1,8 @@ +{ + "crons": [ + { + "path": "/api/billing/export-subscriptions", + "schedule": "0 5 * * *" + } + ] +} \ No newline at end of file From 963e116ed18a71e0ff1209d201c66c17326b623e Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Mon, 30 Sep 2024 15:56:44 -0400 Subject: [PATCH 0894/1353] trivial: fixed format --- webapps/ee-api/lib/stripe.ts | 18 ++++++++++-------- .../pages/api/billing/export-subscriptions.ts | 5 +++-- webapps/ee-api/vercel.json | 2 +- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/webapps/ee-api/lib/stripe.ts b/webapps/ee-api/lib/stripe.ts index a0e506fe6..8db887de0 100644 --- a/webapps/ee-api/lib/stripe.ts +++ b/webapps/ee-api/lib/stripe.ts @@ -154,13 +154,13 @@ export function stripeLink(entity: string, id: string) { return `https://dashboard.stripe.com/${entity}/${id}`; } -export async function exportSubscriptions(): Promise> { +export async function exportSubscriptions(): Promise> { const result = {}; let starting_after: string | undefined = undefined; const products = Object.fromEntries((await getAvailableProducts()).map(p => [p.id, p])); - console.log("Products", products) - const cus2sub: Record = {} - const sub2prod: Record = {} + console.log("Products", products); + const cus2sub: Record = {}; + const sub2prod: Record = {}; while (true) { const subscriptions = await stripe.subscriptions.list({ status: "all", limit: 100, starting_after }); for (const sub of subscriptions.data) { @@ -169,7 +169,9 @@ export async function exportSubscriptions(): Promise{ +export async function getAvailableProducts(opts: { custom?: boolean } = {}): Promise { const stripeObjectTag = getStripeObjectTag(); let allProducts = []; let hasMore = true; diff --git a/webapps/ee-api/pages/api/billing/export-subscriptions.ts b/webapps/ee-api/pages/api/billing/export-subscriptions.ts index d5c880bb1..3c0d0bf79 100644 --- a/webapps/ee-api/pages/api/billing/export-subscriptions.ts +++ b/webapps/ee-api/pages/api/billing/export-subscriptions.ts @@ -6,7 +6,9 @@ import { auth } from "../../../lib/auth"; import { store } from "../../../lib/services"; const extendedStripeData = - (process.env.STRIPE_SECRET_KEY as string)?.indexOf("_live_") >= 0 ? "stripe-customer-info" : "stripe-customer-info-test-mode"; + (process.env.STRIPE_SECRET_KEY as string)?.indexOf("_live_") >= 0 + ? "stripe-customer-info" + : "stripe-customer-info-test-mode"; const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { const claims = await auth(req, res); @@ -20,7 +22,6 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse await store.getTable(extendedStripeData).put(data.customer.id, data); } return res.json(subscriptions); - }; export default withErrorHandler(handler); diff --git a/webapps/ee-api/vercel.json b/webapps/ee-api/vercel.json index 110faaa6e..fd5210ece 100644 --- a/webapps/ee-api/vercel.json +++ b/webapps/ee-api/vercel.json @@ -5,4 +5,4 @@ "schedule": "0 5 * * *" } ] -} \ No newline at end of file +} From f054230697c04b83ffc0dc893e3d870ccfd3a850 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Mon, 30 Sep 2024 16:05:00 -0400 Subject: [PATCH 0895/1353] jitsu/ee: changed cron schedule for billing export --- webapps/ee-api/vercel.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/ee-api/vercel.json b/webapps/ee-api/vercel.json index fd5210ece..267e971a6 100644 --- a/webapps/ee-api/vercel.json +++ b/webapps/ee-api/vercel.json @@ -2,7 +2,7 @@ "crons": [ { "path": "/api/billing/export-subscriptions", - "schedule": "0 5 * * *" + "schedule": "*/1 * * * *" } ] } From 391304fd41d1c70b794eb3d4ac2d2711745bb5b9 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Mon, 30 Sep 2024 16:08:14 -0400 Subject: [PATCH 0896/1353] jitsu/ee: changed cron schedule for billing export to once in 5 mins --- webapps/ee-api/vercel.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/ee-api/vercel.json b/webapps/ee-api/vercel.json index 267e971a6..857cd123b 100644 --- a/webapps/ee-api/vercel.json +++ b/webapps/ee-api/vercel.json @@ -2,7 +2,7 @@ "crons": [ { "path": "/api/billing/export-subscriptions", - "schedule": "*/1 * * * *" + "schedule": "*/5 * * * *" } ] } From d0cf49a21079705acb583d8384cecbaab7b56d0c Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Mon, 30 Sep 2024 16:41:36 -0400 Subject: [PATCH 0897/1353] feat: prototype structures for profile builder --- types/protocols/profile.d.ts | 16 ++++++++++ types/protocols/tsconfig.json | 3 ++ webapps/console/package.json | 1 + webapps/console/prisma/schema.prisma | 47 +++++++++++++++++++++------- 4 files changed, 56 insertions(+), 11 deletions(-) create mode 100644 types/protocols/profile.d.ts create mode 100644 types/protocols/tsconfig.json diff --git a/types/protocols/profile.d.ts b/types/protocols/profile.d.ts new file mode 100644 index 000000000..0cce48152 --- /dev/null +++ b/types/protocols/profile.d.ts @@ -0,0 +1,16 @@ +import { FunctionContext } from "./functions"; +import { AnalyticsServerEvent } from "./analytics"; + +export type ProfileResult = { + properties: Record +} + +export type ProfileFunction = (params: { + context: FunctionContext; + events: Iterable; + user:{ + id?: string; + anonymousId?: string; + traits: Record; + } +}) => Promise \ No newline at end of file diff --git a/types/protocols/tsconfig.json b/types/protocols/tsconfig.json new file mode 100644 index 000000000..378b3b9c1 --- /dev/null +++ b/types/protocols/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../../tsconfig.base.json", +} \ No newline at end of file diff --git a/webapps/console/package.json b/webapps/console/package.json index 5e7728579..281a8ab00 100644 --- a/webapps/console/package.json +++ b/webapps/console/package.json @@ -20,6 +20,7 @@ "tool:hash": "ts-node scripts/password-hash.ts", "db:code-gen": "prisma generate", "db:update-schema": "dotenv -e ../../.env.local -- prisma db push", + "db:format-schema": "dotenv -e ../../.env.local -- prisma format", "db:update-schema-force": "dotenv -e ../../.env.local -- prisma db push --accept-data-loss" }, "dependencies": { diff --git a/webapps/console/prisma/schema.prisma b/webapps/console/prisma/schema.prisma index 42c8759fc..ecd6912fd 100644 --- a/webapps/console/prisma/schema.prisma +++ b/webapps/console/prisma/schema.prisma @@ -59,20 +59,20 @@ model UserProfile { workspaceAccess WorkspaceAccess[] userPreferences UserPreferences[] workspaceUserProperties WorkspaceUserProperties[] - password UserPassword? + password UserPassword? - @@index(externalId) @@unique([loginProvider, externalId]) + @@index(externalId) } model UserPassword { - id String @id @default(cuid()) - createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) - updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) - userId String @unique - user UserProfile @relation(fields: [userId], references: [id]) - hash String - changeAtNextLogin Boolean @default(false) + id String @id @default(cuid()) + createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) + updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) + userId String @unique + user UserProfile @relation(fields: [userId], references: [id]) + hash String + changeAtNextLogin Boolean @default(false) } model Workspace { @@ -90,6 +90,7 @@ model Workspace { preferences UserPreferences[] workspaceUserProperties WorkspaceUserProperties[] featuresEnabled String[] @default([]) + profileBuilderSettings ProfileBuilderSettings[] @@unique(slug) @@index(slug) @@ -162,8 +163,10 @@ model ConfigurationObject { workspace Workspace @relation(fields: [workspaceId], references: [id]) config Json? - fromLinks ConfigurationObjectLink[] @relation("from") - toLinks ConfigurationObjectLink[] @relation("to") + fromLinks ConfigurationObjectLink[] @relation("from") + toLinks ConfigurationObjectLink[] @relation("to") + ProfileBuilderSettings ProfileBuilderSettings[] + ProfileBuilderFunctions ProfileBuilderFunctions[] @@index(updatedAt(sort: Desc)) } @@ -288,6 +291,28 @@ model task_log { @@index(timestamp) } +model ProfileBuilderSettings { + id String @id @default(cuid()) + createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) + updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) + workspaceId String + workspace Workspace @relation(fields: [workspaceId], references: [id]) + intermediateStorageCredentials Json + destinationId String + destination ConfigurationObject @relation(fields: [destinationId], references: [id]) + ProfileBuilderFunctions ProfileBuilderFunctions[] +} + +model ProfileBuilderFunctions { + id String @id @default(cuid()) + createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) + updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) + profileBuilderSettingsId String + profileBuilderSettings ProfileBuilderSettings @relation(fields: [profileBuilderSettingsId], references: [id]) + functionId String + function ConfigurationObject @relation(fields: [functionId], references: [id]) +} + // //model OauthSecrets { From 673ada582584066fd70d25b3d3e29ce4c06532cd Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 2 Oct 2024 12:41:17 +0400 Subject: [PATCH 0898/1353] console: streams-with-destinations repo: never throttle active workspaces --- .../pages/api/admin/export/[name]/index.ts | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/webapps/console/pages/api/admin/export/[name]/index.ts b/webapps/console/pages/api/admin/export/[name]/index.ts index b8fbd2280..ef1f5d6d6 100644 --- a/webapps/console/pages/api/admin/export/[name]/index.ts +++ b/webapps/console/pages/api/admin/export/[name]/index.ts @@ -228,6 +228,27 @@ const exports: Export[] = [ name: "streams-with-destinations", lastModified: getLastUpdated, data: async writer => { + const activeWorkspaces = new Set(); + try { + const rows = await db.pgPool() + .query(`with customers as (select obj -> 'customer' ->> 'id' as customer_id, + obj -> 'subscription' ->> 'status' as status + from newjitsuee.kvstore + where namespace = 'stripe-customer-info' + order by status), + workspaces + as (select id as workspace_id, obj ->> 'stripeCustomerId' as customer_id + from newjitsuee.kvstore + where namespace = 'stripe-settings') + select workspace_id + from workspaces w + right join customers cus on cus.customer_id = w.customer_id + where status = 'active'`); + for (const row of rows.rows) { + activeWorkspaces.add(row.workspace_id); + } + getLog().atInfo().log(`Active workspaces: ${activeWorkspaces.size}`); + } catch (error) {} writer.write("["); let lastId: string | undefined = undefined; let needComma = false; @@ -248,7 +269,9 @@ const exports: Export[] = [ if (needComma) { writer.write(","); } - const throttlePercent = getNumericOption("throttle", obj.workspace); + const throttlePercent = !activeWorkspaces.has(obj.workspace.id) + ? getNumericOption("throttle", obj.workspace) + : undefined; const shardNumber = getNumericOption("shard", obj.workspace); writer.write( JSON.stringify({ From 59a4b13c3f0bf48a25ffef8a94483d7eeb50afde Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 2 Oct 2024 12:51:26 +0400 Subject: [PATCH 0899/1353] console: streams-with-destinations repo: never throttle active workspaces --- types/protocols/profile.d.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/types/protocols/profile.d.ts b/types/protocols/profile.d.ts index 0cce48152..2f6519e3c 100644 --- a/types/protocols/profile.d.ts +++ b/types/protocols/profile.d.ts @@ -2,15 +2,15 @@ import { FunctionContext } from "./functions"; import { AnalyticsServerEvent } from "./analytics"; export type ProfileResult = { - properties: Record -} + properties: Record; +}; export type ProfileFunction = (params: { context: FunctionContext; events: Iterable; - user:{ + user: { id?: string; anonymousId?: string; traits: Record; - } -}) => Promise \ No newline at end of file + }; +}) => Promise; From 6d6552341522c03ffdd1a0d1cbdb01d242e1e7f0 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Sat, 5 Oct 2024 08:34:00 +0400 Subject: [PATCH 0900/1353] fix --- webapps/console/lib/schema/destinations.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/webapps/console/lib/schema/destinations.tsx b/webapps/console/lib/schema/destinations.tsx index a125bd946..272364b4b 100644 --- a/webapps/console/lib/schema/destinations.tsx +++ b/webapps/console/lib/schema/destinations.tsx @@ -113,7 +113,8 @@ export const BatchModeOptions = z.object({ .int() .min(1) .max(60 * 24) - .default(5), + .default(5) + .nullish(), }); export type BatchModeOptions = z.infer; From bb005752066aded8e989a14f3e5bb645b6d6cae6 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Sat, 5 Oct 2024 18:34:54 +0400 Subject: [PATCH 0901/1353] added schema for sync link --- webapps/console/lib/schema/index.ts | 21 +++++++++++++++++++ webapps/console/pages/api/schema/[...type].ts | 6 ++++-- webapps/console/pages/api/schema/index.ts | 16 +------------- 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/webapps/console/lib/schema/index.ts b/webapps/console/lib/schema/index.ts index 6665bf60f..0755ddbb0 100644 --- a/webapps/console/lib/schema/index.ts +++ b/webapps/console/lib/schema/index.ts @@ -222,3 +222,24 @@ export const UserWorkspaceRelation = z.object({ }); export type UserWorkspaceRelation = z.infer; + +export const BaseLinkType = z.object({ fromId: z.string(), toId: z.string() }); + +export const SelectedStreamSettings = z.object({ + sync_mode: z.enum(["full_refresh", "incremental"]), + table_name: z.string().optional(), + cursor_field: z.array(z.string()).optional(), +}); + +export type SelectedStreamSettings = z.infer; + +export const SyncOptionsType = z.object({ + streams: z.record(SelectedStreamSettings), + namespace: z.string().optional(), + tableNamePrefix: z.string().optional(), + toSameCase: z.boolean().optional(), + schedule: z.union([z.string(), z.enum(["0 0 * * *", "0 * * * *", "*/15 * * * *", "*/5 * * * *", "* * * * *"])]), + timezone: z.string().optional(), +}); + +export type SyncOptionsType = z.infer; diff --git a/webapps/console/pages/api/schema/[...type].ts b/webapps/console/pages/api/schema/[...type].ts index 5900615d2..15d9d582e 100644 --- a/webapps/console/pages/api/schema/[...type].ts +++ b/webapps/console/pages/api/schema/[...type].ts @@ -3,8 +3,7 @@ import { z } from "zod"; import { getConfigObjectType } from "../../../lib/schema/config-objects"; import zodToJsonSchema from "zod-to-json-schema"; import { getCoreDestinationType } from "../../../lib/schema/destinations"; - -export const BaseLinkType = z.object({ fromId: z.string(), toId: z.string() }); +import { BaseLinkType, SyncOptionsType } from "../../../lib/schema"; export default createRoute() .GET({ @@ -18,6 +17,9 @@ export default createRoute() } if (type === "link") { if (subType) { + if (subType === "sync") { + return zodToJsonSchema(BaseLinkType.merge(z.object({ data: SyncOptionsType }))); + } const opts = getCoreDestinationType(subType).connectionOptions; return zodToJsonSchema(BaseLinkType.merge(z.object({ data: opts }))); } else { diff --git a/webapps/console/pages/api/schema/index.ts b/webapps/console/pages/api/schema/index.ts index 7cb98c40e..93ce57f74 100644 --- a/webapps/console/pages/api/schema/index.ts +++ b/webapps/console/pages/api/schema/index.ts @@ -1,11 +1,8 @@ import { createRoute } from "../../../lib/api"; -import { z } from "zod"; import { getAllConfigObjectTypeNames } from "../../../lib/schema/config-objects"; import { coreDestinations } from "../../../lib/schema/destinations"; import { getAppEndpoint } from "../../../lib/domains"; -const BaseLinkType = z.object({ fromId: z.string(), toId: z.string() }); - export default createRoute() .GET({ auth: false, @@ -30,24 +27,13 @@ export default createRoute() }), {} ); - } else if (typeName === "destination") { - schema.subTypes = coreDestinations.reduce( - (acc, dest) => ({ - ...acc, - [dest.id]: { - type: `${dest.id}`, - schemaURL: `${publicEndpoints.baseUrl}/api/schema/${typeName}/${dest.id}`, - }, - }), - {} - ); } result.push(schema); } result.push({ type: "link", schemaURL: `${publicEndpoints.baseUrl}/api/schema/link`, - subTypes: coreDestinations.reduce( + subTypes: [{ id: "sync" }, ...coreDestinations].reduce( (acc, dest) => ({ ...acc, [dest.id]: { From 41d96817d03caf6e72df3dfd7e83ad09255a045e Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 7 Oct 2024 12:15:59 +0400 Subject: [PATCH 0902/1353] console: export: sync debug repo --- .../pages/api/admin/export/[name]/index.ts | 66 ++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/webapps/console/pages/api/admin/export/[name]/index.ts b/webapps/console/pages/api/admin/export/[name]/index.ts index ef1f5d6d6..9ef00d914 100644 --- a/webapps/console/pages/api/admin/export/[name]/index.ts +++ b/webapps/console/pages/api/admin/export/[name]/index.ts @@ -1,13 +1,15 @@ import { createRoute, verifyAdmin } from "../../../../../lib/api"; import { db } from "../../../../../lib/server/db"; -import { getErrorMessage, getLog, requireDefined, rpc } from "juava"; +import { getErrorMessage, getLog, hash as juavaHash, requireDefined, rpc } from "juava"; import { z } from "zod"; import { getCoreDestinationTypeNonStrict } from "../../../../../lib/schema/destinations"; import { createJwt, getEeConnection, isEEAvailable } from "../../../../../lib/server/ee"; import omit from "lodash/omit"; import { NextApiRequest } from "next"; import hash from "object-hash"; +import { default as stableHash } from "stable-hash"; import { WorkspaceDbModel } from "../../../../../prisma/schema"; +import pick from "lodash/pick"; interface Writer { write(data: string): void; @@ -318,6 +320,68 @@ const exports: Export[] = [ writer.write("]"); }, }, + { + name: "syncs-debug", + lastModified: getLastUpdated, + data: async writer => { + writer.write("["); + + let lastId: string | undefined = undefined; + let needComma = false; + while (true) { + const objects = await db.prisma().configurationObjectLink.findMany({ + where: { + deleted: false, + type: "sync", + workspace: { deleted: false }, + from: { deleted: false }, + to: { deleted: false }, + }, + include: { from: true, to: true, workspace: true }, + take: batchSize, + cursor: lastId ? { id: lastId } : undefined, + orderBy: { id: "asc" }, + }); + if (objects.length == 0) { + break; + } + getLog().atDebug().log(`Got batch of ${objects.length} objects for bulker export`); + lastId = objects[objects.length - 1].id; + for (const { data, from, id, to, updatedAt, workspace } of objects) { + const destinationType = to.config.destinationType; + const coreDestinationType = getCoreDestinationTypeNonStrict(destinationType); + if (!coreDestinationType) { + getLog().atError().log(`Unknown destination type: ${destinationType} for connection ${id}`); + } + if (needComma) { + writer.write(","); + } + const h = juavaHash("md5", stableHash(from.config.credentials)); + const storageKey = `${workspace.id}_${from.id}_${h}`; + writer.write( + JSON.stringify({ + id: id, + type: destinationType, + workspaceId: workspace.id, + streamId: from.id, + destinationId: to.id, + usesBulker: !!coreDestinationType?.usesBulker, + options: { + ...pick(data, "storageKey"), + versionHash: storageKey, + }, + updatedAt: dateMax(updatedAt, to.updatedAt), + }) + ); + needComma = true; + } + if (objects.length < batchSize) { + break; + } + } + writer.write("]"); + }, + }, ]; const exportsMap = exports.reduce((acc, e) => ({ ...acc, [e.name]: e }), {}); From 799c418d9d1ac594d9779d852e5c3b99b576045b Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 7 Oct 2024 13:28:40 +0400 Subject: [PATCH 0903/1353] console: sync api improvements (#1132) * console: sync api improvements --- .../ServiceEditor/ServiceEditor.tsx | 28 ++- .../ServicesCatalog/ServicesCatalog.tsx | 5 +- .../SyncEditorPage/SyncEditorPage.tsx | 61 ++---- webapps/console/lib/server/sync.ts | 8 +- .../pages/api/[workspaceId]/config/link.ts | 175 +++++++++--------- .../api/[workspaceId]/sources/discover.ts | 118 +++++------- .../pages/api/[workspaceId]/sources/spec.ts | 44 ++--- 7 files changed, 204 insertions(+), 235 deletions(-) diff --git a/webapps/console/components/ServiceEditor/ServiceEditor.tsx b/webapps/console/components/ServiceEditor/ServiceEditor.tsx index 9159a7a44..be6559fa4 100644 --- a/webapps/console/components/ServiceEditor/ServiceEditor.tsx +++ b/webapps/console/components/ServiceEditor/ServiceEditor.tsx @@ -1,6 +1,6 @@ import { EditorComponentProps } from "../ConfigObjectEditor/ConfigEditor"; import React, { useCallback, useEffect, useMemo, useState } from "react"; -import { getErrorMessage, getLog, hash as juavaHash, rpc } from "juava"; +import { getErrorMessage, getLog, rpc } from "juava"; import { EditorTitle } from "../ConfigObjectEditor/EditorTitle"; import { EditorBase } from "../ConfigObjectEditor/EditorBase"; import { LoadingAnimation } from "../GlobalLoader/GlobalLoader"; @@ -23,7 +23,6 @@ import unset from "lodash/unset"; import { SchemaForm } from "../ConfigObjectEditor/SchemaForm"; import { TextEditor } from "../ConfigObjectEditor/Editors"; import { useAntdModal } from "../../lib/modal"; -import hash from "stable-hash"; import { useStoreReload } from "../../lib/store"; type ServiceEditorProps = {} & EditorComponentProps; @@ -83,7 +82,9 @@ export const ServiceEditor: React.FC = props => { (async () => { setLoadingSpecs(true); try { - const firstRes = await rpc(`/api/${workspace.id}/sources/spec?package=${obj.package}&version=${obj.version}`); + const firstRes = await rpc( + `/api/${workspace.id}/sources/spec?package=${obj.package}&version=${obj.version}&force=true` + ); if (firstRes.ok) { getLog().atDebug().log("Loaded cached specs", firstRes); setSpecs(firstRes.specs); @@ -95,9 +96,7 @@ export const ServiceEditor: React.FC = props => { } else { for (let i = 0; i < 60; i++) { await new Promise(resolve => setTimeout(resolve, 2000)); - const resp = await rpc( - `/api/${workspace.id}/sources/spec?package=${obj.package}&version=${obj.version}&after=${firstRes.startedAt}` - ); + const resp = await rpc(`/api/${workspace.id}/sources/spec?package=${obj.package}&version=${obj.version}`); if (!resp.pending) { if (resp.error) { feedbackError(`Cannot load specs for ${obj.package}:${obj.version}`, { @@ -169,21 +168,18 @@ export const ServiceEditor: React.FC = props => { const _save = async (testConnectionError?: string) => { obj.credentials = credentials; obj.testConnectionError = testConnectionError; - const storageKey = `${workspace.id}_${obj.id}_${juavaHash("md5", hash(credentials))}`; - // trigger loading catalog in background (k8s) - await rpc( - `/api/${workspace.id}/sources/discover?package=${obj.package}&version=${obj.version}&storageKey=${storageKey}`, - { - body: obj, - } - ); + let res: any = undefined; if (props.isNew) { - await getConfigApi(workspace.id, "service").create(obj); + res = await getConfigApi(workspace.id, "service").create(obj); } else if (obj.id) { - await getConfigApi(workspace.id, "service").update(obj.id, obj); + res = await getConfigApi(workspace.id, "service").update(obj.id, obj); } else { feedbackError(`Can't save service without id`); } + if (res?.success || res?.id) { + // trigger loading catalog in background (k8s) + await rpc(`/api/${workspace.id}/sources/discover?serviceId=${res?.id || obj.id}`); + } await reloadStore(); push(`/${workspace.id}/services`); }; diff --git a/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx b/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx index b5725eb99..17eaa0d79 100644 --- a/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx +++ b/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx @@ -123,7 +123,10 @@ export const ServicesCatalog: React.FC<{ onClick: (packageType, packageId: strin >
    {getServiceIcon(source, sourcesIcons)}
    -
    {source.meta.name}
    +
    +
    {source.meta.name}
    +
    +
    {source.packageId}
    ); diff --git a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx index 32af2c26a..c7ea1485d 100644 --- a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx +++ b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx @@ -1,11 +1,11 @@ import { useAppConfig, useWorkspace } from "../../lib/context"; import { get } from "../../lib/useApi"; -import { DestinationConfig, ServiceConfig } from "../../lib/schema"; +import { DestinationConfig, SelectedStreamSettings, ServiceConfig, SyncOptionsType } from "../../lib/schema"; import React, { useCallback, useEffect, useState } from "react"; import { z } from "zod"; import { ConfigurationObjectLinkDbModel } from "../../prisma/schema"; import { useRouter } from "next/router"; -import { assertTrue, getLog, hash as juavaHash, requireDefined, rpc } from "juava"; +import { assertTrue, getLog, requireDefined, rpc } from "juava"; import { Disable } from "../Disable/Disable"; import { Button, Checkbox, Input, Select, Switch, Tooltip } from "antd"; import { getCoreDestinationType } from "../../lib/schema/destinations"; @@ -14,7 +14,6 @@ import FieldListEditorLayout, { EditorItem } from "../FieldListEditorLayout/Fiel import { ChevronLeft, ExternalLink } from "lucide-react"; import { JitsuButton } from "../JitsuButton/JitsuButton"; import { LoadingAnimation } from "../GlobalLoader/GlobalLoader"; -import hash from "stable-hash"; import { DestinationTitle } from "../../pages/[workspaceId]/destinations"; import { ServiceTitle } from "../../pages/[workspaceId]/services"; import { SwitchComponent } from "../ConnectionEditorPage/ConnectionEditorPage"; @@ -86,24 +85,6 @@ type SelectorProps = { onSelect: (value: string) => void; }; -type SyncOptionsType = { - storageKey?: string; - streams?: SelectedStreams; - namespace?: string; - tableNamePrefix?: string; - toSameCase?: boolean; - schedule?: string; - timezone?: string; -}; - -type SelectedStreamSettings = { - sync_mode: "full_refresh" | "incremental"; - table_name?: string; - cursor_field?: string[]; -}; - -type SelectedStreams = Record; - function DestinationSelector(props: SelectorProps) { return (
    @@ -212,7 +193,7 @@ function SyncEditor({ const destinationType = getCoreDestinationType(destination.destinationType); const namespaceImpl = namespaceImplementation[destinationType.id] ?? { name: "namespace", filed: "namespace" }; - const [syncOptions, setSyncOptions] = useState( + const [syncOptions, setSyncOptions] = useState( (existingLink?.data || { namespace: "" }) as SyncOptionsType ); const [catalog, setCatalog] = useState(undefined); @@ -268,7 +249,10 @@ function SyncEditor({ ...syncOptions, streams: { ...syncOptions.streams, - [streamName]: { ...syncOptions.streams?.[streamName], [propName]: value } as SelectedStreamSettings, + [streamName]: { + ...syncOptions.streams?.[streamName], + [propName]: value, + } as SelectedStreamSettings, }, }); } @@ -348,8 +332,8 @@ function SyncEditor({ }; const initSyncOptions = useCallback( - (storageKey: string, catalog: any, force?: boolean) => { - const streams: SelectedStreams = {}; + (catalog: any, force?: boolean) => { + const streams: Record = {}; const currentStreams = force ? {} : syncOptions?.streams || {}; const newSync = typeof syncOptions?.streams === "undefined" || force; for (const stream of catalog?.streams ?? []) { @@ -362,9 +346,7 @@ function SyncEditor({ } } if (xor(Object.keys(streams), Object.keys(currentStreams)).length > 0) { - updateOptions({ streams, storageKey }); - } else { - updateOptions({ storageKey }); + updateOptions({ streams }); } }, [syncOptions?.streams, updateOptions] @@ -379,10 +361,10 @@ function SyncEditor({ }, [syncOptions]); const addAllStreams = useCallback(() => { - if (syncOptions?.storageKey && catalog) { - initSyncOptions(syncOptions?.storageKey, catalog, true); + if (catalog) { + initSyncOptions(catalog, true); } - }, [initSyncOptions, catalog, syncOptions?.storageKey]); + }, [initSyncOptions, catalog]); useEffect(() => { if (!service) { @@ -398,15 +380,8 @@ function SyncEditor({ setLoadingCatalog(true); try { const force = refreshCatalog > 0; - const h = juavaHash("md5", hash(service.credentials)); - const storageKey = `${workspace.id}_${service.id}_${h}`; const firstRes = await rpc( - `/api/${workspace.id}/sources/discover?package=${service.package}&version=${ - service.version - }&storageKey=${storageKey}${force ? "&refresh=true" : ""}`, - { - body: service, - } + `/api/${workspace.id}/sources/discover?serviceId=${service.id}${force ? "&refresh=true" : ""}` ); if (cancelled) { return; @@ -416,16 +391,14 @@ function SyncEditor({ } else if (firstRes.ok) { console.log("Loaded cached catalog:", JSON.stringify(firstRes, null, 2)); setCatalog(firstRes.catalog); - initSyncOptions(storageKey, firstRes.catalog); + initSyncOptions(firstRes.catalog); } else { for (let i = 0; i < 600; i++) { if (cancelled) { return; } await new Promise(resolve => setTimeout(resolve, 2000)); - const resp = await rpc( - `/api/${workspace.id}/sources/discover?package=${service.package}&version=${service.version}&storageKey=${storageKey}` - ); + const resp = await rpc(`/api/${workspace.id}/sources/discover?serviceId=${service.id}`); if (!resp.pending) { if (typeof resp.error !== "undefined") { setCatalogError(resp.error); @@ -433,7 +406,7 @@ function SyncEditor({ } else { console.log("Loaded catalog:", JSON.stringify(resp, null, 2)); setCatalog(resp.catalog); - initSyncOptions(storageKey, resp.catalog); + initSyncOptions(resp.catalog); return; } } diff --git a/webapps/console/lib/server/sync.ts b/webapps/console/lib/server/sync.ts index 896a2e54b..e4679a204 100644 --- a/webapps/console/lib/server/sync.ts +++ b/webapps/console/lib/server/sync.ts @@ -1,7 +1,7 @@ import { CloudSchedulerClient } from "@google-cloud/scheduler"; import { db } from "./db"; import { ConfigurationObject, ConfigurationObjectLink } from "@prisma/client"; -import { LogFactory, randomId, requireDefined, rpc, stopwatch } from "juava"; +import { hash as juavaHash, LogFactory, randomId, requireDefined, rpc, stopwatch } from "juava"; import { google } from "@google-cloud/scheduler/build/protos/protos"; import { difference } from "lodash"; import { getServerLog } from "./log"; @@ -16,6 +16,7 @@ import omit from "lodash/omit"; import { FunctionLogger, SetOpts, Store, SyncFunction } from "@jitsu/protocols/functions"; import { mixpanelFacebookAdsSync, mixpanelGoogleAdsSync } from "./syncs/mixpanel"; import IJob = google.cloud.scheduler.v1.IJob; +import hash from "stable-hash"; const log = getServerLog("sync-scheduler"); @@ -593,7 +594,10 @@ export async function scheduleSync({ }; } - const catalog = await catalogFromDb(serviceConfig.package, serviceConfig.version, (sync.data as any).storageKey); + const h = juavaHash("md5", hash(serviceConfig.credentials)); + const versionHash = `${workspaceId}_${serviceConfig.id}_${h}`; + + const catalog = await catalogFromDb(serviceConfig.package, serviceConfig.version, versionHash); if (!catalog) { return { ok: false, diff --git a/webapps/console/pages/api/[workspaceId]/config/link.ts b/webapps/console/pages/api/[workspaceId]/config/link.ts index 50efb4ff4..754d5697f 100644 --- a/webapps/console/pages/api/[workspaceId]/config/link.ts +++ b/webapps/console/pages/api/[workspaceId]/config/link.ts @@ -5,6 +5,95 @@ import { randomId } from "juava"; import { scheduleSync, syncWithScheduler } from "../../../../lib/server/sync"; import { getAppEndpoint } from "../../../../lib/domains"; +const postAndPutCfg = { + auth: true, + types: { + query: z.object({ workspaceId: z.string(), runSync: z.string().optional() }), + body: z.object({ + id: z.string().optional(), + data: z.any().optional(), + toId: z.string(), + fromId: z.string(), + type: z.string().optional(), + }), + }, + handle: async (ctx: any) => { + const { + body, + user, + query: { workspaceId, runSync }, + req, + } = ctx; + const { id, toId, fromId, data = undefined, type = "push" } = body; + await verifyAccess(user, workspaceId); + const fromType = type === "sync" ? "service" : "stream"; + + // we allow duplicates of service=>dst links because they may have different streams and scheduling + const existingLink = + type === "push" + ? await db.prisma().configurationObjectLink.findFirst({ + where: { workspaceId: workspaceId, toId, fromId, deleted: false }, + }) + : id + ? await db + .prisma() + .configurationObjectLink.findFirst({ where: { workspaceId: workspaceId, id, deleted: false } }) + : undefined; + + if (!id && existingLink) { + throw new Error(`Link from '${fromId}' to '${toId}' already exists`); + } + + const co = db.prisma().configurationObject; + if ( + !(await co.findFirst({ + where: { workspaceId: workspaceId, type: fromType, id: fromId, deleted: false }, + })) + ) { + throw new Error(`${fromType} object with id '${fromId}' not found in the workspace '${workspaceId}'`); + } + if ( + !(await co.findFirst({ + where: { workspaceId: workspaceId, type: "destination", id: toId, deleted: false }, + })) + ) { + throw new Error(`Destination object with id '${toId}' not found in the workspace '${workspaceId}'`); + } + let createdOrUpdated; + if (existingLink) { + createdOrUpdated = await db.prisma().configurationObjectLink.update({ + where: { id: existingLink.id }, + data: { data, deleted: false, workspaceId }, + }); + //try to do asynchronously for edit + syncWithScheduler(getAppEndpoint(req).baseUrl); + } else { + createdOrUpdated = await db.prisma().configurationObjectLink.create({ + data: { + id: `${workspaceId}-${fromId.substring(fromId.length - 4)}-${toId.substring(toId.length - 4)}-${randomId(6)}`, + workspaceId, + fromId, + toId, + data, + type, + }, + }); + //sync scheduler immediately, so if it fails, user sees the error + await syncWithScheduler(getAppEndpoint(req).baseUrl); + } + if (type === "sync" && (runSync === "true" || runSync === "1")) { + await scheduleSync({ + req, + user, + trigger: "manual", + workspaceId, + syncIdOrModel: createdOrUpdated.id, + }); + } + return { id: createdOrUpdated.id, created: !existingLink }; + }, +}; + export const api: Api = { url: inferUrl(__filename), GET: { @@ -22,90 +111,8 @@ export const api: Api = { }; }, }, - POST: { - auth: true, - types: { - query: z.object({ workspaceId: z.string(), runSync: z.string().optional() }), - body: z.object({ - id: z.string().optional(), - data: z.any().optional(), - toId: z.string(), - fromId: z.string(), - type: z.string().optional(), - }), - }, - handle: async ({ body, user, query: { workspaceId, runSync }, req }) => { - const { id, toId, fromId, data = undefined, type = "push" } = body; - await verifyAccess(user, workspaceId); - const fromType = type === "sync" ? "service" : "stream"; - - // we allow duplicates of service=>dst links because they may have different streams and scheduling - const existingLink = - type === "push" - ? await db.prisma().configurationObjectLink.findFirst({ - where: { workspaceId: workspaceId, toId, fromId, deleted: false }, - }) - : id - ? await db - .prisma() - .configurationObjectLink.findFirst({ where: { workspaceId: workspaceId, id, deleted: false } }) - : undefined; - - if (!id && existingLink) { - throw new Error(`Link from '${fromId}' to '${toId}' already exists`); - } - - const co = db.prisma().configurationObject; - if ( - !(await co.findFirst({ - where: { workspaceId: workspaceId, type: fromType, id: fromId, deleted: false }, - })) - ) { - throw new Error(`${fromType} object with id '${fromId}' not found in the workspace '${workspaceId}'`); - } - if ( - !(await co.findFirst({ - where: { workspaceId: workspaceId, type: "destination", id: toId, deleted: false }, - })) - ) { - throw new Error(`Destination object with id '${toId}' not found in the workspace '${workspaceId}'`); - } - let createdOrUpdated; - if (existingLink) { - createdOrUpdated = await db.prisma().configurationObjectLink.update({ - where: { id: existingLink.id }, - data: { data, deleted: false, workspaceId }, - }); - //try to do asynchronously for edit - syncWithScheduler(getAppEndpoint(req).baseUrl); - } else { - createdOrUpdated = await db.prisma().configurationObjectLink.create({ - data: { - id: `${workspaceId}-${fromId.substring(fromId.length - 4)}-${toId.substring(toId.length - 4)}-${randomId( - 6 - )}`, - workspaceId, - fromId, - toId, - data, - type, - }, - }); - //sync scheduler immediately, so if it fails, user sees the error - await syncWithScheduler(getAppEndpoint(req).baseUrl); - } - if (type === "sync" && (runSync === "true" || runSync === "1")) { - await scheduleSync({ - req, - user, - trigger: "manual", - workspaceId, - syncIdOrModel: createdOrUpdated.id, - }); - } - return { id: createdOrUpdated.id, created: !existingLink }; - }, - }, + POST: postAndPutCfg, + PUT: postAndPutCfg, DELETE: { auth: true, types: { diff --git a/webapps/console/pages/api/[workspaceId]/sources/discover.ts b/webapps/console/pages/api/[workspaceId]/sources/discover.ts index 528e75529..96453de31 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/discover.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/discover.ts @@ -1,12 +1,12 @@ import { db } from "../../../../lib/server/db"; import { z } from "zod"; import { createRoute, verifyAccess } from "../../../../lib/api"; -import { ServiceConfig } from "../../../../lib/schema"; -import { requireDefined, rpc } from "juava"; +import { hash as juavaHash, isTruish, requireDefined, rpc } from "juava"; import { getServerLog } from "../../../../lib/server/log"; import { tryManageOauthCreds } from "../../../../lib/server/oauth/services"; import { syncError } from "../../../../lib/server/sync"; +import hash from "stable-hash"; const log = getServerLog("sync-discover"); @@ -27,17 +27,17 @@ const queryType = z.object({ type catalogKeyType = z.infer; export default createRoute() - .POST({ + .GET({ auth: true, query: z.object({ workspaceId: z.string(), - storageKey: z.string(), + serviceId: z.string(), refresh: z.string().optional(), + force: z.string().optional(), }), - body: ServiceConfig, result: resultType, }) - .handler(async ({ user, query, body, req }) => { + .handler(async ({ user, query, req }) => { const { workspaceId } = query; await verifyAccess(user, workspaceId); @@ -45,9 +45,6 @@ export default createRoute() process.env.SYNCCTL_URL, `env SYNCCTL_URL is not set. Sync Controller is required to run sources` ); - if (!query.storageKey.startsWith(workspaceId)) { - return { ok: false, error: "storageKey doesn't belong to the current workspace" }; - } const syncAuthKey = process.env.SYNCCTL_AUTH_KEY ?? ""; const authHeaders: any = {}; if (syncAuthKey) { @@ -55,86 +52,73 @@ export default createRoute() } try { - if (query.refresh !== "true") { - const discoverDbRes = await catalogFromDb({ ...query, package: body.package, version: body.version }); - if (discoverDbRes && !discoverDbRes.error) { - return discoverDbRes; - } + let existingService = (await db.prisma().configurationObject.findFirst({ + where: { id: query.serviceId }, + })) as any; + if (!existingService || existingService.workspaceId !== workspaceId) { + return { ok: false, error: `Service Connector not found for id: ${query.serviceId}` }; } - const serviceConfig = body as ServiceConfig; - const existingService = await db.prisma().configurationObject.findFirst({ - where: { id: serviceConfig.id }, - }); - if (existingService && existingService.workspaceId !== workspaceId) { - return { ok: false, error: "invalid service id" }; + existingService = { ...(existingService.config as any), ...existingService } as any; + const h = juavaHash("md5", hash(existingService.credentials)); + const storageKey = `${workspaceId}_${existingService.id}_${h}`; + + if (!isTruish(query.force)) { + const discoverDbRes = await catalogFromDb({ + storageKey, + package: existingService.package, + version: existingService.version, + }); + if (discoverDbRes) { + if (discoverDbRes.pending) { + return discoverDbRes; + } else if (!isTruish(query.refresh)) { + return discoverDbRes; + } + } } const discoverQueryRes = await rpc(syncURL + "/discover", { method: "POST", body: { - config: await tryManageOauthCreds(serviceConfig), + config: await tryManageOauthCreds(existingService), }, headers: { "Content-Type": "application/json", ...authHeaders, }, query: { - package: body.package, - version: body.version, - storageKey: query.storageKey, + package: existingService.package, + version: existingService.version, + storageKey: storageKey, }, }); if (!discoverQueryRes.ok) { return { ok: false, error: discoverQueryRes.error ?? "unknown error" }; } else { + await db.pgPool().query( + `INSERT INTO newjitsu.source_catalog (package, version, key, timestamp, status, description) + VALUES ($1, $2, $3, $4, $5, $6) + ON CONFLICT ON CONSTRAINT source_catalog_pkey DO UPDATE SET timestamp = $4, + status=$5, + description=$6`, + [existingService.package, existingService.version, storageKey, new Date(), "RUNNING", "RUNNING"] + ); return { ok: false, pending: true }; } } catch (e: any) { - return syncError( - log, - `Error running discover`, - e, - false, - `source: ${query.storageKey} workspace: ${workspaceId}` - ); - } - }) - .GET({ - auth: true, - query: queryType, - result: resultType, - }) - .handler(async ({ user, query, body }) => { - const { workspaceId } = query; - await verifyAccess(user, workspaceId); - if (!query.storageKey.startsWith(workspaceId)) { - return { ok: false, error: "storageKey doesn't belong to the current workspace" }; - } - try { - const res = await catalogFromDb(query); - if (res) { - return res; - } else { - throw new Error("catalog not found in the database"); - } - } catch (e: any) { - return syncError( - log, - `Error running discover`, - e, - false, - `source: ${query.storageKey} workspace: ${workspaceId}` - ); + return syncError(log, `Error running discover`, e, false, `source: ${query.serviceId} workspace: ${workspaceId}`); } }) .toNextApiHandler(); -async function catalogFromDb(query: Omit) { - const res = await db - .pgPool() - .query( - `select catalog, status, description from newjitsu.source_catalog where key = $1 and package = $2 and version = $3`, - [query.storageKey, query.package, query.version] - ); +async function catalogFromDb( + query: Omit +): Promise<{ ok: boolean; catalog?: any; error?: string; pending?: boolean } | undefined> { + const res = await db.pgPool().query( + `select catalog, status, description from newjitsu.source_catalog where key = $1 + and package = $2 + and version = $3`, + [query.storageKey, query.package, query.version] + ); if (res.rowCount === 1) { const status = res.rows[0].status; const catalog = res.rows[0].catalog; @@ -148,6 +132,6 @@ async function catalogFromDb(query: Omit) { return { ok: false, error: description }; } } else { - return null; + return undefined; } } diff --git a/webapps/console/pages/api/[workspaceId]/sources/spec.ts b/webapps/console/pages/api/[workspaceId]/sources/spec.ts index 483eab467..4293e2cfa 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/spec.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/spec.ts @@ -1,7 +1,7 @@ import { db } from "../../../../lib/server/db"; import { z } from "zod"; import { createRoute, verifyAccess } from "../../../../lib/api"; -import { requireDefined, rpc } from "juava"; +import { isTruish, requireDefined, rpc } from "juava"; import { getServerLog } from "../../../../lib/server/log"; import { syncError } from "../../../../lib/server/sync"; @@ -22,7 +22,7 @@ export default createRoute() workspaceId: z.string(), package: z.string(), version: z.string(), - after: z.string().optional(), + force: z.string().optional(), }), result: resultType, }) @@ -39,22 +39,13 @@ export default createRoute() authHeaders["Authorization"] = `Bearer ${syncAuthKey}`; } try { - let res; - if (query.after) { - res = await db - .pgPool() - .query( - `select specs, error from newjitsu.source_spec where package = $1 and version = $2 and timestamp >= $3`, - [query.package, query.version, new Date(1000 * parseInt(query.after))] - ); - } else { - res = await db - .pgPool() - .query(`select specs, error from newjitsu.source_spec where package = $1 and version = $2`, [ - query.package, - query.version, - ]); - } + const res = await db.pgPool().query( + `select specs, error + from newjitsu.source_spec + where package = $1 + and version = $2`, + [query.package, query.version] + ); let error; if (res.rowCount === 1) { const specs = res.rows[0].specs; @@ -65,9 +56,12 @@ export default createRoute() }; } else { error = res.rows[0].error ?? "unknown error"; + if (error === "pending") { + return { ok: false, pending: true }; + } } } - if (!query.after) { + if (!res.rowCount || isTruish(query.force)) { const checkRes = await rpc(syncURL + "/spec", { method: "GET", headers: { @@ -82,13 +76,21 @@ export default createRoute() if (!checkRes.ok) { return { ok: false, error: checkRes.error ?? "unknown error" }; } else { - return { ok: false, pending: true, startedAt: checkRes.startedAt }; + await db.pgPool().query( + `insert into newjitsu.source_spec as s (package, version, specs, timestamp, error) + values ($1, $2, null, $3, $4) + ON CONFLICT ON CONSTRAINT source_spec_pkey DO UPDATE SET specs = null, + timestamp = $3, + error = $4`, + [query.package, query.version, new Date(), "pending"] + ); + return { ok: false, pending: true }; } } else { if (error) { return { ok: false, error }; } else { - return { ok: false, pending: true, startedAt: parseInt(query.after) }; + return { ok: false, pending: true }; } } } catch (e: any) { From 7b9debbc06e21cb71600fc5e0dca6f4c4b8d9d99 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Mon, 7 Oct 2024 11:02:28 -0400 Subject: [PATCH 0904/1353] feat: number of changes in admin panel - new email templates, automated quota monitoring --- pnpm-lock.yaml | 1974 +++++++++++------ .../components/Billing/BillingManager.tsx | 22 +- .../console/components/Billing/use-usage.ts | 14 +- .../PageLayout/WorkspacePageLayout.tsx | 22 +- webapps/console/package.json | 2 +- webapps/console/pages/admin/workspaces.tsx | 140 +- webapps/ee-api/components/email-component.tsx | 3 +- webapps/ee-api/emails/churned.tsx | 3 +- .../ee-api/emails/quota-about-to-exceed.tsx | 127 ++ webapps/ee-api/emails/quota-exceeded.tsx | 126 ++ webapps/ee-api/emails/throttling-reminder.tsx | 0 webapps/ee-api/emails/throttling-started.tsx | 0 webapps/ee-api/emails/welcome.tsx | 4 +- webapps/ee-api/lib/email.tsx | 26 +- webapps/ee-api/lib/sql/workspace-info.sql | 3 +- .../ee-api/pages/api/billing/workspaces.ts | 9 + .../ee-api/pages/api/report/workspace-stat.ts | 4 +- webapps/ee-api/pages/dashboard/index.ts | 0 18 files changed, 1710 insertions(+), 769 deletions(-) create mode 100644 webapps/ee-api/emails/quota-about-to-exceed.tsx create mode 100644 webapps/ee-api/emails/quota-exceeded.tsx create mode 100644 webapps/ee-api/emails/throttling-reminder.tsx create mode 100644 webapps/ee-api/emails/throttling-started.tsx create mode 100644 webapps/ee-api/pages/dashboard/index.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d7320530f..fc93106b1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,7 +25,7 @@ importers: version: 2.8.8 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) + version: 10.9.2(@types/node@16.18.11)(typescript@5.5.4) turbo: specifier: ~1.2.16 version: 1.2.16 @@ -34,7 +34,7 @@ importers: version: 5.5.4 vercel: specifier: ^35.2.3 - version: 35.2.3 + version: 35.2.3(encoding@0.1.13) cli/build-scripts: dependencies: @@ -80,7 +80,7 @@ importers: version: link:../../libs/juava webpack: specifier: ^5.91.0 - version: 5.93.0(webpack-cli@5.1.4) + version: 5.93.0 cli/jitsu-cli: dependencies: @@ -89,7 +89,7 @@ importers: version: 1.7.0 jest-cli: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + version: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) tslib: specifier: ^2.6.3 version: 2.6.3 @@ -147,13 +147,13 @@ importers: version: 18.19.42 '@types/webpack': specifier: ^5.28.5 - version: 5.28.5(webpack-cli@5.1.4) + version: 5.28.5(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) '@webpack-cli/generators': specifier: ^3.0.7 - version: 3.0.7(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0) + version: 3.0.7(encoding@0.1.13)(mem-fs@2.3.0)(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0) babel-loader: specifier: ^9.1.3 - version: 9.1.3(@babel/core@7.25.2)(webpack@5.93.0) + version: 9.1.3(@babel/core@7.25.2)(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) chalk: specifier: ^5.3.0 version: 5.3.0 @@ -162,7 +162,7 @@ importers: version: 11.1.0 cross-fetch: specifier: ^4.0.0 - version: 4.0.0 + version: 4.0.0(encoding@0.1.13) cuid: specifier: ^2.1.8 version: 2.1.8 @@ -174,7 +174,7 @@ importers: version: 9.3.6 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + version: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) json5: specifier: ^2.2.3 version: 2.2.3 @@ -189,7 +189,7 @@ importers: version: 3.3.2 node-loader: specifier: ^2.0.0 - version: 2.0.0(webpack@5.93.0) + version: 2.0.0(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) prismjs: specifier: ^1.29.0 version: 1.29.0 @@ -201,16 +201,16 @@ importers: version: 7.6.3 ts-jest: specifier: ^29.1.1 - version: 29.2.3(@babel/core@7.25.2)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.5.4) + version: 29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4) ts-loader: specifier: ^9.4.4 - version: 9.5.1(typescript@5.5.4)(webpack@5.93.0) + version: 9.5.1(typescript@5.5.4)(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) webpack: specifier: ^5.91.0 - version: 5.93.0(webpack-cli@5.1.4) + version: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) webpack-cli: specifier: ^5.1.4 version: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) @@ -234,7 +234,7 @@ importers: version: 5.4.1 jest: specifier: ^29.3.1 - version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + version: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) json5: specifier: ^2.1.0 version: 2.2.3 @@ -246,10 +246,10 @@ importers: version: 0.6.2 testcontainers: specifier: ^9.0.0 - version: 9.12.0 + version: 9.12.0(encoding@0.1.13) ts-jest: specifier: 29.0.5 - version: 29.0.5(@babel/core@7.25.2)(jest@29.7.0)(typescript@5.5.4) + version: 29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)))(typescript@5.5.4) tslib: specifier: ^2.6.3 version: 2.6.3 @@ -276,10 +276,10 @@ importers: version: 6.25.1(react@18.3.1) react-router-dom: specifier: ^6.25.1 - version: 6.25.1(react-dom@18.3.1)(react@18.3.1) + version: 6.25.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-scripts: specifier: ^5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0)(react@18.3.1)(ts-node@10.9.2)(typescript@5.5.4) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(@types/babel__core@7.20.5)(@types/webpack@5.28.5)(eslint@8.57.0)(react@18.3.1)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))(type-fest@3.13.1)(typescript@5.5.4) web-vitals: specifier: ^2.1.4 version: 2.1.4 @@ -295,7 +295,7 @@ importers: version: 18.3.0 tailwindcss: specifier: ^3.0.24 - version: 3.4.7(ts-node@10.9.2) + version: 3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) typescript: specifier: ^5.5.4 version: 5.5.4 @@ -307,7 +307,7 @@ importers: version: 0.7.33 '@hubspot/api-client': specifier: ^11.1.0 - version: 11.1.0 + version: 11.1.0(encoding@0.1.13) '@mongodb-js/zstd': specifier: ^1.2.0 version: 1.2.0 @@ -319,7 +319,7 @@ importers: version: 1.11.12 google-ads-api: specifier: ^16.0.0-rest-beta3 - version: 16.0.0-rest-beta3 + version: 16.0.0-rest-beta3(encoding@0.1.13) ioredis: specifier: ^5.3.2 version: 5.4.1 @@ -334,7 +334,7 @@ importers: version: 4.17.21 mongodb: specifier: ^6.7.0 - version: 6.8.0(@mongodb-js/zstd@1.2.0) + version: 6.8.0(@mongodb-js/zstd@1.2.0)(socks@2.8.3) node-cache: specifier: ^5.1.2 version: 5.1.2 @@ -374,7 +374,7 @@ importers: version: 4.19.2 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) json5: specifier: ^2.1.0 version: 2.2.3 @@ -383,7 +383,7 @@ importers: version: 3.3.2 ts-jest: specifier: ^29.2.3 - version: 29.2.3(@babel/core@7.25.2)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.5.4) + version: 29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)))(typescript@5.5.4) libs/functions: dependencies: @@ -405,13 +405,13 @@ importers: version: 18.19.42 jest: specifier: ^29.1.2 - version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) rollup: specifier: ^4.1.4 version: 4.19.1 ts-jest: specifier: 29.0.5 - version: 29.0.5(@babel/core@7.25.2)(jest@29.7.0)(typescript@5.5.4) + version: 29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)))(typescript@5.5.4) libs/jitsu-js: dependencies: @@ -445,7 +445,7 @@ importers: version: 0.1.0(rollup@3.29.4) '@segment/analytics-next': specifier: ^1.46.0 - version: 1.72.1 + version: 1.72.1(encoding@0.1.13) '@types/chalk': specifier: ^2.2.0 version: 2.2.0 @@ -469,7 +469,7 @@ importers: version: 4.19.2 jest: specifier: ^29.2.2 - version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) jsondiffpatch: specifier: workspace:* version: link:../jsondiffpatch @@ -487,7 +487,7 @@ importers: version: 3.29.4 ts-jest: specifier: 29.0.5 - version: 29.0.5(@babel/core@7.25.2)(jest@29.7.0)(typescript@5.5.4) + version: 29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)))(typescript@5.5.4) tslib: specifier: ^2.6.3 version: 2.6.3 @@ -508,7 +508,7 @@ importers: version: 18.3.1 react-router-dom: specifier: 5.x || 6.x - version: 6.25.1(react-dom@18.3.1)(react@18.3.1) + version: 6.25.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) devDependencies: '@babel/plugin-transform-regenerator': specifier: ^7.22.10 @@ -518,7 +518,7 @@ importers: version: 6.4.8 '@testing-library/react': specifier: ^13.4.0 - version: 13.4.0(react-dom@18.3.1)(react@18.3.1) + version: 13.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@testing-library/user-event': specifier: ^14.4.3 version: 14.5.2(@testing-library/dom@10.4.0) @@ -545,7 +545,7 @@ importers: version: 29.5.12 '@typescript-eslint/eslint-plugin': specifier: ^7.18.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.0)(typescript@5.5.4) + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/parser': specifier: ^7.18.0 version: 7.18.0(eslint@8.57.0)(typescript@5.5.4) @@ -557,10 +557,10 @@ importers: version: 9.1.0(eslint@8.57.0) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + version: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) ts-jest: specifier: ^29.1.1 - version: 29.2.3(@babel/core@7.25.2)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.5.4) + version: 29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)))(typescript@5.5.4) tslib: specifier: ^2.6.3 version: 2.6.3 @@ -585,10 +585,10 @@ importers: version: 18.19.42 jest: specifier: ^29.1.2 - version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) ts-jest: specifier: 29.0.5 - version: 29.0.5(@babel/core@7.25.2)(jest@29.7.0)(typescript@5.5.4) + version: 29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)))(typescript@5.5.4) services/rotor: dependencies: @@ -709,19 +709,19 @@ importers: version: 0.0.152 '@types/webpack': specifier: ^5.28.5 - version: 5.28.5(webpack-cli@5.1.4) + version: 5.28.5(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) '@webpack-cli/generators': specifier: ^3.0.7 - version: 3.0.7(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0) + version: 3.0.7(encoding@0.1.13)(mem-fs@2.3.0)(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0) babel-loader: specifier: ^9.1.3 - version: 9.1.3(@babel/core@7.25.2)(webpack@5.93.0) + version: 9.1.3(@babel/core@7.25.2)(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) clean-webpack-plugin: specifier: ^4.0.0 - version: 4.0.0(webpack@5.93.0) + version: 4.0.0(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) copy-webpack-plugin: specifier: ^12.0.2 - version: 12.0.2(webpack@5.93.0) + version: 12.0.2(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) declaration-bundler-webpack-plugin: specifier: ^1.0.3 version: 1.0.3 @@ -730,22 +730,22 @@ importers: version: 7.4.2 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) lodash: specifier: ^4.17.21 version: 4.17.21 node-loader: specifier: ^2.0.0 - version: 2.0.0(webpack@5.93.0) + version: 2.0.0(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) nodemon: specifier: ^3.1.4 version: 3.1.4 ts-jest: specifier: ^29.2.3 - version: 29.2.3(@babel/core@7.25.2)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.5.4) + version: 29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4) ts-loader: specifier: ^9.4.2 - version: 9.5.1(typescript@5.5.4)(webpack@5.93.0) + version: 9.5.1(typescript@5.5.4)(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) @@ -757,7 +757,7 @@ importers: version: 5.5.4 webpack: specifier: ^5.93.0 - version: 5.93.0(webpack-cli@5.1.4) + version: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) webpack-cli: specifier: ^5.1.4 version: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) @@ -768,19 +768,19 @@ importers: dependencies: '@ant-design/cssinjs': specifier: ^1.5.6 - version: 1.21.0(react-dom@18.3.1)(react@18.3.1) + version: 1.21.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@clickhouse/client': specifier: ^1.4.0 version: 1.4.0 '@dnd-kit/core': specifier: ^6.0.8 - version: 6.1.0(react-dom@18.3.1)(react@18.3.1) + version: 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@dnd-kit/modifiers': specifier: ^6.0.1 - version: 6.0.1(@dnd-kit/core@6.1.0)(react@18.3.1) + version: 6.0.1(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@dnd-kit/sortable': specifier: ^7.0.2 - version: 7.0.2(@dnd-kit/core@6.1.0)(react@18.3.1) + version: 7.0.2(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@dnd-kit/utilities': specifier: ^3.2.1 version: 3.2.2(react@18.3.1) @@ -792,7 +792,7 @@ importers: version: 4.5.10 '@google-cloud/scheduler': specifier: ^4.0.0 - version: 4.3.0 + version: 4.3.0(encoding@0.1.13) '@jitsu/core-functions': specifier: workspace:* version: link:../../libs/core-functions @@ -813,7 +813,7 @@ importers: version: 5.16.4(react@18.3.1) '@monaco-editor/react': specifier: ^4.6.0 - version: 4.6.0(monaco-editor@0.50.0)(react-dom@18.3.1)(react@18.3.1) + version: 4.6.0(monaco-editor@0.50.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@nangohq/frontend': specifier: ^0.21.11 version: 0.21.17 @@ -822,22 +822,22 @@ importers: version: 5.17.0(prisma@5.17.0) '@rjsf/antd': specifier: ^5.19.4 - version: 5.19.4(@ant-design/icons@5.4.0)(@rjsf/core@5.10.0)(@rjsf/utils@5.10.0)(antd@5.19.4)(dayjs@1.11.12)(react-dom@18.3.1)(react@18.3.1) + version: 5.19.4(@ant-design/icons@5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rjsf/core@5.10.0(@rjsf/utils@5.10.0(react@18.3.1))(react@18.3.1))(@rjsf/utils@5.10.0(react@18.3.1))(antd@5.19.4(date-fns@2.30.0)(moment@2.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@rjsf/core': specifier: 5.10.0 - version: 5.10.0(@rjsf/utils@5.10.0)(react@18.3.1) + version: 5.10.0(@rjsf/utils@5.10.0(react@18.3.1))(react@18.3.1) '@rjsf/utils': specifier: 5.10.0 version: 5.10.0(react@18.3.1) '@rjsf/validator-ajv6': specifier: 5.10.0 - version: 5.10.0(@rjsf/utils@5.10.0) + version: 5.10.0(@rjsf/utils@5.10.0(react@18.3.1)) '@sentry/nextjs': specifier: ^7.70.0 - version: 7.118.0(next@14.2.5)(react@18.3.1)(webpack@5.93.0) + version: 7.118.0(encoding@0.1.13)(next@14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.93.0) '@tanstack/react-query': specifier: ^4.2.1 - version: 4.36.1(react-dom@18.3.1)(react@18.3.1) + version: 4.36.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/cookie': specifier: ^0.5.1 version: 0.5.4 @@ -873,13 +873,13 @@ importers: version: 10.12.5 firebase-admin: specifier: ^12.3.0 - version: 12.3.0 + version: 12.3.0(encoding@0.1.13) google-ads-api: specifier: ^16.0.0-rest-beta3 - version: 16.0.0-rest-beta3 + version: 16.0.0-rest-beta3(encoding@0.1.13) googleapis: specifier: ^126.0.1 - version: 126.0.1 + version: 126.0.1(encoding@0.1.13) highlight.js: specifier: ^11.6.0 version: 11.10.0 @@ -905,23 +905,23 @@ importers: specifier: ^4.17.21 version: 4.17.21 lucide-react: - specifier: ^0.263.1 - version: 0.263.1(react@18.3.1) + specifier: ^0.447.0 + version: 0.447.0(react@18.3.1) mjml: specifier: ^4.15.3 - version: 4.15.3 + version: 4.15.3(encoding@0.1.13) mjml-react: specifier: ^2.0.8 - version: 2.0.8(mjml@4.15.3)(react-dom@18.3.1)(react@18.3.1) + version: 2.0.8(mjml@4.15.3(encoding@0.1.13))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) monaco-editor: specifier: ^0.50.0 version: 0.50.0 next: specifier: ^14.2.5 - version: 14.2.5(@babel/core@7.25.2)(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1) + version: 14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-auth: specifier: ^4.23.2 - version: 4.24.7(next@14.2.5)(nodemailer@6.9.14)(react-dom@18.3.1)(react@18.3.1) + version: 4.24.7(next@14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nodemailer@6.9.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) node-fetch-commonjs: specifier: ^3.3.2 version: 3.3.2 @@ -954,13 +954,13 @@ importers: version: 4.12.0(react@18.3.1) react-json-view: specifier: ^1.19.1 - version: 1.21.3(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + version: 1.21.3(@types/react@18.3.3)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-use: specifier: ^17.4.0 - version: 17.5.1(react-dom@18.3.1)(react@18.3.1) + version: 17.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) recharts: specifier: ^2.10.4 - version: 2.12.7(react-dom@18.3.1)(react@18.3.1) + version: 2.12.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) stable-hash: specifier: 0.0.3 version: 0.0.3 @@ -982,16 +982,16 @@ importers: devDependencies: '@ant-design/icons': specifier: ^5.4.0 - version: 5.4.0(react-dom@18.3.1)(react@18.3.1) + version: 5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tailwindcss/typography': specifier: ^0.5.7 - version: 0.5.13(tailwindcss@3.4.7) + version: 0.5.13(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))) '@testing-library/jest-dom': specifier: ^6.1.3 version: 6.4.8 '@testing-library/react': specifier: ^13.1.1 - version: 13.4.0(react-dom@18.3.1)(react@18.3.1) + version: 13.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/cli-progress': specifier: ^3.11.0 version: 3.11.6 @@ -1027,7 +1027,7 @@ importers: version: 0.7.2 antd: specifier: ^5.19.4 - version: 5.19.4(react-dom@18.3.1)(react@18.3.1) + version: 5.19.4(date-fns@2.30.0)(moment@2.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) autoprefixer: specifier: ^10.4.20 version: 10.4.20(postcss@8.4.41) @@ -1045,7 +1045,7 @@ importers: version: 4.0.1(eslint@8.57.0) jest: specifier: ^28.0.0 - version: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2) + version: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) less: specifier: ^4.1.2 version: 4.2.0 @@ -1066,7 +1066,7 @@ importers: version: 4.0.2(webpack@5.93.0) tailwindcss: specifier: ^3.0.24 - version: 3.4.7(ts-node@10.9.2) + version: 3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) @@ -1078,7 +1078,7 @@ importers: version: 5.5.4 zod-prisma: specifier: ^0.5.4 - version: 0.5.4(prisma@5.17.0)(zod@3.23.8) + version: 0.5.4(decimal.js@10.4.3)(prisma@5.17.0)(zod@3.23.8) webapps/ee-api: dependencies: @@ -1090,7 +1090,7 @@ importers: version: 1.4.0 '@react-email/components': specifier: ^0.0.25 - version: 0.0.25(react-dom@18.3.1)(react@18.3.1) + version: 0.0.25(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/node': specifier: ^18.15.3 version: 18.19.42 @@ -1114,7 +1114,7 @@ importers: version: 14.2.5(eslint@8.57.0)(typescript@5.5.4) firebase-admin: specifier: ^12.3.0 - version: 12.3.0 + version: 12.3.0(encoding@0.1.13) intercom-client: specifier: ^5.0.0 version: 5.0.0 @@ -1135,7 +1135,7 @@ importers: version: 4.17.21 next: specifier: ^14.2.5 - version: 14.2.5(@babel/core@7.24.5)(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1) + version: 14.2.5(@babel/core@7.24.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) node-fetch-commonjs: specifier: ^3.3.2 version: 3.3.2 @@ -1150,7 +1150,7 @@ importers: version: 18.3.1(react@18.3.1) resend: specifier: ^4.0.0 - version: 4.0.0(react-dom@18.3.1)(react@18.3.1) + version: 4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) stripe: specifier: ^11.15.0 version: 11.18.0 @@ -1187,7 +1187,7 @@ importers: version: 4.0.2(webpack@5.93.0) react-email: specifier: ^3.0.1 - version: 3.0.1(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1) + version: 3.0.1(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) @@ -9420,10 +9420,10 @@ packages: lru-memoizer@2.3.0: resolution: {integrity: sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==} - lucide-react@0.263.1: - resolution: {integrity: sha512-keqxAx97PlaEN89PXZ6ki1N8nRjGWtDa4021GFYLNj0RgruM5odbpl8GHTExj0hhPq3sF6Up0gnxt6TSHu+ovw==} + lucide-react@0.447.0: + resolution: {integrity: sha512-SZ//hQmvi+kDKrNepArVkYK7/jfeZ5uFNEnYmd45RKZcbGD78KLnrcNXmgeg6m+xNHFvTG+CblszXCy4n6DN4w==} peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} @@ -14164,35 +14164,35 @@ snapshots: dependencies: '@ctrl/tinycolor': 3.6.1 - '@ant-design/cssinjs-utils@1.0.3(react-dom@18.3.1)(react@18.3.1)': + '@ant-design/cssinjs-utils@1.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@ant-design/cssinjs': 1.21.0(react-dom@18.3.1)(react@18.3.1) + '@ant-design/cssinjs': 1.21.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@babel/runtime': 7.25.0 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@ant-design/cssinjs@1.21.0(react-dom@18.3.1)(react@18.3.1)': + '@ant-design/cssinjs@1.21.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 '@emotion/hash': 0.8.0 '@emotion/unitless': 0.7.5 classnames: 2.5.1 csstype: 3.1.3 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) stylis: 4.3.2 '@ant-design/icons-svg@4.4.2': {} - '@ant-design/icons@5.4.0(react-dom@18.3.1)(react@18.3.1)': + '@ant-design/icons@5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@ant-design/colors': 7.1.0 '@ant-design/icons-svg': 4.4.2 '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -14267,7 +14267,7 @@ snapshots: '@aws-sdk/client-sso-oidc': 3.621.0(@aws-sdk/client-sts@3.621.0) '@aws-sdk/client-sts': 3.621.0 '@aws-sdk/core': 3.621.0 - '@aws-sdk/credential-provider-node': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0)(@aws-sdk/client-sts@3.621.0) + '@aws-sdk/credential-provider-node': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0))(@aws-sdk/client-sts@3.621.0) '@aws-sdk/middleware-bucket-endpoint': 3.620.0 '@aws-sdk/middleware-expect-continue': 3.620.0 '@aws-sdk/middleware-flexible-checksums': 3.620.0 @@ -14328,7 +14328,7 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-sdk/client-sts': 3.621.0 '@aws-sdk/core': 3.621.0 - '@aws-sdk/credential-provider-node': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0)(@aws-sdk/client-sts@3.621.0) + '@aws-sdk/credential-provider-node': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0))(@aws-sdk/client-sts@3.621.0) '@aws-sdk/middleware-host-header': 3.620.0 '@aws-sdk/middleware-logger': 3.609.0 '@aws-sdk/middleware-recursion-detection': 3.620.0 @@ -14416,7 +14416,7 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-sdk/client-sso-oidc': 3.621.0(@aws-sdk/client-sts@3.621.0) '@aws-sdk/core': 3.621.0 - '@aws-sdk/credential-provider-node': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0)(@aws-sdk/client-sts@3.621.0) + '@aws-sdk/credential-provider-node': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0))(@aws-sdk/client-sts@3.621.0) '@aws-sdk/middleware-host-header': 3.620.0 '@aws-sdk/middleware-logger': 3.609.0 '@aws-sdk/middleware-recursion-detection': 3.620.0 @@ -14486,13 +14486,13 @@ snapshots: '@smithy/util-stream': 3.1.3 tslib: 2.6.3 - '@aws-sdk/credential-provider-ini@3.621.0(@aws-sdk/client-sso-oidc@3.621.0)(@aws-sdk/client-sts@3.621.0)': + '@aws-sdk/credential-provider-ini@3.621.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0))(@aws-sdk/client-sts@3.621.0)': dependencies: '@aws-sdk/client-sts': 3.621.0 '@aws-sdk/credential-provider-env': 3.620.1 '@aws-sdk/credential-provider-http': 3.621.0 '@aws-sdk/credential-provider-process': 3.620.1 - '@aws-sdk/credential-provider-sso': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0) + '@aws-sdk/credential-provider-sso': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0)) '@aws-sdk/credential-provider-web-identity': 3.621.0(@aws-sdk/client-sts@3.621.0) '@aws-sdk/types': 3.609.0 '@smithy/credential-provider-imds': 3.2.0 @@ -14504,13 +14504,13 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-node@3.621.0(@aws-sdk/client-sso-oidc@3.621.0)(@aws-sdk/client-sts@3.621.0)': + '@aws-sdk/credential-provider-node@3.621.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0))(@aws-sdk/client-sts@3.621.0)': dependencies: '@aws-sdk/credential-provider-env': 3.620.1 '@aws-sdk/credential-provider-http': 3.621.0 - '@aws-sdk/credential-provider-ini': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0)(@aws-sdk/client-sts@3.621.0) + '@aws-sdk/credential-provider-ini': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0))(@aws-sdk/client-sts@3.621.0) '@aws-sdk/credential-provider-process': 3.620.1 - '@aws-sdk/credential-provider-sso': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0) + '@aws-sdk/credential-provider-sso': 3.621.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0)) '@aws-sdk/credential-provider-web-identity': 3.621.0(@aws-sdk/client-sts@3.621.0) '@aws-sdk/types': 3.609.0 '@smithy/credential-provider-imds': 3.2.0 @@ -14531,10 +14531,10 @@ snapshots: '@smithy/types': 3.3.0 tslib: 2.6.3 - '@aws-sdk/credential-provider-sso@3.621.0(@aws-sdk/client-sso-oidc@3.621.0)': + '@aws-sdk/credential-provider-sso@3.621.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0))': dependencies: '@aws-sdk/client-sso': 3.621.0 - '@aws-sdk/token-providers': 3.614.0(@aws-sdk/client-sso-oidc@3.621.0) + '@aws-sdk/token-providers': 3.614.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0)) '@aws-sdk/types': 3.609.0 '@smithy/property-provider': 3.1.3 '@smithy/shared-ini-file-loader': 3.1.4 @@ -14662,7 +14662,7 @@ snapshots: '@smithy/types': 3.3.0 tslib: 2.6.3 - '@aws-sdk/token-providers@3.614.0(@aws-sdk/client-sso-oidc@3.621.0)': + '@aws-sdk/token-providers@3.614.0(@aws-sdk/client-sso-oidc@3.621.0(@aws-sdk/client-sts@3.621.0))': dependencies: '@aws-sdk/client-sso-oidc': 3.621.0(@aws-sdk/client-sts@3.621.0) '@aws-sdk/types': 3.609.0 @@ -15798,7 +15798,7 @@ snapshots: react: 18.3.1 tslib: 2.6.3 - '@dnd-kit/core@6.1.0(react-dom@18.3.1)(react@18.3.1)': + '@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@dnd-kit/accessibility': 3.1.0(react@18.3.1) '@dnd-kit/utilities': 3.2.2(react@18.3.1) @@ -15806,16 +15806,16 @@ snapshots: react-dom: 18.3.1(react@18.3.1) tslib: 2.6.3 - '@dnd-kit/modifiers@6.0.1(@dnd-kit/core@6.1.0)(react@18.3.1)': + '@dnd-kit/modifiers@6.0.1(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@dnd-kit/core': 6.1.0(react-dom@18.3.1)(react@18.3.1) + '@dnd-kit/core': 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@dnd-kit/utilities': 3.2.2(react@18.3.1) react: 18.3.1 tslib: 2.6.3 - '@dnd-kit/sortable@7.0.2(@dnd-kit/core@6.1.0)(react@18.3.1)': + '@dnd-kit/sortable@7.0.2(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@dnd-kit/core': 6.1.0(react-dom@18.3.1)(react@18.3.1) + '@dnd-kit/core': 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@dnd-kit/utilities': 3.2.2(react@18.3.1) react: 18.3.1 tslib: 2.6.3 @@ -16275,11 +16275,11 @@ snapshots: '@gar/promisify@1.1.3': {} - '@google-cloud/firestore@7.9.0': + '@google-cloud/firestore@7.9.0(encoding@0.1.13)': dependencies: fast-deep-equal: 3.1.3 functional-red-black-tree: 1.0.1 - google-gax: 4.3.8 + google-gax: 4.3.8(encoding@0.1.13) protobufjs: 7.3.2 transitivePeerDependencies: - encoding @@ -16298,14 +16298,14 @@ snapshots: '@google-cloud/promisify@4.0.0': optional: true - '@google-cloud/scheduler@4.3.0': + '@google-cloud/scheduler@4.3.0(encoding@0.1.13)': dependencies: - google-gax: 4.3.8 + google-gax: 4.3.8(encoding@0.1.13) transitivePeerDependencies: - encoding - supports-color - '@google-cloud/storage@7.12.1': + '@google-cloud/storage@7.12.1(encoding@0.1.13)': dependencies: '@google-cloud/paginator': 5.0.2 '@google-cloud/projectify': 4.0.0 @@ -16314,13 +16314,13 @@ snapshots: async-retry: 1.3.3 duplexify: 4.1.3 fast-xml-parser: 4.4.1 - gaxios: 6.7.0 - google-auth-library: 9.12.0 + gaxios: 6.7.0(encoding@0.1.13) + google-auth-library: 9.12.0(encoding@0.1.13) html-entities: 2.5.2 mime: 3.0.0 p-limit: 3.1.0 - retry-request: 7.0.2 - teeny-request: 9.0.0 + retry-request: 7.0.2(encoding@0.1.13) + teeny-request: 9.0.0(encoding@0.1.13) uuid: 8.3.2 transitivePeerDependencies: - encoding @@ -16344,7 +16344,7 @@ snapshots: protobufjs: 7.3.2 yargs: 17.7.2 - '@hubspot/api-client@11.1.0': + '@hubspot/api-client@11.1.0(encoding@0.1.13)': dependencies: '@types/node-fetch': 2.6.11 bottleneck: 2.19.5 @@ -16352,7 +16352,7 @@ snapshots: form-data: 2.5.1 lodash.get: 4.4.2 lodash.merge: 4.6.2 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) url-parse: 1.5.10 transitivePeerDependencies: - encoding @@ -16427,7 +16427,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@27.5.1(ts-node@10.9.2)': + '@jest/core@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))': dependencies: '@jest/console': 27.5.1 '@jest/reporters': 27.5.1 @@ -16441,7 +16441,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 27.5.1 - jest-config: 27.5.1(ts-node@10.9.2) + jest-config: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) jest-haste-map: 27.5.1 jest-message-util: 27.5.1 jest-regex-util: 27.5.1 @@ -16464,7 +16464,7 @@ snapshots: - ts-node - utf-8-validate - '@jest/core@28.1.3(ts-node@10.9.2)': + '@jest/core@28.1.3(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))': dependencies: '@jest/console': 28.1.3 '@jest/reporters': 28.1.3 @@ -16478,7 +16478,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 28.1.3 - jest-config: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2) + jest-config: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) jest-haste-map: 28.1.3 jest-message-util: 28.1.3 jest-regex-util: 28.0.2 @@ -16499,7 +16499,77 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(ts-node@10.9.2)': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.19.42 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.7 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4))': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.19.42 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.7 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -16513,7 +16583,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -16928,12 +16998,12 @@ snapshots: dependencies: '@lukeed/csprng': 1.1.0 - '@mapbox/node-pre-gyp@1.0.11': + '@mapbox/node-pre-gyp@1.0.11(encoding@0.1.13)': dependencies: detect-libc: 2.0.3 https-proxy-agent: 5.0.1 make-dir: 3.1.0 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 @@ -16953,7 +17023,7 @@ snapshots: monaco-editor: 0.50.0 state-local: 1.0.7 - '@monaco-editor/react@4.6.0(monaco-editor@0.50.0)(react-dom@18.3.1)(react@18.3.1)': + '@monaco-editor/react@4.6.0(monaco-editor@0.50.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@monaco-editor/loader': 1.4.0(monaco-editor@0.50.0) monaco-editor: 0.50.0 @@ -17233,11 +17303,11 @@ snapshots: dependencies: '@octokit/types': 6.41.0 - '@octokit/core@3.6.0': + '@octokit/core@3.6.0(encoding@0.1.13)': dependencies: '@octokit/auth-token': 2.5.0 - '@octokit/graphql': 4.8.0 - '@octokit/request': 5.6.3 + '@octokit/graphql': 4.8.0(encoding@0.1.13) + '@octokit/request': 5.6.3(encoding@0.1.13) '@octokit/request-error': 2.1.0 '@octokit/types': 6.41.0 before-after-hook: 2.2.3 @@ -17251,9 +17321,9 @@ snapshots: is-plain-object: 5.0.0 universal-user-agent: 6.0.1 - '@octokit/graphql@4.8.0': + '@octokit/graphql@4.8.0(encoding@0.1.13)': dependencies: - '@octokit/request': 5.6.3 + '@octokit/request': 5.6.3(encoding@0.1.13) '@octokit/types': 6.41.0 universal-user-agent: 6.0.1 transitivePeerDependencies: @@ -17261,18 +17331,18 @@ snapshots: '@octokit/openapi-types@12.11.0': {} - '@octokit/plugin-paginate-rest@2.21.3(@octokit/core@3.6.0)': + '@octokit/plugin-paginate-rest@2.21.3(@octokit/core@3.6.0(encoding@0.1.13))': dependencies: - '@octokit/core': 3.6.0 + '@octokit/core': 3.6.0(encoding@0.1.13) '@octokit/types': 6.41.0 - '@octokit/plugin-request-log@1.0.4(@octokit/core@3.6.0)': + '@octokit/plugin-request-log@1.0.4(@octokit/core@3.6.0(encoding@0.1.13))': dependencies: - '@octokit/core': 3.6.0 + '@octokit/core': 3.6.0(encoding@0.1.13) - '@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0)': + '@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0(encoding@0.1.13))': dependencies: - '@octokit/core': 3.6.0 + '@octokit/core': 3.6.0(encoding@0.1.13) '@octokit/types': 6.41.0 deprecation: 2.3.1 @@ -17282,23 +17352,23 @@ snapshots: deprecation: 2.3.1 once: 1.4.0 - '@octokit/request@5.6.3': + '@octokit/request@5.6.3(encoding@0.1.13)': dependencies: '@octokit/endpoint': 6.0.12 '@octokit/request-error': 2.1.0 '@octokit/types': 6.41.0 is-plain-object: 5.0.0 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) universal-user-agent: 6.0.1 transitivePeerDependencies: - encoding - '@octokit/rest@18.12.0': + '@octokit/rest@18.12.0(encoding@0.1.13)': dependencies: - '@octokit/core': 3.6.0 - '@octokit/plugin-paginate-rest': 2.21.3(@octokit/core@3.6.0) - '@octokit/plugin-request-log': 1.0.4(@octokit/core@3.6.0) - '@octokit/plugin-rest-endpoint-methods': 5.16.2(@octokit/core@3.6.0) + '@octokit/core': 3.6.0(encoding@0.1.13) + '@octokit/plugin-paginate-rest': 2.21.3(@octokit/core@3.6.0(encoding@0.1.13)) + '@octokit/plugin-request-log': 1.0.4(@octokit/core@3.6.0(encoding@0.1.13)) + '@octokit/plugin-rest-endpoint-methods': 5.16.2(@octokit/core@3.6.0(encoding@0.1.13)) transitivePeerDependencies: - encoding @@ -17319,7 +17389,7 @@ snapshots: dependencies: playwright: 1.39.0 - '@pmmmwh/react-refresh-webpack-plugin@0.5.15(react-refresh@0.11.0)(webpack-dev-server@4.15.2)(webpack@5.93.0)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.15(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@3.13.1)(webpack-dev-server@4.15.2(webpack@5.93.0))(webpack@5.93.0)': dependencies: ansi-html: 0.0.9 core-js-pure: 3.37.1 @@ -17329,11 +17399,14 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.2.0 source-map: 0.7.4 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 + optionalDependencies: + '@types/webpack': 5.28.5 + type-fest: 3.13.1 webpack-dev-server: 4.15.2(webpack@5.93.0) '@prisma/client@5.17.0(prisma@5.17.0)': - dependencies: + optionalDependencies: prisma: 5.17.0 '@prisma/debug@3.8.1': @@ -17397,19 +17470,19 @@ snapshots: dependencies: '@babel/runtime': 7.25.0 - '@rc-component/color-picker@1.5.3(react-dom@18.3.1)(react@18.3.1)': + '@rc-component/color-picker@1.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 '@ctrl/tinycolor': 3.6.1 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@rc-component/context@1.4.0(react-dom@18.3.1)(react@18.3.1)': + '@rc-component/context@1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -17417,48 +17490,48 @@ snapshots: dependencies: '@babel/runtime': 7.25.0 - '@rc-component/mutate-observer@1.1.0(react-dom@18.3.1)(react@18.3.1)': + '@rc-component/mutate-observer@1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@rc-component/portal@1.1.2(react-dom@18.3.1)(react@18.3.1)': + '@rc-component/portal@1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@rc-component/qrcode@1.0.0(react-dom@18.3.1)(react@18.3.1)': + '@rc-component/qrcode@1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@rc-component/tour@1.15.0(react-dom@18.3.1)(react@18.3.1)': + '@rc-component/tour@1.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 - '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) - '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) + '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@rc-component/trigger@2.2.0(react-dom@18.3.1)(react@18.3.1)': + '@rc-component/trigger@2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 - '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) + '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) - rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -17483,7 +17556,7 @@ snapshots: dependencies: react: 18.3.1 - '@react-email/components@0.0.25(react-dom@18.3.1)(react@18.3.1)': + '@react-email/components@0.0.25(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@react-email/body': 0.0.10(react@18.3.1) '@react-email/button': 0.0.17(react@18.3.1) @@ -17500,7 +17573,7 @@ snapshots: '@react-email/link': 0.0.10(react@18.3.1) '@react-email/markdown': 0.0.12(react@18.3.1) '@react-email/preview': 0.0.11(react@18.3.1) - '@react-email/render': 1.0.1(react-dom@18.3.1)(react@18.3.1) + '@react-email/render': 1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-email/row': 0.0.10(react@18.3.1) '@react-email/section': 0.0.14(react@18.3.1) '@react-email/tailwind': 0.1.0(react@18.3.1) @@ -17550,7 +17623,7 @@ snapshots: dependencies: react: 18.3.1 - '@react-email/render@0.0.17(react-dom@18.3.1)(react@18.3.1)': + '@react-email/render@0.0.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: html-to-text: 9.0.5 js-beautify: 1.15.1 @@ -17558,7 +17631,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-promise-suspense: 0.3.4 - '@react-email/render@1.0.1(react-dom@18.3.1)(react@18.3.1)': + '@react-email/render@1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: html-to-text: 9.0.5 js-beautify: 1.15.1 @@ -17584,22 +17657,22 @@ snapshots: '@remix-run/router@1.18.0': {} - '@rjsf/antd@5.19.4(@ant-design/icons@5.4.0)(@rjsf/core@5.10.0)(@rjsf/utils@5.10.0)(antd@5.19.4)(dayjs@1.11.12)(react-dom@18.3.1)(react@18.3.1)': + '@rjsf/antd@5.19.4(@ant-design/icons@5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@rjsf/core@5.10.0(@rjsf/utils@5.10.0(react@18.3.1))(react@18.3.1))(@rjsf/utils@5.10.0(react@18.3.1))(antd@5.19.4(date-fns@2.30.0)(moment@2.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@ant-design/icons': 5.4.0(react-dom@18.3.1)(react@18.3.1) - '@rjsf/core': 5.10.0(@rjsf/utils@5.10.0)(react@18.3.1) + '@ant-design/icons': 5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rjsf/core': 5.10.0(@rjsf/utils@5.10.0(react@18.3.1))(react@18.3.1) '@rjsf/utils': 5.10.0(react@18.3.1) - antd: 5.19.4(react-dom@18.3.1)(react@18.3.1) + antd: 5.19.4(date-fns@2.30.0)(moment@2.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 dayjs: 1.11.12 lodash: 4.17.21 lodash-es: 4.17.21 - rc-picker: 2.7.6(react-dom@18.3.1)(react@18.3.1) + rc-picker: 2.7.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 transitivePeerDependencies: - react-dom - '@rjsf/core@5.10.0(@rjsf/utils@5.10.0)(react@18.3.1)': + '@rjsf/core@5.10.0(@rjsf/utils@5.10.0(react@18.3.1))(react@18.3.1)': dependencies: '@rjsf/utils': 5.10.0(react@18.3.1) lodash: 4.17.21 @@ -17618,7 +17691,7 @@ snapshots: react: 18.3.1 react-is: 18.3.1 - '@rjsf/validator-ajv6@5.10.0(@rjsf/utils@5.10.0)': + '@rjsf/validator-ajv6@5.10.0(@rjsf/utils@5.10.0(react@18.3.1))': dependencies: '@rjsf/utils': 5.10.0(react@18.3.1) ajv: 6.12.6 @@ -17630,12 +17703,14 @@ snapshots: rollup: 1.32.1 slash: 3.0.0 - '@rollup/plugin-babel@5.3.1(@babel/core@7.25.2)(rollup@2.79.1)': + '@rollup/plugin-babel@5.3.1(@babel/core@7.25.2)(@types/babel__core@7.20.5)(rollup@2.79.1)': dependencies: '@babel/core': 7.25.2 '@babel/helper-module-imports': 7.24.7 '@rollup/pluginutils': 3.1.0(rollup@2.79.1) rollup: 2.79.1 + optionalDependencies: + '@types/babel__core': 7.20.5 transitivePeerDependencies: - supports-color @@ -17658,6 +17733,7 @@ snapshots: glob: 8.1.0 is-reference: 1.2.1 magic-string: 0.27.0 + optionalDependencies: rollup: 3.29.4 '@rollup/plugin-commonjs@24.0.0(rollup@2.78.0)': @@ -17668,6 +17744,7 @@ snapshots: glob: 8.1.0 is-reference: 1.2.1 magic-string: 0.27.0 + optionalDependencies: rollup: 2.78.0 '@rollup/plugin-commonjs@25.0.8(rollup@3.29.4)': @@ -17678,6 +17755,7 @@ snapshots: glob: 8.1.0 is-reference: 1.2.1 magic-string: 0.30.11 + optionalDependencies: rollup: 3.29.4 '@rollup/plugin-json@4.1.0(rollup@1.32.1)': @@ -17688,17 +17766,20 @@ snapshots: '@rollup/plugin-json@5.0.2(rollup@3.29.4)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@3.29.4) + optionalDependencies: rollup: 3.29.4 '@rollup/plugin-json@6.1.0(rollup@3.29.4)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@3.29.4) + optionalDependencies: rollup: 3.29.4 '@rollup/plugin-multi-entry@6.0.1(rollup@3.29.4)': dependencies: '@rollup/plugin-virtual': 3.0.2(rollup@3.29.4) matched: 5.0.1 + optionalDependencies: rollup: 3.29.4 '@rollup/plugin-node-resolve@11.2.1(rollup@2.79.1)': @@ -17719,6 +17800,7 @@ snapshots: is-builtin-module: 3.2.1 is-module: 1.0.0 resolve: 1.22.8 + optionalDependencies: rollup: 3.29.4 '@rollup/plugin-node-resolve@6.1.0(rollup@1.32.1)': @@ -17740,38 +17822,43 @@ snapshots: dependencies: '@rollup/pluginutils': 5.1.0(rollup@3.29.4) magic-string: 0.30.11 + optionalDependencies: rollup: 3.29.4 '@rollup/plugin-terser@0.1.0(rollup@3.29.4)': dependencies: - rollup: 3.29.4 terser: 5.31.3 + optionalDependencies: + rollup: 3.29.4 '@rollup/plugin-terser@0.4.4(rollup@3.29.4)': dependencies: - rollup: 3.29.4 serialize-javascript: 6.0.2 smob: 1.5.0 terser: 5.31.3 + optionalDependencies: + rollup: 3.29.4 '@rollup/plugin-typescript@11.1.6(rollup@3.29.4)(tslib@2.6.3)(typescript@5.5.4)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@3.29.4) resolve: 1.22.8 + typescript: 5.5.4 + optionalDependencies: rollup: 3.29.4 tslib: 2.6.3 - typescript: 5.5.4 '@rollup/plugin-typescript@11.1.6(rollup@4.19.1)(tslib@2.6.3)(typescript@5.5.4)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.19.1) resolve: 1.22.8 + typescript: 5.5.4 + optionalDependencies: rollup: 4.19.1 tslib: 2.6.3 - typescript: 5.5.4 '@rollup/plugin-virtual@3.0.2(rollup@3.29.4)': - dependencies: + optionalDependencies: rollup: 3.29.4 '@rollup/pluginutils@3.1.0(rollup@1.32.1)': @@ -17798,6 +17885,7 @@ snapshots: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 + optionalDependencies: rollup: 2.78.0 '@rollup/pluginutils@5.1.0(rollup@3.29.4)': @@ -17805,6 +17893,7 @@ snapshots: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 + optionalDependencies: rollup: 3.29.4 '@rollup/pluginutils@5.1.0(rollup@4.19.1)': @@ -17812,6 +17901,7 @@ snapshots: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 + optionalDependencies: rollup: 4.19.1 '@rollup/rollup-android-arm-eabi@4.19.1': @@ -17875,7 +17965,7 @@ snapshots: dependencies: tslib: 2.6.3 - '@segment/analytics-next@1.72.1': + '@segment/analytics-next@1.72.1(encoding@0.1.13)': dependencies: '@lukeed/uuid': 2.0.1 '@segment/analytics-core': 1.6.0 @@ -17884,7 +17974,7 @@ snapshots: '@segment/facade': 3.4.10 dset: 3.1.3 js-cookie: 3.0.1 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) tslib: 2.6.3 unfetch: 4.2.0 transitivePeerDependencies: @@ -17948,11 +18038,11 @@ snapshots: '@sentry/types': 7.118.0 '@sentry/utils': 7.118.0 - '@sentry/cli@1.77.3': + '@sentry/cli@1.77.3(encoding@0.1.13)': dependencies: https-proxy-agent: 5.0.1 mkdirp: 0.5.6 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) progress: 2.0.3 proxy-from-env: 1.1.0 which: 2.0.2 @@ -17972,7 +18062,7 @@ snapshots: '@sentry/utils': 7.118.0 localforage: 1.10.0 - '@sentry/nextjs@7.118.0(next@14.2.5)(react@18.3.1)(webpack@5.93.0)': + '@sentry/nextjs@7.118.0(encoding@0.1.13)(next@14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.93.0)': dependencies: '@rollup/plugin-commonjs': 24.0.0(rollup@2.78.0) '@sentry/core': 7.118.0 @@ -17982,14 +18072,15 @@ snapshots: '@sentry/types': 7.118.0 '@sentry/utils': 7.118.0 '@sentry/vercel-edge': 7.118.0 - '@sentry/webpack-plugin': 1.21.0 + '@sentry/webpack-plugin': 1.21.0(encoding@0.1.13) chalk: 3.0.0 - next: 14.2.5(@babel/core@7.25.2)(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1) + next: 14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 resolve: 1.22.8 rollup: 2.78.0 stacktrace-parser: 0.1.10 - webpack: 5.93.0(webpack-cli@5.1.4) + optionalDependencies: + webpack: 5.93.0 transitivePeerDependencies: - encoding - supports-color @@ -18032,9 +18123,9 @@ snapshots: '@sentry/types': 7.118.0 '@sentry/utils': 7.118.0 - '@sentry/webpack-plugin@1.21.0': + '@sentry/webpack-plugin@1.21.0(encoding@0.1.13)': dependencies: - '@sentry/cli': 1.77.3 + '@sentry/cli': 1.77.3(encoding@0.1.13) webpack-sources: 3.2.3 transitivePeerDependencies: - encoding @@ -18514,22 +18605,23 @@ snapshots: '@swc/counter': 0.1.3 tslib: 2.6.3 - '@tailwindcss/typography@0.5.13(tailwindcss@3.4.7)': + '@tailwindcss/typography@0.5.13(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))': dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.7(ts-node@10.9.2) + tailwindcss: 3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) '@tanstack/query-core@4.36.1': {} - '@tanstack/react-query@4.36.1(react-dom@18.3.1)(react@18.3.1)': + '@tanstack/react-query@4.36.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/query-core': 4.36.1 react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) use-sync-external-store: 1.2.2(react@18.3.1) + optionalDependencies: + react-dom: 18.3.1(react@18.3.1) '@testing-library/dom@10.4.0': dependencies: @@ -18564,7 +18656,7 @@ snapshots: lodash: 4.17.21 redent: 3.0.0 - '@testing-library/react@13.4.0(react-dom@18.3.1)(react@18.3.1)': + '@testing-library/react@13.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 '@testing-library/dom': 8.20.1 @@ -18982,11 +19074,23 @@ snapshots: '@types/webidl-conversions@7.0.3': {} - '@types/webpack@5.28.5(webpack-cli@5.1.4)': + '@types/webpack@5.28.5': + dependencies: + '@types/node': 18.19.42 + tapable: 2.2.1 + webpack: 5.93.0 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + - webpack-cli + optional: true + + '@types/webpack@5.28.5(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))': dependencies: '@types/node': 18.19.42 tapable: 2.2.1 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) transitivePeerDependencies: - '@swc/core' - esbuild @@ -19011,7 +19115,7 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@eslint-community/regexpp': 4.11.0 '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) @@ -19025,11 +19129,12 @@ snapshots: natural-compare-lite: 1.4.0 semver: 7.6.3 tsutils: 3.21.0(typescript@5.5.4) + optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@eslint-community/regexpp': 4.11.0 '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) @@ -19042,6 +19147,7 @@ snapshots: ignore: 5.3.1 natural-compare: 1.4.0 ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -19061,6 +19167,7 @@ snapshots: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) debug: 4.3.6(supports-color@5.5.0) eslint: 8.57.0 + optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -19073,6 +19180,7 @@ snapshots: '@typescript-eslint/visitor-keys': 7.18.0 debug: 4.3.6(supports-color@5.5.0) eslint: 8.57.0 + optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -19085,6 +19193,7 @@ snapshots: '@typescript-eslint/visitor-keys': 7.2.0 debug: 4.3.6(supports-color@5.5.0) eslint: 8.57.0 + optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -19111,6 +19220,7 @@ snapshots: debug: 4.3.6(supports-color@5.5.0) eslint: 8.57.0 tsutils: 3.21.0(typescript@5.5.4) + optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -19122,6 +19232,7 @@ snapshots: debug: 4.3.6(supports-color@5.5.0) eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -19141,6 +19252,7 @@ snapshots: is-glob: 4.0.3 semver: 7.6.3 tsutils: 3.21.0(typescript@5.5.4) + optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -19155,6 +19267,7 @@ snapshots: minimatch: 9.0.5 semver: 7.6.3 ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -19169,6 +19282,7 @@ snapshots: minimatch: 9.0.3 semver: 7.6.3 ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -19220,7 +19334,7 @@ snapshots: '@vercel/error-utils@2.0.2': {} - '@vercel/fun@1.1.0': + '@vercel/fun@1.1.0(encoding@0.1.13)': dependencies: '@tootallnate/once': 2.0.0 async-listen: 1.2.0 @@ -19230,7 +19344,7 @@ snapshots: generic-pool: 3.4.2 micro: 9.3.5-canary.3 ms: 2.1.1 - node-fetch: 2.6.7 + node-fetch: 2.6.7(encoding@0.1.13) path-match: 1.2.4 promisepipe: 3.0.0 semver: 7.3.5 @@ -19266,16 +19380,16 @@ snapshots: '@vercel/static-config': 3.0.0 ts-morph: 12.0.0 - '@vercel/next@4.3.6': + '@vercel/next@4.3.6(encoding@0.1.13)': dependencies: - '@vercel/nft': 0.27.3 + '@vercel/nft': 0.27.3(encoding@0.1.13) transitivePeerDependencies: - encoding - supports-color - '@vercel/nft@0.27.3': + '@vercel/nft@0.27.3(encoding@0.1.13)': dependencies: - '@mapbox/node-pre-gyp': 1.0.11 + '@mapbox/node-pre-gyp': 1.0.11(encoding@0.1.13) '@rollup/pluginutils': 4.2.1 acorn: 8.12.1 acorn-import-attributes: 1.9.5(acorn@8.12.1) @@ -19291,7 +19405,7 @@ snapshots: - encoding - supports-color - '@vercel/node@3.2.8': + '@vercel/node@3.2.8(encoding@0.1.13)': dependencies: '@edge-runtime/node-utils': 2.3.0 '@edge-runtime/primitives': 4.1.0 @@ -19299,7 +19413,7 @@ snapshots: '@types/node': 16.18.11 '@vercel/build-utils': 8.3.6 '@vercel/error-utils': 2.0.2 - '@vercel/nft': 0.27.3 + '@vercel/nft': 0.27.3(encoding@0.1.13) '@vercel/static-config': 3.0.0 async-listen: 3.0.0 cjs-module-lexer: 1.2.3 @@ -19307,7 +19421,7 @@ snapshots: es-module-lexer: 1.4.1 esbuild: 0.14.47 etag: 1.8.1 - node-fetch: 2.6.9 + node-fetch: 2.6.9(encoding@0.1.13) path-to-regexp: 6.2.1 ts-morph: 12.0.0 ts-node: 10.9.1(@types/node@16.18.11)(typescript@4.9.5) @@ -19321,9 +19435,9 @@ snapshots: '@vercel/python@4.3.1': {} - '@vercel/redwood@2.1.3': + '@vercel/redwood@2.1.3(encoding@0.1.13)': dependencies: - '@vercel/nft': 0.27.3 + '@vercel/nft': 0.27.3(encoding@0.1.13) '@vercel/routing-utils': 3.1.0 '@vercel/static-config': 3.0.0 semver: 6.3.1 @@ -19332,10 +19446,10 @@ snapshots: - encoding - supports-color - '@vercel/remix-builder@2.2.3': + '@vercel/remix-builder@2.2.3(encoding@0.1.13)': dependencies: '@vercel/error-utils': 2.0.2 - '@vercel/nft': 0.27.3 + '@vercel/nft': 0.27.3(encoding@0.1.13) '@vercel/static-config': 3.0.0 ts-morph: 12.0.0 transitivePeerDependencies: @@ -19439,32 +19553,33 @@ snapshots: '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.93.0)': + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)))': dependencies: - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) - '@webpack-cli/generators@3.0.7(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0)': + '@webpack-cli/generators@3.0.7(encoding@0.1.13)(mem-fs@2.3.0)(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0)': dependencies: - prettier: 2.8.8 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) yeoman-environment: 3.19.3 - yeoman-generator: 5.10.0(yeoman-environment@3.19.3) + yeoman-generator: 5.10.0(encoding@0.1.13)(mem-fs@2.3.0)(yeoman-environment@3.19.3) + optionalDependencies: + prettier: 2.8.8 transitivePeerDependencies: - bluebird - encoding - mem-fs - supports-color - '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.93.0)': + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)))': dependencies: - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.93.0)': + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)))': dependencies: - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) '@xobotyi/scrollbar-width@1.9.5': {} @@ -19544,7 +19659,7 @@ snapshots: indent-string: 4.0.0 ajv-formats@2.1.1(ajv@8.12.0): - dependencies: + optionalDependencies: ajv: 8.12.0 ajv-keywords@3.5.2(ajv@6.12.6): @@ -19630,55 +19745,55 @@ snapshots: dependencies: entities: 2.2.0 - antd@5.19.4(react-dom@18.3.1)(react@18.3.1): + antd@5.19.4(date-fns@2.30.0)(moment@2.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@ant-design/colors': 7.1.0 - '@ant-design/cssinjs': 1.21.0(react-dom@18.3.1)(react@18.3.1) - '@ant-design/cssinjs-utils': 1.0.3(react-dom@18.3.1)(react@18.3.1) - '@ant-design/icons': 5.4.0(react-dom@18.3.1)(react@18.3.1) + '@ant-design/cssinjs': 1.21.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/cssinjs-utils': 1.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/icons': 5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@ant-design/react-slick': 1.1.2(react@18.3.1) '@babel/runtime': 7.25.0 '@ctrl/tinycolor': 3.6.1 - '@rc-component/color-picker': 1.5.3(react-dom@18.3.1)(react@18.3.1) - '@rc-component/mutate-observer': 1.1.0(react-dom@18.3.1)(react@18.3.1) - '@rc-component/qrcode': 1.0.0(react-dom@18.3.1)(react@18.3.1) - '@rc-component/tour': 1.15.0(react-dom@18.3.1)(react@18.3.1) - '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) + '@rc-component/color-picker': 1.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/mutate-observer': 1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/qrcode': 1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/tour': 1.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 copy-to-clipboard: 3.3.3 dayjs: 1.11.12 - rc-cascader: 3.27.0(react-dom@18.3.1)(react@18.3.1) - rc-checkbox: 3.3.0(react-dom@18.3.1)(react@18.3.1) - rc-collapse: 3.7.3(react-dom@18.3.1)(react@18.3.1) - rc-dialog: 9.5.2(react-dom@18.3.1)(react@18.3.1) - rc-drawer: 7.2.0(react-dom@18.3.1)(react@18.3.1) - rc-dropdown: 4.2.0(react-dom@18.3.1)(react@18.3.1) - rc-field-form: 2.2.1(react-dom@18.3.1)(react@18.3.1) - rc-image: 7.9.0(react-dom@18.3.1)(react@18.3.1) - rc-input: 1.5.1(react-dom@18.3.1)(react@18.3.1) - rc-input-number: 9.1.0(react-dom@18.3.1)(react@18.3.1) - rc-mentions: 2.14.0(react-dom@18.3.1)(react@18.3.1) - rc-menu: 9.14.1(react-dom@18.3.1)(react@18.3.1) - rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) - rc-notification: 5.6.0(react-dom@18.3.1)(react@18.3.1) - rc-pagination: 4.2.0(react-dom@18.3.1)(react@18.3.1) - rc-picker: 4.6.11(dayjs@1.11.12)(react-dom@18.3.1)(react@18.3.1) - rc-progress: 4.0.0(react-dom@18.3.1)(react@18.3.1) - rc-rate: 2.13.0(react-dom@18.3.1)(react@18.3.1) - rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) - rc-segmented: 2.3.0(react-dom@18.3.1)(react@18.3.1) - rc-select: 14.15.1(react-dom@18.3.1)(react@18.3.1) - rc-slider: 10.6.2(react-dom@18.3.1)(react@18.3.1) - rc-steps: 6.0.1(react-dom@18.3.1)(react@18.3.1) - rc-switch: 4.1.0(react-dom@18.3.1)(react@18.3.1) - rc-table: 7.45.7(react-dom@18.3.1)(react@18.3.1) - rc-tabs: 15.1.1(react-dom@18.3.1)(react@18.3.1) - rc-textarea: 1.7.0(react-dom@18.3.1)(react@18.3.1) - rc-tooltip: 6.2.0(react-dom@18.3.1)(react@18.3.1) - rc-tree: 5.8.8(react-dom@18.3.1)(react@18.3.1) - rc-tree-select: 5.22.1(react-dom@18.3.1)(react@18.3.1) - rc-upload: 4.6.0(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-cascader: 3.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-checkbox: 3.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-collapse: 3.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-dialog: 9.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-drawer: 7.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-dropdown: 4.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-field-form: 2.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-image: 7.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-input: 1.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-input-number: 9.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-mentions: 2.14.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-menu: 9.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-notification: 5.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-pagination: 4.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-picker: 4.6.11(date-fns@2.30.0)(dayjs@1.11.12)(moment@2.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-progress: 4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-rate: 2.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-segmented: 2.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-select: 14.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-slider: 10.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-steps: 6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-switch: 4.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-table: 7.45.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tabs: 15.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-textarea: 1.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tooltip: 6.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tree: 5.8.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tree-select: 5.22.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-upload: 4.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) scroll-into-view-if-needed: 3.1.0 @@ -19991,14 +20106,21 @@ snapshots: loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 + + babel-loader@9.1.3(@babel/core@7.25.2)(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))): + dependencies: + '@babel/core': 7.25.2 + find-cache-dir: 4.0.0 + schema-utils: 4.2.0 + webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) babel-loader@9.1.3(@babel/core@7.25.2)(webpack@5.93.0): dependencies: '@babel/core': 7.25.2 find-cache-dir: 4.0.0 schema-utils: 4.2.0 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 babel-plugin-istanbul@6.1.1: dependencies: @@ -20538,10 +20660,10 @@ snapshots: clean-stack@2.2.0: {} - clean-webpack-plugin@4.0.0(webpack@5.93.0): + clean-webpack-plugin@4.0.0(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))): dependencies: del: 4.1.1 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) cli-boxes@3.0.0: {} @@ -20765,7 +20887,7 @@ snapshots: dependencies: toggle-selection: 1.0.6 - copy-webpack-plugin@12.0.2(webpack@5.93.0): + copy-webpack-plugin@12.0.2(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))): dependencies: fast-glob: 3.3.2 glob-parent: 6.0.2 @@ -20773,7 +20895,7 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) core-js-compat@3.37.1: dependencies: @@ -20830,13 +20952,58 @@ snapshots: crc-32: 1.2.2 readable-stream: 3.6.2 - create-jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2): + create-jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + create-jest@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + create-jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + create-jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -20847,15 +21014,15 @@ snapshots: create-require@1.1.1: {} - cross-fetch@3.1.8: + cross-fetch@3.1.8(encoding@0.1.13): dependencies: - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) transitivePeerDependencies: - encoding - cross-fetch@4.0.0: + cross-fetch@4.0.0(encoding@0.1.13): dependencies: - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) transitivePeerDependencies: - encoding @@ -20904,7 +21071,8 @@ snapshots: postcss-modules-values: 4.0.0(postcss@8.4.41) postcss-value-parser: 4.2.0 semver: 7.6.3 - webpack: 5.93.0(webpack-cli@5.1.4) + optionalDependencies: + webpack: 5.93.0 css-minimizer-webpack-plugin@3.4.1(webpack@5.93.0): dependencies: @@ -20914,7 +21082,7 @@ snapshots: schema-utils: 4.2.0 serialize-javascript: 6.0.2 source-map: 0.6.1 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 css-modules-loader-core@1.1.0: dependencies: @@ -21187,6 +21355,7 @@ snapshots: debug@4.3.6(supports-color@5.5.0): dependencies: ms: 2.1.2 + optionalDependencies: supports-color: 5.5.0 debuglog@1.0.1: {} @@ -21207,7 +21376,9 @@ snapshots: dedent@0.7.0: {} - dedent@1.5.3: {} + dedent@1.5.3(babel-plugin-macros@3.1.0): + optionalDependencies: + babel-plugin-macros: 3.1.0 deep-equal@2.2.3: dependencies: @@ -21846,11 +22017,12 @@ snapshots: '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) + optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - eslint-import-resolver-webpack @@ -21860,23 +22032,24 @@ snapshots: dependencies: eslint: 8.57.0 - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0)(jest@27.5.1)(typescript@5.5.4): + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(eslint@8.57.0)(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4): dependencies: '@babel/core': 7.25.2 '@babel/eslint-parser': 7.25.1(@babel/core@7.25.2)(eslint@8.57.0) '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 eslint: 8.57.0 - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0)(eslint@8.57.0) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.57.0)(jest@27.5.1)(typescript@5.5.4) + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) eslint-plugin-testing-library: 5.11.1(eslint@8.57.0)(typescript@5.5.4) + optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - '@babel/plugin-syntax-flow' @@ -21894,13 +22067,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 4.3.6(supports-color@5.5.0) enhanced-resolve: 5.17.1 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.6 is-core-module: 2.15.0 @@ -21911,26 +22084,28 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): dependencies: - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4) debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0) transitivePeerDependencies: - supports-color - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0): + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(eslint@8.57.0): dependencies: '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.25.2) '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2) @@ -21938,9 +22113,8 @@ snapshots: lodash: 4.17.21 string-natural-compare: 3.0.1 - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0)(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0): dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 @@ -21949,7 +22123,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.15.0 is-glob: 4.0.3 @@ -21959,14 +22133,15 @@ snapshots: object.values: 1.2.0 semver: 6.3.1 tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): dependencies: - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4) array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 @@ -21975,7 +22150,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.15.0 is-glob: 4.0.3 @@ -21985,17 +22160,20 @@ snapshots: object.values: 1.2.0 semver: 6.3.1 tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.57.0)(jest@27.5.1)(typescript@5.5.4): + eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4): dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) eslint: 8.57.0 - jest: 27.5.1(ts-node@10.9.2) + optionalDependencies: + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) + jest: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) transitivePeerDependencies: - supports-color - typescript @@ -22083,7 +22261,7 @@ snapshots: micromatch: 4.0.7 normalize-path: 3.0.0 schema-utils: 4.2.0 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 eslint@8.57.0: dependencies: @@ -22324,17 +22502,17 @@ snapshots: dependencies: bser: 2.1.1 - fbemitter@3.0.0: + fbemitter@3.0.0(encoding@0.1.13): dependencies: - fbjs: 3.0.5 + fbjs: 3.0.5(encoding@0.1.13) transitivePeerDependencies: - encoding fbjs-css-vars@1.0.2: {} - fbjs@3.0.5: + fbjs@3.0.5(encoding@0.1.13): dependencies: - cross-fetch: 3.1.8 + cross-fetch: 3.1.8(encoding@0.1.13) fbjs-css-vars: 1.0.2 loose-envify: 1.4.0 object-assign: 4.1.1 @@ -22372,7 +22550,7 @@ snapshots: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 file-uri-to-path@1.0.0: {} @@ -22437,7 +22615,7 @@ snapshots: micromatch: 4.0.7 pkg-dir: 4.2.0 - firebase-admin@12.3.0: + firebase-admin@12.3.0(encoding@0.1.13): dependencies: '@fastify/busboy': 3.0.0 '@firebase/database-compat': 1.0.6 @@ -22449,8 +22627,8 @@ snapshots: node-forge: 1.3.1 uuid: 10.0.0 optionalDependencies: - '@google-cloud/firestore': 7.9.0 - '@google-cloud/storage': 7.12.1 + '@google-cloud/firestore': 7.9.0(encoding@0.1.13) + '@google-cloud/storage': 7.12.1(encoding@0.1.13) transitivePeerDependencies: - encoding - supports-color @@ -22503,10 +22681,10 @@ snapshots: flatted@3.3.1: {} - flux@4.0.4(react@18.3.1): + flux@4.0.4(encoding@0.1.13)(react@18.3.1): dependencies: - fbemitter: 3.0.0 - fbjs: 3.0.5 + fbemitter: 3.0.0(encoding@0.1.13) + fbjs: 3.0.5(encoding@0.1.13) react: 18.3.1 transitivePeerDependencies: - encoding @@ -22530,7 +22708,6 @@ snapshots: chokidar: 3.6.0 cosmiconfig: 6.0.0 deepmerge: 4.3.1 - eslint: 8.57.0 fs-extra: 9.1.0 glob: 7.2.3 memfs: 3.5.3 @@ -22539,7 +22716,9 @@ snapshots: semver: 7.6.3 tapable: 1.1.3 typescript: 5.5.4 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 + optionalDependencies: + eslint: 8.57.0 form-data@2.5.1: dependencies: @@ -22669,39 +22848,39 @@ snapshots: strip-ansi: 6.0.1 wide-align: 1.1.5 - gaxios@4.3.3: + gaxios@4.3.3(encoding@0.1.13): dependencies: abort-controller: 3.0.0 extend: 3.0.2 https-proxy-agent: 5.0.1 is-stream: 2.0.1 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) transitivePeerDependencies: - encoding - supports-color - gaxios@6.7.0: + gaxios@6.7.0(encoding@0.1.13): dependencies: extend: 3.0.2 https-proxy-agent: 7.0.5 is-stream: 2.0.1 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) uuid: 10.0.0 transitivePeerDependencies: - encoding - supports-color - gcp-metadata@4.3.1: + gcp-metadata@4.3.1(encoding@0.1.13): dependencies: - gaxios: 4.3.3 + gaxios: 4.3.3(encoding@0.1.13) json-bigint: 1.0.0 transitivePeerDependencies: - encoding - supports-color - gcp-metadata@6.1.0: + gcp-metadata@6.1.0(encoding@0.1.13): dependencies: - gaxios: 6.7.0 + gaxios: 6.7.0(encoding@0.1.13) json-bigint: 1.0.0 transitivePeerDependencies: - encoding @@ -22751,9 +22930,9 @@ snapshots: github-from-package@0.0.0: {} - github-username@6.0.0: + github-username@6.0.0(encoding@0.1.13): dependencies: - '@octokit/rest': 18.12.0 + '@octokit/rest': 18.12.0(encoding@0.1.13) transitivePeerDependencies: - encoding @@ -22860,14 +23039,14 @@ snapshots: globrex@0.1.2: {} - google-ads-api@16.0.0-rest-beta3: + google-ads-api@16.0.0-rest-beta3(encoding@0.1.13): dependencies: '@isaacs/ttlcache': 1.4.1 axios: 1.7.2 circ-json: 1.0.4 - google-ads-node: 13.0.0 - google-auth-library: 7.14.1 - google-gax: 4.3.8 + google-ads-node: 13.0.0(encoding@0.1.13) + google-auth-library: 7.14.1(encoding@0.1.13) + google-gax: 4.3.8(encoding@0.1.13) long: 4.0.0 map-obj: 4.3.0 stream-json: 1.8.0 @@ -22876,54 +23055,54 @@ snapshots: - encoding - supports-color - google-ads-node@13.0.0: + google-ads-node@13.0.0(encoding@0.1.13): dependencies: - google-gax: 4.3.8 + google-gax: 4.3.8(encoding@0.1.13) lru-cache: 10.4.3 transitivePeerDependencies: - encoding - supports-color - google-auth-library@7.14.1: + google-auth-library@7.14.1(encoding@0.1.13): dependencies: arrify: 2.0.1 base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 fast-text-encoding: 1.0.6 - gaxios: 4.3.3 - gcp-metadata: 4.3.1 - gtoken: 5.3.2 + gaxios: 4.3.3(encoding@0.1.13) + gcp-metadata: 4.3.1(encoding@0.1.13) + gtoken: 5.3.2(encoding@0.1.13) jws: 4.0.0 lru-cache: 6.0.0 transitivePeerDependencies: - encoding - supports-color - google-auth-library@9.12.0: + google-auth-library@9.12.0(encoding@0.1.13): dependencies: base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 - gaxios: 6.7.0 - gcp-metadata: 6.1.0 - gtoken: 7.1.0 + gaxios: 6.7.0(encoding@0.1.13) + gcp-metadata: 6.1.0(encoding@0.1.13) + gtoken: 7.1.0(encoding@0.1.13) jws: 4.0.0 transitivePeerDependencies: - encoding - supports-color - google-gax@4.3.8: + google-gax@4.3.8(encoding@0.1.13): dependencies: '@grpc/grpc-js': 1.11.1 '@grpc/proto-loader': 0.7.13 '@types/long': 4.0.2 abort-controller: 3.0.0 duplexify: 4.1.3 - google-auth-library: 9.12.0 - node-fetch: 2.7.0 + google-auth-library: 9.12.0(encoding@0.1.13) + node-fetch: 2.7.0(encoding@0.1.13) object-hash: 3.0.0 proto3-json-serializer: 2.0.2 protobufjs: 7.3.2 - retry-request: 7.0.2 + retry-request: 7.0.2(encoding@0.1.13) uuid: 9.0.1 transitivePeerDependencies: - encoding @@ -22933,11 +23112,11 @@ snapshots: dependencies: node-forge: 1.3.1 - googleapis-common@7.2.0: + googleapis-common@7.2.0(encoding@0.1.13): dependencies: extend: 3.0.2 - gaxios: 6.7.0 - google-auth-library: 9.12.0 + gaxios: 6.7.0(encoding@0.1.13) + google-auth-library: 9.12.0(encoding@0.1.13) qs: 6.12.3 url-template: 2.0.8 uuid: 9.0.1 @@ -22945,10 +23124,10 @@ snapshots: - encoding - supports-color - googleapis@126.0.1: + googleapis@126.0.1(encoding@0.1.13): dependencies: - google-auth-library: 9.12.0 - googleapis-common: 7.2.0 + google-auth-library: 9.12.0(encoding@0.1.13) + googleapis-common: 7.2.0(encoding@0.1.13) transitivePeerDependencies: - encoding - supports-color @@ -22963,18 +23142,18 @@ snapshots: grouped-queue@2.0.0: {} - gtoken@5.3.2: + gtoken@5.3.2(encoding@0.1.13): dependencies: - gaxios: 4.3.3 + gaxios: 4.3.3(encoding@0.1.13) google-p12-pem: 3.1.4 jws: 4.0.0 transitivePeerDependencies: - encoding - supports-color - gtoken@7.1.0: + gtoken@7.1.0(encoding@0.1.13): dependencies: - gaxios: 6.7.0 + gaxios: 6.7.0(encoding@0.1.13) jws: 4.0.0 transitivePeerDependencies: - encoding @@ -23105,7 +23284,8 @@ snapshots: lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.93.0(webpack-cli@5.1.4) + optionalDependencies: + webpack: 5.93.0 htmlencode@0.0.4: {} @@ -23189,12 +23369,13 @@ snapshots: http-proxy-middleware@2.0.6(@types/express@4.17.21): dependencies: - '@types/express': 4.17.21 '@types/http-proxy': 1.17.14 http-proxy: 1.18.1 is-glob: 4.0.3 is-plain-obj: 3.0.0 micromatch: 4.0.7 + optionalDependencies: + '@types/express': 4.17.21 transitivePeerDependencies: - debug @@ -23759,7 +23940,7 @@ snapshots: transitivePeerDependencies: - supports-color - jest-circus@29.7.0: + jest-circus@29.7.0(babel-plugin-macros@3.1.0): dependencies: '@jest/environment': 29.7.0 '@jest/expect': 29.7.0 @@ -23768,7 +23949,7 @@ snapshots: '@types/node': 18.19.42 chalk: 4.1.2 co: 4.6.0 - dedent: 1.5.3 + dedent: 1.5.3(babel-plugin-macros@3.1.0) is-generator-fn: 2.1.0 jest-each: 29.7.0 jest-matcher-utils: 29.7.0 @@ -23785,16 +23966,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@27.5.1(ts-node@10.9.2): + jest-cli@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): dependencies: - '@jest/core': 27.5.1(ts-node@10.9.2) + '@jest/core': 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.2.0 - jest-config: 27.5.1(ts-node@10.9.2) + jest-config: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) jest-util: 27.5.1 jest-validate: 27.5.1 prompts: 2.4.2 @@ -23806,16 +23987,16 @@ snapshots: - ts-node - utf-8-validate - jest-cli@28.1.3(@types/node@18.19.42)(ts-node@10.9.2): + jest-cli@28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): dependencies: - '@jest/core': 28.1.3(ts-node@10.9.2) + '@jest/core': 28.1.3(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) '@jest/test-result': 28.1.3 '@jest/types': 28.1.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.2.0 - jest-config: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2) + jest-config: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) jest-util: 28.1.3 jest-validate: 28.1.3 prompts: 2.4.2 @@ -23825,16 +24006,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@18.19.42)(ts-node@10.9.2): + jest-cli@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + create-jest: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -23844,24 +24025,81 @@ snapshots: - supports-color - ts-node - jest-config@27.5.1(ts-node@10.9.2): + jest-cli@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): dependencies: - '@babel/core': 7.25.2 - '@jest/test-sequencer': 27.5.1 - '@jest/types': 27.5.1 - babel-jest: 27.5.1(@babel/core@7.25.2) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 27.5.1 - jest-environment-jsdom: 27.5.1 - jest-environment-node: 27.5.1 - jest-get-type: 27.5.1 - jest-jasmine2: 27.5.1 - jest-regex-util: 27.5.1 - jest-resolve: 27.5.1 + create-jest: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest-cli@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest-cli@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest-config@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + dependencies: + '@babel/core': 7.25.2 + '@jest/test-sequencer': 27.5.1 + '@jest/types': 27.5.1 + babel-jest: 27.5.1(@babel/core@7.25.2) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 27.5.1 + jest-environment-jsdom: 27.5.1 + jest-environment-node: 27.5.1 + jest-get-type: 27.5.1 + jest-jasmine2: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 jest-runner: 27.5.1 jest-util: 27.5.1 jest-validate: 27.5.1 @@ -23870,6 +24108,7 @@ snapshots: pretty-format: 27.5.1 slash: 3.0.0 strip-json-comments: 3.1.1 + optionalDependencies: ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) transitivePeerDependencies: - bufferutil @@ -23877,12 +24116,11 @@ snapshots: - supports-color - utf-8-validate - jest-config@28.1.3(@types/node@18.19.42)(ts-node@10.9.2): + jest-config@28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): dependencies: '@babel/core': 7.25.2 '@jest/test-sequencer': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 18.19.42 babel-jest: 28.1.3(@babel/core@7.25.2) chalk: 4.1.2 ci-info: 3.9.0 @@ -23902,23 +24140,117 @@ snapshots: pretty-format: 28.1.3 slash: 3.0.0 strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 18.19.42 + ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) + transitivePeerDependencies: + - supports-color + + jest-config@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)): + dependencies: + '@babel/core': 7.25.2 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 16.18.11 + ts-node: 10.9.2(@types/node@16.18.11)(typescript@5.5.4) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + dependencies: + '@babel/core': 7.25.2 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 18.19.42 ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) transitivePeerDependencies: + - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@18.19.42)(ts-node@10.9.2): + jest-config@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)): dependencies: '@babel/core': 7.25.2 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: '@types/node': 18.19.42 + ts-node: 10.9.2(@types/node@16.18.11)(typescript@5.5.4) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + dependencies: + '@babel/core': 7.25.2 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.25.2) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-circus: 29.7.0 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) jest-environment-node: 29.7.0 jest-get-type: 29.6.3 jest-regex-util: 29.6.3 @@ -23931,6 +24263,8 @@ snapshots: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 18.19.42 ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) transitivePeerDependencies: - babel-plugin-macros @@ -24201,15 +24535,15 @@ snapshots: jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): - dependencies: + optionalDependencies: jest-resolve: 27.5.1 jest-pnp-resolver@1.2.3(jest-resolve@28.1.3): - dependencies: + optionalDependencies: jest-resolve: 28.1.3 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - dependencies: + optionalDependencies: jest-resolve: 29.7.0 jest-regex-util@27.5.1: {} @@ -24578,11 +24912,11 @@ snapshots: leven: 3.1.0 pretty-format: 29.7.0 - jest-watch-typeahead@1.1.0(jest@27.5.1): + jest-watch-typeahead@1.1.0(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))): dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 - jest: 27.5.1(ts-node@10.9.2) + jest: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) jest-regex-util: 28.0.2 jest-watcher: 28.1.3 slash: 4.0.0 @@ -24651,11 +24985,11 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@27.5.1(ts-node@10.9.2): + jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): dependencies: - '@jest/core': 27.5.1(ts-node@10.9.2) + '@jest/core': 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) import-local: 3.2.0 - jest-cli: 27.5.1(ts-node@10.9.2) + jest-cli: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) transitivePeerDependencies: - bufferutil - canvas @@ -24663,23 +24997,59 @@ snapshots: - ts-node - utf-8-validate - jest@28.1.3(@types/node@18.19.42)(ts-node@10.9.2): + jest@28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): dependencies: - '@jest/core': 28.1.3(ts-node@10.9.2) + '@jest/core': 28.1.3(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) '@jest/types': 28.1.3 import-local: 3.2.0 - jest-cli: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2) + jest-cli: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + + jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + '@jest/types': 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + dependencies: + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + '@jest/types': 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + '@jest/types': 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) transitivePeerDependencies: - '@types/node' + - babel-plugin-macros - supports-color - ts-node - jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2): + jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + jest-cli: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -24856,13 +25226,13 @@ snapshots: object.assign: 4.1.5 object.values: 1.2.0 - juice@10.0.0: + juice@10.0.0(encoding@0.1.13): dependencies: cheerio: 1.0.0-rc.12 commander: 6.2.1 mensch: 0.3.4 slick: 1.12.2 - web-resource-inliner: 6.0.1 + web-resource-inliner: 6.0.1(encoding@0.1.13) transitivePeerDependencies: - encoding @@ -24940,7 +25310,7 @@ snapshots: dependencies: klona: 2.0.6 less: 4.2.0 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 less@4.2.0: dependencies: @@ -25110,7 +25480,7 @@ snapshots: lodash.clonedeep: 4.5.0 lru-cache: 6.0.0 - lucide-react@0.263.1(react@18.3.1): + lucide-react@0.447.0(react@18.3.1): dependencies: react: 18.3.1 @@ -25260,11 +25630,12 @@ snapshots: ejs: 3.1.10 globby: 11.1.0 isbinaryfile: 5.0.2 - mem-fs: 2.3.0 minimatch: 7.4.6 multimatch: 5.0.0 normalize-path: 3.0.0 textextensions: 5.16.0 + optionalDependencies: + mem-fs: 2.3.0 mem-fs@2.3.0: dependencies: @@ -25373,7 +25744,7 @@ snapshots: dependencies: schema-utils: 4.2.0 tapable: 2.2.1 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 minimalistic-assert@1.0.1: {} @@ -25477,39 +25848,39 @@ snapshots: mixwith@0.1.1: {} - mjml-accordion@4.15.3: + mjml-accordion@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-body@4.15.3: + mjml-body@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-button@4.15.3: + mjml-button@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-carousel@4.15.3: + mjml-carousel@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-cli@4.15.3: + mjml-cli@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 chokidar: 3.6.0 @@ -25518,149 +25889,149 @@ snapshots: js-beautify: 1.15.1 lodash: 4.17.21 minimatch: 9.0.5 - mjml-core: 4.15.3 - mjml-migrate: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) + mjml-migrate: 4.15.3(encoding@0.1.13) mjml-parser-xml: 4.15.3 mjml-validator: 4.15.3 yargs: 17.7.2 transitivePeerDependencies: - encoding - mjml-column@4.15.3: + mjml-column@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-core@4.15.3: + mjml-core@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 cheerio: 1.0.0-rc.12 detect-node: 2.1.0 html-minifier: 4.0.0 js-beautify: 1.15.1 - juice: 10.0.0 + juice: 10.0.0(encoding@0.1.13) lodash: 4.17.21 - mjml-migrate: 4.15.3 + mjml-migrate: 4.15.3(encoding@0.1.13) mjml-parser-xml: 4.15.3 mjml-validator: 4.15.3 transitivePeerDependencies: - encoding - mjml-divider@4.15.3: + mjml-divider@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-group@4.15.3: + mjml-group@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-head-attributes@4.15.3: + mjml-head-attributes@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-head-breakpoint@4.15.3: + mjml-head-breakpoint@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-head-font@4.15.3: + mjml-head-font@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-head-html-attributes@4.15.3: + mjml-head-html-attributes@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-head-preview@4.15.3: + mjml-head-preview@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-head-style@4.15.3: + mjml-head-style@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-head-title@4.15.3: + mjml-head-title@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-head@4.15.3: + mjml-head@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-hero@4.15.3: + mjml-hero@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-image@4.15.3: + mjml-image@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-migrate@4.15.3: + mjml-migrate@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 js-beautify: 1.15.1 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) mjml-parser-xml: 4.15.3 yargs: 17.7.2 transitivePeerDependencies: - encoding - mjml-navbar@4.15.3: + mjml-navbar@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding @@ -25671,92 +26042,92 @@ snapshots: htmlparser2: 9.1.0 lodash: 4.17.21 - mjml-preset-core@4.15.3: + mjml-preset-core@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 - mjml-accordion: 4.15.3 - mjml-body: 4.15.3 - mjml-button: 4.15.3 - mjml-carousel: 4.15.3 - mjml-column: 4.15.3 - mjml-divider: 4.15.3 - mjml-group: 4.15.3 - mjml-head: 4.15.3 - mjml-head-attributes: 4.15.3 - mjml-head-breakpoint: 4.15.3 - mjml-head-font: 4.15.3 - mjml-head-html-attributes: 4.15.3 - mjml-head-preview: 4.15.3 - mjml-head-style: 4.15.3 - mjml-head-title: 4.15.3 - mjml-hero: 4.15.3 - mjml-image: 4.15.3 - mjml-navbar: 4.15.3 - mjml-raw: 4.15.3 - mjml-section: 4.15.3 - mjml-social: 4.15.3 - mjml-spacer: 4.15.3 - mjml-table: 4.15.3 - mjml-text: 4.15.3 - mjml-wrapper: 4.15.3 + mjml-accordion: 4.15.3(encoding@0.1.13) + mjml-body: 4.15.3(encoding@0.1.13) + mjml-button: 4.15.3(encoding@0.1.13) + mjml-carousel: 4.15.3(encoding@0.1.13) + mjml-column: 4.15.3(encoding@0.1.13) + mjml-divider: 4.15.3(encoding@0.1.13) + mjml-group: 4.15.3(encoding@0.1.13) + mjml-head: 4.15.3(encoding@0.1.13) + mjml-head-attributes: 4.15.3(encoding@0.1.13) + mjml-head-breakpoint: 4.15.3(encoding@0.1.13) + mjml-head-font: 4.15.3(encoding@0.1.13) + mjml-head-html-attributes: 4.15.3(encoding@0.1.13) + mjml-head-preview: 4.15.3(encoding@0.1.13) + mjml-head-style: 4.15.3(encoding@0.1.13) + mjml-head-title: 4.15.3(encoding@0.1.13) + mjml-hero: 4.15.3(encoding@0.1.13) + mjml-image: 4.15.3(encoding@0.1.13) + mjml-navbar: 4.15.3(encoding@0.1.13) + mjml-raw: 4.15.3(encoding@0.1.13) + mjml-section: 4.15.3(encoding@0.1.13) + mjml-social: 4.15.3(encoding@0.1.13) + mjml-spacer: 4.15.3(encoding@0.1.13) + mjml-table: 4.15.3(encoding@0.1.13) + mjml-text: 4.15.3(encoding@0.1.13) + mjml-wrapper: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-raw@4.15.3: + mjml-raw@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-react@2.0.8(mjml@4.15.3)(react-dom@18.3.1)(react@18.3.1): + mjml-react@2.0.8(mjml@4.15.3(encoding@0.1.13))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 babel-runtime: 6.25.0 color: 3.2.1 - mjml: 4.15.3 + mjml: 4.15.3(encoding@0.1.13) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-reconciler: 0.26.2(react@18.3.1) - mjml-section@4.15.3: + mjml-section@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-social@4.15.3: + mjml-social@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-spacer@4.15.3: + mjml-spacer@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-table@4.15.3: + mjml-table@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml-text@4.15.3: + mjml-text@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding @@ -25764,22 +26135,22 @@ snapshots: dependencies: '@babel/runtime': 7.25.0 - mjml-wrapper@4.15.3: + mjml-wrapper@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 lodash: 4.17.21 - mjml-core: 4.15.3 - mjml-section: 4.15.3 + mjml-core: 4.15.3(encoding@0.1.13) + mjml-section: 4.15.3(encoding@0.1.13) transitivePeerDependencies: - encoding - mjml@4.15.3: + mjml@4.15.3(encoding@0.1.13): dependencies: '@babel/runtime': 7.25.0 - mjml-cli: 4.15.3 - mjml-core: 4.15.3 - mjml-migrate: 4.15.3 - mjml-preset-core: 4.15.3 + mjml-cli: 4.15.3(encoding@0.1.13) + mjml-core: 4.15.3(encoding@0.1.13) + mjml-migrate: 4.15.3(encoding@0.1.13) + mjml-preset-core: 4.15.3(encoding@0.1.13) mjml-validator: 4.15.3 transitivePeerDependencies: - encoding @@ -25813,12 +26184,14 @@ snapshots: '@types/whatwg-url': 11.0.5 whatwg-url: 13.0.0 - mongodb@6.8.0(@mongodb-js/zstd@1.2.0): + mongodb@6.8.0(@mongodb-js/zstd@1.2.0)(socks@2.8.3): dependencies: '@mongodb-js/saslprep': 1.1.8 - '@mongodb-js/zstd': 1.2.0 bson: 6.8.0 mongodb-connection-string-url: 3.0.1 + optionalDependencies: + '@mongodb-js/zstd': 1.2.0 + socks: 2.8.3 monorel@0.4.2: dependencies: @@ -25861,7 +26234,7 @@ snapshots: nan@2.20.0: optional: true - nano-css@5.6.2(react-dom@18.3.1)(react@18.3.1): + nano-css@5.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@jridgewell/sourcemap-codec': 1.5.0 css-tree: 1.1.3 @@ -25896,14 +26269,13 @@ snapshots: dependencies: '@segment/isodate': 1.0.3 - next-auth@4.24.7(next@14.2.5)(nodemailer@6.9.14)(react-dom@18.3.1)(react@18.3.1): + next-auth@4.24.7(next@14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nodemailer@6.9.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 '@panva/hkdf': 1.2.1 cookie: 0.5.0 jose: 4.15.9 - next: 14.2.5(@babel/core@7.25.2)(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1) - nodemailer: 6.9.14 + next: 14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) oauth: 0.9.15 openid-client: 5.6.5 preact: 10.23.1 @@ -25911,15 +26283,16 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) uuid: 8.3.2 + optionalDependencies: + nodemailer: 6.9.14 next-transpile-modules@10.0.1: dependencies: enhanced-resolve: 5.17.1 - next@14.2.3(@babel/core@7.24.5)(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1): + next@14.2.3(@babel/core@7.24.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.2.3 - '@playwright/test': 1.39.0 '@swc/helpers': 0.5.5 busboy: 1.6.0 caniuse-lite: 1.0.30001649 @@ -25938,14 +26311,15 @@ snapshots: '@next/swc-win32-arm64-msvc': 14.2.3 '@next/swc-win32-ia32-msvc': 14.2.3 '@next/swc-win32-x64-msvc': 14.2.3 + '@opentelemetry/api': 1.9.0 + '@playwright/test': 1.39.0 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - next@14.2.5(@babel/core@7.24.5)(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1): + next@14.2.5(@babel/core@7.24.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.2.5 - '@playwright/test': 1.39.0 '@swc/helpers': 0.5.5 busboy: 1.6.0 caniuse-lite: 1.0.30001645 @@ -25964,14 +26338,15 @@ snapshots: '@next/swc-win32-arm64-msvc': 14.2.5 '@next/swc-win32-ia32-msvc': 14.2.5 '@next/swc-win32-x64-msvc': 14.2.5 + '@opentelemetry/api': 1.9.0 + '@playwright/test': 1.39.0 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - next@14.2.5(@babel/core@7.25.2)(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1): + next@14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.2.5 - '@playwright/test': 1.39.0 '@swc/helpers': 0.5.5 busboy: 1.6.0 caniuse-lite: 1.0.30001645 @@ -25990,6 +26365,8 @@ snapshots: '@next/swc-win32-arm64-msvc': 14.2.5 '@next/swc-win32-ia32-msvc': 14.2.5 '@next/swc-win32-x64-msvc': 14.2.5 + '@opentelemetry/api': 1.9.0 + '@playwright/test': 1.39.0 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -26024,17 +26401,23 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 3.3.3 - node-fetch@2.6.7: + node-fetch@2.6.7(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 - node-fetch@2.6.9: + node-fetch@2.6.9(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 - node-fetch@2.7.0: + node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 node-fetch@3.3.2: dependencies: @@ -26081,10 +26464,10 @@ snapshots: node-int64@0.4.0: {} - node-loader@2.0.0(webpack@5.93.0): + node-loader@2.0.0(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))): dependencies: loader-utils: 2.0.4 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) node-postgres@0.6.2: {} @@ -26939,12 +27322,13 @@ snapshots: cosmiconfig: 5.2.1 import-cwd: 2.1.0 - postcss-load-config@4.0.2(postcss@8.4.40)(ts-node@10.9.2): + postcss-load-config@4.0.2(postcss@8.4.40)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): dependencies: lilconfig: 3.1.2 + yaml: 2.5.0 + optionalDependencies: postcss: 8.4.40 ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) - yaml: 2.5.0 postcss-loader@6.2.1(postcss@8.4.40)(webpack@5.93.0): dependencies: @@ -26952,7 +27336,7 @@ snapshots: klona: 2.0.6 postcss: 8.4.40 semver: 7.6.3 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 postcss-logical@5.0.4(postcss@8.4.40): dependencies: @@ -27676,356 +28060,359 @@ snapshots: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 - rc-align@4.0.15(react-dom@18.3.1)(react@18.3.1): + rc-align@4.0.15(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 dom-align: 1.12.4 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) resize-observer-polyfill: 1.5.1 - rc-cascader@3.27.0(react-dom@18.3.1)(react@18.3.1): + rc-cascader@3.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 array-tree-filter: 2.1.0 classnames: 2.5.1 - rc-select: 14.15.1(react-dom@18.3.1)(react@18.3.1) - rc-tree: 5.8.8(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-select: 14.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tree: 5.8.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-checkbox@3.3.0(react-dom@18.3.1)(react@18.3.1): + rc-checkbox@3.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-collapse@3.7.3(react-dom@18.3.1)(react@18.3.1): + rc-collapse@3.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-dialog@9.5.2(react-dom@18.3.1)(react@18.3.1): + rc-dialog@9.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) + '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-drawer@7.2.0(react-dom@18.3.1)(react@18.3.1): + rc-drawer@7.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) + '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-dropdown@4.2.0(react-dom@18.3.1)(react@18.3.1): + rc-dropdown@4.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) + '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-field-form@2.2.1(react-dom@18.3.1)(react@18.3.1): + rc-field-form@2.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 '@rc-component/async-validator': 5.0.4 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-image@7.9.0(react-dom@18.3.1)(react@18.3.1): + rc-image@7.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) + '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-dialog: 9.5.2(react-dom@18.3.1)(react@18.3.1) - rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-dialog: 9.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-input-number@9.1.0(react-dom@18.3.1)(react@18.3.1): + rc-input-number@9.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 '@rc-component/mini-decimal': 1.1.0 classnames: 2.5.1 - rc-input: 1.5.1(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-input: 1.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-input@1.5.1(react-dom@18.3.1)(react@18.3.1): + rc-input@1.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-mentions@2.14.0(react-dom@18.3.1)(react@18.3.1): + rc-mentions@2.14.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) + '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-input: 1.5.1(react-dom@18.3.1)(react@18.3.1) - rc-menu: 9.14.1(react-dom@18.3.1)(react@18.3.1) - rc-textarea: 1.7.0(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-input: 1.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-menu: 9.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-textarea: 1.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-menu@9.14.1(react-dom@18.3.1)(react@18.3.1): + rc-menu@9.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) + '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) - rc-overflow: 1.3.2(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-overflow: 1.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-motion@2.9.2(react-dom@18.3.1)(react@18.3.1): + rc-motion@2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-notification@5.6.0(react-dom@18.3.1)(react@18.3.1): + rc-notification@5.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-overflow@1.3.2(react-dom@18.3.1)(react@18.3.1): + rc-overflow@1.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-pagination@4.2.0(react-dom@18.3.1)(react@18.3.1): + rc-pagination@4.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-picker@2.7.6(react-dom@18.3.1)(react@18.3.1): + rc-picker@2.7.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 date-fns: 2.30.0 dayjs: 1.11.12 moment: 2.30.1 - rc-trigger: 5.3.4(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-trigger: 5.3.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) shallowequal: 1.1.0 - rc-picker@4.6.11(dayjs@1.11.12)(react-dom@18.3.1)(react@18.3.1): + rc-picker@4.6.11(date-fns@2.30.0)(dayjs@1.11.12)(moment@2.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) + '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - dayjs: 1.11.12 - rc-overflow: 1.3.2(react-dom@18.3.1)(react@18.3.1) - rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-overflow: 1.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + date-fns: 2.30.0 + dayjs: 1.11.12 + moment: 2.30.1 - rc-progress@4.0.0(react-dom@18.3.1)(react@18.3.1): + rc-progress@4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-rate@2.13.0(react-dom@18.3.1)(react@18.3.1): + rc-rate@2.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-resize-observer@1.4.0(react-dom@18.3.1)(react@18.3.1): + rc-resize-observer@1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) resize-observer-polyfill: 1.5.1 - rc-segmented@2.3.0(react-dom@18.3.1)(react@18.3.1): + rc-segmented@2.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-select@14.15.1(react-dom@18.3.1)(react@18.3.1): + rc-select@14.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) + '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) - rc-overflow: 1.3.2(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) - rc-virtual-list: 3.14.5(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-overflow: 1.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-virtual-list: 3.14.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-slider@10.6.2(react-dom@18.3.1)(react@18.3.1): + rc-slider@10.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-steps@6.0.1(react-dom@18.3.1)(react@18.3.1): + rc-steps@6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-switch@4.1.0(react-dom@18.3.1)(react@18.3.1): + rc-switch@4.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-table@7.45.7(react-dom@18.3.1)(react@18.3.1): + rc-table@7.45.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/context': 1.4.0(react-dom@18.3.1)(react@18.3.1) + '@rc-component/context': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) - rc-virtual-list: 3.14.5(react-dom@18.3.1)(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-virtual-list: 3.14.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-tabs@15.1.1(react-dom@18.3.1)(react@18.3.1): + rc-tabs@15.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-dropdown: 4.2.0(react-dom@18.3.1)(react@18.3.1) - rc-menu: 9.14.1(react-dom@18.3.1)(react@18.3.1) - rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) - rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-dropdown: 4.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-menu: 9.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-textarea@1.7.0(react-dom@18.3.1)(react@18.3.1): + rc-textarea@1.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-input: 1.5.1(react-dom@18.3.1)(react@18.3.1) - rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-input: 1.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-tooltip@6.2.0(react-dom@18.3.1)(react@18.3.1): + rc-tooltip@6.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 - '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) + '@rc-component/trigger': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-tree-select@5.22.1(react-dom@18.3.1)(react@18.3.1): + rc-tree-select@5.22.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-select: 14.15.1(react-dom@18.3.1)(react@18.3.1) - rc-tree: 5.8.8(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-select: 14.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tree: 5.8.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-tree@5.8.8(react-dom@18.3.1)(react@18.3.1): + rc-tree@5.8.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) - rc-virtual-list: 3.14.5(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-virtual-list: 3.14.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-trigger@5.3.4(react-dom@18.3.1)(react@18.3.1): + rc-trigger@5.3.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-align: 4.0.15(react-dom@18.3.1)(react@18.3.1) - rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-align: 4.0.15(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-upload@4.6.0(react-dom@18.3.1)(react@18.3.1): + rc-upload@4.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-util@5.43.0(react-dom@18.3.1)(react@18.3.1): + rc-util@5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-is: 18.3.1 - rc-virtual-list@3.14.5(react-dom@18.3.1)(react@18.3.1): + rc-virtual-list@3.14.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 classnames: 2.5.1 - rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -28078,8 +28465,9 @@ snapshots: shell-quote: 1.8.1 strip-ansi: 6.0.1 text-table: 0.2.0 + webpack: 5.93.0 + optionalDependencies: typescript: 5.5.4 - webpack: 5.93.0(webpack-cli@5.1.4) transitivePeerDependencies: - eslint - supports-color @@ -28091,7 +28479,7 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 - react-email@3.0.1(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1): + react-email@3.0.1(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/core': 7.24.5 '@babel/parser': 7.24.5 @@ -28103,7 +28491,7 @@ snapshots: glob: 10.3.4 log-symbols: 4.1.0 mime-types: 2.1.35 - next: 14.2.3(@babel/core@7.24.5)(@playwright/test@1.39.0)(react-dom@18.3.1)(react@18.3.1) + next: 14.2.3(@babel/core@7.24.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) normalize-path: 3.0.0 ora: 5.4.1 socket.io: 4.7.5 @@ -28130,9 +28518,9 @@ snapshots: react-is@18.3.1: {} - react-json-view@1.21.3(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + react-json-view@1.21.3(@types/react@18.3.3)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - flux: 4.0.4(react@18.3.1) + flux: 4.0.4(encoding@0.1.13)(react@18.3.1) react: 18.3.1 react-base16-styling: 0.6.0 react-dom: 18.3.1(react@18.3.1) @@ -28157,7 +28545,7 @@ snapshots: react-refresh@0.11.0: {} - react-router-dom@6.25.1(react-dom@18.3.1)(react@18.3.1): + react-router-dom@6.25.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@remix-run/router': 1.18.0 react: 18.3.1 @@ -28169,10 +28557,10 @@ snapshots: '@remix-run/router': 1.18.0 react: 18.3.1 - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0)(react@18.3.1)(ts-node@10.9.2)(typescript@5.5.4): + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(@types/babel__core@7.20.5)(@types/webpack@5.28.5)(eslint@8.57.0)(react@18.3.1)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))(type-fest@3.13.1)(typescript@5.5.4): dependencies: '@babel/core': 7.25.2 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.15(react-refresh@0.11.0)(webpack-dev-server@4.15.2)(webpack@5.93.0) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.15(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@3.13.1)(webpack-dev-server@4.15.2(webpack@5.93.0))(webpack@5.93.0) '@svgr/webpack': 5.5.0 babel-jest: 27.5.1(@babel/core@7.25.2) babel-loader: 8.3.0(@babel/core@7.25.2)(webpack@5.93.0) @@ -28187,15 +28575,15 @@ snapshots: dotenv: 10.0.0 dotenv-expand: 5.1.0 eslint: 8.57.0 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7)(@babel/plugin-transform-react-jsx@7.25.2)(eslint@8.57.0)(jest@27.5.1)(typescript@5.5.4) + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(eslint@8.57.0)(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4) eslint-webpack-plugin: 3.2.0(eslint@8.57.0)(webpack@5.93.0) file-loader: 6.2.0(webpack@5.93.0) fs-extra: 10.1.0 html-webpack-plugin: 5.6.0(webpack@5.93.0) identity-obj-proxy: 3.0.0 - jest: 27.5.1(ts-node@10.9.2) + jest: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) jest-resolve: 27.5.1 - jest-watch-typeahead: 1.1.0(jest@27.5.1) + jest-watch-typeahead: 1.1.0(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))) mini-css-extract-plugin: 2.9.0(webpack@5.93.0) postcss: 8.4.40 postcss-flexbugs-fixes: 5.0.2(postcss@8.4.40) @@ -28213,15 +28601,15 @@ snapshots: semver: 7.6.3 source-map-loader: 3.0.2(webpack@5.93.0) style-loader: 3.3.4(webpack@5.93.0) - tailwindcss: 3.4.7(ts-node@10.9.2) + tailwindcss: 3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) terser-webpack-plugin: 5.3.10(webpack@5.93.0) - typescript: 5.5.4 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 webpack-dev-server: 4.15.2(webpack@5.93.0) webpack-manifest-plugin: 4.1.1(webpack@5.93.0) - workbox-webpack-plugin: 6.6.0(webpack@5.93.0) + workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.93.0) optionalDependencies: fsevents: 2.3.3 + typescript: 5.5.4 transitivePeerDependencies: - '@babel/plugin-syntax-flow' - '@babel/plugin-transform-react-jsx' @@ -28256,13 +28644,13 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - react-smooth@4.0.1(react-dom@18.3.1)(react@18.3.1): + react-smooth@4.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: fast-equals: 5.0.1 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-transition-group: 4.4.5(react-dom@18.3.1)(react@18.3.1) + react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-textarea-autosize@8.5.3(@types/react@18.3.3)(react@18.3.1): dependencies: @@ -28273,7 +28661,7 @@ snapshots: transitivePeerDependencies: - '@types/react' - react-transition-group@4.4.5(react-dom@18.3.1)(react@18.3.1): + react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 dom-helpers: 5.2.1 @@ -28287,7 +28675,7 @@ snapshots: react: 18.3.1 tslib: 2.6.3 - react-use@17.5.1(react-dom@18.3.1)(react@18.3.1): + react-use@17.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@types/js-cookie': 2.2.7 '@xobotyi/scrollbar-width': 1.9.5 @@ -28295,7 +28683,7 @@ snapshots: fast-deep-equal: 3.1.3 fast-shallow-equal: 1.0.0 js-cookie: 2.2.1 - nano-css: 5.6.2(react-dom@18.3.1)(react@18.3.1) + nano-css: 5.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-universal-interface: 0.6.2(react@18.3.1)(tslib@2.6.3) @@ -28393,7 +28781,7 @@ snapshots: dependencies: decimal.js-light: 2.5.1 - recharts@2.12.7(react-dom@18.3.1)(react@18.3.1): + recharts@2.12.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: clsx: 2.1.1 eventemitter3: 4.0.7 @@ -28401,7 +28789,7 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-is: 16.13.1 - react-smooth: 4.0.1(react-dom@18.3.1)(react@18.3.1) + react-smooth: 4.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) recharts-scale: 0.4.5 tiny-invariant: 1.3.3 victory-vendor: 36.9.2 @@ -28497,9 +28885,9 @@ snapshots: requires-port@1.0.0: {} - resend@4.0.0(react-dom@18.3.1)(react@18.3.1): + resend@4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@react-email/render': 0.0.17(react-dom@18.3.1)(react@18.3.1) + '@react-email/render': 0.0.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - react - react-dom @@ -28551,11 +28939,11 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 - retry-request@7.0.2: + retry-request@7.0.2(encoding@0.1.13): dependencies: '@types/request': 2.48.12 extend: 3.0.2 - teeny-request: 9.0.0 + teeny-request: 9.0.0(encoding@0.1.13) transitivePeerDependencies: - encoding - supports-color @@ -28750,7 +29138,7 @@ snapshots: dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 sax@1.2.4: {} @@ -29058,7 +29446,7 @@ snapshots: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.2.0 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 source-map-support@0.5.13: dependencies: @@ -29383,19 +29771,21 @@ snapshots: style-loader@3.3.4(webpack@5.93.0): dependencies: - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 styled-jsx@5.1.1(@babel/core@7.24.5)(react@18.3.1): dependencies: - '@babel/core': 7.24.5 client-only: 0.0.1 react: 18.3.1 + optionalDependencies: + '@babel/core': 7.24.5 styled-jsx@5.1.1(@babel/core@7.25.2)(react@18.3.1): dependencies: - '@babel/core': 7.25.2 client-only: 0.0.1 react: 18.3.1 + optionalDependencies: + '@babel/core': 7.25.2 stylehacks@4.0.3: dependencies: @@ -29480,7 +29870,7 @@ snapshots: symbol-tree@3.2.4: {} - tailwindcss@3.4.7(ts-node@10.9.2): + tailwindcss@3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -29499,7 +29889,7 @@ snapshots: postcss: 8.4.40 postcss-import: 15.1.0(postcss@8.4.40) postcss-js: 4.0.1(postcss@8.4.40) - postcss-load-config: 4.0.2(postcss@8.4.40)(ts-node@10.9.2) + postcss-load-config: 4.0.2(postcss@8.4.40)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) postcss-nested: 6.2.0(postcss@8.4.40) postcss-selector-parser: 6.1.1 resolve: 1.22.8 @@ -29565,11 +29955,11 @@ snapshots: dependencies: bintrees: 1.0.2 - teeny-request@9.0.0: + teeny-request@9.0.0(encoding@0.1.13): dependencies: http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) stream-events: 1.0.5 uuid: 9.0.1 transitivePeerDependencies: @@ -29590,6 +29980,15 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 + terser-webpack-plugin@5.3.10(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.31.3 + webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) + terser-webpack-plugin@5.3.10(webpack@5.93.0): dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -29597,7 +29996,7 @@ snapshots: schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.31.3 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 terser@4.8.1: dependencies: @@ -29619,7 +30018,7 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 - testcontainers@9.12.0: + testcontainers@9.12.0(encoding@0.1.13): dependencies: '@balena/dockerignore': 1.0.2 '@types/archiver': 5.3.4 @@ -29631,7 +30030,7 @@ snapshots: docker-compose: 0.24.8 dockerode: 3.3.5 get-port: 5.1.1 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) proper-lockfile: 4.1.2 properties-reader: 2.3.0 ssh-remote-port-forward: 1.0.4 @@ -29737,12 +30136,28 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.0.5(@babel/core@7.25.2)(jest@29.7.0)(typescript@5.5.4): + ts-jest@29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)))(typescript@5.5.4): dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.3 + typescript: 5.5.4 + yargs-parser: 21.1.1 + optionalDependencies: '@babel/core': 7.25.2 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + + ts-jest@29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)))(typescript@5.5.4): + dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -29750,15 +30165,36 @@ snapshots: semver: 7.6.3 typescript: 5.5.4 yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.25.2 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) - ts-jest@29.2.3(@babel/core@7.25.2)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.5.4): + ts-jest@29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)))(typescript@5.5.4): dependencies: + bs-logger: 0.2.6 + ejs: 3.1.10 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.3 + typescript: 5.5.4 + yargs-parser: 21.1.1 + optionalDependencies: '@babel/core': 7.25.2 + '@jest/transform': 29.7.0 '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + + ts-jest@29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4): + dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2) + jest: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -29766,8 +30202,51 @@ snapshots: semver: 7.6.3 typescript: 5.5.4 yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.25.2 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + + ts-jest@29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)))(typescript@5.5.4): + dependencies: + bs-logger: 0.2.6 + ejs: 3.1.10 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.3 + typescript: 5.5.4 + yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.25.2 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + + ts-jest@29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4): + dependencies: + bs-logger: 0.2.6 + ejs: 3.1.10 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.3 + typescript: 5.5.4 + yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.25.2 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) - ts-loader@9.5.1(typescript@5.5.4)(webpack@5.93.0): + ts-loader@9.5.1(typescript@5.5.4)(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))): dependencies: chalk: 4.1.2 enhanced-resolve: 5.17.1 @@ -29775,7 +30254,7 @@ snapshots: semver: 7.6.3 source-map: 0.7.4 typescript: 5.5.4 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) ts-morph@12.0.0: dependencies: @@ -29823,6 +30302,24 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 16.18.11 + acorn: 8.12.1 + acorn-walk: 8.3.3 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.5.4 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -30131,14 +30628,16 @@ snapshots: use-isomorphic-layout-effect@1.1.2(@types/react@18.3.3)(react@18.3.1): dependencies: - '@types/react': 18.3.3 react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 use-latest@1.2.1(@types/react@18.3.3)(react@18.3.1): dependencies: - '@types/react': 18.3.3 react: 18.3.1 use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.3)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 use-sync-external-store@1.2.2(react@18.3.1): dependencies: @@ -30211,17 +30710,17 @@ snapshots: vendors@1.0.4: {} - vercel@35.2.3: + vercel@35.2.3(encoding@0.1.13): dependencies: '@vercel/build-utils': 8.3.6 - '@vercel/fun': 1.1.0 + '@vercel/fun': 1.1.0(encoding@0.1.13) '@vercel/go': 3.1.1 '@vercel/hydrogen': 1.0.4 - '@vercel/next': 4.3.6 - '@vercel/node': 3.2.8 + '@vercel/next': 4.3.6(encoding@0.1.13) + '@vercel/node': 3.2.8(encoding@0.1.13) '@vercel/python': 4.3.1 - '@vercel/redwood': 2.1.3 - '@vercel/remix-builder': 2.2.3 + '@vercel/redwood': 2.1.3(encoding@0.1.13) + '@vercel/remix-builder': 2.2.3(encoding@0.1.13) '@vercel/ruby': 2.1.0 '@vercel/static-build': 2.5.18 chokidar: 3.3.1 @@ -30300,13 +30799,13 @@ snapshots: dependencies: defaults: 1.0.4 - web-resource-inliner@6.0.1: + web-resource-inliner@6.0.1(encoding@0.1.13): dependencies: ansi-colors: 4.1.3 escape-goat: 3.0.0 htmlparser2: 5.0.1 mime: 2.6.0 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) valid-data-url: 3.0.1 transitivePeerDependencies: - encoding @@ -30330,10 +30829,9 @@ snapshots: webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.93.0) - '@webpack-cli/generators': 3.0.7(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.93.0) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.93.0) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.3 @@ -30342,8 +30840,10 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) webpack-merge: 5.10.0 + optionalDependencies: + '@webpack-cli/generators': 3.0.7(encoding@0.1.13)(mem-fs@2.3.0)(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0) webpack-dev-middleware@5.3.4(webpack@5.93.0): dependencies: @@ -30352,7 +30852,7 @@ snapshots: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.2.0 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 webpack-dev-server@4.15.2(webpack@5.93.0): dependencies: @@ -30384,9 +30884,10 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.93.0(webpack-cli@5.1.4) webpack-dev-middleware: 5.3.4(webpack@5.93.0) ws: 8.18.0 + optionalDependencies: + webpack: 5.93.0 transitivePeerDependencies: - bufferutil - debug @@ -30396,7 +30897,7 @@ snapshots: webpack-manifest-plugin@4.1.1(webpack@5.93.0): dependencies: tapable: 2.2.1 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 webpack-sources: 2.3.1 webpack-merge@5.10.0: @@ -30417,7 +30918,7 @@ snapshots: webpack-sources@3.2.3: {} - webpack@5.93.0(webpack-cli@5.1.4): + webpack@5.93.0: dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 @@ -30442,13 +30943,45 @@ snapshots: tapable: 2.2.1 terser-webpack-plugin: 5.3.10(webpack@5.93.0) watchpack: 2.4.1 - webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js + webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.12.1 + acorn-import-attributes: 1.9.5(acorn@8.12.1) + browserslist: 4.23.2 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.1 + es-module-lexer: 1.5.4 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) + watchpack: 2.4.1 + webpack-sources: 3.2.3 + optionalDependencies: + webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + websocket-driver@0.7.4: dependencies: http-parser-js: 0.5.8 @@ -30565,13 +31098,13 @@ snapshots: dependencies: workbox-core: 6.6.0 - workbox-build@6.6.0: + workbox-build@6.6.0(@types/babel__core@7.20.5): dependencies: '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0) '@babel/core': 7.25.2 '@babel/preset-env': 7.25.2(@babel/core@7.25.2) '@babel/runtime': 7.25.0 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.25.2)(rollup@2.79.1) + '@rollup/plugin-babel': 5.3.1(@babel/core@7.25.2)(@types/babel__core@7.20.5)(rollup@2.79.1) '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1) '@rollup/plugin-replace': 2.4.2(rollup@2.79.1) '@surma/rollup-plugin-off-main-thread': 2.2.3 @@ -30664,14 +31197,14 @@ snapshots: workbox-sw@6.6.0: {} - workbox-webpack-plugin@6.6.0(webpack@5.93.0): + workbox-webpack-plugin@6.6.0(@types/babel__core@7.20.5)(webpack@5.93.0): dependencies: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 - webpack: 5.93.0(webpack-cli@5.1.4) + webpack: 5.93.0 webpack-sources: 1.4.3 - workbox-build: 6.6.0 + workbox-build: 6.6.0(@types/babel__core@7.20.5) transitivePeerDependencies: - '@types/babel__core' - supports-color @@ -30826,13 +31359,13 @@ snapshots: - bluebird - supports-color - yeoman-generator@5.10.0(yeoman-environment@3.19.3): + yeoman-generator@5.10.0(encoding@0.1.13)(mem-fs@2.3.0)(yeoman-environment@3.19.3): dependencies: chalk: 4.1.2 dargs: 7.0.0 debug: 4.3.6(supports-color@5.5.0) execa: 5.1.1 - github-username: 6.0.0 + github-username: 6.0.0(encoding@0.1.13) lodash: 4.17.21 mem-fs-editor: 9.7.0(mem-fs@2.3.0) minimist: 1.2.8 @@ -30843,6 +31376,7 @@ snapshots: shelljs: 0.8.5 sort-keys: 4.2.0 text-table: 0.2.0 + optionalDependencies: yeoman-environment: 3.19.3 transitivePeerDependencies: - bluebird @@ -30864,13 +31398,15 @@ snapshots: compress-commons: 4.1.2 readable-stream: 3.6.2 - zod-prisma@0.5.4(prisma@5.17.0)(zod@3.23.8): + zod-prisma@0.5.4(decimal.js@10.4.3)(prisma@5.17.0)(zod@3.23.8): dependencies: '@prisma/generator-helper': 3.8.1 parenthesis: 3.1.8 prisma: 5.17.0 ts-morph: 13.0.3 zod: 3.23.8 + optionalDependencies: + decimal.js: 10.4.3 zod-to-json-schema@3.23.2(zod@3.23.8): dependencies: diff --git a/webapps/console/components/Billing/BillingManager.tsx b/webapps/console/components/Billing/BillingManager.tsx index 0d04cb52f..862f23a32 100644 --- a/webapps/console/components/Billing/BillingManager.tsx +++ b/webapps/console/components/Billing/BillingManager.tsx @@ -64,7 +64,7 @@ const UsageSection: React.FC<{}> = () => { assertTrue(billing.enabled); assertFalse(billing.loading, "Billing must be loaded before using UsageSection component"); - const { isLoading, error, usage } = useUsage(); + const { isLoading, error, usage, throttle } = useUsage(); if (isLoading) { return ; @@ -138,7 +138,23 @@ const UsageSection: React.FC<{}> = () => { />
    )} - {usageIsAboutToExceed && !usageExceeded && ( + {throttle && ( +
    + Overage fee warning} + description={ +
    + You have repeatedly exceeded your monthly events destination limit, so you're incoming events are + throttled at rate of {throttle}% events per second. It means that only {100 - throttle}%{" "} + of incoming events are processed. Please upgrade your plan to restore the full processing capacity. +
    + } + type="error" + showIcon + /> +
    + )} + {usageIsAboutToExceed && !usageExceeded && !throttle && (
    Account quota warning!} @@ -154,7 +170,7 @@ const UsageSection: React.FC<{}> = () => { />
    )} - {usage.usagePercentage > 1 && billing.settings.planId !== "free" && ( + {usage.usagePercentage > 1 && billing.settings.planId !== "free" && !throttle && (
    Overage fee warning} diff --git a/webapps/console/components/Billing/use-usage.ts b/webapps/console/components/Billing/use-usage.ts index e3f262b15..6fa1958ea 100644 --- a/webapps/console/components/Billing/use-usage.ts +++ b/webapps/console/components/Billing/use-usage.ts @@ -16,10 +16,17 @@ export type Usage = { periodEnd: Date; }; -export type UseUsageRes = { isLoading: boolean; error?: any; usage?: Usage }; +export type UseUsageRes = { isLoading: boolean; error?: any; throttle?: number; usage?: Usage }; export type DestinationReportDataRow = {}; +function parseThrottle(val: string): number | undefined { + const match = val.match(/throttle=?(\d+)/); + if (match) { + return parseFloat(match[1]); + } +} + /** * @param opts.skipSubscribed - if true, will return bogus data if workspace is subscribed to a paid * plan. In some cases, we don't really need usage for subscribed workspaces @@ -30,6 +37,10 @@ export function useUsage(opts?: { skipSubscribed?: boolean; cacheSeconds?: numbe assertTrue(billing.enabled, "Billing is not enabled"); assertFalse(billing.loading, "Billing must be loaded before using usage hook"); const cacheSeconds = opts?.cacheSeconds ?? 60 * 5; //5 minutes by default + const throttle = workspace.featuresEnabled + ?.filter(f => f.startsWith("throttle")) + ?.map(parseThrottle) + ?.find(t => t); let periodStart: Date; let periodEnd: Date; @@ -67,6 +78,7 @@ export function useUsage(opts?: { skipSubscribed?: boolean; cacheSeconds?: numbe return { isLoading, error, + throttle, usage: data ? { periodStart, diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index da585f0ad..d2c29db37 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -24,7 +24,9 @@ import { Hammer, HelpCircle, LayoutDashboard, + LineChart, Loader2, + PackageOpen, PlugZap, ScrollText, SearchCode, @@ -33,12 +35,10 @@ import { Settings, Share2, ShieldAlert, + Terminal, User, X, Zap, - PackageOpen, - LineChart, - Terminal, } from "lucide-react"; import { NextRouter, useRouter } from "next/router"; @@ -516,7 +516,20 @@ const FreePlanQuotaAlert: React.FC<{}> = () => { return <>; } - if (usageIsAboutToExceed(billing, usage)) { + if (usage.throttle) { + return ( + + Your workspace is throttled due to exceeding the free plan quota at rate of {usage.throttle}% + + Go to billing to see more details{" "} + + + + ); + } else if (usageIsAboutToExceed(billing, usage)) { return ( You are projected to exceed your monthly events. Please upgrade your plan to avoid service disruption.{" "} @@ -529,6 +542,7 @@ const FreePlanQuotaAlert: React.FC<{}> = () => { ); } + return <>; }; diff --git a/webapps/console/package.json b/webapps/console/package.json index 281a8ab00..427c1273a 100644 --- a/webapps/console/package.json +++ b/webapps/console/package.json @@ -70,7 +70,7 @@ "jsonwebtoken": "^9.0.2", "juava": "workspace:*", "lodash": "^4.17.21", - "lucide-react": "^0.263.1", + "lucide-react": "^0.447.0", "mjml": "^4.15.3", "mjml-react": "^2.0.8", "monaco-editor": "^0.50.0", diff --git a/webapps/console/pages/admin/workspaces.tsx b/webapps/console/pages/admin/workspaces.tsx index 39ac17fe2..8f62955b2 100644 --- a/webapps/console/pages/admin/workspaces.tsx +++ b/webapps/console/pages/admin/workspaces.tsx @@ -1,20 +1,26 @@ import { get } from "../../lib/useApi"; -import { useRouter } from "next/router"; -import { useQueryStringState } from "../../lib/useQueryStringState"; -import { CircleDollarSign, Loader2, UserCircle2 } from "lucide-react"; +import { CirclePercent, CircleDollarSign, Loader2, ShieldAlert, UserCircle2, XOctagon } from "lucide-react"; import { ErrorCard } from "../../components/GlobalError/GlobalError"; -import { Button, Switch } from "antd"; +import { Button, Switch, Tooltip } from "antd"; import omit from "lodash/omit"; import { useState } from "react"; import hash from "stable-hash"; import { JsonAsTable } from "../../components/JsonAsTable/JsonAsTable"; import { useQuery } from "@tanstack/react-query"; import Link from "next/link"; +import { WorkspaceDbModel } from "../../prisma/schema"; +import { z } from "zod"; +import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; + +dayjs.extend(utc); + +function getThrottleVal(throttle: string) { + return Number.parseInt(throttle.replaceAll("throttle", "").replace("=", "")); +} const View = ({ data }) => { const [rollup, setRollup] = useState(false); - const router = useRouter(); - const [loadingGoBack, setLoadingGoBack] = useState(false); return (
    @@ -62,6 +68,8 @@ const View = ({ data }) => { columnOptions={{ src: { omit: true }, workspaceId: { omit: true }, + usageAlerts: { omit: true }, + throttle: { omit: true }, users: { omit: true }, events: { type: "number" }, workspaceSlug: { omit: true }, @@ -83,7 +91,15 @@ const View = ({ data }) => { billing: { type: "custom", render: (val, row) => { - if (val?.planId === "enterprise") { + if (val?.planId === "billing-disabled") { + return ( + +
    + DISABLED +
    + + ); + } else if (val?.planId === "enterprise") { return (
    @@ -131,8 +147,30 @@ const View = ({ data }) => { FREE
    - - + {row.usageAlerts?.willExceed ? ( + + + + + + ) : row.usageAlerts?.exceeded ? ( + + + + + + ) : ( + + )} + {row.throttle ? ( + + + + + + ) : ( + + )}
    ); }, @@ -143,19 +181,81 @@ const View = ({ data }) => { ); }; +export type ReportRow = { + workspaceId: string; + period: string; + events: number; + workspaceName: string; + workspaceSlug: string; + [key: string]: any; +}; + +function getAlerts(data: ReportRow[], workspaceId: string) { + const monthStart = dayjs().utc().startOf("month"); + const totalEvents = data + .filter(r => r.workspaceId === workspaceId && !dayjs(r.period).isBefore(monthStart)) + .reduce((acc, r) => acc + r.events, 0); + const yesterday = dayjs().utc().add(-1, "day").startOf("day"); + const yesterdayEvents = data + .filter(r => r.workspaceId === workspaceId && dayjs(r.period).utc().startOf("day").isSame(yesterday)) + .reduce((acc, r) => acc + r.events, 0); + const daysLeft = dayjs().utc().daysInMonth() - dayjs().utc().date(); + const projectedEvents = totalEvents + yesterdayEvents * daysLeft; + if (totalEvents > 200000) { + return { exceeded: true }; + } else if (projectedEvents > 200000) { + return { willExceed: true }; //, projectedEvents, yesterdayEvents, totalEvents, daysLeft }; + } +} + export const WorkspacesAdminPage = () => { const { data, isLoading, error } = useQuery( ["workspaces-admin"], - async () => { - return await Promise.all([ - get("/api/$all/ee/report/workspace-stat?extended=true"), - get("/api/$all/ee/billing/workspaces"), + async ({ signal }) => { + console.log("Fetching workspaces admin data"); + const [report, billing, workspaceList] = await Promise.all([ + get("/api/$all/ee/report/workspace-stat?extended=true", { signal }) as Promise<{ data: ReportRow[] }>, + get("/api/$all/ee/billing/workspaces", { signal }) as Promise>, + get("/api/workspace", { signal }) as Promise[]>, ]); + const workspaceDict = workspaceList.reduce((acc, w) => { + acc[w.id] = w; + return acc; + }, {}); + const joinedData: Record = {}; + const days = [...new Set(report.data.map(w => w.period.split("T")[0]))].sort(); + const usageAlertsCache = {}; + console.log(`Populating usage from days ${days.length} days X ${Object.keys(billing).length} workspaces`); + for (const day of days) { + for (const [workspaceId, billingEntry] of Object.entries(billing)) { + const workspace = workspaceDict[workspaceId]; + joinedData[`${day.split("T")[0]}/${workspaceId}`] = { + period: day, + workspaceId: workspaceId, + workspaceName: workspace.name, + billing: billingEntry, + workspaceSlug: workspace.slug, + events: 0, + syncs: 0, + }; + } + } + console.log(`Populating usage from days ${report.data.length} rows`); + for (const row of report.data) { + const billingEntry = billing[row.workspaceId]; + joinedData[`${row.period.split("T")[0]}/${row.workspaceId}`] = { + ...row, + billing: billingEntry, + usageAlerts: billingEntry + ? undefined + : usageAlertsCache[row.workspaceId] || + (usageAlertsCache[row.workspaceId] = getAlerts(report.data, row.workspaceId)), + }; + } + return Object.values(joinedData); }, { retry: false, cacheTime: 0 } ); - const router = useRouter(); - const [filter, setFilter] = useQueryStringState("filter"); if (isLoading) { return (
    @@ -169,15 +269,7 @@ export const WorkspacesAdminPage = () => {
    ); } - const [workspacesList, billing] = data!; - const enrichedList = workspacesList.data.map(w => { - if (billing[w.workspaceId]) { - w.billing = billing[w.workspaceId]; - } - return w; - }); - console.log(enrichedList); - return ; + return ; }; export default WorkspacesAdminPage; diff --git a/webapps/ee-api/components/email-component.tsx b/webapps/ee-api/components/email-component.tsx index 15f5fa99e..82c903d1b 100644 --- a/webapps/ee-api/components/email-component.tsx +++ b/webapps/ee-api/components/email-component.tsx @@ -9,7 +9,8 @@ export type EmailComponent

    = React.FC

    & { bcc?: string; replyTo?: string; plaintext: (props: P) => string; - isTransactional?: boolean; + allowUnsubscribe?: boolean; + respectUnsubscribed?: boolean; scheduleAt?: (now: Date) => Date; }; diff --git a/webapps/ee-api/emails/churned.tsx b/webapps/ee-api/emails/churned.tsx index b166791d8..374ce15ab 100644 --- a/webapps/ee-api/emails/churned.tsx +++ b/webapps/ee-api/emails/churned.tsx @@ -54,7 +54,8 @@ ChurnedCustomerEmail.defaultValues = { ChurnedCustomerEmail.from = "Vladimir from Jitsu "; ChurnedCustomerEmail.replyTo = "Vladimir Klimontovich "; -ChurnedCustomerEmail.isTransactional = true; +ChurnedCustomerEmail.allowUnsubscribe = true; +ChurnedCustomerEmail.respectUnsubscribed = true; ChurnedCustomerEmail.subject = "Let’s Make Jitsu Better for You – We’d Love to Have You Back!"; diff --git a/webapps/ee-api/emails/quota-about-to-exceed.tsx b/webapps/ee-api/emails/quota-about-to-exceed.tsx new file mode 100644 index 000000000..6b1d3471b --- /dev/null +++ b/webapps/ee-api/emails/quota-about-to-exceed.tsx @@ -0,0 +1,127 @@ +import { EmailComponent, UnsubscribeLink, UnsubscribeLinkProps, withDefaults } from "../components/email-component"; +import { Body, Button, Container, Head, Heading, Html, Preview, Section, Text } from "@react-email/components"; +import React from "react"; +import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; +import Link from "next/link"; +import { main } from "./styles"; + +dayjs.extend(utc); + +export type QuotaAboutToExceedProps = { + name?: string; + workspaceName?: string; + workspaceSlug?: string; +} & UnsubscribeLinkProps; + +const QuotaAboutToExceed: EmailComponent = ({ + name, + workspaceName, + workspaceSlug, + unsubscribeLink, +}: QuotaAboutToExceedProps) => ( + + Action Required: Upgrade Now to Prevent Jitsu Service Interruption + + + 👋 Hi {name || "there"}! + + + We{"'"}re delighted to see your recent growth and increased volume of events sent to Jitsu in{" "} + + {workspaceName} + {" "} + workspace! However, at this pace, you{"'"}re projected to exceed the free tier limit of 200,000 events + per month. This means your data flow could be disrupted very soon. + + + + To avoid any disruption in your data flow, we highly recommend upgrading to the Paid Version as soon as + possible. If you remain on the free plan and exceed the quota, we may have to start dropping excess events. + + +

    + +
    + + + You can also check your detailed event usage on our{" "} + + Billing Details Page + + . + + + Thank you for choosing Jitsu, and we look forward to supporting your continued growth! + + + Best Regards, +
    + Jitsu Team +
    + + jitsu.com + +
    + + {unsubscribeLink && } + + + +); + +QuotaAboutToExceed.defaultValues = { + name: "John", + workspaceSlug: "workspace-slug", + workspaceName: "Workspace Name", + unsubscribeLink: "https://example.com/unsubscribe", +}; + +QuotaAboutToExceed.from = "Jitsu Support "; +QuotaAboutToExceed.replyTo = "Jitsu Support "; + +// This is a transactional email +QuotaAboutToExceed.allowUnsubscribe = false; +QuotaAboutToExceed.respectUnsubscribed = false; + +QuotaAboutToExceed.subject = "🚨[Action Required] Upgrade Now to Prevent Jitsu Service Interruption"; + +QuotaAboutToExceed.plaintext = ({ name, workspaceName, workspaceSlug, unsubscribeLink }: QuotaAboutToExceedProps) => { + return `👋 Hi ${name || "there"}! + +We're delighted to see your recent growth and increased volume of events sent to Jitsu! However, we noticed that +at this pace, you're projected to exceed the free tier limit of 200,000 events per month. + +To avoid any disruption in your data flow, we highly recommend upgrading to the Paid Version. If you remain on the free +plan and exceed the quota, we may have to start dropping excess events. + +⚠️ Don’t wait until it’s too late—upgrade today to keep your data flowing smoothly! + +You can update your billing here: https://use.jitsu.com/${workspaceSlug}/settings/billing. + +Thank you for choosing Jitsu, and we look forward to supporting your continued growth! + +Best regards, +Jitsu Team + +${unsubscribeLink ? `If you’d like to unsubscribe, click here: ${unsubscribeLink}` : ""} +`; +}; + +export default withDefaults(QuotaAboutToExceed); diff --git a/webapps/ee-api/emails/quota-exceeded.tsx b/webapps/ee-api/emails/quota-exceeded.tsx new file mode 100644 index 000000000..bdc49561b --- /dev/null +++ b/webapps/ee-api/emails/quota-exceeded.tsx @@ -0,0 +1,126 @@ +import { EmailComponent, UnsubscribeLink, UnsubscribeLinkProps, withDefaults } from "../components/email-component"; +import { Body, Button, Container, Section, Text, Html, Preview } from "@react-email/components"; +import React from "react"; +import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; +import { main } from "./styles"; + +dayjs.extend(utc); + +export type QuotaExceededProps = { + name?: string; + workspaceName?: string; + workspaceSlug?: string; +} & UnsubscribeLinkProps; + +const QuotaExceeded: EmailComponent = ({ + name, + workspaceName, + workspaceSlug, + unsubscribeLink, +}: QuotaExceededProps) => ( + + [Action Required] You{"'"}ve Reached Your Jitsu Event Quota + + +
    + + 🚨Action Required: You{"'"}ve Hit Your Event Quota + +
    + + 👋 Hi {name || "there"}! + + + You’ve been making the most out of Jitsu, and we’re thrilled to see your progress! We wanted to let you know + that you’ve{" "} + + reached 100% of your free event quota + {" "} + for this month in your Jitsu Workspace + + + + The free plan allows up to 200,000 events per month, and as of today, you{"'"}ve hit that limit. The + quota will reset on the 1st day of the upcoming month. We will start dropping incoming events in{" "} + 48 hours if no upgrade is made. + + +
    + + To keep the data flowing and avoid interruptions, consider upgrading to a paid plan. + +
    + +
    + +
    + + + Thank you for choosing Jitsu, and we’re here to support your continued success! + + + Best Regards, +
    + Jitsu Team +
    + + jitsu.com + +
    + {unsubscribeLink && } +
    + + +); + +QuotaExceeded.defaultValues = { + name: "John", + workspaceSlug: "workspace-slug", + workspaceName: "Workspace Name", + unsubscribeLink: "https://example.com/unsubscribe", +}; + +QuotaExceeded.from = "Jitsu Support "; +QuotaExceeded.replyTo = "Jitsu Support "; + +// This is a transactional email +QuotaExceeded.allowUnsubscribe = false; +QuotaExceeded.respectUnsubscribed = false; + +QuotaExceeded.subject = "[Action Required] You've Reached Your Jitsu Event Quota"; + +QuotaExceeded.plaintext = ({ name, workspaceName, workspaceSlug, unsubscribeLink }: QuotaExceededProps) => { + return `👋 Hi ${name || "there"}! + +You’ve reached 100% of your free event quota for this month in your ${workspaceName} Workspace. +We will start dropping incoming events in 48 hours unless you upgrade now. + +⚠️ Don’t wait until it’s too late—upgrade today to keep your data flowing smoothly! + +You can update your billing here: https://use.jitsu.com/${workspaceSlug}/settings/billing. + +Thanks, +Jitsu Team + +${unsubscribeLink ? `If you’d like to unsubscribe, click here: ${unsubscribeLink}` : ""} +`; +}; + +export default withDefaults(QuotaExceeded); diff --git a/webapps/ee-api/emails/throttling-reminder.tsx b/webapps/ee-api/emails/throttling-reminder.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/webapps/ee-api/emails/throttling-started.tsx b/webapps/ee-api/emails/throttling-started.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/webapps/ee-api/emails/welcome.tsx b/webapps/ee-api/emails/welcome.tsx index 384e39684..6ff722bfb 100644 --- a/webapps/ee-api/emails/welcome.tsx +++ b/webapps/ee-api/emails/welcome.tsx @@ -67,7 +67,9 @@ WelcomeEmail.defaultValues = { WelcomeEmail.from = "Vladimir from Jitsu "; WelcomeEmail.replyTo = "Vladimir Klimontovich "; -WelcomeEmail.isTransactional = true; +WelcomeEmail.allowUnsubscribe = true; +//User wouldn't be able to unsubscribe before getting this email +WelcomeEmail.respectUnsubscribed = false; WelcomeEmail.subject = "Need any help with Jitsu? Let us know!"; diff --git a/webapps/ee-api/lib/email.tsx b/webapps/ee-api/lib/email.tsx index 2dc868dd2..ba90873c5 100644 --- a/webapps/ee-api/lib/email.tsx +++ b/webapps/ee-api/lib/email.tsx @@ -8,6 +8,8 @@ import WelcomeEmail from "../emails/welcome"; import { requireDefined } from "juava"; import Churned from "../emails/churned"; import ChurnedCustomerEmail from "../emails/churned"; +import QuotaExceeded from "../emails/quota-exceeded"; +import QuotaAboutToExceed from "../emails/quota-about-to-exceed"; dayjs.extend(utc); export const UnsubscribeCodes = z.object({ @@ -88,6 +90,10 @@ export function getComponent(template: string): EmailComponent(...args: (T | undefined)[]): T { + return args.find(arg => arg !== undefined) as T; +} + export async function sendEmail(payload: Omit & { to: string }) { let workspace; if (payload.workspaceId) { @@ -149,20 +159,16 @@ export async function sendEmail(payload: Omit & { to: string }) { const resend = new Resend(env.EMAIL_RESEND_KEY); const Component: EmailComponent = getComponent(payload.template); const recepient = parseEmailAddress(payload.to).email.toLowerCase(); - const allowUnsubscribe = - payload.allowUnsubscribe !== undefined ? payload.allowUnsubscribe : !Component.isTransactional; - const respectUnsubscribe = - payload.allowUnsubscribe !== undefined ? payload.allowUnsubscribe : !Component.isTransactional; + const allowUnsubscribe = firstDefined(payload.allowUnsubscribe, Component.allowUnsubscribe, false); + const respectUnsubscribe = firstDefined(payload.respectUnsubscribe, Component.respectUnsubscribed, true); const from = - payload.from || - Component.from || - (!Component.isTransactional || allowUnsubscribe ? env.EMAIL_MARKETING_SENDER : env.EMAIL_TRANSACTIONAL_SENDER); + payload.from || Component.from || (allowUnsubscribe ? env.EMAIL_MARKETING_SENDER : env.EMAIL_TRANSACTIONAL_SENDER); const replyTo = payload.replyTo || Component.replyTo || - (!Component.isTransactional || allowUnsubscribe ? env.EMAIL_MARKETING_SENDER : env.EMAIL_TRANSACTIONAL_SENDER); + (allowUnsubscribe ? env.EMAIL_MARKETING_SENDER : env.EMAIL_TRANSACTIONAL_SENDER); - if (!Component.isTransactional && respectUnsubscribe && (await isUnsubscribed(recepient))) { + if (respectUnsubscribe && (await isUnsubscribed(recepient))) { console.log(`Not sending email to unsubscribed recipient: ${recepient}`); return { unsubscribed: true, recipient: recepient, message: "Recipient is unsubscribed" }; } @@ -172,7 +178,7 @@ export async function sendEmail(payload: Omit & { to: string }) { name: parseEmailAddress(payload.to).name?.split(" ")[0], ...(payload.variables || {}), ...(workspace || {}), - unsubscribeLink: `https://${domain}/api/unsubscribe?email=${encodeURIComponent(recepient)}&code=${unsubscribeCode}`, + unsubscribeLink: allowUnsubscribe ? `https://${domain}/api/unsubscribe?email=${encodeURIComponent(recepient)}&code=${unsubscribeCode}` : undefined, }; const scheduledAt = Component.scheduleAt ? Component.scheduleAt(new Date()).toISOString() : undefined; let subject = typeof Component.subject === "string" ? Component.subject : Component.subject(props); diff --git a/webapps/ee-api/lib/sql/workspace-info.sql b/webapps/ee-api/lib/sql/workspace-info.sql index cf417b152..06bb774ab 100644 --- a/webapps/ee-api/lib/sql/workspace-info.sql +++ b/webapps/ee-api/lib/sql/workspace-info.sql @@ -23,7 +23,8 @@ select ws.name as "workspaceName", ws.slug as "workspaceSlug", ws."id" as "workspaceId", dm.domains as domains, - u.users + u.users, + (SELECT elem FROM unnest(ws."featuresEnabled") AS elem WHERE elem ILIKE 'throttle%' LIMIT 1) as throttle from newjitsu."Workspace" ws left join workspace_domains dm on dm.workspaceId = ws.id left join workspace_admins u on u.workspaceId = ws.id diff --git a/webapps/ee-api/pages/api/billing/workspaces.ts b/webapps/ee-api/pages/api/billing/workspaces.ts index 7827928a9..865dbd063 100644 --- a/webapps/ee-api/pages/api/billing/workspaces.ts +++ b/webapps/ee-api/pages/api/billing/workspaces.ts @@ -66,6 +66,15 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse pastDue: false, }, ]; + } else if (w.obj.noRestrictions) { + return [ + w.id, + { + planId: "billing-disabled", + planName: "Billing Disabled", + pastDue: false, + }, + ]; } const customerSubscriptions = subscriptions[w.obj.stripeCustomerId]; diff --git a/webapps/ee-api/pages/api/report/workspace-stat.ts b/webapps/ee-api/pages/api/report/workspace-stat.ts index 3642a915e..136c3e4ef 100644 --- a/webapps/ee-api/pages/api/report/workspace-stat.ts +++ b/webapps/ee-api/pages/api/report/workspace-stat.ts @@ -279,8 +279,6 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse } const workspacePlans: Record = {}; - console.log(`All workspaces`, allWorkspaces); - for (const { id: workspaceId, obj } of allWorkspaces) { const { stripeCustomerId, customBilling } = obj; if (customBilling) { @@ -304,8 +302,8 @@ const handler = async function handler(req: NextApiRequest, res: NextApiResponse } else { workspacePlans[workspaceId] = "free"; } + records = records.map(r => ({ ...r, billingStatus: workspacePlans[r.workspaceId] || "free" })); } - records = records.map(r => ({ ...r, billingStatus: workspacePlans[r.workspaceId] || "free" })); } } res.send(req.query.format === "array" ? records : { data: records }); diff --git a/webapps/ee-api/pages/dashboard/index.ts b/webapps/ee-api/pages/dashboard/index.ts new file mode 100644 index 000000000..e69de29bb From 3089667cf45e0422a1c705a08b7f2b4564fca426 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Mon, 7 Oct 2024 11:06:38 -0400 Subject: [PATCH 0905/1353] trivial: prettier --- webapps/ee-api/lib/email.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/webapps/ee-api/lib/email.tsx b/webapps/ee-api/lib/email.tsx index ba90873c5..27aace820 100644 --- a/webapps/ee-api/lib/email.tsx +++ b/webapps/ee-api/lib/email.tsx @@ -178,7 +178,9 @@ export async function sendEmail(payload: Omit & { to: string }) { name: parseEmailAddress(payload.to).name?.split(" ")[0], ...(payload.variables || {}), ...(workspace || {}), - unsubscribeLink: allowUnsubscribe ? `https://${domain}/api/unsubscribe?email=${encodeURIComponent(recepient)}&code=${unsubscribeCode}` : undefined, + unsubscribeLink: allowUnsubscribe + ? `https://${domain}/api/unsubscribe?email=${encodeURIComponent(recepient)}&code=${unsubscribeCode}` + : undefined, }; const scheduledAt = Component.scheduleAt ? Component.scheduleAt(new Date()).toISOString() : undefined; let subject = typeof Component.subject === "string" ? Component.subject : Component.subject(props); From e43c622e3ff3ecf24e500d9a48a8d4e37619b96b Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Mon, 7 Oct 2024 11:25:29 -0400 Subject: [PATCH 0906/1353] trivial: removed bogus file --- webapps/ee-api/pages/dashboard/index.ts | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 webapps/ee-api/pages/dashboard/index.ts diff --git a/webapps/ee-api/pages/dashboard/index.ts b/webapps/ee-api/pages/dashboard/index.ts deleted file mode 100644 index e69de29bb..000000000 From 03b37a921b20258d6a12ba806869b1cf75bdb85f Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Mon, 7 Oct 2024 14:53:01 -0400 Subject: [PATCH 0907/1353] feat (ee): throttling reminder template added --- .../components/Billing/BillingManager.tsx | 2 +- webapps/ee-api/emails/throttling-reminder.tsx | 132 ++++++++++++++++++ webapps/ee-api/lib/email.tsx | 5 +- 3 files changed, 137 insertions(+), 2 deletions(-) diff --git a/webapps/console/components/Billing/BillingManager.tsx b/webapps/console/components/Billing/BillingManager.tsx index 862f23a32..69fccc24c 100644 --- a/webapps/console/components/Billing/BillingManager.tsx +++ b/webapps/console/components/Billing/BillingManager.tsx @@ -141,7 +141,7 @@ const UsageSection: React.FC<{}> = () => { {throttle && (
    Overage fee warning} + message={

    Throttling warning

    } description={
    You have repeatedly exceeded your monthly events destination limit, so you're incoming events are diff --git a/webapps/ee-api/emails/throttling-reminder.tsx b/webapps/ee-api/emails/throttling-reminder.tsx index e69de29bb..05242e4d4 100644 --- a/webapps/ee-api/emails/throttling-reminder.tsx +++ b/webapps/ee-api/emails/throttling-reminder.tsx @@ -0,0 +1,132 @@ +import { EmailComponent, UnsubscribeLink, UnsubscribeLinkProps, withDefaults } from "../components/email-component"; +import { Body, Button, Container, Html, Preview, Section, Text } from "@react-email/components"; +import React from "react"; +import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; +import { main } from "./styles"; + +dayjs.extend(utc); + +export type ThrottledReminderEmailProps = { + name?: string; + workspaceName?: string; + workspaceSlug?: string; + throttled?: number; +} & UnsubscribeLinkProps; + +const ThrottledReminderEmail: EmailComponent = ({ + name, + workspaceName, + workspaceSlug, + throttled, + unsubscribeLink, +}: ThrottledReminderEmailProps) => ( + + [Action Required] Your Jitsu Events are Being Throttled + + +
    + + 🚨 Your Jitsu Events are Being Throttled to {throttled}%! + +
    + + 👋 Hi {name || "there"}! + + + We wanted to remind you that due to excessive event usage in the past, your event throughput in the{" "} + + Jitsu Workspace + {" "} + is currently being throttled to {throttled}%. This means that {throttled}% of incoming events + are currently being dropped. + + + + If you{"'"}d like to restore full event flow and prevent data loss, we highly recommend upgrading your plan. + + +
    + + Upgrade now to restore your full event flow and ensure uninterrupted service. + +
    + +
    + +
    + + + Thank you for your continued use of Jitsu! We{"'"}re here to help you manage your data effectively. + + + Best Regards, +
    + Jitsu Team +
    + + jitsu.com + +
    + {unsubscribeLink && } +
    + + +); + +ThrottledReminderEmail.defaultValues = { + name: "John", + workspaceSlug: "workspace-slug", + workspaceName: "Workspace Name", + throttled: 50, + unsubscribeLink: "https://example.com/unsubscribe", +}; + +ThrottledReminderEmail.from = "Jitsu Support "; +ThrottledReminderEmail.replyTo = "Jitsu Support "; + +// This is a transactional email +ThrottledReminderEmail.allowUnsubscribe = false; +ThrottledReminderEmail.respectUnsubscribed = false; + +ThrottledReminderEmail.subject = ({ throttled }) => + `🚨[Action Required] Your Jitsu Events are Being Throttled to ${throttled}%`; + +ThrottledReminderEmail.plaintext = ({ + name, + workspaceName, + workspaceSlug, + throttled, + unsubscribeLink, +}: ThrottledReminderEmailProps) => { + return `👋 Hi ${name || "there"}! + +Due to excessive usage in the past, your event throughput in the ${workspaceName} Workspace is currently throttled to ${throttled}%. This means ${ + 100 - (throttled || 0) + }% of events are being dropped. + +To restore full event flow, please consider upgrading your plan. + +You can update your billing here: https://use.jitsu.com/${workspaceSlug}/settings/billing. + +Thanks, +Jitsu Team + +${unsubscribeLink ? `If you’d like to unsubscribe, click here: ${unsubscribeLink}` : ""} +`; +}; + +export default withDefaults(ThrottledReminderEmail); diff --git a/webapps/ee-api/lib/email.tsx b/webapps/ee-api/lib/email.tsx index 27aace820..3fe4fc77a 100644 --- a/webapps/ee-api/lib/email.tsx +++ b/webapps/ee-api/lib/email.tsx @@ -10,6 +10,7 @@ import Churned from "../emails/churned"; import ChurnedCustomerEmail from "../emails/churned"; import QuotaExceeded from "../emails/quota-exceeded"; import QuotaAboutToExceed from "../emails/quota-about-to-exceed"; +import ThrottledReminderEmail from "../emails/throttling-reminder"; dayjs.extend(utc); export const UnsubscribeCodes = z.object({ @@ -75,7 +76,7 @@ export const SendEmailRequest = z.object({ to: z.string().optional(), workspaceId: z.string().optional(), bcc: z.string().optional(), - variables: z.record(z.string()).optional(), + variables: z.record(z.any()).optional(), //Two flags below, of not set, will be inferred from the EmailTemplale.isTransactional property allowUnsubscribe: z.boolean().optional(), respectUnsubscribe: z.boolean().optional(), @@ -94,6 +95,8 @@ export function getComponent(template: string): EmailComponent Date: Mon, 7 Oct 2024 17:44:17 -0400 Subject: [PATCH 0908/1353] feat: display connector usage for paid accounts --- .../Billing/BillingBlockingDialog.tsx | 4 +- .../components/Billing/BillingManager.tsx | 86 +++++++++++++++++-- .../{use-usage.ts => use-events-usage.ts} | 2 +- .../PageLayout/WorkspacePageLayout.tsx | 4 +- webapps/console/lib/schema/index.ts | 2 +- .../api/[workspaceId]/reports/sync-stat.ts | 42 +++++++++ 6 files changed, 128 insertions(+), 12 deletions(-) rename webapps/console/components/Billing/{use-usage.ts => use-events-usage.ts} (96%) create mode 100644 webapps/console/pages/api/[workspaceId]/reports/sync-stat.ts diff --git a/webapps/console/components/Billing/BillingBlockingDialog.tsx b/webapps/console/components/Billing/BillingBlockingDialog.tsx index db0f72c20..4df7c851a 100644 --- a/webapps/console/components/Billing/BillingBlockingDialog.tsx +++ b/webapps/console/components/Billing/BillingBlockingDialog.tsx @@ -1,6 +1,6 @@ import { useBilling, UseBillingResult } from "./BillingProvider"; import { assertDefined, assertFalse, assertTrue, getLog } from "juava"; -import { useUsage } from "./use-usage"; +import { useEventsUsage } from "./use-events-usage"; import { Modal } from "antd"; import { upgradeRequired } from "./copy"; import { AlertTriangle, ArrowRight } from "lucide-react"; @@ -18,7 +18,7 @@ function LoadAndBlockIfNeed() { assertTrue(billing.enabled); assertFalse(billing.loading); - const { isLoading, error, usage } = useUsage({ skipSubscribed: true }); + const { isLoading, error, usage } = useEventsUsage({ skipSubscribed: true }); if (!billing.settings?.pastDue && billing.settings?.planId !== "free") { //paid project with no past due subscriptions, we never block those return <>; diff --git a/webapps/console/components/Billing/BillingManager.tsx b/webapps/console/components/Billing/BillingManager.tsx index 69fccc24c..d10ffa50b 100644 --- a/webapps/console/components/Billing/BillingManager.tsx +++ b/webapps/console/components/Billing/BillingManager.tsx @@ -10,7 +10,7 @@ import { Check, ChevronRight, Edit2, ExternalLink, Info, XCircle } from "lucide- import styles from "./BillingManager.module.css"; import { useQuery } from "@tanstack/react-query"; import { ErrorCard } from "../GlobalError/GlobalError"; -import { useUsage } from "./use-usage"; +import { useEventsUsage } from "./use-events-usage"; import { upgradeRequired } from "./copy"; import { JitsuButton } from "../JitsuButton/JitsuButton"; import dayjs from "dayjs"; @@ -58,13 +58,13 @@ const ComparisonSection: React.FC<{ ); }; -const UsageSection: React.FC<{}> = () => { +const EventsUsageSection: React.FC<{}> = () => { const billing = useBilling(); const workspace = useWorkspace(); assertTrue(billing.enabled); assertFalse(billing.loading, "Billing must be loaded before using UsageSection component"); - const { isLoading, error, usage, throttle } = useUsage(); + const { isLoading, error, usage, throttle } = useEventsUsage(); if (isLoading) { return ; @@ -103,6 +103,7 @@ const UsageSection: React.FC<{}> = () => {
    + {billing.settings?.pastDue && (
    = () => { />
    )} - {usageIsAboutToExceed && !usageExceeded && !throttle && ( + {usageIsAboutToExceed && !usageExceeded && !throttle ? (
    Account quota warning!} @@ -169,7 +170,7 @@ const UsageSection: React.FC<{}> = () => { } />
    - )} + ) : undefined} {usage.usagePercentage > 1 && billing.settings.planId !== "free" && !throttle && (
    = () => { ); }; +const ConnectorUsageSection: React.FC<{}> = () => { + const billing = useBilling(); + assertTrue(billing.enabled, "Billing is not enabled"); + assertFalse(billing.loading, "Billing must be loaded before using CurrentSubscription component"); + const workspace = useWorkspace(); + const user = useUser(); + let periodStart: Date; + let periodEnd: Date; + if (billing.settings.expiresAt) { + periodEnd = dayjs(billing.settings.expiresAt).utc().startOf("day").add(-1, "millisecond").toDate(); + periodStart = dayjs(billing.settings.expiresAt).utc().add(-1, "month").startOf("day").toDate(); + } else { + periodStart = dayjs().utc().startOf("month").toDate(); + periodEnd = dayjs().utc().endOf("month").add(-1, "millisecond").toDate(); + } + const { isLoading, error, data } = useQuery( + ["connector usage", workspace.id], + async () => { + const report = await rpc( + `/api/${workspace.id}/reports/sync-stat?start=${periodStart.toISOString()}&end=${dayjs(periodEnd) + .subtract(1, "millisecond") + .toISOString()}` + ); + return report; + }, + { retry: false, cacheTime: 0, staleTime: 0 } + ); + + if (isLoading) { + return ; + } else if (error) { + return ; + } + + const activeSyncs = data.activeSyncs; + const maxActiveSyncs = billing.settings.dailyActiveSyncs || 1; + const percentage = activeSyncs / maxActiveSyncs; + + return ( +
    + 1 ? "exception" : undefined} /> +
    +
    + {activeSyncs} / {maxActiveSyncs} monthly active syncs from{" "} + {dayjs(periodStart).utc().format("MMM DD, YYYY")} to{" "} + {dayjs(periodEnd).utc().format("MMM DD, YYYY")}. The quota will be reset on{" "} + {dayjs(periodEnd).add(1, "day").utc().format("MMM DD")}. +
    +
    + {percentage > 1 && ( +
    + Overage fee warning} + description={ + <> + Overage fee of at least $ + {(billing.settings.dailyActiveSyncsOverage || 0) * (activeSyncs - maxActiveSyncs)} per sync will + be added to your next invoice. + + } + /> +
    + )} +
    + ); +}; + const CurrentSubscription: React.FC<{}> = () => { const billing = useBilling(); assertTrue(billing.enabled, "Billing is not enabled"); @@ -262,7 +330,13 @@ const CurrentSubscription: React.FC<{}> = () => {

    Events Usage

    - + + {billing.settings?.planId !== "free" && ( + <> +

    Connectors Usage

    + + + )}
    ); }; diff --git a/webapps/console/components/Billing/use-usage.ts b/webapps/console/components/Billing/use-events-usage.ts similarity index 96% rename from webapps/console/components/Billing/use-usage.ts rename to webapps/console/components/Billing/use-events-usage.ts index 6fa1958ea..cab96efca 100644 --- a/webapps/console/components/Billing/use-usage.ts +++ b/webapps/console/components/Billing/use-events-usage.ts @@ -31,7 +31,7 @@ function parseThrottle(val: string): number | undefined { * @param opts.skipSubscribed - if true, will return bogus data if workspace is subscribed to a paid * plan. In some cases, we don't really need usage for subscribed workspaces */ -export function useUsage(opts?: { skipSubscribed?: boolean; cacheSeconds?: number }): UseUsageRes { +export function useEventsUsage(opts?: { skipSubscribed?: boolean; cacheSeconds?: number }): UseUsageRes { const workspace = useWorkspace(); const billing = useBilling(); assertTrue(billing.enabled, "Billing is not enabled"); diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index d2c29db37..6c9074b15 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -60,7 +60,7 @@ import { useJitsu } from "@jitsu/jitsu-react"; import { useSearchParams } from "next/navigation"; import omit from "lodash/omit"; import { useBilling, UseBillingResult } from "../Billing/BillingProvider"; -import { useUsage, UseUsageRes } from "../Billing/use-usage"; +import { useEventsUsage, UseUsageRes } from "../Billing/use-events-usage"; import { MenuItemType } from "antd/lib/menu/interface"; export type PageLayoutProps = { @@ -505,7 +505,7 @@ function usageIsAboutToExceed(billing: UseBillingResult, usage: UseUsageRes) { const FreePlanQuotaAlert: React.FC<{}> = () => { const workspace = useWorkspace(); - const usage = useUsage({ skipSubscribed: true }); + const usage = useEventsUsage({ skipSubscribed: true }); const billing = useBilling(); const router = useRouter(); assertTrue(billing.enabled, "Billing should be enabled and loaded"); diff --git a/webapps/console/lib/schema/index.ts b/webapps/console/lib/schema/index.ts index 0755ddbb0..acc182679 100644 --- a/webapps/console/lib/schema/index.ts +++ b/webapps/console/lib/schema/index.ts @@ -27,7 +27,7 @@ export const BillingSettings = z.object({ customBilling: z.boolean().default(false).optional(), pastDue: z.boolean().default(false).optional(), dailyActiveSyncs: z.number().default(1).optional(), - dailyActiveSyncsOverage: z.number().default(10).optional(), + dailyActiveSyncsOverage: z.number().default(20).optional(), maximumSyncFrequency: z.number().optional(), //minutes planName: z.string().optional(), //if not set - will be taken from planId overagePricePer100k: z.number().optional(), diff --git a/webapps/console/pages/api/[workspaceId]/reports/sync-stat.ts b/webapps/console/pages/api/[workspaceId]/reports/sync-stat.ts new file mode 100644 index 000000000..e39281ff8 --- /dev/null +++ b/webapps/console/pages/api/[workspaceId]/reports/sync-stat.ts @@ -0,0 +1,42 @@ +import { createRoute, getWorkspace, verifyAccess } from "../../../../lib/api"; +import { z } from "zod"; +import dayjs from "dayjs"; +import { db } from "../../../../lib/server/db"; + +export default createRoute() + .GET({ + auth: true, + query: z.object({ + workspaceId: z.string(), + start: z.coerce.date().optional(), + end: z.coerce.date().optional(), + granularity: z.enum(["day", "hour"]).optional().default("day"), + }), + result: z.any(), + }) + .handler(async ({ user, query }) => { + const { workspaceId } = query; + const workspace = await getWorkspace(workspaceId); + await verifyAccess(user, workspace.id); + const end = query.end ? query.end.toISOString() : new Date().toISOString(); + const start = query.start ? query.start.toISOString() : dayjs(end).subtract(1, "month").toDate().toISOString(); + + const res = await db.pgPool().query( + `select + count(distinct sync."fromId" || sync."toId") as "activeSyncs" + from newjitsu.source_task task + join newjitsu."ConfigurationObjectLink" sync on task.sync_id = sync."id" + where (task.status = 'SUCCESS' OR task.status = 'PARTIAL') + and "workspaceId" = $1 + and started_at >= $2 and started_at < $3 + and deleted = false`, + [workspaceId, start, end] + ); + + return { + activeSyncs: res.rows[0].activeSyncs, + start, + end, + }; + }) + .toNextApiHandler(); From 77655aaf143a3e131687b26b80f322089aa454a9 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 8 Oct 2024 12:35:09 +0400 Subject: [PATCH 0909/1353] rotor: idToSnakeCaseFast: replace spaces with underscore --- libs/core-functions/__tests__/strings.test.ts | 21 +++++++++++++ .../src/functions/lib/strings.ts | 31 ++++++++++--------- 2 files changed, 38 insertions(+), 14 deletions(-) diff --git a/libs/core-functions/__tests__/strings.test.ts b/libs/core-functions/__tests__/strings.test.ts index 1c5e843a1..2b6c7f075 100644 --- a/libs/core-functions/__tests__/strings.test.ts +++ b/libs/core-functions/__tests__/strings.test.ts @@ -36,6 +36,20 @@ const data: Record = { __camelCase: "__camel_case", }; +const dataWithSpaces: Record = { + " CamelCase": "_camel_case", + " CamelCase": "__camel_case", + "Camel Case": "camel_case", + "Camel case": "camel_case", + "Camel Case": "camel__case", + "Camel Case ": "camel_case_", + "Camel Case ": "camel_case__", + "Camel _ Case": "camel___case", + "Camel_ _Case": "camel___case", + "_ CamelCase _": "__camel_case__", + " _CamelCase_ ": "__camel_case__", +}; + test("test idToSnakeCaseFast", async () => { for (const [value, expected] of Object.entries(data)) { const res = idToSnakeCaseFast(value); @@ -43,6 +57,13 @@ test("test idToSnakeCaseFast", async () => { } }); +test("test idToSnakeCaseFast with spaces", async () => { + for (const [value, expected] of Object.entries(dataWithSpaces)) { + const res = idToSnakeCaseFast(value); + expect(res).toEqual(expected); + } +}); + test("test idToSnakeCaseRegex", async () => { for (const [value, expected] of Object.entries(data)) { const res = idToSnakeCaseRegex(value); diff --git a/libs/core-functions/src/functions/lib/strings.ts b/libs/core-functions/src/functions/lib/strings.ts index e82947010..6ed170ba3 100644 --- a/libs/core-functions/src/functions/lib/strings.ts +++ b/libs/core-functions/src/functions/lib/strings.ts @@ -2,28 +2,31 @@ export function idToSnakeCaseRegex(id: string) { return id.replace(/((?<=[a-zA-Z0-9])[A-Z])/g, "_$1").toLowerCase(); } -const aCode = "A".charCodeAt(0); -const zCode = "Z".charCodeAt(0); +const ACode = "A".charCodeAt(0); +const ZCode = "Z".charCodeAt(0); const _Code = "_".charCodeAt(0); +const spaceCode = " ".charCodeAt(0); export function idToSnakeCaseFast(id: string) { - let res = id[0].toLowerCase(); - let upperIndex = 0; - let i = 1; - const firstChar = id.charCodeAt(0); - let needUnderscore = firstChar != _Code; + let res = ""; + let concatIndex = 0; + let i = 0; + let needUnderscore = false; for (; i < id.length; i++) { const c = id.charCodeAt(i); - if (c >= aCode && c <= zCode) { - res += id.substring(upperIndex + 1, i) + (needUnderscore ? "_" : "") + id.charAt(i).toLowerCase(); - upperIndex = i; + if (c >= ACode && c <= ZCode) { + res += id.substring(concatIndex, i) + (needUnderscore ? "_" : "") + id.charAt(i).toLowerCase(); + concatIndex = i + 1; + } else if (c == spaceCode) { + res += id.substring(concatIndex, i) + "_"; + concatIndex = i + 1; } - needUnderscore = c != _Code; + needUnderscore = c != _Code && c != spaceCode; } - if (upperIndex == 0 && !(firstChar >= aCode && firstChar <= zCode)) { + if (concatIndex == 0) { return id; - } else if (upperIndex < i) { - res += id.substring(upperIndex + 1, id.length); + } else if (concatIndex < i) { + res += id.substring(concatIndex, i); } return res; } From d4fc31213d9b596f903f99f4c18e249cb11dfd8a Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 8 Oct 2024 15:06:25 +0400 Subject: [PATCH 0910/1353] rotor: idToSnakeCaseFast: more general approach --- libs/core-functions/__tests__/strings.test.ts | 12 ++++++++++-- libs/core-functions/src/functions/lib/strings.ts | 7 +++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/libs/core-functions/__tests__/strings.test.ts b/libs/core-functions/__tests__/strings.test.ts index 2b6c7f075..1929c0b5d 100644 --- a/libs/core-functions/__tests__/strings.test.ts +++ b/libs/core-functions/__tests__/strings.test.ts @@ -36,7 +36,7 @@ const data: Record = { __camelCase: "__camel_case", }; -const dataWithSpaces: Record = { +const dataExtra: Record = { " CamelCase": "_camel_case", " CamelCase": "__camel_case", "Camel Case": "camel_case", @@ -48,6 +48,14 @@ const dataWithSpaces: Record = { "Camel_ _Case": "camel___case", "_ CamelCase _": "__camel_case__", " _CamelCase_ ": "__camel_case__", + + "Camel-Case": "camel-case", + "Camel-case": "camel-case", + "$camel-case": "$camel-case", + "$Camel-Case": "$camel-case", + // bulker will replace SQL unsupported characters with _ + "$camel##case": "$camel##case", + "$Camel##Case#": "$camel##case#", }; test("test idToSnakeCaseFast", async () => { @@ -58,7 +66,7 @@ test("test idToSnakeCaseFast", async () => { }); test("test idToSnakeCaseFast with spaces", async () => { - for (const [value, expected] of Object.entries(dataWithSpaces)) { + for (const [value, expected] of Object.entries(dataExtra)) { const res = idToSnakeCaseFast(value); expect(res).toEqual(expected); } diff --git a/libs/core-functions/src/functions/lib/strings.ts b/libs/core-functions/src/functions/lib/strings.ts index 6ed170ba3..1b021241d 100644 --- a/libs/core-functions/src/functions/lib/strings.ts +++ b/libs/core-functions/src/functions/lib/strings.ts @@ -4,7 +4,8 @@ export function idToSnakeCaseRegex(id: string) { const ACode = "A".charCodeAt(0); const ZCode = "Z".charCodeAt(0); -const _Code = "_".charCodeAt(0); +const aCode = "a".charCodeAt(0); +const zCode = "z".charCodeAt(0); const spaceCode = " ".charCodeAt(0); export function idToSnakeCaseFast(id: string) { @@ -21,7 +22,9 @@ export function idToSnakeCaseFast(id: string) { res += id.substring(concatIndex, i) + "_"; concatIndex = i + 1; } - needUnderscore = c != _Code && c != spaceCode; + // needUnderscore is used in case next char is a capital latin letter + // we add underscore only between latin letters + needUnderscore = (c >= aCode && c <= zCode) || (c >= ACode && c <= ZCode); } if (concatIndex == 0) { return id; From ed14d2c36c804215048025477e4b390759182e70 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 10 Oct 2024 17:25:57 +0400 Subject: [PATCH 0911/1353] Feat/newjitsu/profiles (#1134) Profile Builder service --- all.Dockerfile | 23 + libs/core-functions/package.json | 7 +- .../src/functions/bulker-destination.ts | 2 +- .../src/functions}/lib/clickhouse-logger.ts | 4 +- .../core-functions/src/functions/lib/index.ts | 132 +++-- .../src/functions/lib/mongodb.ts | 24 +- .../core-functions/src/functions/lib/store.ts | 17 +- .../src/functions/profiles-functions.ts | 145 +++++ .../src/functions/udf_wrapper.ts | 7 +- libs/core-functions/src/index.ts | 6 + .../core-functions}/src/lib/config-types.ts | 26 + .../core-functions}/src/lib/entity-store.ts | 23 +- .../core-functions}/src/lib/inmem-store.ts | 2 +- libs/jitsu-js/package.json | 2 +- pnpm-lock.yaml | 348 ++++++++---- release.sh | 2 +- services/profiles/.gitignore | 3 + services/profiles/babel.config.js | 8 + services/profiles/dist_package.json | 8 + services/profiles/jest.config.js | 9 + services/profiles/jest.setup.js | 8 + services/profiles/package.json | 67 +++ services/profiles/src/builder.ts | 366 +++++++++++++ services/profiles/src/index.ts | 270 ++++++++++ services/profiles/src/lib/db.ts | 220 ++++++++ services/profiles/src/lib/functions-chain.ts | 174 ++++++ .../profiles/src/lib/profiles-udf-wrapper.ts | 494 ++++++++++++++++++ services/profiles/src/lib/repositories.ts | 4 + services/profiles/src/lib/udf-wrapper-code.ts | 178 +++++++ .../profiles/src/lib/udf-wrapper-code.txtjs | 164 ++++++ services/profiles/tsconfig.json | 29 + services/profiles/webpack.config.js | 47 ++ .../rotor/__tests__/functions-chain.test.ts | 43 +- services/rotor/__tests__/inmem-store.test.ts | 3 +- services/rotor/__tests__/kafka.test.ts | 1 + services/rotor/dist_package.json | 2 +- services/rotor/package.json | 3 +- services/rotor/src/http/functions.ts | 10 +- services/rotor/src/index.ts | 9 +- services/rotor/src/lib/functions-chain.ts | 5 +- services/rotor/src/lib/maxmind.ts | 4 +- services/rotor/src/lib/message-handler.ts | 59 ++- services/rotor/src/lib/metrics.ts | 2 +- services/rotor/src/lib/redis.ts | 2 +- services/rotor/src/lib/repositories.ts | 5 + services/rotor/src/lib/rotor.ts | 5 +- turbo.json | 4 + types/protocols/profile.d.ts | 2 +- .../components/DataView/EventsBrowser.tsx | 56 +- .../console/components/SignInOrUp/SignIn.tsx | 2 +- webapps/console/lib/domains.ts | 2 +- webapps/console/package.json | 2 +- .../pages/[workspaceId]/connections/index.tsx | 31 +- .../[workspaceId]/config/profile-builder.ts | 57 ++ .../api/[workspaceId]/log/[type]/[actorId].ts | 5 +- webapps/console/pages/api/admin/domains.ts | 2 +- .../pages/api/admin/events-log-init.ts | 2 +- .../pages/api/admin/events-log-trim.ts | 2 +- .../pages/api/admin/export/[name]/index.ts | 119 ++++- .../pages/api/fb-auth/create-session.ts | 2 +- .../pages/api/fb-auth/revoke-session.ts | 2 +- webapps/console/prisma/schema.prisma | 60 ++- webapps/ee-api/package.json | 2 +- webapps/ee-api/pages/api/provision-db.ts | 2 +- webapps/ee-api/pages/api/s3-connections.ts | 2 +- webapps/ee-api/pages/api/s3-init.ts | 2 +- 66 files changed, 3057 insertions(+), 273 deletions(-) rename {services/rotor/src => libs/core-functions/src/functions}/lib/clickhouse-logger.ts (95%) create mode 100644 libs/core-functions/src/functions/profiles-functions.ts rename {services/rotor => libs/core-functions}/src/lib/config-types.ts (75%) rename {services/rotor => libs/core-functions}/src/lib/entity-store.ts (89%) rename {services/rotor => libs/core-functions}/src/lib/inmem-store.ts (98%) create mode 100644 services/profiles/.gitignore create mode 100644 services/profiles/babel.config.js create mode 100644 services/profiles/dist_package.json create mode 100644 services/profiles/jest.config.js create mode 100644 services/profiles/jest.setup.js create mode 100644 services/profiles/package.json create mode 100644 services/profiles/src/builder.ts create mode 100644 services/profiles/src/index.ts create mode 100644 services/profiles/src/lib/db.ts create mode 100644 services/profiles/src/lib/functions-chain.ts create mode 100644 services/profiles/src/lib/profiles-udf-wrapper.ts create mode 100644 services/profiles/src/lib/repositories.ts create mode 100644 services/profiles/src/lib/udf-wrapper-code.ts create mode 100644 services/profiles/src/lib/udf-wrapper-code.txtjs create mode 100644 services/profiles/tsconfig.json create mode 100644 services/profiles/webpack.config.js create mode 100644 services/rotor/src/lib/repositories.ts create mode 100644 webapps/console/pages/api/[workspaceId]/config/profile-builder.ts diff --git a/all.Dockerfile b/all.Dockerfile index fe186dd18..88c819948 100644 --- a/all.Dockerfile +++ b/all.Dockerfile @@ -80,3 +80,26 @@ ENV JITSU_VERSION_DOCKER_TAG=${JITSU_BUILD_DOCKER_TAG} ENV JITSU_VERSION_STRING=${JITSU_BUILD_VERSION} CMD ["--no-node-snapshot", "--max-old-space-size=2048", "main.js"] + +FROM base as profiles + +ARG JITSU_BUILD_VERSION=dev, +ARG JITSU_BUILD_DOCKER_TAG=dev, +ARG JITSU_BUILD_COMMIT_SHA=unknown, + + +WORKDIR /app +RUN addgroup --system --gid 1001 runner +RUN adduser --system --uid 1001 runner +USER runner + +EXPOSE 3401 + +COPY --from=builder /app/services/profiles/dist . + +ENV NODE_ENV=production +ENV JITSU_VERSION_COMMIT_SHA=${JITSU_BUILD_COMMIT_SHA} +ENV JITSU_VERSION_DOCKER_TAG=${JITSU_BUILD_DOCKER_TAG} +ENV JITSU_VERSION_STRING=${JITSU_BUILD_VERSION} + +CMD ["--no-node-snapshot", "--max-old-space-size=2048", "main.js"] diff --git a/libs/core-functions/package.json b/libs/core-functions/package.json index dec52bc0b..bba4fba62 100644 --- a/libs/core-functions/package.json +++ b/libs/core-functions/package.json @@ -26,7 +26,7 @@ "@types/jest": "^29.5.12", "@types/lodash": "^4.14.185", "@types/node": "^18.15.3", - "express": "^4.19.2", + "express": "^4.21.1", "jest": "^29.7.0", "json5": "^2.1.0", "node-fetch-commonjs": "^3.3.2", @@ -35,7 +35,7 @@ "dependencies": { "@amplitude/ua-parser-js": "^0.7.33", "@hubspot/api-client": "^11.1.0", - "@mongodb-js/zstd": "^1.2.0", + "@mongodb-js/zstd": "^1.2.2", "agentkeepalive": "4.3.0", "dayjs": "^1.11.10", "google-ads-api": "^16.0.0-rest-beta3", @@ -43,7 +43,8 @@ "isolated-vm": "5.0.1", "juava": "workspace:*", "lodash": "^4.17.21", - "mongodb": "^6.7.0", + "mongodb": "^6.9.0", + "@clickhouse/client": "^1.6.0", "node-cache": "^5.1.2", "parse-duration": "^1.1.0", "posthog-node": "^4.0.1", diff --git a/libs/core-functions/src/functions/bulker-destination.ts b/libs/core-functions/src/functions/bulker-destination.ts index 1d418c302..7deccdd7c 100644 --- a/libs/core-functions/src/functions/bulker-destination.ts +++ b/libs/core-functions/src/functions/bulker-destination.ts @@ -6,7 +6,7 @@ import omit from "lodash/omit"; import { MetricsMeta } from "./lib"; import { idToSnakeCaseFast } from "./lib/strings"; -const TableNameParameter = "JITSU_TABLE_NAME"; +export const TableNameParameter = "JITSU_TABLE_NAME"; export type MappedEvent = { event: any; table: string; diff --git a/services/rotor/src/lib/clickhouse-logger.ts b/libs/core-functions/src/functions/lib/clickhouse-logger.ts similarity index 95% rename from services/rotor/src/lib/clickhouse-logger.ts rename to libs/core-functions/src/functions/lib/clickhouse-logger.ts index d5d54ded5..827776441 100644 --- a/services/rotor/src/lib/clickhouse-logger.ts +++ b/libs/core-functions/src/functions/lib/clickhouse-logger.ts @@ -1,9 +1,9 @@ import { getLog, isTruish, LogLevel, requireDefined } from "juava"; -export const log = getLog("clickhouseLogger"); +const log = getLog("clickhouseLogger"); import { createClient } from "@clickhouse/client"; -import { EventsStore } from "@jitsu/core-functions"; +import { EventsStore } from "./index"; type LogEntry = { actorId: string; diff --git a/libs/core-functions/src/functions/lib/index.ts b/libs/core-functions/src/functions/lib/index.ts index ace846dfc..3fd1f2aa1 100644 --- a/libs/core-functions/src/functions/lib/index.ts +++ b/libs/core-functions/src/functions/lib/index.ts @@ -19,7 +19,16 @@ import { Metrics, TTLStore, } from "@jitsu/protocols/functions"; -import { alwaysThrottle, getErrorMessage, getLog, getThrottle, LogLevel, newError, noThrottle, stopwatch } from "juava"; +import { + getErrorMessage, + getLog, + getThrottle, + LogLevel, + LogMessageBuilder, + newError, + noThrottle, + stopwatch, +} from "juava"; const log = getLog("functions-context"); @@ -239,13 +248,35 @@ export function eventTimeSafeMs(event: AnalyticsServerEvent) { return Math.min(!isNaN(ts) ? ts : now, !isNaN(receivedAt) ? receivedAt : now, now); } -export const makeLog = (connectionId: string, eventsStore: EventsStore) => ({ - debug: (ctx: FunctionContext, message: any, ...args: any[]) => { - if (ctx.function.debugTill && ctx.function.debugTill > new Date()) { +export const makeLog = (connectionId: string, eventsStore: EventsStore, repeatToLog?: boolean) => { + const logFunc = (lb: () => LogMessageBuilder, callback: (l: LogMessageBuilder) => void) => { + if (repeatToLog) { + callback(lb()); + } else { + log.inDebug(callback); + } + }; + return { + debug: (ctx: FunctionContext, message: any, ...args: any[]) => { + if (ctx.function.debugTill && ctx.function.debugTill > new Date()) { + const fid = ctx.function.id; + logFunc(log.atDebug, l => l.log(`[CON:${connectionId}]: [f:${fid}][DEBUG]: ${message}`, ...args)); + eventsStore.log(connectionId, "debug", { + type: "log-debug", + functionId: fid, + functionType: ctx.function.type, + message: { + text: message, + args, + }, + }); + } + }, + warn: (ctx: FunctionContext, message: any, ...args: any[]) => { const fid = ctx.function.id; - log.inDebug(l => l.log(`[CON:${connectionId}]: [f:${fid}][DEBUG]: ${message}`, ...args)); - eventsStore.log(connectionId, "debug", { - type: "log-debug", + logFunc(log.atWarn, l => l.log(`[CON:${connectionId}]: [f:${fid}][WARN]: ${message}`, ...args)); + eventsStore.log(connectionId, "warn", { + type: "log-warn", functionId: fid, functionType: ctx.function.type, message: { @@ -253,57 +284,44 @@ export const makeLog = (connectionId: string, eventsStore: EventsStore) => ({ args, }, }); - } - }, - warn: (ctx: FunctionContext, message: any, ...args: any[]) => { - const fid = ctx.function.id; - log.inDebug(l => l.log(`[CON:${connectionId}]: [f:${fid}][WARN]: ${message}`, ...args)); - eventsStore.log(connectionId, "warn", { - type: "log-warn", - functionId: fid, - functionType: ctx.function.type, - message: { - text: message, - args, - }, - }); - }, - error: (ctx: FunctionContext, message: any, ...args: any[]) => { - const fid = ctx.function.id; - eventsStore.log(connectionId, "error", { - type: "log-error", - functionId: fid, - functionType: ctx.function.type, - message: { - text: message, - args, - }, - }); - log.inDebug(l => { - if (args?.length > 0) { - const last = args[args.length - 1]; - if (last.stack) { - l.withCause(last); - args = args.slice(0, args.length - 1); + }, + error: (ctx: FunctionContext, message: any, ...args: any[]) => { + const fid = ctx.function.id; + eventsStore.log(connectionId, "error", { + type: "log-error", + functionId: fid, + functionType: ctx.function.type, + message: { + text: message, + args, + }, + }); + logFunc(log.atError, l => { + if (args?.length > 0) { + const last = args[args.length - 1]; + if (last.stack) { + l.withCause(last); + args = args.slice(0, args.length - 1); + } } - } - l.log(`[CON:${connectionId}]: [f:${fid}][ERROR]: ${message}`, ...args); - }); - }, - info: (ctx: FunctionContext, message: any, ...args: any[]) => { - const fid = ctx.function.id; - log.inDebug(l => l.log(`[CON:${connectionId}]: [f:${fid}][INFO]: ${message}`, ...args)); - eventsStore.log(connectionId, "info", { - type: "log-info", - functionId: fid, - functionType: ctx.function.type, - message: { - text: message, - args, - }, - }); - }, -}); + l.log(`[CON:${connectionId}]: [f:${fid}][ERROR]: ${message}`, ...args); + }); + }, + info: (ctx: FunctionContext, message: any, ...args: any[]) => { + const fid = ctx.function.id; + logFunc(log.atInfo, l => l.log(`[CON:${connectionId}]: [f:${fid}][INFO]: ${message}`, ...args)); + eventsStore.log(connectionId, "info", { + type: "log-info", + functionId: fid, + functionType: ctx.function.type, + message: { + text: message, + args, + }, + }); + }, + }; +}; export const makeFetch = ( connectionId: string, diff --git a/libs/core-functions/src/functions/lib/mongodb.ts b/libs/core-functions/src/functions/lib/mongodb.ts index 5e20c3de2..45283adf9 100644 --- a/libs/core-functions/src/functions/lib/mongodb.ts +++ b/libs/core-functions/src/functions/lib/mongodb.ts @@ -41,11 +41,14 @@ export function mongoAnonymousEventsStore(): AnonymousEventsStore { return { async addEvent(collectionName: string, anonymousId: string, event: AnalyticsServerEvent, ttlDays: number) { const mongo = mongodb(); - await ensureMongoCollection(mongo, collectionName, ttlDays); + await ensureMongoCollection(mongo, collectionName, ttlDays, [AnonymousEventsStoreIdField]); const res = await mongo .db() .collection(collectionName) - .insertOne({ ...event, [AnonymousEventsStoreIdField]: anonymousId }); + .insertOne( + { ...event, [AnonymousEventsStoreIdField]: anonymousId }, + { writeConcern: { w: 1, journal: false } } + ); if (res.acknowledged) { return; } else { @@ -80,7 +83,12 @@ export function mongoAnonymousEventsStore(): AnonymousEventsStore { }; } -async function ensureMongoCollection(mongo: MongoClient, collectionName: string, ttlDays: number) { +async function ensureMongoCollection( + mongo: MongoClient, + collectionName: string, + ttlDays: number, + indexFields: string[] = [] +) { if (MongoCreatedCollections.has(collectionName)) { return; } @@ -102,10 +110,16 @@ async function ensureMongoCollection(mongo: MongoClient, collectionName: string, key: { _id: 1 }, unique: true, }, - writeConcern: { w: 1, j: false }, + writeConcern: { w: 1, journal: false }, storageEngine: { wiredTiger: { configString: "block_compressor=zstd" } }, }); - await collection.createIndex({ [AnonymousEventsStoreIdField]: 1 }); + if (indexFields.length > 0) { + const index = {}; + indexFields.forEach(field => { + index[field] = 1; + }); + await collection.createIndex(index); + } MongoCreatedCollections.add(collectionName); } catch (err) { throw new Error(`Failed to create collection ${collectionName}: ${err}`); diff --git a/libs/core-functions/src/functions/lib/store.ts b/libs/core-functions/src/functions/lib/store.ts index 22d2060c7..1f4f5614e 100644 --- a/libs/core-functions/src/functions/lib/store.ts +++ b/libs/core-functions/src/functions/lib/store.ts @@ -2,14 +2,11 @@ import { SetOpts, TTLStore } from "@jitsu/protocols/functions"; import type { Redis } from "ioredis"; import parse from "parse-duration"; import { MongoClient, ReadPreference, Collection } from "mongodb"; -import { getLog } from "juava"; import { RetryError } from "@jitsu/functions-lib"; export const defaultTTL = 60 * 60 * 24 * 31; // 31 days export const maxAllowedTTL = 2147483647; // max allowed value for ttl in redis (68years) -export const log = getLog("store"); - function getTtlSec(opts?: SetOpts): number { let seconds = defaultTTL; if (typeof opts === "number") { @@ -231,6 +228,20 @@ export const createMultiStore = (newStore: TTLStore, oldStore: TTLStore): TTLSto }; }; +export const createDummyStore = (): TTLStore => ({ + get: async (key: string) => { + return undefined; + }, + set: async (key: string, obj: any, opts) => {}, + del: async (key: string) => {}, + ttl: async (key: string) => { + return -2; + }, + getWithTTL: async (key: string) => { + return undefined; + }, +}); + export const createMemoryStore = (store: any): TTLStore => ({ get: async (key: string) => { const val = store[key]; diff --git a/libs/core-functions/src/functions/profiles-functions.ts b/libs/core-functions/src/functions/profiles-functions.ts new file mode 100644 index 000000000..ce9b644db --- /dev/null +++ b/libs/core-functions/src/functions/profiles-functions.ts @@ -0,0 +1,145 @@ +import { z } from "zod"; +import { JitsuFunction } from "@jitsu/protocols/functions"; +import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; +import { getSingleton, parseNumber } from "juava"; +import { MongoClient } from "mongodb"; +import * as crypto from "crypto"; +import { mongodb } from "./lib/mongodb"; + +const hash = crypto["hash"]; + +export const profilePartitionIdColumn = "_partition_id"; +// 240 has quite enough divisors: 1, 2, 3, 4, 5, 6, 8, 10, 12, 15, 16, 20, 24, 30, 40, 48, 60, 80, 120, 240. +export const profilePartitionsCount = 240; + +export const ProfilesConfig = z.object({ + mongoUrl: z.string().optional(), + enableAnonymousProfiles: z.boolean().optional().default(false), + profileWindowDays: z.number().optional().default(365), + runPeriodSec: z.number().optional().default(60), + eventsDatabase: z.string().optional().default("profiles"), + eventsCollectionName: z.string().optional().default("profiles-raw"), +}); + +const MongoCreatedCollections = new Set(); +export type ProfilesConfig = z.infer; + +export const createClient = async (config: ProfilesConfig) => { + const mongoTimeout = parseNumber(process.env.MONGODB_TIMEOUT_MS, 1000); + let uri = config.mongoUrl!; + + // Create a new MongoClient + const client = new MongoClient(uri, { + compressors: ["zstd"], + serverSelectionTimeoutMS: 60000, + maxPoolSize: 32, + connectTimeoutMS: 60000, + socketTimeoutMS: mongoTimeout, + }); + // Connect the client to the server (optional starting in v4.7) + await client.connect(); + // Establish and verify connection + await client.db().command({ ping: 1 }); + + return client; +}; + +function hashToInt(value) { + // Hash the value using SHA-256 (or another algorithm if desired) + const h = hash("sha256", value); + + // Convert the first 8 characters of the hash (or more) to an integer + return parseInt(h.substring(0, 8), 16); +} + +export const ProfilesFunction: JitsuFunction = async (event, ctx) => { + const config = ProfilesConfig.parse(ctx.props || {}); + + const userId = event.userId; + if (!userId) { + ctx.log.debug(`No userId found. Skipping`); + return; + } + + try { + const mongoSingleton = config.mongoUrl + ? getSingleton( + `profiles-mongodb-${ctx.connection?.id}-${hash("md5", config.mongoUrl)}`, + () => { + ctx.log.info(`Connecting to MongoDB server.`); + const cl = createClient(config); + ctx.log.info(`Connected successfully to MongoDB server.`); + return cl; + }, + { + optional: true, + ttlSec: 60 * 60 * 24, + cleanupFunc: client => client.close(), + } + ) + : mongodb; + const mongo = await mongoSingleton.waitInit(); + await pbEnsureMongoCollection(mongo, config.eventsDatabase, config.eventsCollectionName, config.profileWindowDays, [ + profilePartitionIdColumn, + "userId", + ]); + + const partitionId = hashToInt(userId) % profilePartitionsCount; + + const res = await mongo + .db(config.eventsDatabase) + .collection(config.eventsCollectionName) + .insertOne({ [profilePartitionIdColumn]: partitionId, ...event }, { writeConcern: { w: 1, journal: false } }); + if (!res.acknowledged) { + ctx.log.error(`Failed to insert to MongoDB: ${JSON.stringify(res)}`); + } else { + ctx.log.debug(`Inserted to MongoDB: ${JSON.stringify(res)}`); + } + } catch (e: any) { + throw new Error(`Error while sending event to MongoDB: ${e}`); + } +}; + +export async function pbEnsureMongoCollection( + mongo: MongoClient, + databaseName: string, + collectionName: string, + ttlDays: number, + indexFields: string[] = [] +) { + if (MongoCreatedCollections.has(collectionName)) { + return; + } + try { + const db = mongo.db(databaseName); + const collStatus = await db + .collection(collectionName) + .aggregate([{ $collStats: { count: {} } }]) + .next() + .catch(e => {}); + if (collStatus) { + //collection already exists + MongoCreatedCollections.add(collectionName); + return; + } + const collection = await db.createCollection(collectionName, { + expireAfterSeconds: 60 * 60 * 24 * ttlDays, + clusteredIndex: { + key: { _id: 1 }, + unique: true, + }, + writeConcern: { w: 1, journal: false }, + storageEngine: { wiredTiger: { configString: "block_compressor=zstd" } }, + }); + if (indexFields.length > 0) { + const index = {}; + indexFields.forEach(field => { + index[field] = 1; + }); + await collection.createIndex(index); + } + MongoCreatedCollections.add(collectionName); + } catch (err) { + throw new Error(`Failed to create collection ${collectionName}: ${err}`); + } +} diff --git a/libs/core-functions/src/functions/udf_wrapper.ts b/libs/core-functions/src/functions/udf_wrapper.ts index ee2a10284..9edb0d48f 100644 --- a/libs/core-functions/src/functions/udf_wrapper.ts +++ b/libs/core-functions/src/functions/udf_wrapper.ts @@ -20,7 +20,6 @@ import { JitsuFunctionWrapper } from "./lib"; import { clearTimeout } from "node:timers"; import * as crypto from "node:crypto"; import { cryptoCode } from "./lib/crypto-code"; -import { randomInt } from "node:crypto"; const log = getLog("udf-wrapper"); @@ -128,13 +127,13 @@ export const UDFWrapper = ( const functionsLib = isolate.compileModuleSync(functionsLibCode, { filename: "functions-lib.js", }); - functionsLib.instantiateSync(context, (specifier: string) => { + functionsLib.instantiateSync(context, (specifier: string): Module => { throw new Error(`import is not allowed: ${specifier}`); }); const cryptoLib = isolate.compileModuleSync(cryptoCode, { filename: "crypto.js", }); - cryptoLib.instantiateSync(context, (specifier: string) => { + cryptoLib.instantiateSync(context, (specifier: string): Module => { throw new Error(`import is not allowed: ${specifier}`); }); const udfModules: Record = {}; @@ -193,7 +192,7 @@ export const UDFWrapper = ( return wrapperFunc; } catch (e) { return { - userFunction: () => { + userFunction: (): FuncReturn => { throw new Error(`Cannot compile function: ${e}`); }, isDisposed: () => { diff --git a/libs/core-functions/src/index.ts b/libs/core-functions/src/index.ts index 6930bc967..2fb0402cd 100644 --- a/libs/core-functions/src/index.ts +++ b/libs/core-functions/src/index.ts @@ -80,3 +80,9 @@ export type { export { httpAgent, httpsAgent } from "./functions/lib/http-agent"; export * from "./functions/lib/store"; export * from "./functions/lib/ua"; +export * from "./functions/lib/clickhouse-logger"; +export * from "./functions/profiles-functions"; +export * from "./functions/lib/crypto-code"; +export * from "./lib/inmem-store"; +export * from "./lib/config-types"; +export * from "./lib/entity-store"; diff --git a/services/rotor/src/lib/config-types.ts b/libs/core-functions/src/lib/config-types.ts similarity index 75% rename from services/rotor/src/lib/config-types.ts rename to libs/core-functions/src/lib/config-types.ts index c5c885f43..666cd5239 100644 --- a/services/rotor/src/lib/config-types.ts +++ b/libs/core-functions/src/lib/config-types.ts @@ -54,3 +54,29 @@ export type EnrichedConnectionConfig = { }; credentialsHash: string; }; + +export type Workspace = { + id: string; + createdAt: Date; + updatedAt: Date; + name: string; + slug: string; + featuresEnabled: string[]; + profileBuilders: ProfileBuilder[]; +}; + +export type ProfileBuilder = { + id: string; + createdAt: Date; + updatedAt: Date; + debugTill: Date; + version: number; + workspaceId: string; + intermediateStorageCredentials: any; + destinationId: string; + functions: [ + { + functionId: string; + } + ]; +}; diff --git a/services/rotor/src/lib/entity-store.ts b/libs/core-functions/src/lib/entity-store.ts similarity index 89% rename from services/rotor/src/lib/entity-store.ts rename to libs/core-functions/src/lib/entity-store.ts index 5a14a5f7f..800d11019 100644 --- a/services/rotor/src/lib/entity-store.ts +++ b/libs/core-functions/src/lib/entity-store.ts @@ -1,11 +1,11 @@ import { createInMemoryStore } from "./inmem-store"; import { getLog } from "juava"; -import { EnrichedConnectionConfig, FunctionConfig } from "./config-types"; const log = getLog("entity-store"); export type EntityStore = { - getObject: (id: string) => T; + getObject: (id: string) => T | undefined; + getAll: () => Record; toJSON: () => string; enabled: boolean; lastModified?: Date; @@ -14,12 +14,18 @@ export type EntityStore = { const DisabledStore: EntityStore = { enabled: false, getObject: () => undefined, + getAll: () => { + return {}; + }, toJSON: () => "disabled", }; const EmptyStore: EntityStore = { enabled: true, getObject: () => undefined, + getAll: () => { + return {}; + }, toJSON: () => "", }; @@ -68,6 +74,9 @@ function refreshFunc(storeId: string) { getObject: (key: string) => { return objs[key]; }, + getAll() { + return objs; + }, toJSON: () => { return JSON.stringify(objs); }, @@ -84,8 +93,8 @@ function refreshFunc(storeId: string) { }; } -function storeFunc(storeId: string) { - return createInMemoryStore({ +export function storeFunc(storeId: string) { + return createInMemoryStore>({ refreshIntervalMillis: process.env.REPOSITORY_REFRESH_PERIOD_SEC ? parseInt(process.env.REPOSITORY_REFRESH_PERIOD_SEC) * 1000 : 2000, @@ -103,6 +112,9 @@ function storeFunc(storeId: string) { getObject: (key: string): any => { return store?.[key]; }, + getAll: () => { + return store || {}; + }, toJSON: () => { return store ? JSON.stringify(store) : ""; }, @@ -114,6 +126,3 @@ function storeFunc(storeId: string) { refresh: refreshFunc(storeId), }); } - -export const functionsStore = storeFunc("functions"); -export const connectionsStore = storeFunc("rotor-connections"); diff --git a/services/rotor/src/lib/inmem-store.ts b/libs/core-functions/src/lib/inmem-store.ts similarity index 98% rename from services/rotor/src/lib/inmem-store.ts rename to libs/core-functions/src/lib/inmem-store.ts index 6c6a7bceb..2f261f715 100644 --- a/services/rotor/src/lib/inmem-store.ts +++ b/libs/core-functions/src/lib/inmem-store.ts @@ -59,7 +59,7 @@ export const createInMemoryStore = (definition: StoreDefinition): InMemory let lastRefresh: Date | undefined = undefined; let lastModified: Date | undefined = undefined; let stopping: boolean = false; - let intervalToClear: NodeJS.Timeout | undefined = undefined; + let intervalToClear: NodeJS.Timeout | string | number | undefined = undefined; function scheduleStoreRefresh() { const refresh = async () => { diff --git a/libs/jitsu-js/package.json b/libs/jitsu-js/package.json index e935a8923..0f05976e2 100644 --- a/libs/jitsu-js/package.json +++ b/libs/jitsu-js/package.json @@ -36,7 +36,7 @@ "chalk": "^4.1.2", "cookie-parser": "^1.4.6", "ejs": "^3.1.8", - "express": "^4.18.2", + "express": "^4.21.1", "jest": "^29.2.2", "node-fetch-commonjs": "^3.3.2", "node-forge": "^1.3.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fc93106b1..4e702afd3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -305,12 +305,15 @@ importers: '@amplitude/ua-parser-js': specifier: ^0.7.33 version: 0.7.33 + '@clickhouse/client': + specifier: ^1.6.0 + version: 1.6.0 '@hubspot/api-client': specifier: ^11.1.0 version: 11.1.0(encoding@0.1.13) '@mongodb-js/zstd': - specifier: ^1.2.0 - version: 1.2.0 + specifier: ^1.2.2 + version: 1.2.2 agentkeepalive: specifier: 4.3.0 version: 4.3.0 @@ -333,8 +336,8 @@ importers: specifier: ^4.17.21 version: 4.17.21 mongodb: - specifier: ^6.7.0 - version: 6.8.0(@mongodb-js/zstd@1.2.0)(socks@2.8.3) + specifier: ^6.9.0 + version: 6.9.0(@mongodb-js/zstd@1.2.2)(socks@2.8.3) node-cache: specifier: ^5.1.2 version: 5.1.2 @@ -370,8 +373,8 @@ importers: specifier: ^18.15.3 version: 18.19.42 express: - specifier: ^4.19.2 - version: 4.19.2 + specifier: ^4.21.1 + version: 4.21.1 jest: specifier: ^29.7.0 version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) @@ -465,8 +468,8 @@ importers: specifier: ^3.1.8 version: 3.1.10 express: - specifier: ^4.18.2 - version: 4.19.2 + specifier: ^4.21.1 + version: 4.21.1 jest: specifier: ^29.2.2 version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) @@ -590,6 +593,142 @@ importers: specifier: 29.0.5 version: 29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)))(typescript@5.5.4) + services/profiles: + dependencies: + '@clickhouse/client': + specifier: ^1.6.0 + version: 1.6.0 + '@jitsu/core-functions': + specifier: workspace:* + version: link:../../libs/core-functions + '@jitsu/functions-lib': + specifier: workspace:* + version: link:../../libs/functions + express: + specifier: ^4.21.1 + version: 4.21.1 + isolated-vm: + specifier: 5.0.1 + version: 5.0.1 + juava: + specifier: workspace:* + version: link:../../libs/juava + mongodb: + specifier: ^6.9.0 + version: 6.9.0(@mongodb-js/zstd@1.2.2)(socks@2.8.3) + node-cache: + specifier: ^5.1.2 + version: 5.1.2 + p-queue: + specifier: ^6.6.2 + version: 6.6.2 + pg: + specifier: ^8.12.0 + version: 8.12.0 + pg-cursor: + specifier: ^2.11.0 + version: 2.11.0(pg@8.12.0) + prom-client: + specifier: ^15.1.3 + version: 15.1.3 + tslib: + specifier: ^2.6.3 + version: 2.6.3 + devDependencies: + '@babel/preset-env': + specifier: ^7.25.2 + version: 7.25.2(@babel/core@7.25.2) + '@babel/preset-react': + specifier: ^7.24.7 + version: 7.24.7(@babel/core@7.25.2) + '@babel/preset-typescript': + specifier: ^7.24.7 + version: 7.24.7(@babel/core@7.25.2) + '@jest/globals': + specifier: ^29.7.0 + version: 29.7.0 + '@jest/types': + specifier: ^29.6.3 + version: 29.6.3 + '@jitsu/protocols': + specifier: workspace:* + version: link:../../types/protocols + '@types/express': + specifier: ^4.17.21 + version: 4.17.21 + '@types/jest': + specifier: ^29.5.11 + version: 29.5.12 + '@types/lodash': + specifier: ^4.17.7 + version: 4.17.7 + '@types/node': + specifier: ^18.15.3 + version: 18.19.42 + '@types/pg': + specifier: ^8.11.6 + version: 8.11.6 + '@types/pg-cursor': + specifier: ^2.7.2 + version: 2.7.2 + '@types/web': + specifier: ^0.0.152 + version: 0.0.152 + '@types/webpack': + specifier: ^5.28.5 + version: 5.28.5(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) + '@webpack-cli/generators': + specifier: ^3.0.7 + version: 3.0.7(encoding@0.1.13)(mem-fs@2.3.0)(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0) + babel-loader: + specifier: ^9.1.3 + version: 9.1.3(@babel/core@7.25.2)(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) + clean-webpack-plugin: + specifier: ^4.0.0 + version: 4.0.0(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) + copy-webpack-plugin: + specifier: ^12.0.2 + version: 12.0.2(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) + declaration-bundler-webpack-plugin: + specifier: ^1.0.3 + version: 1.0.3 + dotenv-cli: + specifier: ^7.4.2 + version: 7.4.2 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + lodash: + specifier: ^4.17.21 + version: 4.17.21 + node-loader: + specifier: ^2.0.0 + version: 2.0.0(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) + nodemon: + specifier: ^3.1.4 + version: 3.1.4 + ts-jest: + specifier: ^29.2.3 + version: 29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4) + ts-loader: + specifier: ^9.4.2 + version: 9.5.1(typescript@5.5.4)(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) + ts-node-dev: + specifier: ^2.0.0 + version: 2.0.0(@types/node@18.19.42)(typescript@5.5.4) + typescript: + specifier: ^5.5.4 + version: 5.5.4 + webpack: + specifier: ^5.93.0 + version: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) + webpack-cli: + specifier: ^5.1.4 + version: 5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0) + services/rotor: dependencies: '@amplitude/ua-parser-js': @@ -598,9 +737,6 @@ importers: '@aws-sdk/client-s3': specifier: ^3.621.0 version: 3.621.0 - '@clickhouse/client': - specifier: ^1.4.0 - version: 1.4.0 '@jitsu/core-functions': specifier: workspace:* version: link:../../libs/core-functions @@ -620,8 +756,8 @@ importers: specifier: ^1.11.12 version: 1.11.12 express: - specifier: ^4.19.2 - version: 4.19.2 + specifier: ^4.21.1 + version: 4.21.1 ioredis: specifier: ^5.4.1 version: 5.4.1 @@ -770,8 +906,8 @@ importers: specifier: ^1.5.6 version: 1.21.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@clickhouse/client': - specifier: ^1.4.0 - version: 1.4.0 + specifier: ^1.6.0 + version: 1.6.0 '@dnd-kit/core': specifier: ^6.0.8 version: 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1086,8 +1222,8 @@ importers: specifier: ^3.418.0 version: 3.621.0 '@clickhouse/client': - specifier: ^1.4.0 - version: 1.4.0 + specifier: ^1.6.0 + version: 1.6.0 '@react-email/components': specifier: ^0.0.25 version: 0.0.25(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -2181,11 +2317,11 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@clickhouse/client-common@1.4.0': - resolution: {integrity: sha512-kglG8YyWnR1K24RckUf5ZdNTN0U0s+a1j/bpCO4ZjzjO87ICgWlXFVD22pZqSACW7/2IIi1IkzbwtxKI2s/MOw==} + '@clickhouse/client-common@1.6.0': + resolution: {integrity: sha512-DPdfPUIrBumWff8JdE2oLqnOIN1DwxXt48juV+tB6zaonufQR1QImtUGEhIFIqRWJU7zErtQ1eKfkwjLY0MYDg==} - '@clickhouse/client@1.4.0': - resolution: {integrity: sha512-O4mbFPM/wQtFck01ghYI2mnNHv9jSFEiQBsTCH4t6MKeGHNAPkJGaFGv+KycLTv6zjnQNjiUGdXDMVRema5SyA==} + '@clickhouse/client@1.6.0': + resolution: {integrity: sha512-cjuOL5O11Y/axYIvSaNgZjZqD53BBbScrG0DCgZ7XBCz5KWlA5lIG3fP6A4jME277q8ZUYAQxUOlJjeF18872A==} engines: {node: '>=16'} '@cspotcode/source-map-support@0.8.1': @@ -3062,50 +3198,50 @@ packages: '@mongodb-js/saslprep@1.1.8': resolution: {integrity: sha512-qKwC/M/nNNaKUBMQ0nuzm47b7ZYWQHN3pcXq4IIcoSBc2hOIrflAxJduIvvqmhoz3gR2TacTAs8vlsCVPkiEdQ==} - '@mongodb-js/zstd-darwin-arm64@1.2.0': - resolution: {integrity: sha512-QWgW6IkWp3ErBXOvlOj9lw3lwMfey7eXh/p/Srb/7sEiu1e0yEO+LQ8IctmDWh8bfznKXmwUC0h7LKDbYR30yw==} + '@mongodb-js/zstd-darwin-arm64@1.2.2': + resolution: {integrity: sha512-hjQgub8fhn3itewwRSCSe3sl8rmnbZOFwuBHOZj4j4xu1Hde7xs+ACkfeEvvmNjUuxAzvc1MnDjHX2UwUlA7qA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@mongodb-js/zstd-darwin-x64@1.2.0': - resolution: {integrity: sha512-VnxYO8P2SWubdnydGId5+6veO6Ki6nxCr/pTaDZd8s4Urn6bDdXSX6YsZ0r42dO3Fa0FVYzrlcVAuNB67e2b6w==} + '@mongodb-js/zstd-darwin-x64@1.2.2': + resolution: {integrity: sha512-gHSxcWgAdED/bDKyOqLhiwC0VYlhkhSyQuR0Fqcrl1CMpWSJAfu0jxhaEvM4Ncs6yH0+BPVwTp8xtHW2iJ5DuQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@mongodb-js/zstd-linux-arm64-gnu@1.2.0': - resolution: {integrity: sha512-TYF0XgNJW6UrvtY2u4Uuo5HiVWNgWNZ/ae2BhVp8hNsDhwFqb/YNoyiZqBei6whUwr8hecMy0UaHAXm3h+O2+Q==} + '@mongodb-js/zstd-linux-arm64-gnu@1.2.2': + resolution: {integrity: sha512-DJVSC5IU/GlY9lY4qpKML/655OstZvueN/WZeuO8hyYJ5115x/usUM1pHpp7dbZWyUUhTlRIU4peR62Tk1H3lQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@mongodb-js/zstd-linux-arm64-musl@1.2.0': - resolution: {integrity: sha512-e2ClmJI1BvJq23VSLH14hgjjjcMOad3R/Ap7Q7dTa1uiVSJG4xKd2CmrWQgX1Az4/EfUMWEI7pb4yuanbdd2AQ==} + '@mongodb-js/zstd-linux-arm64-musl@1.2.2': + resolution: {integrity: sha512-rxTmMF2NGLLijnw+MZCs0ixiE+NylpDYvUUkJemqjyHstlmYG0Ku6i3+SzViB6L0kkktwYSRpaI4y7OG+SFt3w==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@mongodb-js/zstd-linux-x64-gnu@1.2.0': - resolution: {integrity: sha512-JuoK8lxUlkFPDBfsBUJKnLxpXA5ar+v7G43lIUlBKgjOp5aEWO/qQp5sNgCRnYA7x6PItYqIkEJjsays4N6JOA==} + '@mongodb-js/zstd-linux-x64-gnu@1.2.2': + resolution: {integrity: sha512-ctz/XY6aX2THxkTjAygOYbyFp2/UYbqZIF3sB1F5Cjcbus9wfD3vPbaDegqRjQhlHBvKia3IjqJDUiC+aZxmww==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@mongodb-js/zstd-linux-x64-musl@1.2.0': - resolution: {integrity: sha512-pSb1iUF3Gc/qrJuP/Mi5ry4YFAUdUVFKNRZh1KTDDhSWyRCLd9gKcNdRnXqJjIdeGGEKf4bhtZAbYw4i/g0foA==} + '@mongodb-js/zstd-linux-x64-musl@1.2.2': + resolution: {integrity: sha512-EqD271yPIRBGbkMtBJSVTLlUrukTsmi7qt1G3dh+Z9RWVXn5MXnlnEn4znfBXoaVqlniUNZhmzDEaATNIktJpw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@mongodb-js/zstd-win32-x64-msvc@1.2.0': - resolution: {integrity: sha512-iz4Yl+WK3yr/4Yg6F4tKz3X9+yMZDK6pyBMA0CdXydSDZs6o2XQ2I0ZSu3oSk/ACfaZX3SNfRi3XTGgAM1eKZA==} + '@mongodb-js/zstd-win32-x64-msvc@1.2.2': + resolution: {integrity: sha512-h3O9NGOrGtfQ7g+rFqs5Hn+GSmgF2ik+xg0/1crNUXWthcBsxcCK5woawHfDcJxWkaiijJe5PVo6/fo8Jm7qCg==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@mongodb-js/zstd@1.2.0': - resolution: {integrity: sha512-sKHsJU2MXsp822IFXOHw/4mpFulScNHpZzVy1Zi5k5wBsdiAPx1QramyOXZkpacla+2QPEC/s7TxPlEhG/HuNQ==} + '@mongodb-js/zstd@1.2.2': + resolution: {integrity: sha512-NRXiFhk2Nl8UMuIZ4pviKkGVZY/e5P37Opam1u0OtgXjEE0kO1HLapA9heTcZ1PUomArnKS426XbiRFr5iaWvw==} engines: {node: '>= 10'} '@nangohq/frontend@0.21.17': @@ -5642,8 +5778,8 @@ packages: bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} bonjour-service@1.2.1: @@ -6162,8 +6298,8 @@ packages: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} - cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} engines: {node: '>= 0.6'} copy-anything@2.0.6: @@ -6892,6 +7028,10 @@ packages: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + encoding@0.1.13: resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} @@ -7402,8 +7542,8 @@ packages: exponential-backoff@3.1.1: resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} - express@4.19.2: - resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + express@4.21.1: + resolution: {integrity: sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==} engines: {node: '>= 0.10.0'} extend@3.0.2: @@ -7531,8 +7671,8 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} find-cache-dir@3.3.2: @@ -9537,8 +9677,8 @@ packages: mensch@0.3.4: resolution: {integrity: sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==} - merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -9845,8 +9985,8 @@ packages: mongodb-connection-string-url@3.0.1: resolution: {integrity: sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==} - mongodb@6.8.0: - resolution: {integrity: sha512-HGQ9NWDle5WvwMnrvUxsFYPd3JEbqD3RgABHBQRuoCEND0qzhsd0iH5ypHsf1eJ+sXmvmyKpP+FLOKY8Il7jMw==} + mongodb@6.9.0: + resolution: {integrity: sha512-UMopBVx1LmEUbW/QE0Hw18u583PEDVQmUmVzzBRH0o/xtE9DBRA5ZYLOjpLIa03i8FXjzvQECJcqoMvCXftTUA==} engines: {node: '>=16.20.1'} peerDependencies: '@aws-sdk/credential-providers': ^3.188.0 @@ -10512,8 +10652,8 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + path-to-regexp@0.1.10: + resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} path-to-regexp@1.8.0: resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} @@ -11481,14 +11621,14 @@ packages: (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) - qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} - qs@6.12.3: resolution: {integrity: sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ==} engines: {node: '>=0.6'} + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} @@ -12352,8 +12492,8 @@ packages: engines: {node: '>=10'} hasBin: true - send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} serialize-javascript@4.0.0: @@ -12366,8 +12506,8 @@ packages: resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} engines: {node: '>= 0.8.0'} - serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} set-blocking@2.0.0: @@ -15699,11 +15839,11 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@clickhouse/client-common@1.4.0': {} + '@clickhouse/client-common@1.6.0': {} - '@clickhouse/client@1.4.0': + '@clickhouse/client@1.6.0': dependencies: - '@clickhouse/client-common': 1.4.0 + '@clickhouse/client-common': 1.6.0 '@cspotcode/source-map-support@0.8.1': dependencies: @@ -17034,36 +17174,36 @@ snapshots: dependencies: sparse-bitfield: 3.0.3 - '@mongodb-js/zstd-darwin-arm64@1.2.0': + '@mongodb-js/zstd-darwin-arm64@1.2.2': optional: true - '@mongodb-js/zstd-darwin-x64@1.2.0': + '@mongodb-js/zstd-darwin-x64@1.2.2': optional: true - '@mongodb-js/zstd-linux-arm64-gnu@1.2.0': + '@mongodb-js/zstd-linux-arm64-gnu@1.2.2': optional: true - '@mongodb-js/zstd-linux-arm64-musl@1.2.0': + '@mongodb-js/zstd-linux-arm64-musl@1.2.2': optional: true - '@mongodb-js/zstd-linux-x64-gnu@1.2.0': + '@mongodb-js/zstd-linux-x64-gnu@1.2.2': optional: true - '@mongodb-js/zstd-linux-x64-musl@1.2.0': + '@mongodb-js/zstd-linux-x64-musl@1.2.2': optional: true - '@mongodb-js/zstd-win32-x64-msvc@1.2.0': + '@mongodb-js/zstd-win32-x64-msvc@1.2.2': optional: true - '@mongodb-js/zstd@1.2.0': + '@mongodb-js/zstd@1.2.2': optionalDependencies: - '@mongodb-js/zstd-darwin-arm64': 1.2.0 - '@mongodb-js/zstd-darwin-x64': 1.2.0 - '@mongodb-js/zstd-linux-arm64-gnu': 1.2.0 - '@mongodb-js/zstd-linux-arm64-musl': 1.2.0 - '@mongodb-js/zstd-linux-x64-gnu': 1.2.0 - '@mongodb-js/zstd-linux-x64-musl': 1.2.0 - '@mongodb-js/zstd-win32-x64-msvc': 1.2.0 + '@mongodb-js/zstd-darwin-arm64': 1.2.2 + '@mongodb-js/zstd-darwin-x64': 1.2.2 + '@mongodb-js/zstd-linux-arm64-gnu': 1.2.2 + '@mongodb-js/zstd-linux-arm64-musl': 1.2.2 + '@mongodb-js/zstd-linux-x64-gnu': 1.2.2 + '@mongodb-js/zstd-linux-x64-musl': 1.2.2 + '@mongodb-js/zstd-win32-x64-msvc': 1.2.2 '@nangohq/frontend@0.21.17': {} @@ -20322,7 +20462,7 @@ snapshots: bluebird@3.7.2: {} - body-parser@1.20.2: + body-parser@1.20.3: dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -20332,7 +20472,7 @@ snapshots: http-errors: 2.0.0 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.11.0 + qs: 6.13.0 raw-body: 2.5.2 type-is: 1.6.18 unpipe: 1.0.0 @@ -20877,7 +21017,7 @@ snapshots: cookie@0.5.0: {} - cookie@0.6.0: {} + cookie@0.7.1: {} copy-anything@2.0.6: dependencies: @@ -21696,6 +21836,8 @@ snapshots: encodeurl@1.0.2: {} + encodeurl@2.0.0: {} + encoding@0.1.13: dependencies: iconv-lite: 0.6.3 @@ -22400,34 +22542,34 @@ snapshots: exponential-backoff@3.1.1: {} - express@4.19.2: + express@4.21.1: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.2 + body-parser: 1.20.3 content-disposition: 0.5.4 content-type: 1.0.5 - cookie: 0.6.0 + cookie: 0.7.1 cookie-signature: 1.0.6 debug: 2.6.9 depd: 2.0.0 - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 1.2.0 + finalhandler: 1.3.1 fresh: 0.5.2 http-errors: 2.0.0 - merge-descriptors: 1.0.1 + merge-descriptors: 1.0.3 methods: 1.1.2 on-finished: 2.4.1 parseurl: 1.3.3 - path-to-regexp: 0.1.7 + path-to-regexp: 0.1.10 proxy-addr: 2.0.7 - qs: 6.11.0 + qs: 6.13.0 range-parser: 1.2.1 safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 + send: 0.19.0 + serve-static: 1.16.2 setprototypeof: 1.2.0 statuses: 2.0.1 type-is: 1.6.18 @@ -22566,10 +22708,10 @@ snapshots: dependencies: to-regex-range: 5.0.1 - finalhandler@1.2.0: + finalhandler@1.3.1: dependencies: debug: 2.6.9 - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 @@ -25652,7 +25794,7 @@ snapshots: mensch@0.3.4: {} - merge-descriptors@1.0.1: {} + merge-descriptors@1.0.3: {} merge-stream@2.0.0: {} @@ -26184,13 +26326,13 @@ snapshots: '@types/whatwg-url': 11.0.5 whatwg-url: 13.0.0 - mongodb@6.8.0(@mongodb-js/zstd@1.2.0)(socks@2.8.3): + mongodb@6.9.0(@mongodb-js/zstd@1.2.2)(socks@2.8.3): dependencies: '@mongodb-js/saslprep': 1.1.8 bson: 6.8.0 mongodb-connection-string-url: 3.0.1 optionalDependencies: - '@mongodb-js/zstd': 1.2.0 + '@mongodb-js/zstd': 1.2.2 socks: 2.8.3 monorel@0.4.2: @@ -26983,7 +27125,7 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 - path-to-regexp@0.1.7: {} + path-to-regexp@0.1.10: {} path-to-regexp@1.8.0: dependencies: @@ -28020,11 +28162,11 @@ snapshots: q@1.5.1: {} - qs@6.11.0: + qs@6.12.3: dependencies: side-channel: 1.0.6 - qs@6.12.3: + qs@6.13.0: dependencies: side-channel: 1.0.6 @@ -29212,7 +29354,7 @@ snapshots: semver@7.6.3: {} - send@0.18.0: + send@0.19.0: dependencies: debug: 2.6.9 depd: 2.0.0 @@ -29250,12 +29392,12 @@ snapshots: transitivePeerDependencies: - supports-color - serve-static@1.15.0: + serve-static@1.16.2: dependencies: - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.18.0 + send: 0.19.0 transitivePeerDependencies: - supports-color @@ -30870,7 +31012,7 @@ snapshots: compression: 1.7.4 connect-history-api-fallback: 2.0.0 default-gateway: 6.0.3 - express: 4.19.2 + express: 4.21.1 graceful-fs: 4.2.11 html-entities: 2.5.2 http-proxy-middleware: 2.0.6(@types/express@4.17.21) diff --git a/release.sh b/release.sh index 0d72517dd..582b3f08f 100755 --- a/release.sh +++ b/release.sh @@ -1,4 +1,4 @@ #!/usr/bin/env bash -pnpm run build-scripts docker ../../ -t console,rotor --push $@ +pnpm run build-scripts docker ../../ -t console,rotor,profiles --push $@ diff --git a/services/profiles/.gitignore b/services/profiles/.gitignore new file mode 100644 index 000000000..cdd602b1c --- /dev/null +++ b/services/profiles/.gitignore @@ -0,0 +1,3 @@ +/compiled/ +/dist/ +/__tests__/artifacts/ diff --git a/services/profiles/babel.config.js b/services/profiles/babel.config.js new file mode 100644 index 000000000..e2e42dc19 --- /dev/null +++ b/services/profiles/babel.config.js @@ -0,0 +1,8 @@ +module.exports = { + presets: [ + "@babel/preset-env", + "@babel/preset-typescript", + ["@babel/preset-react", { importSource: "react", runtime: "automatic" }], + ], + plugins: [], +}; diff --git a/services/profiles/dist_package.json b/services/profiles/dist_package.json new file mode 100644 index 000000000..b268b71c5 --- /dev/null +++ b/services/profiles/dist_package.json @@ -0,0 +1,8 @@ +{ + "name": "@jitsu-internal/profile-builder", + "version": "0.0.0", + "dependencies": { + "isolated-vm": "5.0.1", + "@mongodb-js/zstd": "^1.2.2" + } +} diff --git a/services/profiles/jest.config.js b/services/profiles/jest.config.js new file mode 100644 index 000000000..de6e6d30e --- /dev/null +++ b/services/profiles/jest.config.js @@ -0,0 +1,9 @@ +/** @type {import("ts-jest").JestConfigWithTsJest} */ +module.exports = { + //preset: "ts-jest", + preset: "ts-jest", + testMatch: ["**/__tests__/**/*.test.ts"], + testEnvironment: "node", + runner: "jest-runner", + "setupFiles": ["./jest.setup.js"] +}; diff --git a/services/profiles/jest.setup.js b/services/profiles/jest.setup.js new file mode 100644 index 000000000..fa6ee7ee1 --- /dev/null +++ b/services/profiles/jest.setup.js @@ -0,0 +1,8 @@ +process.env.JUAVA_LOG_LEVEL = 'debug'; +global.console = { + log: message => process.stdout.write(message + '\n'), + error: console.error, + warn: console.warn, + info: console.info, + debug: console.debug, +}; diff --git a/services/profiles/package.json b/services/profiles/package.json new file mode 100644 index 000000000..d1cce78fd --- /dev/null +++ b/services/profiles/package.json @@ -0,0 +1,67 @@ +{ + "name": "@jitsu-internal/profile-builder", + "version": "0.0.0", + "description": "", + "author": "Jitsu Dev Team ", + "publishConfig": { + "access": "public" + }, + "license": "MIT", + "private": false, + "scripts": { + "compile": "rm -rf ./dist && tsc -p . ", + "bundle_extenals": "cp dist_package.json ./dist/package.json && cd ./dist/ && npm install", + "build": "pnpm compile && webpack && pnpm bundle_extenals", + "start": "dotenv -e ../../.env.local -- node dist/main.js", + "profiles:dev": "dotenv -e ../../.env.local -- nodemon --watch \"src/**\" --ext \"ts,json,tsx\" --exec \"ts-node src/index.ts\"", + "profiles:profile": "dotenv -e ../../.env.local -- nodemon --watch \"src/**\" --ext \"ts,json,tsx\" --exec \"ts-node-dev --inspect -- src/index.ts\"" + }, + "dependencies": { + "mongodb": "^6.9.0", + "isolated-vm": "5.0.1", + "@jitsu/core-functions": "workspace:*", + "@jitsu/functions-lib": "workspace:*", + "juava": "workspace:*", + "node-cache": "^5.1.2", + "p-queue": "^6.6.2", + "express": "^4.21.1", + "pg": "^8.12.0", + "pg-cursor": "^2.11.0", + "prom-client": "^15.1.3", + "tslib": "^2.6.3", + "@clickhouse/client": "^1.6.0" + }, + "devDependencies": { + "@babel/preset-env": "^7.25.2", + "@babel/preset-react": "^7.24.7", + "@babel/preset-typescript": "^7.24.7", + "@jitsu/protocols": "workspace:*", + "@types/jest": "^29.5.11", + "@types/lodash": "^4.17.7", + "@types/node": "^18.15.3", + "@types/pg": "^8.11.6", + "@types/pg-cursor": "^2.7.2", + "@types/web": "^0.0.152", + "@types/webpack": "^5.28.5", + "@types/express": "^4.17.21", + "@webpack-cli/generators": "^3.0.7", + "babel-loader": "^9.1.3", + "clean-webpack-plugin": "^4.0.0", + "copy-webpack-plugin": "^12.0.2", + "declaration-bundler-webpack-plugin": "^1.0.3", + "dotenv-cli": "^7.4.2", + "jest": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/types": "^29.6.3", + "lodash": "^4.17.21", + "node-loader": "^2.0.0", + "nodemon": "^3.1.4", + "ts-jest": "^29.2.3", + "ts-loader": "^9.4.2", + "ts-node": "^10.9.2", + "ts-node-dev": "^2.0.0", + "typescript": "^5.5.4", + "webpack": "^5.93.0", + "webpack-cli": "^5.1.4" + } +} diff --git a/services/profiles/src/builder.ts b/services/profiles/src/builder.ts new file mode 100644 index 000000000..bf08078f7 --- /dev/null +++ b/services/profiles/src/builder.ts @@ -0,0 +1,366 @@ +import { + createClient, + ProfileBuilder, + mongodb, + ProfilesConfig, + pbEnsureMongoCollection, + profilePartitionIdColumn, + profilePartitionsCount, + EventsStore, + bulkerDestination, + FunctionContext, + FunctionChainContext, +} from "@jitsu/core-functions"; +import { MongoClient, ObjectId } from "mongodb"; +import { db, ProfileBuilderState } from "./lib/db"; +import { getLog, getSingleton, hash, LogFactory, parseNumber, requireDefined, stopwatch } from "juava"; +import PQueue from "p-queue"; +import NodeCache from "node-cache"; +import { functionsStore } from "./lib/repositories"; +import { buildFunctionChain, FuncChain, runChain } from "./lib/functions-chain"; +import { FullContext } from "@jitsu/protocols/functions"; +import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; +import { ProfileUser } from "./lib/profiles-udf-wrapper"; + +const bulkerBase = requireDefined(process.env.BULKER_URL, "env BULKER_URL is not defined"); +const bulkerAuthKey = requireDefined(process.env.BULKER_AUTH_KEY, "env BULKER_AUTH_KEY is not defined"); + +const concurrency = parseNumber(process.env.CONCURRENCY, 10); +const fetchTimeoutMs = parseNumber(process.env.FETCH_TIMEOUT_MS, 2000); + +const instanceIndex = process.env.INSTANCE_INDEX ? parseInt(process.env.INSTANCE_INDEX, 10) : 0; +const totalInstances = process.env.INSTANCES_COUNT ? parseInt(process.env.INSTANCES_COUNT, 10) : 1; +const partitionsRange = selectPartitions(profilePartitionsCount, totalInstances, instanceIndex); + +//cache function chains for 1m +const funcsChainTTL = 60; +const funcsChainCache = new NodeCache({ stdTTL: funcsChainTTL, checkperiod: 60, useClones: false }); + +const funcCtx: FunctionContext = { + function: { + id: "profile-builder", + type: "profile-builder", + }, + props: {}, +}; + +console.log( + `Starting profile builder with instance index ${instanceIndex} of ${totalInstances} and partitions range ${partitionsRange}` +); + +export type ProfileBuilderRunner = { + start: () => Promise; + close: () => Promise; + version: () => number; + state: () => ProfileBuilderState; +}; + +export async function profileBuilder( + workspaceId: string, + profileBuilder: ProfileBuilder, + eventsLogger: EventsStore +): Promise { + const pbLongId = `${workspaceId}-${profileBuilder.id}-v${profileBuilder.version}`; + const log = getLog(`pb-${pbLongId}`); + let state: ProfileBuilderState = { + profileBuilderId: profileBuilder.id, + profileBuilderVersion: profileBuilder.version, + startedAt: new Date(), + updatedAt: new Date(), + lastTimestamp: undefined, + instanceIndex, + totalInstances, + processedUsers: 0, + errorUsers: 0, + totalUsers: 0, + speed: 0, + }; + let closed = false; + let closeResolve; + const closePromise = new Promise((resolve, reject) => { + closeResolve = resolve; + }); + + const funcStore = await functionsStore.get(); + + const cacheKey = pbLongId; + let funcChain: FuncChain | undefined = funcsChainCache.get(cacheKey); + if (!funcChain) { + log.atInfo().log(`Refreshing function chain`); + funcChain = buildFunctionChain(profileBuilder, funcStore, eventsLogger, fetchTimeoutMs); + funcsChainCache.set(cacheKey, funcChain); + } + + const config = ProfilesConfig.parse(profileBuilder.intermediateStorageCredentials || {}); + + config.eventsDatabase = `profiles`; + config.eventsCollectionName = `profiles-raw-${workspaceId}-${profileBuilder.id}`; + + const mongoSingleton = config.mongoUrl + ? getSingleton( + `profiles-mongodb-${profileBuilder.id}-${hash("md5", config.mongoUrl)}`, + () => { + log.atInfo().log(`Connecting to MongoDB server.`); + const cl = createClient({ + mongoUrl: config.mongoUrl, + } as ProfilesConfig); + log.atInfo().log(`Connected successfully to MongoDB server.`); + return cl; + }, + { + optional: true, + ttlSec: 60 * 60 * 24, + cleanupFunc: client => client.close(), + } + ) + : mongodb; + + const mongo = await mongoSingleton.waitInit(); + + await pbEnsureMongoCollection(mongo, config.eventsDatabase, config.eventsCollectionName, config.profileWindowDays, [ + profilePartitionIdColumn, + "userId", + ]); + + const loadedState = await db + .pgHelper() + .getProfileBuilderState(profileBuilder.id, profileBuilder.version, totalInstances, instanceIndex); + + state.lastTimestamp = loadedState?.lastTimestamp; + + log.atInfo().log(`Last timestamp: ${state.lastTimestamp}`); + + const queue = new PQueue({ concurrency }); + + const pb = { + start: async () => { + log.atInfo().log("Started"); + while (!closed) { + const started = Date.now(); + try { + const dateUpperBound = new Date(); + dateUpperBound.setSeconds(dateUpperBound.getSeconds() - 1); + const users = await getUsersHavingEventsSince(mongo, config, dateUpperBound, state.lastTimestamp); + if (users.length > 0) { + funcChain?.context.log.info( + funcCtx, + `Found ${users.length} users to process since: ${state.lastTimestamp}` + ); + state.totalUsers = users.length; + state.processedUsers = 0; + state.errorUsers = 0; + state.speed = 0; + state.lastTimestamp = dateUpperBound; + + for (let i = 0; i < users.length; i++) { + if (i % 1000) { + await db.pgHelper().updateProfileBuilderState(state); + } + const user = users[i]; + log.atInfo().log(`Processing user ${i + 1}/${users.length}: ${user}`); + await queue.onEmpty(); + queue.add(async () => + processUser(profileBuilder, state, funcChain!, mongo, log, config, user, dateUpperBound) + ); + } + await queue.onIdle(); + state.speed = users.length / ((Date.now() - started) / 1000); + await db.pgHelper().updateProfileBuilderState(state); + } else { + funcChain?.context.log.debug(funcCtx, `No users to process since: ${state.lastTimestamp}`); + } + } catch (e) { + log.atError().withCause(e).log(`Error while running profile builder`); + } + const waitMs = config.runPeriodSec * 1000 - (Date.now() - started); + if (waitMs > 0) { + await new Promise(resolve => setTimeout(resolve, waitMs)); + } + } + closeResolve(); + }, + close: async () => { + closed = true; + await Promise.all([queue.onIdle(), closePromise]); + log.atInfo().log("Closed"); + }, + version: () => profileBuilder.version, + state: () => state, + }; + + setImmediate(pb.start); + + return pb; +} + +async function processUser( + profileBuilder: ProfileBuilder, + state: ProfileBuilderState, + funcChain: FuncChain, + mongo: MongoClient, + log: LogFactory, + config: ProfilesConfig, + userId: string, + endTimestamp: Date +) { + const ms = stopwatch(); + try { + const events = await getUserEvents(mongo, config, userId, endTimestamp); + const eventsArray = await events.toArray(); + const user = { traits: {}, userId } as ProfileUser; + eventsArray + .filter(e => e.type === "identify") + .forEach(e => { + if (e.anonymousId) { + user.anonymousId = e.anonymousId; + } + if (e.traits) { + Object.assign(user.traits, e.traits); + } + }); + const result = await runChain(funcChain, eventsArray, user); + if (result) { + const profile = { + user_id: userId, + traits: user.traits, + custom_properties: result.properties, + updated_at: new Date(), + }; + await sendToBulker(profileBuilder, profile, funcChain.context); + funcChain.context.log.info( + funcCtx, + `User ${userId} processed in ${ms.elapsedMs()}ms (events: ${eventsArray.length}). Result: ${JSON.stringify( + profile + )}` + ); + } else { + funcChain.context.log.warn( + funcCtx, + `No profile result for user ${userId}. processed in ${ms.elapsedMs()}ms (events: ${eventsArray.length}).` + ); + } + state.processedUsers++; + } catch (e: any) { + state.errorUsers++; + funcChain.context.log.error(funcCtx, `Error while processing user ${userId}: ${e.message}`); + } +} + +async function sendToBulker(profileBuilder: ProfileBuilder, profile: any, context: FunctionChainContext) { + const ctx: FullContext = { + log: { + error: (message: string, ...args: any[]) => { + context.log.error(funcCtx, message, ...args); + }, + info: (message: string, ...args: any[]) => { + context.log.info(funcCtx, message, ...args); + }, + warn: (message: string, ...args: any[]) => { + context.log.warn(funcCtx, message, ...args); + }, + debug: (message: string, ...args: any[]) => { + context.log.debug(funcCtx, message, ...args); + }, + }, + fetch: context.fetch, + store: context.store, + props: { + bulkerEndpoint: bulkerBase, + destinationId: profileBuilder.id, + authToken: bulkerAuthKey, + dataLayout: "passthrough", + }, + connection: { + id: profileBuilder.id, + }, + destination: { + id: profileBuilder.destinationId, + type: "", + hash: "", + }, + source: { + id: "", + type: "s2s", + }, + headers: {}, + workspace: { id: profileBuilder.workspaceId }, + }; + await bulkerDestination.default( + { [bulkerDestination.TableNameParameter]: "profiles", ...profile } as unknown as AnalyticsServerEvent, + ctx + ); +} + +async function getUserEvents(mongo: MongoClient, config: ProfilesConfig, userId: string, endTimestamp: Date) { + return mongo + .db(config.eventsDatabase) + .collection(config.eventsCollectionName) + .find({ + [profilePartitionIdColumn]: { $gte: partitionsRange[0], $lte: partitionsRange[1] }, + userId: userId, + _id: { $lt: new ObjectId(Math.floor(endTimestamp.getTime() / 1000).toString(16) + "0000000000000000") }, + }); +} + +async function getUsersHavingEventsSince( + mongo: MongoClient, + config: ProfilesConfig, + dateUpperBound: Date, + lastTimestamp?: Date +) { + let dateFilter: any = { + _id: { $lt: new ObjectId(Math.floor(dateUpperBound.getTime() / 1000).toString(16) + "0000000000000000") }, + }; + if (lastTimestamp) { + dateFilter = { + $and: [ + { + _id: { $gte: new ObjectId(Math.floor(lastTimestamp.getTime() / 1000).toString(16) + "0000000000000000") }, + }, + dateFilter, + ], + }; + } + return await mongo + .db(config.eventsDatabase) + .collection(config.eventsCollectionName) + .aggregate([ + { + $match: { + ...dateFilter, + [profilePartitionIdColumn]: { $gte: partitionsRange[0], $lte: partitionsRange[1] }, + }, + }, + { + $group: { + _id: "$userId", + }, + }, + ]) + .map(e => e._id as string) + .toArray(); +} + +function selectPartitions(totalPartitions: number, totalInstances: number, instanceIndex: number): [number, number] { + const partitionsPerInstance = Math.floor(totalPartitions / totalInstances); + const remainderPartitions = totalPartitions % totalInstances; + + const ranges: Array<{ instance: number; partitionRange: [number, number] }> = []; + let startPartition = 0; + + for (let i = 0; i < totalInstances; i++) { + // Each instance gets at least `partitionsPerInstance` partitions + // If there are remaining partitions, distribute one extra to some instances + const additionalPartition = i < remainderPartitions ? 1 : 0; + const endPartition = startPartition + partitionsPerInstance + additionalPartition - 1; + + ranges.push({ + instance: i, + partitionRange: [startPartition, endPartition], + }); + + startPartition = endPartition + 1; + } + + return ranges[instanceIndex].partitionRange; +} diff --git a/services/profiles/src/index.ts b/services/profiles/src/index.ts new file mode 100644 index 000000000..72c06209a --- /dev/null +++ b/services/profiles/src/index.ts @@ -0,0 +1,270 @@ +import { checkHash, checkRawToken, disableService, getLog, setServerJsonFormat } from "juava"; +import express from "express"; +import Prometheus from "prom-client"; +import { Server } from "node:net"; +import { getHeapSnapshot } from "node:v8"; +import { functionsStore, workspaceStore } from "./lib/repositories"; +import { db } from "./lib/db"; +import { profileBuilder, ProfileBuilderRunner } from "./builder"; +import { createClickhouseLogger, DummyEventsStore, EventsStore, mongodb } from "@jitsu/core-functions"; + +disableService("mongodb"); + +const log = getLog("profile-builder"); + +setServerJsonFormat(process.env.LOG_FORMAT === "json"); + +const http = express(); +http.use(express.json({ limit: "20mb" })); +http.use(express.urlencoded({ limit: "20mb" })); + +const metricsHttp = express(); + +const httpPort = process.env.HTTP_PORT || process.env.PORT || 3402; +const metricsPort = process.env.METRICS_PORT || 9091; + +let started = false; +let closed = false; + +const profileBuilders: Map = new Map(); +const repoUpdateInterval = process.env.REPOSITORY_REFRESH_PERIOD_SEC + ? parseInt(process.env.REPOSITORY_REFRESH_PERIOD_SEC) * 1000 + : 2000; + +async function main() { + const errorTypes = ["unhandledRejection", "uncaughtException"]; + const signalTraps = ["SIGTERM", "SIGINT", "SIGUSR2"]; + + errorTypes.forEach(type => { + process.on(type, err => { + log.atError().withCause(err).log(`process.on ${type}`); + }); + }); + + process.on("exit", code => { + log.atInfo().log(`Process exited with code ${code}`); + }); + + await mongodb.waitInit(); + let eventsLogger: EventsStore = DummyEventsStore; + if (process.env.CLICKHOUSE_HOST || process.env.CLICKHOUSE_URL) { + eventsLogger = createClickhouseLogger(); + } + + let httpServer: Server; + let metricsServer: Server | undefined; + + const gracefulShutdown = async () => { + closed = true; + + for (const [pbId, profileBuilder] of profileBuilders) { + await profileBuilder + .close() + .catch(e => + log.atError().withCause(e).log(`Failed to shutdown profile builder for: ${pbId} v: ${profileBuilder.version}`) + ); + } + + if (eventsLogger) { + eventsLogger.close(); + } + if (httpServer) { + httpServer.close(); + } + + workspaceStore.stop(); + functionsStore.stop(); + await db.pgPool.close(); + + const extraDelay = process.env.SHUTDOWN_EXTRA_DELAY_SEC + ? 1000 * parseInt(process.env.SHUTDOWN_EXTRA_DELAY_SEC) + : 5000; + if (extraDelay > 0) { + log.atInfo().log(`Giving extra ${extraDelay / 1000}s. to flush logs and scrape metrics...`); + //extra time to flush logs + setTimeout(() => { + if (metricsServer) { + metricsServer.close(); + } + process.exit(started ? 0 : 1); + }, extraDelay); + } + }; + + signalTraps.forEach(type => { + process.once(type, () => { + gracefulShutdown(); + }); + }); + + try { + Prometheus.collectDefaultMetrics(); + await db.pgPool.waitInit(); + + const ws = await workspaceStore.get(); + if (!ws.enabled) { + log.atError().log("Connection store is not configured. Profile Builder will not work"); + process.exit(1); + } + const funcStore = await functionsStore.get(); + if (!funcStore.enabled) { + log.atError().log("Functions store is not configured. Profile Builder will not work"); + process.exit(1); + } + + metricsServer = initMetricsServer(); + } catch (e) { + log.atError().withCause(e).log("Failed to start"); + process.exit(1); + } + + httpServer = initHTTP(); + + refreshLoop(eventsLogger); +} + +function refreshLoop(eventsLogger: EventsStore) { + (async () => { + while (!closed) { + const started = Date.now(); + const ws = workspaceStore.getCurrent()!; + const actualProfileBuilders = new Set(); + for (const [workspaceId, workspace] of Object.entries(ws.getAll())) { + for (const pb of workspace.profileBuilders) { + try { + const currentPb = profileBuilders.get(pb.id); + if (currentPb) { + if (pb.version != currentPb.version()) { + await currentPb.close(); + profileBuilders.delete(pb.id); + profileBuilders.set(pb.id, await profileBuilder(workspaceId, pb, eventsLogger)); + } + } else { + profileBuilders.set(pb.id, await profileBuilder(workspaceId, pb, eventsLogger)); + } + actualProfileBuilders.add(pb.id); + } catch (e) { + log.atError().withCause(e).log(`Failed to start profile builder for: ${pb.id} v: ${pb.version}`); + } + } + } + for (const [pbId, pb] of profileBuilders) { + if (!actualProfileBuilders.has(pbId)) { + try { + await pb.close(); + profileBuilders.delete(pbId); + } catch (e) { + log.atError().withCause(e).log(`Failed to shutdown profile builder for: ${pbId} v: ${pb.version}`); + } + } + } + const waitMs = repoUpdateInterval - (Date.now() - started); + if (waitMs > 0) { + await new Promise(resolve => setTimeout(resolve, repoUpdateInterval)); + } + } + })().catch(async e => { + log.atError().withCause(e).log("Failed"); + process.kill(process.pid, "SIGTERM"); + }); +} + +function initHTTP() { + http.use((req, res, next) => { + if (req.path === "/health" || req.path === "/version") { + return next(); + } + let token = req.headers.authorization || ""; + if (token) { + if (token.startsWith("Bearer ")) { + token = token.substring("Bearer ".length); + } else { + res.status(401).json({ error: "Authorization header with Bearer token is required" }); + return; + } + } + if (!checkAuth(token)) { + if (token) { + res.status(401).json({ error: `Invalid token: ${token}` }); + } else { + res.status(401).json({ error: "Authorization header with Bearer token is required" }); + } + return; + } + next(); + }); + http.get("/health", (req, res) => { + res.json({ + status: "pass", + workspaceStore: { + enabled: workspaceStore.getCurrent()?.enabled || "loading", + status: workspaceStore.status(), + lastUpdated: workspaceStore.lastRefresh(), + lastModified: workspaceStore.lastModified(), + }, + functionsStore: { + enabled: functionsStore.getCurrent()?.enabled || "loading", + status: functionsStore.status(), + lastUpdated: functionsStore.lastRefresh(), + lastModified: functionsStore.lastModified(), + }, + }); + }); + http.get("/wtfheap", async (req, res) => { + const snapshot = getHeapSnapshot(); + log.atInfo().log("snapshot"); + snapshot.pipe(res); + log.atInfo().log("snapshot2"); + }); + const httpServer = http.listen(httpPort, () => { + log.atInfo().log(`Listening on port ${httpPort}`); + started = true; + }); + httpServer.on("error", e => { + log.atError().withCause(e).log("Failed to start http server. Exiting..."); + process.kill(process.pid, "SIGTERM"); + }); + return httpServer; +} + +function initMetricsServer() { + metricsHttp.get("/metrics", async (req, res) => { + res.set("Content-Type", Prometheus.register.contentType); + const result = await Prometheus.register.metrics(); + res.end(result); + }); + const metricsServer = metricsHttp.listen(metricsPort, () => { + log.atInfo().log(`Listening metrics on port ${metricsPort}`); + }); + metricsServer.on("error", e => { + log.atError().withCause(e).log("Failed to start metrics server"); + }); + return metricsServer; +} + +function checkAuth(token: string): boolean { + let tokens: string[] = []; + let checkFunction: (token: string, secret: string) => boolean = () => false; + if (process.env.ROTOR_AUTH_TOKENS) { + tokens = process.env.ROTOR_AUTH_TOKENS.split(","); + checkFunction = checkHash; + } else if (process.env.ROTOR_RAW_AUTH_TOKENS) { + tokens = process.env.ROTOR_RAW_AUTH_TOKENS.split(","); + checkFunction = checkRawToken; + } else { + log.atWarn().log("No auth tokens are configured. Profile Builder is open for everyone."); + return true; + } + if (tokens.length > 0) { + for (const tokenHashOrPlain of tokens) { + if (checkFunction(tokenHashOrPlain, token)) { + return true; + } + } + } + return false; +} + +main(); + +export {}; diff --git a/services/profiles/src/lib/db.ts b/services/profiles/src/lib/db.ts new file mode 100644 index 000000000..116a3621a --- /dev/null +++ b/services/profiles/src/lib/db.ts @@ -0,0 +1,220 @@ +import { Pool, PoolClient } from "pg"; +import Cursor from "pg-cursor"; +import { getSingleton, namedParameters, newError, requireDefined, stopwatch, getLog } from "juava"; + +export type Handler = (row: Record) => Promise | void; + +//we will need to support named params in future +export type ParamValues = any[] | Record; +const log = getLog("db"); + +export type ProfileBuilderState = { + profileBuilderId: string; + profileBuilderVersion: number; + instanceIndex: number; + totalInstances: number; + startedAt: Date; + updatedAt?: Date; + lastTimestamp?: Date; + processedUsers: number; + errorUsers: number; + totalUsers: number; + speed: number; +}; + +type PgHelper = { + getProfileBuilderState( + profileBuilderId: string, + profileBuilderVersion: number, + totalInstances: number, + instanceIndex: number + ): Promise; + updateProfileBuilderState(state: ProfileBuilderState); + streamQuery(query: string, values?: ParamValues | Handler, handler?: Handler | undefined): Promise<{ rows: number }>; +}; + +const pgHelper: PgHelper = { + async getProfileBuilderState( + profileBuilderId: string, + profileBuilderVersion: number, + totalInstances: number, + instanceIndex: number + ): Promise { + let rows = await db.pgPool().query( + `select * from newjitsu."ProfileBuilderState" where + "profileBuilderId" = $1::text and + "profileBuilderVersion" = $2::integer and + "totalInstances" = $3::integer and + "instanceIndex" = $4::integer`, + [profileBuilderId, profileBuilderVersion, totalInstances, instanceIndex] + ); + if (rows.rowCount) { + return rows.rows[0]; + } + rows = await db.pgPool().query( + `select "profileBuilderId", "profileBuilderVersion", "totalInstances", count("instanceIndex"), min("lastTimestamp") as lastTimestamp +from newjitsu."ProfileBuilderState" where + "profileBuilderId" = $1::text and + "profileBuilderVersion" = $2::integer + group by "profileBuilderId", "profileBuilderVersion", "totalInstances" + having "totalInstances"=count("instanceIndex") + order by min("lastTimestamp") desc`, + [profileBuilderId, profileBuilderVersion] + ); + if (rows.rowCount) { + const row = rows.rows[0]; + return { + ...row, + instanceIndex: -1, + startedAt: new Date(), + updatedAt: new Date(), + }; + } + return undefined; + }, + async updateProfileBuilderState(state: ProfileBuilderState) { + state.updatedAt = new Date(); + await db.pgPool().query( + ` +insert into newjitsu."ProfileBuilderState" as p ("profileBuilderId", "profileBuilderVersion","instanceIndex", +"totalInstances", "startedAt", "updatedAt", "lastTimestamp", "processedUsers", "errorUsers", "totalUsers", "speed") +values ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11) +ON CONFLICT ON CONSTRAINT "ProfileBuilderState_pkey" DO UPDATE SET + "startedAt" = $5::timestamp, + "updatedAt" = $6::timestamp, + "lastTimestamp" = $7::timestamp, + "processedUsers" = $8::integer, + "errorUsers" = $9::integer, + "totalUsers" = $10::integer, + "speed" = $11::integer`, + [ + state.profileBuilderId, + state.profileBuilderVersion, + state.instanceIndex, + state.totalInstances, + state.startedAt ?? new Date(), + state.updatedAt ?? new Date(), + state.lastTimestamp, + state.processedUsers ?? 0, + state.errorUsers ?? 0, + state.totalUsers ?? 0, + state.speed ?? 0, + ] + ); + }, + async streamQuery( + query: string, + _values: ParamValues | Handler, + _handler: Handler | undefined + ): Promise<{ rows: number }> { + const values = typeof _values === "function" ? undefined : _values; + const handler = + typeof _values === "function" + ? _values + : requireDefined( + _handler, + "handler is not defined. It should be passed as second 3rd argument of streamQuery()" + ); + const { query: processedQuery, values: processedParams } = namedParameters(query, values || []); + const sw = stopwatch(); + let totalRows = 0; + let cursor: Cursor | undefined = undefined; + const client: PoolClient = await db.pgPool().connect(); + try { + cursor = client.query(new Cursor(processedQuery, processedParams)); + let rows = await cursor.read(100); + while (rows.length > 0) { + for (let i = 0; i < rows.length; i++) { + await handler(rows[i]); + totalRows++; + } + rows = await cursor.read(100); + } + let queryResult; + + queryResult = await db.pgPool().query(processedQuery, processedParams); + } catch (e) { + log + .atError() + .withCause(e) + .log("Error executing query: \n" + processedQuery + "\n with params: " + JSON.stringify(processedParams)); + throw newError("Error executing the query. See query in logs", e); + } finally { + if (cursor) { + await cursor.close(() => { + client.release(); + }); + } else if (client) { + client.release(); + } + } + + log.atDebug().log(`Query executed in ${sw.elapsedMs()}ms: ${processedQuery}${processedParams}`); + + return { rows: totalRows }; + }, +}; + +export const db = { + pgPool: getSingleton("pg", createPg), + pgHelper: () => pgHelper, +} as const; + +export type DatabaseConnection = typeof db; + +export type PgSSLMode = "disable" | "prefer" | "require" | "no-verify"; + +export function createPg(): Pool { + const connectionUrl = getApplicationDatabaseUrl(); + const parsedUrl = new URL(connectionUrl); + const schema = parsedUrl.searchParams.get("schema"); + if (schema !== "newjitsu") { + const tBorder = `┌─────────────────────────────────────────────────────────────────────┐`; + const bBorder = `└─────────────────────────────────────────────────────────────────────┘`; + const msg = [ + "\n", + tBorder, + `│ Jitsu requires to connect to the database with "newjitsu" schema`.padEnd(tBorder.length - 2, " ") + "│", + bBorder, + ].join("\n"); + log.atError().log(msg); + throw new Error(`Invalid schema ${schema} in database connection URL. Expected 'newjitsu' schema.`); + } + const sslMode = parsedUrl.searchParams.get("sslmode") || ("disable" as PgSSLMode); + if (sslMode === "require" || sslMode === "prefer") { + throw new Error(`sslmode=${sslMode} is not supported`); + } + + const pool = new Pool({ + max: 20, + min: 3, + idleTimeoutMillis: 600000, + connectionString: requireDefined(process.env.DATABASE_URL, "env.DATABASE_URL is not defined"), + ssl: sslMode === "no-verify" ? { rejectUnauthorized: false } : undefined, + application_name: (parsedUrl.searchParams.get("application_name") || "console") + "-raw-pg", + }); + pool.on("connect", async client => { + log + .atInfo() + .log( + `Connecting new client ${connectionUrl}. Pool stat: idle=${pool.idleCount}, waiting=${pool.waitingCount}, total=${pool.totalCount}` + + (schema ? `. Default schema: ${schema}` : "") + ); + //this is commented on purpose, it won't work for pgbouncer in transaction mode https://www.pgbouncer.org/features.html + //let's leave it commented for information purposes + // if (schema) { + // await client.query(`SET search_path TO "${schema}"`); + // } + }); + pool.on("error", error => { + log.atError().withCause(error).log("Pool error"); + }); + return pool; +} + +export function getApplicationDatabaseUrl(): string { + return requireDefined( + process.env.APP_DATABASE_URL || process.env.DATABASE_URL, + "neither env.DATABASE_URL, nor env.APP_DATABASE_URL is not defined" + ); +} diff --git a/services/profiles/src/lib/functions-chain.ts b/services/profiles/src/lib/functions-chain.ts new file mode 100644 index 000000000..4042e0914 --- /dev/null +++ b/services/profiles/src/lib/functions-chain.ts @@ -0,0 +1,174 @@ +import { + createMongoStore, + EntityStore, + EventsStore, + FunctionChainContext, + FunctionConfig, + FunctionContext, + makeFetch, + makeLog, + MetricsMeta, + mongodb, + ProfileBuilder, +} from "@jitsu/core-functions"; + +import { getLog, newError } from "juava"; +import NodeCache from "node-cache"; +import isEqual from "lodash/isEqual"; +import { ProfileFunctionWrapper, ProfileUser, UDFWrapper } from "./profiles-udf-wrapper"; +import { ProfileResult } from "@jitsu/protocols/profile"; + +export type Func = { + id: string; + exec: ProfileFunctionWrapper; + context: FunctionContext; + hash?: string; +}; + +export type FuncChain = { + context: FunctionChainContext; + functions: Func[]; +}; + +const log = getLog("functions-chain"); + +//cache compiled udfs for 10min +const udfTTL = 60 * 10; +const udfCache = new NodeCache({ stdTTL: udfTTL, checkperiod: 60, useClones: false }); +udfCache.on("del", (key, value) => { + log.atInfo().log(`UDF ${key} deleted from cache`); + value.wrapper?.close(); +}); + +export type FunctionExecRes = { + receivedAt?: any; + eventIndex: number; + event?: any; + metricsMeta?: MetricsMeta; + functionId: string; + error?: any; + dropped?: boolean; + ms: number; +}; + +export type FunctionExecLog = FunctionExecRes[]; + +export function buildFunctionChain( + profileBuilder: ProfileBuilder, + funcStore: EntityStore, + eventsLogger: EventsStore, + fetchTimeoutMs: number = 2000 +): FuncChain { + const pbLongId = `${profileBuilder.workspaceId}-${profileBuilder.id}-v${profileBuilder.version}`; + const store = createMongoStore(profileBuilder.workspaceId, mongodb(), false, true); + + const chainCtx: FunctionChainContext = { + fetch: makeFetch(profileBuilder.id, eventsLogger, "info", fetchTimeoutMs), + log: makeLog(profileBuilder.id, eventsLogger, true), + store, + }; + + const udfFuncs: FunctionConfig[] = (profileBuilder.functions || []).map(f => { + const functionId = f.functionId; + const userFunctionObj = funcStore.getObject(functionId); + if (!userFunctionObj || userFunctionObj.workspaceId !== profileBuilder.workspaceId) { + throw newError(`Function ${functionId} not found in workspace: ${profileBuilder.workspaceId}`); + } + return userFunctionObj; + }); + if (udfFuncs.length === 0) { + throw newError(`No UDF functions found for profile builder ${pbLongId}`); + } + let cached: any; + let hash: any[]; + hash = udfFuncs.map(f => f.codeHash); + hash.push(profileBuilder.updatedAt); + cached = udfCache.get(pbLongId); + if (!cached || !isEqual(cached?.hash, hash)) { + log.atInfo().log(`UDF for connection ${pbLongId} changed (hash ${hash} != ${cached?.hash}). Reloading`); + const wrapper = UDFWrapper( + pbLongId, + chainCtx, + { + function: { + id: "profile-builder", + type: "udf", + debugTill: profileBuilder.debugTill ? new Date(profileBuilder.debugTill) : undefined, + }, + props: {}, + }, + udfFuncs.map(f => ({ id: f.id, name: f.name, code: f.code })) + ); + const oldWrapper = cached?.wrapper; + if (oldWrapper) { + setTimeout(() => { + oldWrapper.close(); + }, 10000); + } + cached = { wrapper, hash }; + udfCache.set(pbLongId, cached); + } + udfCache.ttl(pbLongId, udfTTL); + + const udfPipelineFunc = (chainCtx: FunctionChainContext, funcCtx: FunctionContext): ProfileFunctionWrapper => { + return async (ctx, events, user) => { + try { + return await cached.wrapper.userFunction(ctx, events, user); + } catch (e: any) { + if ((e?.message ?? "").includes("Isolate is disposed")) { + // due to async nature other 'thread' could already replace this isolate. So check it + if (cached.wrapper.isDisposed()) { + log.atError().log(`UDF for pb:${pbLongId} VM was disposed. Reloading`); + const wrapper = UDFWrapper( + pbLongId, + chainCtx, + funcCtx, + udfFuncs.map(f => ({ id: f.id, name: f.name, code: f.code })) + ); + cached = { wrapper, hash }; + udfCache.set(pbLongId, cached); + return wrapper.userFunction(ctx, events, user); + } else { + // we have alive isolate now. try again + return await cached.wrapper.userFunction(ctx, events, user); + } + } else { + throw e; + } + } + }; + }; + + const funcCtx = { + function: { + id: "profile-builder", + type: "udf", + debugTill: profileBuilder.debugTill ? new Date(profileBuilder.debugTill) : undefined, + }, + props: {}, + }; + + const funcs: Func[] = [ + { + id: "udf.PIPELINE", + context: funcCtx, + exec: udfPipelineFunc(chainCtx, funcCtx), + }, + ]; + + return { + functions: funcs, + context: chainCtx, + }; +} + +export async function runChain(chain: FuncChain, events: any[], user: ProfileUser): Promise { + const f = chain.functions[0]; + let result: ProfileResult | undefined = undefined; + try { + result = await f.exec(f.context, events, user); + } catch (err: any) { + throw newError(`Function execution failed`, err); + } + return result; +} diff --git a/services/profiles/src/lib/profiles-udf-wrapper.ts b/services/profiles/src/lib/profiles-udf-wrapper.ts new file mode 100644 index 000000000..cadca8d33 --- /dev/null +++ b/services/profiles/src/lib/profiles-udf-wrapper.ts @@ -0,0 +1,494 @@ +import { getLog, parseNumber, sanitize, stopwatch } from "juava"; +import { Isolate, ExternalCopy, Reference, Module, Context } from "isolated-vm"; +import { FetchOpts } from "@jitsu/protocols/functions"; +import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; + +import { FunctionChainContext, FunctionContext, cryptoCode } from "@jitsu/core-functions"; +import { RetryError } from "@jitsu/functions-lib"; +import { clearTimeout } from "node:timers"; +import * as crypto from "node:crypto"; +import { ProfileResult } from "@jitsu/protocols/profile"; +import { chainWrapperCode, functionsLibCode } from "./udf-wrapper-code"; + +const log = getLog("udf-wrapper"); + +export type ProfileUser = { + userId: string; + anonymousId: string; + traits: Record; +}; + +export type ProfileFunctionWrapper = ( + context: FunctionContext, + events: AnalyticsServerEvent[], + user: ProfileUser +) => Promise; + +export type UDFWrapperResult = { + userFunction: ProfileFunctionWrapper; + isDisposed: () => boolean; + close: () => void; +}; + +export type UDFFunction = { + id: string; + name: string; + code: string; +}; + +export const UDFWrapper = ( + profileBulderId: string, + chainCtx: FunctionChainContext, + funcCtx: FunctionContext, + functions: UDFFunction[] +): UDFWrapperResult => { + log.atInfo().log(`[CON:${profileBulderId}] Compiling ${functions.length} UDF functions`); + const sw = stopwatch(); + let isolate: Isolate; + let context: Context; + let refs: Reference[] = []; + try { + isolate = new Isolate({ memoryLimit: 512 }); + context = isolate.createContextSync(); + const jail = context.global; + + // This make the global object available in the context as 'global'. We use 'derefInto()' here + // because otherwise 'global' would actually be a Reference{} object in the new isolate. + jail.setSync("global", jail.derefInto()); + + jail.setSync("_jitsu_funcCtx", new ExternalCopy(funcCtx).copyInto({ release: true, transferIn: true })); + jail.setSync( + "_jitsu_log", + new ExternalCopy({ + info: makeReference(refs, chainCtx.log.info), + warn: makeReference(refs, chainCtx.log.warn), + debug: makeReference(refs, chainCtx.log.debug), + error: makeReference(refs, chainCtx.log.error), + }).copyInto({ release: true, transferIn: true }) + ); + jail.setSync("_jitsu_fetch_log_level", chainCtx.connectionOptions?.fetchLogLevel || "info"); + jail.setSync( + "_jitsu_crypto", + makeReference(refs, { + hash: crypto["hash"], + randomUUID: crypto.randomUUID, + randomBytes: crypto.randomBytes, + randomInt: crypto.randomInt, + }) + ); + jail.setSync("require", () => { + throw new Error("'require' is not supported. Please use 'import' instead"); + }); + jail.setSync( + "_jitsu_fetch", + makeReference(refs, async (url: string, opts?: FetchOpts, extra?: any) => { + const res = await chainCtx.fetch(url, opts, extra); + const headers: any = {}; + res.headers.forEach((v, k) => { + headers[k] = v; + }); + const text = await res.text(); + const j = { + status: res.status, + statusText: res.statusText, + type: res.type, + redirected: res.redirected, + body: text, + bodyUsed: true, + url: res.url, + ok: res.ok, + headers: headers, + }; + return JSON.stringify(j); + }) + ); + jail.setSync( + "_jitsu_store", + new ExternalCopy({ + get: makeReference(refs, async (key: string) => { + const res = await chainCtx.store.get(key); + return JSON.stringify(res); + }), + set: makeReference(refs, chainCtx.store.set), + del: makeReference(refs, chainCtx.store.del), + ttl: makeReference(refs, async (key: string) => { + return await chainCtx.store.ttl(key); + }), + }).copyInto({ release: true, transferIn: true }) + ); + + const functionsLib = isolate.compileModuleSync(functionsLibCode, { + filename: "functions-lib.js", + }); + functionsLib.instantiateSync(context, (specifier: string): Module => { + throw new Error(`import is not allowed: ${specifier}`); + }); + const cryptoLib = isolate.compileModuleSync(cryptoCode, { + filename: "crypto.js", + }); + cryptoLib.instantiateSync(context, (specifier: string): Module => { + throw new Error(`import is not allowed: ${specifier}`); + }); + const udfModules: Record = {}; + for (let i = 0; i < functions.length; i++) { + const sw = stopwatch(); + const f = functions[i]; + log.atDebug().log(`[CON:${profileBulderId}]: [f:${f.id}] Compiling UDF function '${f.name}'`); + const moduleName = "f_" + sanitize(f.name, "_") + "_" + f.id; + const udf = isolate.compileModuleSync(f.code, { filename: moduleName + ".js" }); + udf.instantiateSync(context, (specifier: string) => { + if (specifier === "@jitsu/functions-lib") { + return functionsLib; + } else if (specifier === "crypto") { + return cryptoLib; + } + throw new Error(`import is not allowed: ${specifier}`); + }); + udfModules[moduleName] = udf; + log + .atDebug() + .log(`[CON:${profileBulderId}] [f:${f.id}] UDF function '${f.name}' compiled in ${sw.elapsedPretty()}`); + } + + let code = chainWrapperCode.replace( + "//** @UDF_FUNCTIONS_IMPORT **//", + Object.keys(udfModules) + .map(m => `import * as ${m} from "${m}";\n`) + .join("") + ); + code = code.replace( + "//** @UDF_FUNCTIONS_CHAIN **//", + "chain = [" + + Object.keys(udfModules) + .map(m => { + const id = m.split("_").pop(); + return `{id: "${id}", meta: ${m}.config, f: wrappedUserFunction("${id}", ${m}.default, { props: _jitsu_funcCtx.props, function:{ ..._jitsu_funcCtx.function, id: "${id}"}})}`; + }) + .join(",") + + "];" + ); + const wrapper = isolate.compileModuleSync(code, { + filename: "jitsu-wrapper.js", + }); + wrapper.instantiateSync(context, (specifier: string) => { + const udf = udfModules[specifier]; + if (udf) { + //log.atInfo().log(`[${connectionId}] UDF function '${specifier}' is imported`); + return udf; + } + if (specifier === "@jitsu/functions-lib") { + return functionsLib; + } + throw new Error(`import is not allowed: ${specifier}`); + }); + wrapper.evaluateSync(); + const wrapperFunc = wrap(profileBulderId, isolate, context, wrapper); + log.atInfo().log(`[CON:${profileBulderId}] total UDF compile time: ${sw.elapsedPretty()}`); + return wrapperFunc; + } catch (e) { + return { + userFunction: (): Promise => { + throw new Error(`Cannot compile function: ${e}`); + }, + isDisposed: () => { + return false; + }, + close: () => { + try { + if (isolate) { + for (const r of refs) { + r.release(); + } + context.release(); + isolate.dispose(); + log.atInfo().log(`[${profileBulderId}] isolate closed`); + } + } catch (e) { + log.atError().log(`[${profileBulderId}] Error while closing isolate: ${e}`); + } + }, + }; + } +}; + +function wrap(connectionId: string, isolate: Isolate, context: Context, wrapper: Module) { + const exported = wrapper.namespace; + + const ref = exported.getSync("wrappedFunctionChain", { + reference: true, + }); + if (!ref || ref.typeof !== "function") { + throw new Error("Function not found. Please export wrappedFunctionChain function."); + } + const userFunction: ProfileFunctionWrapper = async (ctx, events, user): Promise => { + if (isolate.isDisposed) { + throw new RetryError("Isolate is disposed", { drop: true }); + } + const eventCopy = new ExternalCopy(events); + const ctxCopy = new ExternalCopy(ctx); + const userCopy = new ExternalCopy(user); + + const udfTimeoutMs = parseNumber(process.env.UDF_TIMEOUT_MS, 5000); + let isTimeout = false; + const timer = setTimeout(() => { + isTimeout = true; + isolate.dispose(); + }, udfTimeoutMs); + try { + const res = await ref.apply( + undefined, + [ + ctxCopy.copyInto({ release: true, transferIn: true }), + eventCopy.copyInto({ release: true, transferIn: true }), + userCopy.copyInto({ release: true, transferIn: true }), + ], + { + result: { promise: true }, + } + ); + switch (typeof res) { + case "undefined": + case "string": + case "number": + case "boolean": + return undefined; + default: + const r = (res as Reference).copy(); + (res as Reference).release(); + return r; + } + } catch (e: any) { + if (isolate.isDisposed) { + if (isTimeout) { + throw new RetryError( + `[${connectionId}] Function execution took longer than ${udfTimeoutMs}ms. Isolate is disposed`, + { + drop: true, + } + ); + } else { + throw new RetryError( + `[${connectionId}] Function execution stopped probably due to high memory usage. Isolate is disposed.`, + { + drop: true, + } + ); + } + } + const m = e.message; + if (m.startsWith("{")) { + throw JSON.parse(m); + } + //log.atInfo().log(`ERROR name: ${e.name} message: ${e.message} json: ${e.stack}`); + throw e; + } finally { + clearTimeout(timer); + } + }; + return { + userFunction, + isDisposed: () => { + if (isolate) { + return isolate.isDisposed; + } + return true; + }, + close: () => { + try { + if (isolate) { + context.release(); + if (!isolate.isDisposed) { + isolate.dispose(); + } + log.atInfo().log(`[${connectionId}] isolate closed.`); + } + } catch (e) { + log.atError().log(`[${connectionId}] Error while closing isolate: ${e}`); + } + }, + }; +} + +function makeReference(refs: Reference[], obj: any): Reference { + const ref = new Reference(obj); + refs.push(ref); + return ref; +} +// +// export type UDFTestRequest = { +// functionId: string; +// functionName: string; +// code: string | UDFWrapperResult; +// event: AnalyticsServerEvent; +// config: any; +// store: Store | any; +// workspaceId: string; +// userAgent?: string; +// }; +// +// export type UDFTestResponse = { +// error?: { +// message: string; +// stack?: string; +// name: string; +// retryPolicy?: any; +// }; +// dropped?: boolean; +// result: FuncReturn; +// store: any; +// logs: logType[]; +// }; +// +// export async function UDFTestRun({ +// functionId: id, +// functionName: name, +// code, +// store, +// event, +// config, +// userAgent, +// workspaceId, +// }: UDFTestRequest): Promise { +// const logs: logType[] = []; +// let wrapper: UDFWrapperResult | undefined = undefined; +// let realStore = false; +// try { +// const eventContext: EventContext = { +// geo: { +// country: { +// code: "US", +// name: "United States", +// isEU: false, +// }, +// city: { +// name: "New York", +// }, +// region: { +// code: "NY", +// }, +// location: { +// latitude: 40.6808, +// longitude: -73.9701, +// }, +// postalCode: { +// code: "11238", +// }, +// }, +// ua: parseUserAgent( +// event.context?.userAgent || +// userAgent || +// "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" +// ), +// headers: {}, +// source: { +// id: "functionsDebugger-streamId", +// type: "browser", +// }, +// destination: { +// id: "functionsDebugger-destinationId", +// type: "clickhouse", +// updatedAt: new Date(), +// hash: "hash", +// }, +// connection: { +// id: "functionsDebugger", +// }, +// workspace: { +// id: workspaceId, +// }, +// }; +// let storeImpl: TTLStore; +// if ( +// typeof store?.set === "function" && +// typeof store?.get === "function" && +// typeof store?.del === "function" && +// typeof store.ttl === "function" +// ) { +// storeImpl = store; +// realStore = true; +// } else { +// store = store || {}; +// storeImpl = createMemoryStore(store); +// } +// +// const eventsStore: EventsStore = { +// log(connectionId: string, level: LogLevel, msg: Record) { +// switch (msg.type) { +// case "log-info": +// case "log-warn": +// case "log-debug": +// case "log-error": +// logs.push({ +// message: +// msg.message?.text + +// (Array.isArray(msg.message?.args) && msg.message.args.length > 0 +// ? `, ${msg.message?.args.join(",")}` +// : ""), +// level: msg.type.replace("log-", ""), +// timestamp: new Date(), +// type: "log", +// }); +// break; +// case "http-request": +// let statusText; +// if (msg.error) { +// statusText = `${msg.error}`; +// } else { +// statusText = `${msg.statusText ?? ""}${msg.status ? `(${msg.status})` : ""}`; +// } +// logs.push({ +// message: `${msg.method} ${msg.url} :: ${statusText}`, +// level: msg.error ? "error" : "debug", +// timestamp: new Date(), +// type: "http", +// data: { +// body: msg.body, +// headers: msg.headers, +// response: msg.response, +// }, +// }); +// } +// }, +// close() {}, +// }; +// const chainCtx: FunctionChainContext = { +// store: storeImpl, +// fetch: makeFetch("functionsDebugger", eventsStore, "info"), +// log: makeLog("functionsDebugger", eventsStore), +// }; +// const d = new Date(); +// d.setDate(d.getDate() + 1); +// const funcCtx: FunctionContext = { +// function: { +// type: "udf", +// id, +// debugTill: d, +// }, +// props: config, +// }; +// if (typeof code === "string") { +// wrapper = UDFWrapper(id, chainCtx, funcCtx, [{ id, name, code }]); +// } else { +// wrapper = code; +// } +// const result = await wrapper?.userFunction(eventContext, event); +// return { +// dropped: isDropResult(result), +// result: typeof result === "undefined" ? event : result, +// store: !realStore ? memoryStoreDump(store) : {}, +// logs, +// }; +// } catch (e: any) { +// return { +// error: { +// message: e.message, +// stack: e.stack, +// name: e.name, +// retryPolicy: e.retryPolicy, +// }, +// result: {}, +// store: !realStore && store ? memoryStoreDump(store) : {}, +// logs, +// }; +// } +// } diff --git a/services/profiles/src/lib/repositories.ts b/services/profiles/src/lib/repositories.ts new file mode 100644 index 000000000..6633a5793 --- /dev/null +++ b/services/profiles/src/lib/repositories.ts @@ -0,0 +1,4 @@ +import { FunctionConfig, storeFunc, Workspace } from "@jitsu/core-functions"; + +export const functionsStore = storeFunc("functions"); +export const workspaceStore = storeFunc("workspaces-with-profiles"); diff --git a/services/profiles/src/lib/udf-wrapper-code.ts b/services/profiles/src/lib/udf-wrapper-code.ts new file mode 100644 index 000000000..8827867e5 --- /dev/null +++ b/services/profiles/src/lib/udf-wrapper-code.ts @@ -0,0 +1,178 @@ +import { DropRetryErrorName, RetryErrorName } from "@jitsu/functions-lib"; + +export const functionsLibCode = `const DropRetryErrorName = "Drop & RetryError"; +const RetryErrorName = "RetryError"; +class RetryError extends Error { + constructor(message, options) { + super(message); + this.name = options?.drop ? "${DropRetryErrorName}" : "${RetryErrorName}"; + } +} + +export { DropRetryErrorName, RetryError, RetryErrorName };`; + +export const chainWrapperCode = `//** @UDF_FUNCTIONS_IMPORT **// +import {DropRetryErrorName, RetryError, RetryErrorName} from "@jitsu/functions-lib"; + +global.RetryError = RetryError; + +export function checkError(chainRes) { + for (const el of chainRes.execLog) { + const error = el.error; + if (error) { + throw error; + // _jitsu_log.error.apply(undefined, [{ + // function: { + // ..._jitsu_funcCtx.function, + // id: error.functionId || el.functionId + // } + // }, \`Function execution failed\`, error.name, error.message], {arguments: {copy: true}}); + } + } +} + +function isDropResult(result) { + return result === "drop" || (Array.isArray(result) && result.length === 0) || result === null || result === false; +} + +async function runChain( + chain, + ctx, + events, + user +) { + const execLog = []; + const f = chain[0]; + let result = undefined; + try { + result = await f.f(ctx, events, user); + } catch (err) { + if (err.name === DropRetryErrorName) { + result = "drop"; + } + if (f.meta?.retryPolicy) { + err.retryPolicy = f.meta.retryPolicy; + } + execLog.push({ + functionId: f.id, + error: err, + }); + } + if (isDropResult(result)) { + result = undefined + } + return {result, execLog}; +} + +const wrappedFunctionChain = async function (ctx, events, user) { + let chain = []; + //** @UDF_FUNCTIONS_CHAIN **// + const chainRes = await runChain(chain, ctx, events, user); + checkError(chainRes); + return chainRes.result; +}; + +const wrappedUserFunction = (id, f, funcCtx) => { + + const log = { + info: (...args) => { + _jitsu_log.info.apply(undefined, [funcCtx, ...args], {arguments: {copy: true}}); + }, + error: (...args) => { + _jitsu_log.error.apply(undefined, [funcCtx, ...args], {arguments: {copy: true}}); + }, + warn: (...args) => { + _jitsu_log.warn.apply(undefined, [funcCtx, ...args], {arguments: {copy: true}}); + }, + debug: (...args) => { + _jitsu_log.debug.apply(undefined, [funcCtx, ...args], {arguments: {copy: true}}); + }, + } + + const store = { + set: async (key, value, opts) => { + await _jitsu_store.set.apply(undefined, [key, value, opts], { + arguments: {copy: true}, + result: {promise: true} + }); + }, + del: async key => { + await _jitsu_store.del.apply(undefined, [key], { + arguments: {copy: true}, + result: {promise: true} + }); + }, + get: async key => { + const res = await _jitsu_store.get.apply(undefined, [key], { + arguments: {copy: true}, + result: {promise: true} + }); + return res ? JSON.parse(res) : undefined; + }, + ttl: async key => { + return await _jitsu_store.ttl.apply(undefined, [key], { + arguments: {copy: true}, + result: {promise: true} + }); + }, + } + + const fetch = async (url, opts, extras) => { + let res + if (extras) { + res = await _jitsu_fetch.apply(undefined, [url, opts, {ctx: funcCtx, event: extras.event}], { + arguments: {copy: true}, + result: {promise: true} + }); + } else { + res = await _jitsu_fetch.apply(undefined, [url, opts], { + arguments: {copy: true}, + result: {promise: true} + }); + } + const r = JSON.parse(res); + + return { + ...r, + json: async () => { + return JSON.parse(r.body); + }, + text: async () => { + return r.body; + }, + arrayBuffer: async () => { + throw new Error("Method 'arrayBuffer' is not implemented"); + }, + blob: async () => { + throw new Error("Method 'blob' is not implemented"); + }, + formData: async () => { + throw new Error("Method 'formData' is not implemented"); + }, + clone: async () => { + throw new Error("Method 'clone' is not implemented"); + }, + }; + } + + return async function (c, events, user) { + const fetchLogEnabled = _jitsu_fetch_log_level !== "debug" || (funcCtx.function.debugTill && funcCtx.function.debugTill > new Date()); + let ftch = fetch + if (fetchLogEnabled) { + ftch = async(url, opts) => { + return fetch(url, opts, {event}); + } + } + const ctx = { + ...c, + props: funcCtx.props, + log, + store, + fetch: ftch, + }; + return await f(ctx, events, user); + } +}; + +export {wrappedFunctionChain}; +`; diff --git a/services/profiles/src/lib/udf-wrapper-code.txtjs b/services/profiles/src/lib/udf-wrapper-code.txtjs new file mode 100644 index 000000000..a9ffaa88e --- /dev/null +++ b/services/profiles/src/lib/udf-wrapper-code.txtjs @@ -0,0 +1,164 @@ +//** @UDF_FUNCTIONS_IMPORT **// +import {DropRetryErrorName, RetryError, RetryErrorName} from "@jitsu/functions-lib"; + +global.RetryError = RetryError; + +export function checkError(chainRes) { + for (const el of chainRes.execLog) { + const error = el.error; + if (error) { + throw error; + // _jitsu_log.error.apply(undefined, [{ + // function: { + // ..._jitsu_funcCtx.function, + // id: error.functionId || el.functionId + // } + // }, `Function execution failed`, error.name, error.message], {arguments: {copy: true}}); + } + } +} + +function isDropResult(result) { + return result === "drop" || (Array.isArray(result) && result.length === 0) || result === null || result === false; +} + +async function runChain( + chain, + ctx, + events, + user +) { + const execLog = []; + const f = chain[0]; + let result = undefined; + try { + result = await f.f(ctx, events, user); + } catch (err) { + if (err.name === DropRetryErrorName) { + result = "drop"; + } + if (f.meta?.retryPolicy) { + err.retryPolicy = f.meta.retryPolicy; + } + execLog.push({ + functionId: f.id, + error: err, + }); + } + if (isDropResult(result)) { + result = undefined + } + return {result, execLog}; +} + +const wrappedFunctionChain = async function (ctx, events, user) { + let chain = []; + //** @UDF_FUNCTIONS_CHAIN **// + const chainRes = await runChain(chain, ctx, events, user); + checkError(chainRes); + return chainRes.result; +}; + +const wrappedUserFunction = (id, f, funcCtx) => { + + const log = { + info: (...args) => { + _jitsu_log.info.apply(undefined, [funcCtx, ...args], {arguments: {copy: true}}); + }, + error: (...args) => { + _jitsu_log.error.apply(undefined, [funcCtx, ...args], {arguments: {copy: true}}); + }, + warn: (...args) => { + _jitsu_log.warn.apply(undefined, [funcCtx, ...args], {arguments: {copy: true}}); + }, + debug: (...args) => { + _jitsu_log.debug.apply(undefined, [funcCtx, ...args], {arguments: {copy: true}}); + }, + } + + const store = { + set: async (key, value, opts) => { + await _jitsu_store.set.apply(undefined, [key, value, opts], { + arguments: {copy: true}, + result: {promise: true} + }); + }, + del: async key => { + await _jitsu_store.del.apply(undefined, [key], { + arguments: {copy: true}, + result: {promise: true} + }); + }, + get: async key => { + const res = await _jitsu_store.get.apply(undefined, [key], { + arguments: {copy: true}, + result: {promise: true} + }); + return res ? JSON.parse(res) : undefined; + }, + ttl: async key => { + return await _jitsu_store.ttl.apply(undefined, [key], { + arguments: {copy: true}, + result: {promise: true} + }); + }, + } + + const fetch = async (url, opts, extras) => { + let res + if (extras) { + res = await _jitsu_fetch.apply(undefined, [url, opts, {ctx: funcCtx, event: extras.event}], { + arguments: {copy: true}, + result: {promise: true} + }); + } else { + res = await _jitsu_fetch.apply(undefined, [url, opts], { + arguments: {copy: true}, + result: {promise: true} + }); + } + const r = JSON.parse(res); + + return { + ...r, + json: async () => { + return JSON.parse(r.body); + }, + text: async () => { + return r.body; + }, + arrayBuffer: async () => { + throw new Error("Method 'arrayBuffer' is not implemented"); + }, + blob: async () => { + throw new Error("Method 'blob' is not implemented"); + }, + formData: async () => { + throw new Error("Method 'formData' is not implemented"); + }, + clone: async () => { + throw new Error("Method 'clone' is not implemented"); + }, + }; + } + + return async function (c, events, user) { + const fetchLogEnabled = _jitsu_fetch_log_level !== "debug" || (funcCtx.function.debugTill && funcCtx.function.debugTill > new Date()); + let ftch = fetch + if (fetchLogEnabled) { + ftch = async(url, opts) => { + return fetch(url, opts, {event}); + } + } + const ctx = { + ...c, + props: funcCtx.props, + log, + store, + fetch: ftch, + }; + return await f(ctx, events, user); + } +}; + +export {wrappedFunctionChain}; diff --git a/services/profiles/tsconfig.json b/services/profiles/tsconfig.json new file mode 100644 index 000000000..e54b28d99 --- /dev/null +++ b/services/profiles/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "outDir": "./compiled", + "rootDir": ".", + "noImplicitAny": false, + "allowSyntheticDefaultImports": true, + "importHelpers": true, + "removeComments": true, + "target": "ESNext", + "module": "commonjs", + "lib": [ + "ESNext", "DOM" + ], + "allowJs": true, + "strict": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "moduleResolution": "node", + "resolveJsonModule": true, + "skipLibCheck": true, + }, + "exclude": [ + "node_modules" + ], + "include": [ + "src/**/*" + ] +} + diff --git a/services/profiles/webpack.config.js b/services/profiles/webpack.config.js new file mode 100644 index 000000000..4a2dccaab --- /dev/null +++ b/services/profiles/webpack.config.js @@ -0,0 +1,47 @@ +const path = require("path"); +const webpack = require("webpack"); + +const config = { + entry: "./src/index.ts", + target: "node", + externals: { + "isolated-vm": "require('isolated-vm')", + }, + node: { + __dirname: false, + }, + devtool: "source-map", + output: { + path: path.resolve(__dirname, "dist"), + }, + plugins: [ + new webpack.IgnorePlugin({ resourceRegExp: /^pg-native$/ }), // Ignore native module + // Add your plugins here + // Learn more about plugins from https://webpack.js.org/configuration/plugins/ + ], + module: { + rules: [ + { + test: /\.(ts|tsx)$/i, + //loader: "ts-loader", + //exclude: ["/node_modules/"], + use: { + loader: "babel-loader", + }, + }, + { + test: /\.node$/, + loader: "node-loader", + }, + ], + }, + optimization: { + minimize: false, + }, + resolve: { + extensions: [".tsx", ".ts", ".jsx", ".js", ".node", "..."], + }, + mode: "production", +}; + +module.exports = () => config; diff --git a/services/rotor/__tests__/functions-chain.test.ts b/services/rotor/__tests__/functions-chain.test.ts index fecca5e59..8b4764b3f 100644 --- a/services/rotor/__tests__/functions-chain.test.ts +++ b/services/rotor/__tests__/functions-chain.test.ts @@ -1,14 +1,19 @@ import { getLog } from "juava"; import { createServer, SimpleSyrup } from "./simple-syrup"; -import { EnrichedConnectionConfig, FunctionConfig } from "../src/lib/config-types"; -import { EntityStore } from "../src/lib/entity-store"; import { functionFilter, rotorMessageHandler } from "../src/lib/message-handler"; import { CONNECTION_IDS_HEADER } from "../src/lib/rotor"; -import { createMemoryStore, DummyEventsStore } from "@jitsu/core-functions"; +import { + createMemoryStore, + DummyEventsStore, + EnrichedConnectionConfig, + EntityStore, + FunctionConfig, + Workspace, +} from "@jitsu/core-functions"; import { IngestMessage } from "@jitsu/protocols/async-request"; import { isEqual } from "lodash"; import { functions, connections } from "./functions-chain-data"; -import { expect, test, describe } from "@jest/globals"; +import { expect, test, describe, beforeAll, afterAll } from "@jest/globals"; import { FuncChainFilter } from "../src/lib/functions-chain"; const log = getLog("functions-chain-test"); @@ -165,6 +170,9 @@ const funcStore: EntityStore = { getObject: (id: string) => { return functions[id]; }, + getAll: () => { + return functions as unknown as Record; + }, toJSON: () => "", enabled: true, lastModified: new Date(), @@ -174,6 +182,21 @@ const connectionStore: EntityStore = { getObject: (id: string) => { return connections[id]; }, + getAll: () => { + return connections as unknown as Record; + }, + toJSON: () => "", + enabled: true, + lastModified: new Date(), +}; + +const workspaceStore: EntityStore = { + getObject: (id: string) => { + return undefined; + }, + getAll: () => { + return {} as Record; + }, toJSON: () => "", enabled: true, lastModified: new Date(), @@ -251,6 +274,7 @@ describe("Test Functions Chain", () => { { connectionStore: connectionStore, functionsStore: funcStore, + workspaceStore: workspaceStore, eventsLogger: DummyEventsStore, dummyPersistentStore: createMemoryStore({}), }, @@ -276,6 +300,7 @@ describe("Test Functions Chain", () => { { connectionStore: connectionStore, functionsStore: funcStore, + workspaceStore: workspaceStore, eventsLogger: DummyEventsStore, dummyPersistentStore: createMemoryStore({}), }, @@ -302,6 +327,7 @@ describe("Test Functions Chain", () => { { connectionStore: connectionStore, functionsStore: funcStore, + workspaceStore: workspaceStore, eventsLogger: DummyEventsStore, dummyPersistentStore: createMemoryStore({}), }, @@ -325,6 +351,7 @@ describe("Test Functions Chain", () => { { connectionStore: connectionStore, functionsStore: funcStore, + workspaceStore: workspaceStore, eventsLogger: DummyEventsStore, dummyPersistentStore: createMemoryStore({}), }, @@ -351,6 +378,7 @@ describe("Test Functions Chain", () => { { connectionStore: connectionStore, functionsStore: funcStore, + workspaceStore: workspaceStore, eventsLogger: DummyEventsStore, dummyPersistentStore: createMemoryStore({}), }, @@ -375,6 +403,7 @@ describe("Test Functions Chain", () => { { connectionStore: connectionStore, functionsStore: funcStore, + workspaceStore: workspaceStore, eventsLogger: DummyEventsStore, dummyPersistentStore: createMemoryStore({}), }, @@ -401,6 +430,7 @@ describe("Test Functions Chain", () => { { connectionStore: connectionStore, functionsStore: funcStore, + workspaceStore: workspaceStore, eventsLogger: DummyEventsStore, dummyPersistentStore: createMemoryStore({}), }, @@ -423,6 +453,7 @@ describe("Test Functions Chain", () => { { connectionStore: connectionStore, functionsStore: funcStore, + workspaceStore: workspaceStore, eventsLogger: DummyEventsStore, dummyPersistentStore: createMemoryStore({}), }, @@ -446,6 +477,7 @@ describe("Test Functions Chain", () => { { connectionStore: connectionStore, functionsStore: funcStore, + workspaceStore: workspaceStore, eventsLogger: DummyEventsStore, dummyPersistentStore: createMemoryStore({}), }, @@ -469,6 +501,7 @@ describe("Test Functions Chain", () => { { connectionStore: connectionStore, functionsStore: funcStore, + workspaceStore: workspaceStore, eventsLogger: DummyEventsStore, dummyPersistentStore: createMemoryStore({}), }, @@ -495,6 +528,7 @@ describe("Test Functions Chain", () => { { connectionStore: connectionStore, functionsStore: funcStore, + workspaceStore: workspaceStore, eventsLogger: DummyEventsStore, dummyPersistentStore: createMemoryStore({}), }, @@ -519,6 +553,7 @@ describe("Test Functions Chain", () => { { connectionStore: connectionStore, functionsStore: funcStore, + workspaceStore: workspaceStore, eventsLogger: DummyEventsStore, dummyPersistentStore: createMemoryStore({}), }, diff --git a/services/rotor/__tests__/inmem-store.test.ts b/services/rotor/__tests__/inmem-store.test.ts index d839f7359..8faed5af8 100644 --- a/services/rotor/__tests__/inmem-store.test.ts +++ b/services/rotor/__tests__/inmem-store.test.ts @@ -1,6 +1,7 @@ -import { createInMemoryStore } from "../src/lib/inmem-store"; import { getLog } from "juava"; import * as path from "path"; +import { expect, test } from "@jest/globals"; +import { createInMemoryStore } from "@jitsu/core-functions"; const log = getLog("inmem-store-test"); test("Test in-mem store", async () => { diff --git a/services/rotor/__tests__/kafka.test.ts b/services/rotor/__tests__/kafka.test.ts index 646575899..2ad92f551 100644 --- a/services/rotor/__tests__/kafka.test.ts +++ b/services/rotor/__tests__/kafka.test.ts @@ -2,6 +2,7 @@ import { getLog } from "juava"; import { connectToKafka } from "../src/lib/kafka-config"; import "@sensejs/kafkajs-zstd-support"; +import { test } from "@jest/globals"; const log = getLog("kafka-test"); test.skip("Kafka Test", async () => { diff --git a/services/rotor/dist_package.json b/services/rotor/dist_package.json index 872b29c5e..4602cc548 100644 --- a/services/rotor/dist_package.json +++ b/services/rotor/dist_package.json @@ -4,6 +4,6 @@ "dependencies": { "isolated-vm": "5.0.1", "@sensejs/kafkajs-zstd-support": "^0.11.0", - "@mongodb-js/zstd": "^1.2.0" + "@mongodb-js/zstd": "^1.2.2" } } diff --git a/services/rotor/package.json b/services/rotor/package.json index a150a121c..5c3a90a21 100644 --- a/services/rotor/package.json +++ b/services/rotor/package.json @@ -26,7 +26,7 @@ "@types/pg-cursor": "^2.7.2", "@aws-sdk/client-s3": "^3.621.0", "dayjs": "^1.11.12", - "express": "^4.19.2", + "express": "^4.21.1", "ioredis": "^5.4.1", "json5": "^2.2.3", "juava": "workspace:*", @@ -42,7 +42,6 @@ "tar": "^7.4.3", "tslib": "^2.6.3", "jsondiffpatch": "workspace:*", - "@clickhouse/client": "^1.4.0", "semver": "^7.6.3" }, "devDependencies": { diff --git a/services/rotor/src/http/functions.ts b/services/rotor/src/http/functions.ts index 98691bdba..d96b16098 100644 --- a/services/rotor/src/http/functions.ts +++ b/services/rotor/src/http/functions.ts @@ -8,7 +8,7 @@ import { parse as semverParse } from "semver"; import * as jsondiffpatch from "jsondiffpatch"; import Prometheus from "prom-client"; -import { connectionsStore, functionsStore } from "../lib/entity-store"; +import { connectionsStore, functionsStore, workspaceStore } from "../lib/repositories"; const jsondiffpatchInstance = jsondiffpatch.create(); const log = getLog("functions_handler"); @@ -20,13 +20,15 @@ const handlerMetric = new Prometheus.Counter({ }); export const FunctionsHandler = - (rotorContext: Omit) => async (req, res) => { + (rotorContext: Omit) => + async (req, res) => { const message = req.body as IngestMessage; //log.atInfo().log(`Functions handler. Message ID: ${message.messageId} connectionId: ${message.connectionId}`); const result = await rotorMessageHandler(message, { ...rotorContext, connectionStore: requireDefined(connectionsStore.getCurrent(), "Connection store is not initialized"), functionsStore: requireDefined(functionsStore.getCurrent(), "Functions store is not initialized"), + workspaceStore: requireDefined(workspaceStore.getCurrent(), "Workspace store is not initialized"), }); if (result?.events && result.events.length > 0) { res.json(result.events); @@ -36,7 +38,8 @@ export const FunctionsHandler = }; export const FunctionsHandlerMulti = - (rotorContext: Omit) => async (req, res, next) => { + (rotorContext: Omit) => + async (req, res, next) => { const connectionIds = (req.query.ids ?? "").split(",") as string[]; const message = req.body as IngestMessage; const functionsFetchTimeout = req.headers["x-request-timeout-ms"] @@ -52,6 +55,7 @@ export const FunctionsHandlerMulti = ...rotorContext, connectionStore: requireDefined(connectionsStore.getCurrent(), "Connection store is not initialized"), functionsStore: requireDefined(functionsStore.getCurrent(), "Functions store is not initialized"), + workspaceStore: requireDefined(workspaceStore.getCurrent(), "Workspace store is not initialized"), }, "all", { [CONNECTION_IDS_HEADER]: id }, diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index f5e78a389..81e7b76db 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -1,7 +1,7 @@ import { checkHash, checkRawToken, disableService, getLog, setServerJsonFormat, isTruish } from "juava"; import { destinationMessagesTopic, getCredentialsFromEnv, rotorConsumerGroupId } from "./lib/kafka-config"; import { kafkaRotor } from "./lib/rotor"; -import { DummyEventsStore, EventsStore, mongodb } from "@jitsu/core-functions"; +import { createClickhouseLogger, DummyEventsStore, EventsStore, mongodb } from "@jitsu/core-functions"; import express from "express"; import { UDFRunHandler } from "./http/udf"; import Prometheus from "prom-client"; @@ -9,15 +9,14 @@ import { FunctionsHandler, FunctionsHandlerMulti } from "./http/functions"; import { initMaxMindClient, GeoResolver } from "./lib/maxmind"; import { MessageHandlerContext, rotorMessageHandler } from "./lib/message-handler"; import { DummyMetrics, Metrics } from "./lib/metrics"; -import { connectionsStore, functionsStore } from "./lib/entity-store"; +import { connectionsStore, functionsStore } from "./lib/repositories"; import { Server } from "node:net"; import { getApplicationVersion, getDiagnostics } from "./lib/version"; -import { createClickhouseLogger } from "./lib/clickhouse-logger"; import { Redis } from "ioredis"; import { createRedis } from "./lib/redis"; import * as util from "util"; import { getHeapSnapshot } from "node:v8"; -export const log = getLog("rotor"); +const log = getLog("rotor"); disableService("prisma"); disableService("pg"); @@ -154,7 +153,7 @@ async function main() { } } -function initHTTP(rotorContext: Omit) { +function initHTTP(rotorContext: Omit) { http.use((req, res, next) => { if (req.path === "/health" || req.path === "/version") { return next(); diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index 62949b35c..a7f04ae7a 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -3,7 +3,10 @@ import { createMongoStore, createMultiStore, createTtlStore, + EnrichedConnectionConfig, + EntityStore, FunctionChainContext, + FunctionConfig, FunctionContext, getBuiltinFunction, isDropResult, @@ -22,8 +25,6 @@ import { getLog, newError, requireDefined, stopwatch } from "juava"; import { retryObject } from "./retries"; import NodeCache from "node-cache"; import isEqual from "lodash/isEqual"; -import { EnrichedConnectionConfig, FunctionConfig } from "./config-types"; -import { EntityStore } from "./entity-store"; import { MessageHandlerContext } from "./message-handler"; const fastStoreWorkspaceId = (process.env.FAST_STORE_WORKSPACE_ID ?? "").split(",").filter(x => x.length > 0); diff --git a/services/rotor/src/lib/maxmind.ts b/services/rotor/src/lib/maxmind.ts index 6254bd2bb..94a875408 100644 --- a/services/rotor/src/lib/maxmind.ts +++ b/services/rotor/src/lib/maxmind.ts @@ -6,7 +6,7 @@ import NodeCache from "node-cache"; import { getLog, requireDefined } from "juava"; import { S3Client, GetObjectCommand } from "@aws-sdk/client-s3"; -export const log = getLog("maxmind"); +const log = getLog("maxmind"); const InvalidLicenseKey = "Invalid license key"; @@ -286,7 +286,7 @@ async function loadFromURL(url: string): Promise { } async function untar(b: Buffer): Promise { - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { const gunzip = zlib.createGunzip(); const tarParser = new tar.Parser(); tarParser.on("entry", entry => { diff --git a/services/rotor/src/lib/message-handler.ts b/services/rotor/src/lib/message-handler.ts index a56625c89..4f5603a22 100644 --- a/services/rotor/src/lib/message-handler.ts +++ b/services/rotor/src/lib/message-handler.ts @@ -3,15 +3,25 @@ import { Metrics } from "./metrics"; import { GeoResolver } from "./maxmind"; import { IngestMessage } from "@jitsu/protocols/async-request"; import { CONNECTION_IDS_HEADER } from "./rotor"; -import { EntityStore } from "./entity-store"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; -import { EventContext, TTLStore } from "@jitsu/protocols/functions"; -import { MetricsMeta, mongoAnonymousEventsStore, parseUserAgent, EventsStore } from "@jitsu/core-functions"; +import { EventContext, FetchType, TTLStore } from "@jitsu/protocols/functions"; +import { + MetricsMeta, + mongoAnonymousEventsStore, + parseUserAgent, + EventsStore, + ProfilesFunction, + createDummyStore, + ProfilesConfig, + EntityStore, + EnrichedConnectionConfig, + FunctionConfig, + Workspace, +} from "@jitsu/core-functions"; import NodeCache from "node-cache"; import { buildFunctionChain, checkError, FuncChain, FuncChainFilter, runChain } from "./functions-chain"; -import { EnrichedConnectionConfig, FunctionConfig } from "./config-types"; import { Redis } from "ioredis"; -export const log = getLog("rotor"); +const log = getLog("rotor"); const anonymousEventsStore = mongoAnonymousEventsStore(); @@ -22,6 +32,7 @@ const funcsChainCache = new NodeCache({ stdTTL: funcsChainTTL, checkperiod: 60, export type MessageHandlerContext = { connectionStore: EntityStore; functionsStore: EntityStore; + workspaceStore: EntityStore; eventsLogger: EventsStore; metrics?: Metrics; geoResolver?: GeoResolver; @@ -125,9 +136,47 @@ export async function rotorMessageHandler( funcsChainCache.set(cacheKey, funcChain); } + if (retries === 0) { + await profilesHandler(rotorContext, ctx, connection, event); + } + const chainRes = await runChain(funcChain, event, ctx, metricsMeta, runFuncs, retriesEnabled); chainRes.connectionId = connectionId; rotorContext.metrics?.logMetrics(chainRes.execLog); checkError(chainRes); return chainRes; } + +async function profilesHandler( + rotorContext: MessageHandlerContext, + ctx: EventContext, + connection: EnrichedConnectionConfig, + event: AnalyticsServerEvent +) { + const wp = rotorContext.workspaceStore.getObject(connection.workspaceId); + if (wp) { + const builders = wp.profileBuilders.filter(p => p.destinationId === connection.destinationId); + for (const builder of builders) { + const flog = getLog(`profile-builder-${connection.workspaceId}-${builder.id}`); + try { + await ProfilesFunction(event, { + ...ctx, + props: { + ...builder.intermediateStorageCredentials, + eventsCollectionName: `profiles-raw-${wp.id}-${builder.id}`, + } as ProfilesConfig, + store: createDummyStore(), + log: { + error: (msg, args) => flog.atError().log(msg, ...(args || [])), + info: (msg, args) => flog.atInfo().log(msg, ...(args || [])), + debug: (msg, args) => flog.atDebug().log(msg, ...(args || [])), + warn: (msg, args) => flog.atWarn().log(msg, ...(args || [])), + }, + fetch: fetch as FetchType, + }); + } catch (e: any) { + flog.atError().log("Failed to store event: " + e.message); + } + } + } +} diff --git a/services/rotor/src/lib/metrics.ts b/services/rotor/src/lib/metrics.ts index 11a448b8d..69d04e6a8 100644 --- a/services/rotor/src/lib/metrics.ts +++ b/services/rotor/src/lib/metrics.ts @@ -8,7 +8,7 @@ import type { Producer } from "kafkajs"; import { getCompressionType } from "./rotor"; import { Readable } from "stream"; -export const log = getLog("metrics"); +const log = getLog("metrics"); const bulkerBase = requireDefined(process.env.BULKER_URL, "env BULKER_URL is not defined"); const bulkerAuthKey = requireDefined(process.env.BULKER_AUTH_KEY, "env BULKER_AUTH_KEY is not defined"); const metricsDestinationId = process.env.METRICS_DESTINATION_ID; diff --git a/services/rotor/src/lib/redis.ts b/services/rotor/src/lib/redis.ts index 876a5d612..499553c28 100644 --- a/services/rotor/src/lib/redis.ts +++ b/services/rotor/src/lib/redis.ts @@ -1,7 +1,7 @@ import { Redis } from "ioredis"; import { requireDefined, getLog } from "juava"; -export const log = getLog("redis"); +const log = getLog("redis"); function hideSensitiveInfoFromURL(url: string) { let parsed: URL; diff --git a/services/rotor/src/lib/repositories.ts b/services/rotor/src/lib/repositories.ts new file mode 100644 index 000000000..40387148d --- /dev/null +++ b/services/rotor/src/lib/repositories.ts @@ -0,0 +1,5 @@ +import { EnrichedConnectionConfig, FunctionConfig, storeFunc, Workspace } from "@jitsu/core-functions"; + +export const functionsStore = storeFunc("functions"); +export const connectionsStore = storeFunc("rotor-connections"); +export const workspaceStore = storeFunc("workspaces-with-profiles"); diff --git a/services/rotor/src/lib/rotor.ts b/services/rotor/src/lib/rotor.ts index 86b204a96..9fca51463 100644 --- a/services/rotor/src/lib/rotor.ts +++ b/services/rotor/src/lib/rotor.ts @@ -11,7 +11,7 @@ import { FuncChainFilter, FuncChainResult } from "./functions-chain"; import type { Admin, Consumer, Producer, KafkaMessage } from "kafkajs"; import { CompressionTypes } from "kafkajs"; import { functionFilter, MessageHandlerContext } from "./message-handler"; -import { connectionsStore, functionsStore } from "./entity-store"; +import { connectionsStore, functionsStore, workspaceStore } from "./repositories"; const log = getLog("kafka-rotor"); @@ -30,7 +30,7 @@ export type KafkaRotorConfig = { consumerGroupId: string; kafkaTopics: string[]; kafkaClientId?: string; - rotorContext: Omit; + rotorContext: Omit; handle: ( message: string, rotorContext: MessageHandlerContext, @@ -140,6 +140,7 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { ...rotorContext, connectionStore: requireDefined(connectionsStore.getCurrent(), "Connection store is not initialized"), functionsStore: requireDefined(functionsStore.getCurrent(), "Functions store is not initialized"), + workspaceStore: requireDefined(workspaceStore.getCurrent(), "Workspace store is not initialized"), metrics, }, functionFilter(retriedFunctionId), diff --git a/turbo.json b/turbo.json index d321f97d9..01815bc1b 100644 --- a/turbo.json +++ b/turbo.json @@ -16,6 +16,10 @@ "dependsOn": ["^rotor:dev"], "cache": false }, + "profiles:dev": { + "dependsOn": ["^profiles:dev"], + "cache": false + }, "tool:hash": { "dependsOn": ["^tool:hash"], "cache": false diff --git a/types/protocols/profile.d.ts b/types/protocols/profile.d.ts index 2f6519e3c..c6cab8a47 100644 --- a/types/protocols/profile.d.ts +++ b/types/protocols/profile.d.ts @@ -13,4 +13,4 @@ export type ProfileFunction = (params: { anonymousId?: string; traits: Record; }; -}) => Promise; +}) => Promise; diff --git a/webapps/console/components/DataView/EventsBrowser.tsx b/webapps/console/components/DataView/EventsBrowser.tsx index 3735fe76e..59f242125 100644 --- a/webapps/console/components/DataView/EventsBrowser.tsx +++ b/webapps/console/components/DataView/EventsBrowser.tsx @@ -25,7 +25,7 @@ import { DestinationConfig, FunctionConfig, ServiceConfig, StreamConfig } from " import { arrayToMap } from "../../lib/shared/arrays"; import { Bug, Globe, RefreshCw, Server } from "lucide-react"; import { JitsuButton } from "../JitsuButton/JitsuButton"; -import { ConnectionTitle } from "../../pages/[workspaceId]/connections"; +import { ConnectionTitle, ProfileBuilderTitle } from "../../pages/[workspaceId]/connections"; import { StreamTitle } from "../../pages/[workspaceId]/streams"; import { trimMiddle } from "../../lib/shared/strings"; import { countries } from "../../lib/shared/countries"; @@ -91,7 +91,7 @@ export const UTCDate: React.FC<{ date: string | Date }> = ({ date }) => { export function linksQuery( workspaceId: string, type: "push" | "sync" | "all" = "push", - withFunctions: boolean = false + withProfileBuilders: boolean = false ) { return async () => { const promises = [ @@ -102,8 +102,8 @@ export function linksQuery( res.links.filter(l => l.type === type || (type === "push" && !l.type) || type === "all") ), ]; - if (withFunctions) { - promises.push(getConfigApi(workspaceId, "function").list()); + if (withProfileBuilders) { + promises.push(get(`/api/${workspaceId}/config/profile-builder`).then(res => res.profileBuilders)); } return await Promise.all(promises); }; @@ -185,6 +185,8 @@ export const EventsBrowser = ({ if (connection) { setConnection(connection); setDebugEnabled(new Date(connection.data.debugTill) > new Date()); + } else { + setConnection(undefined); } })(); } @@ -264,29 +266,43 @@ export const EventsBrowser = ({ query = () => getConfigApi(workspace.id, "stream").list(); } else { query = async () => { - const data = await linksQuery(workspace.id, streamType === "bulker" ? "all" : "push")(); + const data = await linksQuery(workspace.id, streamType === "bulker" ? "all" : "push", true)(); const streamsMap = arrayToMap(data[0]); const servicesMap = arrayToMap(data[1]); const dstMap = arrayToMap(data[2]); - return data[3] - .map(link => { - const dst = dstMap[link.toId]; + const profiles = data[4]; + return [ + ...data[3] + .map(link => { + const dst = dstMap[link.toId]; + const destinationType = coreDestinationsMap[dst?.destinationType]; + return { + id: link.id, + name: `${streamsMap[link.fromId]?.name ?? "DELETED"} → ${dstMap[link.toId]?.name ?? "DELETED"}`, + mode: link.type === "sync" ? "batch" : link.data?.mode, + stream: streamsMap[link.fromId], + service: servicesMap[link.fromId], + destination: dst, + usesBulker: destinationType?.usesBulker || false, + hybrid: destinationType?.hybrid || false, + //usesFunctions: Array.isArray(link.data?.functions) && link.data?.functions.length > 0, + }; + }) + .filter( + link => (streamType === "bulker" && (link.usesBulker || link.hybrid)) || streamType === "function" + ), + ...profiles.map(p => { + const dst = dstMap[p.destinationId]; const destinationType = coreDestinationsMap[dst?.destinationType]; return { - id: link.id, - name: `${streamsMap[link.fromId]?.name ?? "DELETED"} → ${dstMap[link.toId]?.name ?? "DELETED"}`, - mode: link.type === "sync" ? "batch" : link.data?.mode, - stream: streamsMap[link.fromId], - service: servicesMap[link.fromId], + ...p, + mode: p.connectionOptions?.mode || "batch", destination: dst, usesBulker: destinationType?.usesBulker || false, - hybrid: destinationType?.hybrid || false, - //usesFunctions: Array.isArray(link.data?.functions) && link.data?.functions.length > 0, + type: "profile-builder", }; - }) - .filter( - link => (streamType === "bulker" && (link.usesBulker || link.hybrid)) || streamType === "function" - ); + }), + ]; }; } @@ -354,6 +370,8 @@ export const EventsBrowser = ({ label: entity[1].type === "stream" ? ( + ) : entity[1].type === "profile-builder" ? ( + ) : ( = ({ profileBuilder, destination, showLink = false }) => { + return ( +
    + } + size={"small"} + // href={stream && link ? `/${stream.workspaceId}/streams?id=${stream?.id}` : undefined} + title={profileBuilder ? profileBuilder.name : "Unknown stream"} + /> + {"→"} + + {/*{showLink && (*/} + {/* }*/} + {/* />*/} + {/*)}*/} +
    + ); +}; + type ConfigurationLinkDbModel = z.infer; type RemoteEntitiesProps = { diff --git a/webapps/console/pages/api/[workspaceId]/config/profile-builder.ts b/webapps/console/pages/api/[workspaceId]/config/profile-builder.ts new file mode 100644 index 000000000..752611847 --- /dev/null +++ b/webapps/console/pages/api/[workspaceId]/config/profile-builder.ts @@ -0,0 +1,57 @@ +import { z } from "zod"; +import { Api, inferUrl, nextJsApiHandler, verifyAccess } from "../../../../lib/api"; +import { db } from "../../../../lib/server/db"; + +const postAndPutCfg = { + auth: true, + types: { + query: z.object({ workspaceId: z.string() }), + body: z.object({ + id: z.string().optional(), + // TODO + }), + }, + handle: async (ctx: any) => { + // TODO + }, +}; + +export const api: Api = { + url: inferUrl(__filename), + GET: { + auth: true, + types: { + query: z.object({ workspaceId: z.string() }), + }, + handle: async ({ user, query: { workspaceId } }) => { + await verifyAccess(user, workspaceId); + return { + profileBuilders: await db.prisma().profileBuilder.findMany({ + where: { workspaceId: workspaceId, deleted: false }, + orderBy: { createdAt: "asc" }, + }), + }; + }, + }, + POST: postAndPutCfg, + PUT: postAndPutCfg, + DELETE: { + auth: true, + types: { + query: z.object({ workspaceId: z.string(), id: z.string() }), + }, + handle: async ({ user, query: { workspaceId, id }, req }) => { + await verifyAccess(user, workspaceId); + const existingPB = await db.prisma().profileBuilder.findFirst({ + where: { workspaceId: workspaceId, id, deleted: false }, + }); + if (!existingPB) { + return { deleted: false }; + } + await db.prisma().profileBuilder.update({ where: { id: existingPB.id }, data: { deleted: true } }); + + return { deleted: true }; + }, + }, +}; +export default nextJsApiHandler(api); diff --git a/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts b/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts index d44138b17..f39cc3c0b 100644 --- a/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts +++ b/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts @@ -44,7 +44,10 @@ export const api: Api = { const link = await db .prisma() .configurationObjectLink.findFirst({ where: { id: query.actorId, workspaceId: query.workspaceId } }); - if (!link) { + const pb = await db + .prisma() + .profileBuilder.findFirst({ where: { id: query.actorId, workspaceId: query.workspaceId } }); + if (!link && !pb) { throw new ApiError(`connection doesn't belong to the current workspace`, {}, { status: 403 }); } } diff --git a/webapps/console/pages/api/admin/domains.ts b/webapps/console/pages/api/admin/domains.ts index 7ddcfc162..6a75fb52c 100644 --- a/webapps/console/pages/api/admin/domains.ts +++ b/webapps/console/pages/api/admin/domains.ts @@ -5,7 +5,7 @@ import { dataDomains } from "../../../lib/server/data-domains"; import { z } from "zod"; import { getLog } from "juava"; -export const log = getLog("caddy-domains"); +const log = getLog("caddy-domains"); //For Caddy to allow issuing certificates for a domain, it must be present in the domains array of a stream object. //or it must be a subdomain of the data domain export default createRoute() diff --git a/webapps/console/pages/api/admin/events-log-init.ts b/webapps/console/pages/api/admin/events-log-init.ts index 42605d8a2..29f9f9148 100644 --- a/webapps/console/pages/api/admin/events-log-init.ts +++ b/webapps/console/pages/api/admin/events-log-init.ts @@ -4,7 +4,7 @@ import { clickhouse } from "../../../lib/server/clickhouse"; import { z } from "zod"; import { getServerLog } from "../../../lib/server/log"; -export const log = getServerLog("events-log-init"); +const log = getServerLog("events-log-init"); export default createRoute() .GET({ diff --git a/webapps/console/pages/api/admin/events-log-trim.ts b/webapps/console/pages/api/admin/events-log-trim.ts index aed0938e8..4233468e6 100644 --- a/webapps/console/pages/api/admin/events-log-trim.ts +++ b/webapps/console/pages/api/admin/events-log-trim.ts @@ -4,7 +4,7 @@ import { clickhouse } from "../../../lib/server/clickhouse"; import dayjs from "dayjs"; import { getServerLog } from "../../../lib/server/log"; -export const log = getServerLog("events-log-trim"); +const log = getServerLog("events-log-trim"); const localIps = ["127.0.0.1", "0:0:0:0:0:0:0:1", "::1", "::ffff:127.0.0.1"]; diff --git a/webapps/console/pages/api/admin/export/[name]/index.ts b/webapps/console/pages/api/admin/export/[name]/index.ts index 9ef00d914..4ce72b08a 100644 --- a/webapps/console/pages/api/admin/export/[name]/index.ts +++ b/webapps/console/pages/api/admin/export/[name]/index.ts @@ -35,6 +35,7 @@ async function getLastUpdated(): Promise { select greatest( (select max("updatedAt") from newjitsu."ConfigurationObjectLink"), + (select max("updatedAt") from newjitsu."ProfileBuilder"), (select max("updatedAt") from newjitsu."ConfigurationObject"), (select max("updatedAt") from newjitsu."Workspace") ) as "last_updated"`) as any @@ -89,6 +90,74 @@ const exports: Export[] = [ break; } } + lastId = undefined; + while (true) { + const objects = await db.prisma().profileBuilder.findMany({ + where: { deleted: false, workspace: { deleted: false }, destination: { deleted: false } }, + include: { destination: true, workspace: true }, + take: batchSize, + cursor: lastId ? { id: lastId } : undefined, + orderBy: { id: "asc" }, + }); + if (objects.length == 0) { + break; + } + getLog().atDebug().log(`Got batch of ${objects.length} profilebuilder objects for bulker export`); + lastId = objects[objects.length - 1].id; + for (const { id, updatedAt, workspace, destination, connectionOptions, ...pb } of objects) { + const destinationType = destination.config.destinationType; + const coreDestinationType = getCoreDestinationTypeNonStrict(destinationType); + if (coreDestinationType?.usesBulker || coreDestinationType?.hybrid) { + if (needComma) { + writer.write(","); + } + const schema = { + name: "profiles", + fields: [ + { + name: "user_id", + type: 4, //string. See bulker's DataType + }, + { + name: "traits", + type: 6, // json + }, + { + name: "custom_properties", + type: 6, // json + }, + { + name: "updated_at", + type: 5, // timestamp + }, + ], + }; + writer.write( + JSON.stringify({ + __debug: { + workspace: { id: workspace.id, name: workspace.slug }, + }, + id: id, + type: destinationType, + options: { + mode: "batch", + frequency: 1, + ...connectionOptions, + deduplicate: true, + primaryKey: "user_id", + schema: JSON.stringify(schema), + }, + updatedAt: dateMax(updatedAt, destination.updatedAt), + credentials: omit(destination.config, "destinationType", "type", "name"), + }) + ); + needComma = true; + } + } + if (objects.length < batchSize) { + break; + } + } if (isEEAvailable()) { //stream additional connections from ee const eeAuthToken = createJwt( @@ -113,6 +182,7 @@ const exports: Export[] = [ needComma = true; } } + writer.write("]"); }, }, @@ -296,7 +366,7 @@ const exports: Export[] = [ ...obj.config, workspaceId: obj.workspace.id, }, - backupEnabled: !(obj.workspace.featuresEnabled || []).includes("nobackup"), + backupEnabled: isEEAvailable() && !(obj.workspace.featuresEnabled || []).includes("nobackup"), throttle: throttlePercent, shard: shardNumber, destinations: obj.toLinks @@ -320,6 +390,53 @@ const exports: Export[] = [ writer.write("]"); }, }, + { + name: "workspaces-with-profiles", + lastModified: async () => { + return ( + (await db.prisma().$queryRaw` + select + greatest( + (select max("updatedAt") from newjitsu."ProfileBuilder"), + (select max("updatedAt") from newjitsu."ProfileBuilderFunction"), + (select max("updatedAt") from newjitsu."Workspace") + ) as "last_updated"`) as any + )[0]["last_updated"]; + }, + data: async writer => { + writer.write("["); + let lastId: string | undefined = undefined; + let needComma = false; + while (true) { + const objects = await db.prisma().workspace.findMany({ + where: { + deleted: false, + profileBuilders: { some: { NOT: { id: undefined } } }, + }, + include: { profileBuilders: { include: { functions: true } } }, + take: batchSize, + cursor: lastId ? { id: lastId } : undefined, + orderBy: { id: "asc" }, + }); + if (objects.length == 0) { + break; + } + getLog().atDebug().log(`Got batch of ${objects.length} objects for bulker export`); + lastId = objects[objects.length - 1].id; + for (const row of objects) { + if (needComma) { + writer.write(","); + } + writer.write(JSON.stringify(row)); + needComma = true; + } + if (objects.length < batchSize) { + break; + } + } + writer.write("]"); + }, + }, { name: "syncs-debug", lastModified: getLastUpdated, diff --git a/webapps/console/pages/api/fb-auth/create-session.ts b/webapps/console/pages/api/fb-auth/create-session.ts index 27d1a0592..cc378057f 100644 --- a/webapps/console/pages/api/fb-auth/create-session.ts +++ b/webapps/console/pages/api/fb-auth/create-session.ts @@ -8,7 +8,7 @@ import { getRequestHost } from "../../../lib/server/origin"; import { getServerLog } from "../../../lib/server/log"; import { getLog } from "juava"; -export const log = getServerLog("firebase"); +const log = getServerLog("firebase"); export const api: Api = { url: inferUrl(__filename), diff --git a/webapps/console/pages/api/fb-auth/revoke-session.ts b/webapps/console/pages/api/fb-auth/revoke-session.ts index c98054d46..c4b8090de 100644 --- a/webapps/console/pages/api/fb-auth/revoke-session.ts +++ b/webapps/console/pages/api/fb-auth/revoke-session.ts @@ -4,7 +4,7 @@ import { serialize } from "cookie"; import { getAppEndpoint } from "../../../lib/domains"; import { getServerLog } from "../../../lib/server/log"; -export const log = getServerLog("firebase"); +const log = getServerLog("firebase"); export default createRoute() .GET({ auth: true }) diff --git a/webapps/console/prisma/schema.prisma b/webapps/console/prisma/schema.prisma index ecd6912fd..922df12bb 100644 --- a/webapps/console/prisma/schema.prisma +++ b/webapps/console/prisma/schema.prisma @@ -90,7 +90,7 @@ model Workspace { preferences UserPreferences[] workspaceUserProperties WorkspaceUserProperties[] featuresEnabled String[] @default([]) - profileBuilderSettings ProfileBuilderSettings[] + profileBuilders ProfileBuilder[] @@unique(slug) @@index(slug) @@ -163,10 +163,10 @@ model ConfigurationObject { workspace Workspace @relation(fields: [workspaceId], references: [id]) config Json? - fromLinks ConfigurationObjectLink[] @relation("from") - toLinks ConfigurationObjectLink[] @relation("to") - ProfileBuilderSettings ProfileBuilderSettings[] - ProfileBuilderFunctions ProfileBuilderFunctions[] + fromLinks ConfigurationObjectLink[] @relation("from") + toLinks ConfigurationObjectLink[] @relation("to") + ProfileBuilder ProfileBuilder[] + ProfileBuilderFunction ProfileBuilderFunction[] @@index(updatedAt(sort: Desc)) } @@ -291,29 +291,47 @@ model task_log { @@index(timestamp) } -model ProfileBuilderSettings { - id String @id @default(cuid()) - createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) - updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) +model ProfileBuilder { + id String @id @default(cuid()) + name String + deleted Boolean? @default(false) + createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) + updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) workspaceId String - workspace Workspace @relation(fields: [workspaceId], references: [id]) + workspace Workspace @relation(fields: [workspaceId], references: [id]) intermediateStorageCredentials Json destinationId String - destination ConfigurationObject @relation(fields: [destinationId], references: [id]) - ProfileBuilderFunctions ProfileBuilderFunctions[] + destination ConfigurationObject @relation(fields: [destinationId], references: [id]) + connectionOptions Json? + functions ProfileBuilderFunction[] + version Int @default(0) } -model ProfileBuilderFunctions { - id String @id @default(cuid()) - createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) - updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) - profileBuilderSettingsId String - profileBuilderSettings ProfileBuilderSettings @relation(fields: [profileBuilderSettingsId], references: [id]) - functionId String - function ConfigurationObject @relation(fields: [functionId], references: [id]) +model ProfileBuilderFunction { + id String @id @default(cuid()) + createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) + updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) + profileBuilderId String + profileBuilder ProfileBuilder @relation(fields: [profileBuilderId], references: [id]) + functionId String + function ConfigurationObject @relation(fields: [functionId], references: [id]) } -// +model ProfileBuilderState { + profileBuilderId String + profileBuilderVersion Int + instanceIndex Int + totalInstances Int + startedAt DateTime + updatedAt DateTime + lastTimestamp DateTime + processedUsers Int + totalUsers Int + errorUsers Int + speed Float + + @@id([profileBuilderId, profileBuilderVersion, totalInstances, instanceIndex]) +} //model OauthSecrets { // id String @id @default(cuid()) diff --git a/webapps/ee-api/package.json b/webapps/ee-api/package.json index ae2eb739a..880b27cc0 100644 --- a/webapps/ee-api/package.json +++ b/webapps/ee-api/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@aws-sdk/client-s3": "^3.418.0", - "@clickhouse/client": "^1.4.0", + "@clickhouse/client": "^1.6.0", "@react-email/components": "^0.0.25", "@types/node": "^18.15.3", "@types/react": "18.3.3", diff --git a/webapps/ee-api/pages/api/provision-db.ts b/webapps/ee-api/pages/api/provision-db.ts index ff91c00c0..1deefc647 100644 --- a/webapps/ee-api/pages/api/provision-db.ts +++ b/webapps/ee-api/pages/api/provision-db.ts @@ -5,7 +5,7 @@ import { withErrorHandler } from "../../lib/route-helpers"; import { clickhouse, store } from "../../lib/services"; import { getServerLog } from "../../lib/log"; -export const log = getServerLog("provision-db"); +const log = getServerLog("provision-db"); export type Credentials = { username: string; diff --git a/webapps/ee-api/pages/api/s3-connections.ts b/webapps/ee-api/pages/api/s3-connections.ts index cecb8cec1..d188f35c6 100644 --- a/webapps/ee-api/pages/api/s3-connections.ts +++ b/webapps/ee-api/pages/api/s3-connections.ts @@ -6,7 +6,7 @@ import { pg } from "../../lib/services"; import { getServerLog } from "../../lib/log"; import pick from "lodash/pick"; -export const log = getServerLog("s3-bucket-init"); +const log = getServerLog("s3-bucket-init"); const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { if (!process.env.S3_REGION || !process.env.S3_ACCESS_KEY_ID || !process.env.S3_SECRET_ACCESS_KEY) { diff --git a/webapps/ee-api/pages/api/s3-init.ts b/webapps/ee-api/pages/api/s3-init.ts index cf8dc88b1..8d991a774 100644 --- a/webapps/ee-api/pages/api/s3-init.ts +++ b/webapps/ee-api/pages/api/s3-init.ts @@ -6,7 +6,7 @@ import { s3client, store } from "../../lib/services"; import { CreateBucketCommand, CreateBucketCommandInput } from "@aws-sdk/client-s3"; import { getServerLog } from "../../lib/log"; -export const log = getServerLog("s3-bucket-init"); +const log = getServerLog("s3-bucket-init"); export type Credentials = { accessKeyId: string; From d6470b4558cfc95d17c6678c2d9e581af94c3f38 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Thu, 10 Oct 2024 14:45:47 -0400 Subject: [PATCH 0912/1353] feat (ee): throttle emails --- package.json | 2 + webapps/ee-api/emails/throttling-started.tsx | 141 +++++++++++++++++++ webapps/ee-api/lib/email.tsx | 31 ++-- webapps/ee-api/pages/api/email.tsx | 68 ++++++--- webapps/ee-api/pages/api/set-throttle.ts | 38 +++++ 5 files changed, 250 insertions(+), 30 deletions(-) create mode 100644 webapps/ee-api/pages/api/set-throttle.ts diff --git a/package.json b/package.json index 40a207842..ba5e8eddf 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,8 @@ "format": "prettier --ignore-unknown --write --config ./.prettierrc.json --ignore-path ./.prettierignore $(git diff --name-only --diff-filter d | xargs)", "format:all": "prettier --write --config ./.prettierrc.json --ignore-path ./.prettierignore .", "tool:hash": "turbo run tool:hash --", + "ci:no-test": "pnpm format:check:all && pnpm lint && pnpm build", + "ci:all": "pnpm ci:no-test && pnpm test", "prepare": "husky install", "pre-commit": "pnpm format:check", "build": "turbo run build", diff --git a/webapps/ee-api/emails/throttling-started.tsx b/webapps/ee-api/emails/throttling-started.tsx index e69de29bb..2db041c52 100644 --- a/webapps/ee-api/emails/throttling-started.tsx +++ b/webapps/ee-api/emails/throttling-started.tsx @@ -0,0 +1,141 @@ +import { EmailComponent, UnsubscribeLink, UnsubscribeLinkProps, withDefaults } from "../components/email-component"; +import { Body, Button, Container, Html, Preview, Section, Text } from "@react-email/components"; +import React from "react"; +import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; +import { main } from "./styles"; + +dayjs.extend(utc); + +export type ThrottlingStartedEmailProps = { + name?: string; + workspaceName?: string; + workspaceSlug?: string; + throttled?: number; +} & UnsubscribeLinkProps; + +const ThrottlingStartedEmail: EmailComponent = ({ + name, + workspaceName, + workspaceSlug, + throttled, + unsubscribeLink, +}: ThrottlingStartedEmailProps) => ( + + [Action Required] Throttling of Your Jitsu Workspace Events Has Started + + +
    + + 🚨 We started throttling events coming into your{" "} + + Jitsu Workspace + {" "} + at rate of {throttled}% + +
    + + 👋 Hi {name || "there"}! + + + You’ve been making the most out of Jitsu, and we’re thrilled to see your progress! We wanted to let you know + that you’ve{" "} + + reached 100% of your free event quota + {" "} + for this month in your Jitsu Workspace. Unfortunately, we had to start dropping events coming into your + workspace at a rate of {throttled}%. + + + To restore full event flow and avoid further data loss, we recommend upgrading your plan. + +
    + + Upgrade now to restore full event flow and ensure uninterrupted service. + +
    + +
    + +
    + + + Thank you for your continued use of Jitsu! We{"'"}re here to help you manage your data effectively. + + + Best Regards, +
    + Jitsu Team +
    + + jitsu.com + +
    + {unsubscribeLink && } +
    + + +); + +ThrottlingStartedEmail.defaultValues = { + name: "John", + workspaceSlug: "workspace-slug", + workspaceName: "Workspace Name", + throttled: 50, + unsubscribeLink: "https://example.com/unsubscribe", +}; + +ThrottlingStartedEmail.from = "Jitsu Support "; +ThrottlingStartedEmail.replyTo = "Jitsu Support "; + +// This is a transactional email +ThrottlingStartedEmail.allowUnsubscribe = false; +ThrottlingStartedEmail.respectUnsubscribed = false; + +ThrottlingStartedEmail.subject = ({ throttled }) => + `🚨[Action Required] Throttling of Your Jitsu Events Has Started at ${throttled}% Rate`; + +ThrottlingStartedEmail.plaintext = ({ + name, + workspaceName, + workspaceSlug, + throttled, + unsubscribeLink, +}: ThrottlingStartedEmailProps) => { + return `👋 Hi ${name || "there"}! + +As of now, due to excessive usage, your event throughput in the ${workspaceName} Workspace is being throttled to ${throttled}%. This means ${ + 100 - (throttled || 0) + }% of events are being dropped. + +To restore full event flow, please consider upgrading your plan. + +You can update your billing here: https://use.jitsu.com/${workspaceSlug}/settings/billing. + +Thanks, +Jitsu Team + +${unsubscribeLink ? `If you’d like to unsubscribe, click here: ${unsubscribeLink}` : ""} +`; +}; + +export default withDefaults(ThrottlingStartedEmail); diff --git a/webapps/ee-api/lib/email.tsx b/webapps/ee-api/lib/email.tsx index 3fe4fc77a..bbcdbcf8a 100644 --- a/webapps/ee-api/lib/email.tsx +++ b/webapps/ee-api/lib/email.tsx @@ -6,11 +6,12 @@ import { Resend } from "resend"; import { EmailComponent, UnsubscribeLinkProps } from "../components/email-component"; import WelcomeEmail from "../emails/welcome"; import { requireDefined } from "juava"; -import Churned from "../emails/churned"; import ChurnedCustomerEmail from "../emails/churned"; import QuotaExceeded from "../emails/quota-exceeded"; import QuotaAboutToExceed from "../emails/quota-about-to-exceed"; import ThrottledReminderEmail from "../emails/throttling-reminder"; +import { Simplify } from "type-fest"; +import ThrottlingStarted from "../emails/throttling-started"; dayjs.extend(utc); export const UnsubscribeCodes = z.object({ @@ -83,7 +84,7 @@ export const SendEmailRequest = z.object({ dryRun: z.boolean().optional(), }); -export type Payload = z.infer; +export type SendEmailRequest = z.infer; export function getComponent(template: string): EmailComponent { switch (template) { @@ -97,6 +98,8 @@ export function getComponent(template: string): EmailComponent { +export type WorkspaceInfo = { workspaceId; workspaceSlug; workspaceName }; + +export async function getWorkspaceInfo(workspaceIdOrSlug: string | undefined): Promise { const query = `select id as "workspaceId", slug as "workspaceSlug", name as "workspaceName" from newjitsu."Workspace" where id = $1 or slug = $1`; const result = await pg.query(query, [workspaceIdOrSlug]); return result.rows?.[0]; @@ -150,7 +153,15 @@ function firstDefined(...args: (T | undefined)[]): T { return args.find(arg => arg !== undefined) as T; } -export async function sendEmail(payload: Omit & { to: string }) { +type DiscriminatedUnion = + | (T1 & { [K in Exclude]?: never }) + | (T2 & { [K in Exclude]?: never }); + +export type EmailSendingResult = Simplify< + DiscriminatedUnion<{ sent: false; reasonNotSent: string }, { sent: true; subject: string; messageId: string }> +>; + +export async function sendEmail(payload: Omit & { to: string }): Promise { let workspace; if (payload.workspaceId) { workspace = await getWorkspaceInfo(payload.workspaceId); @@ -173,7 +184,7 @@ export async function sendEmail(payload: Omit & { to: string }) { if (respectUnsubscribe && (await isUnsubscribed(recepient))) { console.log(`Not sending email to unsubscribed recipient: ${recepient}`); - return { unsubscribed: true, recipient: recepient, message: "Recipient is unsubscribed" }; + return { sent: false, reasonNotSent: `${recepient} is unsubscribed` }; } const domain = getDomainFromEmail(from); const unsubscribeCode = await getUnsubscribeCode(recepient, { rotateExpired: true }); @@ -214,8 +225,8 @@ export async function sendEmail(payload: Omit & { to: string }) { throw new Error(`Error sending email: ${JSON.stringify(result.error)}`); } return { - unsubscribed: false, - recipient: recepient, - messageId: result.data?.id, + sent: true, + subject, + messageId: result.data?.id || "", }; } diff --git a/webapps/ee-api/pages/api/email.tsx b/webapps/ee-api/pages/api/email.tsx index 9ddc48789..8cf18d53c 100644 --- a/webapps/ee-api/pages/api/email.tsx +++ b/webapps/ee-api/pages/api/email.tsx @@ -2,11 +2,10 @@ import { NextApiRequest, NextApiResponse } from "next"; import { withErrorHandler } from "../../lib/route-helpers"; import { assertDefined, assertTrue, requireDefined } from "juava"; import { auth } from "../../lib/auth"; -import { pg } from "../../lib/services"; +import { pg, store } from "../../lib/services"; import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; -import { result } from "lodash"; -import { getWorkspaceInfo, sendEmail, SendEmailRequest } from "../../lib/email"; +import { EmailSendingResult, getWorkspaceInfo, sendEmail, SendEmailRequest, WorkspaceInfo } from "../../lib/email"; dayjs.extend(utc); @@ -25,34 +24,63 @@ export function makeAddress({ name, email }): string { return name ? `${name} <${email}>` : email; } +async function logWorkspaceEmail(opts: { workspaceId: string; [key: string]: any }) { + const { workspaceId, ...data } = opts; + const log = (await store.getTable("email-logs").get(workspaceId)) || { logs: [] }; + log.logs.push(data); + await store.getTable("email-logs").put(workspaceId, log); +} + +export async function sendWorkspaceEmail(payload: SendEmailRequest): Promise<{ + sent: Record; + errors: Record; + workspace: WorkspaceInfo; +}> { + const sent: Record = {}; + const errors: Record = {}; + const workspace = requireDefined( + await getWorkspaceInfo(payload.workspaceId), + `Workspace not found: ${payload.workspaceId}` + ); + const members = await getWorkspaceMembers(workspace.workspaceId); + for (const member of members) { + try { + console.log( + `Handling member ${member.email} of workspace ${workspace.workspaceId} / ${workspace.workspaceSlug}` + ); + sent[member.email] = await sendEmail({ ...payload, to: makeAddress(member) }); + } catch (e: any) { + errors[member.email] = e?.message; + console.error(`Error sending email to ${member.email}: ${e?.message}`, e); + } + } + const subject = Object.values(sent) + .filter(res => res.sent) + .map(res => res.subject); + await logWorkspaceEmail({ + timestamp: dayjs().utc().toISOString(), + workspaceId: workspace.workspaceId, + subject: subject || "No emails sent, all unsubscribed", + template: payload.template, + sentTo: Object.keys(sent).join(", "), + errors: Object.keys(errors).length > 0 ? Object.keys(errors).join(", ") : undefined, + }); + return { sent, errors, workspace }; +} + const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { if (req.method === "POST") { const claims = requireDefined(await auth(req, res), `Auth is required`); assertTrue(claims.type === "admin", "Invalid auth claims"); const payload = SendEmailRequest.parse(req.body); if (payload.workspaceId) { - const workspace = requireDefined( - await getWorkspaceInfo(payload.workspaceId), - `Workspace not found: ${payload.workspaceId}` - ); - const members = await getWorkspaceMembers(workspace.workspaceId); - for (const member of members) { - try { - console.log( - `Handling member ${member.email} of workspace ${workspace.workspaceId} / ${workspace.workspaceSlug}` - ); - result[member.email] = await sendEmail({ ...payload, to: makeAddress(member) }); - } catch (e: any) { - result[member.email] = { error: e?.message }; - console.error(`Error sending email to ${member.email}: ${e?.message}`, e); - } - } + const result = await sendWorkspaceEmail(payload); res.status(200).json(result); } else { requireDefined(payload.from, "from is required"); assertDefined(payload.to, "to is required"); const result = await sendEmail(payload as any); - res.status(200).json(result); + res.status(200).json({ result }); } } else { res.status(405).json({ error: "use POST" }); diff --git a/webapps/ee-api/pages/api/set-throttle.ts b/webapps/ee-api/pages/api/set-throttle.ts new file mode 100644 index 000000000..d31bd208e --- /dev/null +++ b/webapps/ee-api/pages/api/set-throttle.ts @@ -0,0 +1,38 @@ +import { NextApiRequest, NextApiResponse } from "next"; +import { withErrorHandler } from "../../lib/route-helpers"; +import { auth } from "../../lib/auth"; +import { requireDefined } from "juava"; +import { pg } from "../../lib/services"; +import { sendWorkspaceEmail } from "./email"; + +const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { + const claims = await auth(req, res); + if (claims?.type !== "admin") { + throw new Error("Unauthorized"); + } + const workspaceIdOrSlug = requireDefined(req.query.workspace, `workspace id is required`) as string; + const throttle = parseInt(requireDefined(req.query.throttle, `Throttle is required`) as string); + const { id: workspaceId, featuresEnabled } = ( + await pg.query(`select id, "featuresEnabled" from newjitsu."Workspace" where id = $1 or slug = $1`, [ + workspaceIdOrSlug, + ]) + )?.rows[0]; + if (!workspaceId) { + throw new Error(`Workspace not found: ${workspaceIdOrSlug}`); + } + const featuresWithoutThrottle = featuresEnabled.filter(f => !f.startsWith("throttle")); + const newFeatures = throttle > 0 ? [...featuresWithoutThrottle, `throttle=${throttle}`] : featuresWithoutThrottle; + await pg.query(`update newjitsu."Workspace" set "featuresEnabled" = $1 where id = $2`, [newFeatures, workspaceId]); + + if (throttle > 0) { + await sendWorkspaceEmail({ + workspaceId: workspaceId, + template: "throttling-started", + variables: { throttled: throttle }, + }); + } + + res.json({ workspaceId, newFeatures, featuresEnabled, featuresWithoutThrottle }); +}; + +export default withErrorHandler(handler); From ffb83c8ae8d9ec58d1fdadafb3138b4429f1d1bd Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 14 Oct 2024 16:59:55 +0400 Subject: [PATCH 0913/1353] console: api: added metrics endpoint upgrade typescript --- cli/jitsu-cli/package.json | 2 +- examples/react-app/package.json | 2 +- libs/jitsu-js/package.json | 2 +- libs/jitsu-react/package.json | 2 +- libs/jsondiffpatch/package.json | 2 +- package.json | 4 +- pnpm-lock.yaml | 534 +++++++++--------- services/profiles/package.json | 2 +- services/profiles/src/builder.ts | 4 +- services/profiles/src/index.ts | 2 - services/rotor/package.json | 2 +- webapps/console/package.json | 2 +- .../pages/api/[workspaceId]/metrics/index.ts | 73 +++ webapps/ee-api/package.json | 2 +- 14 files changed, 353 insertions(+), 282 deletions(-) create mode 100644 webapps/console/pages/api/[workspaceId]/metrics/index.ts diff --git a/cli/jitsu-cli/package.json b/cli/jitsu-cli/package.json index 58cea0b08..edeb0fc52 100644 --- a/cli/jitsu-cli/package.json +++ b/cli/jitsu-cli/package.json @@ -25,7 +25,7 @@ "figlet": "^1.6.0", "jest-cli": "^29.7.0", "tslib": "^2.6.3", - "typescript": "^5.5.4" + "typescript": "^5.6.3" }, "devDependencies": { "@babel/preset-env": "^7.23.2", diff --git a/examples/react-app/package.json b/examples/react-app/package.json index 161cdcf94..a8286c5df 100644 --- a/examples/react-app/package.json +++ b/examples/react-app/package.json @@ -30,7 +30,7 @@ ] }, "devDependencies": { - "typescript": "^5.5.4", + "typescript": "^5.6.3", "@types/react-dom": "^18.3.0", "@types/react": "^18.3.3", "@types/lodash": "^4.14.185", diff --git a/libs/jitsu-js/package.json b/libs/jitsu-js/package.json index 0f05976e2..0bcab99b1 100644 --- a/libs/jitsu-js/package.json +++ b/libs/jitsu-js/package.json @@ -43,7 +43,7 @@ "raw-loader": "^4.0.2", "rollup": "^3.2.5", "ts-jest": "29.0.5", - "typescript": "^5.5.4", + "typescript": "^5.6.3", "jsondiffpatch": "workspace:*" }, "dependencies": { diff --git a/libs/jitsu-react/package.json b/libs/jitsu-react/package.json index 05189c4a3..6bd52ab1e 100644 --- a/libs/jitsu-react/package.json +++ b/libs/jitsu-react/package.json @@ -36,7 +36,7 @@ "@types/jest": "^29.2.3", "@types/node": "^18.15.3", "microbundle-crl": "^0.13.11", - "typescript": "^5.5.4", + "typescript": "^5.6.3", "@babel/plugin-transform-regenerator": "^7.22.10" }, "files": [ diff --git a/libs/jsondiffpatch/package.json b/libs/jsondiffpatch/package.json index 359c9f1c3..6d2d8df11 100644 --- a/libs/jsondiffpatch/package.json +++ b/libs/jsondiffpatch/package.json @@ -40,7 +40,7 @@ "jest": "^29.7.0", "ts-jest": "^29.1.1", "tslib": "^2.6.3", - "typescript": "^5.5.4" + "typescript": "^5.6.3" }, "license": "MIT", "engines": { diff --git a/package.json b/package.json index ba5e8eddf..b91b09cf0 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "prettier": "^2.8.7", "ts-node": "^10.9.2", "turbo": "~1.2.16", - "typescript": "^5.5.4", + "typescript": "^5.6.3", "vercel": "^35.2.3" }, "engines": { @@ -57,4 +57,4 @@ "cli/*", "libs/*" ] -} \ No newline at end of file +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4e702afd3..052898da1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,13 +25,13 @@ importers: version: 2.8.8 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@16.18.11)(typescript@5.5.4) + version: 10.9.2(@types/node@16.18.11)(typescript@5.6.3) turbo: specifier: ~1.2.16 version: 1.2.16 typescript: - specifier: ^5.5.4 - version: 5.5.4 + specifier: ^5.6.3 + version: 5.6.3 vercel: specifier: ^35.2.3 version: 35.2.3(encoding@0.1.13) @@ -89,13 +89,13 @@ importers: version: 1.7.0 jest-cli: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + version: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) tslib: specifier: ^2.6.3 version: 2.6.3 typescript: - specifier: ^5.5.4 - version: 5.5.4 + specifier: ^5.6.3 + version: 5.6.3 devDependencies: '@babel/preset-env': specifier: ^7.23.2 @@ -123,7 +123,7 @@ importers: version: 0.4.4(rollup@3.29.4) '@rollup/plugin-typescript': specifier: ^11.1.3 - version: 11.1.6(rollup@3.29.4)(tslib@2.6.3)(typescript@5.5.4) + version: 11.1.6(rollup@3.29.4)(tslib@2.6.3)(typescript@5.6.3) '@types/chalk': specifier: ^2.2.0 version: 2.2.0 @@ -174,7 +174,7 @@ importers: version: 9.3.6 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + version: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) json5: specifier: ^2.2.3 version: 2.2.3 @@ -201,13 +201,13 @@ importers: version: 7.6.3 ts-jest: specifier: ^29.1.1 - version: 29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4) + version: 29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)))(typescript@5.6.3) ts-loader: specifier: ^9.4.4 - version: 9.5.1(typescript@5.5.4)(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) + version: 9.5.1(typescript@5.6.3)(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) + version: 10.9.2(@types/node@18.19.42)(typescript@5.6.3) webpack: specifier: ^5.91.0 version: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) @@ -234,7 +234,7 @@ importers: version: 5.4.1 jest: specifier: ^29.3.1 - version: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + version: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)) json5: specifier: ^2.1.0 version: 2.2.3 @@ -249,7 +249,7 @@ importers: version: 9.12.0(encoding@0.1.13) ts-jest: specifier: 29.0.5 - version: 29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)))(typescript@5.5.4) + version: 29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)))(typescript@5.6.3) tslib: specifier: ^2.6.3 version: 2.6.3 @@ -279,7 +279,7 @@ importers: version: 6.25.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-scripts: specifier: ^5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(@types/babel__core@7.20.5)(@types/webpack@5.28.5)(eslint@8.57.0)(react@18.3.1)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))(type-fest@3.13.1)(typescript@5.5.4) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(@types/babel__core@7.20.5)(@types/webpack@5.28.5)(eslint@8.57.0)(react@18.3.1)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3))(type-fest@3.13.1)(typescript@5.6.3) web-vitals: specifier: ^2.1.4 version: 2.1.4 @@ -295,10 +295,10 @@ importers: version: 18.3.0 tailwindcss: specifier: ^3.0.24 - version: 3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + version: 3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) typescript: - specifier: ^5.5.4 - version: 5.5.4 + specifier: ^5.6.3 + version: 5.6.3 libs/core-functions: dependencies: @@ -377,7 +377,7 @@ importers: version: 4.21.1 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)) json5: specifier: ^2.1.0 version: 2.2.3 @@ -386,7 +386,7 @@ importers: version: 3.3.2 ts-jest: specifier: ^29.2.3 - version: 29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)))(typescript@5.5.4) + version: 29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)))(typescript@5.6.3) libs/functions: dependencies: @@ -399,7 +399,7 @@ importers: devDependencies: '@rollup/plugin-typescript': specifier: ^11.1.5 - version: 11.1.6(rollup@4.19.1)(tslib@2.6.3)(typescript@5.5.4) + version: 11.1.6(rollup@4.19.1)(tslib@2.6.3)(typescript@5.6.3) '@types/jest': specifier: ^29.1.1 version: 29.5.12 @@ -408,13 +408,13 @@ importers: version: 18.19.42 jest: specifier: ^29.1.2 - version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)) rollup: specifier: ^4.1.4 version: 4.19.1 ts-jest: specifier: 29.0.5 - version: 29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)))(typescript@5.5.4) + version: 29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)))(typescript@5.6.3) libs/jitsu-js: dependencies: @@ -472,7 +472,7 @@ importers: version: 4.21.1 jest: specifier: ^29.2.2 - version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)) jsondiffpatch: specifier: workspace:* version: link:../jsondiffpatch @@ -490,13 +490,13 @@ importers: version: 3.29.4 ts-jest: specifier: 29.0.5 - version: 29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)))(typescript@5.5.4) + version: 29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)))(typescript@5.6.3) tslib: specifier: ^2.6.3 version: 2.6.3 typescript: - specifier: ^5.5.4 - version: 5.5.4 + specifier: ^5.6.3 + version: 5.6.3 libs/jitsu-react: dependencies: @@ -538,8 +538,8 @@ importers: specifier: ^9.6.0 version: 9.6.0 typescript: - specifier: ^5.5.4 - version: 5.5.4 + specifier: ^5.6.3 + version: 5.6.3 libs/jsondiffpatch: devDependencies: @@ -548,10 +548,10 @@ importers: version: 29.5.12 '@typescript-eslint/eslint-plugin': specifier: ^7.18.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3) '@typescript-eslint/parser': specifier: ^7.18.0 - version: 7.18.0(eslint@8.57.0)(typescript@5.5.4) + version: 7.18.0(eslint@8.57.0)(typescript@5.6.3) eslint: specifier: ^8.57.0 version: 8.57.0 @@ -560,16 +560,16 @@ importers: version: 9.1.0(eslint@8.57.0) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + version: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)) ts-jest: specifier: ^29.1.1 - version: 29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)))(typescript@5.5.4) + version: 29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)))(typescript@5.6.3) tslib: specifier: ^2.6.3 version: 2.6.3 typescript: - specifier: ^5.5.4 - version: 5.5.4 + specifier: ^5.6.3 + version: 5.6.3 libs/juava: dependencies: @@ -588,10 +588,10 @@ importers: version: 18.19.42 jest: specifier: ^29.1.2 - version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)) ts-jest: specifier: 29.0.5 - version: 29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)))(typescript@5.5.4) + version: 29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)))(typescript@5.6.3) services/profiles: dependencies: @@ -697,7 +697,7 @@ importers: version: 7.4.2 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) lodash: specifier: ^4.17.21 version: 4.17.21 @@ -709,19 +709,19 @@ importers: version: 3.1.4 ts-jest: specifier: ^29.2.3 - version: 29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4) + version: 29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)))(typescript@5.6.3) ts-loader: specifier: ^9.4.2 - version: 9.5.1(typescript@5.5.4)(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) + version: 9.5.1(typescript@5.6.3)(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) + version: 10.9.2(@types/node@18.19.42)(typescript@5.6.3) ts-node-dev: specifier: ^2.0.0 - version: 2.0.0(@types/node@18.19.42)(typescript@5.5.4) + version: 2.0.0(@types/node@18.19.42)(typescript@5.6.3) typescript: - specifier: ^5.5.4 - version: 5.5.4 + specifier: ^5.6.3 + version: 5.6.3 webpack: specifier: ^5.93.0 version: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) @@ -866,7 +866,7 @@ importers: version: 7.4.2 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + version: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) lodash: specifier: ^4.17.21 version: 4.17.21 @@ -878,19 +878,19 @@ importers: version: 3.1.4 ts-jest: specifier: ^29.2.3 - version: 29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4) + version: 29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)))(typescript@5.6.3) ts-loader: specifier: ^9.4.2 - version: 9.5.1(typescript@5.5.4)(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) + version: 9.5.1(typescript@5.6.3)(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) + version: 10.9.2(@types/node@18.19.42)(typescript@5.6.3) ts-node-dev: specifier: ^2.0.0 - version: 2.0.0(@types/node@18.19.42)(typescript@5.5.4) + version: 2.0.0(@types/node@18.19.42)(typescript@5.6.3) typescript: - specifier: ^5.5.4 - version: 5.5.4 + specifier: ^5.6.3 + version: 5.6.3 webpack: specifier: ^5.93.0 version: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) @@ -1121,7 +1121,7 @@ importers: version: 5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tailwindcss/typography': specifier: ^0.5.7 - version: 0.5.13(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))) + version: 0.5.13(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3))) '@testing-library/jest-dom': specifier: ^6.1.3 version: 6.4.8 @@ -1175,13 +1175,13 @@ importers: version: 8.57.0 eslint-config-next: specifier: ^14.2.5 - version: 14.2.5(eslint@8.57.0)(typescript@5.5.4) + version: 14.2.5(eslint@8.57.0)(typescript@5.6.3) eslint-plugin-unused-imports: specifier: ^4.0.1 version: 4.0.1(eslint@8.57.0) jest: specifier: ^28.0.0 - version: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + version: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) less: specifier: ^4.1.2 version: 4.2.0 @@ -1202,16 +1202,16 @@ importers: version: 4.0.2(webpack@5.93.0) tailwindcss: specifier: ^3.0.24 - version: 3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + version: 3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) + version: 10.9.2(@types/node@18.19.42)(typescript@5.6.3) type-fest: specifier: ^3.5.7 version: 3.13.1 typescript: - specifier: ^5.5.4 - version: 5.5.4 + specifier: ^5.6.3 + version: 5.6.3 zod-prisma: specifier: ^0.5.4 version: 0.5.4(decimal.js@10.4.3)(prisma@5.17.0)(zod@3.23.8) @@ -1247,7 +1247,7 @@ importers: version: 8.57.0 eslint-config-next: specifier: 14.2.5 - version: 14.2.5(eslint@8.57.0)(typescript@5.5.4) + version: 14.2.5(eslint@8.57.0)(typescript@5.6.3) firebase-admin: specifier: ^12.3.0 version: 12.3.0(encoding@0.1.13) @@ -1326,13 +1326,13 @@ importers: version: 3.0.1(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) + version: 10.9.2(@types/node@18.19.42)(typescript@5.6.3) type-fest: specifier: ^3.5.7 version: 3.13.1 typescript: - specifier: ^5.5.4 - version: 5.5.4 + specifier: ^5.6.3 + version: 5.6.3 packages: @@ -13542,8 +13542,8 @@ packages: engines: {node: '>=4.2.0'} hasBin: true - typescript@5.5.4: - resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} engines: {node: '>=14.17'} hasBin: true @@ -16567,7 +16567,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))': + '@jest/core@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3))': dependencies: '@jest/console': 27.5.1 '@jest/reporters': 27.5.1 @@ -16581,7 +16581,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 27.5.1 - jest-config: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-config: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) jest-haste-map: 27.5.1 jest-message-util: 27.5.1 jest-regex-util: 27.5.1 @@ -16604,7 +16604,7 @@ snapshots: - ts-node - utf-8-validate - '@jest/core@28.1.3(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))': + '@jest/core@28.1.3(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3))': dependencies: '@jest/console': 28.1.3 '@jest/reporters': 28.1.3 @@ -16618,7 +16618,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 28.1.3 - jest-config: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-config: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) jest-haste-map: 28.1.3 jest-message-util: 28.1.3 jest-regex-util: 28.0.2 @@ -16639,7 +16639,7 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -16653,7 +16653,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-config: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -16674,7 +16674,7 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4))': + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -16688,7 +16688,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -16709,7 +16709,7 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))': + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -16723,7 +16723,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -17979,20 +17979,20 @@ snapshots: optionalDependencies: rollup: 3.29.4 - '@rollup/plugin-typescript@11.1.6(rollup@3.29.4)(tslib@2.6.3)(typescript@5.5.4)': + '@rollup/plugin-typescript@11.1.6(rollup@3.29.4)(tslib@2.6.3)(typescript@5.6.3)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@3.29.4) resolve: 1.22.8 - typescript: 5.5.4 + typescript: 5.6.3 optionalDependencies: rollup: 3.29.4 tslib: 2.6.3 - '@rollup/plugin-typescript@11.1.6(rollup@4.19.1)(tslib@2.6.3)(typescript@5.5.4)': + '@rollup/plugin-typescript@11.1.6(rollup@4.19.1)(tslib@2.6.3)(typescript@5.6.3)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.19.1) resolve: 1.22.8 - typescript: 5.5.4 + typescript: 5.6.3 optionalDependencies: rollup: 4.19.1 tslib: 2.6.3 @@ -18745,13 +18745,13 @@ snapshots: '@swc/counter': 0.1.3 tslib: 2.6.3 - '@tailwindcss/typography@0.5.13(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))': + '@tailwindcss/typography@0.5.13(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)))': dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + tailwindcss: 3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) '@tanstack/query-core@4.36.1': {} @@ -19255,86 +19255,86 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.3) '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.6.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.6.3) debug: 4.3.6(supports-color@5.5.0) eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare-lite: 1.4.0 semver: 7.6.3 - tsutils: 3.21.0(typescript@5.5.4) + tsutils: 3.21.0(typescript@5.6.3) optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.6.3) '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.0)(typescript@5.6.3) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.6.3) '@typescript-eslint/visitor-keys': 7.18.0 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.5.4) + ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/experimental-utils@5.62.0(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/experimental-utils@5.62.0(eslint@8.57.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.6.3) eslint: 8.57.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3)': dependencies: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.3) debug: 4.3.6(supports-color@5.5.0) eslint: 8.57.0 optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.6.3)': dependencies: '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.3) '@typescript-eslint/visitor-keys': 7.18.0 debug: 4.3.6(supports-color@5.5.0) eslint: 8.57.0 optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3)': dependencies: '@typescript-eslint/scope-manager': 7.2.0 '@typescript-eslint/types': 7.2.0 - '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.5.4) + '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.6.3) '@typescript-eslint/visitor-keys': 7.2.0 debug: 4.3.6(supports-color@5.5.0) eslint: 8.57.0 optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.3 transitivePeerDependencies: - supports-color @@ -19353,27 +19353,27 @@ snapshots: '@typescript-eslint/types': 7.2.0 '@typescript-eslint/visitor-keys': 7.2.0 - '@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.6.3) debug: 4.3.6(supports-color@5.5.0) eslint: 8.57.0 - tsutils: 3.21.0(typescript@5.5.4) + tsutils: 3.21.0(typescript@5.6.3) optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@7.18.0(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.3) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.6.3) debug: 4.3.6(supports-color@5.5.0) eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.5.4) + ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.3 transitivePeerDependencies: - supports-color @@ -19383,7 +19383,7 @@ snapshots: '@typescript-eslint/types@7.2.0': {} - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.5.4)': + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.6.3)': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 @@ -19391,13 +19391,13 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 semver: 7.6.3 - tsutils: 3.21.0(typescript@5.5.4) + tsutils: 3.21.0(typescript@5.6.3) optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4)': + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.6.3)': dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 @@ -19406,13 +19406,13 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.5.4) + ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@7.2.0(typescript@5.5.4)': + '@typescript-eslint/typescript-estree@7.2.0(typescript@5.6.3)': dependencies: '@typescript-eslint/types': 7.2.0 '@typescript-eslint/visitor-keys': 7.2.0 @@ -19421,20 +19421,20 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.3 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.5.4) + ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.6.3)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.3) eslint: 8.57.0 eslint-scope: 5.1.1 semver: 7.6.3 @@ -19442,12 +19442,12 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@7.18.0(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/utils@7.18.0(eslint@8.57.0)(typescript@5.6.3)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.3) eslint: 8.57.0 transitivePeerDependencies: - supports-color @@ -21092,13 +21092,13 @@ snapshots: crc-32: 1.2.2 readable-stream: 3.6.2 - create-jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)): + create-jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + jest-config: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -21107,13 +21107,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + create-jest@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-config: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -21122,13 +21122,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)): + create-jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -21137,13 +21137,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + create-jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -22152,20 +22152,20 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-next@14.2.5(eslint@8.57.0)(typescript@5.5.4): + eslint-config-next@14.2.5(eslint@8.57.0)(typescript@5.6.3): dependencies: '@next/eslint-plugin-next': 14.2.5 '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.6.3) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.3 transitivePeerDependencies: - eslint-import-resolver-webpack - supports-color @@ -22174,25 +22174,25 @@ snapshots: dependencies: eslint: 8.57.0 - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(eslint@8.57.0)(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4): + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(eslint@8.57.0)(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)))(typescript@5.6.3): dependencies: '@babel/core': 7.25.2 '@babel/eslint-parser': 7.25.1(@babel/core@7.25.2)(eslint@8.57.0) '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.3) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 eslint: 8.57.0 eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)))(typescript@5.6.3) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) - eslint-plugin-testing-library: 5.11.1(eslint@8.57.0)(typescript@5.5.4) + eslint-plugin-testing-library: 5.11.1(eslint@8.57.0)(typescript@5.6.3) optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.3 transitivePeerDependencies: - '@babel/plugin-syntax-flow' - '@babel/plugin-transform-react-jsx' @@ -22209,13 +22209,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 4.3.6(supports-color@5.5.0) enhanced-resolve: 5.17.1 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.6 is-core-module: 2.15.0 @@ -22226,24 +22226,24 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.3) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.6.3) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0) transitivePeerDependencies: - supports-color @@ -22255,7 +22255,7 @@ snapshots: lodash: 4.17.21 string-natural-compare: 3.0.1 - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 @@ -22265,7 +22265,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.15.0 is-glob: 4.0.3 @@ -22276,13 +22276,13 @@ snapshots: semver: 6.3.1 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 @@ -22292,7 +22292,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.15.0 is-glob: 4.0.3 @@ -22303,19 +22303,19 @@ snapshots: semver: 6.3.1 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.6.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4): + eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)))(typescript@5.6.3): dependencies: - '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.0)(typescript@5.6.3) eslint: 8.57.0 optionalDependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) - jest: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3) + jest: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) transitivePeerDependencies: - supports-color - typescript @@ -22366,9 +22366,9 @@ snapshots: string.prototype.matchall: 4.0.11 string.prototype.repeat: 1.0.0 - eslint-plugin-testing-library@5.11.1(eslint@8.57.0)(typescript@5.5.4): + eslint-plugin-testing-library@5.11.1(eslint@8.57.0)(typescript@5.6.3): dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.6.3) eslint: 8.57.0 transitivePeerDependencies: - supports-color @@ -22842,7 +22842,7 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 - fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.0)(typescript@5.5.4)(webpack@5.93.0): + fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.0)(typescript@5.6.3)(webpack@5.93.0): dependencies: '@babel/code-frame': 7.24.7 '@types/json-schema': 7.0.15 @@ -22857,7 +22857,7 @@ snapshots: schema-utils: 2.7.0 semver: 7.6.3 tapable: 1.1.3 - typescript: 5.5.4 + typescript: 5.6.3 webpack: 5.93.0 optionalDependencies: eslint: 8.57.0 @@ -24108,16 +24108,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + jest-cli@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)): dependencies: - '@jest/core': 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + '@jest/core': 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.2.0 - jest-config: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-config: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) jest-util: 27.5.1 jest-validate: 27.5.1 prompts: 2.4.2 @@ -24129,16 +24129,16 @@ snapshots: - ts-node - utf-8-validate - jest-cli@28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + jest-cli@28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)): dependencies: - '@jest/core': 28.1.3(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + '@jest/core': 28.1.3(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) '@jest/test-result': 28.1.3 '@jest/types': 28.1.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.2.0 - jest-config: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-config: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) jest-util: 28.1.3 jest-validate: 28.1.3 prompts: 2.4.2 @@ -24148,16 +24148,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)): + jest-cli@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + create-jest: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + jest-config: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -24167,16 +24167,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + jest-cli@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + create-jest: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-config: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -24186,16 +24186,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)): + jest-cli@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + create-jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -24205,16 +24205,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + jest-cli@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + create-jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-config: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -24224,7 +24224,7 @@ snapshots: - supports-color - ts-node - jest-config@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + jest-config@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)): dependencies: '@babel/core': 7.25.2 '@jest/test-sequencer': 27.5.1 @@ -24251,14 +24251,14 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) + ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.6.3) transitivePeerDependencies: - bufferutil - canvas - supports-color - utf-8-validate - jest-config@28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + jest-config@28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)): dependencies: '@babel/core': 7.25.2 '@jest/test-sequencer': 28.1.3 @@ -24284,11 +24284,11 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 18.19.42 - ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) + ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.6.3) transitivePeerDependencies: - supports-color - jest-config@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)): + jest-config@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)): dependencies: '@babel/core': 7.25.2 '@jest/test-sequencer': 29.7.0 @@ -24314,12 +24314,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 16.18.11 - ts-node: 10.9.2(@types/node@16.18.11)(typescript@5.5.4) + ts-node: 10.9.2(@types/node@16.18.11)(typescript@5.6.3) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + jest-config@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)): dependencies: '@babel/core': 7.25.2 '@jest/test-sequencer': 29.7.0 @@ -24345,12 +24345,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 18.19.42 - ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) + ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.6.3) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)): + jest-config@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)): dependencies: '@babel/core': 7.25.2 '@jest/test-sequencer': 29.7.0 @@ -24376,12 +24376,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 18.19.42 - ts-node: 10.9.2(@types/node@16.18.11)(typescript@5.5.4) + ts-node: 10.9.2(@types/node@16.18.11)(typescript@5.6.3) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + jest-config@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)): dependencies: '@babel/core': 7.25.2 '@jest/test-sequencer': 29.7.0 @@ -24407,7 +24407,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 18.19.42 - ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) + ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.6.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -25054,11 +25054,11 @@ snapshots: leven: 3.1.0 pretty-format: 29.7.0 - jest-watch-typeahead@1.1.0(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))): + jest-watch-typeahead@1.1.0(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3))): dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 - jest: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) jest-regex-util: 28.0.2 jest-watcher: 28.1.3 slash: 4.0.0 @@ -25127,11 +25127,11 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)): dependencies: - '@jest/core': 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + '@jest/core': 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) import-local: 3.2.0 - jest-cli: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-cli: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) transitivePeerDependencies: - bufferutil - canvas @@ -25139,59 +25139,59 @@ snapshots: - ts-node - utf-8-validate - jest@28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + jest@28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)): dependencies: - '@jest/core': 28.1.3(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + '@jest/core': 28.1.3(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) '@jest/types': 28.1.3 import-local: 3.2.0 - jest-cli: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-cli: 28.1.3(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) transitivePeerDependencies: - '@types/node' - supports-color - ts-node - jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)): + jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + jest-cli: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node - jest@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + jest@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-cli: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node - jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)): + jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + jest-cli: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node - jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest-cli: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -27464,13 +27464,13 @@ snapshots: cosmiconfig: 5.2.1 import-cwd: 2.1.0 - postcss-load-config@4.0.2(postcss@8.4.40)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + postcss-load-config@4.0.2(postcss@8.4.40)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)): dependencies: lilconfig: 3.1.2 yaml: 2.5.0 optionalDependencies: postcss: 8.4.40 - ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) + ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.6.3) postcss-loader@6.2.1(postcss@8.4.40)(webpack@5.93.0): dependencies: @@ -28581,7 +28581,7 @@ snapshots: lodash.flow: 3.5.0 pure-color: 1.3.0 - react-dev-utils@12.0.1(eslint@8.57.0)(typescript@5.5.4)(webpack@5.93.0): + react-dev-utils@12.0.1(eslint@8.57.0)(typescript@5.6.3)(webpack@5.93.0): dependencies: '@babel/code-frame': 7.24.7 address: 1.2.2 @@ -28592,7 +28592,7 @@ snapshots: escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.0)(typescript@5.5.4)(webpack@5.93.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.0)(typescript@5.6.3)(webpack@5.93.0) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -28609,7 +28609,7 @@ snapshots: text-table: 0.2.0 webpack: 5.93.0 optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.3 transitivePeerDependencies: - eslint - supports-color @@ -28699,7 +28699,7 @@ snapshots: '@remix-run/router': 1.18.0 react: 18.3.1 - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(@types/babel__core@7.20.5)(@types/webpack@5.28.5)(eslint@8.57.0)(react@18.3.1)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))(type-fest@3.13.1)(typescript@5.5.4): + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(@types/babel__core@7.20.5)(@types/webpack@5.28.5)(eslint@8.57.0)(react@18.3.1)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3))(type-fest@3.13.1)(typescript@5.6.3): dependencies: '@babel/core': 7.25.2 '@pmmmwh/react-refresh-webpack-plugin': 0.5.15(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@3.13.1)(webpack-dev-server@4.15.2(webpack@5.93.0))(webpack@5.93.0) @@ -28717,15 +28717,15 @@ snapshots: dotenv: 10.0.0 dotenv-expand: 5.1.0 eslint: 8.57.0 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(eslint@8.57.0)(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4) + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(eslint@8.57.0)(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)))(typescript@5.6.3) eslint-webpack-plugin: 3.2.0(eslint@8.57.0)(webpack@5.93.0) file-loader: 6.2.0(webpack@5.93.0) fs-extra: 10.1.0 html-webpack-plugin: 5.6.0(webpack@5.93.0) identity-obj-proxy: 3.0.0 - jest: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest: 27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) jest-resolve: 27.5.1 - jest-watch-typeahead: 1.1.0(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4))) + jest-watch-typeahead: 1.1.0(jest@27.5.1(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3))) mini-css-extract-plugin: 2.9.0(webpack@5.93.0) postcss: 8.4.40 postcss-flexbugs-fixes: 5.0.2(postcss@8.4.40) @@ -28735,7 +28735,7 @@ snapshots: prompts: 2.4.2 react: 18.3.1 react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@8.57.0)(typescript@5.5.4)(webpack@5.93.0) + react-dev-utils: 12.0.1(eslint@8.57.0)(typescript@5.6.3)(webpack@5.93.0) react-refresh: 0.11.0 resolve: 1.22.8 resolve-url-loader: 4.0.0 @@ -28743,7 +28743,7 @@ snapshots: semver: 7.6.3 source-map-loader: 3.0.2(webpack@5.93.0) style-loader: 3.3.4(webpack@5.93.0) - tailwindcss: 3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + tailwindcss: 3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) terser-webpack-plugin: 5.3.10(webpack@5.93.0) webpack: 5.93.0 webpack-dev-server: 4.15.2(webpack@5.93.0) @@ -28751,7 +28751,7 @@ snapshots: workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.93.0) optionalDependencies: fsevents: 2.3.3 - typescript: 5.5.4 + typescript: 5.6.3 transitivePeerDependencies: - '@babel/plugin-syntax-flow' - '@babel/plugin-transform-react-jsx' @@ -30012,7 +30012,7 @@ snapshots: symbol-tree@3.2.4: {} - tailwindcss@3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)): + tailwindcss@3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -30031,7 +30031,7 @@ snapshots: postcss: 8.4.40 postcss-import: 15.1.0(postcss@8.4.40) postcss-js: 4.0.1(postcss@8.4.40) - postcss-load-config: 4.0.2(postcss@8.4.40)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + postcss-load-config: 4.0.2(postcss@8.4.40)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) postcss-nested: 6.2.0(postcss@8.4.40) postcss-selector-parser: 6.1.1 resolve: 1.22.8 @@ -30270,60 +30270,60 @@ snapshots: tryer@1.0.1: {} - ts-api-utils@1.3.0(typescript@5.5.4): + ts-api-utils@1.3.0(typescript@5.6.3): dependencies: - typescript: 5.5.4 + typescript: 5.6.3 ts-easing@0.2.0: {} ts-interface-checker@0.1.13: {} - ts-jest@29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)))(typescript@5.5.4): + ts-jest@29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)))(typescript@5.6.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + jest: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.6.3 - typescript: 5.5.4 + typescript: 5.6.3 yargs-parser: 21.1.1 optionalDependencies: '@babel/core': 7.25.2 '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.25.2) - ts-jest@29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)))(typescript@5.5.4): + ts-jest@29.0.5(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)))(typescript@5.6.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.6.3 - typescript: 5.5.4 + typescript: 5.6.3 yargs-parser: 21.1.1 optionalDependencies: '@babel/core': 7.25.2 '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.25.2) - ts-jest@29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)))(typescript@5.5.4): + ts-jest@29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)))(typescript@5.6.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + jest: 29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.6.3 - typescript: 5.5.4 + typescript: 5.6.3 yargs-parser: 21.1.1 optionalDependencies: '@babel/core': 7.25.2 @@ -30331,18 +30331,18 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.25.2) - ts-jest@29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4): + ts-jest@29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)))(typescript@5.6.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest: 29.7.0(@types/node@18.19.42)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.6.3 - typescript: 5.5.4 + typescript: 5.6.3 yargs-parser: 21.1.1 optionalDependencies: '@babel/core': 7.25.2 @@ -30350,18 +30350,18 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.25.2) - ts-jest@29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)))(typescript@5.5.4): + ts-jest@29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)))(typescript@5.6.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4)) + jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.6.3 - typescript: 5.5.4 + typescript: 5.6.3 yargs-parser: 21.1.1 optionalDependencies: '@babel/core': 7.25.2 @@ -30369,18 +30369,18 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.25.2) - ts-jest@29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)))(typescript@5.5.4): + ts-jest@29.2.3(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)))(typescript@5.6.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4)) + jest: 29.7.0(@types/node@18.19.42)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.6.3 - typescript: 5.5.4 + typescript: 5.6.3 yargs-parser: 21.1.1 optionalDependencies: '@babel/core': 7.25.2 @@ -30388,14 +30388,14 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.25.2) - ts-loader@9.5.1(typescript@5.5.4)(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))): + ts-loader@9.5.1(typescript@5.6.3)(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))): dependencies: chalk: 4.1.2 enhanced-resolve: 5.17.1 micromatch: 4.0.7 semver: 7.6.3 source-map: 0.7.4 - typescript: 5.5.4 + typescript: 5.6.3 webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) ts-morph@12.0.0: @@ -30408,7 +30408,7 @@ snapshots: '@ts-morph/common': 0.12.3 code-block-writer: 11.0.3 - ts-node-dev@2.0.0(@types/node@18.19.42)(typescript@5.5.4): + ts-node-dev@2.0.0(@types/node@18.19.42)(typescript@5.6.3): dependencies: chokidar: 3.6.0 dynamic-dedupe: 0.3.0 @@ -30418,9 +30418,9 @@ snapshots: rimraf: 2.7.1 source-map-support: 0.5.21 tree-kill: 1.2.2 - ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.5.4) + ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.6.3) tsconfig: 7.0.0 - typescript: 5.5.4 + typescript: 5.6.3 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -30444,7 +30444,7 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - ts-node@10.9.2(@types/node@16.18.11)(typescript@5.5.4): + ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -30458,11 +30458,11 @@ snapshots: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.5.4 + typescript: 5.6.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.4): + ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -30476,7 +30476,7 @@ snapshots: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.5.4 + typescript: 5.6.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 @@ -30504,10 +30504,10 @@ snapshots: tslib@2.6.3: {} - tsutils@3.21.0(typescript@5.5.4): + tsutils@3.21.0(typescript@5.6.3): dependencies: tslib: 1.14.1 - typescript: 5.5.4 + typescript: 5.6.3 tuf-js@1.1.7: dependencies: @@ -30649,7 +30649,7 @@ snapshots: typescript@4.9.5: {} - typescript@5.5.4: {} + typescript@5.6.3: {} ua-parser-js@1.0.38: {} diff --git a/services/profiles/package.json b/services/profiles/package.json index d1cce78fd..9342f7feb 100644 --- a/services/profiles/package.json +++ b/services/profiles/package.json @@ -60,7 +60,7 @@ "ts-loader": "^9.4.2", "ts-node": "^10.9.2", "ts-node-dev": "^2.0.0", - "typescript": "^5.5.4", + "typescript": "^5.6.3", "webpack": "^5.93.0", "webpack-cli": "^5.1.4" } diff --git a/services/profiles/src/builder.ts b/services/profiles/src/builder.ts index bf08078f7..864215a4d 100644 --- a/services/profiles/src/builder.ts +++ b/services/profiles/src/builder.ts @@ -169,8 +169,8 @@ export async function profileBuilder( } else { funcChain?.context.log.debug(funcCtx, `No users to process since: ${state.lastTimestamp}`); } - } catch (e) { - log.atError().withCause(e).log(`Error while running profile builder`); + } catch (e: any) { + funcChain?.context.log.error(funcCtx, `Error while running profile builder: ${e.message}`); } const waitMs = config.runPeriodSec * 1000 - (Date.now() - started); if (waitMs > 0) { diff --git a/services/profiles/src/index.ts b/services/profiles/src/index.ts index 72c06209a..a28a29d9f 100644 --- a/services/profiles/src/index.ts +++ b/services/profiles/src/index.ts @@ -8,8 +8,6 @@ import { db } from "./lib/db"; import { profileBuilder, ProfileBuilderRunner } from "./builder"; import { createClickhouseLogger, DummyEventsStore, EventsStore, mongodb } from "@jitsu/core-functions"; -disableService("mongodb"); - const log = getLog("profile-builder"); setServerJsonFormat(process.env.LOG_FORMAT === "json"); diff --git a/services/rotor/package.json b/services/rotor/package.json index 5c3a90a21..9da034950 100644 --- a/services/rotor/package.json +++ b/services/rotor/package.json @@ -72,7 +72,7 @@ "ts-loader": "^9.4.2", "ts-node": "^10.9.2", "ts-node-dev": "^2.0.0", - "typescript": "^5.5.4", + "typescript": "^5.6.3", "webpack": "^5.93.0", "webpack-cli": "^5.1.4" } diff --git a/webapps/console/package.json b/webapps/console/package.json index dfcdfaf44..e55f85540 100644 --- a/webapps/console/package.json +++ b/webapps/console/package.json @@ -128,7 +128,7 @@ "tailwindcss": "^3.0.24", "ts-node": "^10.9.2", "type-fest": "^3.5.7", - "typescript": "^5.5.4", + "typescript": "^5.6.3", "zod-prisma": "^0.5.4" } } diff --git a/webapps/console/pages/api/[workspaceId]/metrics/index.ts b/webapps/console/pages/api/[workspaceId]/metrics/index.ts new file mode 100644 index 000000000..925d79bbf --- /dev/null +++ b/webapps/console/pages/api/[workspaceId]/metrics/index.ts @@ -0,0 +1,73 @@ +import { z } from "zod"; +import { createRoute, verifyAccess, getWorkspace } from "../../../../lib/api"; +import { clickhouse } from "../../../../lib/server/clickhouse"; +import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; +import { getServerLog } from "../../../../lib/server/log"; + +dayjs.extend(utc); + +const log = getServerLog("workspace-metrics"); + +export default createRoute() + .GET({ + auth: true, + query: z.object({ + workspaceId: z.string(), + }), + streaming: true, + }) + .handler(async ({ user, query, res }) => { + const { workspaceId } = query; + const workspace = await getWorkspace(workspaceId); + await verifyAccess(user, workspace.id); + const metricsSchema = + process.env.CLICKHOUSE_METRICS_SCHEMA || process.env.CLICKHOUSE_DATABASE || "newjitsu_metrics"; + const sql = ` + select + connectionId, + streamId, + destinationId, + functionId, + status, + sumMerge(events) as eventsCount + from ${metricsSchema}.mv_metrics + where + timestamp >= date_trunc('day', now()) and + workspaceId = {workspace:String} + group by connectionId, status, streamId, destinationId, functionId + order by connectionId desc`; + try { + const chResult = (await ( + await clickhouse.query({ + query: sql, + query_params: { + workspace: workspace.id, + }, + clickhouse_settings: { + wait_end_of_query: 1, + }, + }) + ).json()) as any; + + res.writeHead(200, { + "Content-Type": "text/plain", + }); + res.write(`# HELP jitsu_connection_statuses Number of event status by connectionId, sourceId, destinationId, functionId +# TYPE jitsu_connection_statuses counter\n`); + chResult.data.forEach((row: any) => { + res.write( + `jitsu_connection_statuses{connectionId="${row.connectionId}",sourceId="${row.streamId}",destinationId="${row.destinationId}",functionId="${row.functionId}",status="${row.status}"} ${row.eventsCount}\n` + ); + }); + } catch (e) { + res.writeHead(500, { + "Content-Type": "text/plain", + }); + log.atError().withCause(e).log(`Failed to fetch metrics for workspace ${workspaceId}`); + res.write("Failed to fetch metrics"); + } finally { + res.end(); + } + }) + .toNextApiHandler(); diff --git a/webapps/ee-api/package.json b/webapps/ee-api/package.json index 880b27cc0..e56f50072 100644 --- a/webapps/ee-api/package.json +++ b/webapps/ee-api/package.json @@ -49,6 +49,6 @@ "react-email": "^3.0.1", "ts-node": "^10.9.2", "type-fest": "^3.5.7", - "typescript": "^5.5.4" + "typescript": "^5.6.3" } } From df2d8f2842f71b6038dd007c636469c27930bc1c Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 15 Oct 2024 17:11:52 +0400 Subject: [PATCH 0914/1353] jitsu-cli: support for profile functions --- cli/jitsu-cli/src/commands/build.ts | 135 +++++----- cli/jitsu-cli/src/commands/deploy.ts | 287 ++++++++++++--------- cli/jitsu-cli/src/lib/compiled-function.ts | 17 +- cli/jitsu-cli/src/templates/functions.ts | 39 ++- 4 files changed, 294 insertions(+), 184 deletions(-) diff --git a/cli/jitsu-cli/src/commands/build.ts b/cli/jitsu-cli/src/commands/build.ts index 655d92a12..443404128 100644 --- a/cli/jitsu-cli/src/commands/build.ts +++ b/cli/jitsu-cli/src/commands/build.ts @@ -1,5 +1,5 @@ import path from "path"; -import { mkdirSync, readdirSync, writeFileSync, existsSync } from "fs"; +import { mkdirSync, readdirSync, writeFileSync, existsSync, lstatSync } from "fs"; import typescript from "@rollup/plugin-typescript"; import resolve from "@rollup/plugin-node-resolve"; import commonjs from "@rollup/plugin-commonjs"; @@ -8,7 +8,7 @@ import { ModuleFormat, rollup } from "rollup"; import { exec } from "child_process"; import { loadPackageJson } from "./shared"; import { b, green, red } from "../lib/chalk-code-highlight"; -import { CompiledFunction, getFunctionFromFilePath } from "../lib/compiled-function"; +import { getFunctionFromFilePath } from "../lib/compiled-function"; import * as ts from "typescript"; export async function build({ dir }: { dir?: string }) { @@ -21,52 +21,48 @@ export async function build({ dir }: { dir?: string }) { process.exit(1); } - //list files in src directory - const functionsDir = path.resolve(projectDir, "src/functions"); - const files = readdirSync(functionsDir); - if (files.length === 0) { - console.error(`No functions found in ${b("/src/functions")} directory`); - process.exit(0); + try { + await buildFiles(projectDir); + } catch (e: any) { + throw new Error( + `Some of the functions failed to compile. See details above. Last error: ${e.message || "unknown"}` + ); } - let compiledFunction: CompiledFunction; - let lastError: any = undefined; - for (const file of files) { - try { - const funcFile = path.resolve(functionsDir, file); - - process.chdir(projectDir); - const rollupPlugins = [ - typescript(), - resolve({ preferBuiltins: false }), - commonjs(), - rollupJson(), - // terser(), - ]; - - const bundle = await rollup({ - input: [funcFile], - plugins: rollupPlugins, - external: ["@jitsu/functions-lib"], - logLevel: "silent", - }); + console.log(`${b("Build finished.")}`); +} - let format: ModuleFormat = "es"; - let output = await bundle.generate({ - dir: projectDir, - format: format, - }); +const run = async cmd => { + const child = exec(cmd, err => { + if (err) { + console.error(err); + return; + } + }); + child.stdout?.pipe(process.stdout); + child.stderr?.pipe(process.stderr); + return new Promise(resolve => child.on("close", resolve)); +}; - mkdirSync(path.resolve(projectDir, "dist/functions"), { recursive: true }); - const compiledFunctionPath = `dist/functions/${file.replace(".ts", ".js")}`; - writeFileSync(path.resolve(projectDir, compiledFunctionPath), output.output[0].code); - //to verify that function is readable - compiledFunction = await getFunctionFromFilePath(path.resolve(projectDir, compiledFunctionPath)); - console.log( - [`${green(`✓`)} Function ${b(file)} compiled successfully`, ` slug = ${b(compiledFunction.meta.slug)}`] - .filter(Boolean) - .join("\n") - ); +async function buildFiles(projectDir: string, dir: string = "") { + let lastError: any = undefined; + const srcDir = path.resolve(projectDir, "src", dir); + const files = readdirSync(srcDir); + if (files.length === 0) { + console.warn(`No functions found in ${b(srcDir)} directory`); + return; + } + for (const file of files) { + if (lstatSync(path.resolve(srcDir, file)).isDirectory()) { + try { + await buildFiles(projectDir, path.join(dir, file)); + } catch (e: any) { + lastError = e; + } + continue; + } + try { + await buildFile(projectDir, dir, file); } catch (e: any) { console.error( [ @@ -80,25 +76,46 @@ export async function build({ dir }: { dir?: string }) { } } if (lastError) { - throw new Error( - `Some of the functions failed to compile. See details above. Last error: ${lastError?.message || "unknown"}` - ); + throw lastError; } - - console.log(`${b("Build finished.")}`); } -const run = async cmd => { - const child = exec(cmd, err => { - if (err) { - console.error(err); - return; - } +async function buildFile(projectDir: string, dir: string, fileName: string) { + const funcFile = path.resolve(projectDir, "src", path.join(dir, fileName)); + process.chdir(projectDir); + + const rollupPlugins = [ + typescript(), + resolve({ preferBuiltins: false }), + commonjs(), + rollupJson(), + // terser(), + ]; + + const bundle = await rollup({ + input: [funcFile], + plugins: rollupPlugins, + external: ["@jitsu/functions-lib"], + logLevel: "silent", }); - child.stdout?.pipe(process.stdout); - child.stderr?.pipe(process.stderr); - return new Promise(resolve => child.on("close", resolve)); -}; + + let format: ModuleFormat = "es"; + let output = await bundle.generate({ + dir: projectDir, + format: format, + }); + + mkdirSync(path.resolve(projectDir, "dist/" + dir), { recursive: true }); + const compiledFunctionPath = `dist/${dir}/${fileName.replace(".ts", ".js")}`; + writeFileSync(path.resolve(projectDir, compiledFunctionPath), output.output[0].code); + //to verify that function is readable + const compiledFunction = await getFunctionFromFilePath(path.resolve(projectDir, compiledFunctionPath), "function"); + console.log( + [`${green(`✓`)} Function ${b(fileName)} compiled successfully`, ` slug = ${b(compiledFunction.meta.slug)}`] + .filter(Boolean) + .join("\n") + ); +} function checkTypescript(projectDir: string): string[] | void { const tsconfigPath = path.resolve(projectDir, "tsconfig.json"); diff --git a/cli/jitsu-cli/src/commands/deploy.ts b/cli/jitsu-cli/src/commands/deploy.ts index 4f814ad90..19cb79e17 100644 --- a/cli/jitsu-cli/src/commands/deploy.ts +++ b/cli/jitsu-cli/src/commands/deploy.ts @@ -17,67 +17,32 @@ function readLoginFile() { return JSON.parse(readFileSync(configFile, { encoding: "utf-8" })); } -export async function deploy({ - dir, - workspace, - name: names, - ...params -}: { +type Args = { dir?: string; workspace?: string; name?: string[]; apikey?: string; host?: string; -}) { - const { packageJson, projectDir } = await loadPackageJson(dir || process.cwd()); +}; - const selected = names ? names.flatMap(n => n.split(",")).map(n => n.trim()) : undefined; +type Workspace = { + id?: string; + name?: string[]; + slug?: string; +}; + +export async function deploy({ dir, workspace, name: names, ...params }: Args) { + const { packageJson, projectDir } = await loadPackageJson(dir || process.cwd()); - const configFile = `${homedir()}/.jitsu/jitsu-cli.json`; const { host, apikey } = params.apikey ? { apikey: params.apikey, host: params.host || "https://use.jitsu.com" } : readLoginFile(); - const functionsDir = path.resolve(projectDir, "dist/functions"); - if (!existsSync(functionsDir)) { - console.error(red(`Can't find dist directory: ${b(functionsDir)} . Please build project first.`)); - process.exit(1); - } - console.log( - `Deploying ${b(packageJson.name)} project.${selected ? ` (selected functions: ${selected.join(",")})` : ""}` + `Deploying ${b(packageJson.name)} project.${ + names && names.length > 0 ? ` (selected functions: ${names.join(",")})` : "" + }` ); - const functionsFiles = readdirSync(functionsDir); - if (functionsFiles.length === 0) { - console.error( - red( - `Can't find function files in ${b( - "dist/functions" - )} directory. Please make sure that you have built the project.` - ) - ); - process.exit(1); - } - const selectedFiles: string[] = []; - if (selected) { - const s = selected.map(n => (n.endsWith(".js") ? n : `${n.replace(".ts", "")}.js`)); - for (const file of s) { - if (functionsFiles.includes(file)) { - selectedFiles.push(file); - } else { - console.error( - red( - `Can't find function file ${b(file)} in ${b( - "dist/functions" - )} directory. Please make sure that you have built the project.` - ) - ); - process.exit(1); - } - } - } else { - selectedFiles.push(...functionsFiles); - } const res = await fetch(`${host}/api/workspace`, { method: "GET", @@ -117,88 +82,168 @@ export async function deploy({ const workspaceObj = workspaces.find(w => w.id === workspaceId); const workspaceName = workspaceObj?.name; - const workspaceSlug = workspaceObj?.slug || workspaceObj?.id; if (!workspaceId || !workspaceName) { console.error(red(`Workspace with id ${workspaceId} not found`)); process.exit(1); } - for (const file of selectedFiles) { - console.log(`${b(`𝑓`)} Deploying function ${b(file)} to workspace ${workspaceName} (${host}/${workspaceSlug})`); - const code = readFileSync(path.resolve(functionsDir, file), "utf-8"); - const wrapped = await getFunctionFromFilePath(path.resolve(functionsDir, file)); - const meta = wrapped.meta; - if (meta) { - console.log(` meta: slug=${meta.slug}, name=${meta.name || "not set"}`); - } else { - console.log(`File ${b(file)} doesn't have function meta information. ${red("Skipping")}`); - continue; - } - let existingFunctionId: string | undefined; - if (meta.slug) { - const res = await fetch(`${host}/api/${workspaceId}/config/function`, { - headers: { - Authorization: `Bearer ${apikey}`, - }, - }); - if (!res.ok) { - console.error(red(`Cannot add function to workspace:\n${b(await res.text())}`)); - process.exit(1); + await deployFunctions({ ...params, host, apikey, name: names }, projectDir, packageJson, workspaceObj, "function"); + await deployFunctions({ ...params, host, apikey, name: names }, projectDir, packageJson, workspaceObj, "profile"); +} + +async function deployFunctions( + { host, apikey, name: names }: Args, + projectDir: string, + packageJson: any, + workspace: Workspace, + kind: "function" | "profile" +) { + const selected = names ? names.flatMap(n => n.split(",")).map(n => n.trim()) : undefined; + const dir = `dist/${kind}s`; + const functionsDir = path.resolve(projectDir, dir); + + const functionsFiles = readdirSync(functionsDir); + if (functionsFiles.length === 0) { + console.warn( + red(`Can't find function files in ${b(dir)} directory. Please make sure that you have built the project.`) + ); + process.exit(1); + } + const selectedFiles: string[] = []; + if (selected) { + const s = selected.map(n => (n.endsWith(".js") ? n : `${n.replace(".ts", "")}.js`)); + for (const file of s) { + if (functionsFiles.includes(file)) { + selectedFiles.push(file); } else { - const existing = (await res.json()) as any; - existingFunctionId = existing.objects.find(f => f.slug === meta.slug)?.id; + console.error( + red( + `Can't find function file ${b(file)} in ${b( + dir + )} directory. Please make sure that you have built the project.` + ) + ); + process.exit(1); } } + } else { + selectedFiles.push(...functionsFiles); + } - if (!existingFunctionId) { - const id = cuid(); - const res = await fetch(`${host}/api/${workspaceId}/config/function`, { - method: "POST", - headers: { - Authorization: `Bearer ${apikey}`, - }, - body: JSON.stringify({ - id, - workspaceId, - type: "function", - origin: "jitsu-cli", - slug: meta.slug, - description: meta.description, - version: packageJson.version, - name: meta.name, - code, - }), - }); - if (!res.ok) { - console.error(red(`Cannot add function to workspace:\n${b(await res.text())}`)); - process.exit(1); - } else { - console.log(`Function ${b(meta.name)} was successfully added to workspace ${workspaceName} with id: ${b(id)}`); - } + let profileBuilders: any[] = []; + if (kind == "profile") { + const res = await fetch(`${host}/api/${workspace.id}/config/profile-builder`, { + method: "GET", + headers: { + Authorization: `Bearer ${apikey}`, + }, + }); + if (!res.ok) { + console.error(red(`Cannot get profile builders list:\n${b(await res.text())}`)); + process.exit(1); + } + profileBuilders = ((await res.json()) as any).profileBuilders as any[]; + } + + for (const file of selectedFiles) { + console.log( + `${b(`𝑓`)} Deploying function ${b(path.basename(file))} to workspace ${workspace.name} (${host}/${ + workspace.slug || workspace.id + })` + ); + await deployFunction( + { host, apikey }, + packageJson, + workspace, + kind, + path.resolve(functionsDir, file), + profileBuilders + ); + } +} + +async function deployFunction( + { host, apikey }: Args, + packageJson: any, + workspace: Workspace, + kind: "function" | "profile", + file: string, + profileBuilders: any[] = [] +) { + const code = readFileSync(file, "utf-8"); + + const wrapped = await getFunctionFromFilePath(file, kind, profileBuilders); + const meta = wrapped.meta; + if (meta) { + console.log(` meta: slug=${meta.slug}, name=${meta.name || "not set"}`); + } else { + console.log(`File ${b(path.basename(file))} doesn't have function meta information. ${red("Skipping")}`); + return; + } + let existingFunctionId: string | undefined; + if (meta.slug) { + const res = await fetch(`${host}/api/${workspace.id}/config/function`, { + headers: { + Authorization: `Bearer ${apikey}`, + }, + }); + if (!res.ok) { + console.error(red(`Cannot add function to workspace:\n${b(await res.text())}`)); + process.exit(1); } else { - const id = existingFunctionId; - const res = await fetch(`${host}/api/${workspaceId}/config/function/${id}`, { - method: "PUT", - headers: { - Authorization: `Bearer ${apikey}`, - }, - body: JSON.stringify({ - id: id, - workspaceId, - type: "function", - origin: "jitsu-cli", - slug: meta.slug, - description: meta.description, - version: packageJson.version, - name: meta.name, - code, - }), - }); - if (!res.ok) { - console.error(red(`⚠ Cannot deploy function ${b(meta.slug)}(${id}):\n${b(await res.text())}`)); - process.exit(1); - } else { - console.log(`${green(`✓`)} ${b(meta.name)} deployed successfully!`); - } + const existing = (await res.json()) as any; + existingFunctionId = existing.objects.find(f => f.slug === meta.slug)?.id; + } + } + + if (!existingFunctionId) { + const id = cuid(); + const res = await fetch(`${host}/api/${workspace.id}/config/function`, { + method: "POST", + headers: { + Authorization: `Bearer ${apikey}`, + }, + body: JSON.stringify({ + id, + workspaceId: workspace.id, + type: "function", + origin: "jitsu-cli", + slug: meta.slug, + description: meta.description, + version: packageJson.version, + name: meta.name, + code, + }), + }); + if (!res.ok) { + console.error(red(`Cannot add function to workspace:\n${b(await res.text())}`)); + process.exit(1); + } else { + console.log(`Function ${b(meta.name)} was successfully added to workspace ${workspace.name} with id: ${b(id)}`); + } + } else { + const id = existingFunctionId; + const res = await fetch(`${host}/api/${workspace.id}/config/function/${id}`, { + method: "PUT", + headers: { + Authorization: `Bearer ${apikey}`, + }, + body: JSON.stringify({ + id: id, + workspaceId: workspace.id, + type: "function", + origin: "jitsu-cli", + slug: meta.slug, + description: meta.description, + version: packageJson.version, + name: meta.name, + code, + }), + }); + if (!res.ok) { + console.error(red(`⚠ Cannot deploy function ${b(meta.slug)}(${id}):\n${b(await res.text())}`)); + process.exit(1); + } else { + console.log(`${green(`✓`)} ${b(meta.name)} deployed successfully!`); } } } diff --git a/cli/jitsu-cli/src/lib/compiled-function.ts b/cli/jitsu-cli/src/lib/compiled-function.ts index 4437855c6..bd5e5d271 100644 --- a/cli/jitsu-cli/src/lib/compiled-function.ts +++ b/cli/jitsu-cli/src/lib/compiled-function.ts @@ -1,6 +1,6 @@ import { JitsuFunction } from "@jitsu/protocols/functions"; import fs from "fs"; -import { ModuleFormat, rollup } from "rollup"; +import { rollup } from "rollup"; import { assertDefined, assertTrue } from "juava"; export type CompiledFunction = { @@ -16,7 +16,11 @@ function getSlug(filePath: string) { return filePath.split("/").pop()?.replace(".ts", ""); } -export async function getFunctionFromFilePath(filePath: string): Promise { +export async function getFunctionFromFilePath( + filePath: string, + kind: "function" | "profile", + profileBuilders: any[] = [] +): Promise { if (!fs.existsSync(filePath)) { throw new Error(`Cannot load function from file ${filePath}: file doesn't exist`); } else if (!fs.statSync(filePath).isFile()) { @@ -42,11 +46,18 @@ export async function getFunctionFromFilePath(filePath: string): Promise pb.id === profileBuilderId); + name = `${profileBuilder.name} profile function`; + } + return { func: exports.default, meta: { slug: exports.config?.slug || getSlug(filePath), - name: exports.config?.name, + name: name, description: exports.config?.description, }, }; diff --git a/cli/jitsu-cli/src/templates/functions.ts b/cli/jitsu-cli/src/templates/functions.ts index 8c695d7df..b7fa87cba 100644 --- a/cli/jitsu-cli/src/templates/functions.ts +++ b/cli/jitsu-cli/src/templates/functions.ts @@ -60,8 +60,45 @@ export default helloWorldFunction; `; }; +let profileTest = ({ packageName }: TemplateVars) => { + return ` +test("${sanitize(packageName)} test", () => { + //TODO: implement test +}); +`; +}; + +let profileCode = ({}: TemplateVars) => { + return ` +import { ProfileFunction } from "@jitsu/protocols/profile"; + +export const config = { + slug: "profile-example.ts", //id (uniq per workspace) used to identify function in Jitsu + profileBuilderId: "", // id of Profile Builder object where this function will be used + description: "" +}; + +const profileExample: ProfileFunction = async ({ context, events, user}) => { + context.log.info("Profile func: " + user.id) + const profile = {} as any + for (const event of events) { + profile.lastMessageDate = Math.max(new Date(event.timestamp).getTime(),profile.lastMessageDate??0) + } + profile.traits = user.traits + profile.anonId = user.anonymousId + return { + properties: profile + } +}; + +export default profileExample; +`; +}; + export const functionProjectTemplate: ProjectTemplate = ({ packageName }: TemplateVars) => ({ - [`__test__/functions/hello.test.ts`]: functionTest, + [`__tests__/profiles/profile-example.test.ts`]: profileTest, + [`__tests__/functions/hello.test.ts`]: functionTest, + [`src/profiles/profile-example.ts`]: profileCode, [`src/functions/hello.ts`]: functionCode, "package.json": packageJsonTemplate, "tsconfig.json": { From f81c41fbcab1a6fd2a9c29d624f2b5ed3b02542a Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 18 Oct 2024 16:35:52 +0400 Subject: [PATCH 0915/1353] console: allow to provide Clickhouse Settings on connection level --- .../ConnectionEditorPage.tsx | 29 +++++++++++++++++++ webapps/console/lib/schema/destinations.tsx | 1 + .../pages/api/admin/export/[name]/index.ts | 15 ++++++++-- 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx index 86a8835fa..08ab11eb6 100644 --- a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx +++ b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx @@ -627,6 +627,35 @@ function ConnectionEditor({ ), }); } + if (hasZodFields(connectionOptionsZodType, "clickhouseSettings") && destinationType.id === "clickhouse") { + configItems.push({ + group: "Advanced", + name: "Clickhouse Settings", + documentation: ( + <> + + Clickhouse Settings + {" "} + are used to configure Clickhouse connection. Format is key=value separated by new line. This + settings will be merged with Parameters configured in destination. + + ), + component: ( + { + updateOptions({ clickhouseSettings }); + }} + /> + ), + }); + } if (hasZodFields(connectionOptionsZodType, "events")) { configItems.push({ documentation: ( diff --git a/webapps/console/lib/schema/destinations.tsx b/webapps/console/lib/schema/destinations.tsx index 272364b4b..84d057323 100644 --- a/webapps/console/lib/schema/destinations.tsx +++ b/webapps/console/lib/schema/destinations.tsx @@ -372,6 +372,7 @@ export const coreDestinations: DestinationType[] = [ connectionOptions: BaseBulkerConnectionOptions.merge( z.object({ primaryKey: z.string().default("timestamp,message_id"), + clickhouseSettings: z.string().default(""), }) ).describe( JSON.stringify({ diff --git a/webapps/console/pages/api/admin/export/[name]/index.ts b/webapps/console/pages/api/admin/export/[name]/index.ts index 4ce72b08a..0fb73c15c 100644 --- a/webapps/console/pages/api/admin/export/[name]/index.ts +++ b/webapps/console/pages/api/admin/export/[name]/index.ts @@ -71,6 +71,17 @@ const exports: Export[] = [ if (needComma) { writer.write(","); } + const credentials = omit(to.config, "destinationType", "type", "name"); + if (destinationType === "clickhouse" && data.clickhouseSettings) { + const extraParams = Object.fromEntries( + (data.clickhouseSettings as string) + .split("\n") + .filter(s => s.includes("=")) + .map(s => s.split("=")) + .map(([k, v]) => [k.trim(), v.trim()]) + ); + credentials.parameters = { ...(credentials.parameters || {}), ...extraParams }; + } writer.write( JSON.stringify({ __debug: { @@ -78,9 +89,9 @@ const exports: Export[] = [ }, id: id, type: destinationType, - options: data, + options: omit(data, "clickhouseSettings"), updatedAt: dateMax(updatedAt, to.updatedAt), - credentials: omit(to.config, "destinationType", "type", "name"), + credentials: credentials, }) ); needComma = true; From 621ec0a27ff8c9049bc4e1e6ce61f55bd3f1d50c Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Fri, 18 Oct 2024 11:22:32 -0400 Subject: [PATCH 0916/1353] feat(minor): changed copy for clickhouse stream mode --- webapps/console/lib/schema/destinations.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/lib/schema/destinations.tsx b/webapps/console/lib/schema/destinations.tsx index 84d057323..9746afb81 100644 --- a/webapps/console/lib/schema/destinations.tsx +++ b/webapps/console/lib/schema/destinations.tsx @@ -378,7 +378,7 @@ export const coreDestinations: DestinationType[] = [ JSON.stringify({ limitations: { streamModeLocked: - 'Stream mode in ClickHouse is limited by MergeTree engine capabilities.
    ClickHouse is not designed to handle a large number of individual inserts.
    Use it only for testing purposes.', + 'Stream mode in ClickHouse requires async inserts enabled both on client and server level. Read more about async inserts here.
    Also, make sure to set async inserts parameters in the advanced section', }, }) ), From 56b5a268a1cdf78c18d23def1b52bf220df4bfc6 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 23 Oct 2024 17:14:42 +0400 Subject: [PATCH 0917/1353] rotor: ga4-destination: only send identifier related to measurement type (firebase or web) --- libs/core-functions/src/functions/ga4-destination.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libs/core-functions/src/functions/ga4-destination.ts b/libs/core-functions/src/functions/ga4-destination.ts index 1f90a619e..36d42ec7f 100644 --- a/libs/core-functions/src/functions/ga4-destination.ts +++ b/libs/core-functions/src/functions/ga4-destination.ts @@ -310,11 +310,13 @@ const Ga4Destination: JitsuFunction = asyn const firebaseAppInstanceId = getFirebaseAppInstanceId(event); const measurementId = ctx.props.measurementId || ""; let query = `api_secret=${ctx.props.apiSecret}`; + let idPart = {} as any; if (measurementId.match(/^\d:\d+:\w+:\w+$/)) { if (!firebaseAppInstanceId) { ctx.log.info(`Ga4: no app instance id found for event ID: ${event.messageId}`); return; } + idPart.app_instance_id = firebaseAppInstanceId; query += `&firebase_app_id=${measurementId}`; } else { if (!clientId) { @@ -324,6 +326,7 @@ const Ga4Destination: JitsuFunction = asyn if (!measurementId.match(/^G-\w+$/)) { ctx.log.warn(`Ga4: measurement_id is not in the correct format: ${measurementId}`); } + idPart.client_id = clientId; query += `&measurement_id=${measurementId}`; } @@ -349,8 +352,7 @@ const Ga4Destination: JitsuFunction = asyn const url = `https://www.google-analytics.com${debug}/mp/collect?${query}`; gaRequest = { - app_instance_id: firebaseAppInstanceId, - client_id: clientId, + ...idPart, user_id: event.userId, timestamp_micros: eventTimeSafeMs(event) * 1000, user_properties: userProperties, From 817c7cbf5af331dd940be573b958e5ba459eefba Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 25 Oct 2024 16:19:35 +0400 Subject: [PATCH 0918/1353] tmp wrkrnd --- webapps/ee-api/pages/api/quotas/sync.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/ee-api/pages/api/quotas/sync.ts b/webapps/ee-api/pages/api/quotas/sync.ts index 2e0d8adda..54e9c3bb5 100644 --- a/webapps/ee-api/pages/api/quotas/sync.ts +++ b/webapps/ee-api/pages/api/quotas/sync.ts @@ -10,7 +10,7 @@ import { getServerLog } from "../../../lib/log"; //A little copy-paste doesn't hurt //Values should be the same as in BillingSettings from webapps/console/lib/schema/index.ts export const freePlanLimitations = { - dailyActiveSyncs: 1, + dailyActiveSyncs: 5, }; const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { From 22ade88459c9838179bb3f8fa6dca812b0cf4e0f Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 25 Oct 2024 18:00:56 +0400 Subject: [PATCH 0919/1353] rollback tmp wrkrnd --- webapps/ee-api/pages/api/quotas/sync.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/ee-api/pages/api/quotas/sync.ts b/webapps/ee-api/pages/api/quotas/sync.ts index 54e9c3bb5..2e0d8adda 100644 --- a/webapps/ee-api/pages/api/quotas/sync.ts +++ b/webapps/ee-api/pages/api/quotas/sync.ts @@ -10,7 +10,7 @@ import { getServerLog } from "../../../lib/log"; //A little copy-paste doesn't hurt //Values should be the same as in BillingSettings from webapps/console/lib/schema/index.ts export const freePlanLimitations = { - dailyActiveSyncs: 5, + dailyActiveSyncs: 1, }; const handler = async function handler(req: NextApiRequest, res: NextApiResponse) { From aff05f3174de555bb5f818dc464cf2220721962d Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Fri, 25 Oct 2024 16:09:14 -0400 Subject: [PATCH 0920/1353] Added dependabot config --- .github/dependabot.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..5fea6490b --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: + - package-ecosystem: "npm" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "weekly" From aa9c49f78e5c4cb492652c31c370f5d192d1afa8 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Fri, 25 Oct 2024 20:31:32 -0400 Subject: [PATCH 0921/1353] feat(minor): ci - don't send slack notification on branch and PR builds --- .github/workflows/test-and-build.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-and-build.yml b/.github/workflows/test-and-build.yml index a5b581208..7e18af4d7 100644 --- a/.github/workflows/test-and-build.yml +++ b/.github/workflows/test-and-build.yml @@ -49,9 +49,10 @@ jobs: retention-days: 30 - name: Notify Slack uses: rtCamp/action-slack-notify@v2 - if: always() + # Do not send notification for PRs, feature branches, or forks + if: ${{ secrets.SLACK_DEV_CHANNEL != '' && github.ref == 'refs/heads/newjitsu' }} env: SLACK_WEBHOOK: ${{ secrets.SLACK_DEV_CHANNEL }} SLACK_COLOR: ${{ job.status }} SLACK_ICON_EMOJI: ":github-mark:" - SLACK_MESSAGE: "${{ job.status }}: Newjitsu Test: ${{ github.event.head_commit.message }}" + SLACK_MESSAGE: "${{ job.status }}: Jitsu 2.0 Build: ${{ github.event.head_commit.message }}" From eb707bc5350f3fa549dda00a77a7ae46cdc702ad Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Sun, 27 Oct 2024 14:30:54 -0400 Subject: [PATCH 0922/1353] feat(ee): another email template --- webapps/ee-api/emails/billing-issues.tsx | 122 +++++++++++++++++++++++ webapps/ee-api/lib/email.tsx | 3 + 2 files changed, 125 insertions(+) create mode 100644 webapps/ee-api/emails/billing-issues.tsx diff --git a/webapps/ee-api/emails/billing-issues.tsx b/webapps/ee-api/emails/billing-issues.tsx new file mode 100644 index 000000000..c88d497d3 --- /dev/null +++ b/webapps/ee-api/emails/billing-issues.tsx @@ -0,0 +1,122 @@ +import { EmailComponent, UnsubscribeLink, UnsubscribeLinkProps, withDefaults } from "../components/email-component"; +import { Body, Button, Container, Html, Preview, Section, Text } from "@react-email/components"; +import React from "react"; +import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; +import { main } from "./styles"; + +dayjs.extend(utc); + +export type BillingIssueEmailProps = { + name?: string; + workspaceName?: string; + workspaceSlug?: string; +} & UnsubscribeLinkProps; + +const BillingIssueEmail: EmailComponent = ({ + name, + workspaceName, + workspaceSlug, + unsubscribeLink, +}: BillingIssueEmailProps) => ( + + 🚨 Urgent: Last Payment Failed - Service Deactivation Approaching + + +
    + + 🚨 Last Payment Attempt Unsuccessful - Service Deactivation Approaching! + +
    + + 👋 Hi {name || "there"}! + + + We wanted to notify you that the last payment attempt for your{" "} + + {workspaceName || "Workspace"} + {" "} + Jitsu Workspace was unsuccessful, and you have unpaid overdue invoices. + + + + While your data is still flowing for now, if payment is not recovered in the next few days, we will be forced + to either deactivate your project or throttle incoming event processing. + + +
    + + Please take immediate action to update your payment method and avoid service interruption. + +
    + +
    + +
    + + + We highly recommend resolving this as soon as possible to prevent any service disruption. If you need + assistance, we{"'"}re here to help. Just reply to this email, and we{"'"}ll get back to you right away. + + + Best Regards, +
    + Jitsu Team +
    + + jitsu.com + +
    + {unsubscribeLink && } +
    + + +); + +BillingIssueEmail.defaultValues = { + name: "John", + workspaceSlug: "workspace-slug", + workspaceName: "Workspace Name", + unsubscribeLink: "https://example.com/unsubscribe", +}; + +BillingIssueEmail.from = "Jitsu Support "; +BillingIssueEmail.replyTo = "Jitsu Support "; + +// This is a transactional email +BillingIssueEmail.allowUnsubscribe = false; +BillingIssueEmail.respectUnsubscribed = false; + +BillingIssueEmail.subject = () => + `🚨[Action Required] Last Payment Failed - Action Required to Avoid Jitsu Service Disruption`; + +BillingIssueEmail.plaintext = ({ name, workspaceName, workspaceSlug, unsubscribeLink }: BillingIssueEmailProps) => { + return `👋 Hi ${name || "there"}! + +The last payment attempt for your ${workspaceName} Workspace was unsuccessful, and there are unpaid overdue invoices. + +If payment is not recovered in the next few days, we will be forced to deactivate your project or throttle event flow. + +Please update your payment method immediately: https://use.jitsu.com/${workspaceSlug}/settings/billing. + +Thanks, +Jitsu Team + +${unsubscribeLink ? `If you’d like to unsubscribe, click here: ${unsubscribeLink}` : ""} +`; +}; + +export default withDefaults(BillingIssueEmail); diff --git a/webapps/ee-api/lib/email.tsx b/webapps/ee-api/lib/email.tsx index bbcdbcf8a..998939821 100644 --- a/webapps/ee-api/lib/email.tsx +++ b/webapps/ee-api/lib/email.tsx @@ -12,6 +12,7 @@ import QuotaAboutToExceed from "../emails/quota-about-to-exceed"; import ThrottledReminderEmail from "../emails/throttling-reminder"; import { Simplify } from "type-fest"; import ThrottlingStarted from "../emails/throttling-started"; +import BillingIssueEmail from "../emails/billing-issues"; dayjs.extend(utc); export const UnsubscribeCodes = z.object({ @@ -96,6 +97,8 @@ export function getComponent(template: string): EmailComponent Date: Sun, 27 Oct 2024 14:57:35 -0400 Subject: [PATCH 0923/1353] ci: attempt to fix ci --- .github/workflows/test-and-build.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-and-build.yml b/.github/workflows/test-and-build.yml index 7e18af4d7..e1d20643a 100644 --- a/.github/workflows/test-and-build.yml +++ b/.github/workflows/test-and-build.yml @@ -4,6 +4,9 @@ on: branches: [newjitsu] pull_request: branches: [newjitsu] + workflow_dispatch: + + env: #container jitsucom/node18builder:latest has playwright browsers binaries preinstalled on this path: @@ -50,9 +53,11 @@ jobs: - name: Notify Slack uses: rtCamp/action-slack-notify@v2 # Do not send notification for PRs, feature branches, or forks - if: ${{ secrets.SLACK_DEV_CHANNEL != '' && github.ref == 'refs/heads/newjitsu' }} + if: ${{ env.SLACK_WEBHOOK != '' && github.ref == 'refs/heads/newjitsu' }} env: + SLACK_USERNAME: "GitHub Actions" SLACK_WEBHOOK: ${{ secrets.SLACK_DEV_CHANNEL }} SLACK_COLOR: ${{ job.status }} + MSG_MINIMAL: "true" SLACK_ICON_EMOJI: ":github-mark:" SLACK_MESSAGE: "${{ job.status }}: Jitsu 2.0 Build: ${{ github.event.head_commit.message }}" From 7e4261a346934060742faeb24d412f9e527da424 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Sun, 27 Oct 2024 15:07:15 -0400 Subject: [PATCH 0924/1353] ci: prettier and bumped actions versions --- .github/workflows/test-and-build.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test-and-build.yml b/.github/workflows/test-and-build.yml index e1d20643a..7c1ae975b 100644 --- a/.github/workflows/test-and-build.yml +++ b/.github/workflows/test-and-build.yml @@ -6,8 +6,6 @@ on: branches: [newjitsu] workflow_dispatch: - - env: #container jitsucom/node18builder:latest has playwright browsers binaries preinstalled on this path: PLAYWRIGHT_BROWSERS_PATH: /root/.cache/ms-playwright @@ -19,14 +17,14 @@ jobs: timeout-minutes: 60 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Get pnpm store directory id: pnpm-cache shell: bash run: | echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT - - uses: actions/cache@v3 + - uses: actions/cache@v4 name: Setup pnpm cache with: path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} From bc311a7e309c1828f8b5e7c50ed0b262ccfa294d Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 28 Oct 2024 16:12:05 +0400 Subject: [PATCH 0925/1353] Feat/newjitsu/profile builder UI (#1137) ProfileBuilder UI --- .github/workflows/test-and-build.yml | 2 +- builder.Dockerfile | 15 +- cli/jitsu-cli/src/commands/deploy.ts | 18 +- cli/jitsu-cli/src/lib/compiled-function.ts | 16 +- libs/core-functions/__tests__/udf.test.ts | 2 +- .../src/functions/lib/mongodb.ts | 4 +- .../lib/profiles-udf-wrapper-code.ts | 14 +- .../lib/profiles-udf-wrapper-code.txtjs | 14 +- .../functions}/lib/profiles-udf-wrapper.ts | 374 ++- .../src/functions/{ => lib}/udf_wrapper.ts | 20 +- .../src/functions/profiles-functions.ts | 17 +- libs/core-functions/src/index.ts | 12 +- libs/core-functions/src/lib/config-types.ts | 1 + libs/juava/src/objects.ts | 9 + package.json | 1 + pnpm-lock.yaml | 2441 ++++++++++++++++- services/profiles/src/builder.ts | 72 +- services/profiles/src/lib/functions-chain.ts | 56 +- services/rotor/src/http/profiles-udf.ts | 19 + services/rotor/src/http/udf.ts | 9 +- services/rotor/src/index.ts | 2 + services/rotor/src/lib/message-handler.ts | 1 + turbo.json | 4 + types/protocols/functions.d.ts | 9 +- types/protocols/profile.d.ts | 10 +- webapps/console/.gitignore | 2 + webapps/console/.storybook/main.ts | 27 + webapps/console/.storybook/preview.ts | 16 + .../components/CodeEditor/CodeEditor.tsx | 5 +- .../components/ConfigObjectEditor/Editors.tsx | 4 +- .../ConnectionEditorPage.tsx | 89 +- .../FieldListEditorLayout.module.css | 15 +- .../FieldListEditorLayout.tsx | 11 +- .../FunctionsDebugger/CodeViewer.tsx | 22 + .../FunctionsDebugger/FunctionLogs.tsx | 49 + .../FunctionsDebugger/FunctionResult.tsx | 60 + .../FunctionsDebugger/FunctionVariables.tsx | 109 + .../FunctionsDebugger.module.css | 4 + .../FunctionsDebugger/FunctionsDebugger.tsx | 145 +- .../PageLayout/WorkspacePageLayout.tsx | 35 +- .../ProfileBuilderPage.module.css | 11 + .../ProfileBuilderPage/ProfileBuilderPage.tsx | 1159 ++++++++ .../components/ProfileBuilderPage/example.ts | 60 + .../Selectors/DestinationSelector.tsx | 54 + .../components/Selectors/SourceSelector.tsx | 31 + .../SyncEditorPage/SyncEditorPage.tsx | 49 +- webapps/console/lib/schema/index.ts | 3 + webapps/console/package.json | 17 +- .../console/pages/[workspaceId]/functions.tsx | 1 + .../pages/[workspaceId]/profile-builder.tsx | 5 + webapps/console/pages/_app.tsx | 13 +- .../[workspaceId]/config/profile-builder.ts | 146 +- .../pages/api/[workspaceId]/function/run.ts | 2 +- .../[workspaceId]/profile-builder/events.ts | 92 + .../api/[workspaceId]/profile-builder/run.ts | 76 + .../[workspaceId]/profile-builder/stats.ts | 82 + .../pages/api/admin/export/[name]/index.ts | 7 +- webapps/console/prisma/schema.prisma | 8 +- webapps/console/styles/globals.css | 6 +- 59 files changed, 4908 insertions(+), 649 deletions(-) rename services/profiles/src/lib/udf-wrapper-code.ts => libs/core-functions/src/functions/lib/profiles-udf-wrapper-code.ts (94%) rename services/profiles/src/lib/udf-wrapper-code.txtjs => libs/core-functions/src/functions/lib/profiles-udf-wrapper-code.txtjs (94%) rename {services/profiles/src => libs/core-functions/src/functions}/lib/profiles-udf-wrapper.ts (63%) rename libs/core-functions/src/functions/{ => lib}/udf_wrapper.ts (97%) create mode 100644 services/rotor/src/http/profiles-udf.ts create mode 100644 webapps/console/.storybook/main.ts create mode 100644 webapps/console/.storybook/preview.ts create mode 100644 webapps/console/components/FunctionsDebugger/CodeViewer.tsx create mode 100644 webapps/console/components/FunctionsDebugger/FunctionLogs.tsx create mode 100644 webapps/console/components/FunctionsDebugger/FunctionResult.tsx create mode 100644 webapps/console/components/FunctionsDebugger/FunctionVariables.tsx create mode 100644 webapps/console/components/ProfileBuilderPage/ProfileBuilderPage.module.css create mode 100644 webapps/console/components/ProfileBuilderPage/ProfileBuilderPage.tsx create mode 100644 webapps/console/components/ProfileBuilderPage/example.ts create mode 100644 webapps/console/components/Selectors/DestinationSelector.tsx create mode 100644 webapps/console/components/Selectors/SourceSelector.tsx create mode 100644 webapps/console/pages/[workspaceId]/profile-builder.tsx create mode 100644 webapps/console/pages/api/[workspaceId]/profile-builder/events.ts create mode 100644 webapps/console/pages/api/[workspaceId]/profile-builder/run.ts create mode 100644 webapps/console/pages/api/[workspaceId]/profile-builder/stats.ts diff --git a/.github/workflows/test-and-build.yml b/.github/workflows/test-and-build.yml index 7c1ae975b..8b3593174 100644 --- a/.github/workflows/test-and-build.yml +++ b/.github/workflows/test-and-build.yml @@ -13,7 +13,7 @@ env: jobs: build: name: Build Project - container: jitsucom/node18builder:latest + container: jitsucom/node22builder:latest timeout-minutes: 60 runs-on: ubuntu-latest steps: diff --git a/builder.Dockerfile b/builder.Dockerfile index 74ce0a884..2d5a7748b 100644 --- a/builder.Dockerfile +++ b/builder.Dockerfile @@ -4,22 +4,13 @@ # Run `docker login` # Build & push it with -# docker buildx build --platform linux/amd64 . -f builder.Dockerfile --push -t jitsucom/node18builder:latest +# docker buildx build --platform linux/amd64 . -f builder.Dockerfile --push -t jitsucom/node22builder:latest -FROM debian:bullseye-slim +FROM node:22-bookworm RUN apt-get update -# Telnet is useful for debugging, and we need curl for Node 16 +# Telnet is useful for debugging, and we need curl for Node RUN apt-get install git curl telnet python3 ca-certificates gnupg g++ make -y -#Install node 18, see https://github.com/nodesource/distributions#debian-and-ubuntu-based-distributions -RUN mkdir -p /etc/apt/keyrings -RUN curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg -RUN echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_18.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list -RUN apt-get update - -#We need bash for pnpm setup -RUN apt-get install nodejs bash -y - RUN npm -g install pnpm #Should be the same as playwrite version in ./libs/jitsu-js/package.json diff --git a/cli/jitsu-cli/src/commands/deploy.ts b/cli/jitsu-cli/src/commands/deploy.ts index 19cb79e17..5c45db3cc 100644 --- a/cli/jitsu-cli/src/commands/deploy.ts +++ b/cli/jitsu-cli/src/commands/deploy.ts @@ -191,10 +191,20 @@ async function deployFunction( process.exit(1); } else { const existing = (await res.json()) as any; - existingFunctionId = existing.objects.find(f => f.slug === meta.slug)?.id; + existingFunctionId = existing.objects.find(f => f.slug === meta.slug || f.id === meta.id)?.id; } } - + let functionPayload = {}; + if (kind === "profile") { + functionPayload = { + draft: code, + kind: "profile", + }; + } else { + functionPayload = { + code, + }; + } if (!existingFunctionId) { const id = cuid(); const res = await fetch(`${host}/api/${workspace.id}/config/function`, { @@ -211,7 +221,9 @@ async function deployFunction( description: meta.description, version: packageJson.version, name: meta.name, + // we always add code to the initial function creation code, + ...functionPayload, }), }); if (!res.ok) { @@ -236,7 +248,7 @@ async function deployFunction( description: meta.description, version: packageJson.version, name: meta.name, - code, + ...functionPayload, }), }); if (!res.ok) { diff --git a/cli/jitsu-cli/src/lib/compiled-function.ts b/cli/jitsu-cli/src/lib/compiled-function.ts index bd5e5d271..db9fde830 100644 --- a/cli/jitsu-cli/src/lib/compiled-function.ts +++ b/cli/jitsu-cli/src/lib/compiled-function.ts @@ -7,6 +7,7 @@ export type CompiledFunction = { func: JitsuFunction; meta: { slug: string; + id?: string; name?: string; description?: string; }; @@ -47,16 +48,29 @@ export async function getFunctionFromFilePath( assertTrue(typeof exports.default === "function", `Default export from ${filePath} is not a function`); let name = exports.config?.name || exports.config?.slug || getSlug(filePath); + let id = exports.config?.id; if (kind === "profile") { const profileBuilderId = exports.config?.profileBuilderId; const profileBuilder = profileBuilders.find(pb => pb.id === profileBuilderId); - name = `${profileBuilder.name} profile function`; + if (!profileBuilder) { + throw new Error( + `Cannot find profile builder with id ${profileBuilderId} for profile function ${filePath}. Please setup Profile Builder in UI first.` + ); + } + name = name || `${profileBuilder.name} function`; + id = id || profileBuilder.functions[0]?.functionId; + if (!id) { + throw new Error( + `Cannot find function id for profile function ${filePath}. Please setup Profile Builder in UI first.` + ); + } } return { func: exports.default, meta: { slug: exports.config?.slug || getSlug(filePath), + id: id, name: name, description: exports.config?.description, }, diff --git a/libs/core-functions/__tests__/udf.test.ts b/libs/core-functions/__tests__/udf.test.ts index d30ae6c11..e410c694c 100644 --- a/libs/core-functions/__tests__/udf.test.ts +++ b/libs/core-functions/__tests__/udf.test.ts @@ -56,7 +56,7 @@ export default udf; type: "page", context: {}, }, - config: { + variables: { prop1: "test_prop1", }, store: { diff --git a/libs/core-functions/src/functions/lib/mongodb.ts b/libs/core-functions/src/functions/lib/mongodb.ts index 45283adf9..23c4e521d 100644 --- a/libs/core-functions/src/functions/lib/mongodb.ts +++ b/libs/core-functions/src/functions/lib/mongodb.ts @@ -1,5 +1,5 @@ import { getLog, getSingleton, parseNumber, requireDefined } from "juava"; -import { MongoClient, ObjectId } from "mongodb"; +import { MongoClient, MongoClientOptions, ObjectId } from "mongodb"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import { AnonymousEventsStore } from "@jitsu/protocols/functions"; @@ -22,7 +22,7 @@ async function createClient() { // Create a new MongoClient const client = new MongoClient(mongodbURL, { - compressors: ["zstd"], + compressors: process.env.MONGODB_NETWORK_COMPRESSION ? process.env.MONGODB_NETWORK_COMPRESSION : ["zstd"], serverSelectionTimeoutMS: 60000, maxPoolSize: 32, connectTimeoutMS: 60000, diff --git a/services/profiles/src/lib/udf-wrapper-code.ts b/libs/core-functions/src/functions/lib/profiles-udf-wrapper-code.ts similarity index 94% rename from services/profiles/src/lib/udf-wrapper-code.ts rename to libs/core-functions/src/functions/lib/profiles-udf-wrapper-code.ts index 8827867e5..f64ccafe0 100644 --- a/services/profiles/src/lib/udf-wrapper-code.ts +++ b/libs/core-functions/src/functions/lib/profiles-udf-wrapper-code.ts @@ -37,15 +37,15 @@ function isDropResult(result) { async function runChain( chain, - ctx, events, - user + user, + ctx ) { const execLog = []; const f = chain[0]; let result = undefined; try { - result = await f.f(ctx, events, user); + result = await f.f(events, user, ctx); } catch (err) { if (err.name === DropRetryErrorName) { result = "drop"; @@ -64,10 +64,10 @@ async function runChain( return {result, execLog}; } -const wrappedFunctionChain = async function (ctx, events, user) { +const wrappedFunctionChain = async function (events, user, ctx) { let chain = []; //** @UDF_FUNCTIONS_CHAIN **// - const chainRes = await runChain(chain, ctx, events, user); + const chainRes = await runChain(chain, events, user, ctx); checkError(chainRes); return chainRes.result; }; @@ -155,7 +155,7 @@ const wrappedUserFunction = (id, f, funcCtx) => { }; } - return async function (c, events, user) { + return async function (events, user, c) { const fetchLogEnabled = _jitsu_fetch_log_level !== "debug" || (funcCtx.function.debugTill && funcCtx.function.debugTill > new Date()); let ftch = fetch if (fetchLogEnabled) { @@ -170,7 +170,7 @@ const wrappedUserFunction = (id, f, funcCtx) => { store, fetch: ftch, }; - return await f(ctx, events, user); + return await f(events, user, ctx); } }; diff --git a/services/profiles/src/lib/udf-wrapper-code.txtjs b/libs/core-functions/src/functions/lib/profiles-udf-wrapper-code.txtjs similarity index 94% rename from services/profiles/src/lib/udf-wrapper-code.txtjs rename to libs/core-functions/src/functions/lib/profiles-udf-wrapper-code.txtjs index a9ffaa88e..520346fa8 100644 --- a/services/profiles/src/lib/udf-wrapper-code.txtjs +++ b/libs/core-functions/src/functions/lib/profiles-udf-wrapper-code.txtjs @@ -24,15 +24,15 @@ function isDropResult(result) { async function runChain( chain, - ctx, events, - user + user, + ctx ) { const execLog = []; const f = chain[0]; let result = undefined; try { - result = await f.f(ctx, events, user); + result = await f.f(events, user, ctx); } catch (err) { if (err.name === DropRetryErrorName) { result = "drop"; @@ -51,10 +51,10 @@ async function runChain( return {result, execLog}; } -const wrappedFunctionChain = async function (ctx, events, user) { +const wrappedFunctionChain = async function (events, user, ctx) { let chain = []; //** @UDF_FUNCTIONS_CHAIN **// - const chainRes = await runChain(chain, ctx, events, user); + const chainRes = await runChain(chain, events, user, ctx); checkError(chainRes); return chainRes.result; }; @@ -142,7 +142,7 @@ const wrappedUserFunction = (id, f, funcCtx) => { }; } - return async function (c, events, user) { + return async function (events, user, c) { const fetchLogEnabled = _jitsu_fetch_log_level !== "debug" || (funcCtx.function.debugTill && funcCtx.function.debugTill > new Date()); let ftch = fetch if (fetchLogEnabled) { @@ -157,7 +157,7 @@ const wrappedUserFunction = (id, f, funcCtx) => { store, fetch: ftch, }; - return await f(ctx, events, user); + return await f(events, user, ctx); } }; diff --git a/services/profiles/src/lib/profiles-udf-wrapper.ts b/libs/core-functions/src/functions/lib/profiles-udf-wrapper.ts similarity index 63% rename from services/profiles/src/lib/profiles-udf-wrapper.ts rename to libs/core-functions/src/functions/lib/profiles-udf-wrapper.ts index cadca8d33..4d274d535 100644 --- a/services/profiles/src/lib/profiles-udf-wrapper.ts +++ b/libs/core-functions/src/functions/lib/profiles-udf-wrapper.ts @@ -1,14 +1,17 @@ -import { getLog, parseNumber, sanitize, stopwatch } from "juava"; +import { getLog, LogLevel, parseNumber, sanitize, stopwatch } from "juava"; import { Isolate, ExternalCopy, Reference, Module, Context } from "isolated-vm"; -import { FetchOpts } from "@jitsu/protocols/functions"; +import { FetchOpts, Store, TTLStore } from "@jitsu/protocols/functions"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; -import { FunctionChainContext, FunctionContext, cryptoCode } from "@jitsu/core-functions"; +import { EventsStore, FunctionChainContext, FunctionContext, makeFetch, makeLog } from "./index"; +import { cryptoCode } from "./crypto-code"; import { RetryError } from "@jitsu/functions-lib"; import { clearTimeout } from "node:timers"; import * as crypto from "node:crypto"; import { ProfileResult } from "@jitsu/protocols/profile"; -import { chainWrapperCode, functionsLibCode } from "./udf-wrapper-code"; +import { chainWrapperCode, functionsLibCode } from "./profiles-udf-wrapper-code"; +import { logType } from "./udf_wrapper"; +import { createMemoryStore, memoryStoreDump } from "./store"; const log = getLog("udf-wrapper"); @@ -18,25 +21,32 @@ export type ProfileUser = { traits: Record; }; +export type Profile = { + user_id: string; + traits: Record; + custom_properties: Record; + updated_at: Date; +}; + export type ProfileFunctionWrapper = ( - context: FunctionContext, events: AnalyticsServerEvent[], - user: ProfileUser + user: ProfileUser, + context: FunctionContext ) => Promise; -export type UDFWrapperResult = { +type UDFWrapperResult = { userFunction: ProfileFunctionWrapper; isDisposed: () => boolean; close: () => void; }; -export type UDFFunction = { +type UDFFunction = { id: string; name: string; code: string; }; -export const UDFWrapper = ( +export const ProfileUDFWrapper = ( profileBulderId: string, chainCtx: FunctionChainContext, funcCtx: FunctionContext, @@ -55,6 +65,10 @@ export const UDFWrapper = ( // This make the global object available in the context as 'global'. We use 'derefInto()' here // because otherwise 'global' would actually be a Reference{} object in the new isolate. jail.setSync("global", jail.derefInto()); + jail.setSync( + "process", + new ExternalCopy({ env: funcCtx.props || {} }).copyInto({ release: true, transferIn: true }) + ); jail.setSync("_jitsu_funcCtx", new ExternalCopy(funcCtx).copyInto({ release: true, transferIn: true })); jail.setSync( @@ -167,6 +181,7 @@ export const UDFWrapper = ( .join(",") + "];" ); + const wrapper = isolate.compileModuleSync(code, { filename: "jitsu-wrapper.js", }); @@ -220,7 +235,7 @@ function wrap(connectionId: string, isolate: Isolate, context: Context, wrapper: if (!ref || ref.typeof !== "function") { throw new Error("Function not found. Please export wrappedFunctionChain function."); } - const userFunction: ProfileFunctionWrapper = async (ctx, events, user): Promise => { + const userFunction: ProfileFunctionWrapper = async (events, user, ctx): Promise => { if (isolate.isDisposed) { throw new RetryError("Isolate is disposed", { drop: true }); } @@ -238,9 +253,9 @@ function wrap(connectionId: string, isolate: Isolate, context: Context, wrapper: const res = await ref.apply( undefined, [ - ctxCopy.copyInto({ release: true, transferIn: true }), eventCopy.copyInto({ release: true, transferIn: true }), userCopy.copyInto({ release: true, transferIn: true }), + ctxCopy.copyInto({ release: true, transferIn: true }), ], { result: { promise: true }, @@ -314,181 +329,162 @@ function makeReference(refs: Reference[], obj: any): Reference { refs.push(ref); return ref; } -// -// export type UDFTestRequest = { -// functionId: string; -// functionName: string; -// code: string | UDFWrapperResult; -// event: AnalyticsServerEvent; -// config: any; -// store: Store | any; -// workspaceId: string; -// userAgent?: string; -// }; -// -// export type UDFTestResponse = { -// error?: { -// message: string; -// stack?: string; -// name: string; -// retryPolicy?: any; -// }; -// dropped?: boolean; -// result: FuncReturn; -// store: any; -// logs: logType[]; -// }; -// -// export async function UDFTestRun({ -// functionId: id, -// functionName: name, -// code, -// store, -// event, -// config, -// userAgent, -// workspaceId, -// }: UDFTestRequest): Promise { -// const logs: logType[] = []; -// let wrapper: UDFWrapperResult | undefined = undefined; -// let realStore = false; -// try { -// const eventContext: EventContext = { -// geo: { -// country: { -// code: "US", -// name: "United States", -// isEU: false, -// }, -// city: { -// name: "New York", -// }, -// region: { -// code: "NY", -// }, -// location: { -// latitude: 40.6808, -// longitude: -73.9701, -// }, -// postalCode: { -// code: "11238", -// }, -// }, -// ua: parseUserAgent( -// event.context?.userAgent || -// userAgent || -// "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" -// ), -// headers: {}, -// source: { -// id: "functionsDebugger-streamId", -// type: "browser", -// }, -// destination: { -// id: "functionsDebugger-destinationId", -// type: "clickhouse", -// updatedAt: new Date(), -// hash: "hash", -// }, -// connection: { -// id: "functionsDebugger", -// }, -// workspace: { -// id: workspaceId, -// }, -// }; -// let storeImpl: TTLStore; -// if ( -// typeof store?.set === "function" && -// typeof store?.get === "function" && -// typeof store?.del === "function" && -// typeof store.ttl === "function" -// ) { -// storeImpl = store; -// realStore = true; -// } else { -// store = store || {}; -// storeImpl = createMemoryStore(store); -// } -// -// const eventsStore: EventsStore = { -// log(connectionId: string, level: LogLevel, msg: Record) { -// switch (msg.type) { -// case "log-info": -// case "log-warn": -// case "log-debug": -// case "log-error": -// logs.push({ -// message: -// msg.message?.text + -// (Array.isArray(msg.message?.args) && msg.message.args.length > 0 -// ? `, ${msg.message?.args.join(",")}` -// : ""), -// level: msg.type.replace("log-", ""), -// timestamp: new Date(), -// type: "log", -// }); -// break; -// case "http-request": -// let statusText; -// if (msg.error) { -// statusText = `${msg.error}`; -// } else { -// statusText = `${msg.statusText ?? ""}${msg.status ? `(${msg.status})` : ""}`; -// } -// logs.push({ -// message: `${msg.method} ${msg.url} :: ${statusText}`, -// level: msg.error ? "error" : "debug", -// timestamp: new Date(), -// type: "http", -// data: { -// body: msg.body, -// headers: msg.headers, -// response: msg.response, -// }, -// }); -// } -// }, -// close() {}, -// }; -// const chainCtx: FunctionChainContext = { -// store: storeImpl, -// fetch: makeFetch("functionsDebugger", eventsStore, "info"), -// log: makeLog("functionsDebugger", eventsStore), -// }; -// const d = new Date(); -// d.setDate(d.getDate() + 1); -// const funcCtx: FunctionContext = { -// function: { -// type: "udf", -// id, -// debugTill: d, -// }, -// props: config, -// }; -// if (typeof code === "string") { -// wrapper = UDFWrapper(id, chainCtx, funcCtx, [{ id, name, code }]); -// } else { -// wrapper = code; -// } -// const result = await wrapper?.userFunction(eventContext, event); -// return { -// dropped: isDropResult(result), -// result: typeof result === "undefined" ? event : result, -// store: !realStore ? memoryStoreDump(store) : {}, -// logs, -// }; -// } catch (e: any) { -// return { -// error: { -// message: e.message, -// stack: e.stack, -// name: e.name, -// retryPolicy: e.retryPolicy, -// }, -// result: {}, -// store: !realStore && store ? memoryStoreDump(store) : {}, -// logs, -// }; -// } -// } + +export function mergeUserTraits(events: AnalyticsServerEvent[], userId?: string): ProfileUser { + const user = { traits: {}, userId: userId || events[0]?.userId } as ProfileUser; + events + .filter(e => e.type === "identify") + .forEach(e => { + if (e.anonymousId) { + user.anonymousId = e.anonymousId; + } + if (e.traits) { + Object.assign(user.traits, e.traits); + } + }); + return user; +} + +export type ProfileUDFTestRequest = { + functionId: string; + functionName: string; + code: string | UDFWrapperResult; + events: AnalyticsServerEvent[]; + variables: any; + store: Store | any; + workspaceId: string; + userAgent?: string; +}; + +export type ProfileUDFTestResponse = { + error?: { + message: string; + stack?: string; + name: string; + retryPolicy?: any; + }; + result: Profile; + store: any; + logs: logType[]; +}; + +export async function ProfileUDFTestRun({ + functionId: id, + functionName: name, + code, + store, + events, + variables, + userAgent, + workspaceId, +}: ProfileUDFTestRequest): Promise { + const logs: logType[] = []; + let wrapper: UDFWrapperResult | undefined = undefined; + let realStore = false; + const user = mergeUserTraits(events); + try { + let storeImpl: TTLStore; + if ( + typeof store?.set === "function" && + typeof store?.get === "function" && + typeof store?.del === "function" && + typeof store.ttl === "function" + ) { + storeImpl = store; + realStore = true; + } else { + store = store || {}; + storeImpl = createMemoryStore(store); + } + + const eventsStore: EventsStore = { + log(connectionId: string, level: LogLevel, msg: Record) { + switch (msg.type) { + case "log-info": + case "log-warn": + case "log-debug": + case "log-error": + logs.push({ + message: + msg.message?.text + + (Array.isArray(msg.message?.args) && msg.message.args.length > 0 + ? `, ${msg.message?.args.join(",")}` + : ""), + level: msg.type.replace("log-", ""), + timestamp: new Date(), + type: "log", + }); + break; + case "http-request": + let statusText; + if (msg.error) { + statusText = `${msg.error}`; + } else { + statusText = `${msg.statusText ?? ""}${msg.status ? `(${msg.status})` : ""}`; + } + logs.push({ + message: `${msg.method} ${msg.url} :: ${statusText}`, + level: msg.error ? "error" : "debug", + timestamp: new Date(), + type: "http", + data: { + body: msg.body, + headers: msg.headers, + response: msg.response, + }, + }); + } + }, + close() {}, + }; + const chainCtx: FunctionChainContext = { + store: storeImpl, + fetch: makeFetch("functionsDebugger", eventsStore, "info"), + log: makeLog("functionsDebugger", eventsStore), + }; + const d = new Date(); + d.setDate(d.getDate() + 1); + const funcCtx: FunctionContext = { + function: { + type: "udf", + id, + debugTill: d, + }, + props: variables, + }; + if (typeof code === "string") { + wrapper = ProfileUDFWrapper(id, chainCtx, funcCtx, [{ id, name, code }]); + } else { + wrapper = code; + } + const result = await wrapper?.userFunction(events, user, funcCtx); + const profile = { + user_id: user.userId, + traits: user.traits, + custom_properties: result?.properties || {}, + updated_at: new Date(), + }; + return { + result: profile, + store: !realStore ? memoryStoreDump(store) : {}, + logs, + }; + } catch (e: any) { + return { + error: { + message: e.message, + stack: e.stack, + name: e.name, + retryPolicy: e.retryPolicy, + }, + result: { + user_id: user.userId, + traits: user.traits, + custom_properties: {}, + updated_at: new Date(), + }, + store: !realStore && store ? memoryStoreDump(store) : {}, + logs, + }; + } +} diff --git a/libs/core-functions/src/functions/udf_wrapper.ts b/libs/core-functions/src/functions/lib/udf_wrapper.ts similarity index 97% rename from libs/core-functions/src/functions/udf_wrapper.ts rename to libs/core-functions/src/functions/lib/udf_wrapper.ts index 9edb0d48f..720c2dc4c 100644 --- a/libs/core-functions/src/functions/udf_wrapper.ts +++ b/libs/core-functions/src/functions/lib/udf_wrapper.ts @@ -12,14 +12,14 @@ import { makeFetch, makeLog, memoryStoreDump, -} from "../index"; -import { functionsLibCode, chainWrapperCode } from "./lib/udf-wrapper-code"; -import { parseUserAgent } from "./lib/ua"; +} from "../../index"; +import { functionsLibCode, chainWrapperCode } from "./udf-wrapper-code"; +import { parseUserAgent } from "./ua"; import { RetryError } from "@jitsu/functions-lib"; -import { JitsuFunctionWrapper } from "./lib"; +import { JitsuFunctionWrapper } from "./index"; import { clearTimeout } from "node:timers"; import * as crypto from "node:crypto"; -import { cryptoCode } from "./lib/crypto-code"; +import { cryptoCode } from "./crypto-code"; const log = getLog("udf-wrapper"); @@ -62,6 +62,10 @@ export const UDFWrapper = ( // This make the global object available in the context as 'global'. We use 'derefInto()' here // because otherwise 'global' would actually be a Reference{} object in the new isolate. jail.setSync("global", jail.derefInto()); + jail.setSync( + "process", + new ExternalCopy({ env: funcCtx.props || {} }).copyInto({ release: true, transferIn: true }) + ); jail.setSync("_jitsu_funcCtx", new ExternalCopy(funcCtx).copyInto({ release: true, transferIn: true })); jail.setSync( @@ -324,7 +328,7 @@ export type UDFTestRequest = { functionName: string; code: string | UDFWrapperResult; event: AnalyticsServerEvent; - config: any; + variables: any; store: Store | any; workspaceId: string; userAgent?: string; @@ -349,7 +353,7 @@ export async function UDFTestRun({ code, store, event, - config, + variables, userAgent, workspaceId, }: UDFTestRequest): Promise { @@ -468,7 +472,7 @@ export async function UDFTestRun({ id, debugTill: d, }, - props: config, + props: variables, }; if (typeof code === "string") { wrapper = UDFWrapper(id, chainCtx, funcCtx, [{ id, name, code }]); diff --git a/libs/core-functions/src/functions/profiles-functions.ts b/libs/core-functions/src/functions/profiles-functions.ts index ce9b644db..584da8464 100644 --- a/libs/core-functions/src/functions/profiles-functions.ts +++ b/libs/core-functions/src/functions/profiles-functions.ts @@ -8,9 +8,8 @@ import { mongodb } from "./lib/mongodb"; const hash = crypto["hash"]; -export const profilePartitionIdColumn = "_partition_id"; -// 240 has quite enough divisors: 1, 2, 3, 4, 5, 6, 8, 10, 12, 15, 16, 20, 24, 30, 40, 48, 60, 80, 120, 240. -export const profilePartitionsCount = 240; +export const userIdHashColumn = "_user_id_hash"; +export const userIdHash32MaxValue = 2147483647; export const ProfilesConfig = z.object({ mongoUrl: z.string().optional(), @@ -30,7 +29,7 @@ export const createClient = async (config: ProfilesConfig) => { // Create a new MongoClient const client = new MongoClient(uri, { - compressors: ["zstd"], + compressors: process.env.MONGODB_NETWORK_COMPRESSION ? process.env.MONGODB_NETWORK_COMPRESSION : ["zstd"], serverSelectionTimeoutMS: 60000, maxPoolSize: 32, connectTimeoutMS: 60000, @@ -44,12 +43,12 @@ export const createClient = async (config: ProfilesConfig) => { return client; }; -function hashToInt(value) { +export function int32Hash(value) { // Hash the value using SHA-256 (or another algorithm if desired) const h = hash("sha256", value); // Convert the first 8 characters of the hash (or more) to an integer - return parseInt(h.substring(0, 8), 16); + return parseInt(h.substring(0, 8), 16) % userIdHash32MaxValue; } export const ProfilesFunction: JitsuFunction = async (event, ctx) => { @@ -80,16 +79,14 @@ export const ProfilesFunction: JitsuFunction isEqual(x[key], y[key])) + : x === y; +} diff --git a/package.json b/package.json index b91b09cf0..9646348a0 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "build": "turbo run build", "ee-api:dev": "dotenv -e .env.local -- turbo run ee-api:dev", "console:dev": "dotenv -e .env.local -- turbo run console:dev", + "console:storybook": "dotenv -e .env.local -- turbo run console:storybook", "rotor:dev": "dotenv -e .env.local -- turbo run rotor:dev", "console:start": "dotenv -e .env.local -- pnpm run --filter=console console:start", "console:db-prepare": "dotenv -e .env.local -- pnpm run --filter=console db:update-schema", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 052898da1..4f2c4d633 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -279,7 +279,7 @@ importers: version: 6.25.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-scripts: specifier: ^5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(@types/babel__core@7.20.5)(@types/webpack@5.28.5)(eslint@8.57.0)(react@18.3.1)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3))(type-fest@3.13.1)(typescript@5.6.3) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(@types/babel__core@7.20.5)(@types/webpack@5.28.5)(eslint@8.57.0)(react@18.3.1)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3))(type-fest@3.13.1)(typescript@5.6.3)(webpack-hot-middleware@2.26.1) web-vitals: specifier: ^2.1.4 version: 2.1.4 @@ -949,7 +949,7 @@ importers: version: 5.16.4(react@18.3.1) '@monaco-editor/react': specifier: ^4.6.0 - version: 4.6.0(monaco-editor@0.50.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 4.6.0(monaco-editor@0.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@nangohq/frontend': specifier: ^0.21.11 version: 0.21.17 @@ -970,7 +970,7 @@ importers: version: 5.10.0(@rjsf/utils@5.10.0(react@18.3.1)) '@sentry/nextjs': specifier: ^7.70.0 - version: 7.118.0(encoding@0.1.13)(next@14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.93.0) + version: 7.118.0(encoding@0.1.13)(next@14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.93.0(esbuild@0.19.11)) '@tanstack/react-query': specifier: ^4.2.1 version: 4.36.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1050,8 +1050,8 @@ importers: specifier: ^2.0.8 version: 2.0.8(mjml@4.15.3(encoding@0.1.13))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) monaco-editor: - specifier: ^0.50.0 - version: 0.50.0 + specifier: ^0.52.0 + version: 0.52.0 next: specifier: ^14.2.5 version: 14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1119,6 +1119,36 @@ importers: '@ant-design/icons': specifier: ^5.4.0 version: 5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@chromatic-com/storybook': + specifier: ^1.9.0 + version: 1.9.0(react@18.3.1) + '@storybook/addon-essentials': + specifier: ^8.3.5 + version: 8.3.5(storybook@8.3.5)(webpack-sources@3.2.3) + '@storybook/addon-interactions': + specifier: ^8.3.5 + version: 8.3.5(storybook@8.3.5) + '@storybook/addon-links': + specifier: ^8.3.5 + version: 8.3.5(react@18.3.1)(storybook@8.3.5) + '@storybook/addon-onboarding': + specifier: ^8.3.5 + version: 8.3.5(react@18.3.1)(storybook@8.3.5) + '@storybook/blocks': + specifier: ^8.3.5 + version: 8.3.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.5) + '@storybook/nextjs': + specifier: ^8.3.5 + version: 8.3.5(@types/webpack@5.28.5(esbuild@0.19.11))(esbuild@0.19.11)(next@14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.5)(type-fest@3.13.1)(typescript@5.6.3)(webpack-dev-server@4.15.2(webpack@5.93.0(esbuild@0.19.11)))(webpack-hot-middleware@2.26.1)(webpack@5.93.0(esbuild@0.19.11)) + '@storybook/react': + specifier: ^8.3.5 + version: 8.3.5(@storybook/test@8.3.5(storybook@8.3.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.5)(typescript@5.6.3) + '@storybook/test': + specifier: ^8.3.5 + version: 8.3.5(storybook@8.3.5) + '@storybook/testing-react': + specifier: ^2.0.1 + version: 2.0.1(@storybook/client-logger@7.6.20)(@storybook/preview-api@8.3.5(storybook@8.3.5))(@storybook/react@8.3.5(@storybook/test@8.3.5(storybook@8.3.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.5)(typescript@5.6.3))(@storybook/types@7.6.20)(react@18.3.1) '@tailwindcss/typography': specifier: ^0.5.7 version: 0.5.13(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3))) @@ -1176,6 +1206,9 @@ importers: eslint-config-next: specifier: ^14.2.5 version: 14.2.5(eslint@8.57.0)(typescript@5.6.3) + eslint-plugin-storybook: + specifier: ^0.9.0 + version: 0.9.0(eslint@8.57.0)(typescript@5.6.3) eslint-plugin-unused-imports: specifier: ^4.0.1 version: 4.0.1(eslint@8.57.0) @@ -1187,7 +1220,7 @@ importers: version: 4.2.0 less-loader: specifier: ^10.2.0 - version: 10.2.0(less@4.2.0)(webpack@5.93.0) + version: 10.2.0(less@4.2.0)(webpack@5.93.0(esbuild@0.19.11)) minimist: specifier: ^1.2.7 version: 1.2.8 @@ -1199,7 +1232,10 @@ importers: version: 8.4.41 raw-loader: specifier: ^4.0.2 - version: 4.0.2(webpack@5.93.0) + version: 4.0.2(webpack@5.93.0(esbuild@0.19.11)) + storybook: + specifier: ^8.3.5 + version: 8.3.5 tailwindcss: specifier: ^3.0.24 version: 3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3)) @@ -2314,9 +2350,16 @@ packages: '@balena/dockerignore@1.0.2': resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} + '@base2/pretty-print-object@1.0.1': + resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@chromatic-com/storybook@1.9.0': + resolution: {integrity: sha512-vYQ+TcfktEE3GHnLZXHCzXF/sN9dw+KivH8a5cmPyd9YtQs7fZtHrEgsIjWpYycXiweKMo1Lm1RZsjxk8DH3rA==} + engines: {node: '>=16.0.0', yarn: '>=1.22.18'} + '@clickhouse/client-common@1.6.0': resolution: {integrity: sha512-DPdfPUIrBumWff8JdE2oLqnOIN1DwxXt48juV+tB6zaonufQR1QImtUGEhIFIqRWJU7zErtQ1eKfkwjLY0MYDg==} @@ -2477,6 +2520,9 @@ packages: resolution: {integrity: sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw==} engines: {node: '>=16'} + '@emnapi/runtime@1.3.1': + resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + '@emotion/hash@0.8.0': resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} @@ -2903,6 +2949,111 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead + '@img/sharp-darwin-arm64@0.33.5': + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.33.5': + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.0.4': + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.33.5': + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.33.5': + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-s390x@0.33.5': + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.33.5': + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.33.5': + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.33.5': + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.33.5': + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-ia32@0.33.5': + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.33.5': + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@inquirer/figures@1.0.5': resolution: {integrity: sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==} engines: {node: '>=18'} @@ -3183,6 +3334,12 @@ packages: '@maxmind/geoip2-node@5.0.0': resolution: {integrity: sha512-ki+q5//oU4tZ3BAhegZJcB5czoZyic5JSTEKbrUAQB/BzAoAiGyLW0immEmQvVVyy2SMlvBTJ3zqyRj8K9BbwQ==} + '@mdx-js/react@3.0.1': + resolution: {integrity: sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + '@monaco-editor/loader@1.4.0': resolution: {integrity: sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==} peerDependencies: @@ -4433,6 +4590,234 @@ packages: '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + '@storybook/addon-actions@8.3.5': + resolution: {integrity: sha512-t8D5oo+4XfD+F8091wLa2y/CDd/W2lExCeol5Vm1tp5saO+u6f2/d7iykLhTowWV84Uohi3D073uFeyTAlGebg==} + peerDependencies: + storybook: ^8.3.5 + + '@storybook/addon-backgrounds@8.3.5': + resolution: {integrity: sha512-IQGjDujuw8+iSqKREdkL8I5E/5CAHZbfOWd4A75PQK2D6qZ0fu/xRwTOQOH4jP6xn/abvfACOdL6A0d5bU90ag==} + peerDependencies: + storybook: ^8.3.5 + + '@storybook/addon-controls@8.3.5': + resolution: {integrity: sha512-2eCVobUUvY1Rq7sp1U8Mx8t44VXwvi0E+hqyrsqOx5TTSC/FUQ+hNAX6GSYUcFIyQQ1ORpKNlUjAAdjxBv1ZHQ==} + peerDependencies: + storybook: ^8.3.5 + + '@storybook/addon-docs@8.3.5': + resolution: {integrity: sha512-MOVfo1bY8kXTzbvmWnx3UuSO4WNykFz7Edvb3mxltNyuW7UDRZGuIuSe32ddT/EtLJfurrC9Ja3yBy4KBUGnMA==} + peerDependencies: + storybook: ^8.3.5 + + '@storybook/addon-essentials@8.3.5': + resolution: {integrity: sha512-hXTtPuN4/IsXjUrkMPAuz1qKAl8DovdXpjQgjQs7jSAVx3kc4BZaGqJ3gaVenKtO8uDchmA92BoQygpkc8eWhw==} + peerDependencies: + storybook: ^8.3.5 + + '@storybook/addon-highlight@8.3.5': + resolution: {integrity: sha512-ku0epul9aReCR3Gv/emwYnsqg3vgux5OmYMjoDcJC7s+LyfweSzLV/f5t9gSHazikJElh5TehtVkWbC4QfbGSw==} + peerDependencies: + storybook: ^8.3.5 + + '@storybook/addon-interactions@8.3.5': + resolution: {integrity: sha512-GtTy/A+mG7vDOahQr2avT4dpWtCRiFDSYcWyuQOZm10y8VDDw157HQM+FuhxjV9Owrrohy9F24oBUwRG8H3b5A==} + peerDependencies: + storybook: ^8.3.5 + + '@storybook/addon-links@8.3.5': + resolution: {integrity: sha512-giRCpn6cfJMYPnVJkojoQDO5ae6098fgY9YgAhwaJej/9dufNcioFdbiyfK1vyzbG6TGeTmJ9ncWCXgWRtzxPQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.3.5 + peerDependenciesMeta: + react: + optional: true + + '@storybook/addon-measure@8.3.5': + resolution: {integrity: sha512-6GVehgbHhFIFS69xSfRV+12VK0cnuIAtZdp1J3eUCc2ATrcigqVjTM6wzZz6kBuX6O3dcusr7Wg46KtNliqLqg==} + peerDependencies: + storybook: ^8.3.5 + + '@storybook/addon-onboarding@8.3.5': + resolution: {integrity: sha512-QE/+6KEYO5tGziMdo+81oor0KNVnbPsfDpnhtClu+t1XC2F2nKQpDISujwLSYm9voEk1D/NxYWMbQ6eTDR/ViA==} + peerDependencies: + storybook: ^8.3.5 + + '@storybook/addon-outline@8.3.5': + resolution: {integrity: sha512-dwmK6GzjEnQP9Yo0VnBUQtJkXZlXdfjWyskZ/IlUVc+IFdeeCtIiMyA92oMfHo8eXt0k1g21ZqMaIn7ZltOuHw==} + peerDependencies: + storybook: ^8.3.5 + + '@storybook/addon-toolbars@8.3.5': + resolution: {integrity: sha512-Ml2gc9q8WbteDvmuAZGgBxt5SqWMXzuTkMjlsA8EB53hlkN1w9esX4s8YtBeNqC3HKoUzcdq8uexSBqU8fDbSA==} + peerDependencies: + storybook: ^8.3.5 + + '@storybook/addon-viewport@8.3.5': + resolution: {integrity: sha512-FSWydoPiVWFXEittG7O1YgvuaqoU9Vb+qoq9XfP/hvQHHMDcMZvC40JaV8AnJeTXaM7ngIjcn9XDEfGbFfOzXw==} + peerDependencies: + storybook: ^8.3.5 + + '@storybook/blocks@8.3.5': + resolution: {integrity: sha512-8cHTdTywolTHlgwN8I7YH7saWAIjGzV617AwjhJ95AKlC0VtpO1gAFcAgCqr4DU9eMc+LZuvbnaU/RSvA5eCCQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.3.5 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + '@storybook/builder-webpack5@8.3.5': + resolution: {integrity: sha512-rhmfdiSlDn3Arki7IMYk11PO29rYuYM4LZ8GlNqREU7VUl/8Vngo/jFIa4pKaIns3ql1RrwzO1wm9JvuL/4ydA==} + peerDependencies: + storybook: ^8.3.5 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@storybook/channels@7.6.20': + resolution: {integrity: sha512-4hkgPSH6bJclB2OvLnkZOGZW1WptJs09mhQ6j6qLjgBZzL/ZdD6priWSd7iXrmPiN5TzUobkG4P4Dp7FjkiO7A==} + + '@storybook/client-logger@7.6.20': + resolution: {integrity: sha512-NwG0VIJQCmKrSaN5GBDFyQgTAHLNishUPLW1NrzqTDNAhfZUoef64rPQlinbopa0H4OXmlB+QxbQIb3ubeXmSQ==} + + '@storybook/components@8.3.5': + resolution: {integrity: sha512-Rq28YogakD3FO4F8KwAtGpo1g3t4V/gfCLqTQ8B6oQUFoxLqegkWk/DlwCzvoJndXuQJfdSyM6+r1JcA4Nql5A==} + peerDependencies: + storybook: ^8.3.5 + + '@storybook/core-events@7.6.20': + resolution: {integrity: sha512-tlVDuVbDiNkvPDFAu+0ou3xBBYbx9zUURQz4G9fAq0ScgBOs/bpzcRrFb4mLpemUViBAd47tfZKdH4MAX45KVQ==} + + '@storybook/core-webpack@8.3.5': + resolution: {integrity: sha512-mN8BHNc6lSGUf/nKgDr6XoTt1cX+Tap9RnKMUiROCDzfVlJPeJBrG4qrTOok7AwObzeDl9DNFyun6+pVgXJe7A==} + peerDependencies: + storybook: ^8.3.5 + + '@storybook/core@8.3.5': + resolution: {integrity: sha512-GOGfTvdioNa/n+Huwg4u/dsyYyBcM+gEcdxi3B7i5x4yJ3I912KoVshumQAOF2myKSRdI8h8aGWdx7nnjd0+5Q==} + + '@storybook/csf-plugin@8.3.5': + resolution: {integrity: sha512-ODVqNXwJt90hG7QW8I9w/XUyOGlr0l7XltmIJgXwB/2cYDvaGu3JV5Ybg7O0fxPV8uXk7JlRuUD8ZYv5Low6pA==} + peerDependencies: + storybook: ^8.3.5 + + '@storybook/csf@0.0.1': + resolution: {integrity: sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw==} + + '@storybook/csf@0.1.11': + resolution: {integrity: sha512-dHYFQH3mA+EtnCkHXzicbLgsvzYjcDJ1JWsogbItZogkPHgSJM/Wr71uMkcvw8v9mmCyP4NpXJuu6bPoVsOnzg==} + + '@storybook/global@5.0.0': + resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} + + '@storybook/icons@1.2.12': + resolution: {integrity: sha512-UxgyK5W3/UV4VrI3dl6ajGfHM4aOqMAkFLWe2KibeQudLf6NJpDrDMSHwZj+3iKC4jFU7dkKbbtH2h/al4sW3Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@storybook/instrumenter@8.3.5': + resolution: {integrity: sha512-NLDXai5y2t1ITgHVK9chyL0rMFZbICCOGcnTbyWhkLbiEWZKPJ8FuB8+g+Ba6zwtCve1A1Cnb4O2LOWy7TgWQw==} + peerDependencies: + storybook: ^8.3.5 + + '@storybook/manager-api@8.3.5': + resolution: {integrity: sha512-fEQoKKi7h7pzh2z9RfuzatJxubrsfL/CB99fNXQ0wshMSY/7O4ckd18pK4fzG9ErnCtLAO9qsim4N/4eQC+/8Q==} + peerDependencies: + storybook: ^8.3.5 + + '@storybook/nextjs@8.3.5': + resolution: {integrity: sha512-YMjDSVd7BHIvj6oLMEFMKRvfZ83INxZinxtrx4ZZXGe+5iP8j7rcV7D67lxKQKWNy36d9Foj4pjT85yYj5s+ZQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + next: ^13.5.0 || ^14.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.3.5 + typescript: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + webpack: + optional: true + + '@storybook/preset-react-webpack@8.3.5': + resolution: {integrity: sha512-laS9CiZrZ4CSnBTBfkBba3hmlDhzcjIfCvx8/rk3SZ+zh93NpqXixzRt6m0UH2po63dpdu21nXrsW5Cfs88Ypw==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.3.5 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@storybook/preview-api@8.3.5': + resolution: {integrity: sha512-VPqpudE8pmjTLvdNJoW/2//nqElDgUOmIn3QxbbCmdZTHDg5tFtxuqwdlNfArF0TxvTSBDIulXt/Q6K56TAfTg==} + peerDependencies: + storybook: ^8.3.5 + + '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0': + resolution: {integrity: sha512-KUqXC3oa9JuQ0kZJLBhVdS4lOneKTOopnNBK4tUAgoxWQ3u/IjzdueZjFr7gyBrXMoU6duutk3RQR9u8ZpYJ4Q==} + peerDependencies: + typescript: '>= 4.x' + webpack: '>= 4' + + '@storybook/react-dom-shim@8.3.5': + resolution: {integrity: sha512-Hf0UitJ/K0C7ajooooUK/PxOR4ihUWqsC7iCV1Gqth8U37dTeLMbaEO4PBwu0VQ+Ufg0N8BJLWfg7o6G4hrODw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.3.5 + + '@storybook/react@8.3.5': + resolution: {integrity: sha512-kuBPe/wBin10SWr4EWPKxiTRGQ4RD2etGEVWVQLqVpOuJp/J2hVvXQHtCfZXU4TZT5x4PBbPRswbr58+XlF+kQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + '@storybook/test': 8.3.5 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.3.5 + typescript: '>= 4.2.x' + peerDependenciesMeta: + '@storybook/test': + optional: true + typescript: + optional: true + + '@storybook/test@8.3.5': + resolution: {integrity: sha512-1BXWsUGWk9FiKKelZZ55FDJdeoL8uRBHbjTYBRM2xJLhdNSvGzI4Tb3bkmxPpGn72Ua6AyldhlTxr2BpUFKOHA==} + peerDependencies: + storybook: ^8.3.5 + + '@storybook/testing-react@2.0.1': + resolution: {integrity: sha512-D0fT7f0TUU8+usR+0NSyCYQCYDWernQqGZou32ISsoBkY9IiH1JMY4hQE8zUaGozu9eMlaa2wieWIMsjWovpdw==} + engines: {node: '>=10'} + deprecated: In Storybook 7, this package has been promoted to a first-class Storybook functionality. This means that you no longer need it! Instead, you can import the same utilities, but from the @storybook/react package. Please migrate when you can. + peerDependencies: + '@storybook/client-logger': ^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0 + '@storybook/preview-api': ^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0 + '@storybook/react': ^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0 + '@storybook/types': ^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@storybook/theming@8.3.5': + resolution: {integrity: sha512-9HmDDyC691oqfg4RziIM9ElsS2HITaxmH7n/yeUPtuirkPdAQzqOzhvH/Sa0qOhifzs8VjR+Gd/a/ZQ+S38r7w==} + peerDependencies: + storybook: ^8.3.5 + + '@storybook/types@7.6.20': + resolution: {integrity: sha512-GncdY3x0LpbhmUAAJwXYtJDUQEwfF175gsjH0/fxPkxPoV7Sef9TM41jQLJW/5+6TnZoCZP/+aJZTJtq3ni23Q==} + '@surma/rollup-plugin-off-main-thread@2.2.3': resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} @@ -4534,6 +4919,10 @@ packages: resolution: {integrity: sha512-JD0G+Zc38f5MBHA4NgxQMR5XtO5Jx9g86jqturNTt2WUfRmLDIY7iKkWHDCCTiDuFMre6nxAD5wHw9W5kI4rGw==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + '@testing-library/jest-dom@6.5.0': + resolution: {integrity: sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + '@testing-library/react@13.4.0': resolution: {integrity: sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==} engines: {node: '>=12'} @@ -4683,6 +5072,12 @@ packages: '@types/dockerode@3.3.31': resolution: {integrity: sha512-42R9eoVqJDSvVspV89g7RwRqfNExgievLNWoHkg7NoWIqAmavIbgQBb4oc0qRtHkxE+I3Xxvqv7qVXFABKPBTg==} + '@types/doctrine@0.0.9': + resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} + + '@types/escodegen@0.0.6': + resolution: {integrity: sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==} + '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} @@ -4695,6 +5090,9 @@ packages: '@types/estree@0.0.39': resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + '@types/estree@0.0.51': + resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} + '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} @@ -4717,6 +5115,9 @@ packages: '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/html-minifier-terser@6.1.0': resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} @@ -4762,6 +5163,9 @@ packages: '@types/long@4.0.2': resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} @@ -4792,6 +5196,9 @@ packages: '@types/node@20.14.14': resolution: {integrity: sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==} + '@types/node@22.7.5': + resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} + '@types/nodemailer@6.4.15': resolution: {integrity: sha512-0EBJxawVNjPkng1zm2vopRctuWVCxk34JcIlRuXSf54habUWdz1FB7wHDqOqvDa8Mtpt0Q3LTXQkAs2LNyK5jQ==} @@ -4900,6 +5307,12 @@ packages: '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/uuid@9.0.8': + resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} + '@types/vinyl@2.0.12': resolution: {integrity: sha512-Sr2fYMBUVGYq8kj3UthXFAu5UN6ZW+rYr4NACjZQJvHvj+c8lYv0CahmZ2P/r7iUkN44gGUBwqxZkrKXYPb7cw==} @@ -5137,6 +5550,24 @@ packages: '@vercel/static-config@3.0.0': resolution: {integrity: sha512-2qtvcBJ1bGY0dYGYh3iM7yGKkk971FujLEDXzuW5wcZsPr1GSEjO/w2iSr3qve6nDDtBImsGoDEnus5FI4+fIw==} + '@vitest/expect@2.0.5': + resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} + + '@vitest/pretty-format@2.0.5': + resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} + + '@vitest/pretty-format@2.1.3': + resolution: {integrity: sha512-XH1XdtoLZCpqV59KRbPrIhFCOO0hErxrQCMcvnQete3Vibb9UeIOX02uFPfVn3Z9ZXsq78etlfyhnkmIZSzIwQ==} + + '@vitest/spy@2.0.5': + resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} + + '@vitest/utils@2.0.5': + resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} + + '@vitest/utils@2.1.3': + resolution: {integrity: sha512-xpiVfDSg1RrYT0tX6czgerkpcKFmFOF/gCr30+Mve5V2kewCy4Prn1/NDMSRwaSmT7PRaOF83wu+bEtsY1wrvA==} + '@webassemblyjs/ast@1.12.1': resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} @@ -5528,6 +5959,9 @@ packages: asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + asn1.js@4.10.1: + resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} + asn1@0.2.6: resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} @@ -5539,9 +5973,20 @@ packages: resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} engines: {node: '>=0.8'} + assert@2.1.0: + resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + async-listen@1.2.0: resolution: {integrity: sha512-CcEtRh/oc9Jc4uWeUwdpG/+Mb2YUHKmdaTf0gUr7Wa+bfp4xx70HOb3RuSTJMvqKNB1TkdTfjLdrcz2X4rkkZA==} @@ -5737,6 +6182,10 @@ packages: before-after-hook@2.2.3: resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + better-opn@3.0.2: + resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} + engines: {node: '>=12.0.0'} + bfj@7.1.0: resolution: {integrity: sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==} engines: {node: '>= 8.0.0'} @@ -5778,6 +6227,12 @@ packages: bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + + bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + body-parser@1.20.3: resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -5808,13 +6263,39 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + brotli-size@4.0.0: resolution: {integrity: sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==} engines: {node: '>= 10.16.0'} + browser-assert@1.2.1: + resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==} + browser-process-hrtime@1.0.0: resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + + browserify-cipher@1.0.1: + resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} + + browserify-des@1.0.2: + resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} + + browserify-rsa@4.1.1: + resolution: {integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==} + engines: {node: '>= 0.10'} + + browserify-sign@4.2.3: + resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==} + engines: {node: '>= 0.12'} + + browserify-zlib@0.2.0: + resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} + browserslist@4.23.2: resolution: {integrity: sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -5845,6 +6326,9 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} @@ -5859,6 +6343,9 @@ packages: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} + builtin-status-codes@3.0.0: + resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} + builtins@1.0.3: resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} @@ -5949,6 +6436,10 @@ packages: resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} engines: {node: '>=4'} + chai@5.1.1: + resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + engines: {node: '>=12'} + chalk@1.1.3: resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} engines: {node: '>=0.10.0'} @@ -5984,6 +6475,10 @@ packages: resolution: {integrity: sha512-qK1gkGSRYcJzqrrzdR6a+I0vQ4/R+SoODXyAjscQ/4mzuNzySaMCd+hyVxitSY1+L2fjPD1Gbn+ibNqRmwQeLw==} engines: {pnpm: '>=8'} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + check-types@11.2.3: resolution: {integrity: sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==} @@ -6013,6 +6508,18 @@ packages: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} + chromatic@11.12.5: + resolution: {integrity: sha512-5z+BXQy3TMyXIzCdCDO9Psc8aMs9kIrCFHhMgYbwA6dTXxAL0oUjHZbICn5h4Ay/fM9cZQPaCH9T7a3myPA8Sw==} + hasBin: true + peerDependencies: + '@chromatic-com/cypress': ^0.*.* || ^1.0.0 + '@chromatic-com/playwright': ^0.*.* || ^1.0.0 + peerDependenciesMeta: + '@chromatic-com/cypress': + optional: true + '@chromatic-com/playwright': + optional: true + chrome-trace-event@1.0.4: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} @@ -6021,6 +6528,9 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} + cipher-base@1.0.4: + resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + circ-json@1.0.4: resolution: {integrity: sha512-/2NljkKlOCvNgs8jsIlJcCFhUfF6C1JJKM8PdJQ6HqIrqhJBouMcWFdeDJLNLZAadeTj0K9FMziH74hpEtAr1g==} @@ -6163,6 +6673,10 @@ packages: color@3.2.1: resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + colord@2.9.3: resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} @@ -6258,9 +6772,15 @@ packages: resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} engines: {node: '>=0.8'} + console-browserify@1.2.0: + resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} + console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + constants-browserify@1.0.0: + resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} + content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -6349,6 +6869,15 @@ packages: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + cpu-features@0.0.10: resolution: {integrity: sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==} engines: {node: '>=10.0.0'} @@ -6362,6 +6891,15 @@ packages: resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} engines: {node: '>= 10'} + create-ecdh@4.0.4: + resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + + create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + + create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + create-jest@29.7.0: resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -6380,6 +6918,9 @@ packages: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} + crypto-browserify@3.12.0: + resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} + crypto-js@4.2.0: resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} @@ -6717,6 +7258,10 @@ packages: babel-plugin-macros: optional: true + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + deep-equal@2.2.3: resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} engines: {node: '>= 0.4'} @@ -6781,6 +7326,9 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + des.js@1.1.0: + resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} + destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -6835,6 +7383,9 @@ packages: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} + diffie-hellman@5.0.3: + resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -6890,6 +7441,10 @@ packages: dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + domain-browser@4.23.0: + resolution: {integrity: sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==} + engines: {node: '>=10'} + domelementtype@1.3.1: resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} @@ -6999,6 +7554,9 @@ packages: electron-to-chromium@1.5.4: resolution: {integrity: sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==} + elliptic@6.5.7: + resolution: {integrity: sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==} + emittery@0.10.2: resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} engines: {node: '>=12'} @@ -7041,6 +7599,9 @@ packages: end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + endent@2.1.0: + resolution: {integrity: sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==} + engine.io-parser@5.2.3: resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} engines: {node: '>=10.0.0'} @@ -7230,6 +7791,11 @@ packages: cpu: [x64] os: [openbsd] + esbuild-register@3.6.0: + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} + peerDependencies: + esbuild: '>=0.12 <1' + esbuild-sunos-64@0.14.47: resolution: {integrity: sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ==} engines: {node: '>=12'} @@ -7402,6 +7968,12 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + eslint-plugin-storybook@0.9.0: + resolution: {integrity: sha512-qOT/2vQBo0VqrG/BhZv8IdSsKQiyzJw+2Wqq+WFCiblI/PfxLSrGkF/buiXF+HumwfsCyBdaC94UhqhmYFmAvA==} + engines: {node: '>= 18'} + peerDependencies: + eslint: '>=6' + eslint-plugin-testing-library@5.11.1: resolution: {integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} @@ -7489,6 +8061,9 @@ packages: estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -7511,6 +8086,9 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} + evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + execa@3.2.0: resolution: {integrity: sha512-kJJfVbI/lZE1PZYDI5VPxp8zXPO9rtxOkhpZ0jMKha56AI9y2gGVC6bkukStQf0ka5Rh15BA5m7cCCH4jmHqkw==} engines: {node: ^8.12.0 || >=9.7.0} @@ -7578,6 +8156,9 @@ packages: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} + fast-json-parse@1.0.3: + resolution: {integrity: sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==} + fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -7653,12 +8234,19 @@ packages: peerDependencies: webpack: ^4.0.0 || ^5.0.0 + file-system-cache@2.3.0: + resolution: {integrity: sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ==} + file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + filesize@10.1.6: + resolution: {integrity: sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==} + engines: {node: '>= 10.4.0'} + filesize@6.4.0: resolution: {integrity: sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ==} engines: {node: '>= 0.4.0'} @@ -7671,6 +8259,10 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + filter-obj@2.0.2: + resolution: {integrity: sha512-lO3ttPjHZRfjMcxWKb1j1eDhTFsu4meeR3lnMcnBFhk6RuLhvEiuALu2TlfL310ph4lCYYwgF/ElIjdP739tdg==} + engines: {node: '>=8'} + finalhandler@1.3.1: resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} @@ -7765,6 +8357,13 @@ packages: vue-template-compiler: optional: true + fork-ts-checker-webpack-plugin@8.0.0: + resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==} + engines: {node: '>=12.13.0', yarn: '>=1.0.0'} + peerDependencies: + typescript: '>3.6.0' + webpack: ^5.11.0 + form-data@2.5.1: resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} engines: {node: '>= 0.12'} @@ -7803,6 +8402,10 @@ packages: resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} engines: {node: '>=14.14'} + fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + fs-extra@8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} @@ -7939,6 +8542,9 @@ packages: github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + github-username@6.0.0: resolution: {integrity: sha512-7TTrRjxblSI5l6adk9zd+cV5d6i1OrJSo3Vr9xdGqFLBQo0mz5P9eIfKCDJ7eekVGGFLbce0qbPSnktXV2BjDQ==} engines: {node: '>=10'} @@ -8127,9 +8733,29 @@ packages: resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} engines: {node: '>= 0.4.0'} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + hash-base@3.0.4: + resolution: {integrity: sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==} + engines: {node: '>=4'} + + hash-base@3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} + + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-heading-rank@3.0.0: + resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-to-string@3.0.1: + resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} @@ -8142,6 +8768,9 @@ packages: resolution: {integrity: sha512-SYVnVFswQER+zu1laSya563s+F8VDGt7o35d4utbamowvUNLLMovFqwCLSocpZTz3MgaSRA1IbqRWZv97dtErQ==} engines: {node: '>=12.0.0'} + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} @@ -8189,6 +8818,10 @@ packages: engines: {node: '>=6'} hasBin: true + html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + html-to-text@9.0.5: resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==} engines: {node: '>=14'} @@ -8266,6 +8899,9 @@ packages: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} + https-browserify@1.0.0: + resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} + https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -8340,6 +8976,11 @@ packages: engines: {node: '>=0.10.0'} hasBin: true + image-size@1.1.1: + resolution: {integrity: sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==} + engines: {node: '>=16.x'} + hasBin: true + immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} @@ -8459,6 +9100,10 @@ packages: resolution: {integrity: sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg==} engines: {node: '>=0.10.0'} + is-absolute-url@4.0.1: + resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-arguments@1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} @@ -8561,6 +9206,10 @@ packages: is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + is-negative-zero@2.0.3: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} @@ -9195,6 +9844,10 @@ packages: jsbn@1.1.0: resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + jsdoc-type-pratt-parser@4.1.0: + resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==} + engines: {node: '>=12.0.0'} + jsdom@16.7.0: resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} engines: {node: '>=10'} @@ -9537,6 +10190,9 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + loupe@3.1.2: + resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} + lower-case@1.1.4: resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} @@ -9616,6 +10272,9 @@ packages: resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} engines: {node: '>=8'} + map-or-similar@1.5.0: + resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} + markdown-to-jsx@7.4.7: resolution: {integrity: sha512-0+ls1IQZdU6cwM1yu0ZjjiVWYtkbExSyUIFU2ZeDIFuZM1W42Mh4OlJ4nb4apX4H8smxDHRdFaoIVJGwfv5hkg==} engines: {node: '>= 10'} @@ -9644,6 +10303,9 @@ packages: peerDependencies: react: 18.x + md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + mdn-data@2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} @@ -9671,6 +10333,9 @@ packages: resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} engines: {node: '>= 4.0.0'} + memoizerific@1.11.3: + resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} + memory-pager@1.5.0: resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} @@ -9704,6 +10369,10 @@ packages: resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} engines: {node: '>=8.6'} + miller-rabin@4.0.1: + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + hasBin: true + mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -9756,6 +10425,9 @@ packages: minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -9979,8 +10651,8 @@ packages: moment@2.30.1: resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} - monaco-editor@0.50.0: - resolution: {integrity: sha512-8CclLCmrRRh+sul7C08BmPBP3P8wVWfBHomsTcndxg5NRCEPfu/mc2AGU8k37ajjDVXcXFc12ORAMUkmk+lkFA==} + monaco-editor@0.52.0: + resolution: {integrity: sha512-OeWhNpABLCeTqubfqLMXGsqf6OmPU6pHM85kF3dhy6kq5hnhuVS1p3VrEW/XhWHc71P2tHyS5JFySD8mgs1crw==} mongodb-connection-string-url@3.0.1: resolution: {integrity: sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==} @@ -10151,6 +10823,9 @@ packages: resolution: {integrity: sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==} engines: {node: '>=10'} + node-abort-controller@3.1.1: + resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + node-addon-api@2.0.2: resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} @@ -10224,6 +10899,12 @@ packages: peerDependencies: webpack: ^5.0.0 + node-polyfill-webpack-plugin@2.0.1: + resolution: {integrity: sha512-ZUMiCnZkP1LF0Th2caY6J/eKKoA0TefpoVa68m/LQU1I/mE8rGt4fNYGgNuCcK+aG8P8P43nbeJ2RqJMOL/Y1A==} + engines: {node: '>=12'} + peerDependencies: + webpack: '>=5' + node-postgres@0.6.2: resolution: {integrity: sha512-wjaW+KutPOFemtBDuogyy6OMMOs2vpSOwuqbUhFUbrDEOTk66K2lmRyvOdO4t26qGtnPyZXQ4bAuF17cBhi5aQ==} @@ -10432,6 +11113,9 @@ packages: resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} + objectorarray@1.0.5: + resolution: {integrity: sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==} + obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} @@ -10476,6 +11160,9 @@ packages: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} + os-browserify@0.3.0: + resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} + os-paths@4.4.0: resolution: {integrity: sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg==} engines: {node: '>= 6.0'} @@ -10561,6 +11248,9 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + param-case@2.1.1: resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} @@ -10574,6 +11264,10 @@ packages: parenthesis@3.1.8: resolution: {integrity: sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw==} + parse-asn1@5.1.7: + resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==} + engines: {node: '>= 0.10'} + parse-conflict-json@2.0.2: resolution: {integrity: sha512-jDbRGb00TAPFsKWCpZZOT93SxVP9nONOSgES3AevqRq/CHvavEBvKAjxX9p5Y5F0RZLxH9Ufd9+RwtCsa+lFDA==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -10672,6 +11366,14 @@ packages: resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} engines: {node: '>=12'} + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + + pbkdf2@3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: '>=0.12'} + peberminta@0.9.0: resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} @@ -10814,6 +11516,14 @@ packages: engines: {node: '>=16'} hasBin: true + pnp-webpack-plugin@1.7.0: + resolution: {integrity: sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==} + engines: {node: '>=6'} + + polished@4.3.1: + resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} + engines: {node: '>=10'} + possible-typed-array-names@1.0.0: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} @@ -11039,6 +11749,19 @@ packages: postcss: ^7.0.0 || ^8.0.1 webpack: ^5.0.0 + postcss-loader@8.1.1: + resolution: {integrity: sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + postcss: ^7.0.0 || ^8.0.1 + webpack: ^5.0.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + postcss-logical@5.0.4: resolution: {integrity: sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==} engines: {node: ^12 || ^14 || >=16} @@ -11600,9 +12323,15 @@ packages: pstree.remy@1.1.8: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + public-encrypt@4.0.3: + resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -11629,18 +12358,31 @@ packages: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} + querystring-es3@0.2.1: + resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} + engines: {node: '>=0.4.x'} + querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + queue@6.0.2: + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + raf@3.4.1: resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} + ramda@0.29.0: + resolution: {integrity: sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==} + randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + randomfill@1.0.4: + resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -11918,6 +12660,18 @@ packages: react-base16-styling@0.6.0: resolution: {integrity: sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==} + react-colorful@5.6.1: + resolution: {integrity: sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + react-confetti@6.1.0: + resolution: {integrity: sha512-7Ypx4vz0+g8ECVxr88W9zhcQpbeujJAVqL14ZnXJ3I23mOI9/oBVTQ3dkJhUmB0D6XOtCZEM6N0Gm9PMngkORw==} + engines: {node: '>=10.18'} + peerDependencies: + react: ^16.3.0 || ^17.0.1 || ^18.0.0 + react-dev-utils@12.0.1: resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} engines: {node: '>=14'} @@ -11928,11 +12682,26 @@ packages: typescript: optional: true + react-docgen-typescript@2.2.2: + resolution: {integrity: sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==} + peerDependencies: + typescript: '>= 4.3.x' + + react-docgen@7.0.3: + resolution: {integrity: sha512-i8aF1nyKInZnANZ4uZrH49qn1paRgBZ7wZiCNBMnenlPzEv0mRl+ShpTVEI6wZNl8sSc79xZkivtgLKQArcanQ==} + engines: {node: '>=16.14.0'} + react-dom@18.3.1: resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} peerDependencies: react: ^18.3.1 + react-element-to-jsx-string@15.0.0: + resolution: {integrity: sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==} + peerDependencies: + react: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 + react-dom: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 + react-email@3.0.1: resolution: {integrity: sha512-G4Bkx2ULIScy/0Z8nnWywHt0W1iTkaYCdh9rWNuQ3eVZ6B3ttTUDE9uUy3VNQ8dtQbmG0cpt8+XmImw7mMBW6Q==} engines: {node: '>=18.0.0'} @@ -11952,6 +12721,9 @@ packages: react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + react-is@18.1.0: + resolution: {integrity: sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==} + react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} @@ -11977,6 +12749,10 @@ packages: resolution: {integrity: sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==} engines: {node: '>=0.10.0'} + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + react-router-dom@6.25.1: resolution: {integrity: sha512-0tUDpbFvk35iv+N89dWNrJp+afLgd+y4VtorJZuOCXK0kkCWjEvb3vTJM++SYvMEpbVwXKf3FjeVveVEb6JpDQ==} engines: {node: '>=14.0.0'} @@ -12090,6 +12866,10 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + recast@0.23.9: + resolution: {integrity: sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==} + engines: {node: '>= 4'} + recharts-scale@0.4.5: resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} @@ -12162,6 +12942,12 @@ packages: resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} hasBin: true + rehype-external-links@3.0.0: + resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==} + + rehype-slug@6.0.0: + resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} + relateurl@0.2.7: resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} engines: {node: '>= 0.10'} @@ -12184,6 +12970,10 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + requireindex@1.2.0: + resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} + engines: {node: '>=0.10.5'} + requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} @@ -12225,6 +13015,10 @@ packages: rework-visit: optional: true + resolve-url-loader@5.0.0: + resolution: {integrity: sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==} + engines: {node: '>=12'} + resolve.exports@1.1.1: resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} engines: {node: '>=10'} @@ -12285,6 +13079,9 @@ packages: engines: {node: 14 >=14.20 || 16 >=16.20 || >=18} hasBin: true + ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + rollup-plugin-babel@4.4.0: resolution: {integrity: sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==} deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-babel. @@ -12421,6 +13218,25 @@ packages: sass-embedded: optional: true + sass-loader@13.3.3: + resolution: {integrity: sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA==} + engines: {node: '>= 14.15.0'} + peerDependencies: + fibers: '>= 3.1.0' + node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + sass: ^1.3.0 + sass-embedded: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + fibers: + optional: true + node-sass: + optional: true + sass: + optional: true + sass-embedded: + optional: true + sax@1.2.4: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} @@ -12537,6 +13353,10 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + shallow-clone@3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} @@ -12544,6 +13364,10 @@ packages: shallowequal@1.1.0: resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -12700,6 +13524,9 @@ packages: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} deprecated: Please use @jridgewell/sourcemap-codec instead + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + sparse-bitfield@3.0.3: resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} @@ -12812,12 +13639,22 @@ packages: stopwatch-node@1.1.0: resolution: {integrity: sha512-TpRTztFjiq/B5wn84oKK0YHHtprgrC8pLOUkqVU+MN+2DgdBMaEIeSyGeAn2n+7mT9zrfJyhM33Yw4j/rRV2Bg==} + storybook@8.3.5: + resolution: {integrity: sha512-hYQVtP2l+3kO8oKDn4fjXXQYxgTRsj/LaV6lUMJH0zt+OhVmDXKJLxmdUP4ieTm0T8wEbSYosFavgPcQZlxRfw==} + hasBin: true + + stream-browserify@3.0.0: + resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + stream-chain@2.2.5: resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} stream-events@1.0.5: resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==} + stream-http@3.2.0: + resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==} + stream-json@1.8.0: resolution: {integrity: sha512-HZfXngYHUAr1exT4fxlbc1IOce1RYxp2ldeaf97LYCOPSoOqY/1Psp7iGvpb+6JIOgkra9zDYnPX01hGAHzEPw==} @@ -12942,6 +13779,10 @@ packages: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} + strip-indent@4.0.0: + resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + engines: {node: '>=12'} + strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} @@ -12982,6 +13823,19 @@ packages: babel-plugin-macros: optional: true + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + stylehacks@4.0.3: resolution: {integrity: sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==} engines: {node: '>=6.9.0'} @@ -13091,6 +13945,9 @@ packages: resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==} engines: {node: '>=14'} + telejson@7.2.0: + resolution: {integrity: sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==} + temp-dir@2.0.0: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} engines: {node: '>=8'} @@ -13172,6 +14029,10 @@ packages: resolution: {integrity: sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==} engines: {node: '>=10'} + timers-browserify@2.0.12: + resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} + engines: {node: '>=0.6.0'} + timezones-list@3.0.3: resolution: {integrity: sha512-C+Vdvvj2c1xB6pu81pOX8geo6mrk/QsudFVlTVQET7QQwu8WAIyhDNeCrK5grU7EMzmbKLWqz7uU6dN8fvQvPQ==} @@ -13188,6 +14049,14 @@ packages: resolution: {integrity: sha512-0PU3c9PjMnltZaFo2sGYv/nnJsMjG0Cxx8X6FXHPPGjFyoo1SJDxvUXW1207rdiSxYizf31roo+GrkIByQeZoA==} engines: {node: '>=12'} + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -13256,6 +14125,10 @@ packages: peerDependencies: typescript: '>=4.2.0' + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + ts-easing@0.2.0: resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==} @@ -13359,15 +14232,32 @@ packages: '@swc/wasm': optional: true + ts-pnp@1.2.0: + resolution: {integrity: sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==} + engines: {node: '>=6'} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + ts-toolbelt@6.15.5: resolution: {integrity: sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==} ts-toolbelt@9.6.0: resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} + tsconfig-paths-webpack-plugin@4.1.0: + resolution: {integrity: sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==} + engines: {node: '>=10.13.0'} + tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + tsconfig@7.0.0: resolution: {integrity: sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==} @@ -13386,6 +14276,9 @@ packages: peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + tty-browserify@0.0.1: + resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} + tuf-js@1.1.7: resolution: {integrity: sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -13462,6 +14355,9 @@ packages: resolution: {integrity: sha512-PPUa2COKgFkyb6N3uF9AnIY3l9FZkF15QQ3U1K2wpI01D3gyGKQO0Q3DUQ4ipmciP0teBfL7H+l/QTrUA9IVvQ==} hasBin: true + tween-functions@1.2.0: + resolution: {integrity: sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==} + tweetnacl@0.14.5: resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} @@ -13570,6 +14466,9 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici@5.28.4: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} @@ -13632,6 +14531,15 @@ packages: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} engines: {node: '>=8'} + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + universal-user-agent@6.0.1: resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} @@ -13651,6 +14559,15 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + unplugin@1.14.1: + resolution: {integrity: sha512-lBlHbfSFPToDYp9pjXlUEFVxYLaue9f9T1HC+4OHlmj+HnMDdz9oZY+erXfoCe/5V/7gKUSY2jpXPb9S7f0f/w==} + engines: {node: '>=14.0.0'} + peerDependencies: + webpack-sources: ^3 + peerDependenciesMeta: + webpack-sources: + optional: true + unquote@1.1.1: resolution: {integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==} @@ -13680,6 +14597,10 @@ packages: url-template@2.0.8: resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==} + url@0.11.4: + resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} + engines: {node: '>= 0.4'} + use-composed-ref@1.3.0: resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} peerDependencies: @@ -13714,6 +14635,9 @@ packages: util.promisify@1.0.1: resolution: {integrity: sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==} + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + utila@0.4.0: resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} @@ -13808,6 +14732,9 @@ packages: vlq@0.2.3: resolution: {integrity: sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==} + vm-browserify@1.1.2: + resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} + w3c-hr-time@1.0.2: resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} deprecated: Use your platform's native performance.now() and performance.timeOrigin. @@ -13887,6 +14814,15 @@ packages: peerDependencies: webpack: ^4.0.0 || ^5.0.0 + webpack-dev-middleware@6.1.3: + resolution: {integrity: sha512-A4ChP0Qj8oGociTs6UdlRUGANIGrCDL3y+pmQMc+dSsraXHCatFpmMey4mYELA+juqwUqwQsUgJJISXl1KWmiw==} + engines: {node: '>= 14.15.0'} + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + webpack-dev-server@4.15.2: resolution: {integrity: sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==} engines: {node: '>= 12.13.0'} @@ -13900,6 +14836,9 @@ packages: webpack-cli: optional: true + webpack-hot-middleware@2.26.1: + resolution: {integrity: sha512-khZGfAeJx6I8K9zKohEWWYN6KDlVw2DHownoe+6Vtwj1LP9WFgegXnVMSkZ/dBEBtXFwrkkydsaPFlB7f8wU2A==} + webpack-manifest-plugin@4.1.1: resolution: {integrity: sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==} engines: {node: '>=12.22.0'} @@ -13921,6 +14860,9 @@ packages: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + webpack@5.93.0: resolution: {integrity: sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==} engines: {node: '>=10.13.0'} @@ -15837,8 +16779,22 @@ snapshots: '@balena/dockerignore@1.0.2': {} + '@base2/pretty-print-object@1.0.1': {} + '@bcoe/v8-coverage@0.2.3': {} + '@chromatic-com/storybook@1.9.0(react@18.3.1)': + dependencies: + chromatic: 11.12.5 + filesize: 10.1.6 + jsonfile: 6.1.0 + react-confetti: 6.1.0(react@18.3.1) + strip-ansi: 7.1.0 + transitivePeerDependencies: + - '@chromatic-com/cypress' + - '@chromatic-com/playwright' + - react + '@clickhouse/client-common@1.6.0': {} '@clickhouse/client@1.6.0': @@ -15977,6 +16933,11 @@ snapshots: dependencies: '@edge-runtime/primitives': 4.1.0 + '@emnapi/runtime@1.3.1': + dependencies: + tslib: 2.6.3 + optional: true + '@emotion/hash@0.8.0': {} '@emotion/unitless@0.7.5': {} @@ -16509,6 +17470,81 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + optional: true + + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true + + '@img/sharp-libvips-linux-s390x@1.0.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + optional: true + + '@img/sharp-linux-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + optional: true + + '@img/sharp-linux-arm@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + optional: true + + '@img/sharp-linux-s390x@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + optional: true + + '@img/sharp-linux-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + optional: true + + '@img/sharp-wasm32@0.33.5': + dependencies: + '@emnapi/runtime': 1.3.1 + optional: true + + '@img/sharp-win32-ia32@0.33.5': + optional: true + + '@img/sharp-win32-x64@0.33.5': + optional: true + '@inquirer/figures@1.0.5': {} '@ioredis/commands@1.2.0': {} @@ -17158,15 +18194,21 @@ snapshots: ip6addr: 0.2.5 maxmind: 4.3.20 - '@monaco-editor/loader@1.4.0(monaco-editor@0.50.0)': + '@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@types/mdx': 2.0.13 + '@types/react': 18.3.3 + react: 18.3.1 + + '@monaco-editor/loader@1.4.0(monaco-editor@0.52.0)': dependencies: - monaco-editor: 0.50.0 + monaco-editor: 0.52.0 state-local: 1.0.7 - '@monaco-editor/react@4.6.0(monaco-editor@0.50.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@monaco-editor/react@4.6.0(monaco-editor@0.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@monaco-editor/loader': 1.4.0(monaco-editor@0.50.0) - monaco-editor: 0.50.0 + '@monaco-editor/loader': 1.4.0(monaco-editor@0.52.0) + monaco-editor: 0.52.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -17529,7 +18571,24 @@ snapshots: dependencies: playwright: 1.39.0 - '@pmmmwh/react-refresh-webpack-plugin@0.5.15(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@3.13.1)(webpack-dev-server@4.15.2(webpack@5.93.0))(webpack@5.93.0)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.15(@types/webpack@5.28.5(esbuild@0.19.11))(react-refresh@0.14.2)(type-fest@3.13.1)(webpack-dev-server@4.15.2(webpack@5.93.0(esbuild@0.19.11)))(webpack-hot-middleware@2.26.1)(webpack@5.93.0(esbuild@0.19.11))': + dependencies: + ansi-html: 0.0.9 + core-js-pure: 3.37.1 + error-stack-parser: 2.1.4 + html-entities: 2.5.2 + loader-utils: 2.0.4 + react-refresh: 0.14.2 + schema-utils: 4.2.0 + source-map: 0.7.4 + webpack: 5.93.0(esbuild@0.19.11) + optionalDependencies: + '@types/webpack': 5.28.5(esbuild@0.19.11) + type-fest: 3.13.1 + webpack-dev-server: 4.15.2(webpack@5.93.0(esbuild@0.19.11)) + webpack-hot-middleware: 2.26.1 + + '@pmmmwh/react-refresh-webpack-plugin@0.5.15(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@3.13.1)(webpack-dev-server@4.15.2(webpack@5.93.0))(webpack-hot-middleware@2.26.1)(webpack@5.93.0)': dependencies: ansi-html: 0.0.9 core-js-pure: 3.37.1 @@ -17544,6 +18603,7 @@ snapshots: '@types/webpack': 5.28.5 type-fest: 3.13.1 webpack-dev-server: 4.15.2(webpack@5.93.0) + webpack-hot-middleware: 2.26.1 '@prisma/client@5.17.0(prisma@5.17.0)': optionalDependencies: @@ -18202,7 +19262,7 @@ snapshots: '@sentry/utils': 7.118.0 localforage: 1.10.0 - '@sentry/nextjs@7.118.0(encoding@0.1.13)(next@14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.93.0)': + '@sentry/nextjs@7.118.0(encoding@0.1.13)(next@14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.93.0(esbuild@0.19.11))': dependencies: '@rollup/plugin-commonjs': 24.0.0(rollup@2.78.0) '@sentry/core': 7.118.0 @@ -18220,7 +19280,7 @@ snapshots: rollup: 2.78.0 stacktrace-parser: 0.1.10 optionalDependencies: - webpack: 5.93.0 + webpack: 5.93.0(esbuild@0.19.11) transitivePeerDependencies: - encoding - supports-color @@ -18651,22 +19711,454 @@ snapshots: '@socket.io/component-emitter@3.1.2': {} - '@surma/rollup-plugin-off-main-thread@2.2.3': + '@storybook/addon-actions@8.3.5(storybook@8.3.5)': dependencies: - ejs: 3.1.10 - json5: 2.2.3 - magic-string: 0.25.9 - string.prototype.matchall: 4.0.11 - - '@svgr/babel-plugin-add-jsx-attribute@5.4.0': {} - - '@svgr/babel-plugin-remove-jsx-attribute@5.4.0': {} + '@storybook/global': 5.0.0 + '@types/uuid': 9.0.8 + dequal: 2.0.3 + polished: 4.3.1 + storybook: 8.3.5 + uuid: 9.0.1 - '@svgr/babel-plugin-remove-jsx-empty-expression@5.0.1': {} + '@storybook/addon-backgrounds@8.3.5(storybook@8.3.5)': + dependencies: + '@storybook/global': 5.0.0 + memoizerific: 1.11.3 + storybook: 8.3.5 + ts-dedent: 2.2.0 - '@svgr/babel-plugin-replace-jsx-attribute-value@5.0.1': {} + '@storybook/addon-controls@8.3.5(storybook@8.3.5)': + dependencies: + '@storybook/global': 5.0.0 + dequal: 2.0.3 + lodash: 4.17.21 + storybook: 8.3.5 + ts-dedent: 2.2.0 - '@svgr/babel-plugin-svg-dynamic-title@5.4.0': {} + '@storybook/addon-docs@8.3.5(storybook@8.3.5)(webpack-sources@3.2.3)': + dependencies: + '@mdx-js/react': 3.0.1(@types/react@18.3.3)(react@18.3.1) + '@storybook/blocks': 8.3.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.5) + '@storybook/csf-plugin': 8.3.5(storybook@8.3.5)(webpack-sources@3.2.3) + '@storybook/global': 5.0.0 + '@storybook/react-dom-shim': 8.3.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.5) + '@types/react': 18.3.3 + fs-extra: 11.1.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rehype-external-links: 3.0.0 + rehype-slug: 6.0.0 + storybook: 8.3.5 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - webpack-sources + + '@storybook/addon-essentials@8.3.5(storybook@8.3.5)(webpack-sources@3.2.3)': + dependencies: + '@storybook/addon-actions': 8.3.5(storybook@8.3.5) + '@storybook/addon-backgrounds': 8.3.5(storybook@8.3.5) + '@storybook/addon-controls': 8.3.5(storybook@8.3.5) + '@storybook/addon-docs': 8.3.5(storybook@8.3.5)(webpack-sources@3.2.3) + '@storybook/addon-highlight': 8.3.5(storybook@8.3.5) + '@storybook/addon-measure': 8.3.5(storybook@8.3.5) + '@storybook/addon-outline': 8.3.5(storybook@8.3.5) + '@storybook/addon-toolbars': 8.3.5(storybook@8.3.5) + '@storybook/addon-viewport': 8.3.5(storybook@8.3.5) + storybook: 8.3.5 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - webpack-sources + + '@storybook/addon-highlight@8.3.5(storybook@8.3.5)': + dependencies: + '@storybook/global': 5.0.0 + storybook: 8.3.5 + + '@storybook/addon-interactions@8.3.5(storybook@8.3.5)': + dependencies: + '@storybook/global': 5.0.0 + '@storybook/instrumenter': 8.3.5(storybook@8.3.5) + '@storybook/test': 8.3.5(storybook@8.3.5) + polished: 4.3.1 + storybook: 8.3.5 + ts-dedent: 2.2.0 + + '@storybook/addon-links@8.3.5(react@18.3.1)(storybook@8.3.5)': + dependencies: + '@storybook/csf': 0.1.11 + '@storybook/global': 5.0.0 + storybook: 8.3.5 + ts-dedent: 2.2.0 + optionalDependencies: + react: 18.3.1 + + '@storybook/addon-measure@8.3.5(storybook@8.3.5)': + dependencies: + '@storybook/global': 5.0.0 + storybook: 8.3.5 + tiny-invariant: 1.3.3 + + '@storybook/addon-onboarding@8.3.5(react@18.3.1)(storybook@8.3.5)': + dependencies: + react-confetti: 6.1.0(react@18.3.1) + storybook: 8.3.5 + transitivePeerDependencies: + - react + + '@storybook/addon-outline@8.3.5(storybook@8.3.5)': + dependencies: + '@storybook/global': 5.0.0 + storybook: 8.3.5 + ts-dedent: 2.2.0 + + '@storybook/addon-toolbars@8.3.5(storybook@8.3.5)': + dependencies: + storybook: 8.3.5 + + '@storybook/addon-viewport@8.3.5(storybook@8.3.5)': + dependencies: + memoizerific: 1.11.3 + storybook: 8.3.5 + + '@storybook/blocks@8.3.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.5)': + dependencies: + '@storybook/csf': 0.1.11 + '@storybook/global': 5.0.0 + '@storybook/icons': 1.2.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@types/lodash': 4.17.7 + color-convert: 2.0.1 + dequal: 2.0.3 + lodash: 4.17.21 + markdown-to-jsx: 7.4.7(react@18.3.1) + memoizerific: 1.11.3 + polished: 4.3.1 + react-colorful: 5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + storybook: 8.3.5 + telejson: 7.2.0 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + optionalDependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@storybook/builder-webpack5@8.3.5(esbuild@0.19.11)(storybook@8.3.5)(typescript@5.6.3)': + dependencies: + '@storybook/core-webpack': 8.3.5(storybook@8.3.5) + '@types/node': 22.7.5 + '@types/semver': 7.5.8 + browser-assert: 1.2.1 + case-sensitive-paths-webpack-plugin: 2.4.0 + cjs-module-lexer: 1.3.1 + constants-browserify: 1.0.0 + css-loader: 6.11.0(webpack@5.93.0(esbuild@0.19.11)) + es-module-lexer: 1.5.4 + express: 4.21.1 + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.6.3)(webpack@5.93.0(esbuild@0.19.11)) + fs-extra: 11.1.0 + html-webpack-plugin: 5.6.0(webpack@5.93.0(esbuild@0.19.11)) + magic-string: 0.30.11 + path-browserify: 1.0.1 + process: 0.11.10 + semver: 7.6.3 + storybook: 8.3.5 + style-loader: 3.3.4(webpack@5.93.0(esbuild@0.19.11)) + terser-webpack-plugin: 5.3.10(esbuild@0.19.11)(webpack@5.93.0(esbuild@0.19.11)) + ts-dedent: 2.2.0 + url: 0.11.4 + util: 0.12.5 + util-deprecate: 1.0.2 + webpack: 5.93.0(esbuild@0.19.11) + webpack-dev-middleware: 6.1.3(webpack@5.93.0(esbuild@0.19.11)) + webpack-hot-middleware: 2.26.1 + webpack-virtual-modules: 0.6.2 + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - '@rspack/core' + - '@swc/core' + - esbuild + - supports-color + - uglify-js + - webpack-cli + + '@storybook/channels@7.6.20': + dependencies: + '@storybook/client-logger': 7.6.20 + '@storybook/core-events': 7.6.20 + '@storybook/global': 5.0.0 + qs: 6.13.0 + telejson: 7.2.0 + tiny-invariant: 1.3.3 + + '@storybook/client-logger@7.6.20': + dependencies: + '@storybook/global': 5.0.0 + + '@storybook/components@8.3.5(storybook@8.3.5)': + dependencies: + storybook: 8.3.5 + + '@storybook/core-events@7.6.20': + dependencies: + ts-dedent: 2.2.0 + + '@storybook/core-webpack@8.3.5(storybook@8.3.5)': + dependencies: + '@types/node': 22.7.5 + storybook: 8.3.5 + ts-dedent: 2.2.0 + + '@storybook/core@8.3.5': + dependencies: + '@storybook/csf': 0.1.11 + '@types/express': 4.17.21 + better-opn: 3.0.2 + browser-assert: 1.2.1 + esbuild: 0.19.11 + esbuild-register: 3.6.0(esbuild@0.19.11) + express: 4.21.1 + jsdoc-type-pratt-parser: 4.1.0 + process: 0.11.10 + recast: 0.23.9 + semver: 7.6.3 + util: 0.12.5 + ws: 8.18.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@storybook/csf-plugin@8.3.5(storybook@8.3.5)(webpack-sources@3.2.3)': + dependencies: + storybook: 8.3.5 + unplugin: 1.14.1(webpack-sources@3.2.3) + transitivePeerDependencies: + - webpack-sources + + '@storybook/csf@0.0.1': + dependencies: + lodash: 4.17.21 + + '@storybook/csf@0.1.11': + dependencies: + type-fest: 2.19.0 + + '@storybook/global@5.0.0': {} + + '@storybook/icons@1.2.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@storybook/instrumenter@8.3.5(storybook@8.3.5)': + dependencies: + '@storybook/global': 5.0.0 + '@vitest/utils': 2.1.3 + storybook: 8.3.5 + util: 0.12.5 + + '@storybook/manager-api@8.3.5(storybook@8.3.5)': + dependencies: + storybook: 8.3.5 + + '@storybook/nextjs@8.3.5(@types/webpack@5.28.5(esbuild@0.19.11))(esbuild@0.19.11)(next@14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.5)(type-fest@3.13.1)(typescript@5.6.3)(webpack-dev-server@4.15.2(webpack@5.93.0(esbuild@0.19.11)))(webpack-hot-middleware@2.26.1)(webpack@5.93.0(esbuild@0.19.11))': + dependencies: + '@babel/core': 7.25.2 + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-import-assertions': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-class-properties': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-export-namespace-from': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-numeric-separator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-object-rest-spread': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-runtime': 7.24.7(@babel/core@7.25.2) + '@babel/preset-env': 7.25.2(@babel/core@7.25.2) + '@babel/preset-react': 7.24.7(@babel/core@7.25.2) + '@babel/preset-typescript': 7.24.7(@babel/core@7.25.2) + '@babel/runtime': 7.25.0 + '@pmmmwh/react-refresh-webpack-plugin': 0.5.15(@types/webpack@5.28.5(esbuild@0.19.11))(react-refresh@0.14.2)(type-fest@3.13.1)(webpack-dev-server@4.15.2(webpack@5.93.0(esbuild@0.19.11)))(webpack-hot-middleware@2.26.1)(webpack@5.93.0(esbuild@0.19.11)) + '@storybook/builder-webpack5': 8.3.5(esbuild@0.19.11)(storybook@8.3.5)(typescript@5.6.3) + '@storybook/preset-react-webpack': 8.3.5(@storybook/test@8.3.5(storybook@8.3.5))(esbuild@0.19.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.5)(typescript@5.6.3) + '@storybook/react': 8.3.5(@storybook/test@8.3.5(storybook@8.3.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.5)(typescript@5.6.3) + '@storybook/test': 8.3.5(storybook@8.3.5) + '@types/node': 22.7.5 + '@types/semver': 7.5.8 + babel-loader: 9.1.3(@babel/core@7.25.2)(webpack@5.93.0(esbuild@0.19.11)) + css-loader: 6.11.0(webpack@5.93.0(esbuild@0.19.11)) + find-up: 5.0.0 + fs-extra: 11.1.0 + image-size: 1.1.1 + loader-utils: 3.3.1 + next: 14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + node-polyfill-webpack-plugin: 2.0.1(webpack@5.93.0(esbuild@0.19.11)) + pnp-webpack-plugin: 1.7.0(typescript@5.6.3) + postcss: 8.4.41 + postcss-loader: 8.1.1(postcss@8.4.41)(typescript@5.6.3)(webpack@5.93.0(esbuild@0.19.11)) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-refresh: 0.14.2 + resolve-url-loader: 5.0.0 + sass-loader: 13.3.3(webpack@5.93.0(esbuild@0.19.11)) + semver: 7.6.3 + storybook: 8.3.5 + style-loader: 3.3.4(webpack@5.93.0(esbuild@0.19.11)) + styled-jsx: 5.1.6(@babel/core@7.25.2)(react@18.3.1) + ts-dedent: 2.2.0 + tsconfig-paths: 4.2.0 + tsconfig-paths-webpack-plugin: 4.1.0 + optionalDependencies: + sharp: 0.33.5 + typescript: 5.6.3 + webpack: 5.93.0(esbuild@0.19.11) + transitivePeerDependencies: + - '@rspack/core' + - '@swc/core' + - '@types/webpack' + - babel-plugin-macros + - esbuild + - fibers + - node-sass + - sass + - sass-embedded + - sockjs-client + - supports-color + - type-fest + - uglify-js + - webpack-cli + - webpack-dev-server + - webpack-hot-middleware + - webpack-plugin-serve + + '@storybook/preset-react-webpack@8.3.5(@storybook/test@8.3.5(storybook@8.3.5))(esbuild@0.19.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.5)(typescript@5.6.3)': + dependencies: + '@storybook/core-webpack': 8.3.5(storybook@8.3.5) + '@storybook/react': 8.3.5(@storybook/test@8.3.5(storybook@8.3.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.5)(typescript@5.6.3) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.6.3)(webpack@5.93.0(esbuild@0.19.11)) + '@types/node': 22.7.5 + '@types/semver': 7.5.8 + find-up: 5.0.0 + fs-extra: 11.1.0 + magic-string: 0.30.11 + react: 18.3.1 + react-docgen: 7.0.3 + react-dom: 18.3.1(react@18.3.1) + resolve: 1.22.8 + semver: 7.6.3 + storybook: 8.3.5 + tsconfig-paths: 4.2.0 + webpack: 5.93.0(esbuild@0.19.11) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - '@storybook/test' + - '@swc/core' + - esbuild + - supports-color + - uglify-js + - webpack-cli + + '@storybook/preview-api@8.3.5(storybook@8.3.5)': + dependencies: + storybook: 8.3.5 + + '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.6.3)(webpack@5.93.0(esbuild@0.19.11))': + dependencies: + debug: 4.3.6(supports-color@5.5.0) + endent: 2.1.0 + find-cache-dir: 3.3.2 + flat-cache: 3.2.0 + micromatch: 4.0.7 + react-docgen-typescript: 2.2.2(typescript@5.6.3) + tslib: 2.6.3 + typescript: 5.6.3 + webpack: 5.93.0(esbuild@0.19.11) + transitivePeerDependencies: + - supports-color + + '@storybook/react-dom-shim@8.3.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.5)': + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + storybook: 8.3.5 + + '@storybook/react@8.3.5(@storybook/test@8.3.5(storybook@8.3.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.5)(typescript@5.6.3)': + dependencies: + '@storybook/components': 8.3.5(storybook@8.3.5) + '@storybook/global': 5.0.0 + '@storybook/manager-api': 8.3.5(storybook@8.3.5) + '@storybook/preview-api': 8.3.5(storybook@8.3.5) + '@storybook/react-dom-shim': 8.3.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.5) + '@storybook/theming': 8.3.5(storybook@8.3.5) + '@types/escodegen': 0.0.6 + '@types/estree': 0.0.51 + '@types/node': 22.7.5 + acorn: 7.4.1 + acorn-jsx: 5.3.2(acorn@7.4.1) + acorn-walk: 7.2.0 + escodegen: 2.1.0 + html-tags: 3.3.1 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-element-to-jsx-string: 15.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + semver: 7.6.3 + storybook: 8.3.5 + ts-dedent: 2.2.0 + type-fest: 2.19.0 + util-deprecate: 1.0.2 + optionalDependencies: + '@storybook/test': 8.3.5(storybook@8.3.5) + typescript: 5.6.3 + + '@storybook/test@8.3.5(storybook@8.3.5)': + dependencies: + '@storybook/csf': 0.1.11 + '@storybook/global': 5.0.0 + '@storybook/instrumenter': 8.3.5(storybook@8.3.5) + '@testing-library/dom': 10.4.0 + '@testing-library/jest-dom': 6.5.0 + '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0) + '@vitest/expect': 2.0.5 + '@vitest/spy': 2.0.5 + storybook: 8.3.5 + util: 0.12.5 + + '@storybook/testing-react@2.0.1(@storybook/client-logger@7.6.20)(@storybook/preview-api@8.3.5(storybook@8.3.5))(@storybook/react@8.3.5(@storybook/test@8.3.5(storybook@8.3.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.5)(typescript@5.6.3))(@storybook/types@7.6.20)(react@18.3.1)': + dependencies: + '@storybook/client-logger': 7.6.20 + '@storybook/csf': 0.1.11 + '@storybook/preview-api': 8.3.5(storybook@8.3.5) + '@storybook/react': 8.3.5(@storybook/test@8.3.5(storybook@8.3.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.5)(typescript@5.6.3) + '@storybook/types': 7.6.20 + react: 18.3.1 + + '@storybook/theming@8.3.5(storybook@8.3.5)': + dependencies: + storybook: 8.3.5 + + '@storybook/types@7.6.20': + dependencies: + '@storybook/channels': 7.6.20 + '@types/babel__core': 7.20.5 + '@types/express': 4.17.21 + file-system-cache: 2.3.0 + + '@surma/rollup-plugin-off-main-thread@2.2.3': + dependencies: + ejs: 3.1.10 + json5: 2.2.3 + magic-string: 0.25.9 + string.prototype.matchall: 4.0.11 + + '@svgr/babel-plugin-add-jsx-attribute@5.4.0': {} + + '@svgr/babel-plugin-remove-jsx-attribute@5.4.0': {} + + '@svgr/babel-plugin-remove-jsx-empty-expression@5.0.1': {} + + '@svgr/babel-plugin-replace-jsx-attribute-value@5.0.1': {} + + '@svgr/babel-plugin-svg-dynamic-title@5.4.0': {} '@svgr/babel-plugin-svg-em-dimensions@5.4.0': {} @@ -18796,6 +20288,16 @@ snapshots: lodash: 4.17.21 redent: 3.0.0 + '@testing-library/jest-dom@6.5.0': + dependencies: + '@adobe/css-tools': 4.4.0 + aria-query: 5.3.0 + chalk: 3.0.0 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + lodash: 4.17.21 + redent: 3.0.0 + '@testing-library/react@13.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 @@ -18957,6 +20459,10 @@ snapshots: '@types/node': 18.19.42 '@types/ssh2': 1.15.0 + '@types/doctrine@0.0.9': {} + + '@types/escodegen@0.0.6': {} + '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 9.6.0 @@ -18974,6 +20480,8 @@ snapshots: '@types/estree@0.0.39': {} + '@types/estree@0.0.51': {} + '@types/estree@1.0.5': {} '@types/expect@1.20.4': {} @@ -19007,6 +20515,10 @@ snapshots: dependencies: '@types/node': 18.19.42 + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + '@types/html-minifier-terser@6.1.0': {} '@types/http-errors@2.0.4': {} @@ -19051,6 +20563,8 @@ snapshots: '@types/long@4.0.2': {} + '@types/mdx@2.0.13': {} + '@types/mime@1.3.5': {} '@types/minimatch@3.0.5': {} @@ -19080,6 +20594,10 @@ snapshots: dependencies: undici-types: 5.26.5 + '@types/node@22.7.5': + dependencies: + undici-types: 6.19.8 + '@types/nodemailer@6.4.15': dependencies: '@types/node': 18.19.42 @@ -19205,6 +20723,10 @@ snapshots: '@types/trusted-types@2.0.7': {} + '@types/unist@3.0.3': {} + + '@types/uuid@9.0.8': {} + '@types/vinyl@2.0.12': dependencies: '@types/expect': 1.20.4 @@ -19226,6 +20748,18 @@ snapshots: - webpack-cli optional: true + '@types/webpack@5.28.5(esbuild@0.19.11)': + dependencies: + '@types/node': 18.19.42 + tapable: 2.2.1 + webpack: 5.93.0(esbuild@0.19.11) + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + - webpack-cli + optional: true + '@types/webpack@5.28.5(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))': dependencies: '@types/node': 18.19.42 @@ -19617,6 +21151,38 @@ snapshots: json-schema-to-ts: 1.6.4 ts-morph: 12.0.0 + '@vitest/expect@2.0.5': + dependencies: + '@vitest/spy': 2.0.5 + '@vitest/utils': 2.0.5 + chai: 5.1.1 + tinyrainbow: 1.2.0 + + '@vitest/pretty-format@2.0.5': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/pretty-format@2.1.3': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/spy@2.0.5': + dependencies: + tinyspy: 3.0.2 + + '@vitest/utils@2.0.5': + dependencies: + '@vitest/pretty-format': 2.0.5 + estree-walker: 3.0.3 + loupe: 3.1.2 + tinyrainbow: 1.2.0 + + '@vitest/utils@2.1.3': + dependencies: + '@vitest/pretty-format': 2.1.3 + loupe: 3.1.2 + tinyrainbow: 1.2.0 + '@webassemblyjs/ast@1.12.1': dependencies: '@webassemblyjs/helper-numbers': 1.11.6 @@ -19752,6 +21318,10 @@ snapshots: dependencies: acorn: 8.12.1 + acorn-jsx@5.3.2(acorn@7.4.1): + dependencies: + acorn: 7.4.1 + acorn-jsx@5.3.2(acorn@8.12.1): dependencies: acorn: 8.12.1 @@ -20118,6 +21688,12 @@ snapshots: asap@2.0.6: {} + asn1.js@4.10.1: + dependencies: + bn.js: 4.12.0 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + asn1@0.2.6: dependencies: safer-buffer: 2.1.2 @@ -20126,8 +21702,22 @@ snapshots: assert-plus@1.0.0: {} + assert@2.1.0: + dependencies: + call-bind: 1.0.7 + is-nan: 1.3.2 + object-is: 1.1.6 + object.assign: 4.1.5 + util: 0.12.5 + + assertion-error@2.0.1: {} + ast-types-flow@0.0.8: {} + ast-types@0.16.1: + dependencies: + tslib: 2.6.3 + async-listen@1.2.0: {} async-listen@3.0.0: {} @@ -20248,6 +21838,13 @@ snapshots: schema-utils: 2.7.1 webpack: 5.93.0 + babel-loader@9.1.3(@babel/core@7.25.2)(webpack@5.93.0(esbuild@0.19.11)): + dependencies: + '@babel/core': 7.25.2 + find-cache-dir: 4.0.0 + schema-utils: 4.2.0 + webpack: 5.93.0(esbuild@0.19.11) + babel-loader@9.1.3(@babel/core@7.25.2)(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))): dependencies: '@babel/core': 7.25.2 @@ -20419,6 +22016,10 @@ snapshots: before-after-hook@2.2.3: {} + better-opn@3.0.2: + dependencies: + open: 8.4.2 + bfj@7.1.0: dependencies: bluebird: 3.7.2 @@ -20462,6 +22063,10 @@ snapshots: bluebird@3.7.2: {} + bn.js@4.12.0: {} + + bn.js@5.2.1: {} + body-parser@1.20.3: dependencies: bytes: 3.1.2 @@ -20514,12 +22119,61 @@ snapshots: dependencies: fill-range: 7.1.1 + brorand@1.1.0: {} + brotli-size@4.0.0: dependencies: duplexer: 0.1.1 + browser-assert@1.2.1: {} + browser-process-hrtime@1.0.0: {} + browserify-aes@1.2.0: + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.4 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + browserify-cipher@1.0.1: + dependencies: + browserify-aes: 1.2.0 + browserify-des: 1.0.2 + evp_bytestokey: 1.0.3 + + browserify-des@1.0.2: + dependencies: + cipher-base: 1.0.4 + des.js: 1.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + browserify-rsa@4.1.1: + dependencies: + bn.js: 5.2.1 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + + browserify-sign@4.2.3: + dependencies: + bn.js: 5.2.1 + browserify-rsa: 4.1.1 + create-hash: 1.2.0 + create-hmac: 1.1.7 + elliptic: 6.5.7 + hash-base: 3.0.4 + inherits: 2.0.4 + parse-asn1: 5.1.7 + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + + browserify-zlib@0.2.0: + dependencies: + pako: 1.0.11 + browserslist@4.23.2: dependencies: caniuse-lite: 1.0.30001645 @@ -20550,6 +22204,8 @@ snapshots: buffer-from@1.1.2: {} + buffer-xor@1.0.3: {} + buffer@5.7.1: dependencies: base64-js: 1.5.1 @@ -20565,6 +22221,8 @@ snapshots: builtin-modules@3.3.0: {} + builtin-status-codes@3.0.0: {} + builtins@1.0.3: {} busboy@1.6.0: @@ -20691,6 +22349,14 @@ snapshots: case-sensitive-paths-webpack-plugin@2.4.0: {} + chai@5.1.1: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.2 + pathval: 2.0.0 + chalk@1.1.3: dependencies: ansi-styles: 2.2.1 @@ -20727,6 +22393,8 @@ snapshots: dependencies: '@kurkle/color': 0.3.2 + check-error@2.1.1: {} + check-types@11.2.3: {} cheerio-select@2.1.0: @@ -20778,10 +22446,17 @@ snapshots: chownr@3.0.0: {} + chromatic@11.12.5: {} + chrome-trace-event@1.0.4: {} ci-info@3.9.0: {} + cipher-base@1.0.4: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + circ-json@1.0.4: {} cjs-module-lexer@1.2.3: {} @@ -20903,6 +22578,12 @@ snapshots: color-convert: 1.9.3 color-string: 1.9.1 + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + optional: true + colord@2.9.3: {} colorette@2.0.20: {} @@ -20990,8 +22671,12 @@ snapshots: connect-history-api-fallback@2.0.0: {} + console-browserify@1.2.0: {} + console-control-strings@1.1.0: {} + constants-browserify@1.0.0: {} + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 @@ -21079,6 +22764,15 @@ snapshots: path-type: 4.0.0 yaml: 1.10.2 + cosmiconfig@9.0.0(typescript@5.6.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.6.3 + cpu-features@0.0.10: dependencies: buildcheck: 0.0.6 @@ -21092,6 +22786,28 @@ snapshots: crc-32: 1.2.2 readable-stream: 3.6.2 + create-ecdh@4.0.4: + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.7 + + create-hash@1.2.0: + dependencies: + cipher-base: 1.0.4 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + + create-hmac@1.1.7: + dependencies: + cipher-base: 1.0.4 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + create-jest@29.7.0(@types/node@16.18.11)(ts-node@10.9.2(@types/node@16.18.11)(typescript@5.6.3)): dependencies: '@jest/types': 29.6.3 @@ -21172,6 +22888,20 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + crypto-browserify@3.12.0: + dependencies: + browserify-cipher: 1.0.1 + browserify-sign: 4.2.3 + create-ecdh: 4.0.4 + create-hash: 1.2.0 + create-hmac: 1.1.7 + diffie-hellman: 5.0.3 + inherits: 2.0.4 + pbkdf2: 3.1.2 + public-encrypt: 4.0.3 + randombytes: 2.1.0 + randomfill: 1.0.4 + crypto-js@4.2.0: {} crypto-random-string@2.0.0: {} @@ -21201,6 +22931,19 @@ snapshots: dependencies: hyphenate-style-name: 1.1.0 + css-loader@6.11.0(webpack@5.93.0(esbuild@0.19.11)): + dependencies: + icss-utils: 5.1.0(postcss@8.4.41) + postcss: 8.4.41 + postcss-modules-extract-imports: 3.1.0(postcss@8.4.41) + postcss-modules-local-by-default: 4.0.5(postcss@8.4.41) + postcss-modules-scope: 3.2.0(postcss@8.4.41) + postcss-modules-values: 4.0.0(postcss@8.4.41) + postcss-value-parser: 4.2.0 + semver: 7.6.3 + optionalDependencies: + webpack: 5.93.0(esbuild@0.19.11) + css-loader@6.11.0(webpack@5.93.0): dependencies: icss-utils: 5.1.0(postcss@8.4.41) @@ -21520,6 +23263,8 @@ snapshots: optionalDependencies: babel-plugin-macros: 3.1.0 + deep-eql@5.0.2: {} + deep-equal@2.2.3: dependencies: array-buffer-byte-length: 1.0.1 @@ -21593,6 +23338,11 @@ snapshots: dequal@2.0.3: {} + des.js@1.1.0: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + destroy@1.2.0: {} detect-libc@1.0.3: {} @@ -21629,6 +23379,12 @@ snapshots: diff@5.2.0: {} + diffie-hellman@5.0.3: + dependencies: + bn.js: 4.12.0 + miller-rabin: 4.0.1 + randombytes: 2.1.0 + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -21700,6 +23456,8 @@ snapshots: domhandler: 5.0.3 entities: 4.5.0 + domain-browser@4.23.0: {} + domelementtype@1.3.1: {} domelementtype@2.3.0: {} @@ -21820,6 +23578,16 @@ snapshots: electron-to-chromium@1.5.4: {} + elliptic@6.5.7: + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + emittery@0.10.2: {} emittery@0.13.1: {} @@ -21851,6 +23619,12 @@ snapshots: dependencies: once: 1.4.0 + endent@2.1.0: + dependencies: + dedent: 0.7.0 + fast-json-parse: 1.0.3 + objectorarray: 1.0.5 + engine.io-parser@5.2.3: {} engine.io@6.5.5: @@ -22062,6 +23836,13 @@ snapshots: esbuild-openbsd-64@0.14.47: optional: true + esbuild-register@3.6.0(esbuild@0.19.11): + dependencies: + debug: 4.3.6(supports-color@5.5.0) + esbuild: 0.19.11 + transitivePeerDependencies: + - supports-color + esbuild-sunos-64@0.14.47: optional: true @@ -22366,6 +24147,17 @@ snapshots: string.prototype.matchall: 4.0.11 string.prototype.repeat: 1.0.0 + eslint-plugin-storybook@0.9.0(eslint@8.57.0)(typescript@5.6.3): + dependencies: + '@storybook/csf': 0.0.1 + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.6.3) + eslint: 8.57.0 + requireindex: 1.2.0 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - supports-color + - typescript + eslint-plugin-testing-library@5.11.1(eslint@8.57.0)(typescript@5.6.3): dependencies: '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.6.3) @@ -22476,6 +24268,10 @@ snapshots: estree-walker@2.0.2: {} + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.5 + esutils@2.0.3: {} etag@1.8.1: {} @@ -22488,6 +24284,11 @@ snapshots: events@3.3.0: {} + evp_bytestokey@1.0.3: + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + execa@3.2.0: dependencies: cross-spawn: 7.0.3 @@ -22614,6 +24415,8 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.7 + fast-json-parse@1.0.3: {} + fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} @@ -22694,12 +24497,19 @@ snapshots: schema-utils: 3.3.0 webpack: 5.93.0 + file-system-cache@2.3.0: + dependencies: + fs-extra: 11.1.1 + ramda: 0.29.0 + file-uri-to-path@1.0.0: {} filelist@1.0.4: dependencies: minimatch: 5.1.6 + filesize@10.1.6: {} + filesize@6.4.0: {} filesize@8.0.7: {} @@ -22708,6 +24518,8 @@ snapshots: dependencies: to-regex-range: 5.0.1 + filter-obj@2.0.2: {} + finalhandler@1.3.1: dependencies: debug: 2.6.9 @@ -22862,6 +24674,23 @@ snapshots: optionalDependencies: eslint: 8.57.0 + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.6.3)(webpack@5.93.0(esbuild@0.19.11)): + dependencies: + '@babel/code-frame': 7.24.7 + chalk: 4.1.2 + chokidar: 3.6.0 + cosmiconfig: 7.1.0 + deepmerge: 4.3.1 + fs-extra: 10.1.0 + memfs: 3.5.3 + minimatch: 3.1.2 + node-abort-controller: 3.1.1 + schema-utils: 3.3.0 + semver: 7.6.3 + tapable: 2.2.1 + typescript: 5.6.3 + webpack: 5.93.0(esbuild@0.19.11) + form-data@2.5.1: dependencies: asynckit: 0.4.0 @@ -22904,6 +24733,12 @@ snapshots: jsonfile: 6.1.0 universalify: 2.0.1 + fs-extra@11.1.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + fs-extra@8.1.0: dependencies: graceful-fs: 4.2.11 @@ -23072,6 +24907,8 @@ snapshots: github-from-package@0.0.0: {} + github-slugger@2.0.0: {} + github-username@6.0.0(encoding@0.1.13): dependencies: '@octokit/rest': 18.12.0(encoding@0.1.13) @@ -23346,16 +25183,50 @@ snapshots: has@1.0.4: {} + hash-base@3.0.4: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + hash-base@3.1.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + + hash.js@1.1.7: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + hasown@2.0.2: dependencies: function-bind: 1.1.2 + hast-util-heading-rank@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-to-string@3.0.1: + dependencies: + '@types/hast': 3.0.4 + he@1.2.0: {} hex-color-regex@1.1.0: {} highlight.js@11.10.0: {} + hmac-drbg@1.0.1: + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 @@ -23411,6 +25282,8 @@ snapshots: relateurl: 0.2.7 uglify-js: 3.19.1 + html-tags@3.3.1: {} + html-to-text@9.0.5: dependencies: '@selderee/plugin-htmlparser2': 0.11.0 @@ -23419,6 +25292,16 @@ snapshots: htmlparser2: 8.0.2 selderee: 0.11.0 + html-webpack-plugin@5.6.0(webpack@5.93.0(esbuild@0.19.11)): + dependencies: + '@types/html-minifier-terser': 6.1.0 + html-minifier-terser: 6.1.0 + lodash: 4.17.21 + pretty-error: 4.0.0 + tapable: 2.2.1 + optionalDependencies: + webpack: 5.93.0(esbuild@0.19.11) + html-webpack-plugin@5.6.0(webpack@5.93.0): dependencies: '@types/html-minifier-terser': 6.1.0 @@ -23529,6 +25412,8 @@ snapshots: transitivePeerDependencies: - debug + https-browserify@1.0.0: {} + https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 @@ -23592,6 +25477,10 @@ snapshots: image-size@0.5.5: optional: true + image-size@1.1.1: + dependencies: + queue: 6.0.2 + immediate@3.0.6: {} immer@9.0.21: {} @@ -23735,6 +25624,8 @@ snapshots: is-absolute-url@2.1.0: {} + is-absolute-url@4.0.1: {} + is-arguments@1.1.1: dependencies: call-bind: 1.0.7 @@ -23827,6 +25718,11 @@ snapshots: is-module@1.0.0: {} + is-nan@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + is-negative-zero@2.0.3: {} is-number-object@1.0.7: @@ -25231,6 +27127,8 @@ snapshots: jsbn@1.1.0: {} + jsdoc-type-pratt-parser@4.1.0: {} + jsdom@16.7.0: dependencies: abab: 2.0.6 @@ -25448,11 +27346,11 @@ snapshots: leac@0.6.0: {} - less-loader@10.2.0(less@4.2.0)(webpack@5.93.0): + less-loader@10.2.0(less@4.2.0)(webpack@5.93.0(esbuild@0.19.11)): dependencies: klona: 2.0.6 less: 4.2.0 - webpack: 5.93.0 + webpack: 5.93.0(esbuild@0.19.11) less@4.2.0: dependencies: @@ -25599,6 +27497,8 @@ snapshots: dependencies: js-tokens: 4.0.0 + loupe@3.1.2: {} + lower-case@1.1.4: {} lower-case@2.0.2: @@ -25730,6 +27630,8 @@ snapshots: map-obj@4.3.0: {} + map-or-similar@1.5.0: {} + markdown-to-jsx@7.4.7(react@18.3.1): dependencies: react: 18.3.1 @@ -25758,6 +27660,12 @@ snapshots: marked: 7.0.4 react: 18.3.1 + md5.js@1.3.5: + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + mdn-data@2.0.14: {} mdn-data@2.0.4: {} @@ -25790,6 +27698,10 @@ snapshots: dependencies: fs-monkey: 1.0.6 + memoizerific@1.11.3: + dependencies: + map-or-similar: 1.5.0 + memory-pager@1.5.0: {} mensch@0.3.4: {} @@ -25859,6 +27771,11 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + miller-rabin@4.0.1: + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + mime-db@1.52.0: {} mime-db@1.53.0: {} @@ -25890,6 +27807,8 @@ snapshots: minimalistic-assert@1.0.1: {} + minimalistic-crypto-utils@1.0.1: {} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -26319,7 +28238,7 @@ snapshots: moment@2.30.1: {} - monaco-editor@0.50.0: {} + monaco-editor@0.52.0: {} mongodb-connection-string-url@3.0.1: dependencies: @@ -26530,6 +28449,8 @@ snapshots: dependencies: semver: 7.6.3 + node-abort-controller@3.1.1: {} + node-addon-api@2.0.2: {} node-cache@5.1.2: @@ -26611,6 +28532,35 @@ snapshots: loader-utils: 2.0.4 webpack: 5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)) + node-polyfill-webpack-plugin@2.0.1(webpack@5.93.0(esbuild@0.19.11)): + dependencies: + assert: 2.1.0 + browserify-zlib: 0.2.0 + buffer: 6.0.3 + console-browserify: 1.2.0 + constants-browserify: 1.0.0 + crypto-browserify: 3.12.0 + domain-browser: 4.23.0 + events: 3.3.0 + filter-obj: 2.0.2 + https-browserify: 1.0.0 + os-browserify: 0.3.0 + path-browserify: 1.0.1 + process: 0.11.10 + punycode: 2.3.1 + querystring-es3: 0.2.1 + readable-stream: 4.5.2 + stream-browserify: 3.0.0 + stream-http: 3.2.0 + string_decoder: 1.3.0 + timers-browserify: 2.0.12 + tty-browserify: 0.0.1 + type-fest: 2.19.0 + url: 0.11.4 + util: 0.12.5 + vm-browserify: 1.1.2 + webpack: 5.93.0(esbuild@0.19.11) + node-postgres@0.6.2: {} node-releases@2.0.18: {} @@ -26856,6 +28806,8 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 + objectorarray@1.0.5: {} + obuf@1.1.2: {} oidc-token-hash@5.0.3: {} @@ -26921,6 +28873,8 @@ snapshots: strip-ansi: 6.0.1 wcwidth: 1.0.1 + os-browserify@0.3.0: {} + os-paths@4.4.0: {} os-tmpdir@1.0.2: {} @@ -27037,6 +28991,8 @@ snapshots: - bluebird - supports-color + pako@1.0.11: {} + param-case@2.1.1: dependencies: no-case: 2.3.2 @@ -27052,6 +29008,15 @@ snapshots: parenthesis@3.1.8: {} + parse-asn1@5.1.7: + dependencies: + asn1.js: 4.10.1 + browserify-aes: 1.2.0 + evp_bytestokey: 1.0.3 + hash-base: 3.0.4 + pbkdf2: 3.1.2 + safe-buffer: 5.2.1 + parse-conflict-json@2.0.2: dependencies: json-parse-even-better-errors: 2.3.1 @@ -27139,6 +29104,16 @@ snapshots: path-type@5.0.0: {} + pathval@2.0.0: {} + + pbkdf2@3.1.2: + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + peberminta@0.9.0: {} pend@1.2.0: {} @@ -27276,6 +29251,16 @@ snapshots: optionalDependencies: fsevents: 2.3.2 + pnp-webpack-plugin@1.7.0(typescript@5.6.3): + dependencies: + ts-pnp: 1.2.0(typescript@5.6.3) + transitivePeerDependencies: + - typescript + + polished@4.3.1: + dependencies: + '@babel/runtime': 7.25.0 + possible-typed-array-names@1.0.0: {} postcss-attribute-case-insensitive@5.0.2(postcss@8.4.40): @@ -27478,7 +29463,18 @@ snapshots: klona: 2.0.6 postcss: 8.4.40 semver: 7.6.3 - webpack: 5.93.0 + webpack: 5.93.0 + + postcss-loader@8.1.1(postcss@8.4.41)(typescript@5.6.3)(webpack@5.93.0(esbuild@0.19.11)): + dependencies: + cosmiconfig: 9.0.0(typescript@5.6.3) + jiti: 1.21.6 + postcss: 8.4.41 + semver: 7.6.3 + optionalDependencies: + webpack: 5.93.0(esbuild@0.19.11) + transitivePeerDependencies: + - typescript postcss-logical@5.0.4(postcss@8.4.40): dependencies: @@ -28149,11 +30145,22 @@ snapshots: pstree.remy@1.1.8: {} + public-encrypt@4.0.3: + dependencies: + bn.js: 4.12.0 + browserify-rsa: 4.1.1 + create-hash: 1.2.0 + parse-asn1: 5.1.7 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + pump@3.0.0: dependencies: end-of-stream: 1.4.4 once: 1.4.0 + punycode@1.4.1: {} + punycode@2.3.1: {} pure-color@1.3.0: {} @@ -28170,18 +30177,31 @@ snapshots: dependencies: side-channel: 1.0.6 + querystring-es3@0.2.1: {} + querystringify@2.2.0: {} queue-microtask@1.2.3: {} + queue@6.0.2: + dependencies: + inherits: 2.0.4 + raf@3.4.1: dependencies: performance-now: 2.1.0 + ramda@0.29.0: {} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 + randomfill@1.0.4: + dependencies: + randombytes: 2.1.0 + safe-buffer: 5.2.1 + range-parser@1.2.1: {} raw-body@2.4.1: @@ -28198,6 +30218,12 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 + raw-loader@4.0.2(webpack@5.93.0(esbuild@0.19.11)): + dependencies: + loader-utils: 2.0.4 + schema-utils: 3.3.0 + webpack: 5.93.0(esbuild@0.19.11) + raw-loader@4.0.2(webpack@5.93.0): dependencies: loader-utils: 2.0.4 @@ -28581,6 +30607,16 @@ snapshots: lodash.flow: 3.5.0 pure-color: 1.3.0 + react-colorful@5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react-confetti@6.1.0(react@18.3.1): + dependencies: + react: 18.3.1 + tween-functions: 1.2.0 + react-dev-utils@12.0.1(eslint@8.57.0)(typescript@5.6.3)(webpack@5.93.0): dependencies: '@babel/code-frame': 7.24.7 @@ -28615,12 +30651,39 @@ snapshots: - supports-color - vue-template-compiler + react-docgen-typescript@2.2.2(typescript@5.6.3): + dependencies: + typescript: 5.6.3 + + react-docgen@7.0.3: + dependencies: + '@babel/core': 7.25.2 + '@babel/traverse': 7.25.2 + '@babel/types': 7.25.2 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.6 + '@types/doctrine': 0.0.9 + '@types/resolve': 1.20.2 + doctrine: 3.0.0 + resolve: 1.22.8 + strip-indent: 4.0.0 + transitivePeerDependencies: + - supports-color + react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 react: 18.3.1 scheduler: 0.23.2 + react-element-to-jsx-string@15.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@base2/pretty-print-object': 1.0.1 + is-plain-object: 5.0.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 18.1.0 + react-email@3.0.1(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/core': 7.24.5 @@ -28658,6 +30721,8 @@ snapshots: react-is@17.0.2: {} + react-is@18.1.0: {} + react-is@18.3.1: {} react-json-view@1.21.3(@types/react@18.3.3)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): @@ -28687,6 +30752,8 @@ snapshots: react-refresh@0.11.0: {} + react-refresh@0.14.2: {} + react-router-dom@6.25.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@remix-run/router': 1.18.0 @@ -28699,10 +30766,10 @@ snapshots: '@remix-run/router': 1.18.0 react: 18.3.1 - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(@types/babel__core@7.20.5)(@types/webpack@5.28.5)(eslint@8.57.0)(react@18.3.1)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3))(type-fest@3.13.1)(typescript@5.6.3): + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(@types/babel__core@7.20.5)(@types/webpack@5.28.5)(eslint@8.57.0)(react@18.3.1)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.6.3))(type-fest@3.13.1)(typescript@5.6.3)(webpack-hot-middleware@2.26.1): dependencies: '@babel/core': 7.25.2 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.15(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@3.13.1)(webpack-dev-server@4.15.2(webpack@5.93.0))(webpack@5.93.0) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.15(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@3.13.1)(webpack-dev-server@4.15.2(webpack@5.93.0))(webpack-hot-middleware@2.26.1)(webpack@5.93.0) '@svgr/webpack': 5.5.0 babel-jest: 27.5.1(@babel/core@7.25.2) babel-loader: 8.3.0(@babel/core@7.25.2)(webpack@5.93.0) @@ -28919,6 +30986,14 @@ snapshots: dependencies: picomatch: 2.3.1 + recast@0.23.9: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.6.3 + recharts-scale@0.4.5: dependencies: decimal.js-light: 2.5.1 @@ -29007,6 +31082,23 @@ snapshots: dependencies: jsesc: 0.5.0 + rehype-external-links@3.0.0: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.2.0 + hast-util-is-element: 3.0.0 + is-absolute-url: 4.0.1 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.0.0 + + rehype-slug@6.0.0: + dependencies: + '@types/hast': 3.0.4 + github-slugger: 2.0.0 + hast-util-heading-rank: 3.0.0 + hast-util-to-string: 3.0.1 + unist-util-visit: 5.0.0 + relateurl@0.2.7: {} remove-trailing-separator@1.1.0: {} @@ -29025,6 +31117,8 @@ snapshots: require-from-string@2.0.2: {} + requireindex@1.2.0: {} + requires-port@1.0.0: {} resend@4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): @@ -29056,6 +31150,14 @@ snapshots: postcss: 7.0.39 source-map: 0.6.1 + resolve-url-loader@5.0.0: + dependencies: + adjust-sourcemap-loader: 4.0.0 + convert-source-map: 1.9.0 + loader-utils: 2.0.4 + postcss: 8.4.41 + source-map: 0.6.1 + resolve.exports@1.1.1: {} resolve.exports@2.0.2: {} @@ -29112,6 +31214,11 @@ snapshots: dependencies: glob: 10.4.5 + ripemd160@2.0.2: + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + rollup-plugin-babel@4.4.0(@babel/core@7.25.2)(rollup@1.32.1): dependencies: '@babel/core': 7.25.2 @@ -29282,6 +31389,11 @@ snapshots: neo-async: 2.6.2 webpack: 5.93.0 + sass-loader@13.3.3(webpack@5.93.0(esbuild@0.19.11)): + dependencies: + neo-async: 2.6.2 + webpack: 5.93.0(esbuild@0.19.11) + sax@1.2.4: {} sax@1.4.1: @@ -29429,12 +31541,44 @@ snapshots: setprototypeof@1.2.0: {} + sha.js@2.4.11: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + shallow-clone@3.0.1: dependencies: kind-of: 6.0.3 shallowequal@1.1.0: {} + sharp@0.33.5: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.6.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + optional: true + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -29614,6 +31758,8 @@ snapshots: sourcemap-codec@1.4.8: {} + space-separated-tokens@2.0.2: {} + sparse-bitfield@3.0.3: dependencies: memory-pager: 1.5.0 @@ -29737,12 +31883,32 @@ snapshots: stopwatch-node@1.1.0: {} + storybook@8.3.5: + dependencies: + '@storybook/core': 8.3.5 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + stream-browserify@3.0.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-chain@2.2.5: {} stream-events@1.0.5: dependencies: stubs: 3.0.0 + stream-http@3.2.0: + dependencies: + builtin-status-codes: 3.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + xtend: 4.0.2 + stream-json@1.8.0: dependencies: stream-chain: 2.2.5 @@ -29896,6 +32062,10 @@ snapshots: dependencies: min-indent: 1.0.1 + strip-indent@4.0.0: + dependencies: + min-indent: 1.0.1 + strip-json-comments@2.0.1: {} strip-json-comments@3.1.1: {} @@ -29911,6 +32081,10 @@ snapshots: style-inject@0.3.0: {} + style-loader@3.3.4(webpack@5.93.0(esbuild@0.19.11)): + dependencies: + webpack: 5.93.0(esbuild@0.19.11) + style-loader@3.3.4(webpack@5.93.0): dependencies: webpack: 5.93.0 @@ -29929,6 +32103,13 @@ snapshots: optionalDependencies: '@babel/core': 7.25.2 + styled-jsx@5.1.6(@babel/core@7.25.2)(react@18.3.1): + dependencies: + client-only: 0.0.1 + react: 18.3.1 + optionalDependencies: + '@babel/core': 7.25.2 + stylehacks@4.0.3: dependencies: browserslist: 4.23.2 @@ -30108,6 +32289,10 @@ snapshots: - encoding - supports-color + telejson@7.2.0: + dependencies: + memoizerific: 1.11.3 + temp-dir@2.0.0: {} tempy@0.6.0: @@ -30122,6 +32307,17 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 + terser-webpack-plugin@5.3.10(esbuild@0.19.11)(webpack@5.93.0(esbuild@0.19.11)): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.31.3 + webpack: 5.93.0(esbuild@0.19.11) + optionalDependencies: + esbuild: 0.19.11 + terser-webpack-plugin@5.3.10(webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0))): dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -30208,6 +32404,10 @@ snapshots: dependencies: convert-hrtime: 3.0.0 + timers-browserify@2.0.12: + dependencies: + setimmediate: 1.0.5 + timezones-list@3.0.3: {} timsort@0.3.0: {} @@ -30221,6 +32421,10 @@ snapshots: tiny-lru@11.2.6: {} + tinyrainbow@1.2.0: {} + + tinyspy@3.0.2: {} + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 @@ -30274,6 +32478,8 @@ snapshots: dependencies: typescript: 5.6.3 + ts-dedent@2.2.0: {} + ts-easing@0.2.0: {} ts-interface-checker@0.1.13: {} @@ -30480,10 +32686,20 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + ts-pnp@1.2.0(typescript@5.6.3): + optionalDependencies: + typescript: 5.6.3 + ts-toolbelt@6.15.5: {} ts-toolbelt@9.6.0: {} + tsconfig-paths-webpack-plugin@4.1.0: + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.17.1 + tsconfig-paths: 4.2.0 + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 @@ -30491,6 +32707,12 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 + tsconfig-paths@4.2.0: + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + tsconfig@7.0.0: dependencies: '@types/strip-bom': 3.0.0 @@ -30509,6 +32731,8 @@ snapshots: tslib: 1.14.1 typescript: 5.6.3 + tty-browserify@0.0.1: {} + tuf-js@1.1.7: dependencies: '@tufjs/models': 1.0.4 @@ -30576,6 +32800,8 @@ snapshots: turbo-windows-64: 1.2.16 turbo-windows-arm64: 1.2.16 + tween-functions@1.2.0: {} + tweetnacl@0.14.5: {} type-check@0.3.2: @@ -30670,6 +32896,8 @@ snapshots: undici-types@5.26.5: {} + undici-types@6.19.8: {} + undici@5.28.4: dependencies: '@fastify/busboy': 2.1.1 @@ -30723,6 +32951,21 @@ snapshots: dependencies: crypto-random-string: 2.0.0 + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + universal-user-agent@6.0.1: {} universalify@0.1.2: {} @@ -30733,6 +32976,13 @@ snapshots: unpipe@1.0.0: {} + unplugin@1.14.1(webpack-sources@3.2.3): + dependencies: + acorn: 8.12.1 + webpack-virtual-modules: 0.6.2 + optionalDependencies: + webpack-sources: 3.2.3 + unquote@1.1.1: {} untildify@4.0.0: {} @@ -30764,6 +33014,11 @@ snapshots: url-template@2.0.8: {} + url@0.11.4: + dependencies: + punycode: 1.4.1 + qs: 6.13.0 + use-composed-ref@1.3.0(react@18.3.1): dependencies: react: 18.3.1 @@ -30794,6 +33049,14 @@ snapshots: has-symbols: 1.0.3 object.getownpropertydescriptors: 2.1.8 + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.13 + which-typed-array: 1.1.15 + utila@0.4.0: {} utils-merge@1.0.1: {} @@ -30914,6 +33177,8 @@ snapshots: vlq@0.2.3: {} + vm-browserify@1.1.2: {} + w3c-hr-time@1.0.2: dependencies: browser-process-hrtime: 1.0.0 @@ -30987,6 +33252,16 @@ snapshots: optionalDependencies: '@webpack-cli/generators': 3.0.7(encoding@0.1.13)(mem-fs@2.3.0)(prettier@2.8.8)(webpack-cli@5.1.4)(webpack@5.93.0) + webpack-dev-middleware@5.3.4(webpack@5.93.0(esbuild@0.19.11)): + dependencies: + colorette: 2.0.20 + memfs: 3.5.3 + mime-types: 2.1.35 + range-parser: 1.2.1 + schema-utils: 4.2.0 + webpack: 5.93.0(esbuild@0.19.11) + optional: true + webpack-dev-middleware@5.3.4(webpack@5.93.0): dependencies: colorette: 2.0.20 @@ -30996,6 +33271,57 @@ snapshots: schema-utils: 4.2.0 webpack: 5.93.0 + webpack-dev-middleware@6.1.3(webpack@5.93.0(esbuild@0.19.11)): + dependencies: + colorette: 2.0.20 + memfs: 3.5.3 + mime-types: 2.1.35 + range-parser: 1.2.1 + schema-utils: 4.2.0 + optionalDependencies: + webpack: 5.93.0(esbuild@0.19.11) + + webpack-dev-server@4.15.2(webpack@5.93.0(esbuild@0.19.11)): + dependencies: + '@types/bonjour': 3.5.13 + '@types/connect-history-api-fallback': 1.5.4 + '@types/express': 4.17.21 + '@types/serve-index': 1.9.4 + '@types/serve-static': 1.15.7 + '@types/sockjs': 0.3.36 + '@types/ws': 8.5.12 + ansi-html-community: 0.0.8 + bonjour-service: 1.2.1 + chokidar: 3.6.0 + colorette: 2.0.20 + compression: 1.7.4 + connect-history-api-fallback: 2.0.0 + default-gateway: 6.0.3 + express: 4.21.1 + graceful-fs: 4.2.11 + html-entities: 2.5.2 + http-proxy-middleware: 2.0.6(@types/express@4.17.21) + ipaddr.js: 2.2.0 + launch-editor: 2.8.0 + open: 8.4.2 + p-retry: 4.6.2 + rimraf: 3.0.2 + schema-utils: 4.2.0 + selfsigned: 2.4.1 + serve-index: 1.9.1 + sockjs: 0.3.24 + spdy: 4.0.2 + webpack-dev-middleware: 5.3.4(webpack@5.93.0(esbuild@0.19.11)) + ws: 8.18.0 + optionalDependencies: + webpack: 5.93.0(esbuild@0.19.11) + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + optional: true + webpack-dev-server@4.15.2(webpack@5.93.0): dependencies: '@types/bonjour': 3.5.13 @@ -31036,6 +33362,12 @@ snapshots: - supports-color - utf-8-validate + webpack-hot-middleware@2.26.1: + dependencies: + ansi-html-community: 0.0.8 + html-entities: 2.5.2 + strip-ansi: 6.0.1 + webpack-manifest-plugin@4.1.1(webpack@5.93.0): dependencies: tapable: 2.2.1 @@ -31060,6 +33392,8 @@ snapshots: webpack-sources@3.2.3: {} + webpack-virtual-modules@0.6.2: {} + webpack@5.93.0: dependencies: '@types/eslint-scope': 3.7.7 @@ -31091,6 +33425,37 @@ snapshots: - esbuild - uglify-js + webpack@5.93.0(esbuild@0.19.11): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.12.1 + acorn-import-attributes: 1.9.5(acorn@8.12.1) + browserslist: 4.23.2 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.1 + es-module-lexer: 1.5.4 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(esbuild@0.19.11)(webpack@5.93.0(esbuild@0.19.11)) + watchpack: 2.4.1 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + webpack@5.93.0(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack@5.93.0)): dependencies: '@types/eslint-scope': 3.7.7 diff --git a/services/profiles/src/builder.ts b/services/profiles/src/builder.ts index 864215a4d..3df7d3446 100644 --- a/services/profiles/src/builder.ts +++ b/services/profiles/src/builder.ts @@ -4,12 +4,14 @@ import { mongodb, ProfilesConfig, pbEnsureMongoCollection, - profilePartitionIdColumn, - profilePartitionsCount, + userIdHashColumn, + int32Hash, + userIdHash32MaxValue, EventsStore, bulkerDestination, FunctionContext, FunctionChainContext, + mergeUserTraits, } from "@jitsu/core-functions"; import { MongoClient, ObjectId } from "mongodb"; import { db, ProfileBuilderState } from "./lib/db"; @@ -20,7 +22,6 @@ import { functionsStore } from "./lib/repositories"; import { buildFunctionChain, FuncChain, runChain } from "./lib/functions-chain"; import { FullContext } from "@jitsu/protocols/functions"; import { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; -import { ProfileUser } from "./lib/profiles-udf-wrapper"; const bulkerBase = requireDefined(process.env.BULKER_URL, "env BULKER_URL is not defined"); const bulkerAuthKey = requireDefined(process.env.BULKER_AUTH_KEY, "env BULKER_AUTH_KEY is not defined"); @@ -30,7 +31,7 @@ const fetchTimeoutMs = parseNumber(process.env.FETCH_TIMEOUT_MS, 2000); const instanceIndex = process.env.INSTANCE_INDEX ? parseInt(process.env.INSTANCE_INDEX, 10) : 0; const totalInstances = process.env.INSTANCES_COUNT ? parseInt(process.env.INSTANCES_COUNT, 10) : 1; -const partitionsRange = selectPartitions(profilePartitionsCount, totalInstances, instanceIndex); +const partitionsRange = selectRange(userIdHash32MaxValue, totalInstances, instanceIndex); //cache function chains for 1m const funcsChainTTL = 60; @@ -91,10 +92,12 @@ export async function profileBuilder( funcsChainCache.set(cacheKey, funcChain); } - const config = ProfilesConfig.parse(profileBuilder.intermediateStorageCredentials || {}); - - config.eventsDatabase = `profiles`; - config.eventsCollectionName = `profiles-raw-${workspaceId}-${profileBuilder.id}`; + const config = ProfilesConfig.parse({ + ...profileBuilder.intermediateStorageCredentials, + profileWindowDays: profileBuilder.connectionOptions.profileWindow, + eventsDatabase: `profiles`, + eventsCollectionName: `profiles-raw-${workspaceId}-${profileBuilder.id}`, + }); const mongoSingleton = config.mongoUrl ? getSingleton( @@ -118,7 +121,7 @@ export async function profileBuilder( const mongo = await mongoSingleton.waitInit(); await pbEnsureMongoCollection(mongo, config.eventsDatabase, config.eventsCollectionName, config.profileWindowDays, [ - profilePartitionIdColumn, + userIdHashColumn, "userId", ]); @@ -150,7 +153,6 @@ export async function profileBuilder( state.processedUsers = 0; state.errorUsers = 0; state.speed = 0; - state.lastTimestamp = dateUpperBound; for (let i = 0; i < users.length; i++) { if (i % 1000) { @@ -164,6 +166,7 @@ export async function profileBuilder( ); } await queue.onIdle(); + state.lastTimestamp = dateUpperBound; state.speed = users.length / ((Date.now() - started) / 1000); await db.pgHelper().updateProfileBuilderState(state); } else { @@ -207,30 +210,14 @@ async function processUser( try { const events = await getUserEvents(mongo, config, userId, endTimestamp); const eventsArray = await events.toArray(); - const user = { traits: {}, userId } as ProfileUser; - eventsArray - .filter(e => e.type === "identify") - .forEach(e => { - if (e.anonymousId) { - user.anonymousId = e.anonymousId; - } - if (e.traits) { - Object.assign(user.traits, e.traits); - } - }); + const user = mergeUserTraits(eventsArray as unknown as AnalyticsServerEvent[], userId); const result = await runChain(funcChain, eventsArray, user); if (result) { - const profile = { - user_id: userId, - traits: user.traits, - custom_properties: result.properties, - updated_at: new Date(), - }; - await sendToBulker(profileBuilder, profile, funcChain.context); + await sendToBulker(profileBuilder, result, funcChain.context); funcChain.context.log.info( funcCtx, `User ${userId} processed in ${ms.elapsedMs()}ms (events: ${eventsArray.length}). Result: ${JSON.stringify( - profile + result )}` ); } else { @@ -286,7 +273,10 @@ async function sendToBulker(profileBuilder: ProfileBuilder, profile: any, contex workspace: { id: profileBuilder.workspaceId }, }; await bulkerDestination.default( - { [bulkerDestination.TableNameParameter]: "profiles", ...profile } as unknown as AnalyticsServerEvent, + { + [bulkerDestination.TableNameParameter]: profileBuilder.connectionOptions.tableName || "profiles", + ...profile, + } as unknown as AnalyticsServerEvent, ctx ); } @@ -296,7 +286,7 @@ async function getUserEvents(mongo: MongoClient, config: ProfilesConfig, userId: .db(config.eventsDatabase) .collection(config.eventsCollectionName) .find({ - [profilePartitionIdColumn]: { $gte: partitionsRange[0], $lte: partitionsRange[1] }, + [userIdHashColumn]: int32Hash(userId), userId: userId, _id: { $lt: new ObjectId(Math.floor(endTimestamp.getTime() / 1000).toString(16) + "0000000000000000") }, }); @@ -328,7 +318,7 @@ async function getUsersHavingEventsSince( { $match: { ...dateFilter, - [profilePartitionIdColumn]: { $gte: partitionsRange[0], $lte: partitionsRange[1] }, + [userIdHashColumn]: { $gte: partitionsRange[0], $lte: partitionsRange[1] }, }, }, { @@ -341,25 +331,25 @@ async function getUsersHavingEventsSince( .toArray(); } -function selectPartitions(totalPartitions: number, totalInstances: number, instanceIndex: number): [number, number] { - const partitionsPerInstance = Math.floor(totalPartitions / totalInstances); - const remainderPartitions = totalPartitions % totalInstances; +function selectRange(rangeWidth: number, totalInstances: number, instanceIndex: number): [number, number] { + const rangePerInstance = Math.floor(rangeWidth / totalInstances); + const remainderRange = rangeWidth % totalInstances; const ranges: Array<{ instance: number; partitionRange: [number, number] }> = []; - let startPartition = 0; + let rangeStart = 0; for (let i = 0; i < totalInstances; i++) { - // Each instance gets at least `partitionsPerInstance` partitions + // Each instance gets at least `rangePerInstance` partitions // If there are remaining partitions, distribute one extra to some instances - const additionalPartition = i < remainderPartitions ? 1 : 0; - const endPartition = startPartition + partitionsPerInstance + additionalPartition - 1; + const additionalRange = i < remainderRange ? 1 : 0; + const rangeEnd = rangeStart + rangePerInstance + additionalRange - 1; ranges.push({ instance: i, - partitionRange: [startPartition, endPartition], + partitionRange: [rangeStart, rangeEnd], }); - startPartition = endPartition + 1; + rangeStart = rangeEnd + 1; } return ranges[instanceIndex].partitionRange; diff --git a/services/profiles/src/lib/functions-chain.ts b/services/profiles/src/lib/functions-chain.ts index 4042e0914..ac9f0a96a 100644 --- a/services/profiles/src/lib/functions-chain.ts +++ b/services/profiles/src/lib/functions-chain.ts @@ -9,13 +9,16 @@ import { makeLog, MetricsMeta, mongodb, + Profile, ProfileBuilder, + ProfileFunctionWrapper, + ProfileUDFWrapper, + ProfileUser, } from "@jitsu/core-functions"; import { getLog, newError } from "juava"; import NodeCache from "node-cache"; import isEqual from "lodash/isEqual"; -import { ProfileFunctionWrapper, ProfileUser, UDFWrapper } from "./profiles-udf-wrapper"; import { ProfileResult } from "@jitsu/protocols/profile"; export type Func = { @@ -67,7 +70,14 @@ export function buildFunctionChain( log: makeLog(profileBuilder.id, eventsLogger, true), store, }; - + const funcCtx = { + function: { + id: "profile-builder", + type: "udf", + debugTill: profileBuilder.debugTill ? new Date(profileBuilder.debugTill) : undefined, + }, + props: profileBuilder.connectionOptions?.variables || {}, + }; const udfFuncs: FunctionConfig[] = (profileBuilder.functions || []).map(f => { const functionId = f.functionId; const userFunctionObj = funcStore.getObject(functionId); @@ -86,17 +96,10 @@ export function buildFunctionChain( cached = udfCache.get(pbLongId); if (!cached || !isEqual(cached?.hash, hash)) { log.atInfo().log(`UDF for connection ${pbLongId} changed (hash ${hash} != ${cached?.hash}). Reloading`); - const wrapper = UDFWrapper( + const wrapper = ProfileUDFWrapper( pbLongId, chainCtx, - { - function: { - id: "profile-builder", - type: "udf", - debugTill: profileBuilder.debugTill ? new Date(profileBuilder.debugTill) : undefined, - }, - props: {}, - }, + funcCtx, udfFuncs.map(f => ({ id: f.id, name: f.name, code: f.code })) ); const oldWrapper = cached?.wrapper; @@ -111,15 +114,15 @@ export function buildFunctionChain( udfCache.ttl(pbLongId, udfTTL); const udfPipelineFunc = (chainCtx: FunctionChainContext, funcCtx: FunctionContext): ProfileFunctionWrapper => { - return async (ctx, events, user) => { + return async (events, user, ctx) => { try { - return await cached.wrapper.userFunction(ctx, events, user); + return await cached.wrapper.userFunction(events, user, ctx); } catch (e: any) { if ((e?.message ?? "").includes("Isolate is disposed")) { // due to async nature other 'thread' could already replace this isolate. So check it if (cached.wrapper.isDisposed()) { log.atError().log(`UDF for pb:${pbLongId} VM was disposed. Reloading`); - const wrapper = UDFWrapper( + const wrapper = ProfileUDFWrapper( pbLongId, chainCtx, funcCtx, @@ -127,10 +130,10 @@ export function buildFunctionChain( ); cached = { wrapper, hash }; udfCache.set(pbLongId, cached); - return wrapper.userFunction(ctx, events, user); + return wrapper.userFunction(events, user, ctx); } else { // we have alive isolate now. try again - return await cached.wrapper.userFunction(ctx, events, user); + return await cached.wrapper.userFunction(events, user, ctx); } } else { throw e; @@ -139,15 +142,6 @@ export function buildFunctionChain( }; }; - const funcCtx = { - function: { - id: "profile-builder", - type: "udf", - debugTill: profileBuilder.debugTill ? new Date(profileBuilder.debugTill) : undefined, - }, - props: {}, - }; - const funcs: Func[] = [ { id: "udf.PIPELINE", @@ -162,13 +156,19 @@ export function buildFunctionChain( }; } -export async function runChain(chain: FuncChain, events: any[], user: ProfileUser): Promise { +export async function runChain(chain: FuncChain, events: any[], user: ProfileUser): Promise { const f = chain.functions[0]; let result: ProfileResult | undefined = undefined; try { - result = await f.exec(f.context, events, user); + result = await f.exec(events, user, f.context); + return { + user_id: user.userId, + traits: user.traits, + custom_properties: result?.properties || {}, + updated_at: new Date(), + }; } catch (err: any) { throw newError(`Function execution failed`, err); } - return result; + return undefined; } diff --git a/services/rotor/src/http/profiles-udf.ts b/services/rotor/src/http/profiles-udf.ts new file mode 100644 index 000000000..df550f289 --- /dev/null +++ b/services/rotor/src/http/profiles-udf.ts @@ -0,0 +1,19 @@ +import { mongodb, createMongoStore, ProfileUDFTestRequest, ProfileUDFTestRun } from "@jitsu/core-functions"; +import { getLog } from "juava"; + +const log = getLog("profile-udf-run"); + +export const ProfileUDFRunHandler = async (req, res) => { + const body = req.body as ProfileUDFTestRequest; + log.atInfo().log(`Running function: ${body?.functionId} workspace: ${body?.workspaceId}`, JSON.stringify(body)); + body.store = createMongoStore(body?.workspaceId, mongodb(), true, false); + const result = await ProfileUDFTestRun(body); + if (result.error) { + log + .atError() + .log( + `Error running function: ${body?.functionId} workspace: ${body?.workspaceId}\n${result.error.name}: ${result.error.message}` + ); + } + res.json(result); +}; diff --git a/services/rotor/src/http/udf.ts b/services/rotor/src/http/udf.ts index 916e4d73c..ce2ab6696 100644 --- a/services/rotor/src/http/udf.ts +++ b/services/rotor/src/http/udf.ts @@ -1,11 +1,4 @@ -import { - UDFTestRun, - UDFTestRequest, - mongodb, - defaultTTL, - createMongoStore, - createTtlStore, -} from "@jitsu/core-functions"; +import { UDFTestRun, UDFTestRequest, mongodb, createMongoStore } from "@jitsu/core-functions"; import { getLog } from "juava"; const log = getLog("udf_run"); diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index 81e7b76db..4db4f11bc 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -16,6 +16,7 @@ import { Redis } from "ioredis"; import { createRedis } from "./lib/redis"; import * as util from "util"; import { getHeapSnapshot } from "node:v8"; +import { ProfileUDFRunHandler } from "./http/profiles-udf"; const log = getLog("rotor"); disableService("prisma"); @@ -207,6 +208,7 @@ function initHTTP(rotorContext: Omit { res.setHeader("Content-Type", "text/plain"); diff --git a/services/rotor/src/lib/message-handler.ts b/services/rotor/src/lib/message-handler.ts index 4f5603a22..c772a7491 100644 --- a/services/rotor/src/lib/message-handler.ts +++ b/services/rotor/src/lib/message-handler.ts @@ -163,6 +163,7 @@ async function profilesHandler( ...ctx, props: { ...builder.intermediateStorageCredentials, + profileWindowDays: builder.connectionOptions.profileWindow, eventsCollectionName: `profiles-raw-${wp.id}-${builder.id}`, } as ProfilesConfig, store: createDummyStore(), diff --git a/turbo.json b/turbo.json index 01815bc1b..57c710b7f 100644 --- a/turbo.json +++ b/turbo.json @@ -8,6 +8,10 @@ "dependsOn": ["^console:start"], "cache": false }, + "console:storybook": { + "dependsOn": ["^console:storybook"], + "cache": false + }, "ee-api:dev": { "dependsOn": ["^ee-api:dev"], "cache": false diff --git a/types/protocols/functions.d.ts b/types/protocols/functions.d.ts index 4aac12de9..e9e0eade4 100644 --- a/types/protocols/functions.d.ts +++ b/types/protocols/functions.d.ts @@ -66,11 +66,12 @@ export type FunctionLogger = { debug: (message: string, ...args: any[]) => void | Promise; error: (message: string, ...args: any[]) => void | Promise; }; -export type FunctionContext = { +export type FunctionContext

    = { log: FunctionLogger; fetch: FetchType; store: TTLStore; metrics?: Metrics; + props: P; }; export type PrivacyOpts = { @@ -165,14 +166,10 @@ export type EventContext = { retries?: number; }; -export type FunctionConfigContext

    = { - props: P; -}; - /** * Parameters for a function */ -export type FullContext

    = EventContext & FunctionContext & FunctionConfigContext

    ; +export type FullContext

    = EventContext & FunctionContext

    ; //equivalent to returning [] from a function export type FunctionCommand = "drop"; diff --git a/types/protocols/profile.d.ts b/types/protocols/profile.d.ts index c6cab8a47..11c3957ce 100644 --- a/types/protocols/profile.d.ts +++ b/types/protocols/profile.d.ts @@ -5,12 +5,12 @@ export type ProfileResult = { properties: Record; }; -export type ProfileFunction = (params: { - context: FunctionContext; - events: Iterable; +export type ProfileFunction = ( + events: Iterable, user: { id?: string; anonymousId?: string; traits: Record; - }; -}) => Promise; + }, + context: FunctionContext +) => Promise; diff --git a/webapps/console/.gitignore b/webapps/console/.gitignore index 1bca13714..1eee9e128 100644 --- a/webapps/console/.gitignore +++ b/webapps/console/.gitignore @@ -3,3 +3,5 @@ # Sentry Auth Token .sentryclirc + +*storybook.log \ No newline at end of file diff --git a/webapps/console/.storybook/main.ts b/webapps/console/.storybook/main.ts new file mode 100644 index 000000000..21818d3dd --- /dev/null +++ b/webapps/console/.storybook/main.ts @@ -0,0 +1,27 @@ +import type { StorybookConfig } from "@storybook/nextjs"; + +import { join, dirname } from "path"; + +/** + * This function is used to resolve the absolute path of a package. + * It is needed in projects that use Yarn PnP or are set up within a monorepo. + */ +function getAbsolutePath(value: string): any { + return dirname(require.resolve(join(value, "package.json"))); +} +const config: StorybookConfig = { + stories: ["../components/**/*.stories.@(js|jsx|mjs|ts|tsx)"], + addons: [ + getAbsolutePath("@storybook/addon-onboarding"), + getAbsolutePath("@storybook/addon-links"), + getAbsolutePath("@storybook/addon-essentials"), + getAbsolutePath("@chromatic-com/storybook"), + getAbsolutePath("@storybook/addon-interactions"), + ], + framework: { + name: getAbsolutePath("@storybook/nextjs"), + options: {}, + }, + staticDirs: ["../public"], +}; +export default config; diff --git a/webapps/console/.storybook/preview.ts b/webapps/console/.storybook/preview.ts new file mode 100644 index 000000000..183008745 --- /dev/null +++ b/webapps/console/.storybook/preview.ts @@ -0,0 +1,16 @@ +import "../styles/globals.css"; + +import type { Preview } from "@storybook/react"; + +const preview: Preview = { + parameters: { + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/i, + }, + }, + }, +}; + +export default preview; diff --git a/webapps/console/components/CodeEditor/CodeEditor.tsx b/webapps/console/components/CodeEditor/CodeEditor.tsx index 6e4182382..2e4a070a2 100644 --- a/webapps/console/components/CodeEditor/CodeEditor.tsx +++ b/webapps/console/components/CodeEditor/CodeEditor.tsx @@ -54,7 +54,7 @@ export const CodeEditor: React.FC = ({ }); setMounted(true); }, - [foldLevel, handleChangePosition, value] + [extraSuggestions, foldLevel, handleChangePosition, value] ); useEffect(() => { @@ -89,6 +89,9 @@ export const CodeEditor: React.FC = ({ //scroll to the end of the line editor.revealPosition({ ...position, column: position.column + positionShift + 100 }); editor.focus(); + if (foldLevel) { + editor.getAction(`editor.foldLevel${foldLevel}`)?.run(); + } } }, [value]); diff --git a/webapps/console/components/ConfigObjectEditor/Editors.tsx b/webapps/console/components/ConfigObjectEditor/Editors.tsx index 92589e334..cb275c065 100644 --- a/webapps/console/components/ConfigObjectEditor/Editors.tsx +++ b/webapps/console/components/ConfigObjectEditor/Editors.tsx @@ -64,11 +64,13 @@ export const TextEditor: React.FC<{ rows?: number } & CustomWidgetProps> } }; -export const NumberEditor: React.FC> = props => { +export const NumberEditor: React.FC & { max?: number; min?: number }> = props => { return ( { const v = parseInt(e.target.value); if (isNaN(v)) { diff --git a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx index 08ab11eb6..7c0280b3a 100644 --- a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx +++ b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx @@ -6,10 +6,7 @@ import { SomeZodObject, z } from "zod"; import { ConfigurationObjectLinkDbModel } from "../../prisma/schema"; import { useRouter } from "next/router"; import { assertTrue, getLog, requireDefined } from "juava"; -import { Disable } from "../Disable/Disable"; -import { Button, Input, InputNumber, Radio, Select, Switch, Tooltip } from "antd"; -import { WLink } from "../Workspace/WLink"; -import { FaExternalLinkAlt } from "react-icons/fa"; +import { Button, Input, InputNumber, Radio, Switch, Tooltip } from "antd"; import { BaseBulkerConnectionOptions, getCoreDestinationType } from "../../lib/schema/destinations"; import { confirmOp, feedbackError, feedbackSuccess } from "../../lib/ui"; import FieldListEditorLayout, { EditorItem } from "../FieldListEditorLayout/FieldListEditorLayout"; @@ -17,84 +14,17 @@ import { DataLayoutType } from "@jitsu/protocols/analytics"; import { ChevronLeft } from "lucide-react"; import styles from "./ConnectionEditorPage.module.css"; import { JitsuButton } from "../JitsuButton/JitsuButton"; -import { StreamTitle } from "../../pages/[workspaceId]/streams"; -import { DestinationTitle } from "../../pages/[workspaceId]/destinations"; import { Htmlizer } from "../Htmlizer/Htmlizer"; import { FunctionsSelector } from "../FunctionsSelector/FunctionsSelector"; import { Expandable } from "../Expandable/Expandable"; import { useStoreReload } from "../../lib/store"; +import { DestinationSelector } from "../Selectors/DestinationSelector"; +import { SourceSelector } from "../Selectors/SourceSelector"; const log = getLog("ConnectionEditorPage"); -type SelectorProps = { - enabled: boolean; - selected: string; - items: T[]; - onSelect: (value: string) => void; -}; - type ConnectionOptionsType = Partial & { [key: string]: any }; -function DestinationSelector(props: SelectorProps) { - return ( -

    - - - - {!props.enabled && ( -
    - - - -
    - )} -
    - ); -} - -function SourceSelector(props: SelectorProps) { - return ( -
    - - - - {!props.enabled && ( -
    - - - -
    - )} -
    - ); -} - type EditorProps = { value?: T; disabled?: boolean; @@ -341,7 +271,16 @@ function ConnectionEditor({ { name: existingLink ? "Select Source" : "Source", documentation: "Select destination to connect", - component: , + component: ( + + ), }, { name: existingLink ? "Select Destination" : "Destination", @@ -353,6 +292,8 @@ function ConnectionEditor({ items={destinations} selected={dstId} enabled={!existingLink} + disabledReason={"Create a new connection if you want to change the source"} + showLink={true} onSelect={id => { setDstId(id); updateConnectionOptions(id); diff --git a/webapps/console/components/FieldListEditorLayout/FieldListEditorLayout.module.css b/webapps/console/components/FieldListEditorLayout/FieldListEditorLayout.module.css index 809518002..8a090963d 100644 --- a/webapps/console/components/FieldListEditorLayout/FieldListEditorLayout.module.css +++ b/webapps/console/components/FieldListEditorLayout/FieldListEditorLayout.module.css @@ -1,9 +1,20 @@ +.bordered { +} + +.bordered .editorItemTable { + @apply border border-textDisabled rounded-lg overflow-hidden; +} + +.bordered .editorItemRow { + @apply border-t border-textDisabled border-collapse; +} + .editorItemTable { - @apply border-textLight border border-textDisabled rounded-lg overflow-hidden; + @apply overflow-hidden; } .editorItemRow { - @apply border-t border-textDisabled border-collapse flex; + @apply flex; } .editorItemRow .name { diff --git a/webapps/console/components/FieldListEditorLayout/FieldListEditorLayout.tsx b/webapps/console/components/FieldListEditorLayout/FieldListEditorLayout.tsx index 81832c2bd..a0aadcf5c 100644 --- a/webapps/console/components/FieldListEditorLayout/FieldListEditorLayout.tsx +++ b/webapps/console/components/FieldListEditorLayout/FieldListEditorLayout.tsx @@ -17,6 +17,7 @@ export type EditorItem = { export type FieldListEditorLayoutProps = { items: (EditorItem | undefined | false)[]; + noBorder?: boolean; groups?: Record< string, | { @@ -33,11 +34,15 @@ export type FieldListEditorLayoutProps = { const FieldListEditorLayout: React.FC = props => { const items = props.items.filter(item => !!item) as EditorItem[]; const groups = new Set(items.map(i => i.group)); - if (groups.size === 0) { - return ; + if (groups.size === 0 || (groups.size === 1 && groups.has(undefined))) { + return ( +
    + +
    + ); } else { return ( -
    +
    {[...groups].map(group => { const grObj = props?.groups?.[group || ""] || {}; const expandable = grObj.expandable; diff --git a/webapps/console/components/FunctionsDebugger/CodeViewer.tsx b/webapps/console/components/FunctionsDebugger/CodeViewer.tsx new file mode 100644 index 000000000..fe9e18493 --- /dev/null +++ b/webapps/console/components/FunctionsDebugger/CodeViewer.tsx @@ -0,0 +1,22 @@ +import React, { useState } from "react"; +import { CodeBlockLight } from "../CodeBlock/CodeBlockLight"; + +export const CodeViewer: React.FC<{ code: string }> = ({ code }) => { + const [showCode, setShowCode] = useState(false); + + return ( +
    + + {showCode && ( + + {code} + + )} +
    + ); +}; diff --git a/webapps/console/components/FunctionsDebugger/FunctionLogs.tsx b/webapps/console/components/FunctionsDebugger/FunctionLogs.tsx new file mode 100644 index 000000000..aba1b9fe3 --- /dev/null +++ b/webapps/console/components/FunctionsDebugger/FunctionLogs.tsx @@ -0,0 +1,49 @@ +import { logType } from "@jitsu/core-functions"; +import React from "react"; +import dayjs from "dayjs"; + +const localDate = (date: string | Date) => dayjs(date).format("YYYY-MM-DD HH:mm:ss"); + +export const FunctionLogs: React.FC<{ logs: logType[]; className?: string; showDate?: boolean }> = ({ + logs, + className, + showDate, +}) => { + return ( +
    + {logs.map((log, index) => { + const colors = (() => { + switch (log.level) { + case "error": + return { text: "#A4000F", bg: "#FDF3F5", border: "#F8D6DB" }; + case "debug": + return { text: "#646464", bg: "#FBF3F5", border: "#FBF3F5" }; + case "warn": + return { text: "#705100", bg: "#FFFBD6", border: "#F4E89A" }; + default: + return { text: "black", bg: "white", border: "#eaeaea" }; + } + })(); + return ( +
    + {showDate &&
    {localDate(log.timestamp)}
    } +
    + {log.level.toUpperCase()} +
    +
    + {log.message} +
    +
    + ); + })} +
    + ); +}; diff --git a/webapps/console/components/FunctionsDebugger/FunctionResult.tsx b/webapps/console/components/FunctionsDebugger/FunctionResult.tsx new file mode 100644 index 000000000..c27ac57f7 --- /dev/null +++ b/webapps/console/components/FunctionsDebugger/FunctionResult.tsx @@ -0,0 +1,60 @@ +import React from "react"; +import { Htmlizer } from "../Htmlizer/Htmlizer"; +import { DropRetryErrorName, RetryErrorName } from "@jitsu/functions-lib"; +import { CodeEditor } from "../CodeEditor/CodeEditor"; +import Convert from "ansi-to-html"; +const convert = new Convert({ newline: true }); + +export const FunctionResult: React.FC<{ resultType: "ok" | "drop" | "error"; result: any; className?: string }> = ({ + result, + resultType, + className, +}) => { + return ( +
    + {resultType === "error" && ( +
    + + {`${result.name}: ` + + convert.toHtml(result.message.replaceAll(" ", " "))} + + {result.name === DropRetryErrorName && ( +
    + If such error will happen on an actual event, it will be SKIPPED and retry will be scheduled in{" "} + {result.retryPolicy?.delays?.[0] ? Math.min(result.retryPolicy.delays[0], 1440) : 5} minutes. +
    + )} + {result.name === RetryErrorName && ( +
    + If such error will happen on an actual event, this function will be scheduled +
    + for retry in {result.retryPolicy?.delays?.[0] ? Math.min(result.retryPolicy.delays[0], 1440) : 5} minutes, + but event will be processed further. +
    + )} +
    + )} + {resultType === "drop" && ( +
    + Further processing will be SKIPPED. Function returned: {JSON.stringify(result)}. +
    + )} + {resultType === "ok" && ( + {}} + monacoOptions={{ + renderLineHighlight: "none", + lineDecorationsWidth: 8, + lineNumbers: "off", + readOnly: true, + folding: false, + }} + /> + )} +
    + ); +}; diff --git a/webapps/console/components/FunctionsDebugger/FunctionVariables.tsx b/webapps/console/components/FunctionsDebugger/FunctionVariables.tsx new file mode 100644 index 000000000..ab43ea609 --- /dev/null +++ b/webapps/console/components/FunctionsDebugger/FunctionVariables.tsx @@ -0,0 +1,109 @@ +import React, { useCallback, useEffect } from "react"; +import { CirclePlusIcon, EyeIcon, EyeOffIcon, Trash2 } from "lucide-react"; +import { Button, Input } from "antd"; +import { isEqual } from "juava"; + +const Var: React.FC<{ + name: string; + value: string; + onChange: (name: string, value: string | undefined) => void; +}> = ({ name, value, onChange }) => { + const [editing, setEditing] = React.useState(false); + + return ( +
    + { + onChange(e.target.value, value); + }} + /> + {editing ? ( + { + onChange(name, e.target.value); + }} + /> + ) : ( +
    setEditing(true)} className={"flex-auto p-2 basis-1/2 border rounded-md "}> + {value.replaceAll(/./g, "*")} +
    + )} +
    +
    +
    + ); +}; + +export const FunctionVariables: React.FC<{ + value: Record; + onChange: (r: Record) => void; + className?: string; +}> = ({ value, onChange, className }) => { + const [array, setArray] = React.useState<[string, string][]>(Object.entries(value)); + + const change = useCallback( + (index: number, name: string, v: string | undefined) => { + if (typeof v === "undefined") { + setArray(array.filter((_, i) => i !== index)); + } else { + const newArr = [...array]; + newArr[index] = [name, v]; + setArray(newArr); + } + }, + [array] + ); + + useEffect(() => { + const newValue = Object.fromEntries(array); + if (!isEqual(newValue, value)) { + onChange(newValue); + } + }, [array, onChange, value]); + + return ( +
    +
    +
    Name
    +
    Value
    +
    +
    + {array.map(([n, v], index) => { + return change(index, nm, vl)} />; + })} +
    + +
    +
    + ); +}; diff --git a/webapps/console/components/FunctionsDebugger/FunctionsDebugger.module.css b/webapps/console/components/FunctionsDebugger/FunctionsDebugger.module.css index c10be98a4..fda57f2be 100644 --- a/webapps/console/components/FunctionsDebugger/FunctionsDebugger.module.css +++ b/webapps/console/components/FunctionsDebugger/FunctionsDebugger.module.css @@ -3,6 +3,10 @@ border-color: #d9d9d9; } +.vars { + @apply overflow-hidden; +} + .logs { @apply border rounded-lg overflow-auto; border-color: #d9d9d9; diff --git a/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx b/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx index 13e5e4dc2..a82b87d38 100644 --- a/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx +++ b/webapps/console/components/FunctionsDebugger/FunctionsDebugger.tsx @@ -14,10 +14,9 @@ import { ColumnsType } from "antd/es/table"; import { UTCDate, UTCHeader } from "../DataView/EventsBrowser"; import { examplePageEvent, exampleTrackEvents, exampleIdentifyEvent } from "./example_events"; import { rpc } from "juava"; -import { logType } from "@jitsu/core-functions"; +import { logType } from "@jitsu/core-functions/src/functions/lib/udf_wrapper"; import { RetryErrorName, DropRetryErrorName } from "@jitsu/functions-lib"; -import Convert from "ansi-to-html"; import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; dayjs.extend(utc); @@ -25,13 +24,12 @@ import { defaultFunctionTemplate } from "./code_templates"; import { FunctionConfig } from "../../lib/schema"; import { useRouter } from "next/router"; import { feedbackError } from "../../lib/ui"; -import { Htmlizer } from "../Htmlizer/Htmlizer"; import Link from "next/link"; -import { CodeBlockLight } from "../CodeBlock/CodeBlockLight"; import { useStoreReload } from "../../lib/store"; - -const convert = new Convert({ newline: true }); -const localDate = (date: string | Date) => dayjs(date).format("YYYY-MM-DD HH:mm:ss"); +import { FunctionLogs } from "./FunctionLogs"; +import { FunctionResult } from "./FunctionResult"; +import { FunctionVariables } from "./FunctionVariables"; +import { CodeViewer } from "./CodeViewer"; type FunctionsDebuggerProps = {} & EditorComponentProps; @@ -113,32 +111,12 @@ export const EditableTitle: React.FC<{ children: string; onUpdate: (str: string) ); }; -const CodeViewer: React.FC<{ code: string }> = ({ code }) => { - const [showCode, setShowCode] = useState(false); - - return ( -
    - - {showCode && ( - - {code} - - )} -
    - ); -}; - export const FunctionsDebugger: React.FC = props => { const { push } = useRouter(); const workspace = useWorkspace(); const [showLogs, setShowLogs] = useState(false); - // const [showConfig, setShowConfig] = useState(false); + const [showConfig, setShowConfig] = useState(false); const [showEvents, setShowEvents] = useState(false); const [event, setEvent] = useState(JSON.stringify(examplePageEvent(), undefined, 2)); const [obj, setObj] = useState>({ @@ -146,7 +124,7 @@ export const FunctionsDebugger: React.FC = props => { code: props.isNew ? defaultFunctionTemplate() : props.object.code ?? "", }); - const [config, setConfig] = useState("{}"); + const [config, setConfig] = useState({}); const [store, setStore] = useState({}); const [result, setResult] = useState({}); const [resultType, setResultType] = useState<"ok" | "drop" | "error">("ok"); @@ -174,7 +152,7 @@ export const FunctionsDebugger: React.FC = props => { } finally { setSaving(false); } - }, [props.isNew, obj, workspace.id, push]); + }, [props.isNew, obj, workspace.id, push, reloadStore]); const runFunction = useCallback(async () => { setRunning(true); @@ -185,7 +163,7 @@ export const FunctionsDebugger: React.FC = props => { functionName: obj.name, code: obj.code, event: JSON.parse(event), - config: JSON.parse(config), + variables: config, store, userAgent: navigator.userAgent, }; @@ -252,7 +230,7 @@ export const FunctionsDebugger: React.FC = props => { } finally { setRunning(false); } - }, [workspace.id, obj.code, event, config, store, obj.id, obj.name, showLogs]); + }, [workspace.id, obj.code, config, event, store, obj.id, obj.name, showLogs]); return (
    @@ -280,9 +258,9 @@ export const FunctionsDebugger: React.FC = props => { {/* type="default"*/} {/* disabled={saving}*/} {/* onClick={() => setShowConfig(!showConfig)}*/} - {/* icon={}*/} + {/* icon={}*/} {/*>*/} - {/* Config*/} + {/* Test Environment Variables*/} {/**/}
    )} - {/*
    */} - {/*
    Config
    */} - {/* */} - {/*
    */} +
    +
    Test Environment Variables
    + +
    @@ -416,53 +388,7 @@ declare class RetryError extends Error {
    -
    - {resultType === "error" && ( -
    - - {`${result.name}: ` + - convert.toHtml(result.message.replaceAll(" ", " "))} - - {result.name === DropRetryErrorName && ( -
    - If such error will happen on an actual event, it will be SKIPPED and retry will be - scheduled in{" "} - {result.retryPolicy?.delays?.[0] ? Math.min(result.retryPolicy.delays[0], 1440) : 5} minutes. -
    - )} - {result.name === RetryErrorName && ( -
    - If such error will happen on an actual event, this function will be scheduled -
    - for retry in{" "} - {result.retryPolicy?.delays?.[0] ? Math.min(result.retryPolicy.delays[0], 1440) : 5} minutes, - but event will be processed further. -
    - )} -
    - )} - {resultType === "drop" && ( -
    - Further processing will be SKIPPED. Function returned:{" "} - {JSON.stringify(result)}. -
    - )} - {resultType === "ok" && ( - {}} - monacoOptions={{ - renderLineHighlight: "none", - lineDecorationsWidth: 8, - lineNumbers: "off", - readOnly: true, - folding: false, - }} - /> - )} -
    +
    @@ -473,42 +399,7 @@ declare class RetryError extends Error { Show Results
    -
    - {logs.map((log, index) => { - const colors = (() => { - switch (log.level) { - case "error": - return { text: "#A4000F", bg: "#FDF3F5", border: "#F8D6DB" }; - case "debug": - return { text: "#646464", bg: "#FBF3F5", border: "#FBF3F5" }; - case "warn": - return { text: "#705100", bg: "#FFFBD6", border: "#F4E89A" }; - default: - return { text: "black", bg: "white", border: "#eaeaea" }; - } - })(); - return ( -
    - {/*
    {localDate(log.timestamp)}
    */} -
    - {log.level.toUpperCase()} -
    -
    - {log.message} -
    -
    - ); - })} -
    +
    diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index 6c9074b15..a8da416dd 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -37,6 +37,7 @@ import { ShieldAlert, Terminal, User, + UserRoundPen, X, Zap, } from "lucide-react"; @@ -66,6 +67,7 @@ import { MenuItemType } from "antd/lib/menu/interface"; export type PageLayoutProps = { fullscreen?: boolean; onClose?: () => void; + noPadding?: boolean; className?: string; doNotBlockIfUsageExceeded?: boolean; }; @@ -578,6 +580,11 @@ function PageHeader() { { title: "All Logs", path: "/syncs/tasks", icon: }, ], }, + { + title: "Customers", + icon: , + items: [{ title: "Profile Builder", path: "/profile-builder", icon: }], + }, { title: "Destinations", path: "/destinations", icon: }, { @@ -631,6 +638,8 @@ function PageHeader() { ); } +//minimum with of the window +const minWidth = 1024; /** * @param onboarding if the dialog is shown on onboarding page. For onboarding, @@ -663,7 +672,7 @@ const WorkspaceSettingsModal: React.FC<{ onSuccess: () => void; onboarding: bool ); return ( -
    +

    👋 Let's get started!

    @@ -705,7 +714,7 @@ const log = getLog("WorkspacePageLayout"); export const VerticalSection: React.FC> = ({ children, className }) => { return ( -
    +
    {children}
    ); @@ -718,6 +727,7 @@ export const WidthControl: React.FC> = export const WorkspacePageLayout: React.FC> = ({ className, fullscreen, + noPadding, onClose, children, doNotBlockIfUsageExceeded, @@ -730,6 +740,23 @@ export const WorkspacePageLayout: React.FC> = throw new Error(`${router.asPath} is not a workspace page`); } + useEffect(() => { + if (typeof window !== "undefined") { + const handleKeyDown = (event: KeyboardEvent) => { + if (event.ctrlKey && event.shiftKey && event.key === "M") { + const userConfirmed = window.confirm( + `Do you really want to open a window with minimum width of ${minWidth}px?` + ); + if (userConfirmed) { + window.open(window.location.href, "_blank", `width=${minWidth},height=${window.innerHeight}`); + } + } + }; + window.addEventListener("keydown", handleKeyDown); + return () => window.removeEventListener("keydown", handleKeyDown); + } + }, [window]); + useEffect(() => { setShowDrawer(false); }, [fullscreen]); @@ -779,7 +806,7 @@ export const WorkspacePageLayout: React.FC> = ) : ( pHeader )} - + {fullscreen && ( )} - {children} + {children}
    diff --git a/webapps/console/components/ProfileBuilderPage/ProfileBuilderPage.module.css b/webapps/console/components/ProfileBuilderPage/ProfileBuilderPage.module.css new file mode 100644 index 000000000..b3c26c3a1 --- /dev/null +++ b/webapps/console/components/ProfileBuilderPage/ProfileBuilderPage.module.css @@ -0,0 +1,11 @@ +.tabsHeightFix { + height: 100%; +} + +.tabsHeightFix :global(.ant-tabs-content) { + height: 100% !important; +} + +.settingsTable :global(.ant-tabs-content) { + height: 100% !important; +} diff --git a/webapps/console/components/ProfileBuilderPage/ProfileBuilderPage.tsx b/webapps/console/components/ProfileBuilderPage/ProfileBuilderPage.tsx new file mode 100644 index 000000000..b0802cb67 --- /dev/null +++ b/webapps/console/components/ProfileBuilderPage/ProfileBuilderPage.tsx @@ -0,0 +1,1159 @@ +import { WorkspacePageLayout } from "../../components/PageLayout/WorkspacePageLayout"; +import React, { useCallback, useEffect, useReducer, useRef, useState } from "react"; +import { + Badge, + Button, + Descriptions, + DescriptionsProps, + Input, + Popover, + Progress, + Statistic, + Tabs, + Tag, + Tooltip, +} from "antd"; +import { + Bug, + Code2, + OctagonAlert, + Play, + Save, + Settings, + Terminal, + Lock, + Hammer, + ThumbsUp, + LoaderCircle, + Braces, + RefreshCw, + History, + Parentheses, + SearchCode, + Rocket, +} from "lucide-react"; +import { CodeEditor } from "../CodeEditor/CodeEditor"; +import { ButtonLabel } from "../ButtonLabel/ButtonLabel"; +import { copyTextToClipboard, feedbackError, feedbackSuccess, PropsWithChildrenClassname } from "../../lib/ui"; +import classNames from "classnames"; +import styles from "./ProfileBuilderPage.module.css"; +import FieldListEditorLayout from "../FieldListEditorLayout/FieldListEditorLayout"; +import Link from "next/link"; +import { useBilling } from "../Billing/BillingProvider"; +import { useWorkspace } from "../../lib/context"; +import { ErrorCard } from "../GlobalError/GlobalError"; +import type { PresetColorType, PresetStatusColorType } from "antd/es/_util/colors"; +import { get, getConfigApi } from "../../lib/useApi"; +import { useConfigObjectList } from "../../lib/store"; +import { DestinationSelector } from "../Selectors/DestinationSelector"; +import { NumberEditor } from "../ConfigObjectEditor/Editors"; +import { isEqual, rpc } from "juava"; +import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; +import relativeTime from "dayjs/plugin/relativeTime"; +import { JitsuButton } from "../JitsuButton/JitsuButton"; +import { useAntdModal } from "../../lib/modal"; +import { testDataExample } from "./example"; +import { logType } from "@jitsu/core-functions"; +import { FunctionLogs } from "../FunctionsDebugger/FunctionLogs"; +import { FunctionResult } from "../FunctionsDebugger/FunctionResult"; +import { FunctionVariables } from "../FunctionsDebugger/FunctionVariables"; +import omit from "lodash/omit"; +import { CodeViewer } from "../FunctionsDebugger/CodeViewer"; + +dayjs.extend(utc); +dayjs.extend(relativeTime); + +export const defaultProfileBuilderFunction = `export default async function({ context, events, user }) { + context.log.info("Profile userId: " + user.id) + const profile = {} + profile.traits = user.traits + profile.anonId = user.anonymousId + return { + properties: profile + } +};`; + +const statuses: Record< + ProfileBuilderStatus | "loading" | "locked", + { + title: React.ReactNode; + documentation: React.ReactNode; + icon: React.ReactNode; + color: PresetColorType | PresetStatusColorType; + } +> = { + incomplete: { + color: "lime", + title: "INCOMPLETE", + documentation: <>Profile builder is not fully configured. Go to settings section to finish configuration, + icon: , + }, + locked: { + color: "blue", + title: "LOCKED", + documentation: ( + <> + Profile builder is not enabled for your account. You still can define profiles with JavaScript function, and run + test. To enable profile builder, please for your account please contact support + + ), + icon: , + }, + building: { + color: "yellow", + title: "BUILDING", + documentation: ( + <> + Profile builder is building initial profiles. In can happen after the first configuration, or after a change has + been made in the code. You can monitor the progress in the progress section + + ), + icon: , + }, + ready: { + color: "green", + title: "READY", + documentation: <>Profile builder is ready to use. You can query profiles, from a configured destination, + icon: , + }, + loading: { + color: "processing", + title: "LOADING", + documentation: <>Settings are being loaded, please wait, + icon: , + }, +}; + +const Header: React.FC<{ status: ProfileBuilderStatus | "loading"; pbEnabled: boolean }> = ({ status, pbEnabled }) => { + let statusDetails = statuses[status]; + if (status !== "loading" && !pbEnabled) { + statusDetails = statuses["locked"]; + } + + return ( +
    +

    Profile Builder

    + + +
    +
    {statusDetails.icon}
    +
    {statusDetails.title}
    +
    +
    +
    +
    + ); +}; + +function Dot() { + return ( + + + + ); +} + +const SettingsTab: React.FC<{ profileBuilder: ProfileBuilderData; dispatch: React.Dispatch }> = ({ + profileBuilder, + dispatch, +}) => { + const settings = profileBuilder.settings; + + const destinations = useConfigObjectList("destination"); + + useEffect(() => { + if (destinations.length && !settings.destinationId) { + dispatch({ type: "settings", value: { ...settings, destinationId: destinations[0].id } }); + } + }, [destinations, dispatch, settings]); + + return ( +
    + { + copyTextToClipboard(profileBuilder.id); + feedbackSuccess("Profile Builder Id copied to clipboard"); + }} + className={"w-80 border rounded-md py-1 px-2.5 cursor-pointer text-textLight"} + > + {profileBuilder.id} +
    + ), + }, + { + key: "storage", + name: "Storage", + documentation: ( + <> + The host name of the profile storage. To make changes, please{" "} + contact support + + ), + component: ( +
    + +
    + ), + }, + { + key: "destination", + name: "Destination", + documentation: <>Select the destination database where the profiles will be stored, + component: ( + dispatch({ type: "settings", value: { ...settings, destinationId: d } })} + /> + ), + }, + { + key: "table-name", + name: "Table Name", + documentation: <>The name of the table where the profiles will be stored, + component: ( +
    + dispatch({ type: "settings", value: { ...settings, tableName: e.target.value } })} + /> +
    + ), + }, + { + key: "window-days", + name: "Profile Window", + documentation: ( + <>The time window, in days, for querying user activity history during profile generation.. + ), + component: ( +
    + dispatch({ type: "settings", value: { ...settings, profileWindow: n } })} + /> +
    + ), + }, + ]} + /> + {/*
    */} + {/* {*/} + {/* modal.confirm({*/} + {/* title: "Publish Profile Builder?",*/} + {/* content:*/} + {/* status === "incomplete" ? (*/} + {/* <>*/} + {/* Saving the settings will lead to publishing the first version of profile builder.*/} + {/*
    */} + {/*
    */} + {/* Are you sure you want to proceed?*/} + {/* */} + {/* ) : (*/} + {/* <>*/} + {/* Saving the settings will lead to publishing the new version of profile builder and rebuilding all*/} + {/* customers profiles.*/} + {/*
    */} + {/*
    */} + {/* Are you sure you want to proceed?*/} + {/* */} + {/* ),*/} + {/* okText: status === "incomplete" ? "Publish the first version" : "Publish",*/} + {/* okType: "primary",*/} + {/* cancelText: "Cancel",*/} + {/* onOk: () => {},*/} + {/* });*/} + {/* }}*/} + {/* type="primary"*/} + {/* className="mt-2"*/} + {/* size={"large"}*/} + {/* >*/} + {/* Save*/} + {/* */} + {/*
    */} +
    + ); +}; + +type ProfileBuilderState = { + status: "ready" | "building" | "unknown" | "error"; + error?: string; + startedAt?: Date; + totalUsers?: number; + processedUsers?: number; + errorUsers?: number; + speed?: number; +}; + +const BuildProgress: React.FC<{ + profileBuilder: ProfileBuilderData; + state?: ProfileBuilderState; + loading?: boolean; + refreshTrigger: () => void; +}> = ({ profileBuilder, state, refreshTrigger, loading }) => { + let status = state?.status; + if (!status || status === "unknown") { + status = "building"; + } + let mappedStatus: PresetStatusColorType = "default"; + switch (status) { + case "ready": + mappedStatus = "success"; + break; + case "building": + mappedStatus = "processing"; + break; + case "error": + mappedStatus = "error"; + } + const items: DescriptionsProps["items"] = [ + { + key: "status", + label: "Status", + children: ( +
    + + } + /> +
    + ), + }, + ]; + if (status === "error") { + items.push({ + key: "error", + label: "Error", + children:
    {state?.error}
    , + }); + } + if (status === "building" || status === "ready") { + items.push({ + key: "version", + label: "Version", + children:
    {profileBuilder.version}
    , + }); + items.push({ + key: "published", + label: "Published", + children:
    {new Date(profileBuilder.updatedAt!).toLocaleString()}
    , + }); + } + if (status === "building") { + items.push( + { + key: "progress", + label: "Progress", + children: ( + + ), + }, + { + key: "total", + label: "Total Users", + children: , + }, + { + key: "processed", + label: "Processed Users", + children: , + }, + { + key: "errors", + label: "Errors", + children: , + } + ); + } + + return ( +
    + +
    + ); +}; + +const TabContent: React.FC = ({ children, className }) => { + return ( +
    +
    {children}
    +
    + ); +}; + +const verticalPaddingPx = 30; + +const VerticalSpacer: React.FC = ({ children, className }) => { + const divRef = useRef(null); // Ref to access the div element + const [height, setHeight] = useState("auto"); + + useEffect(() => { + const updateHeight = () => { + if (divRef.current) { + const top = divRef.current.getBoundingClientRect().top; + const availableHeight = window.innerHeight - top - verticalPaddingPx; + setHeight(`${availableHeight}px`); + } + }; + + updateHeight(); + window.addEventListener("resize", updateHeight); + return () => window.removeEventListener("resize", updateHeight); + }, []); + + return ( +
    + {children} +
    + ); +}; + +type ProfileBuilderStatus = "incomplete" | "building" | "ready"; +type ProfileBuilderData = { + status: ProfileBuilderStatus; + id: string | undefined; + name: string; + functionId: string | undefined; + draft: string | undefined; + draftUpdatedAt: Date | undefined; + code: string | undefined; + cli: boolean | undefined; + version: number | undefined; + settings: { + storage?: string; + destinationId?: string; + tableName?: string; + profileWindow?: number; + variables: any; + }; + createdAt: Date | undefined; + updatedAt: Date | undefined; +}; + +const defaultProfileBuilderData: ProfileBuilderData = { + id: undefined, + version: 0, + status: "incomplete", + name: "Profile Builder", + functionId: undefined, + code: undefined, + cli: undefined, + draft: undefined, + draftUpdatedAt: undefined, + settings: { + variables: {}, + }, + createdAt: undefined, + updatedAt: undefined, +}; + +type PBDataAction = + | { + [K in keyof ProfileBuilderData]: { + type: K; + value: ProfileBuilderData[K]; + }; + }[keyof ProfileBuilderData] + | { type: "replace"; value: ProfileBuilderData }; + +function pbDataReducer(state: ProfileBuilderData, action: PBDataAction) { + if (action.type === "replace") { + return action.value; + } + return { + ...state, + [action.type]: action?.value, + }; +} + +function useProfileBuilderState( + profileBuilder: ProfileBuilderData, + pbEnabled: boolean, + refreshDate: Date +): { isLoading: boolean; error?: Error; data?: ProfileBuilderState } { + const workspace = useWorkspace(); + const [loading, setLoading] = useState(false); + const [data, setData] = useState(); + + useEffect(() => { + if (pbEnabled) { + setLoading(true); + get( + `/api/${workspace.id}/profile-builder/stats?profileBuilderId=${profileBuilder.id}&version=${profileBuilder.version}` + ) + .then(res => { + setData(res); + }) + .catch(e => setData({ status: "error", error: e.message })) + .finally(() => setLoading(false)); + } + }, [profileBuilder, refreshDate, workspace.id, pbEnabled]); + return { isLoading: loading, data } as any; +} + +function useProfileBuilderData( + refreshDate: Date +): + | { isLoading: true; error?: never; data?: never; enabled: boolean } + | { isLoading: false; error: Error; data?: never; enabled: boolean } + | { isLoading: false; error?: never; data: ProfileBuilderData; enabled: boolean } { + const workspace = useWorkspace(); + const [enabled, setEnabled] = useState(false); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(); + const [data, setData] = useState(); + const billing = useBilling(); + useEffect(() => { + (async () => { + get(`/api/${workspace.id}/config/profile-builder?init=true`) + .then(res => res.profileBuilders) + .then(profileBuilders => { + let status: ProfileBuilderStatus = "incomplete"; + if (billing.enabled && billing.loading) { + setLoading(true); + return; + } else if (billing.enabled) { + if (billing.settings?.profileBuilderEnabled) { + setEnabled(true); + } + } + if (profileBuilders?.length) { + const pb = profileBuilders[0]; + if (pb.version > 0 && pb.destinationId) { + status = "ready"; + } + setData({ + status: status, + id: pb.id, + name: pb.name, + version: pb.version, + functionId: pb.functions?.length ? pb.functions[0].functionId : undefined, + draft: pb.functions?.length ? pb.functions[0].function.config.draft : defaultProfileBuilderFunction, + draftUpdatedAt: pb.functions?.length ? pb.functions[0].function.updatedAt : undefined, + code: pb.functions?.length ? pb.functions[0].function.config.code : defaultProfileBuilderFunction, + cli: pb.functions?.length ? !!pb.functions[0].function.config.slug : undefined, + settings: { + storage: pb.intermediateStorageCredentials, + destinationId: pb.destinationId, + tableName: pb.connectionOptions?.tableName, + variables: pb.connectionOptions?.variables, + profileWindow: pb.connectionOptions?.profileWindow, + }, + createdAt: pb.createdAt, + updatedAt: pb.updatedAt, + }); + return; + } else { + setData({ + ...defaultProfileBuilderData, + draft: defaultProfileBuilderFunction, + }); + } + }) + .catch(e => setError(e)) + .finally(() => setLoading(false)); + })(); + }, [billing.enabled, billing.loading, workspace, billing.settings, refreshDate]); + return { isLoading: loading, error, data, enabled } as any; +} + +const UserIdDialog: React.FC<{ profileBuilderId: string; setter: (v: string) => void; hideCallback: () => void }> = ({ + profileBuilderId, + setter, + hideCallback, +}) => { + const workspace = useWorkspace(); + const [loading, setLoading] = useState(false); + const [userId, setUserId] = useState(""); + + const load = useCallback( + (userId: string) => { + setLoading(true); + get(`/api/${workspace.id}/profile-builder/events?profileBuilderId=${profileBuilderId}&userId=${userId}`) + .then(res => { + if (res.status === "ok") { + setter(JSON.stringify(res.events, null, 2)); + } else { + setter(res.error); + } + }) + .catch(e => setter(e.message)) + .finally(() => { + setLoading(false); + hideCallback(); + }); + }, + [setter, hideCallback, workspace.id, profileBuilderId] + ); + + return ( +
    + Please enter the userId of the user you want to test the profile builder for: +
    + setUserId(e.target.value)} /> + +
    +
    + ); +}; + +const Overlay: React.FC<{ children?: React.ReactNode; visible: boolean; className?: string }> = ({ + children, + visible, + className, +}) => { + if (!visible) { + return <>; + } + return
    {children || ""}
    ; +}; + +export function ProfileBuilderPage() { + const workspace = useWorkspace(); + const [pbRefreshDate, setPbRefreshDate] = useState(new Date()); + const [stateRefreshDate, setStateRefreshDate] = useState(new Date()); + const { data: initialData, error: globalError, isLoading, enabled } = useProfileBuilderData(pbRefreshDate); + const { data: pbState, isLoading: stateLoading } = useProfileBuilderState(initialData!, enabled, stateRefreshDate); + const [saving, setSaving] = useState(false); + const [obj, dispatch] = useReducer(pbDataReducer, defaultProfileBuilderData); + const [activePrimaryTab, setActivePrimaryTab] = useState("code"); + const [activeSecondaryTab, setActiveSecondaryTab] = useState("test"); + const [testData, setTestData] = useState(testDataExample); + const [userIdDialogOpen, setUserIdDialogOpen] = useState(false); + const modal = useAntdModal(); + const [result, setResult] = useState({}); + const [resultType, setResultType] = useState<"ok" | "drop" | "error">("ok"); + const [logs, setLogs] = useState([]); + const [unreadErrorLogs, setUnreadErrorLogs] = useState(0); + const [unreadLogs, setUnreadLogs] = useState(0); + const [running, setRunning] = useState(false); + + const codeChanged = obj.draft !== initialData?.draft; + const hasUnpublishedDraft = obj.code !== obj.draft; + const hasUnpublishedEnvs = !isEqual(obj.settings.variables ?? {}, initialData?.settings.variables ?? {}); + const hasUnpublishedSettings = !isEqual( + omit(obj.settings ?? {}, "variables"), + omit(initialData?.settings ?? {}, "variables") + ); + const hasUnpublishedChanges = hasUnpublishedDraft || !isEqual(obj, initialData); + + function handleTabChange(key: string) { + setActiveSecondaryTab(key); + if (key === "logs") { + setUnreadLogs(0); + setUnreadErrorLogs(0); + } + } + + useEffect(() => { + if (initialData) { + dispatch({ type: "replace", value: initialData }); + } + }, [initialData, isLoading]); + + const publish = useCallback(async () => { + if (!obj.settings?.destinationId) { + modal.confirm({ + title: "Destination not selected", + content: ( + <> + Please select a destination where the profiles will be stored. +
    + You can do this in the Settings + + ), + okText: "Go to Settings", + okType: "primary", + cancelText: "Cancel", + onOk: () => { + setActivePrimaryTab("settings"); + }, + }); + } else { + setSaving(true); + rpc(`/api/${workspace.id}/config/profile-builder`, { + body: { + profileBuilder: { + id: obj.id, + name: obj.name, + workspaceId: workspace.id, + version: enabled ? (obj.version ?? 0) + 1 : obj.version ?? 0, + destinationId: obj.settings.destinationId, + intermediateStorageCredentials: obj.settings.storage || {}, + connectionOptions: { + tableName: obj.settings.tableName, + profileWindow: obj.settings.profileWindow, + variables: obj.settings.variables, + }, + createdAt: obj.createdAt || new Date(), + updatedAt: new Date(), + }, + code: obj.draft, + }, + }) + .then(() => { + setPbRefreshDate(new Date()); + }) + .catch(e => {}) + .finally(() => setSaving(false)); + } + }, [ + modal, + obj.createdAt, + obj.draft, + obj.id, + obj.name, + obj.settings.destinationId, + obj.settings.profileWindow, + obj.settings.storage, + obj.settings.tableName, + obj.settings.variables, + obj.version, + enabled, + workspace.id, + ]); + const save = useCallback(async () => { + setSaving(true); + getConfigApi(workspace.id, "function") + .update(obj.functionId!, { + draft: obj.draft, + type: "function", + }) + .then(() => { + setPbRefreshDate(new Date()); + }) + .catch(e => {}) + .finally(() => setSaving(false)); + }, [obj, workspace.id]); + + const rollback = useCallback(async () => { + setSaving(true); + getConfigApi(workspace.id, "function") + .update(obj.functionId!, { + draft: obj.code, + type: "function", + }) + .then(() => { + setPbRefreshDate(new Date()); + }) + .catch(e => {}) + .finally(() => setSaving(false)); + }, [obj, workspace.id]); + + const runFunction = useCallback(async () => { + setRunning(true); + let body = {}; + try { + body = { + functionId: obj.functionId, + functionName: "Profile Builder", + code: obj.draft, + events: JSON.parse(testData), + variables: obj.settings.variables, + store: {}, + userAgent: navigator.userAgent, + }; + } catch (e) { + feedbackError("Invalid JSON", { error: e }); + setRunning(false); + return; + } + try { + const res = await rpc(`/api/${workspace.id}/profile-builder/run`, { + method: "POST", + body, + }); + if (res.error) { + setResult(res.error); + setResultType("error"); + setLogs([ + ...res.logs, + { + level: "error", + type: "log", + message: `${res.error.name}: ${res.error.message}`, + timestamp: new Date(), + }, + ]); + } else { + setResult(res.result); + setResultType(res.dropped ? "drop" : "ok"); + if (res.dropped) { + setLogs([ + ...res.logs, + { + level: "info", + type: "log", + message: `Further processing will be SKIPPED. Function returned: ${JSON.stringify(res.result)}`, + timestamp: new Date(), + }, + ]); + } else { + setLogs(res.logs); + } + } + + if (activeSecondaryTab !== "logs") { + setUnreadLogs(res.logs.length); + setUnreadErrorLogs(res.logs.filter(l => l.level === "error").length); + } + } catch (e: any) { + const errorText = "Error while calling Function API. Please contact support."; + setLogs([ + { + level: "error", + type: "log", + message: errorText, + timestamp: new Date(), + }, + ]); + setResult({ + name: "Error", + message: errorText, + }); + if (activeSecondaryTab !== "logs") { + setUnreadLogs(1); + setUnreadErrorLogs(1); + } + setResultType("error"); + } finally { + if (activeSecondaryTab !== "logs" && activeSecondaryTab !== "result") { + setActiveSecondaryTab("result"); + } + setRunning(false); + } + }, [obj.functionId, obj.draft, obj.settings.variables, testData, workspace.id, activeSecondaryTab]); + + return ( + +
    + + +
    Configuration loading, please wait...
    +
    + + + +
    + +
    + + {enabled && activePrimaryTab === "code" && ( + <> +
    Draft saved: {dayjs(obj.draftUpdatedAt).fromNow()}
    + + + + )} + + <> + + +
    + } + type={"card"} + activeKey={activePrimaryTab} + size={"small"} + tabBarStyle={{ marginBottom: 0 }} + items={[ + { + disabled: isLoading || !!globalError, + key: "code", + style: { height: "100%" }, + label: ( + }> +
    + Code + {enabled && hasUnpublishedDraft && } + {!enabled && codeChanged && } +
    +
    + ), + children: ( + + {!isEqual(obj, defaultProfileBuilderData) && + (obj.cli ? ( +
    +
    + The function is compiled and deployed with{" "} + + jitsu-cli + {" "} + and can't be edited in the UI. +
    + However, you can still run it with different events and see the results below. And you can + view the code +
    + +
    + ) : ( + dispatch({ type: "draft", value: c })} + /> + ))} +
    + ), + }, + { + disabled: isLoading || !!globalError, + key: "variables", + style: { height: "100%" }, + label: ( + }> +
    + Environment Variables + {hasUnpublishedEnvs && } +
    +
    + ), + children: ( + +
    + dispatch({ type: "settings", value: { ...obj.settings, variables: c } })} + /> +
    +
    + ), + }, + { + disabled: isLoading || !!globalError, + style: { height: "100%" }, + key: "settings", + label: ( + }> +
    + Settings + {hasUnpublishedSettings && } +
    {" "} +
    + ), + children: ( + + + + ), + }, + { + disabled: isLoading || !!globalError || !enabled || obj.status === "incomplete", + style: { height: "100%" }, + key: "build", + label: }>Build Progress, + children: ( + + setStateRefreshDate(new Date())} + /> + + ), + }, + ]} + /> +
    +
    + + {activePrimaryTab === "code" && ( + <> + {obj.status !== "incomplete" && activeSecondaryTab === "test" && ( + { + setUserIdDialogOpen(false); + }} + /> + } + title="Enter UserId" + open={userIdDialogOpen} + onOpenChange={(newOpen: boolean) => { + setUserIdDialogOpen(newOpen); + }} + trigger="click" + > + + + )} + + + )} +
    + } + type={"card"} + defaultActiveKey="1" + size={"small"} + tabBarStyle={{ marginBottom: 0 }} + activeKey={activeSecondaryTab} + items={[ + { + style: { height: "100%" }, + disabled: isLoading || !!globalError, + key: "test", + label: }>Test Data, + children: ( + + + + ), + }, + { + style: { height: "100%" }, + key: "result", + disabled: isLoading || !!globalError, + label: }>Last Run Result, + children: ( + + + + ), + }, + { + style: { height: "100%" }, + key: "logs", + disabled: isLoading || !!globalError, + label: ( + + }>Logs + + ), + children: ( + + + + ), + }, + ]} + /> +
    + +
    + + ); +} diff --git a/webapps/console/components/ProfileBuilderPage/example.ts b/webapps/console/components/ProfileBuilderPage/example.ts new file mode 100644 index 000000000..b0ca0bd77 --- /dev/null +++ b/webapps/console/components/ProfileBuilderPage/example.ts @@ -0,0 +1,60 @@ +export const testDataExample = JSON.stringify( + [ + { + type: "page", + properties: { + title: "Jitsu", + url: "https://use.jitsu.com/test", + path: "/test", + hash: "", + search: "", + width: 2304, + height: 1186, + name: "Workspace Page", + }, + userId: "clewyinv10000mo0f1o1a8sg7", + anonymousId: "65d98584-5fea-4a2d-8988-b02fe4291f25", + timestamp: "2024-10-22T15:39:09.456Z", + sentAt: "2024-10-22T15:39:09.456Z", + messageId: "1t5bykqr4sj1r59fbvstdw", + context: {}, + requestIp: "127.0.0.1", + receivedAt: "2024-10-22T15:39:09.458Z", + }, + { + type: "track", + event: "workspace_access", + properties: { + workspaceId: "cl9y5kgth0002ccfn3vtqz64g", + workspaceName: "Test Workspace", + workspaceSlug: "test", + }, + userId: "clewyinv10000mo0f1o1a8sg7", + anonymousId: "7efbac34-c4c0-4e84-9458-e58ec184d337", + timestamp: "2024-10-22T15:41:24.351Z", + sentAt: "2024-10-22T15:41:24.351Z", + messageId: "1hllz5alamc17d4x39cyiu", + context: {}, + requestIp: "127.0.0.1", + receivedAt: "2024-10-22T15:41:24.353Z", + }, + { + type: "identify", + userId: "clewyinv10000mo0f1o1a8sg7", + traits: { + email: "test@example.com", + name: "John Doe", + externalId: "1234", + }, + anonymousId: "7efbac34-c4c0-4e84-9458-e58ec184d337", + timestamp: "2024-10-22T15:41:24.351Z", + sentAt: "2024-10-22T15:41:24.351Z", + messageId: "mj2vr0l9wt1849lq6of5y", + context: {}, + requestIp: "127.0.0.1", + receivedAt: "2024-10-22T15:41:24.353Z", + }, + ], + null, + 2 +); diff --git a/webapps/console/components/Selectors/DestinationSelector.tsx b/webapps/console/components/Selectors/DestinationSelector.tsx new file mode 100644 index 000000000..1e0d307a1 --- /dev/null +++ b/webapps/console/components/Selectors/DestinationSelector.tsx @@ -0,0 +1,54 @@ +import { getCoreDestinationType } from "../../lib/schema/destinations"; +import { DestinationConfig } from "../../lib/schema"; +import { Disable } from "../Disable/Disable"; +import { Select } from "antd"; +import { DestinationTitle } from "../../pages/[workspaceId]/destinations"; +import { WLink } from "../Workspace/WLink"; +import { FaExternalLinkAlt } from "react-icons/fa"; +import React from "react"; + +export type SelectorProps = { + enabled: boolean; + disabledReason?: string; + selected: string; + items: T[]; + onSelect: (value: string) => void; + showLink?: boolean; +}; + +export function DestinationSelector(props: SelectorProps) { + return ( +
    + + + + {!props.enabled && props.showLink && ( +
    + + + +
    + )} +
    + ); +} diff --git a/webapps/console/components/Selectors/SourceSelector.tsx b/webapps/console/components/Selectors/SourceSelector.tsx new file mode 100644 index 000000000..a07343a99 --- /dev/null +++ b/webapps/console/components/Selectors/SourceSelector.tsx @@ -0,0 +1,31 @@ +import { StreamConfig } from "../../lib/schema"; +import { Disable } from "../Disable/Disable"; +import { Select } from "antd"; +import { StreamTitle } from "../../pages/[workspaceId]/streams"; +import { WLink } from "../Workspace/WLink"; +import { FaExternalLinkAlt } from "react-icons/fa"; +import React from "react"; +import { SelectorProps } from "./DestinationSelector"; + +export function SourceSelector(props: SelectorProps) { + return ( +
    + + + + {!props.enabled && props.showLink && ( +
    + + + +
    + )} +
    + ); +} diff --git a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx index c7ea1485d..686a995c7 100644 --- a/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx +++ b/webapps/console/components/SyncEditorPage/SyncEditorPage.tsx @@ -14,7 +14,6 @@ import FieldListEditorLayout, { EditorItem } from "../FieldListEditorLayout/Fiel import { ChevronLeft, ExternalLink } from "lucide-react"; import { JitsuButton } from "../JitsuButton/JitsuButton"; import { LoadingAnimation } from "../GlobalLoader/GlobalLoader"; -import { DestinationTitle } from "../../pages/[workspaceId]/destinations"; import { ServiceTitle } from "../../pages/[workspaceId]/services"; import { SwitchComponent } from "../ConnectionEditorPage/ConnectionEditorPage"; import { SimpleErrorCard } from "../GlobalError/GlobalError"; @@ -26,6 +25,7 @@ import { useBilling } from "../Billing/BillingProvider"; import { WLink } from "../Workspace/WLink"; import { useStoreReload } from "../../lib/store"; import capitalize from "lodash/capitalize"; +import { DestinationSelector, SelectorProps } from "../Selectors/DestinationSelector"; const log = getLog("SyncEditorPage"); @@ -78,54 +78,10 @@ const namespaceImplementation: Record = gcs: { name: "folder", field: "folder" }, }; -type SelectorProps = { - enabled: boolean; - selected: string; - items: T[]; - onSelect: (value: string) => void; -}; - -function DestinationSelector(props: SelectorProps) { - return ( -
    - - - - {/*{!props.enabled && (*/} - {/*
    */} - {/* */} - {/* */} - {/* */} - {/*
    */} - {/*)}*/} -
    - ); -} - function ServiceSelector(props: SelectorProps & { refreshCatalogCb?: () => void }) { return (
    - + { setValue(e.target.value); @@ -88,7 +104,7 @@ export const EditableTitle: React.FC<{ children: string; onUpdate: (str: string) ) : (

    { setRollbackValue(value); setEditing(true); @@ -115,8 +131,9 @@ export const FunctionsDebugger: React.FC = props => { const { push } = useRouter(); const workspace = useWorkspace(); - const [showLogs, setShowLogs] = useState(false); - const [showConfig, setShowConfig] = useState(false); + const [activePrimaryTab, setActivePrimaryTab] = useState("code"); + const [activeSecondaryTab, setActiveSecondaryTab] = useState("event"); + const [newResult, setNewResult] = useState(false); const [showEvents, setShowEvents] = useState(false); const [event, setEvent] = useState(JSON.stringify(examplePageEvent(), undefined, 2)); const [obj, setObj] = useState>({ @@ -135,6 +152,17 @@ export const FunctionsDebugger: React.FC = props => { const [running, setRunning] = useState(false); const reloadStore = useStoreReload(); + function handleTabChange(key: string) { + setActiveSecondaryTab(key); + if (key === "logs") { + setUnreadLogs(0); + setUnreadErrorLogs(0); + } + if (key === "result") { + setNewResult(false); + } + } + const save = useCallback(async () => { setSaving(true); try { @@ -177,6 +205,9 @@ export const FunctionsDebugger: React.FC = props => { method: "POST", body, }); + if (activeSecondaryTab !== "result") { + setNewResult(true); + } if (res.error) { setResult(res.error); setResultType("error"); @@ -207,7 +238,7 @@ export const FunctionsDebugger: React.FC = props => { } } - if (!showLogs) { + if (activeSecondaryTab !== "logs") { setUnreadLogs(res.logs.length); setUnreadErrorLogs(res.logs.filter(l => l.level === "error").length); } @@ -230,94 +261,111 @@ export const FunctionsDebugger: React.FC = props => { } finally { setRunning(false); } - }, [workspace.id, obj.code, config, event, store, obj.id, obj.name, showLogs]); + }, [workspace.id, obj.code, config, event, store, obj.id, obj.name, activeSecondaryTab]); return ( -
    -
    -
    -
    -
    - { - setObj({ ...obj, name }); - }} - > - {obj.name || "New function"} - -
    -
    -
    -

    {obj.origin === "jitsu-cli" ? "Info:" : "Code:"}

    -
    -
    - - {/* setShowConfig(!showConfig)}*/} - {/* icon={}*/} - {/*>*/} - {/* Test Environment Variables*/} - {/**/} - -
    -
    -
    - {obj.origin === "jitsu-cli" ? ( - - - {obj.slug} - - This function was created with Jitsu CLI - - {obj.version} - - {obj.description && {obj.description}} - { - -
    -
    - The function is compiled and deployed with{" "} - - jitsu-cli - {" "} - and can't be edited in the UI. However, you can still run it with different events and see the - results below. And you can view the code -
    + } + type={"card"} + activeKey={activePrimaryTab} + size={"small"} + tabBarStyle={{ marginBottom: 0 }} + items={[ + { + key: "code", + style: { height: "100%" }, + label: ( + }> +
    + {obj.origin === "jitsu-cli" ? "Info" : "Code"} + {props.object?.code !== obj.code && } +
    +
    + ), + children: ( + + {obj.origin === "jitsu-cli" ? ( + + + {obj.slug} + + This function was created with Jitsu CLI + + {obj.version} + + {obj.description && ( + {obj.description} + )} + { + +
    +
    + The function is compiled and deployed with{" "} + + jitsu-cli + {" "} + and can't be edited in the UI. However, you can still run it with different events and + see the results below. And you can view the code +
    - -
    -
    - } -
    - ) : ( -
    - +
    + + } + + ) : ( + setObj({ ...obj, code: value })} - monacoOptions={{ renderLineHighlight: "none" }} - /> -
    - )} -
    -
    Test Environment Variables
    - -
    -
    -
    -
    -
    -
    -
    -
    -

    Event:

    -
    -
    + onChange={value => setObj({ ...obj, code: value })} + monacoOptions={{ renderLineHighlight: "none" }} + /> + )} + + ), + }, + ]} + /> + + + + {activeSecondaryTab === "event" && ( + <> setEvent(JSON.stringify(e, undefined, 2))} /> - -
    -
    -
    - -
    + + )} +
    -
    -
    -
    -

    Result:

    -
    + } + type={"card"} + defaultActiveKey="1" + size={"small"} + tabBarStyle={{ marginBottom: 0 }} + activeKey={activeSecondaryTab} + items={[ + { + style: { height: "100%" }, + key: "event", + label: }>Event, + children: ( + + + + ), + }, + { + key: "variables", + style: { height: "100%" }, + label: ( + }> +
    + Test Environment Variables +
    +
    + ), + children: ( + +
    + +
    +
    + ), + }, + { + style: { height: "100%" }, + key: "result", + label: ( + }> +
    + Last Run Result + {newResult && } +
    +
    + ), + children: ( + + + + ), + }, + { + style: { height: "100%" }, + key: "logs", + label: ( - + }>Logs -
    - -
    -
    -
    -
    -

    Logs:

    -
    - -
    - -
    -
    -
    - setShowEvents(false)} - open={showEvents} - getContainer={false} - > - setEvent(JSON.stringify(e, undefined, 2))} /> - -
    -
    + ), + children: ( + + + + ), + }, + ]} + /> + +
    ); }; @@ -671,9 +746,20 @@ const ExamplesDropdown = ({ selectEvent }: { selectEvent: (e: any) => void }) => return ( - ); }; + +const TabContent: React.FC = ({ children, className }) => { + return ( +
    + {children} +
    + ); +}; diff --git a/webapps/console/components/FunctionsDebugger/code_templates.ts b/webapps/console/components/FunctionsDebugger/code_templates.ts index 95a0e1f93..21e155668 100644 --- a/webapps/console/components/FunctionsDebugger/code_templates.ts +++ b/webapps/console/components/FunctionsDebugger/code_templates.ts @@ -1,7 +1,5 @@ export const defaultFunctionTemplate = () => { - return ` -export default async function(event, { log, fetch, props: config }) { + return `export default async function(event, { log, fetch }) { log.info("Hello world") -} -`; +}`; }; diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index 901da36f2..cb2fc3db8 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -68,7 +68,7 @@ export type PageLayoutProps = { fullscreen?: boolean; screen?: boolean; onClose?: () => void; - noPadding?: boolean; + contentClassName?: string; className?: string; doNotBlockIfUsageExceeded?: boolean; }; @@ -729,7 +729,7 @@ export const WorkspacePageLayout: React.FC> = className, screen, fullscreen, - noPadding, + contentClassName, onClose, children, doNotBlockIfUsageExceeded, @@ -808,7 +808,7 @@ export const WorkspacePageLayout: React.FC> = ) : ( pHeader )} - + {fullscreen && ( )} - {children} + {children}

    diff --git a/webapps/console/components/ProfileBuilderPage/ProfileBuilderPage.tsx b/webapps/console/components/ProfileBuilderPage/ProfileBuilderPage.tsx index 5414539bb..c8c585b8d 100644 --- a/webapps/console/components/ProfileBuilderPage/ProfileBuilderPage.tsx +++ b/webapps/console/components/ProfileBuilderPage/ProfileBuilderPage.tsx @@ -1,5 +1,5 @@ import { WorkspacePageLayout } from "../../components/PageLayout/WorkspacePageLayout"; -import React, { useCallback, useEffect, useReducer, useRef, useState } from "react"; +import React, { useCallback, useEffect, useReducer, useState } from "react"; import { Badge, Button, @@ -147,7 +147,7 @@ const Header: React.FC<{ status: ProfileBuilderStatus | "loading"; pbEnabled: bo ); }; -function Dot() { +export function Dot() { return ( = ({ children, className ); }; -const verticalPaddingPx = 30; - -const VerticalSpacer: React.FC = ({ children, className }) => { - const divRef = useRef(null); // Ref to access the div element - const [height, setHeight] = useState("auto"); - - useEffect(() => { - const updateHeight = () => { - if (divRef.current) { - const top = divRef.current.getBoundingClientRect().top; - const availableHeight = window.innerHeight - top - verticalPaddingPx; - setHeight(`${availableHeight}px`); - } - }; - - updateHeight(); - window.addEventListener("resize", updateHeight); - return () => window.removeEventListener("resize", updateHeight); - }, []); - - return ( -
    - {children} -
    - ); -}; - type ProfileBuilderStatus = "incomplete" | "building" | "ready"; type ProfileBuilderData = { status: ProfileBuilderStatus; @@ -864,8 +837,8 @@ export function ProfileBuilderPage() { }, [obj.functionId, obj.draft, obj.settings.variables, testData, workspace.id, activeSecondaryTab]); return ( - -
    + +
    = () => { const router = useRouter(); + const editor = router.pathname === "/[workspaceId]/functions" && typeof router.query["id"] !== "undefined"; return ( - + ); @@ -40,20 +36,6 @@ export const FunctionTitle: React.FC<{ ); }; -export const ProfileBuilderTitle: React.FC<{ - f?: FunctionConfig; - size?: "small" | "default" | "large"; - title?: (d?: FunctionConfig) => string | React.ReactNode; -}> = ({ f, title = d => d?.name ?? "unknown function", size = "default" }) => { - return ( - : undefined} - size={size} - title={title ? title(f) : "unknown function"} - /> - ); -}; - const FunctionsList: React.FC<{}> = () => { const router = useRouter(); const workspace = useWorkspace(); diff --git a/webapps/console/pages/[workspaceId]/sql.tsx b/webapps/console/pages/[workspaceId]/sql.tsx index 3d35b4d2b..e91b46382 100644 --- a/webapps/console/pages/[workspaceId]/sql.tsx +++ b/webapps/console/pages/[workspaceId]/sql.tsx @@ -94,8 +94,8 @@ const DataViewPage: React.FC = () => { ); } return ( - -
    + +
    From 3d39d85df7374cf8a222ff57555d9ee2a5a8cb14 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 8 Nov 2024 19:25:52 +0400 Subject: [PATCH 0954/1353] Console: SchemaForm support for more date formats --- .../console/components/ConfigObjectEditor/Editors.tsx | 11 +++++++++-- .../components/ConfigObjectEditor/SchemaForm.tsx | 6 ++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/webapps/console/components/ConfigObjectEditor/Editors.tsx b/webapps/console/components/ConfigObjectEditor/Editors.tsx index cb275c065..da20484f0 100644 --- a/webapps/console/components/ConfigObjectEditor/Editors.tsx +++ b/webapps/console/components/ConfigObjectEditor/Editors.tsx @@ -56,11 +56,18 @@ export const StringArray: React.FC<{ options?: string[] } & CustomWidgetProps> = props => { +export const TextEditor: React.FC<{ rows?: number; placeholder?: string } & CustomWidgetProps> = props => { if (props.rows && props.rows > 1) { return props.onChange(e.target.value)} />; } else { - return props.onChange(e.target.value)} />; + return ( + props.onChange(e.target.value)} + /> + ); } }; diff --git a/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx b/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx index cf3597e2f..9ee2f4518 100644 --- a/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx +++ b/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx @@ -181,6 +181,12 @@ export const SchemaForm: React.FC<{ case "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{6}Z$": format = "YYYY-MM-DDTHH:mm:ss.SSSSSS[Z]"; break; + case "^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z?$": + case "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z?$": + format = "YYYY-MM-DDTHH:mm:ss.SSSSSS[Z]"; + break; + default: + return ; } return ; } From cb3f659abbe4ce3e8e6a6c74787b49105a97fab6 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 11 Nov 2024 13:09:04 +0400 Subject: [PATCH 0955/1353] Support for Functions Environment Vars on connection level --- cli/jitsu-cli/src/templates/functions.ts | 2 +- services/profiles/src/lib/functions-chain.ts | 4 ++-- services/rotor/src/lib/functions-chain.ts | 22 +++++++++---------- .../ConnectionEditorPage.tsx | 19 +++++++++++++++- .../FunctionsDebugger/FunctionVariables.tsx | 8 +++---- webapps/console/lib/schema/destinations.tsx | 1 + 6 files changed, 37 insertions(+), 19 deletions(-) diff --git a/cli/jitsu-cli/src/templates/functions.ts b/cli/jitsu-cli/src/templates/functions.ts index 673099ecf..3676c5c85 100644 --- a/cli/jitsu-cli/src/templates/functions.ts +++ b/cli/jitsu-cli/src/templates/functions.ts @@ -50,7 +50,7 @@ export const config = { description: "" }; -const helloWorldFunction: JitsuFunction = async (event, { log, fetch, props, store, geo, ...meta }) => { +const helloWorldFunction: JitsuFunction = async (event, { log, fetch, store, geo, ...meta }) => { //output "Hello World!" to logs and return unchanged event log.info("Hello World!"); return event diff --git a/services/profiles/src/lib/functions-chain.ts b/services/profiles/src/lib/functions-chain.ts index 96357b466..6ecfd678f 100644 --- a/services/profiles/src/lib/functions-chain.ts +++ b/services/profiles/src/lib/functions-chain.ts @@ -107,7 +107,7 @@ export function buildFunctionChain( } udfCache.ttl(pbLongId, udfTTL); - const udfPipelineFunc = (chainCtx: FunctionChainContext, funcCtx: FunctionContext): ProfileFunctionWrapper => { + const udfPipelineFunc = (chainCtx: FunctionChainContext): ProfileFunctionWrapper => { return async (events, user, ctx) => { try { return await cached.wrapper.userFunction(events, user, ctx); @@ -142,7 +142,7 @@ export function buildFunctionChain( { id: "udf.PIPELINE", context: funcCtx, - exec: udfPipelineFunc(chainCtx, funcCtx), + exec: udfPipelineFunc(chainCtx), }, ]; diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index a7f04ae7a..c5471f612 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -152,7 +152,14 @@ export function buildFunctionChain( anonymousEventsStore, connectionOptions: connectionData, }; - + const funcCtx = { + function: { + id: "PIPELINE", + type: "udf", + debugTill: connectionData.debugTill ? new Date(connectionData.debugTill) : undefined, + }, + props: connectionData.functionsEnv || {}, + }; const udfFuncs: FunctionConfig[] = (connectionData?.functions || []) .filter(f => f.functionId.startsWith("udf.")) .map(f => { @@ -180,14 +187,7 @@ export function buildFunctionChain( const wrapper = UDFWrapper( connection.id, chainCtx, - { - function: { - id: "PIPELINE", - type: "udf", - debugTill: connectionData.debugTill ? new Date(connectionData.debugTill) : undefined, - }, - props: {}, - }, + funcCtx, udfFuncs.map(f => ({ id: f.id, name: f.name, code: f.code })) ); const oldWrapper = cached?.wrapper; @@ -207,7 +207,7 @@ export function buildFunctionChain( mainFunction, ]; - const udfPipelineFunc = (chainCtx: FunctionChainContext, funcCtx: FunctionContext): JitsuFunctionWrapper => { + const udfPipelineFunc = (chainCtx: FunctionChainContext): JitsuFunctionWrapper => { return async (event: AnyEvent, ctx: EventContext) => { try { return await cached.wrapper.userFunction(event, ctx); @@ -262,7 +262,7 @@ export function buildFunctionChain( return { id: f.functionId as string, context: funcCtx, - exec: udfPipelineFunc(chainCtx, funcCtx), + exec: udfPipelineFunc(chainCtx), }; } else { throw newError(`Function of unknown type: ${f.functionId}`); diff --git a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx index 7c0280b3a..b4ac5d2f9 100644 --- a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx +++ b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx @@ -20,6 +20,7 @@ import { Expandable } from "../Expandable/Expandable"; import { useStoreReload } from "../../lib/store"; import { DestinationSelector } from "../Selectors/DestinationSelector"; import { SourceSelector } from "../Selectors/SourceSelector"; +import { FunctionVariables } from "../FunctionsDebugger/FunctionVariables"; const log = getLog("ConnectionEditorPage"); @@ -678,7 +679,6 @@ function ConnectionEditor({ @@ -699,6 +699,23 @@ function ConnectionEditor({ }} /> + Environment Variables} + hideArrow={false} + caretSize="1.5em" + contentLeftPadding={false} + > +
    + Provided variables can be used inside functions via process.env object. For example:{" "} + process.env.DEBUG +
    + updateOptions({ functionsEnv })} + /> +
    diff --git a/webapps/console/components/FunctionsDebugger/FunctionVariables.tsx b/webapps/console/components/FunctionsDebugger/FunctionVariables.tsx index ab43ea609..a5aa80b54 100644 --- a/webapps/console/components/FunctionsDebugger/FunctionVariables.tsx +++ b/webapps/console/components/FunctionsDebugger/FunctionVariables.tsx @@ -11,7 +11,7 @@ const Var: React.FC<{ const [editing, setEditing] = React.useState(false); return ( -
    +
    -
    +
    Name
    Value
    @@ -95,7 +95,7 @@ export const FunctionVariables: React.FC<{ {array.map(([n, v], index) => { return change(index, nm, vl)} />; })} -
    +
    - -

    - Next, look for the error on the{" "} - Issues Page. -

    -

    - For more information, see{" "} - - https://docs.sentry.io/platforms/javascript/guides/nextjs/ - -

    - -
    - ); -} diff --git a/webapps/console/sentry.client.config.ts b/webapps/console/sentry.client.config.ts deleted file mode 100644 index 57c6e89c8..000000000 --- a/webapps/console/sentry.client.config.ts +++ /dev/null @@ -1,31 +0,0 @@ -// This file configures the initialization of Sentry on the client. -// The config you add here will be used whenever a users loads a page in their browser. -// https://docs.sentry.io/platforms/javascript/guides/nextjs/ - -import * as Sentry from "@sentry/nextjs"; - -Sentry.init({ - enabled: !!process.env.NEXT_PUBLIC_SENTRY_DSN, - dsn: process.env.NEXT_PUBLIC_SENTRY_DSN, - - // Adjust this value in production, or use tracesSampler for greater control - tracesSampleRate: 1, - - // Setting this option to true will print useful information to the console while you're setting up Sentry. - debug: false, - - replaysOnErrorSampleRate: 1.0, - - // This sets the sample rate to be 10%. You may want this to be 100% while - // in development and sample at a lower rate in production - replaysSessionSampleRate: 0.1, - - // You can remove this option if you're not planning to use the Sentry Session Replay feature: - integrations: [ - new Sentry.Replay({ - // Additional Replay configuration goes in here, for example: - maskAllText: false, - blockAllMedia: true, - }), - ], -}); diff --git a/webapps/console/sentry.edge.config.ts b/webapps/console/sentry.edge.config.ts deleted file mode 100644 index 182f404d5..000000000 --- a/webapps/console/sentry.edge.config.ts +++ /dev/null @@ -1,17 +0,0 @@ -// This file configures the initialization of Sentry for edge features (middleware, edge routes, and so on). -// The config you add here will be used whenever one of the edge features is loaded. -// Note that this config is unrelated to the Vercel Edge Runtime and is also required when running locally. -// https://docs.sentry.io/platforms/javascript/guides/nextjs/ - -import * as Sentry from "@sentry/nextjs"; - -Sentry.init({ - enabled: !!process.env.NEXT_PUBLIC_SENTRY_DSN, - dsn: process.env.NEXT_PUBLIC_SENTRY_DSN, - - // Adjust this value in production, or use tracesSampler for greater control - tracesSampleRate: 1, - - // Setting this option to true will print useful information to the console while you're setting up Sentry. - debug: false, -}); diff --git a/webapps/console/sentry.server.config.ts b/webapps/console/sentry.server.config.ts deleted file mode 100644 index 373fba164..000000000 --- a/webapps/console/sentry.server.config.ts +++ /dev/null @@ -1,16 +0,0 @@ -// This file configures the initialization of Sentry on the server. -// The config you add here will be used whenever the server handles a request. -// https://docs.sentry.io/platforms/javascript/guides/nextjs/ - -import * as Sentry from "@sentry/nextjs"; - -Sentry.init({ - enabled: !!process.env.NEXT_PUBLIC_SENTRY_DSN, - dsn: process.env.NEXT_PUBLIC_SENTRY_DSN, - - // Adjust this value in production, or use tracesSampler for greater control - tracesSampleRate: 1, - - // Setting this option to true will print useful information to the console while you're setting up Sentry. - debug: false, -}); From be5e2121ebe8a1df9fc541b307d1a5e49dd4ab1a Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 11 Nov 2024 17:03:38 +0400 Subject: [PATCH 0958/1353] fix for unnecessary scroll --- .../PageLayout/WorkspacePageLayout.module.css | 11 +++++++++++ .../components/PageLayout/WorkspacePageLayout.tsx | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.module.css b/webapps/console/components/PageLayout/WorkspacePageLayout.module.css index 67f8bf706..6b2f00e34 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.module.css +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.module.css @@ -1,5 +1,6 @@ .widthControl { max-width: 1500px; + width: 100%; min-width: 1024px; } @@ -11,6 +12,16 @@ .topMenu :global li .ant-menu-submenu-title { } +.topMenu :global .ant-menu-item { + top: 0 !important; + margin-top: 0 !important; +} + +.topMenu :global .ant-menu-submenu { + top: 0 !important; + margin-top: 0 !important; +} + .topMenu :global li.ant-menu-submenu-selected .ant-menu-submenu-title { /*background-color: white !important;*/ /*padding-left: 0.5rem;*/ diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index cb2fc3db8..10a2ab339 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -715,7 +715,7 @@ const log = getLog("WorkspacePageLayout"); export const VerticalSection: React.FC> = ({ children, className }) => { return ( -
    +
    {children}
    ); From fbcddf7c59be9052d1e5e6ce95732221466db3a2 Mon Sep 17 00:00:00 2001 From: Rafael Couto <54128315+rafael-couto-p@users.noreply.github.com> Date: Mon, 11 Nov 2024 10:15:03 -0300 Subject: [PATCH 0959/1353] feat: remove write key from payload event when sending it to segment (#1143) --- libs/core-functions/src/functions/segment-destination.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libs/core-functions/src/functions/segment-destination.ts b/libs/core-functions/src/functions/segment-destination.ts index 440b5943d..6fa6e1e68 100644 --- a/libs/core-functions/src/functions/segment-destination.ts +++ b/libs/core-functions/src/functions/segment-destination.ts @@ -25,9 +25,12 @@ const SegmentDestination: JitsuFunction Date: Mon, 11 Nov 2024 17:17:23 +0400 Subject: [PATCH 0960/1353] SegmentDestination: small clean up --- libs/core-functions/src/functions/segment-destination.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libs/core-functions/src/functions/segment-destination.ts b/libs/core-functions/src/functions/segment-destination.ts index 6fa6e1e68..9770448c3 100644 --- a/libs/core-functions/src/functions/segment-destination.ts +++ b/libs/core-functions/src/functions/segment-destination.ts @@ -2,6 +2,7 @@ import { JitsuFunction } from "@jitsu/protocols/functions"; import { RetryError } from "@jitsu/functions-lib"; import type { AnalyticsServerEvent } from "@jitsu/protocols/analytics"; import { SegmentCredentials } from "../meta"; +import omit from "lodash/omit"; export type HttpRequest = { method?: string; @@ -26,7 +27,8 @@ const SegmentDestination: JitsuFunction Date: Mon, 11 Nov 2024 11:13:19 -0300 Subject: [PATCH 0961/1353] allow overriding properties url and path (#1135) allow overriding properties url and path for page events --- libs/jitsu-js/src/analytics-plugin.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libs/jitsu-js/src/analytics-plugin.ts b/libs/jitsu-js/src/analytics-plugin.ts index a0e557cd5..701f94fe2 100644 --- a/libs/jitsu-js/src/analytics-plugin.ts +++ b/libs/jitsu-js/src/analytics-plugin.ts @@ -416,8 +416,9 @@ function adjustPayload( const properties = payload.properties || {}; if (payload.type === "page" && url) { - properties.url = url.replace(hashRegex, ""); - properties.path = fixPath(urlPath(url)); + const targetUrl = properties.url || url; + properties.url = targetUrl.replace(hashRegex, ""); + properties.path = fixPath(urlPath(targetUrl)); } const customContext = payload.properties?.context || {}; From 31dda3802dcbe05ad40e8e17fdc58f88bade42ae Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 12 Nov 2024 12:41:04 +0400 Subject: [PATCH 0962/1353] docker-compose: add profiles service --- docker/docker-compose.yml | 33 +++++++++++++++++++++++++-- libs/jitsu-js/src/analytics-plugin.ts | 2 +- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 780fc0de9..8cdba11f9 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -183,8 +183,37 @@ services: condition: service_healthy bulker: condition: service_healthy - # ports: - # - "3401:3401" + + profiles: + tty: true + image: jitsucom/profiles:${DOCKER_TAG:-latest} + platform: linux/amd64 + restart: "unless-stopped" + environment: + ROTOR_RAW_AUTH_TOKENS: ${BULKER_TOKEN:-default} + BULKER_URL: "http://bulker:3042" + BULKER_AUTH_KEY: ${BULKER_TOKEN:-default} + # REDIS_URL: "redis://default:${REDIS_PASSWORD:-default}@redis:6379" + REPOSITORY_BASE_URL: "http://console:3000/api/admin/export/" + REPOSITORY_AUTH_TOKEN: "service-admin-account:${CONSOLE_TOKEN:-default}" + REPOSITORY_CACHE_DIR: "/tmp/cache" + MONGODB_URL: "mongodb://default:${MONGO_PASSWORD:-default}@mongo/" + CLICKHOUSE_HOST: "clickhouse:8123" + CLICKHOUSE_PASSWORD: "${CLICKHOUSE_PASSWORD:-default}" + CLICKHOUSE_DATABASE: "newjitsu_metrics" + DATABASE_URL: "postgresql://postgres:${POSTGRES_PASSWORD:-default}@postgres:5432/postgres?schema=newjitsu" + UDF_TIMEOUT_MS: "300000" + CONCURRENCY: "10" + healthcheck: + test: ["CMD", "curl", "-f", "http://profiles:3402/health"] + interval: 5s + timeout: 10s + retries: 15 + depends_on: + console: + condition: service_healthy + bulker: + condition: service_healthy ingest: tty: true diff --git a/libs/jitsu-js/src/analytics-plugin.ts b/libs/jitsu-js/src/analytics-plugin.ts index 701f94fe2..42b1be653 100644 --- a/libs/jitsu-js/src/analytics-plugin.ts +++ b/libs/jitsu-js/src/analytics-plugin.ts @@ -415,7 +415,7 @@ function adjustPayload( const query = parsedUrl ? parseQuery(parsedUrl.search) : {}; const properties = payload.properties || {}; - if (payload.type === "page" && url) { + if (payload.type === "page" && (properties.url || url)) { const targetUrl = properties.url || url; properties.url = targetUrl.replace(hashRegex, ""); properties.path = fixPath(urlPath(targetUrl)); From 02b301181ef542e9adc6dd4eadedda21a3b4269f Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 12 Nov 2024 12:46:33 +0400 Subject: [PATCH 0963/1353] docker-compose: remove profiles service --- docker/docker-compose.yml | 31 ------------------- .../PageLayout/WorkspacePageLayout.tsx | 2 +- 2 files changed, 1 insertion(+), 32 deletions(-) diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 8cdba11f9..243ea6705 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -184,37 +184,6 @@ services: bulker: condition: service_healthy - profiles: - tty: true - image: jitsucom/profiles:${DOCKER_TAG:-latest} - platform: linux/amd64 - restart: "unless-stopped" - environment: - ROTOR_RAW_AUTH_TOKENS: ${BULKER_TOKEN:-default} - BULKER_URL: "http://bulker:3042" - BULKER_AUTH_KEY: ${BULKER_TOKEN:-default} - # REDIS_URL: "redis://default:${REDIS_PASSWORD:-default}@redis:6379" - REPOSITORY_BASE_URL: "http://console:3000/api/admin/export/" - REPOSITORY_AUTH_TOKEN: "service-admin-account:${CONSOLE_TOKEN:-default}" - REPOSITORY_CACHE_DIR: "/tmp/cache" - MONGODB_URL: "mongodb://default:${MONGO_PASSWORD:-default}@mongo/" - CLICKHOUSE_HOST: "clickhouse:8123" - CLICKHOUSE_PASSWORD: "${CLICKHOUSE_PASSWORD:-default}" - CLICKHOUSE_DATABASE: "newjitsu_metrics" - DATABASE_URL: "postgresql://postgres:${POSTGRES_PASSWORD:-default}@postgres:5432/postgres?schema=newjitsu" - UDF_TIMEOUT_MS: "300000" - CONCURRENCY: "10" - healthcheck: - test: ["CMD", "curl", "-f", "http://profiles:3402/health"] - interval: 5s - timeout: 10s - retries: 15 - depends_on: - console: - condition: service_healthy - bulker: - condition: service_healthy - ingest: tty: true image: jitsucom/ingest:${DOCKER_TAG:-latest} diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index 10a2ab339..d6a2013ee 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -581,7 +581,7 @@ function PageHeader() { { title: "All Logs", path: "/syncs/tasks", icon: }, ], }, - { + appConfig.ee?.available && { title: "Customers", icon: , items: [{ title: "Profile Builder", path: "/profile-builder", icon: }], From 879bbbe95818c6c582ddb4289a3ef96015ef0ba1 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 12 Nov 2024 13:29:51 +0400 Subject: [PATCH 0964/1353] console: fix paddings --- webapps/console/components/BillingDetails/BillingDetails.tsx | 2 +- .../console/components/ConfigObjectEditor/ConfigEditor.tsx | 2 +- webapps/console/components/ConfigObjectEditor/EditorTitle.tsx | 2 +- .../components/ConnectionEditorPage/ConnectionEditorPage.tsx | 2 +- webapps/console/components/EventStat/EventStatPage.tsx | 2 +- webapps/console/components/SyncEditorPage/SyncEditorPage.tsx | 2 +- webapps/console/pages/[workspaceId]/connections/index.tsx | 2 +- webapps/console/pages/[workspaceId]/data.tsx | 2 +- webapps/console/pages/[workspaceId]/destinations.tsx | 2 +- .../console/pages/[workspaceId]/settings/billing/index.tsx | 2 +- webapps/console/pages/[workspaceId]/syncs/index.tsx | 2 +- webapps/console/pages/[workspaceId]/syncs/logs.tsx | 4 ++-- webapps/console/pages/[workspaceId]/syncs/tasks.tsx | 2 +- 13 files changed, 14 insertions(+), 14 deletions(-) diff --git a/webapps/console/components/BillingDetails/BillingDetails.tsx b/webapps/console/components/BillingDetails/BillingDetails.tsx index 42b3c7ba8..faa114f00 100644 --- a/webapps/console/components/BillingDetails/BillingDetails.tsx +++ b/webapps/console/components/BillingDetails/BillingDetails.tsx @@ -126,7 +126,7 @@ export const BillingDetails: React.FC = () => { return (
    -

    Billing Details

    +

    Billing Details

    = ({ geo }) => { } return ( {[ @@ -1119,11 +1195,19 @@ type IncomingEvent = { destinations: string[]; }; -const IncomingEventsTable = ({ loadEvents, loading, streamType, entityType, actorId, events }: TableProps) => { +const IncomingEventsTable = ({ + loadEvents, + loading, + streamType, + entityType, + actorId, + events, + mappedConnections, +}: TableProps) => { const appConfig = useAppConfig(); const mapEvents = evs => evs - ? evs.map(ev => { + ? evs.map((ev, i) => { let ingestPayload: any = {}; let unparsedPayload = ""; if (typeof ev.content.body === "string") { @@ -1138,7 +1222,7 @@ const IncomingEventsTable = ({ loadEvents, loading, streamType, entityType, acto const context = event?.context; return { - id: ev.id, + id: ev.date + "_" + i, date: ev.date, ingestType: ingestPayload.ingestType, @@ -1178,6 +1262,7 @@ const IncomingEventsTable = ({ loadEvents, loading, streamType, entityType, acto const columns: ColumnsType = [ { title: "", + key: "status", width: "2em", dataIndex: "status", render: d => { @@ -1196,10 +1281,12 @@ const IncomingEventsTable = ({ loadEvents, loading, streamType, entityType, acto { title: , dataIndex: "date", + key: "date", render: d => , width: "12em", }, { + key: "type", title: "Type", width: "12em", //dataIndex: "type", @@ -1260,35 +1347,35 @@ const IncomingEventsTable = ({ loadEvents, loading, streamType, entityType, acto
    {d.host && ( - + } className={"whitespace-nowrap"}> {d.host} )} {d.email && ( - + } className={"whitespace-nowrap"}> {d.email} )} {d.userId && !d.email && ( - + } className={"whitespace-nowrap"}> {d.userId.toString()} )} {d.referringDomain && d.host !== d.referringDomain && ( - + } className={"whitespace-nowrap"}> {d.referringDomain} )} {!d.userId && d.anonymousId && ( - + } className={"whitespace-nowrap"}> {d.anonymousId.toString()} @@ -1313,6 +1400,7 @@ const IncomingEventsTable = ({ loadEvents, loading, streamType, entityType, acto loading={loading} loadEvents={loadEvents} events={mapEvents(events)} + mappedConnections={mappedConnections} drawerNode={IncomingEventDrawer} columns={columns} /> diff --git a/webapps/console/components/DataView/TableWithDrawer.tsx b/webapps/console/components/DataView/TableWithDrawer.tsx index 3bec58626..96a801d8d 100644 --- a/webapps/console/components/DataView/TableWithDrawer.tsx +++ b/webapps/console/components/DataView/TableWithDrawer.tsx @@ -7,7 +7,8 @@ type TableWithDrawerProps = { columns: ColumnsType; events?: EventType[]; loadEvents: () => void; - drawerNode: React.FC<{ event: EventType }>; + mappedConnections?: Record; + drawerNode: React.FC<{ event: EventType; mappedConnections?: Record }>; className?: string; }; @@ -16,6 +17,7 @@ export const TableWithDrawer = ({ loading, columns, events, + mappedConnections, drawerNode: DrawerNode, className, }: TableWithDrawerProps) => { @@ -68,7 +70,7 @@ export const TableWithDrawer = ({ onClose={onDrawerClose} open={drawerOpen} > - {selectedEvent && } + {selectedEvent && } ); diff --git a/webapps/console/components/EventStat/EventStatPage.tsx b/webapps/console/components/EventStat/EventStatPage.tsx index 9e2736df9..8c3b9ba28 100644 --- a/webapps/console/components/EventStat/EventStatPage.tsx +++ b/webapps/console/components/EventStat/EventStatPage.tsx @@ -136,7 +136,7 @@ const ConnectionSelector = (props: { onChange: (val: string) => void; value?: st + + + Project doesn't have configured Syncs
    } style={{ width: 300 }} onChange={e => { diff --git a/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts b/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts index f39cc3c0b..5fdca12d6 100644 --- a/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts +++ b/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts @@ -26,6 +26,7 @@ export const api: Api = { limit: z.coerce.number().optional().default(50), start: z.coerce.date().optional(), end: z.coerce.date().optional(), + search: z.string().optional(), }), result: z.any(), }, @@ -58,7 +59,8 @@ export const api: Api = { ${query.levels ? "and level in ({levels:Array(String)})" : ""} ${query.start ? "and timestamp >= {start:String}" : ""} ${query.end ? "and timestamp < {end:String}" : ""} - order by timestamp desc limit {limit:UInt32}`; + ${query.search ? "and message ilike concat('%',{search:String},'%')" : ""} + order by timestamp desc limit {limit:UInt32}`; const result: any[] = []; const chResult = (await ( @@ -70,6 +72,7 @@ export const api: Api = { levels: query.levels ? query.levels.split(",") : undefined, start: query.start ? dayjs(query.start).utc().format("YYYY-MM-DD HH:mm:ss.SSS") : undefined, end: query.end ? dayjs(query.end).utc().format("YYYY-MM-DD HH:mm:ss.SSS") : undefined, + search: query.search ? query.search : undefined, limit: query.limit, }, clickhouse_settings: { diff --git a/webapps/ee-api/package.json b/webapps/ee-api/package.json index 4549b119f..9ddc517f9 100644 --- a/webapps/ee-api/package.json +++ b/webapps/ee-api/package.json @@ -25,7 +25,7 @@ "jsonwebtoken": "^9.0.2", "juava": "workspace:*", "lodash": "^4.17.21", - "next": "^15.0.2", + "next": "^15.0.3", "node-fetch-commonjs": "^3.3.2", "pg": "^8.11.3", "react": "^18.3.1", @@ -37,7 +37,7 @@ }, "devDependencies": { "eslint": "^8.57.0", - "eslint-config-next": "^15.0.2", + "eslint-config-next": "^15.0.3", "@types/crypto-js": "^4.1.1", "@types/jsonwebtoken": "^9.0.3", "@types/lodash": "^4.14.185", From 92f84c14cdef0a8094cc91265dc4586aeb1e76af Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 13 Nov 2024 17:18:27 +0400 Subject: [PATCH 0968/1353] added X-Content-Type-Options: nosniff header --- webapps/console/components/DataView/EventsBrowser.tsx | 5 ++++- webapps/console/next.config.js | 4 ++++ webapps/ee-api/next.config.js | 9 ++++++--- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/webapps/console/components/DataView/EventsBrowser.tsx b/webapps/console/components/DataView/EventsBrowser.tsx index 7915d9be8..f7045d7c1 100644 --- a/webapps/console/components/DataView/EventsBrowser.tsx +++ b/webapps/console/components/DataView/EventsBrowser.tsx @@ -286,7 +286,9 @@ const EventsBrowser0 = ({ useEffect(() => { if (!actorId || !entitiesMap[actorId]) { - patchQueryStringState("actorId", entities[0].id); + if (entities.length > 0) { + patchQueryStringState("actorId", entities[0].id); + } } }, [actorId, entities, patchQueryStringState, entitiesMap]); @@ -581,6 +583,7 @@ const EventsBrowser0 = ({ { searchFunc(e); }} diff --git a/webapps/console/next.config.js b/webapps/console/next.config.js index 02bd66d72..b8114d7cd 100644 --- a/webapps/console/next.config.js +++ b/webapps/console/next.config.js @@ -44,6 +44,10 @@ module.exports = { key: "X-Frame-Options", value: "DENY", }, + { + key: "X-Content-Type-Options", + value: "nosniff", + }, ], }, ]; diff --git a/webapps/ee-api/next.config.js b/webapps/ee-api/next.config.js index ec0187971..9ca21bbcf 100644 --- a/webapps/ee-api/next.config.js +++ b/webapps/ee-api/next.config.js @@ -21,13 +21,16 @@ const nextConfig = { key: "X-Frame-Options", value: "DENY", }, + { + key: "X-Content-Type-Options", + value: "nosniff", + }, ], }, ]; }, -} +}; -const withTM = require('next-transpile-modules')(['juava']); // pass the modules you would like to see transpiled +const withTM = require("next-transpile-modules")(["juava"]); // pass the modules you would like to see transpiled module.exports = withTM(nextConfig); - From 136538ac251899cb67dab55efde55367f72ad176 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 13 Nov 2024 18:40:45 +0400 Subject: [PATCH 0969/1353] docker-compose: Added MongoDB envs for console service functions: reduce excessive logging --- docker/docker-compose.yml | 2 ++ services/rotor/src/http/functions.ts | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 243ea6705..df2c2fc92 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -100,6 +100,8 @@ services: CLICKHOUSE_HOST: "clickhouse:8123" CLICKHOUSE_PASSWORD: "${CLICKHOUSE_PASSWORD:-default}" CLICKHOUSE_DATABASE: "newjitsu_metrics" + MONGODB_URL: "mongodb://default:${MONGO_PASSWORD:-default}@mongo/" + MONGODB_NETWORK_COMPRESSION: "none" UPDATE_DB: "true" FORCE_UPDATE_DB: "true" healthcheck: diff --git a/services/rotor/src/http/functions.ts b/services/rotor/src/http/functions.ts index d96b16098..86c6b2725 100644 --- a/services/rotor/src/http/functions.ts +++ b/services/rotor/src/http/functions.ts @@ -78,7 +78,7 @@ export const FunctionsHandlerMulti = connectionIds.forEach((id, i) => { handlerMetric.inc({ connectionId: id, status: "error" }, 1); }); - next(e); + next(`[${connectionIds}] Error processing functions: ${e.name}: ${e.message}`); }); }; From c9af6963a04873b7af2fef39f87c5e425c0df4c1 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 14 Nov 2024 12:22:42 +0400 Subject: [PATCH 0970/1353] console: SQLViewer: don't use 500 code for error in queries --- .../components/SQLViewer/SQLViewer.tsx | 8 ++- .../pages/api/[workspaceId]/sql/query.ts | 65 ++++++++++--------- 2 files changed, 42 insertions(+), 31 deletions(-) diff --git a/webapps/console/components/SQLViewer/SQLViewer.tsx b/webapps/console/components/SQLViewer/SQLViewer.tsx index 4c78c0192..30dbb48d1 100644 --- a/webapps/console/components/SQLViewer/SQLViewer.tsx +++ b/webapps/console/components/SQLViewer/SQLViewer.tsx @@ -151,8 +151,12 @@ const SQLViewer: React.FC = ({ destinationId }) => { query: { destinationId }, body: { query: sql, offset: offset, limit: limit }, }); - setResults(res); - setLastQuery({ sql, offset: res.offset, limit: res.limit }); + if (res.error) { + setError(res.error); + } else { + setResults(res); + setLastQuery({ sql, offset: res.offset, limit: res.limit }); + } } catch (e) { setError(e); } finally { diff --git a/webapps/console/pages/api/[workspaceId]/sql/query.ts b/webapps/console/pages/api/[workspaceId]/sql/query.ts index c96f36cc6..bf0367563 100644 --- a/webapps/console/pages/api/[workspaceId]/sql/query.ts +++ b/webapps/console/pages/api/[workspaceId]/sql/query.ts @@ -25,14 +25,17 @@ export const getClickhouseClient = (workspaceId: string, cred: ClickhouseCredent export const columnType = z.object({ name: z.string(), type: z.string() }); export type columnType = z.infer; -const resultType = z.object({ - meta: z.array(columnType), - data: z.array(z.object({}).passthrough()), - rows: z.number(), - limit: z.number(), - offset: z.number(), - statistics: z.object({}).passthrough(), -}); +const resultType = z.union([ + z.object({ + meta: z.array(columnType), + data: z.array(z.object({}).passthrough()), + rows: z.number(), + limit: z.number(), + offset: z.number(), + statistics: z.object({}).passthrough(), + }), + z.object({ error: z.string() }), +]); export type SQLResultType = z.infer; @@ -59,29 +62,33 @@ export default createRoute() }), `Destination ${destinationId} not found` ); - const cred = ClickhouseCredentials.parse(destination.config); - if (!destination?.config?.["provisioned"] && cred.protocol !== "https") { - throw new Error( - `At this moment, queries are only supported for HTTPS ClickHouse. Destination ${destinationId} uses ${cred.protocol} ` - ); - } - const clickhouse = getClickhouseClient(workspaceId, cred); + try { + const cred = ClickhouseCredentials.parse(destination.config); + if (!destination?.config?.["provisioned"] && cred.protocol !== "https") { + throw new Error( + `At this moment, queries are only supported for HTTPS ClickHouse. Destination ${destinationId} uses ${cred.protocol} ` + ); + } + const clickhouse = getClickhouseClient(workspaceId, cred); - const adjustedQuery = adjustQuery(body.query, body.limit || SQLQueryDefaultLimit, body.offset); + const adjustedQuery = adjustQuery(body.query, body.limit || SQLQueryDefaultLimit, body.offset); - const resultSet = await clickhouse.query({ - query: adjustedQuery.query, - clickhouse_settings: { - wait_end_of_query: 1, - }, - }); - let index = adjustedQuery.offset + 1; - const result = (await resultSet.json()) as any; - result.data = result.data.map(row => { - return { "#": index++, ...row }; - }); - result.meta = [{ name: "#", type: "UInt64" }, ...result.meta]; - return { ...result, limit: adjustedQuery.limit, offset: adjustedQuery.offset }; + const resultSet = await clickhouse.query({ + query: adjustedQuery.query, + clickhouse_settings: { + wait_end_of_query: 1, + }, + }); + let index = adjustedQuery.offset + 1; + const result = (await resultSet.json()) as any; + result.data = result.data.map(row => { + return { "#": index++, ...row }; + }); + result.meta = [{ name: "#", type: "UInt64" }, ...result.meta]; + return { ...result, limit: adjustedQuery.limit, offset: adjustedQuery.offset }; + } catch (e) { + return { error: e.message }; + } }) .GET({ description: "List all destinations that support SQL queries for a given workspace", From e0ee2e0f846bbd92441613509c230c2782cfafff Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 14 Nov 2024 12:41:34 +0400 Subject: [PATCH 0971/1353] console: SQLViewer: don't use 500 code for error in queries --- .../pages/api/[workspaceId]/sql/query.ts | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/webapps/console/pages/api/[workspaceId]/sql/query.ts b/webapps/console/pages/api/[workspaceId]/sql/query.ts index bf0367563..cb493066c 100644 --- a/webapps/console/pages/api/[workspaceId]/sql/query.ts +++ b/webapps/console/pages/api/[workspaceId]/sql/query.ts @@ -25,19 +25,17 @@ export const getClickhouseClient = (workspaceId: string, cred: ClickhouseCredent export const columnType = z.object({ name: z.string(), type: z.string() }); export type columnType = z.infer; -const resultType = z.union([ - z.object({ - meta: z.array(columnType), - data: z.array(z.object({}).passthrough()), - rows: z.number(), - limit: z.number(), - offset: z.number(), - statistics: z.object({}).passthrough(), - }), - z.object({ error: z.string() }), -]); +const successfulResult = z.object({ + meta: z.array(columnType), + data: z.array(z.object({}).passthrough()), + rows: z.number(), + limit: z.number(), + offset: z.number(), + statistics: z.object({}).passthrough(), +}); +const resultType = z.union([successfulResult, z.object({ error: z.string() })]); -export type SQLResultType = z.infer; +export type SQLResultType = z.infer; export default createRoute() .POST({ @@ -86,7 +84,7 @@ export default createRoute() }); result.meta = [{ name: "#", type: "UInt64" }, ...result.meta]; return { ...result, limit: adjustedQuery.limit, offset: adjustedQuery.offset }; - } catch (e) { + } catch (e: any) { return { error: e.message }; } }) From 7ad83e68b49a5681cc0b00e697f2b51f9f1bbd70 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 14 Nov 2024 15:07:05 +0400 Subject: [PATCH 0972/1353] fix --- .../components/ProfileBuilderPage/ProfileBuilderPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/components/ProfileBuilderPage/ProfileBuilderPage.tsx b/webapps/console/components/ProfileBuilderPage/ProfileBuilderPage.tsx index b7d7c5b66..0dcbcd729 100644 --- a/webapps/console/components/ProfileBuilderPage/ProfileBuilderPage.tsx +++ b/webapps/console/components/ProfileBuilderPage/ProfileBuilderPage.tsx @@ -219,7 +219,7 @@ const SettingsTab: React.FC<{ profileBuilder: ProfileBuilderData; dispatch: Reac documentation: <>Select the destination database where the profiles will be stored, component: ( dispatch({ type: "settings", value: { ...settings, destinationId: d } })} From e8bfcec74b4c5004ae874e2adaf08ee730c70d0c Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 14 Nov 2024 15:26:30 +0400 Subject: [PATCH 0973/1353] console: improve CodeEditor --- .../components/CodeEditor/CodeEditor.tsx | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/webapps/console/components/CodeEditor/CodeEditor.tsx b/webapps/console/components/CodeEditor/CodeEditor.tsx index 3f69c29ce..7c900b550 100644 --- a/webapps/console/components/CodeEditor/CodeEditor.tsx +++ b/webapps/console/components/CodeEditor/CodeEditor.tsx @@ -35,23 +35,25 @@ export const CodeEditor: React.FC = ({ const editorRef = useRef(null); const [mounted, setMounted] = React.useState(false); const handleChange = onChange; - const handleChangePosition = debounce(changePosition ?? (() => {}), 100); + const handleChangePosition = changePosition ? debounce(changePosition, 100) : undefined; const handleEditorDidMount = useCallback( (editor, monaco) => { - if (foldLevel) { - editor.getAction(`editor.foldLevel${foldLevel}`)?.run(); - } editorRef.current = editor; if (typeof value !== "undefined") { editor.setValue(value); } + if (foldLevel) { + editor.getAction(`editor.foldLevel${foldLevel}`)?.run(); + } if (extraSuggestions) { monaco.languages.typescript.javascriptDefaults.setExtraLibs([{ content: extraSuggestions }]); } - editor.onDidChangeCursorPosition(e => { - handleChangePosition(editor.getModel().getOffsetAt(e.position)); - }); + if (handleChangePosition) { + editor.onDidChangeCursorPosition(e => { + handleChangePosition?.(editor.getModel().getOffsetAt(e.position)); + }); + } setMounted(true); }, [extraSuggestions, foldLevel, handleChangePosition, value] @@ -83,14 +85,18 @@ export const CodeEditor: React.FC = ({ const editor = editorRef.current; if (editor && editor.getValue() !== value) { const positionShift = value.length - editor.getValue().length; - const position = editor.getPosition(); - editor.setValue(value); - editor.setPosition({ ...position, column: position.column + positionShift }); - //scroll to the end of the line - editor.revealPosition({ ...position, column: position.column + positionShift + 100 }); - editor.focus(); - if (foldLevel) { - editor.getAction(`editor.foldLevel${foldLevel}`)?.run(); + if (Math.abs(positionShift) > 2) { + // we respect prop.value change only if it's more than 2 characters + // otherwise, it's probably user is typing, and we don't want to rollback what he typed due to delay in props update + const position = editor.getPosition(); + editor.setValue(value); + editor.setPosition({ ...position, column: position.column + positionShift }); + //scroll to the end of the line + editor.revealPosition({ ...position, column: position.column + positionShift + 100 }); + editor.focus(); + if (foldLevel) { + editor.getAction(`editor.foldLevel${foldLevel}`)?.run(); + } } } }, [value, foldLevel]); From 739a48f20b9a8cabd63f19aa124e69e06d28e122 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 14 Nov 2024 15:31:49 +0400 Subject: [PATCH 0974/1353] console: SQLViewer fix --- webapps/console/components/SQLViewer/SQLViewer.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/webapps/console/components/SQLViewer/SQLViewer.tsx b/webapps/console/components/SQLViewer/SQLViewer.tsx index 30dbb48d1..5a5376bdf 100644 --- a/webapps/console/components/SQLViewer/SQLViewer.tsx +++ b/webapps/console/components/SQLViewer/SQLViewer.tsx @@ -90,6 +90,7 @@ const SchemaTree: React.FC = ({ onColumnSelect, onTableSelect, isLeaf: true, checkable: false, title: {trimMiddle(column.name, 28)}, + value: column.name, key: `${name}_${column.name}`, }; }), @@ -104,7 +105,7 @@ const SchemaTree: React.FC = ({ onColumnSelect, onTableSelect, { if (e.node.isLeaf) { - onColumnSelect?.(e.node.key); + onColumnSelect?.(e.node["value"]); } }} selectable={false} From 12f79fb93ad3e84e2e0593b4af1e03040ae5f01e Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 15 Nov 2024 20:07:44 +0400 Subject: [PATCH 0975/1353] prettier fix --- .../components/FunctionsDebugger/FunctionsDebugger.module.css | 1 - 1 file changed, 1 deletion(-) diff --git a/webapps/console/components/FunctionsDebugger/FunctionsDebugger.module.css b/webapps/console/components/FunctionsDebugger/FunctionsDebugger.module.css index 78e675d6f..ed5312e10 100644 --- a/webapps/console/components/FunctionsDebugger/FunctionsDebugger.module.css +++ b/webapps/console/components/FunctionsDebugger/FunctionsDebugger.module.css @@ -27,4 +27,3 @@ .splitterFix :global(.ant-splitter-bar-dragger::before) { background-color: white !important; } - From 77b98cb255a276c3eb04c39871fb9bdce2e0dbf3 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Fri, 15 Nov 2024 13:40:06 -0500 Subject: [PATCH 0976/1353] feat: now, @jitsu/js client won't throw an error on .track() and other methods unless it's explicitely specified by user. Plus, few enhancements in package.json runner --- libs/jitsu-js/src/analytics-plugin.ts | 25 +++++++++++++++++++++++-- package.json | 2 +- types/protocols/analytics.d.ts | 7 +++++++ webapps/console/package.json | 2 +- 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/libs/jitsu-js/src/analytics-plugin.ts b/libs/jitsu-js/src/analytics-plugin.ts index 42b1be653..6c3a637eb 100644 --- a/libs/jitsu-js/src/analytics-plugin.ts +++ b/libs/jitsu-js/src/analytics-plugin.ts @@ -10,6 +10,7 @@ import { ID, JSONObject, Options, + ErrorHandler, } from "@jitsu/protocols/analytics"; import parse from "./index"; @@ -35,6 +36,7 @@ const defaultConfig: Required = { fetchTimeoutMs: undefined, s2s: undefined, idEndpoint: undefined, + errorPolicy: "log", privacy: { dontSend: false, disableUserIds: false, @@ -628,6 +630,22 @@ function maskWriteKey(writeKey?: string): string | undefined { return writeKey; } +function getErrorHandler(opts: JitsuOptions): ErrorHandler { + const configuredHandler = opts.errorPolicy || "log"; + if (typeof configuredHandler === "function") { + return configuredHandler; + } else if (configuredHandler === "rethrow") { + return e => { + throw e; + }; + } else { + //"log" and unsupported value + return e => { + console.error(`[JITSU ERROR] ${e?.message || e?.toString() || "unknown error"}`, e); + }; + } +} + async function send( method, payload, @@ -643,6 +661,7 @@ async function send( const url = s2s ? `${jitsuConfig.host}/api/s/s2s/${method}` : `${jitsuConfig.host}/api/s/${method}`; const fetch = jitsuConfig.fetch || globalThis.fetch; if (!fetch) { + //don't run it through error handler since error is critical and should be addressed throw new Error( "Please specify fetch function in jitsu plugin initialization, fetch isn't available in global scope" ); @@ -682,7 +701,8 @@ async function send( clearTimeout(abortTimeout); } } catch (e: any) { - throw new Error(`Calling ${url} failed: ${e.message}`); + getErrorHandler(jitsuConfig)(new Error(`Calling ${url} failed: ${e.message}`)); + return Promise.resolve(); } let responseText; try { @@ -709,7 +729,8 @@ async function send( try { responseJson = JSON.parse(responseText); } catch (e) { - return Promise.reject(`Can't parse JSON: ${responseText}: ${e?.message}`); + getErrorHandler(jitsuConfig)(new Error(`Can't parse JSON: ${responseText}: ${e?.message}`)); + return Promise.resolve(); } if (responseJson.destinations && responseJson.destinations.length > 0) { diff --git a/package.json b/package.json index 8557f9574..bf9ff08f9 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "console:dev": "dotenv -e .env.local -- turbo run console:dev", "console:storybook": "dotenv -e .env.local -- turbo run console:storybook", "rotor:dev": "dotenv -e .env.local -- turbo run rotor:dev", - "console:start": "dotenv -e .env.local -- pnpm run --filter=console console:start", + "console:start": "dotenv -e .env.local -- turbo run console:start", "console:db-prepare": "dotenv -e .env.local -- pnpm run --filter=console db:update-schema", "console:db-prepare-force": "dotenv -e .env.local -- pnpm run --filter=console db:update-schema-force", "dev": "dotenv -e .env.local -- turbo run dev", diff --git a/types/protocols/analytics.d.ts b/types/protocols/analytics.d.ts index 5247e41db..98c6d88ed 100644 --- a/types/protocols/analytics.d.ts +++ b/types/protocols/analytics.d.ts @@ -316,6 +316,8 @@ export type RuntimeFacade = { pageTitle(): string | undefined; }; +export type ErrorHandler = (error: any) => void; + export type JitsuOptions = { /** * API Key. Optional. If not set, Jitsu will send event to the server without auth, and server @@ -372,6 +374,11 @@ export type JitsuOptions = { */ idEndpoint?: string; + /** + * What to do with errors. It can log it, rethrow or run a custom handler. Default value: "log" + */ + errorPolicy?: ErrorHandler | "rethrow" | "log"; + privacy?: { dontSend?: boolean; disableUserIds?: boolean; diff --git a/webapps/console/package.json b/webapps/console/package.json index 6ee276da5..1fbdfbf88 100644 --- a/webapps/console/package.json +++ b/webapps/console/package.json @@ -12,8 +12,8 @@ "prisma": "prisma", "lint": "next lint", "console:dev": "next dev", - "dev:rotor": "ts-node service/rotor.ts", "console:start": "next start", + "dev:rotor": "ts-node service/rotor.ts", "build": "prisma generate && next build", "clean": "rm -rf ./.next ./.turbo", "compile": "tsc -p .", From bf5020eda522f22e291ef41b718defc359d8fe34 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 18 Nov 2024 17:46:28 +0400 Subject: [PATCH 0977/1353] fix --- webapps/console/pages/[workspaceId]/connections/edit.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/webapps/console/pages/[workspaceId]/connections/edit.tsx b/webapps/console/pages/[workspaceId]/connections/edit.tsx index c0c9b8095..1bea4d48d 100644 --- a/webapps/console/pages/[workspaceId]/connections/edit.tsx +++ b/webapps/console/pages/[workspaceId]/connections/edit.tsx @@ -14,12 +14,10 @@ type FunctionAPIResult = { error: any; }; const Loader = () => { - const workspace = useWorkspace(); - const functionsApi = useConfigApi("function"); const links = useConfigObjectLinks({ withData: true }); const streams = useConfigObjectList("stream"); const destinations = useConfigObjectList("destination"); - const functions = useConfigObjectList("function"); + const functions = useConfigObjectList("function").filter(f => f.kind !== "profile"); return ( Date: Mon, 18 Nov 2024 18:02:31 +0400 Subject: [PATCH 0978/1353] fix --- webapps/console/pages/[workspaceId]/connections/edit.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/webapps/console/pages/[workspaceId]/connections/edit.tsx b/webapps/console/pages/[workspaceId]/connections/edit.tsx index 1bea4d48d..d1ea8bbd6 100644 --- a/webapps/console/pages/[workspaceId]/connections/edit.tsx +++ b/webapps/console/pages/[workspaceId]/connections/edit.tsx @@ -1,8 +1,6 @@ import { WorkspacePageLayout } from "../../../components/PageLayout/WorkspacePageLayout"; -import { useWorkspace } from "../../../lib/context"; import React from "react"; import ConnectionEditorPage from "../../../components/ConnectionEditorPage/ConnectionEditorPage"; -import { useConfigApi } from "../../../lib/useApi"; import { FunctionConfig } from "../../../lib/schema"; import { useConfigObjectLinks, useConfigObjectList } from "../../../lib/store"; import { z } from "zod"; From 945d5f7d85116d8082f09dc4c9ea632f8818c952 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 20 Nov 2024 14:50:24 +0400 Subject: [PATCH 0979/1353] EventsBrowser: properly reset error state --- webapps/console/components/DataView/EventsBrowser.tsx | 2 ++ .../pages/api/[workspaceId]/log/[type]/[actorId].ts | 10 ++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/webapps/console/components/DataView/EventsBrowser.tsx b/webapps/console/components/DataView/EventsBrowser.tsx index f7045d7c1..a8b9dfa8b 100644 --- a/webapps/console/components/DataView/EventsBrowser.tsx +++ b/webapps/console/components/DataView/EventsBrowser.tsx @@ -96,6 +96,7 @@ function eventStreamReducer(state: EventsBrowserState, action: any) { } else if (action.type === "resetAndPatch") { return { ...state, + error: undefined, events: undefined, beforeDate: undefined, refreshTime: state.initDate, @@ -376,6 +377,7 @@ const EventsBrowser0 = ({ if (error) { patch.error = error; } else { + patch.error = undefined; if (addEvents) { patch.addEvents = addEvents; } else if (events) { diff --git a/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts b/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts index 5fdca12d6..06ef7bce4 100644 --- a/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts +++ b/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts @@ -26,7 +26,8 @@ export const api: Api = { limit: z.coerce.number().optional().default(50), start: z.coerce.date().optional(), end: z.coerce.date().optional(), - search: z.string().optional(), + //people can search for ISO timestamps. that we automatically convert to date + search: z.any().optional(), }), result: z.any(), }, @@ -72,7 +73,12 @@ export const api: Api = { levels: query.levels ? query.levels.split(",") : undefined, start: query.start ? dayjs(query.start).utc().format("YYYY-MM-DD HH:mm:ss.SSS") : undefined, end: query.end ? dayjs(query.end).utc().format("YYYY-MM-DD HH:mm:ss.SSS") : undefined, - search: query.search ? query.search : undefined, + search: + typeof query.search === "undefined" + ? undefined + : query.search instanceof Date + ? query.search.toISOString() + : query.search, limit: query.limit, }, clickhouse_settings: { From 7240351e2607903a366cbdd63b12c6879f5e83de Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 20 Nov 2024 15:00:20 +0400 Subject: [PATCH 0980/1353] SchemaForm: give multiline attribute higher priority --- .../console/components/ConfigObjectEditor/SchemaForm.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx b/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx index 9ee2f4518..8c74b9653 100644 --- a/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx +++ b/webapps/console/components/ConfigObjectEditor/SchemaForm.tsx @@ -201,10 +201,14 @@ export const SchemaForm: React.FC<{ /> ); } + if (f.multiline) { + return ; + } if (f.airbyte_secret) { return ; } - return ; + + return ; case "boolean": return ; case "array": From 9bdebd7809ecc4d5fc99417994c0946a1e2f492b Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Mon, 25 Nov 2024 17:30:35 -0500 Subject: [PATCH 0981/1353] feat (@jitsu/js): error handler customization refactored, added $doNotSend instruction for .group() .indentify() call --- .../__tests__/playwright/cases/reset.html | 1 + .../__tests__/playwright/integration.test.ts | 3 ++ libs/jitsu-js/src/analytics-plugin.ts | 54 ++++++++++++++----- types/protocols/analytics.d.ts | 19 +++++-- 4 files changed, 61 insertions(+), 16 deletions(-) diff --git a/libs/jitsu-js/__tests__/playwright/cases/reset.html b/libs/jitsu-js/__tests__/playwright/cases/reset.html index 8437c480c..4b3637f69 100644 --- a/libs/jitsu-js/__tests__/playwright/cases/reset.html +++ b/libs/jitsu-js/__tests__/playwright/cases/reset.html @@ -10,6 +10,7 @@ window.testOnload = async j => { await j.setAnonymousId("john-doe-id-1"); await j.identify("john-nondoe", { email: "john@example.com" }); + await j.identify("john-nondoe", { email: "john2@example.com", $doNotSend: true }); await j.track("pageLoaded", { trackParam: "trackValue" }); await j.reset(); await j.track("pageLoaded", { trackParam: "trackValue" }); diff --git a/libs/jitsu-js/__tests__/playwright/integration.test.ts b/libs/jitsu-js/__tests__/playwright/integration.test.ts index 415a4e906..453d731db 100644 --- a/libs/jitsu-js/__tests__/playwright/integration.test.ts +++ b/libs/jitsu-js/__tests__/playwright/integration.test.ts @@ -273,6 +273,9 @@ test("reset", async ({ browser }) => { const newAnonymousId = cookies[0].value; console.log(`🍪Cookies`, cookies); + //second identify call should not reach the server, but it should change the traits + expect(firstTrack.body.context.traits?.email).toEqual("john2@example.com"); + expect(secondTrack.body.anonymousId).not.toBeNull(); expect(secondTrack.body.anonymousId).toBeDefined(); expect(secondTrack.body.anonymousId).toEqual(newAnonymousId); diff --git a/libs/jitsu-js/src/analytics-plugin.ts b/libs/jitsu-js/src/analytics-plugin.ts index 6c3a637eb..0f26da9a7 100644 --- a/libs/jitsu-js/src/analytics-plugin.ts +++ b/libs/jitsu-js/src/analytics-plugin.ts @@ -1,16 +1,17 @@ /* global analytics */ import { - DynamicJitsuOptions, - JitsuOptions, - PersistentStorage, - RuntimeFacade, AnalyticsClientEvent, Callback, + DynamicJitsuOptions, + ErrorHandler, ID, + JitsuOptions, JSONObject, Options, - ErrorHandler, + PersistentStorage, + RuntimeFacade, + Traits, } from "@jitsu/protocols/analytics"; import parse from "./index"; @@ -635,13 +636,13 @@ function getErrorHandler(opts: JitsuOptions): ErrorHandler { if (typeof configuredHandler === "function") { return configuredHandler; } else if (configuredHandler === "rethrow") { - return e => { - throw e; + return (msg, ...args) => { + //ignore args, not clear what to do with them + throw new Error(msg); }; } else { - //"log" and unsupported value - return e => { - console.error(`[JITSU ERROR] ${e?.message || e?.toString() || "unknown error"}`, e); + return (msg, ...args) => { + console.error(msg, ...args); }; } } @@ -701,7 +702,7 @@ async function send( clearTimeout(abortTimeout); } } catch (e: any) { - getErrorHandler(jitsuConfig)(new Error(`Calling ${url} failed: ${e.message}`)); + getErrorHandler(jitsuConfig)(`Call to ${url} failed with error ${e.message}`); return Promise.resolve(); } let responseText; @@ -729,7 +730,7 @@ async function send( try { responseJson = JSON.parse(responseText); } catch (e) { - getErrorHandler(jitsuConfig)(new Error(`Can't parse JSON: ${responseText}: ${e?.message}`)); + getErrorHandler(jitsuConfig)(`Can't parse JSON: ${responseText}: ${e?.message}`); return Promise.resolve(); } @@ -752,6 +753,23 @@ async function send( return adjustedPayload; } +const controllingTraits = ["$doNotSend"] as const; +/** + * Remove all members of traits that controls identify/group behavior (see analytics.d.ts), and should not be recorded. Returns + * copy of the object with these members removed. + * + * Do not modify traits object, but creates one + * @param traits + */ +function stripControllingTraits(traits: Traits): Exclude { + const res = { ...traits }; + // see Traits definition in analytics.d.ts. We cannot define const here, so here's a little code duplication + for (const key of controllingTraits) { + delete res[key]; + } + return res; +} + export const jitsuAnalyticsPlugin = (jitsuOptions: JitsuOptions = {}, storage: PersistentStorage): AnalyticsPlugin => { // just to make sure that all undefined values are replaced with defaultConfig values mergeConfig(jitsuOptions, jitsuOptions); @@ -814,9 +832,16 @@ export const jitsuAnalyticsPlugin = (jitsuOptions: JitsuOptions = {}, storage: P } // Store traits in cache to be able to use them in page and track events that run asynchronously with current identify. storage.setItem("__user_id", payload.userId); + const doNotSend = payload.traits?.$doNotSend; if (payload.traits && typeof payload.traits === "object") { + payload.traits = stripControllingTraits(payload.traits); storage.setItem("__user_traits", payload.traits); } + console.log("payload", payload); + console.log("do not send value", payload.traits?.$doNotSend); + if (doNotSend) { + return Promise.resolve(); + } return send("identify", payload, config, instance, storage); }, reset: args => { @@ -860,9 +885,14 @@ export const jitsuAnalyticsPlugin = (jitsuOptions: JitsuOptions = {}, storage: P const userId = options?.userId || user?.userId; const anonymousId = options?.anonymousId || user?.anonymousId || storage.getItem("__anon_id"); storage.setItem("__group_id", groupId); + const doNotSend = traits?.$doNotSend; if (traits && typeof traits === "object") { + traits = stripControllingTraits(traits); storage.setItem("__group_traits", traits); } + if (doNotSend) { + return Promise.resolve(); + } return send( "group", { type: "group", groupId, traits, ...(anonymousId ? { anonymousId } : {}), ...(userId ? { userId } : {}) }, diff --git a/types/protocols/analytics.d.ts b/types/protocols/analytics.d.ts index 98c6d88ed..53dba6461 100644 --- a/types/protocols/analytics.d.ts +++ b/types/protocols/analytics.d.ts @@ -189,7 +189,7 @@ interface AnalyticsContext { locale?: string; - library?: { + xlibrary?: { name: string; version: string; //allow to add custom fields @@ -316,7 +316,7 @@ export type RuntimeFacade = { pageTitle(): string | undefined; }; -export type ErrorHandler = (error: any) => void; +export type ErrorHandler = (message: string, ...args: any[]) => void; export type JitsuOptions = { /** @@ -389,6 +389,17 @@ export type JitsuOptions = { export type DynamicJitsuOptions = Pick; +export type Traits = { + [key: string]: JSONValue; + //some traits, all starting with $, are reserved for signalling the behavior of the event + + /** + * Tells Jitsu to process event, but not send it to server. Used for .identify() and .group() calls + * that are intended to update user/group state, but not send events + */ + $doNotSend?: boolean; +}; + export interface AnalyticsInterface { track( eventName: string | JSONObject, @@ -407,12 +418,12 @@ export interface AnalyticsInterface { group( groupId?: ID | object, - traits?: JSONObject | null, + traits?: Traits | null, options?: Options, callback?: Callback ): Promise; - identify(id?: ID | object, traits?: JSONObject | Callback | null, callback?: Callback): Promise; + identify(id?: ID | Traits, traits?: Traits | Callback | null, callback?: Callback): Promise; reset(callback?: (...params: any[]) => any): Promise; From e5a85cf3d7c9095223ec3ca3a33c125f8a342da3 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 27 Nov 2024 12:59:41 +0400 Subject: [PATCH 0982/1353] rotor: devnull: fix for events shown as skipped rotor: bulker-destination: _timestamp in legacy layout now set with received time as it used to be in Classic --- libs/core-functions/src/functions/bulker-destination.ts | 2 +- libs/core-functions/src/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/core-functions/src/functions/bulker-destination.ts b/libs/core-functions/src/functions/bulker-destination.ts index 7deccdd7c..82faf48e7 100644 --- a/libs/core-functions/src/functions/bulker-destination.ts +++ b/libs/core-functions/src/functions/bulker-destination.ts @@ -141,7 +141,7 @@ export function jitsuLegacy(event: AnalyticsServerEvent, ctx: FullContext "builtin.destination.amplitude": AmplitudeDestination as JitsuFunction, "builtin.destination.facebook-conversions": FacebookConversionsApi as JitsuFunction, "builtin.destination.hubspot": HubspotDestination as JitsuFunction, - "builtin.destination.devnull": () => null, + "builtin.destination.devnull": () => undefined, "builtin.destination.tag": () => undefined, "builtin.destination.gtm": () => undefined, "builtin.destination.logrocket": () => undefined, From 961a58b719b756863e506d6aabbd993320fefff1 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 27 Nov 2024 13:31:49 +0400 Subject: [PATCH 0983/1353] fix test --- .../__tests__/datalayout-jitsu-legacy.test.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libs/core-functions/__tests__/datalayout-jitsu-legacy.test.ts b/libs/core-functions/__tests__/datalayout-jitsu-legacy.test.ts index 9bec6f309..145d1ac2f 100644 --- a/libs/core-functions/__tests__/datalayout-jitsu-legacy.test.ts +++ b/libs/core-functions/__tests__/datalayout-jitsu-legacy.test.ts @@ -39,6 +39,7 @@ const identify: AnalyticsServerEvent = { "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/107.0.5304.18 Safari/537.36", }, sentAt: "2022-11-14T08:56:34.387Z", + receivedAt: "2022-11-14T08:56:40.000Z", timestamp: "2022-11-14T08:56:34.387Z", traits: { caseName: "basic-identify", @@ -51,7 +52,7 @@ const identify: AnalyticsServerEvent = { }; const legacyIdentifyExpected: Omit & { local_tz_offset?: number } = { - _timestamp: "2022-11-14T08:56:34.387Z", + _timestamp: "2022-11-14T08:56:40.000Z", anon_ip: "141.136.89.0", doc_path: "/basic.html", doc_search: "?utm_source=source&utm_medium=medium&utm_campaign=campaign", @@ -137,6 +138,7 @@ const page: AnalyticsServerEvent = { url: "https://localhost:3088/basic.html?utm_source=source&utm_medium=medium&utm_campaign=campaign", width: 1280, }, + receivedAt: "2022-11-14T08:56:40.000Z", sentAt: "2022-11-14T08:56:34.395Z", timestamp: "2022-11-14T08:56:34.395Z", type: "page", @@ -144,7 +146,7 @@ const page: AnalyticsServerEvent = { }; const legacyPageExpected = { - _timestamp: "2022-11-14T08:56:34.395Z", + _timestamp: "2022-11-14T08:56:40.000Z", api_key: "", click_id: {}, doc_host: "localhost", From 71d1118831fea0dac90747f0a57f7474cff81998 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 28 Nov 2024 15:54:50 +0400 Subject: [PATCH 0984/1353] rotor: bulker-destination: check for events size --- .../src/functions/bulker-destination.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/libs/core-functions/src/functions/bulker-destination.ts b/libs/core-functions/src/functions/bulker-destination.ts index 82faf48e7..afd677374 100644 --- a/libs/core-functions/src/functions/bulker-destination.ts +++ b/libs/core-functions/src/functions/bulker-destination.ts @@ -363,12 +363,21 @@ const BulkerDestination: JitsuFunction 1000000) { + throw new Error( + `Max allowed size is 1 000 000 bytes. Event size is: ${payload.length} bytes: \n${payload.substring( + 0, + 256 + )}...` + ); + } const res = await ctx.fetch( `${bulkerEndpoint}/post/${destinationId}?tableName=${table}`, { method: "POST", headers: { Authorization: `Bearer ${authToken}`, metricsMeta: JSON.stringify(metricsMeta) }, - body: JSON.stringify(event), + body: payload, }, { log: false } ); From 93ce6c2dcc1a3578a5ee0a3eb38a643f0692f0ce Mon Sep 17 00:00:00 2001 From: EPuluikis Date: Thu, 28 Nov 2024 15:11:45 +0200 Subject: [PATCH 0985/1353] fix: remove unnecessary console.log (#1150) --- libs/jitsu-js/src/analytics-plugin.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/libs/jitsu-js/src/analytics-plugin.ts b/libs/jitsu-js/src/analytics-plugin.ts index 0f26da9a7..7b94ead0d 100644 --- a/libs/jitsu-js/src/analytics-plugin.ts +++ b/libs/jitsu-js/src/analytics-plugin.ts @@ -837,8 +837,6 @@ export const jitsuAnalyticsPlugin = (jitsuOptions: JitsuOptions = {}, storage: P payload.traits = stripControllingTraits(payload.traits); storage.setItem("__user_traits", payload.traits); } - console.log("payload", payload); - console.log("do not send value", payload.traits?.$doNotSend); if (doNotSend) { return Promise.resolve(); } From d071368c456bc56922b6db7ec645b57fe356fa62 Mon Sep 17 00:00:00 2001 From: Washington L Braga Jr Date: Thu, 28 Nov 2024 10:13:42 -0300 Subject: [PATCH 0986/1353] Allow context overrides through `options` argument (#1149) --- libs/jitsu-js/src/analytics-plugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/jitsu-js/src/analytics-plugin.ts b/libs/jitsu-js/src/analytics-plugin.ts index 7b94ead0d..bda966126 100644 --- a/libs/jitsu-js/src/analytics-plugin.ts +++ b/libs/jitsu-js/src/analytics-plugin.ts @@ -424,7 +424,7 @@ function adjustPayload( properties.path = fixPath(urlPath(targetUrl)); } - const customContext = payload.properties?.context || {}; + const customContext = payload.properties?.context || payload.options?.context || {}; delete payload.properties?.context; const referrer = runtime.referrer(); const context: AnalyticsClientEvent["context"] = { From 0d91c1006c812ed27d8ff788ecdfb7cde9952d80 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 29 Nov 2024 11:07:02 +0400 Subject: [PATCH 0987/1353] console: events log api: use streaming and gzip compression --- libs/juava/src/rpc.ts | 13 +++ package.json | 2 +- .../api/[workspaceId]/log/[type]/[actorId].ts | 106 +++++++++++------- .../pages/api/[workspaceId]/sources/logs.ts | 36 ++++-- 4 files changed, 110 insertions(+), 47 deletions(-) diff --git a/libs/juava/src/rpc.ts b/libs/juava/src/rpc.ts index b75ad4a66..656c146e5 100644 --- a/libs/juava/src/rpc.ts +++ b/libs/juava/src/rpc.ts @@ -108,6 +108,19 @@ export const rpc: RpcFunc = async (url, { body, ...rest } = {}) => { } if ((result.headers.get("Content-Type") ?? "").startsWith("application/json")) { return await parseJsonResponse(result, method, url); + } else if ((result.headers.get("Content-Type") ?? "").startsWith("application/x-ndjson")) { + const text = await result.text(); + return text + .split("\n") + .filter(line => line.length > 0) + .map(line => { + try { + return JSON.parse(line); + } catch (e) { + console.error(`Error parsing JSON line from ${method} ${url}: ${getErrorMessage(e)}`); + return undefined; + } + }); } else { return await result.text(); } diff --git a/package.json b/package.json index bf9ff08f9..6784b463e 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "lint": "turbo run lint --", "release": "pnpm build && pnpm test && monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/functions --filter ./libs/jitsu-js --filter ./libs/jitsu-react --npm-tag latest --git-tag 'jitsu-js-libs-v{version}' --push-tag", "release:build-scripts": "pnpm build --filter ./cli/build-scripts && monorel --filter ./cli/build-scripts --npm-tag latest --version 0.0.4-dev.{rev}.{time} --publish --git-tag 'jitsu-build-scripts-v{version}'", - "release:canary": "monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/functions --filter ./libs/jitsu-js --filter ./libs/jitsu-react --version '1.9.11-canary.{rev}.{time}' --npm-tag canary --git-tag 'jitsu-js-libs-canary-v{version}' --push-tag" + "release:canary": "monorel --filter ./types/protocols --filter ./cli/jitsu-cli --filter ./libs/functions --filter ./libs/jitsu-js --filter ./libs/jitsu-react --version '1.9.12-canary.{rev}.{time}' --npm-tag canary --git-tag 'jitsu-js-libs-canary-v{version}' --push-tag" }, "devDependencies": { "@playwright/test": "1.39.0", diff --git a/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts b/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts index 06ef7bce4..1207135b5 100644 --- a/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts +++ b/webapps/console/pages/api/[workspaceId]/log/[type]/[actorId].ts @@ -6,13 +6,15 @@ import { ApiError } from "../../../../../lib/shared/errors"; import { clickhouse } from "../../../../../lib/server/clickhouse"; import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; +import zlib from "zlib"; +import { pipeline } from "node:stream"; dayjs.extend(utc); const log = getServerLog("events-log"); const metricsSchema = process.env.CLICKHOUSE_METRICS_SCHEMA || process.env.CLICKHOUSE_DATABASE || "newjitsu_metrics"; -//Vercel Limit: https://vercel.com/docs/functions/runtimes#request-body-size -const maxResponseSize = 4500000; +//Vercel Limit: https://vercel.com/docs/functions/streaming-functions#limitations-for-streaming-edge-functions +const maxStreamingResponseSize = 100_000_000; export const api: Api = { url: inferUrl(__filename), @@ -31,6 +33,7 @@ export const api: Api = { }), result: z.any(), }, + streaming: true, auth: true, handle: async ({ user, req, res, query }) => { log.atDebug().log("GET", JSON.stringify(query, null, 2)); @@ -53,6 +56,10 @@ export const api: Api = { throw new ApiError(`connection doesn't belong to the current workspace`, {}, { status: 403 }); } } + res.writeHead(200, { + "Content-Type": "application/x-ndjson", + "Content-Encoding": "gzip", + }); const sqlQuery = `select timestamp as date, level, message as content from ${metricsSchema}.events_log where actorId = {actorId:String} @@ -62,43 +69,66 @@ export const api: Api = { ${query.end ? "and timestamp < {end:String}" : ""} ${query.search ? "and message ilike concat('%',{search:String},'%')" : ""} order by timestamp desc limit {limit:UInt32}`; - const result: any[] = []; - - const chResult = (await ( - await clickhouse.query({ - query: sqlQuery, - query_params: { - actorId: query.actorId, - type: query.type, - levels: query.levels ? query.levels.split(",") : undefined, - start: query.start ? dayjs(query.start).utc().format("YYYY-MM-DD HH:mm:ss.SSS") : undefined, - end: query.end ? dayjs(query.end).utc().format("YYYY-MM-DD HH:mm:ss.SSS") : undefined, - search: - typeof query.search === "undefined" - ? undefined - : query.search instanceof Date - ? query.search.toISOString() - : query.search, - limit: query.limit, - }, - clickhouse_settings: { - wait_end_of_query: 1, - }, - }) - ).json()) as any; - let written = 0; - for (const row of chResult.data) { - written += row.content.length + 70; - if (written > maxResponseSize) { - break; + const chResult = await clickhouse.query({ + query: sqlQuery, + query_params: { + actorId: query.actorId, + type: query.type, + levels: query.levels ? query.levels.split(",") : undefined, + start: query.start ? dayjs(query.start).utc().format("YYYY-MM-DD HH:mm:ss.SSS") : undefined, + end: query.end ? dayjs(query.end).utc().format("YYYY-MM-DD HH:mm:ss.SSS") : undefined, + search: + typeof query.search === "undefined" + ? undefined + : query.search instanceof Date + ? query.search.toISOString() + : query.search, + limit: query.limit, + }, + format: "JSONEachRow", + clickhouse_settings: { + wait_end_of_query: 1, + }, + }); + var responsePromiseResolve; + let responsePromise = new Promise((resolve, reject) => { + responsePromiseResolve = resolve; + }); + const gzip = zlib.createGzip(); + pipeline(gzip, res, err => { + if (err) { + log.atError().withCause(err).log("Error piping data to response"); } - result.push({ - date: dayjs(row.date).utc(true).toDate(), - level: row.level, - content: JSON.parse(row.content), - }); - } - res.json(result); + responsePromiseResolve(); + }); + const stream = chResult.stream(); + stream.on("data", rs => { + for (const r of rs) { + const row = r.json() as any; + if (gzip.bytesWritten < maxStreamingResponseSize) { + const line = JSON.stringify({ + date: dayjs(row.date).utc(true).toDate(), + level: row.level, + content: JSON.parse(row.content), + }); + gzip.write(line + "\n"); + } else { + stream.destroy(); + } + } + }); + stream.on("error", err => { + log.atError().withCause(err).log("Error streaming data"); + gzip.end(); + }); + stream.on("close", () => { + gzip.end(); + }); + stream.on("end", () => { + gzip.end(); + }); + //wait for stream end + await responsePromise; }, }, }; diff --git a/webapps/console/pages/api/[workspaceId]/sources/logs.ts b/webapps/console/pages/api/[workspaceId]/sources/logs.ts index 58610530a..237db7e7c 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/logs.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/logs.ts @@ -6,9 +6,14 @@ import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; dayjs.extend(utc); import { getServerLog } from "../../../../lib/server/log"; +import zlib from "zlib"; +import { pipeline } from "node:stream"; const log = getServerLog("sync-logs"); -const maxResponseSize = 4500000; +//Vercel Limit: https://vercel.com/docs/functions/streaming-functions#limitations-for-streaming-edge-functions +const maxStreamingResponseSize = 100_000_000; +// Too big responses may cause performance issues in the browser (that is compressed size - actual payload is much bigger) +const browserResponseSize = 1_000_000; export default createRoute() .GET({ @@ -24,18 +29,32 @@ export default createRoute() .handler(async ({ user, query, res }) => { const { workspaceId } = query; await verifyAccess(user, workspaceId); + let maxResponseSize = maxStreamingResponseSize; if (query.download) { res.writeHead(200, { "Content-Type": "text/plain", + "Content-Encoding": "gzip", "Content-Disposition": `attachment; filename=logs_sync_${query.syncId}_task_${query.taskId}.txt`, }); } else { + maxResponseSize = browserResponseSize; res.writeHead(200, { + "Content-Encoding": "gzip", "Content-Type": "text/plain", }); } try { - let writtenBytes = 0; + var responsePromiseResolve; + let responsePromise = new Promise((resolve, reject) => { + responsePromiseResolve = resolve; + }); + const gzip = zlib.createGzip(); + pipeline(gzip, res, err => { + if (err) { + log.atError().withCause(err).log("Error piping data to response"); + } + responsePromiseResolve(); + }); db.prisma().$queryRaw; await db.pgHelper().streamQuery( `select tl.* @@ -47,20 +66,21 @@ export default createRoute() const line = `${dayjs(r.timestamp).utc().format("YYYY-MM-DD HH:mm:ss.SSS")} ${r.level} [${r.logger}] ${ r.message }\n`; - if (writtenBytes + line.length < maxResponseSize) { - res.write(line); - writtenBytes += line.length; + if (gzip.bytesWritten < maxResponseSize) { + gzip.write(line); } } ); - if (writtenBytes === 0) { + if (gzip.bytesWritten === 0) { const task = await db.prisma().source_task.findFirst({ where: { task_id: query.taskId } }); if (!task || task.status === "RUNNING") { - res.write("The task is starting..."); + gzip.write("The task is starting..."); } else { - res.write("No logs found for this task"); + gzip.write("No logs found for this task"); } } + gzip.end(); + await responsePromise; } catch (e: any) { const errorId = randomId(); log From d019968d6d6189ab98b2c8b21373f7a79970b2a9 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 29 Nov 2024 17:28:48 +0400 Subject: [PATCH 0988/1353] console: added IAM role authentication settings for Redshift and s3 destinations --- .../ConfigObjectEditor/ConfigEditor.tsx | 34 ++++-- webapps/console/lib/schema/destinations.tsx | 104 ++++++++++++++++-- 2 files changed, 121 insertions(+), 17 deletions(-) diff --git a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx index 3a93e9a4e..367c2b820 100644 --- a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx +++ b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx @@ -51,12 +51,13 @@ const log = getLog("ConfigEditor"); export type FieldDisplay = { isId?: boolean; - hidden?: boolean; + hidden?: boolean | ((a: any) => boolean); displayName?: string; editor?: any; advanced?: boolean; documentation?: ReactNode; - constant?: any; + constant?: any | ((a: any) => any); + correction?: any | ((a: any) => any); textarea?: boolean; password?: boolean; }; @@ -100,8 +101,13 @@ export type ConfigEditorProps type JsonSchema = any; -function getUiWidget(field: FieldDisplay) { - if (field?.constant || field?.hidden) { +function getUiWidget(field: FieldDisplay, obj: any) { + if ( + (typeof field?.hidden === "function" && field?.hidden(obj) === true) || + (typeof field?.hidden === "boolean" && field?.hidden === true) || + (typeof field?.constant === "function" && typeof field?.constant(obj) !== "undefined") || + (typeof field?.constant !== "function" && typeof field?.constant !== "undefined") + ) { return "hidden"; } else if (field?.editor) { return field?.editor; @@ -114,13 +120,13 @@ function getUiWidget(field: FieldDisplay) { } } -function getUiSchema(schema: JsonSchema, fields: Record): UiSchema { +function getUiSchema(schema: JsonSchema, fields: Record, object: any): UiSchema { return { ...Object.entries((schema as any).properties) .map(([name]) => { const field = fields[name]; const fieldProps = { - "ui:widget": getUiWidget(field), + "ui:widget": getUiWidget(field, object), "ui:disabled": field?.constant ? true : undefined, "ui:placeholder": field?.constant, "ui:title": field?.displayName || createDisplayName(name), @@ -250,7 +256,7 @@ const EditorComponent: React.FC = props => { const [isTouched, setTouched] = useState(!!createNew); const [testResult, setTestResult] = useState(undefined); - const uiSchema = getUiSchema(schema, fields); + const uiSchema = getUiSchema(schema, fields, formState?.formData || object); const [submitCount, setSubmitCount] = useState(0); const modal = useAntdModal(); @@ -414,12 +420,24 @@ const SingleObjectEditor: React.FC = props => { if (meta === undefined) { return ; } - const object = otherProps.object || { + const preObject = otherProps.object || { id: cuid(), workspaceId: workspace.id, type: type, ...newObject(meta), }; + const constants = Object.fromEntries( + Object.entries(fields) + .filter(([_, v]) => typeof v.constant !== "undefined") + .map(([k, v]) => [k, typeof v.constant === "function" ? v.constant(preObject) : v.constant]) + ); + const corrections = Object.fromEntries( + Object.entries(fields) + .filter(([_, v]) => typeof v.correction !== "undefined") + .map(([k, v]) => [k, typeof v.correction === "function" ? v.correction(preObject) : v.correction]) + ); + + const object = { ...preObject, ...constants, ...corrections }; const onCancel = async (confirm: boolean) => { if (!confirm || (await confirmOp("Are you sure you want to close this page? All unsaved changes will be lost."))) { diff --git a/webapps/console/lib/schema/destinations.tsx b/webapps/console/lib/schema/destinations.tsx index 06cfca053..c3f106fb1 100644 --- a/webapps/console/lib/schema/destinations.tsx +++ b/webapps/console/lib/schema/destinations.tsx @@ -75,7 +75,16 @@ export type PropertyUI = { /** * If the field should not be displayed. That field must have a default value */ - hidden?: boolean; + hidden?: boolean | ((obj: any) => boolean); + /** + * If the field should be a constant + */ + constant?: any | ((obj: any) => any); + /** + * correction to field value. e.g: set default value for property that was missing before + */ + correction?: any | ((obj: any) => any); + /** * Documentation for the field */ @@ -508,27 +517,72 @@ export const coreDestinations: DestinationType[] = [ ), tags: "Datawarehouse", credentials: z.object({ - host: z.string().describe("Redshift host"), + authenticationMethod: z + .enum(["iam", "password"]) + .optional() + .default("password") + .describe( + "Authentication Method::Redshift authentication method: IAM Role based or database username/password" + ), + serverless: z.boolean().default(false).optional().describe("Redshift Serverless::"), + region: z.enum(s3Regions).describe("Region::Aws Region"), + clusterIdentifier: z.string().optional().describe("Cluster Identifier::Redshift cluster identifier"), + workgroupName: z.string().optional().describe("Workgroup name::Redshift Serverless workgroup name"), + roleArn: z + .string() + .optional() + .describe( + "Role ARN::IAM role ARN. How to create" + ), + externalId: z.string().optional().describe("External ID::IAM external ID"), + host: z.string().optional().describe("Redshift host"), database: z.string().describe("Redshift database name"), defaultSchema: z.string().default("PUBLIC").describe("Schema::Redshift schema"), - username: z.string().describe("Redshift username"), - password: z.string().describe("Redshift password"), + username: z.string().optional().describe("Redshift username"), + password: z.string().optional().describe("Redshift password"), + bucket: z.string().describe("S3 Bucket Name::S3 Bucket Name"), accessKeyId: z .string() + .optional() .describe( "S3 Access Key Id::S3 Access Key Id. Create access key" ), - secretAccessKey: z.string().describe("S3 Secret Access Key::S3 Secret Access Key"), - region: z.enum(s3Regions).describe("S3 Region::S3 Region"), - bucket: z.string().describe("S3 Bucket Name::S3 Bucket Name"), + secretAccessKey: z.string().optional().describe("S3 Secret Access Key::S3 Secret Access Key"), }), credentialsUi: { + authenticationMethod: { + correction: obj => obj.authenticationMethod || "password", + }, + username: { + hidden: obj => obj.authenticationMethod === "iam" && obj.serverless === true, + }, password: { password: true, + hidden: obj => obj.authenticationMethod === "iam", }, secretAccessKey: { + hidden: obj => obj.authenticationMethod === "iam", password: true, }, + accessKeyId: { + hidden: obj => obj.authenticationMethod === "iam", + }, + host: { + hidden: obj => obj.authenticationMethod === "iam", + }, + clusterIdentifier: { + hidden: obj => obj.authenticationMethod !== "iam" || obj.serverless === true, + }, + workgroupName: { + hidden: obj => obj.authenticationMethod !== "iam" || obj.serverless === false, + }, + roleArn: { + hidden: obj => obj.authenticationMethod !== "iam", + }, + externalId: { + // constants are not yet refreshed on form state change. so it is unconditional here + constant: obj => obj.workspaceId, + }, }, description: "Amazon Redshift is a cloud data warehouse that is optimized for the analytical workloads of business intelligence (BI) and data warehousing (DWH). Jitsu supports both Serverless and Classic Redshift", @@ -577,21 +631,53 @@ export const coreDestinations: DestinationType[] = [ description: "S3 is a cloud file storage service by Amazon", credentials: z .object({ + authenticationMethod: z + .enum(["iam", "accessKey"]) + .optional() + .default("accessKey") + .describe( + "Authentication Method::S3 authentication method: IAM Role based or Access Key" + ), + region: z.enum(s3Regions).default(s3Regions[0]).describe("S3 Region::S3 Region"), + roleArn: z + .string() + .optional() + .describe( + "Role ARN::IAM role ARN. How to create" + ), + externalId: z.string().optional().describe("External ID::IAM external ID"), accessKeyId: z .string() + .optional() .describe( "S3 Access Key Id::S3 Access Key Id. Create access key" ), - secretAccessKey: z.string().describe("S3 Secret Access Key::S3 Secret Access Key"), + secretAccessKey: z.string().optional().describe("S3 Secret Access Key::S3 Secret Access Key"), bucket: z.string().describe("S3 Bucket Name::S3 Bucket Name"), - region: z.enum(s3Regions).default(s3Regions[0]).describe("S3 Region::S3 Region"), endpoint: z.string().optional().describe("Custom endpoint of S3-compatible server"), }) .merge(blockStorageSettings), credentialsUi: { + authenticationMethod: { + correction: obj => obj.authenticationMethod || "accessKey", + }, secretAccessKey: { + hidden: obj => obj.authenticationMethod === "iam", password: true, }, + accessKeyId: { + hidden: obj => obj.authenticationMethod === "iam", + }, + endpoint: { + hidden: obj => obj.authenticationMethod === "iam", + }, + roleArn: { + hidden: obj => obj.authenticationMethod !== "iam", + }, + externalId: { + // constants are not yet refreshed on form state change. so it is unconditional here + constant: obj => obj.workspaceId, + }, }, }, { From 6dd06031c617fe5aa2e0508b6251e46b9a2be241 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 29 Nov 2024 17:45:03 +0400 Subject: [PATCH 0989/1353] console: fix --- webapps/console/lib/schema/destinations.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/webapps/console/lib/schema/destinations.tsx b/webapps/console/lib/schema/destinations.tsx index c3f106fb1..31f338c1a 100644 --- a/webapps/console/lib/schema/destinations.tsx +++ b/webapps/console/lib/schema/destinations.tsx @@ -534,7 +534,7 @@ export const coreDestinations: DestinationType[] = [ .describe( "Role ARN::IAM role ARN. How to create" ), - externalId: z.string().optional().describe("External ID::IAM external ID"), + externalID: z.string().optional().describe("External ID::IAM external ID"), host: z.string().optional().describe("Redshift host"), database: z.string().describe("Redshift database name"), defaultSchema: z.string().default("PUBLIC").describe("Schema::Redshift schema"), @@ -579,7 +579,7 @@ export const coreDestinations: DestinationType[] = [ roleArn: { hidden: obj => obj.authenticationMethod !== "iam", }, - externalId: { + externalID: { // constants are not yet refreshed on form state change. so it is unconditional here constant: obj => obj.workspaceId, }, @@ -645,7 +645,7 @@ export const coreDestinations: DestinationType[] = [ .describe( "Role ARN::IAM role ARN. How to create" ), - externalId: z.string().optional().describe("External ID::IAM external ID"), + externalID: z.string().optional().describe("External ID::IAM external ID"), accessKeyId: z .string() .optional() @@ -674,7 +674,7 @@ export const coreDestinations: DestinationType[] = [ roleArn: { hidden: obj => obj.authenticationMethod !== "iam", }, - externalId: { + externalID: { // constants are not yet refreshed on form state change. so it is unconditional here constant: obj => obj.workspaceId, }, From a27f48c94d111ff4f4b3c55fa9ed5834b582aa72 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 29 Nov 2024 17:56:05 +0400 Subject: [PATCH 0990/1353] console: fix --- webapps/console/lib/schema/destinations.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/webapps/console/lib/schema/destinations.tsx b/webapps/console/lib/schema/destinations.tsx index 31f338c1a..febae6b3c 100644 --- a/webapps/console/lib/schema/destinations.tsx +++ b/webapps/console/lib/schema/destinations.tsx @@ -528,7 +528,7 @@ export const coreDestinations: DestinationType[] = [ region: z.enum(s3Regions).describe("Region::Aws Region"), clusterIdentifier: z.string().optional().describe("Cluster Identifier::Redshift cluster identifier"), workgroupName: z.string().optional().describe("Workgroup name::Redshift Serverless workgroup name"), - roleArn: z + roleARN: z .string() .optional() .describe( @@ -576,7 +576,7 @@ export const coreDestinations: DestinationType[] = [ workgroupName: { hidden: obj => obj.authenticationMethod !== "iam" || obj.serverless === false, }, - roleArn: { + roleARN: { hidden: obj => obj.authenticationMethod !== "iam", }, externalID: { @@ -639,7 +639,7 @@ export const coreDestinations: DestinationType[] = [ "Authentication Method::S3 authentication method: IAM Role based or Access Key" ), region: z.enum(s3Regions).default(s3Regions[0]).describe("S3 Region::S3 Region"), - roleArn: z + roleARN: z .string() .optional() .describe( @@ -671,7 +671,7 @@ export const coreDestinations: DestinationType[] = [ endpoint: { hidden: obj => obj.authenticationMethod === "iam", }, - roleArn: { + roleARN: { hidden: obj => obj.authenticationMethod !== "iam", }, externalID: { From 66e9a85a8438cd86ff5a51fab2392f89dd02671e Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Sat, 30 Nov 2024 23:39:40 +0400 Subject: [PATCH 0991/1353] console: fix default value for frequency and batchSize connection settings --- webapps/console/lib/schema/destinations.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/webapps/console/lib/schema/destinations.tsx b/webapps/console/lib/schema/destinations.tsx index febae6b3c..f5454e548 100644 --- a/webapps/console/lib/schema/destinations.tsx +++ b/webapps/console/lib/schema/destinations.tsx @@ -117,14 +117,13 @@ export type CloudDestinationsConnectionOptions = z.infer; From 4e657c514c0460d05129781cec6b6c1a1936ba1a Mon Sep 17 00:00:00 2001 From: EPuluikis Date: Mon, 2 Dec 2024 19:17:29 +0200 Subject: [PATCH 0992/1353] feat: make entity select searchable in events browser (Merge pull request #1148) --- .../console/components/DataView/EventsBrowser.tsx | 15 +++++++++++++++ webapps/console/styles/globals.css | 5 +++++ 2 files changed, 20 insertions(+) diff --git a/webapps/console/components/DataView/EventsBrowser.tsx b/webapps/console/components/DataView/EventsBrowser.tsx index a8b9dfa8b..66912975d 100644 --- a/webapps/console/components/DataView/EventsBrowser.tsx +++ b/webapps/console/components/DataView/EventsBrowser.tsx @@ -29,6 +29,7 @@ import { ConnectionTitle, ProfileBuilderTitle } from "../../pages/[workspaceId]/ import { StreamTitle } from "../../pages/[workspaceId]/streams"; import { trimMiddle } from "../../lib/shared/strings"; import { countries } from "../../lib/shared/countries"; +import type { RefSelectProps } from "antd/es/select"; import zlib from "zlib"; import { @@ -247,6 +248,14 @@ const EventsBrowser0 = ({ destination={entity[1].destination} /> ), + search: (entity[1].type === "stream" + ? [entity[1].name] + : entity[1].type === "profile-builder" + ? [entity[1].name, entity[1].destination?.name] + : [entity[1].stream?.name, entity[1].service?.name, entity[1].destination?.name] + ) + .filter(s => s !== undefined) + .map(s => s.toLowerCase()), })); } else { return []; @@ -285,6 +294,8 @@ const EventsBrowser0 = ({ const eventsLogApi = useEventsLogApi(); + const entitySelectRef = React.createRef(); + useEffect(() => { if (!actorId || !entitiesMap[actorId]) { if (entities.length > 0) { @@ -465,6 +476,7 @@ const EventsBrowser0 = ({
    {entityType == "stream" ? "Site: " : "Connection: "} setCurrentPassword(e.target.value)} /> + + setCurrentPassword(e.target.value)} + />
    - - setNewPassword(e.target.value)} /> + + setNewPassword(e.target.value)} + />
    - + {

    User settings

    -
    Email
    - -
    + + +

    You can't change email, since you logged in with an external user provider - {user.loginProvider} -

    +

    {user.loginProvider === "credentials" && }
    diff --git a/webapps/console/pages/workspaces.tsx b/webapps/console/pages/workspaces.tsx index 18581cbe2..fe559d752 100644 --- a/webapps/console/pages/workspaces.tsx +++ b/webapps/console/pages/workspaces.tsx @@ -147,10 +147,10 @@ const WorkspaceSelectionPage = (props: any) => { //we can't use current session here, since the error can be originated //from auth layer. Try to logout using all methods signOut().catch(err => { - log.atWarn().withCause(err).log(`Can't sign ut from next-auth`); + log.atWarn().withCause(err).log(`Can't sign out from next-auth`); }); firebaseSignOut().catch(err => { - log.atWarn().withCause(err).log(`Can't sign ut from next-auth`); + log.atWarn().withCause(err).log(`Can't sign out from next-auth`); }); }} > From a7419db66531e0ba93606d2e6dc5d3578bbbc255 Mon Sep 17 00:00:00 2001 From: Vladislav Rumjantsev <13906830+vrumjantsev@users.noreply.github.com> Date: Thu, 9 Jan 2025 15:48:55 +0200 Subject: [PATCH 1036/1353] Fixed typo (#1163) --- .../components/ProfileBuilderPage/ProfileBuilderPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/components/ProfileBuilderPage/ProfileBuilderPage.tsx b/webapps/console/components/ProfileBuilderPage/ProfileBuilderPage.tsx index 0dcbcd729..031115717 100644 --- a/webapps/console/components/ProfileBuilderPage/ProfileBuilderPage.tsx +++ b/webapps/console/components/ProfileBuilderPage/ProfileBuilderPage.tsx @@ -96,7 +96,7 @@ const statuses: Record< documentation: ( <> Profile builder is not enabled for your account. You still can define profiles with JavaScript function, and run - test. To enable profile builder, please for your account please contact support + test. To enable profile builder for your account please contact support ), icon: , From 57acac040fc509fcebbd3217f5683f3cd59d2414 Mon Sep 17 00:00:00 2001 From: Dan Hemerlein Date: Thu, 9 Jan 2025 05:51:56 -0800 Subject: [PATCH 1037/1353] fix (@jitsucom/console): signin page markup + oidc configuration handling (#1167) * update html * add oidcLoginEnabled * remove unused prop --- webapps/console/lib/nextauth.config.ts | 1 + webapps/console/pages/signin.tsx | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/webapps/console/lib/nextauth.config.ts b/webapps/console/lib/nextauth.config.ts index a6c6c0c17..ffa9797ae 100644 --- a/webapps/console/lib/nextauth.config.ts +++ b/webapps/console/lib/nextauth.config.ts @@ -16,6 +16,7 @@ const crypto = require("crypto"); const log = getServerLog("auth"); export const githubLoginEnabled = !!process.env.GITHUB_CLIENT_ID; +export const oidcLoginEnabled = !!process.env.AUTH_OIDC_PROVIDER; export const oidcLoginConfig = ParseJSONConfigFromEnv(process.env.AUTH_OIDC_PROVIDER as string); export const credentialsLoginEnabled = isTruish(process.env.ENABLE_CREDENTIALS_LOGIN) || !!(process.env.SEED_USER_EMAIL && process.env.SEED_USER_PASSWORD); diff --git a/webapps/console/pages/signin.tsx b/webapps/console/pages/signin.tsx index ac9530d0c..d78f6e54d 100644 --- a/webapps/console/pages/signin.tsx +++ b/webapps/console/pages/signin.tsx @@ -9,7 +9,7 @@ import React, { useState } from "react"; import { feedbackError } from "../lib/ui"; import { useRouter } from "next/router"; import { branding } from "../lib/branding"; -import { credentialsLoginEnabled, githubLoginEnabled, oidcLoginConfig } from "../lib/nextauth.config"; +import { credentialsLoginEnabled, githubLoginEnabled, oidcLoginEnabled } from "../lib/nextauth.config"; import { useQuery } from "@tanstack/react-query"; function JitsuLogo() { @@ -21,7 +21,7 @@ function JitsuLogo() { ); } -function CredentialsForm({}) { +function CredentialsForm() { const lastUsedLogin = localStorage.getItem("last-used-login-email") || undefined; const { data, isLoading, error } = useQuery(["next-auth-csrfToken"], async () => { return { @@ -130,12 +130,12 @@ const NextAuthSignInPage = ({ csrfToken, providers: { github, oidc, credentials return (
    -
    +

    This page should not be used if Firebase authorization is enabled. Please proceed to a{" "} main page of the app -

    +

    ); } @@ -144,34 +144,34 @@ const NextAuthSignInPage = ({ csrfToken, providers: { github, oidc, credentials
    -
    +
    {credentials.enabled && } {credentials.enabled && (github.enabled || oidc.enabled) &&
    } {github.enabled && } {oidc.enabled && }
    {router.query.error && ( -
    +

    Something went wrong. Please try again. Error code: {router.query.error} -

    +

    )} {!app.disableSignup && (github.enabled || oidc.enabled) && ( -
    +

    Automatic signup is enabled for this instance. Sign in with github and if you don't have an account, a new account will be created automatically. This account won't have any access to pre-existing project unless the access is explicitly granted -

    +

    )}
    ); }; -export async function getServerSideProps(context) { +export async function getServerSideProps() { if (process.env.FIREBASE_AUTH) { throw new Error(`Firebase auth is enabled. This page should not be used.`); } - if (!githubLoginEnabled && !credentialsLoginEnabled && !oidcLoginConfig) { - throw new Error(`No auth providers are enabled found. Available providers: github, credentials`); + if (!githubLoginEnabled && !credentialsLoginEnabled && !oidcLoginEnabled) { + throw new Error(`No auth providers are enabled found. Available providers: github, credentials, OIDC`); } return { props: { @@ -184,7 +184,7 @@ export async function getServerSideProps(context) { enabled: githubLoginEnabled, }, oidc: { - enabled: !!oidcLoginConfig, + enabled: oidcLoginEnabled, }, }, publicPage: true, From 79ed9c9972178f91978fefed6e3829a14d62fb6d Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 10 Jan 2025 15:49:24 +0400 Subject: [PATCH 1038/1353] console: Service Connectors: added support for adding custom docker image as a connector --- .../ConnectionEditorPage.tsx | 2 +- .../ServicesCatalog/ServicesCatalog.tsx | 58 +++++++++++++++++-- .../console/pages/[workspaceId]/services.tsx | 6 +- .../sources/[packageType]/[...packageId].ts | 22 ++++++- webapps/console/pages/api/sources/logo.ts | 9 +-- 5 files changed, 83 insertions(+), 14 deletions(-) diff --git a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx index d09bf89b1..9372d1248 100644 --- a/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx +++ b/webapps/console/components/ConnectionEditorPage/ConnectionEditorPage.tsx @@ -346,7 +346,7 @@ function ConnectionEditor({ documentation: ( <> Maximum number of events to send in one batch. If there are more events in queue than 'Batch Size', events - will be sent as a consequence of batches with provided size. + will be sent as a sequence of batches with provided size. ), component: ( diff --git a/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx b/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx index 17eaa0d79..f677cb328 100644 --- a/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx +++ b/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx @@ -1,13 +1,13 @@ import styles from "./ServicesCatalog.module.css"; -import { FaCloud, FaDatabase } from "react-icons/fa"; +import { FaDatabase, FaDocker } from "react-icons/fa"; import { useApi } from "../../lib/useApi"; import { SourceType } from "../../pages/api/sources"; import capitalize from "lodash/capitalize"; import { LoadingAnimation } from "../GlobalLoader/GlobalLoader"; import React from "react"; import { ErrorCard } from "../GlobalError/GlobalError"; -import { Input } from "antd"; +import { Button, Input, Popover } from "antd"; import { useAppConfig, useWorkspace } from "../../lib/context"; function groupByType(sources: SourceType[]): Record { @@ -50,15 +50,19 @@ export function getServiceIcon(source: SourceType, icons: Record ) : connectorSubtype === "database" ? ( ) : ( - + ); } -export const ServicesCatalog: React.FC<{ onClick: (packageType, packageId: string) => void }> = ({ onClick }) => { +export const ServicesCatalog: React.FC<{ onClick: (packageType, packageId: string, version?: string) => void }> = ({ + onClick, +}) => { const { data, isLoading, error } = useApi<{ sources: SourceType[] }>(`/api/sources?mode=meta`); const sourcesIconsLoader = useApi<{ sources: SourceType[] }>(`/api/sources?mode=icons-only`); const workspace = useWorkspace(); const [filter, setFilter] = React.useState(""); + const [customImage, setCustomImage] = React.useState(""); + const [customPopupOpen, setCustomPopupOpen] = React.useState(false); const appconfig = useAppConfig(); const sourcesIcons: Record = sourcesIconsLoader.data ? sourcesIconsLoader.data.sources.reduce( @@ -135,6 +139,52 @@ export const ServicesCatalog: React.FC<{ onClick: (packageType, packageId: strin
    ); })} +
    +
    Advanced
    +
    + + setCustomImage(e.target.value)} /> + +
    + } + onOpenChange={setCustomPopupOpen} + open={customPopupOpen} + title="Enter docker image name" + placement={"right"} + trigger="click" + > +
    +
    + +
    +
    +
    +
    Custom connector
    +
    +
    Custom docker image
    +
    +
    + +
    +
    ); diff --git a/webapps/console/pages/[workspaceId]/services.tsx b/webapps/console/pages/[workspaceId]/services.tsx index 6a50b48a7..1ac316c19 100644 --- a/webapps/console/pages/[workspaceId]/services.tsx +++ b/webapps/console/pages/[workspaceId]/services.tsx @@ -257,10 +257,12 @@ const ServicesList: React.FC<{}> = () => { footer={null} > { + onClick={async (packageType, packageId, version) => { await setShowCatalog(false).then(() => router.push( - `/${workspace.id}/services?id=new&packageType=${packageType}&packageId=${encodeURIComponent(packageId)}` + `/${workspace.id}/services?id=new&packageType=${packageType}&packageId=${encodeURIComponent( + packageId + )}${version ? `&version=${version}` : ""}` ) ); }} diff --git a/webapps/console/pages/api/sources/[packageType]/[...packageId].ts b/webapps/console/pages/api/sources/[packageType]/[...packageId].ts index c28fb9145..a6b263dbe 100644 --- a/webapps/console/pages/api/sources/[packageType]/[...packageId].ts +++ b/webapps/console/pages/api/sources/[packageType]/[...packageId].ts @@ -3,6 +3,7 @@ import { db } from "../../../../lib/server/db"; import pick from "lodash/pick"; import { externalSources, jitsuSources, SourceType } from "../index"; import { getLog } from "juava"; +import capitalize from "lodash/capitalize"; export default createRoute() .GET({ auth: false }) @@ -26,7 +27,26 @@ export default createRoute() } const connectorPackage = await db.prisma().connectorPackage.findFirst({ where: { packageType, packageId } }); if (!connectorPackage) { - throw new Error(`Source ${packageId} of ${packageType} type not found`); + return { + id: packageId, + versions: `/api/sources/versions?type=${encodeURIComponent(packageType)}&package=${encodeURIComponent( + packageId + )}`, + packageId, + packageType, + createdAt: new Date(), + updatedAt: new Date(), + meta: { + name: capitalize( + packageId + .split("/") + .pop() + ?.replace(/^source-/g, "") + ), + license: "unknown", + connectorSubtype: "unknown", + }, + }; } const { id, logoSvg, meta, ...rest } = connectorPackage; return { diff --git a/webapps/console/pages/api/sources/logo.ts b/webapps/console/pages/api/sources/logo.ts index 94cf9169c..12d41b7ec 100644 --- a/webapps/console/pages/api/sources/logo.ts +++ b/webapps/console/pages/api/sources/logo.ts @@ -25,17 +25,14 @@ export default async function handler(req, res) { const data = await db .prisma() .connectorPackage.findFirst({ where: { packageId, packageType }, select: { logoSvg: true, meta: true } }); - if (!data) { - const msg = `Icon for ${packageType} - ${packageId} not found`; - res.status(404).json({ status: 404, message: msg }); - } else if (data.logoSvg) { + if (data?.logoSvg) { res.setHeader("Content-Type", "image/svg+xml"); res.setHeader("Cache-Control", "public, max-age=2592000, immutable"); res.status(200).send(data.logoSvg.toString()); } else { res.setHeader("Content-Type", "image/svg+xml"); res.setHeader("Cache-Control", "public, max-age=2592000, immutable"); - if ((data.meta as any).connectorSubtype === "database") { + if ((data?.meta as any)?.connectorSubtype === "database") { res .status(200) .send( @@ -45,7 +42,7 @@ export default async function handler(req, res) { res .status(200) .send( - '' + '' ); } } From ca7885894cde3c77514db3cabaaad322a260bada Mon Sep 17 00:00:00 2001 From: Vladislav Rumjantsev <13906830+vrumjantsev@users.noreply.github.com> Date: Mon, 13 Jan 2025 10:15:45 +0200 Subject: [PATCH 1039/1353] Custom GA4 measurement protocol url (#1162) --- libs/core-functions/src/functions/ga4-destination.ts | 7 ++++--- libs/core-functions/src/meta.ts | 2 +- webapps/console/lib/schema/destinations.tsx | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/libs/core-functions/src/functions/ga4-destination.ts b/libs/core-functions/src/functions/ga4-destination.ts index 36d42ec7f..e1ade9d27 100644 --- a/libs/core-functions/src/functions/ga4-destination.ts +++ b/libs/core-functions/src/functions/ga4-destination.ts @@ -347,9 +347,10 @@ const Ga4Destination: JitsuFunction = asyn ctx.log.info(`Ga4: no GA4 event is mapped for event type: ${event.type} ID: ${event.messageId}`); return; } - const debug = ""; - //const debug = ctx.props.validationMode ? "/debug" : ""; - const url = `https://www.google-analytics.com${debug}/mp/collect?${query}`; + + const baseUrl = ctx.props.url ?? 'https://www.google-analytics.com/mp/collect'; + + const url = `${baseUrl}?${query}`; gaRequest = { ...idPart, diff --git a/libs/core-functions/src/meta.ts b/libs/core-functions/src/meta.ts index f9f65a9a7..769690e52 100644 --- a/libs/core-functions/src/meta.ts +++ b/libs/core-functions/src/meta.ts @@ -304,8 +304,8 @@ export const Ga4Credentials = z.object({ "The measurement ID associated with a stream.
    For Web: found in the Google Analytics UI under: " + "Admin > Data Streams > choose your stream > Measurement ID
    For Apps: the Firebase App ID, found in the Firebase console under: Project Settings > General > Your Apps > App ID" ), + url: z.string().url().describe("Measurement Protocol URL.
    Default: https://www.google-analytics.com/mp/collect
    Default debug url: https://www.google-analytics.com/debug/mp/collect").default('https://www.google-analytics.com/mp/collect'), events: z.string().optional().default("").describe(eventsParamDescription), - //validationMode: z.boolean().default(false).optional(), }); export type Ga4Credentials = z.infer; diff --git a/webapps/console/lib/schema/destinations.tsx b/webapps/console/lib/schema/destinations.tsx index 90c86a58f..e650959d7 100644 --- a/webapps/console/lib/schema/destinations.tsx +++ b/webapps/console/lib/schema/destinations.tsx @@ -807,7 +807,7 @@ export const coreDestinations: DestinationType[] = [ { id: "ga4", icon: ga4Icon, - title: "Google Analytics 4", + title: "GA4 (Measurement Protocol)", tags: "Product Analytics", connectionOptions: CloudDestinationsConnectionOptions, credentials: meta.Ga4Credentials, From 5b501363c94bc188183c4ab688c4d5db5f00d80f Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 13 Jan 2025 12:20:23 +0400 Subject: [PATCH 1040/1353] console: use full name for GA4 destination --- webapps/console/lib/schema/destinations.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/lib/schema/destinations.tsx b/webapps/console/lib/schema/destinations.tsx index e650959d7..76939871a 100644 --- a/webapps/console/lib/schema/destinations.tsx +++ b/webapps/console/lib/schema/destinations.tsx @@ -807,7 +807,7 @@ export const coreDestinations: DestinationType[] = [ { id: "ga4", icon: ga4Icon, - title: "GA4 (Measurement Protocol)", + title: "Google Analytics 4 (GA4 Measurement Protocol)", tags: "Product Analytics", connectionOptions: CloudDestinationsConnectionOptions, credentials: meta.Ga4Credentials, From 44c133cd6c39effcf29c15470f2ba22707032c3b Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 15 Jan 2025 12:26:04 +0400 Subject: [PATCH 1041/1353] rotor: log store errors --- libs/core-functions/src/functions/lib/store.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/libs/core-functions/src/functions/lib/store.ts b/libs/core-functions/src/functions/lib/store.ts index e3e32dc94..281e2ce2b 100644 --- a/libs/core-functions/src/functions/lib/store.ts +++ b/libs/core-functions/src/functions/lib/store.ts @@ -3,11 +3,13 @@ import type { Redis } from "ioredis"; import parse from "parse-duration"; import { MongoClient, ReadPreference, Collection } from "mongodb"; import { RetryError } from "@jitsu/functions-lib"; -import { Singleton } from "juava"; +import { getLog, Singleton } from "juava"; export const defaultTTL = 60 * 60 * 24 * 31; // 31 days export const maxAllowedTTL = 2147483647; // max allowed value for ttl in redis (68years) +const log = getLog("store"); + function getTtlSec(opts?: SetOpts): number { let seconds = defaultTTL; if (typeof opts === "number") { @@ -112,10 +114,11 @@ export const createMongoStore = ( } function storeErr(err: any, text: string) { + log.atError().log(`${text}: ${err.message}`); if ((err.message ?? "").includes("timed out")) { - return new RetryError(text + ". Timed out."); + return new RetryError(text + ": Timed out."); } - return new RetryError(text); + return new RetryError(text + ": " + err.message); } return { From 5d1d2878575e2aa46ef1a2143f2b268e3628c491 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 15 Jan 2025 15:33:06 +0400 Subject: [PATCH 1042/1353] rotor: added persistent store metrics --- .../core-functions/src/functions/lib/index.ts | 29 +++++++++++++++-- .../core-functions/src/functions/lib/store.ts | 32 +++++++++++++++---- libs/core-functions/src/index.ts | 4 +++ services/rotor/src/index.ts | 2 +- services/rotor/src/lib/functions-chain.ts | 24 +++----------- services/rotor/src/lib/message-handler.ts | 4 +-- services/rotor/src/lib/metrics.ts | 30 +++++++++++------ services/rotor/src/lib/rotor.ts | 20 +++++++----- types/protocols/functions.d.ts | 4 +-- 9 files changed, 97 insertions(+), 52 deletions(-) diff --git a/libs/core-functions/src/functions/lib/index.ts b/libs/core-functions/src/functions/lib/index.ts index 3fd1f2aa1..1c7df6d20 100644 --- a/libs/core-functions/src/functions/lib/index.ts +++ b/libs/core-functions/src/functions/lib/index.ts @@ -16,7 +16,7 @@ import { FuncReturn, FunctionLogger, JitsuFunction, - Metrics, + FunctionMetrics, TTLStore, } from "@jitsu/protocols/functions"; import { @@ -70,6 +70,31 @@ export type MetricsMeta = { retries?: number; }; +export type FuncChainResult = { + connectionId?: string; + events: AnyEvent[]; + execLog: FunctionExecLog; +}; + +export type FunctionExecRes = { + receivedAt?: any; + eventIndex: number; + event?: any; + metricsMeta?: MetricsMeta; + functionId: string; + error?: any; + dropped?: boolean; + ms: number; +}; + +export type FunctionExecLog = FunctionExecRes[]; + +export interface RotorMetrics { + logMetrics: (execLog: FunctionExecLog) => void; + storeStatus: (namespace: string, operation: string, status: string) => void; + close: () => void; +} + export type FetchType = ( url: string, opts?: FetchOpts, @@ -92,7 +117,7 @@ export type FunctionChainContext = { fetch: InternalFetchType; store: TTLStore; anonymousEventsStore?: AnonymousEventsStore; - metrics?: Metrics; + metrics?: FunctionMetrics; connectionOptions?: any; }; diff --git a/libs/core-functions/src/functions/lib/store.ts b/libs/core-functions/src/functions/lib/store.ts index 281e2ce2b..4c4acc2b5 100644 --- a/libs/core-functions/src/functions/lib/store.ts +++ b/libs/core-functions/src/functions/lib/store.ts @@ -4,6 +4,7 @@ import parse from "parse-duration"; import { MongoClient, ReadPreference, Collection } from "mongodb"; import { RetryError } from "@jitsu/functions-lib"; import { getLog, Singleton } from "juava"; +import { RotorMetrics } from "./index"; export const defaultTTL = 60 * 60 * 24 * 31; // 31 days export const maxAllowedTTL = 2147483647; // max allowed value for ttl in redis (68years) @@ -69,7 +70,8 @@ export const createMongoStore = ( namespace: string, mongo: Singleton, useLocalCache: boolean, - fast: boolean + fast: boolean, + metrics?: RotorMetrics ): TTLStore => { const localCache: Record = {}; const readOptions = fast ? { readPreference: ReadPreference.NEAREST } : {}; @@ -113,22 +115,32 @@ export const createMongoStore = ( } } - function storeErr(err: any, text: string) { + function storeErr(operation: "get" | "set" | "del" | "ttl", err: any, text: string, metrics?: RotorMetrics) { log.atError().log(`${text}: ${err.message}`); + if (metrics) { + metrics.storeStatus(namespace, operation, "error"); + } if ((err.message ?? "").includes("timed out")) { return new RetryError(text + ": Timed out."); } return new RetryError(text + ": " + err.message); } + function success(operation: "get" | "set" | "del" | "ttl", metrics?: RotorMetrics) { + if (metrics) { + metrics.storeStatus(namespace, operation, "success"); + } + } + return { get: async (key: string) => { try { const res = getFromLocalCache(key) || (await ensureCollection().then(c => c.findOne({ _id: key }, readOptions))); + success("get", metrics); return res ? res.value : undefined; } catch (err: any) { - throw storeErr(err, `Error getting key ${key} from mongo store ${namespace}`); + throw storeErr("get", err, `Error getting key ${key} from mongo store ${namespace}`); } }, getWithTTL: async (key: string) => { @@ -139,9 +151,10 @@ export const createMongoStore = ( return undefined; } const ttl = res.expireAt ? Math.max(Math.floor((res.expireAt.getTime() - new Date().getTime()) / 1000), 0) : -1; + success("get", metrics); return { value: res.value, ttl }; } catch (err: any) { - throw storeErr(err, `Error getting key ${key} from mongo store ${namespace}`); + throw storeErr("get", err, `Error getting key ${key} from mongo store ${namespace}`); } }, set: async (key: string, obj: any, opts?: SetOpts) => { @@ -165,9 +178,12 @@ export const createMongoStore = ( if (useLocalCache) { localCache[key] = colObj; } + }) + .then(() => { + success("set", metrics); }); } catch (err: any) { - throw storeErr(err, `Error setting key ${key} in mongo store ${namespace}`); + throw storeErr("set", err, `Error setting key ${key} in mongo store ${namespace}`); } }, del: async (key: string) => { @@ -179,21 +195,23 @@ export const createMongoStore = ( delete localCache[key]; } }); + success("del", metrics); } catch (err: any) { - throw storeErr(err, `Error deleting key ${key} from mongo store ${namespace}`); + throw storeErr("del", err, `Error deleting key ${key} from mongo store ${namespace}`); } }, ttl: async (key: string) => { try { const res = getFromLocalCache(key) || (await ensureCollection().then(c => c.findOne({ _id: key }, readOptions))); + success("ttl", metrics); return res ? res.expireAt ? Math.max(Math.floor((res.expireAt.getTime() - new Date().getTime()) / 1000), 0) : -1 : -2; } catch (err: any) { - throw storeErr(err, `Error getting key ${key} from mongo store ${namespace}`); + throw storeErr("ttl", err, `Error getting key ${key} from mongo store ${namespace}`); } }, }; diff --git a/libs/core-functions/src/index.ts b/libs/core-functions/src/index.ts index 24a8aa0e6..bf31e140b 100644 --- a/libs/core-functions/src/index.ts +++ b/libs/core-functions/src/index.ts @@ -81,6 +81,10 @@ export * as mongodbDestination from "./functions/mongodb-destination"; export { mongodb, mongoAnonymousEventsStore } from "./functions/lib/mongodb"; export type { MetricsMeta, + RotorMetrics, + FuncChainResult, + FunctionExecLog, + FunctionExecRes, FunctionContext, FunctionChainContext, FetchType, diff --git a/services/rotor/src/index.ts b/services/rotor/src/index.ts index 1b4267ef2..2472a0dcc 100644 --- a/services/rotor/src/index.ts +++ b/services/rotor/src/index.ts @@ -8,7 +8,7 @@ import Prometheus from "prom-client"; import { FunctionsHandler, FunctionsHandlerMulti } from "./http/functions"; import { initMaxMindClient, GeoResolver } from "./lib/maxmind"; import { MessageHandlerContext, rotorMessageHandler } from "./lib/message-handler"; -import { DummyMetrics, Metrics } from "./lib/metrics"; +import { DummyMetrics } from "./lib/metrics"; import { connectionsStore, functionsStore } from "./lib/repositories"; import { Server } from "node:net"; import { getApplicationVersion, getDiagnostics } from "./lib/version"; diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index 663293a34..56990a42a 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -5,9 +5,11 @@ import { createTtlStore, EnrichedConnectionConfig, EntityStore, + FuncChainResult, FunctionChainContext, FunctionConfig, FunctionContext, + FunctionExecLog, getBuiltinFunction, isDropResult, JitsuFunctionWrapper, @@ -69,25 +71,6 @@ udfCache.on("del", (key, value) => { value.wrapper?.close(); }); -export type FuncChainResult = { - connectionId?: string; - events: AnyEvent[]; - execLog: FunctionExecLog; -}; - -export type FunctionExecRes = { - receivedAt?: any; - eventIndex: number; - event?: any; - metricsMeta?: MetricsMeta; - functionId: string; - error?: any; - dropped?: boolean; - ms: number; -}; - -export type FunctionExecLog = FunctionExecRes[]; - export function checkError(chainRes: FuncChainResult) { for (const el of chainRes.execLog) { if (el.error && (el.error.name === DropRetryErrorName || el.error.name === RetryErrorName)) { @@ -139,7 +122,8 @@ export function buildFunctionChain( connection.workspaceId, mongodb, false, - fastStoreWorkspaceId.includes(connection.workspaceId) + fastStoreWorkspaceId.includes(connection.workspaceId), + rotorContext.metrics ); if (rotorContext.redisClient) { store = createMultiStore(store, createTtlStore(connection.workspaceId, rotorContext.redisClient)); diff --git a/services/rotor/src/lib/message-handler.ts b/services/rotor/src/lib/message-handler.ts index e98392e18..a7f91ad57 100644 --- a/services/rotor/src/lib/message-handler.ts +++ b/services/rotor/src/lib/message-handler.ts @@ -1,5 +1,4 @@ import { getLog, requireDefined } from "juava"; -import { Metrics } from "./metrics"; import { GeoResolver } from "./maxmind"; import { IngestMessage } from "@jitsu/protocols/async-request"; import { CONNECTION_IDS_HEADER } from "./rotor"; @@ -17,6 +16,7 @@ import { EnrichedConnectionConfig, FunctionConfig, WorkspaceWithProfiles, + RotorMetrics, } from "@jitsu/core-functions"; import NodeCache from "node-cache"; import { buildFunctionChain, checkError, FuncChain, FuncChainFilter, runChain } from "./functions-chain"; @@ -35,7 +35,7 @@ export type MessageHandlerContext = { functionsStore: EntityStore; workspaceStore: EntityStore; eventsLogger: EventsStore; - metrics?: Metrics; + metrics?: RotorMetrics; geoResolver?: GeoResolver; dummyPersistentStore?: TTLStore; redisClient?: Redis; diff --git a/services/rotor/src/lib/metrics.ts b/services/rotor/src/lib/metrics.ts index 75e7f5172..99de26d05 100644 --- a/services/rotor/src/lib/metrics.ts +++ b/services/rotor/src/lib/metrics.ts @@ -1,13 +1,19 @@ import { getLog, requireDefined, stopwatch } from "juava"; -import { FunctionExecLog, FunctionExecRes } from "./functions-chain"; import fetch from "node-fetch-commonjs"; -import { MetricsMeta, httpAgent, httpsAgent } from "@jitsu/core-functions"; +import { + FunctionExecLog, + FunctionExecRes, + MetricsMeta, + httpAgent, + httpsAgent, + RotorMetrics, +} from "@jitsu/core-functions"; import omit from "lodash/omit"; import type { Producer } from "kafkajs"; import { getCompressionType } from "./rotor"; import { Readable } from "stream"; -import { randomUUID } from "node:crypto"; +import { Counter } from "prom-client"; const log = getLog("metrics"); const bulkerBase = requireDefined(process.env.BULKER_URL, "env BULKER_URL is not defined"); @@ -27,17 +33,16 @@ type MetricsEvent = MetricsMeta & { events: number; }; -export interface Metrics { - logMetrics: (execLog: FunctionExecLog) => void; - close: () => void; -} - -export const DummyMetrics: Metrics = { +export const DummyMetrics: RotorMetrics = { logMetrics: () => {}, + storeStatus: () => {}, close: () => {}, }; -export function createMetrics(producer?: Producer): Metrics { +export function createMetrics( + producer?: Producer, + storeCounter?: Counter<"namespace" | "operation" | "status"> +): RotorMetrics { const buffer: MetricsEvent[] = []; const flush = async (buf: MetricsEvent[]) => { @@ -199,6 +204,11 @@ export function createMetrics(producer?: Producer): Metrics { buffer.length = 0; } }, + storeStatus: (namespace: string, operation: string, status: string) => { + if (storeCounter) { + storeCounter.labels(namespace, operation, status).inc(); + } + }, close: () => { clearInterval(interval); }, diff --git a/services/rotor/src/lib/rotor.ts b/services/rotor/src/lib/rotor.ts index 9fca51463..8a641d71d 100644 --- a/services/rotor/src/lib/rotor.ts +++ b/services/rotor/src/lib/rotor.ts @@ -6,12 +6,13 @@ import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; dayjs.extend(utc); import { getRetryPolicy, retryBackOffTime, retryLogMessage } from "./retries"; -import { createMetrics, Metrics } from "./metrics"; -import { FuncChainFilter, FuncChainResult } from "./functions-chain"; +import { createMetrics } from "./metrics"; +import { FuncChainFilter } from "./functions-chain"; import type { Admin, Consumer, Producer, KafkaMessage } from "kafkajs"; import { CompressionTypes } from "kafkajs"; import { functionFilter, MessageHandlerContext } from "./message-handler"; import { connectionsStore, functionsStore, workspaceStore } from "./repositories"; +import { RotorMetrics, FuncChainResult } from "@jitsu/core-functions"; const log = getLog("kafka-rotor"); @@ -43,7 +44,7 @@ export type KafkaRotorConfig = { }; export type KafkaRotor = { - start: () => Promise; + start: () => Promise; close: () => Promise; }; @@ -54,7 +55,7 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { let admin: Admin; let closeQueue: () => Promise; let interval: any; - let metrics: Metrics; + let metrics: RotorMetrics; return { start: async () => { const kafka = connectToKafka({ defaultAppId: kafkaClientId, ...cfg.credentials }); @@ -69,7 +70,12 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { producer = kafka.producer({ allowAutoTopicCreation: false }); await producer.connect(); - metrics = createMetrics(producer); + const storeErrors = new Prometheus.Counter({ + name: "rotor_store_statuses", + help: "rotor store statuses", + labelNames: ["namespace", "operation", "status"] as const, + }); + metrics = createMetrics(producer, storeErrors); admin = kafka.admin(); const topicOffsets = new Prometheus.Gauge({ @@ -87,21 +93,19 @@ export function kafkaRotor(cfg: KafkaRotorConfig): KafkaRotor { const messagesProcessed = new Prometheus.Counter({ name: "rotor_messages_processed", help: "messages processed", - // add `as const` here to enforce label names labelNames: ["topic", "partition"] as const, }); const messagesRequeued = new Prometheus.Counter({ name: "rotor_messages_requeued", help: "messages requeued", - // add `as const` here to enforce label names labelNames: ["topic"] as const, }); const messagesDeadLettered = new Prometheus.Counter({ name: "rotor_messages_dead_lettered", help: "messages dead lettered", - // add `as const` here to enforce label names labelNames: ["topic"] as const, }); + interval = setInterval(async () => { try { for (const topic of kafkaTopics) { diff --git a/types/protocols/functions.d.ts b/types/protocols/functions.d.ts index e9e0eade4..03d38e281 100644 --- a/types/protocols/functions.d.ts +++ b/types/protocols/functions.d.ts @@ -21,7 +21,7 @@ export interface Store { ttl(key: string): Promise; } -export interface Metrics { +export interface FunctionMetrics { counter(name: string): { //increment / decrement counter. Supports negative values inc: (value: number) => void; @@ -70,7 +70,7 @@ export type FunctionContext

    = { log: FunctionLogger; fetch: FetchType; store: TTLStore; - metrics?: Metrics; + metrics?: FunctionMetrics; props: P; }; From 2d52e2fb14ad94eab058560dbfac7099ccef8fdf Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 16 Jan 2025 14:06:46 +0400 Subject: [PATCH 1043/1353] console: Custom Images for connectors feature --- .../ConfigObjectEditor/ConfigEditor.tsx | 2 + .../ConfigObjectEditor/EditorButtons.tsx | 10 +- .../PageLayout/WorkspacePageLayout.tsx | 3 +- .../ServicesCatalog/ServicesCatalog.tsx | 79 ++++------- webapps/console/lib/schema/config-objects.ts | 13 +- webapps/console/lib/schema/index.ts | 9 ++ webapps/console/lib/store/index.tsx | 5 +- .../pages/[workspaceId]/custom-images.tsx | 133 ++++++++++++++++++ .../console/pages/[workspaceId]/services.tsx | 14 +- 9 files changed, 204 insertions(+), 64 deletions(-) create mode 100644 webapps/console/pages/[workspaceId]/custom-images.tsx diff --git a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx index 367c2b820..8d5bc4492 100644 --- a/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx +++ b/webapps/console/components/ConfigObjectEditor/ConfigEditor.tsx @@ -95,6 +95,7 @@ export type ConfigEditorProps //for providing custom editor component editorComponent?: EditorComponentFactory; testConnectionEnabled?: (o: any) => boolean; + testButtonLabel?: string; onTest?: (o: T) => Promise; backTo?: string; }; @@ -326,6 +327,7 @@ const EditorComponent: React.FC = props => { isNew={isNew} isTouched={isTouched} hasErrors={hasErrors} + testButtonLabel={props.testButtonLabel} onTest={ onTest && testConnectionEnabled && testConnectionEnabled(formState?.formData || object) ? async () => { diff --git a/webapps/console/components/ConfigObjectEditor/EditorButtons.tsx b/webapps/console/components/ConfigObjectEditor/EditorButtons.tsx index 62820378a..af8faa46b 100644 --- a/webapps/console/components/ConfigObjectEditor/EditorButtons.tsx +++ b/webapps/console/components/ConfigObjectEditor/EditorButtons.tsx @@ -17,6 +17,7 @@ export type EditorButtonProps = { isTouched?: boolean; hasErrors?: boolean; testStatus?: string; + testButtonLabel?: string; }; export const EditorButtons: React.FC = ({ @@ -28,6 +29,7 @@ export const EditorButtons: React.FC = ({ onSave, isTouched, hasErrors, + testButtonLabel = "Test Connection", }) => { const buttonDivRef = useRef(null); const appConfig = useAppConfig(); @@ -93,17 +95,19 @@ export const EditorButtons: React.FC = ({ (testStatus === "success" ? ( ) : ( ))} diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index eb1cf69b1..9aba212f3 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -1,7 +1,7 @@ import React, { PropsWithChildren, ReactNode, useEffect, useState } from "react"; import { branding } from "../../lib/branding"; import { HiSelector } from "react-icons/hi"; -import { FaSignOutAlt, FaUserCircle } from "react-icons/fa"; +import { FaDocker, FaSignOutAlt, FaUserCircle } from "react-icons/fa"; import { FiSettings } from "react-icons/fi"; import { Button, Drawer, Dropdown, Menu, MenuProps } from "antd"; import MenuItem from "antd/lib/menu/MenuItem"; @@ -582,6 +582,7 @@ function PageHeader() { { title: "Service Connections", path: "/services", icon: }, { title: "Syncs", path: "/syncs", icon: }, { title: "All Logs", path: "/syncs/tasks", icon: }, + { title: "Custom Images", path: "/custom-images", icon: }, ], }, appConfig.ee?.available && { diff --git a/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx b/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx index f677cb328..2967825ab 100644 --- a/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx +++ b/webapps/console/components/ServicesCatalog/ServicesCatalog.tsx @@ -7,13 +7,14 @@ import capitalize from "lodash/capitalize"; import { LoadingAnimation } from "../GlobalLoader/GlobalLoader"; import React from "react"; import { ErrorCard } from "../GlobalError/GlobalError"; -import { Button, Input, Popover } from "antd"; +import { Input } from "antd"; import { useAppConfig, useWorkspace } from "../../lib/context"; +import { useConfigObjectList } from "../../lib/store"; function groupByType(sources: SourceType[]): Record { const groups: Record = {}; const otherGroup = "other"; - const sortOrder = ["Datawarehouse", "Product Analytics", "CRM", "Block Storage"]; + const sortOrder = ["api", "database", "file", "custom image"]; sources.forEach(s => { if (s.packageId.endsWith("strict-encrypt") || s.packageId === "airbyte/source-file-secure") { @@ -58,11 +59,10 @@ export const ServicesCatalog: React.FC<{ onClick: (packageType, packageId: strin onClick, }) => { const { data, isLoading, error } = useApi<{ sources: SourceType[] }>(`/api/sources?mode=meta`); + const customImages = useConfigObjectList("custom-image"); const sourcesIconsLoader = useApi<{ sources: SourceType[] }>(`/api/sources?mode=icons-only`); const workspace = useWorkspace(); const [filter, setFilter] = React.useState(""); - const [customImage, setCustomImage] = React.useState(""); - const [customPopupOpen, setCustomPopupOpen] = React.useState(false); const appconfig = useAppConfig(); const sourcesIcons: Record = sourcesIconsLoader.data ? sourcesIconsLoader.data.sources.reduce( @@ -79,7 +79,17 @@ export const ServicesCatalog: React.FC<{ onClick: (packageType, packageId: strin } else if (error) { return ; } - const groups = groupByType(data.sources); + const sources = [ + ...data.sources, + ...customImages.map(c => ({ + id: c.package, + packageId: c.package, + packageType: "airbyte", + meta: { name: c.name, connectorSubtype: "custom image", dockerImageTag: c.version }, + })), + ] as SourceType[]; + + const groups = groupByType(sources); return (

    @@ -123,14 +133,23 @@ export const ServicesCatalog: React.FC<{ onClick: (packageType, packageId: strin
    onClick(source.packageType, source.packageId)} + onClick={() => + onClick( + source.packageType, + source.packageId, + source.meta?.connectorSubtype === "custom image" ? source.meta?.dockerImageTag : undefined + ) + } >
    {getServiceIcon(source, sourcesIcons)}
    {source.meta.name}
    -
    {source.packageId}
    +
    + {source.packageId} + {source.meta?.connectorSubtype === "custom image" ? ":" + source.meta?.dockerImageTag : ""} +
    ); @@ -139,52 +158,6 @@ export const ServicesCatalog: React.FC<{ onClick: (packageType, packageId: strin
    ); })} -
    -
    Advanced
    -
    - - setCustomImage(e.target.value)} /> - -
    - } - onOpenChange={setCustomPopupOpen} - open={customPopupOpen} - title="Enter docker image name" - placement={"right"} - trigger="click" - > -
    -
    - -
    -
    -
    -
    Custom connector
    -
    -
    Custom docker image
    -
    -
    - -
    -
    ); diff --git a/webapps/console/lib/schema/config-objects.ts b/webapps/console/lib/schema/config-objects.ts index c6dd624cc..2c4d7f8a0 100644 --- a/webapps/console/lib/schema/config-objects.ts +++ b/webapps/console/lib/schema/config-objects.ts @@ -1,7 +1,15 @@ import { coreDestinationsMap } from "./destinations"; import { safeParseWithDate } from "../zod"; import { ApiError } from "../shared/errors"; -import { ApiKey, ConfigObjectType, DestinationConfig, FunctionConfig, ServiceConfig, StreamConfig } from "./index"; +import { + ApiKey, + ConfigObjectType, + ConnectorImageConfig, + DestinationConfig, + FunctionConfig, + ServiceConfig, + StreamConfig, +} from "./index"; import { assertDefined, createHash, requireDefined } from "juava"; import { checkOrAddToIngress, isDomainAvailable } from "../server/custom-domains"; import { ZodType, ZodTypeDef } from "zod"; @@ -162,4 +170,7 @@ const configObjectTypes: Record = { service: { schema: ServiceConfig, }, + "custom-image": { + schema: ConnectorImageConfig, + }, } as const; diff --git a/webapps/console/lib/schema/index.ts b/webapps/console/lib/schema/index.ts index 1480f2dd4..0ab8b085c 100644 --- a/webapps/console/lib/schema/index.ts +++ b/webapps/console/lib/schema/index.ts @@ -170,6 +170,15 @@ export const ServiceConfig = ConfigEntityBase.merge( ); export type ServiceConfig = z.infer; +export const ConnectorImageConfig = ConfigEntityBase.merge( + z.object({ + name: z.string(), + package: z.string(), + version: z.string(), + }) +); +export type ConnectorImageConfig = z.infer; + /** * What happens to an object before it is saved to DB. * diff --git a/webapps/console/lib/store/index.tsx b/webapps/console/lib/store/index.tsx index 905df8402..3a2e848de 100644 --- a/webapps/console/lib/store/index.tsx +++ b/webapps/console/lib/store/index.tsx @@ -1,4 +1,4 @@ -import type { DestinationConfig, FunctionConfig, ServiceConfig, StreamConfig } from "../schema"; +import type { ConnectorImageConfig, DestinationConfig, FunctionConfig, ServiceConfig, StreamConfig } from "../schema"; import { useCallback, useEffect, useMemo, useState } from "react"; import { getLog, requireDefined, rpc } from "juava"; import { useWorkspace } from "../context"; @@ -7,7 +7,7 @@ import { z } from "zod"; import { ConfigurationObjectLinkDbModel, ProfileBuilderDbModel, WorkspaceDbModel } from "../../prisma/schema"; import { UseMutationResult } from "@tanstack/react-query/src/types"; -export const allConfigTypes = ["stream", "service", "function", "destination"] as const; +export const allConfigTypes = ["stream", "service", "function", "destination", "custom-image"] as const; export type ConfigType = (typeof allConfigTypes)[number]; @@ -16,6 +16,7 @@ export type ConfigTypes = { service: ServiceConfig; function: FunctionConfig; destination: DestinationConfig; + "custom-image": ConnectorImageConfig; }; export function asConfigType(type: string): ConfigType { diff --git a/webapps/console/pages/[workspaceId]/custom-images.tsx b/webapps/console/pages/[workspaceId]/custom-images.tsx new file mode 100644 index 000000000..0ff23b8f4 --- /dev/null +++ b/webapps/console/pages/[workspaceId]/custom-images.tsx @@ -0,0 +1,133 @@ +import { WorkspacePageLayout } from "../../components/PageLayout/WorkspacePageLayout"; +import { ConfigEditor, ConfigEditorProps } from "../../components/ConfigObjectEditor/ConfigEditor"; +import { ConnectorImageConfig } from "../../lib/schema"; +import { useAppConfig, useWorkspace } from "../../lib/context"; +import React from "react"; +import { SourceType } from "../api/sources"; +import { ErrorCard } from "../../components/GlobalError/GlobalError"; +import { ServerCog } from "lucide-react"; +import { FaDocker } from "react-icons/fa"; +import { Htmlizer } from "../../components/Htmlizer/Htmlizer"; +import { rpc } from "juava"; +import { UpgradeDialog } from "../../components/Billing/UpgradeDialog"; +import { useBilling } from "../../components/Billing/BillingProvider"; +import { LoadingAnimation } from "../../components/GlobalLoader/GlobalLoader"; + +const CustomImages: React.FC = () => { + return ( + + + + ); +}; + +const CustomImagesList: React.FC<{}> = () => { + const workspace = useWorkspace(); + const appconfig = useAppConfig(); + const billing = useBilling(); + + if (billing.loading) { + return ; + } + if (billing.enabled && billing.settings?.planId === "free") { + return ; + } + + if (!(appconfig.syncs.enabled || workspace.featuresEnabled.includes("syncs"))) { + return ( + + ); + } + + const config: ConfigEditorProps = { + listColumns: [ + { + title: "Package", + render: (s: ConnectorImageConfig) => {`${s.package}:${s.version}`}, + }, + ], + objectType: ConnectorImageConfig, + fields: { + type: { constant: "custom-image" }, + workspaceId: { constant: workspace.id }, + package: { + documentation: ( + + { + "Docker image name. Images can also include a registry hostname, e.g.: fictional.registry.example/imagename, and possibly a port number as well." + } + + ), + }, + version: { + documentation: "Docker image tag", + }, + }, + noun: "custom image", + type: "custom-image", + explanation: "Custom connector images that can be used to setup Service connector", + icon: () => , + testConnectionEnabled: () => true, + testButtonLabel: "Check Image", + onTest: async obj => { + try { + const firstRes = await rpc( + `/api/${workspace.id}/sources/spec?package=${obj.package}&version=${obj.version}&force=true` + ); + if (firstRes.ok) { + return { ok: true }; + } else if (firstRes.error) { + return { ok: false, error: `Cannot load specs for ${obj.package}:${obj.version}: ${firstRes.error}` }; + } else { + for (let i = 0; i < 60; i++) { + await new Promise(resolve => setTimeout(resolve, 2000)); + const resp = await rpc(`/api/${workspace.id}/sources/spec?package=${obj.package}&version=${obj.version}`); + if (!resp.pending) { + if (resp.error) { + return { ok: false, error: `Cannot load specs for ${obj.package}:${obj.version}: ${resp.error}` }; + } else { + return { ok: true }; + } + } + } + return { ok: false, error: `Cannot load specs for ${obj.package}:${obj.version}: Timeout` }; + } + } catch (error: any) { + return { ok: false, error: `Cannot load specs for ${obj.package}:${obj.version}: ${error.message}` }; + } + }, + editorTitle: (_: ConnectorImageConfig, isNew: boolean) => { + const verb = isNew ? "New" : "Edit"; + return ( +
    +
    + +
    + {verb} custom image +
    + ); + }, + actions: [ + { + icon: , + title: "Setup Connector", + collapsed: false, + link: s => + `/services?id=new&packageType=airbyte&packageId=${encodeURIComponent(s.package)}&version=${encodeURIComponent( + s.version + )}`, + }, + ], + }; + return ( + <> + + + ); +}; + +export default CustomImages; diff --git a/webapps/console/pages/[workspaceId]/services.tsx b/webapps/console/pages/[workspaceId]/services.tsx index 1ac316c19..628195214 100644 --- a/webapps/console/pages/[workspaceId]/services.tsx +++ b/webapps/console/pages/[workspaceId]/services.tsx @@ -151,10 +151,16 @@ const ServicesList: React.FC<{}> = () => { packageType = router.query["packageType"] as string; packageId = router.query["packageId"] as string; } - const rawVersions = await rpc( - `/api/sources/versions?type=${packageType}&package=${encodeURIComponent(packageId)}` - ); - const versions = rawVersions.versions + let rawVersions: any[] = []; + try { + const rv = await rpc(`/api/sources/versions?type=${packageType}&package=${encodeURIComponent(packageId)}`); + rawVersions = rv.versions; + } catch (error: any) { + console.warn( + `Couldn't load package versions from docker repository. Probably ${packageId} is not a docker repository package.` + ); + } + const versions = rawVersions .filter( (v: any) => v.isRelease && From 33eb6ed9890732d014de411531152b05cf19cca5 Mon Sep 17 00:00:00 2001 From: Rodrigo Soares <55877037+rodfsoares@users.noreply.github.com> Date: Mon, 20 Jan 2025 11:50:37 +0000 Subject: [PATCH 1044/1353] chore(@console): remove risky console.logs (#1170) * chore: remove risky console.logs --- libs/core-functions/src/functions/ga4-destination.ts | 2 +- libs/core-functions/src/meta.ts | 8 +++++++- webapps/console/components/SignInOrUp/SignIn.tsx | 1 - webapps/console/lib/nextauth.config.ts | 1 - 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/libs/core-functions/src/functions/ga4-destination.ts b/libs/core-functions/src/functions/ga4-destination.ts index e1ade9d27..ebcf536ec 100644 --- a/libs/core-functions/src/functions/ga4-destination.ts +++ b/libs/core-functions/src/functions/ga4-destination.ts @@ -348,7 +348,7 @@ const Ga4Destination: JitsuFunction = asyn return; } - const baseUrl = ctx.props.url ?? 'https://www.google-analytics.com/mp/collect'; + const baseUrl = ctx.props.url ?? "https://www.google-analytics.com/mp/collect"; const url = `${baseUrl}?${query}`; diff --git a/libs/core-functions/src/meta.ts b/libs/core-functions/src/meta.ts index 769690e52..d2cb7cbc1 100644 --- a/libs/core-functions/src/meta.ts +++ b/libs/core-functions/src/meta.ts @@ -304,7 +304,13 @@ export const Ga4Credentials = z.object({ "The measurement ID associated with a stream.
    For Web: found in the Google Analytics UI under: " + "Admin > Data Streams > choose your stream > Measurement ID
    For Apps: the Firebase App ID, found in the Firebase console under: Project Settings > General > Your Apps > App ID" ), - url: z.string().url().describe("Measurement Protocol URL.
    Default: https://www.google-analytics.com/mp/collect
    Default debug url: https://www.google-analytics.com/debug/mp/collect").default('https://www.google-analytics.com/mp/collect'), + url: z + .string() + .url() + .describe( + "Measurement Protocol URL.
    Default: https://www.google-analytics.com/mp/collect
    Default debug url: https://www.google-analytics.com/debug/mp/collect" + ) + .default("https://www.google-analytics.com/mp/collect"), events: z.string().optional().default("").describe(eventsParamDescription), }); export type Ga4Credentials = z.infer; diff --git a/webapps/console/components/SignInOrUp/SignIn.tsx b/webapps/console/components/SignInOrUp/SignIn.tsx index 2b221d831..ee3c942e3 100644 --- a/webapps/console/components/SignInOrUp/SignIn.tsx +++ b/webapps/console/components/SignInOrUp/SignIn.tsx @@ -117,7 +117,6 @@ export const SocialLogin: React.FC<{ onSocialLogin: (type: string) => Promise Date: Mon, 20 Jan 2025 16:21:39 +0400 Subject: [PATCH 1045/1353] console: Support for Workspace level and wildcard domains (#1171) * console: Support for Workspace level and wildcard domains --- .../components/ConfigObjectEditor/Editors.tsx | 2 +- .../DomainsEditor/DomainsEditor.tsx | 379 ++++++++++++++++++ .../PageLayout/WorkspacePageLayout.tsx | 3 + .../TrackingIntegrationDocumentation.tsx | 8 +- webapps/console/lib/schema/config-objects.ts | 18 +- webapps/console/lib/schema/index.ts | 7 + webapps/console/lib/server/custom-domains.ts | 30 +- .../lib/shared/domain-check-response.ts | 4 +- webapps/console/lib/store/index.tsx | 12 +- webapps/console/lib/useApi.ts | 2 +- .../pages/[workspaceId]/settings/domains.tsx | 89 ++++ .../console/pages/[workspaceId]/streams.tsx | 338 +--------------- .../pages/api/[workspaceId]/domain-check.ts | 46 ++- .../pages/api/admin/export/[name]/index.ts | 16 +- 14 files changed, 605 insertions(+), 349 deletions(-) create mode 100644 webapps/console/components/DomainsEditor/DomainsEditor.tsx create mode 100644 webapps/console/pages/[workspaceId]/settings/domains.tsx diff --git a/webapps/console/components/ConfigObjectEditor/Editors.tsx b/webapps/console/components/ConfigObjectEditor/Editors.tsx index da20484f0..a657016b1 100644 --- a/webapps/console/components/ConfigObjectEditor/Editors.tsx +++ b/webapps/console/components/ConfigObjectEditor/Editors.tsx @@ -6,7 +6,7 @@ dayjs.extend(utc); export type CustomWidgetProps = { value: T | undefined; - onChange: (value: T) => void; + onChange: (value: T) => Promise | void; }; export const DateEditor: React.FC<{ format: string } & CustomWidgetProps> = props => { return ( diff --git a/webapps/console/components/DomainsEditor/DomainsEditor.tsx b/webapps/console/components/DomainsEditor/DomainsEditor.tsx new file mode 100644 index 000000000..b224b9132 --- /dev/null +++ b/webapps/console/components/DomainsEditor/DomainsEditor.tsx @@ -0,0 +1,379 @@ +import React, { PropsWithChildren, useMemo, useState } from "react"; +import { CustomWidgetProps } from "../ConfigObjectEditor/Editors"; +import { useAppConfig, useWorkspace } from "../../lib/context"; +import { DomainCheckResponse } from "../../lib/shared/domain-check-response"; +import { get } from "../../lib/useApi"; +import { confirmOp, feedbackError } from "../../lib/ui"; +import { Button, Input, notification, Tag, Tooltip } from "antd"; +import { getEeClient } from "../../lib/ee-client"; +import { requireDefined } from "juava"; +import { useQuery } from "@tanstack/react-query"; +import { getAntdModal, useAntdModal } from "../../lib/modal"; +import { Globe } from "lucide-react"; +import { FaExternalLinkAlt, FaSpinner, FaTrash, FaWrench } from "react-icons/fa"; +import { ReloadOutlined } from "@ant-design/icons"; +import { useRouter } from "next/router"; +import { WLink } from "../Workspace/WLink"; + +const StatusBadge: React.FC< + PropsWithChildren<{ status: "error" | "warning" | "info" | "success" | "loading"; className?: string }> +> = ({ status, children, className }) => { + let color: string | undefined; + let defaultDescription: string; + if (status === "error") { + color = "red"; + defaultDescription = "Error"; + } else if (status === "success") { + color = "cyan"; + defaultDescription = "Success"; + } else if (status === "info") { + color = "geekblue"; + defaultDescription = "Info"; + } else if (status === "warning") { + color = "orange"; + defaultDescription = "Warning"; + } else { + color = undefined; + defaultDescription = "Loading"; + } + return {children || defaultDescription}; +}; + +function displayErrorFeedback(opts?: { message?: string; error?: any }) { + notification.open({ + message: "An error occurred while processing your request. Please try again later.", + description: `Error: ${opts?.message || opts?.error?.message || opts?.error?.toString() || "Unknown error"}`, + onClick: () => { + //console.log("Notification Clicked!"); + }, + }); +} + +const CustomDomain: React.FC<{ domain: string; deleteDomain?: () => Promise; workspaceDomain?: boolean }> = ({ + domain, + deleteDomain, + workspaceDomain, +}) => { + const appConfig = useAppConfig(); + const workspace = useWorkspace(); + const router = useRouter(); + + const eeClient = useMemo( + () => getEeClient(requireDefined(appConfig.ee.host, `EE is not available`), workspace.id), + [appConfig.ee.host, workspace.id] + ); + const [reloadTrigger, setReloadTrigger] = useState(0); + const [deleting, setDeleting] = useState(false); + const { data, isLoading, error, refetch } = useQuery( + ["domain-status", domain.toLowerCase(), reloadTrigger], + async () => { + return await get(`/api/${workspace.id}/domain-check?domain=${domain.toLowerCase()}`); + }, + { cacheTime: 0 } + ); + const m = useAntdModal(); + return ( +
    + <> +
    + {/*
    */} + {/* */} + {/*
    */} +
    + +
    +
    {domain}
    +
    + + + + {data?.reason === "requires_cname_configuration" && ( + + + + )} + + + + {deleteDomain && ( + + )} + {workspaceDomain && ( + { + router.push(`/${workspace.id}/settings/domains`); + }} + > + Workspace Domain + + )} +
    +
    +
    +
    Status:
    + {(() => { + if (isLoading) { + return ( + + + + Checking Domain Status + + + ); + } else if (data?.ok) { + return OK; + } else if (data?.reason === "requires_cname_configuration") { + return Configuration Required; + } else if (data?.reason === "pending_ssl") { + return Issuing Certificate; + } else { + return {data?.reason || "ERROR"}; + } + })()} +
    + {error && ( +
    +
    Description:
    +
    {`${"Internal error"}`}
    +
    + )} + {data?.reason === "requires_cname_configuration" && ( + + )} + {data?.reason === "pending_ssl" && ( +
    +
    Description:
    +
    Issuing SSL certificate for the domain. It may take up to 10 minutes.
    +
    + )} + +
    + ); +}; +export type DNSRecordTableProps = { + records: { name: string; type: string; value: string; ok: boolean }[]; +}; + +export const DNSRecordTable: React.FC = ({ records }) => { + return ( +
    + + + + + + + + + + {records.map(({ name, type, value, ok }) => ( + + + + + + + ))} + +
    TypeNameValue
    {ok ? "✅" : "⚠️"}{type}{name}{value}
    + ); +}; + +export type DomainInstructionsProps = { domain: string; status: DomainCheckResponse }; +const DomainConfigurationInstructions: React.FC & { + show: (p: DomainInstructionsProps) => void; +} = ({ domain, status }) => { + if (status.reason === "requires_cname_configuration") { + return ( +
    +

    Set the following records on your DNS provider to continue

    +

    + ({ ...c, type: "CNAME" }))} /> +

    +
    + ); + } else { + return
    Unknown configuration type
    ; + } +}; + +DomainConfigurationInstructions.show = p => { + getAntdModal().info({ + width: "80%", + style: { maxWidth: "80%" }, + title: ( +

    + {p.domain} configuration instructions +

    + ), + content: , + }); +}; + +export const DomainsEditor: React.FC< + { context: "site" | "workspace"; workspaceDomains?: string[] } & CustomWidgetProps +> = ({ onChange, value: domains, workspaceDomains, context }) => { + console.log("DomainsEditor", domains, workspaceDomains); + const [addValue, setAddValue] = useState(); + const [addPending, setAddPending] = useState(false); + const workspace = useWorkspace(); + const add = async () => { + setAddPending(true); + try { + if (addValue?.includes("*") && context !== "workspace") { + feedbackError("Wildcard domains are only allowed on Workspace level"); + return; + } + const available: DomainCheckResponse = await get(`/api/${workspace.id}/domain-check?domain=${addValue}`); + if (!available.ok) { + if (available.reason === "used_by_other_workspace") { + feedbackError( + <> + Domain {addValue} is not available. It is used by other workspace. Contact{" "} + support@jitsu.com if you think this is a mistake + + ); + return; + } else if (available.reason === "invalid_domain_name") { + feedbackError( + <> + Invalid domain name {addValue} + + ); + return; + } + } + const newVal = [...(domains ?? []), addValue as string]; + setAddValue(undefined); + await onChange(newVal); + } catch (e) { + feedbackError(`Can't add domain ${addValue}`, { error: e }); + } finally { + setAddPending(false); + } + }; + return ( +
    + {(workspaceDomains ?? []).filter(d => d.includes("*")).length > 0 && ( +
    + The following wildcard domains are configured on the Workspace{" "} + level: +
    + {(workspaceDomains ?? []) + .filter(d => d.includes("*")) + .map(d => { + return ( + + {d} + + ); + })} +
    +
    Subdomains of these domains can be added without additional configuration.
    +
    + )} +
    + setAddValue(e.target.value)} + onKeyDown={e => { + if (e.key === "Enter") { + add(); + e.preventDefault(); + } + }} + /> + +
    +
    + {(workspaceDomains ?? []) + .filter(d => !d.includes("*")) + .map(domain => { + return ( +
    + +
    + ); + })} + {(domains ?? []).map(domain => { + return ( +
    + { + const newVal = domains!.filter(d => d !== domain); + await onChange(newVal); + }} + /> +
    + ); + })} +
    +
    + ); +}; diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index 9aba212f3..66136df2f 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -613,6 +613,9 @@ function PageHeader() { icon: , items: [ { title: "Workspace Settings", path: "/settings", icon: }, + appConfig.customDomainsEnabled + ? { title: "Domains", path: "/settings/domains", icon: } + : undefined, { title: "User Settings", path: "/user", icon: , globalPath: true }, { title: "Billing Settings", path: "/settings/billing", icon: }, billing.enabled && billing.settings?.dataRetentionEditorEnabled diff --git a/webapps/console/components/TrackingIntegrationDocumentation/TrackingIntegrationDocumentation.tsx b/webapps/console/components/TrackingIntegrationDocumentation/TrackingIntegrationDocumentation.tsx index f4af59620..1604dbec9 100644 --- a/webapps/console/components/TrackingIntegrationDocumentation/TrackingIntegrationDocumentation.tsx +++ b/webapps/console/components/TrackingIntegrationDocumentation/TrackingIntegrationDocumentation.tsx @@ -19,6 +19,7 @@ import { HiSelector } from "react-icons/hi"; import { HTTPManual } from "./HTTPApi"; import { Plug } from "lucide-react"; import { useQueryStringState } from "../../lib/useQueryStringState"; +import { useConfigObjectList } from "../../lib/store"; function SegmentLogo() { return ( @@ -87,6 +88,8 @@ export const TrackingIntegrationDocumentation: React.FC<{ streamId: string; onCa streamId, onCancel, }) => { + const ds = useConfigObjectList("domain"); + const staticDomains = ds.filter(d => !d.name.includes("*")).map(d => d.name); const appConfig = useAppConfig(); const configApi = useConfigApi("stream"); const [selectedDomain, setSelectedDomain] = useState(); @@ -115,7 +118,10 @@ export const TrackingIntegrationDocumentation: React.FC<{ streamId: string; onCa } else { domains = stream ? appConfig.publicEndpoints.dataHost || appConfig.ee.available - ? [...(stream?.domains ?? []), `${stream.id}.${appConfig.publicEndpoints.dataHost}`] + ? [ + ...new Set([...staticDomains, ...(stream?.domains ?? [])]), + `${stream.id}.${appConfig.publicEndpoints.dataHost}`, + ] : ["{deploy domain}"] : []; } diff --git a/webapps/console/lib/schema/config-objects.ts b/webapps/console/lib/schema/config-objects.ts index 2c4d7f8a0..b2768ee73 100644 --- a/webapps/console/lib/schema/config-objects.ts +++ b/webapps/console/lib/schema/config-objects.ts @@ -9,11 +9,13 @@ import { FunctionConfig, ServiceConfig, StreamConfig, + WorkspaceDomain, } from "./index"; import { assertDefined, createHash, requireDefined } from "juava"; import { checkOrAddToIngress, isDomainAvailable } from "../server/custom-domains"; import { ZodType, ZodTypeDef } from "zod"; import { getServerLog } from "../server/log"; +import { getWildcardDomains } from "../../pages/api/[workspaceId]/domain-check"; const log = getServerLog("config-objects"); @@ -129,7 +131,7 @@ const configObjectTypes: Record = { inputFilter: async obj => { const workspaceId = obj.workspaceId; - for (const domain of obj.domains || []) { + outer: for (const domain of obj.domains || []) { const domainAvailability = await isDomainAvailable(domain, workspaceId); if (!domainAvailability.available) { log @@ -139,6 +141,17 @@ const configObjectTypes: Record = { ); throw new ApiError(`Domain ${domain} is already in use by other workspace`); } + const wildcardDomains = await getWildcardDomains(workspaceId); + for (const wildcardDomain of wildcardDomains) { + if (domain.toLowerCase().endsWith(wildcardDomain.toLowerCase().replace("*", ""))) { + log + .atInfo() + .log( + `No need to check ingress status for ${domain} since it is under wildcard domain: ${wildcardDomain}` + ); + continue outer; + } + } try { const ingressStatus = await checkOrAddToIngress(domain); log.atInfo().log(`Ingress status for ${domain}: ${JSON.stringify(ingressStatus)}`); @@ -173,4 +186,7 @@ const configObjectTypes: Record = { "custom-image": { schema: ConnectorImageConfig, }, + domain: { + schema: WorkspaceDomain, + }, } as const; diff --git a/webapps/console/lib/schema/index.ts b/webapps/console/lib/schema/index.ts index 0ab8b085c..302b530fc 100644 --- a/webapps/console/lib/schema/index.ts +++ b/webapps/console/lib/schema/index.ts @@ -179,6 +179,13 @@ export const ConnectorImageConfig = ConfigEntityBase.merge( ); export type ConnectorImageConfig = z.infer; +export const WorkspaceDomain = ConfigEntityBase.merge( + z.object({ + name: z.string(), + }) +); +export type WorkspaceDomain = z.infer; + /** * What happens to an object before it is saved to DB. * diff --git a/webapps/console/lib/server/custom-domains.ts b/webapps/console/lib/server/custom-domains.ts index 958f9a70e..c77bfb06b 100644 --- a/webapps/console/lib/server/custom-domains.ts +++ b/webapps/console/lib/server/custom-domains.ts @@ -1,5 +1,4 @@ import { db } from "./db"; -import { StreamConfig } from "../schema"; import dns from "dns"; import { getLog, requireDefined } from "juava"; import { httpAgent, httpsAgent } from "./http-agent"; @@ -13,17 +12,32 @@ export const customDomainCnames = process.env.CUSTOM_DOMAIN_CNAMES?.split(","); * Tells if the given domain is used in other workspaces. */ export async function isDomainAvailable(domain: string, workspaceId: string): Promise { - const pattern = `%${domain.toLowerCase()}%`; + const domainSuffix = domain.replace(/^[*]/, ""); + const fullTextPattern = `%${domainSuffix.toLowerCase()}%`; + const pattern = `%${domainSuffix.toLowerCase()}`; const dirtyList = (await db.prisma().$queryRaw` - select "id", "workspaceId", "config" + select id,type, "workspaceId", config->'domains' as domains from newjitsu."ConfigurationObject" where type = 'stream' - and config::TEXT ilike ${pattern} + and config::TEXT ilike ${fullTextPattern} and "workspaceId" <> ${workspaceId} - `) as { id: string; workspaceId: string; config: string }[]; - const list = dirtyList.filter(({ config, ...props }) => { - const stream = StreamConfig.parse({ ...(config as any), ...props }); - return (stream.domains || []).map(d => d.toLowerCase()).includes(domain.toLowerCase()); + and deleted = false + union + select id,type, "workspaceId", json_array(config->'name') as domains + from newjitsu."ConfigurationObject" + where type = 'domain' + and (config->>'name' ilike ${pattern} or ${domain.toLowerCase()} ilike REPLACE(config->>'name','*','%') ) + and "workspaceId" <> ${workspaceId} + and deleted = false + `) as { id: string; workspaceId: string; domains: string[] }[]; + + const list = dirtyList.filter(({ domains }) => { + return ( + (domains || []).filter(d => d.toLowerCase().endsWith(domainSuffix)).length > 0 || + (domains || []).filter(d => { + return d.startsWith("*") && domain.toLowerCase().endsWith(d.toLowerCase().replace(/^[*]/, "")); + }).length > 0 + ); }); if (list.length > 0) { diff --git a/webapps/console/lib/shared/domain-check-response.ts b/webapps/console/lib/shared/domain-check-response.ts index f1c38b868..628cc8092 100644 --- a/webapps/console/lib/shared/domain-check-response.ts +++ b/webapps/console/lib/shared/domain-check-response.ts @@ -14,12 +14,12 @@ export const DomainCheckResponse = z.union([ z.literal("pending_ssl"), z.literal("internal_error"), ]), - cnameValue: z.never().optional(), + cnames: z.never().optional(), }), z.object({ ok: z.literal(false), reason: z.literal("requires_cname_configuration"), - cnameValue: z.string().optional(), + cnames: z.array(z.object({ name: z.string(), value: z.string(), ok: z.boolean() })), }), ]); diff --git a/webapps/console/lib/store/index.tsx b/webapps/console/lib/store/index.tsx index 3a2e848de..9a8e405ca 100644 --- a/webapps/console/lib/store/index.tsx +++ b/webapps/console/lib/store/index.tsx @@ -1,4 +1,11 @@ -import type { ConnectorImageConfig, DestinationConfig, FunctionConfig, ServiceConfig, StreamConfig } from "../schema"; +import type { + ConnectorImageConfig, + DestinationConfig, + FunctionConfig, + ServiceConfig, + StreamConfig, + WorkspaceDomain, +} from "../schema"; import { useCallback, useEffect, useMemo, useState } from "react"; import { getLog, requireDefined, rpc } from "juava"; import { useWorkspace } from "../context"; @@ -7,7 +14,7 @@ import { z } from "zod"; import { ConfigurationObjectLinkDbModel, ProfileBuilderDbModel, WorkspaceDbModel } from "../../prisma/schema"; import { UseMutationResult } from "@tanstack/react-query/src/types"; -export const allConfigTypes = ["stream", "service", "function", "destination", "custom-image"] as const; +export const allConfigTypes = ["stream", "service", "function", "destination", "custom-image", "domain"] as const; export type ConfigType = (typeof allConfigTypes)[number]; @@ -17,6 +24,7 @@ export type ConfigTypes = { function: FunctionConfig; destination: DestinationConfig; "custom-image": ConnectorImageConfig; + domain: WorkspaceDomain; }; export function asConfigType(type: string): ConfigType { diff --git a/webapps/console/lib/useApi.ts b/webapps/console/lib/useApi.ts index 20c5e693b..c23091464 100644 --- a/webapps/console/lib/useApi.ts +++ b/webapps/console/lib/useApi.ts @@ -9,7 +9,7 @@ import { EventsLogFilter, EventsLogRecord } from "./server/events-log"; export type ConfigApi = { get(id: string): Promise; - create(obj: Omit): Promise; + create(obj: T): Promise; update(id: string, obj: Partial): Promise; test(obj: Partial): Promise; del(id: string): Promise; diff --git a/webapps/console/pages/[workspaceId]/settings/domains.tsx b/webapps/console/pages/[workspaceId]/settings/domains.tsx new file mode 100644 index 000000000..7899fbadd --- /dev/null +++ b/webapps/console/pages/[workspaceId]/settings/domains.tsx @@ -0,0 +1,89 @@ +import React, { useCallback } from "react"; +import { useWorkspace } from "../../../lib/context"; +import { WorkspacePageLayout } from "../../../components/PageLayout/WorkspacePageLayout"; +import { useBilling } from "../../../components/Billing/BillingProvider"; +import { LoadingAnimation } from "../../../components/GlobalLoader/GlobalLoader"; +import { UpgradeDialog } from "../../../components/Billing/UpgradeDialog"; +import { DomainsEditor } from "../../../components/DomainsEditor/DomainsEditor"; +import { useConfigApi } from "../../../lib/useApi"; +import { WorkspaceDomain } from "../../../lib/schema"; +import cuid from "cuid"; +import { useConfigObjectList, useConfigObjectMutation } from "../../../lib/store"; + +const WorkspaceDomainsComponent: React.FC = () => { + const domainsRaw = useConfigObjectList("domain"); + const domains = domainsRaw.map((d: any) => d.name); + const configApi = useConfigApi("domain"); + const workspace = useWorkspace(); + const billing = useBilling(); + + const onSaveMutation = useConfigObjectMutation("domain", async (newObject: any) => { + await configApi.create(newObject); + }); + + const onDeleteMutation = useConfigObjectMutation("domain", async (obj: any) => { + await configApi.del(obj.id); + }); + + const updateDomains = useCallback( + async (newDomains: string[]) => { + const toAdd = newDomains.filter(d => !domains.includes(d)); + const toDelete = domainsRaw.filter(d => !newDomains.includes(d.name)); + for (const domain of toAdd) { + await onSaveMutation.mutateAsync({ id: cuid(), type: "domain", workspaceId: workspace.id, name: domain }); + } + for (const domain of toDelete) { + await onDeleteMutation.mutateAsync(domain); + } + }, + [domainsRaw, domains, onSaveMutation, workspace.id, onDeleteMutation] + ); + + if (billing.loading) { + return ; + } + if (billing.enabled && billing.settings?.planId === "free") { + return ; + } + + return ( +
    +
    +
    +
    Workspace Domains
    +
    +

    + In this section you can manage domains for your workspace. Jitsu can issue SSL certificates for added + domains and serve your data on them. +

    +

    Jitsu supports both regular domains and wildcard domains but with some differences:

    +

    + Regular domain: data.example.com – regular domain added on Workspace level is + automatically applied to all workspace Sites +

    +

    + Wildcard domain: *.data.example.com – Jitsu issues a SSL certificate for wildcard + domain. For each workspace Site you need to add a specific subdomain. For example, if you set up{" "} + *.data.example.com here, you can add domain site1.data.example.com for Site1 and{" "} + site2.data.example.com for Site2. That will allow you to use the same SSL certificate for all + subdomains and save time on issuing new certificates. +

    +
    +
    + +
    +
    +
    +
    + ); +}; + +const WorkspaceDomains: React.FC = () => { + return ( + + + + ); +}; + +export default WorkspaceDomains; diff --git a/webapps/console/pages/[workspaceId]/streams.tsx b/webapps/console/pages/[workspaceId]/streams.tsx index 6b70b9b2f..17006b7d3 100644 --- a/webapps/console/pages/[workspaceId]/streams.tsx +++ b/webapps/console/pages/[workspaceId]/streams.tsx @@ -1,32 +1,23 @@ import { WorkspacePageLayout } from "../../components/PageLayout/WorkspacePageLayout"; -import { Button, Input, notification, Tag, Tooltip } from "antd"; import { ConfigEditor, ConfigEditorProps, CustomCheckbox } from "../../components/ConfigObjectEditor/ConfigEditor"; import { StreamConfig } from "../../lib/schema"; import { useAppConfig, useWorkspace } from "../../lib/context"; -import React, { PropsWithChildren, useMemo, useState } from "react"; +import React, { useState } from "react"; import Link from "next/link"; -import { FaExternalLinkAlt, FaSpinner, FaTrash, FaWrench } from "react-icons/fa"; +import { FaExternalLinkAlt } from "react-icons/fa"; import { branding } from "../../lib/branding"; import { useRouter } from "next/router"; import { TrackingIntegrationDocumentation } from "../../components/TrackingIntegrationDocumentation/TrackingIntegrationDocumentation"; import { StreamKeysEditor } from "../../components/ApiKeyEditor/ApiKeyEditor"; -import { useQuery } from "@tanstack/react-query"; -import { getEeClient } from "../../lib/ee-client"; -import { requireDefined } from "juava"; -import { ReloadOutlined } from "@ant-design/icons"; -import { confirmOp, feedbackError } from "../../lib/ui"; -import { getAntdModal, useAntdModal } from "../../lib/modal"; -import { get } from "../../lib/useApi"; -import { Activity, AlertTriangle, Check, Globe, Wrench, Zap } from "lucide-react"; +import { Activity, AlertTriangle, Check, Wrench, Zap } from "lucide-react"; import { FaviconLoader } from "./index"; import { ObjectTitle } from "../../components/ObjectTitle/ObjectTitle"; import omit from "lodash/omit"; -import { CustomWidgetProps } from "../../components/ConfigObjectEditor/Editors"; import { toURL } from "../../lib/shared/url"; import JSON5 from "json5"; import { EditorToolbar } from "../../components/EditorToolbar/EditorToolbar"; -import { DomainCheckResponse } from "../../lib/shared/domain-check-response"; import { useConfigObjectLinks, useConfigObjectList } from "../../lib/store"; +import { DomainsEditor } from "../../components/DomainsEditor/DomainsEditor"; const Streams: React.FC = () => { return ( @@ -36,317 +27,6 @@ const Streams: React.FC = () => { ); }; -const StatusBadge: React.FC< - PropsWithChildren<{ status: "error" | "warning" | "info" | "success" | "loading"; className?: string }> -> = ({ status, children, className }) => { - let color: string | undefined; - let defaultDescription: string; - if (status === "error") { - color = "red"; - defaultDescription = "Error"; - } else if (status === "success") { - color = "cyan"; - defaultDescription = "Success"; - } else if (status === "info") { - color = "geekblue"; - defaultDescription = "Info"; - } else if (status === "warning") { - color = "orange"; - defaultDescription = "Warning"; - } else { - color = undefined; - defaultDescription = "Loading"; - } - return {children || defaultDescription}; -}; - -function displayErrorFeedback(opts?: { message?: string; error?: any }) { - notification.open({ - message: "An error occurred while processing your request. Please try again later.", - description: `Error: ${opts?.message || opts?.error?.message || opts?.error?.toString() || "Unknown error"}`, - onClick: () => { - //console.log("Notification Clicked!"); - }, - }); -} - -const CustomDomain: React.FC<{ domain: string; deleteDomain: () => Promise }> = ({ domain, deleteDomain }) => { - const appConfig = useAppConfig(); - const workspace = useWorkspace(); - - const eeClient = useMemo( - () => getEeClient(requireDefined(appConfig.ee.host, `EE is not available`), workspace.id), - [appConfig.ee.host, workspace.id] - ); - const [reloadTrigger, setReloadTrigger] = useState(0); - const [deleting, setDeleting] = useState(false); - const { data, isLoading, error, refetch } = useQuery( - ["domain-status", domain.toLowerCase(), reloadTrigger], - async () => { - return await get(`/api/${workspace.id}/domain-check?domain=${domain.toLowerCase()}`); - }, - { cacheTime: 0 } - ); - const m = useAntdModal(); - return ( -
    - <> -
    - {/*
    */} - {/* */} - {/*
    */} -
    - -
    -
    {domain}
    -
    - - - - {data?.reason === "requires_cname_configuration" && ( - - - - )} - - - - -
    -
    -
    -
    Status:
    - {(() => { - if (isLoading) { - return ( - - - - Checking Domain Status - - - ); - } else if (data?.ok) { - return OK; - } else if (data?.reason === "requires_cname_configuration") { - return Configuration Required; - } else if (data?.reason === "pending_ssl") { - return Issuing Certificate; - } else { - return {data?.reason || "ERROR"}; - } - })()} -
    - {error && ( -
    -
    Description:
    -
    {`${"Internal error"}`}
    -
    - )} - {data?.reason === "requires_cname_configuration" && ( - - )} - {data?.reason === "pending_ssl" && ( -
    -
    Description:
    -
    Issuing SSL certificate for the domain. It may take up to 10 minutes.
    -
    - )} - -
    - ); -}; -export type DNSRecordTableProps = { - records: { domain: string; type: string; value: string }[]; -}; - -export const DNSRecordTable: React.FC = ({ records }) => { - return ( - - - - - - - - - - {records.map(({ domain, type, value }) => ( - - - - - - ))} - -
    TypeNameValue
    {type}{domain}{value}
    - ); -}; - -export type DomainInstructionsProps = { domain: string; status: DomainCheckResponse }; -const DomainConfigurationInstructions: React.FC & { - show: (p: DomainInstructionsProps) => void; -} = ({ domain, status }) => { - if (status.reason === "requires_cname_configuration") { - return ( -
    -

    Set the following record on your DNS provider to continue

    -

    - -

    -
    - ); - } else { - return
    Unknown configuration type
    ; - } -}; - -DomainConfigurationInstructions.show = p => { - getAntdModal().info({ - width: "90vw", - style: { maxWidth: "48rem" }, - title: ( -

    - {p.domain} configuration instructions -

    - ), - content: , - }); -}; - -const DomainsEditor: React.FC> = props => { - const [domains, setDomains] = useState(props.value || []); - const [addValue, setAddValue] = useState(); - const [addPending, setAddPending] = useState(false); - const workspace = useWorkspace(); - const add = async () => { - setAddPending(true); - try { - const available: DomainCheckResponse = await get(`/api/${workspace.id}/domain-check?domain=${addValue}`); - if (!available.ok) { - if (available.reason === "used_by_other_workspace") { - feedbackError( - <> - Domain {addValue} is not available. It is used by other workspace. Contact{" "} - support@jitsu.com if you think this is a mistake - - ); - return; - } else if (available.reason === "invalid_domain_name") { - feedbackError( - <> - Invalid domain name {addValue} - - ); - return; - } - } - const newVal = [...domains, addValue as string]; - setDomains(newVal); - setAddValue(undefined); - props.onChange(newVal); - } catch (e) { - feedbackError(`Can't add domain ${addValue}`, { error: e }); - } finally { - setAddPending(false); - } - }; - return ( -
    -
    - setAddValue(e.target.value)} - onKeyDown={e => { - if (e.key === "Enter") { - add(); - e.preventDefault(); - } - }} - /> - -
    -
    - {domains.map(domain => ( -
    - { - const newVal = domains.filter(d => d !== domain); - setDomains(newVal); - props.onChange(newVal); - }} - /> -
    - ))} -
    -
    - ); -}; - export const StreamTitle: React.FC<{ stream?: StreamConfig; size?: "small" | "default" | "large"; @@ -369,7 +49,8 @@ const StreamsList: React.FC<{}> = () => { const router = useRouter(); const appConfig = useAppConfig(); - const streams = useConfigObjectList("stream"); + const workspaceDomains = useConfigObjectList("domain").map(d => d.name); + const staticDomains = workspaceDomains.filter(d => !d.includes("*")); const connections = useConfigObjectLinks({ type: "push" }); const [implementationDocumentationId, setImplementationDocumentationId] = useState( @@ -461,7 +142,10 @@ const StreamsList: React.FC<{}> = () => { title: "Domains", render: (s: StreamConfig) => (
    - {[`${s.id}.${appConfig.publicEndpoints.dataHost}`, ...(s.domains || [])].map(domain => ( + {[ + `${s.id}.${appConfig.publicEndpoints.dataHost}`, + ...new Set([...staticDomains, ...(s.domains ?? [])]), + ].map(domain => (
    {domain}
    @@ -574,7 +258,7 @@ const StreamsList: React.FC<{}> = () => { ), }, domains: { - editor: DomainsEditor, + editor: (props: any) => , hidden: !appConfig.customDomainsEnabled, displayName: "Custom Tracking Domains", documentation: ( diff --git a/webapps/console/pages/api/[workspaceId]/domain-check.ts b/webapps/console/pages/api/[workspaceId]/domain-check.ts index f2ca46976..274a62303 100644 --- a/webapps/console/pages/api/[workspaceId]/domain-check.ts +++ b/webapps/console/pages/api/[workspaceId]/domain-check.ts @@ -4,6 +4,7 @@ import { z } from "zod"; import { customDomainCnames, isDomainAvailable, checkOrAddToIngress } from "../../../lib/server/custom-domains"; import { DomainCheckResponse } from "../../../lib/shared/domain-check-response"; import { createRoute, verifyAccess } from "../../../lib/api"; +import { db } from "../../../lib/server/db"; const log = getServerLog("custom-domains"); @@ -30,11 +31,25 @@ export default createRoute() ); return { ok: false, reason: "used_by_other_workspace" }; } + let domainToCheck = domain; + if (!domain.startsWith("*")) { + const wildcardDomains = await getWildcardDomains(workspaceId); + for (const wildcardDomain of wildcardDomains) { + if ( + domain.toLowerCase().endsWith(wildcardDomain.toLowerCase().replace("*", "")) && + domain.toLowerCase() !== wildcardDomain.toLowerCase() + ) { + domainToCheck = wildcardDomain; + break; + } + } + } + try { - const ingressStatus = await checkOrAddToIngress(domain); - log.atInfo().log(`Ingress status for ${domain}: ${JSON.stringify(ingressStatus)}`); + const ingressStatus = await checkOrAddToIngress(domainToCheck); + log.atInfo().log(`Ingress status for ${domainToCheck}: ${JSON.stringify(ingressStatus)}`); if (!ingressStatus) { - log.atWarn().log(`Incorrect ingress status ${domain} is not valid`); + log.atWarn().log(`Incorrect ingress status ${domainToCheck} is not valid`); return { ok: false, reason: "internal_error" }; } if (ingressStatus.status === "ok") { @@ -42,13 +57,34 @@ export default createRoute() } else if (ingressStatus.status === "pending_ssl") { return { ok: false, reason: "pending_ssl" }; } else if (ingressStatus.status === "dns_error") { - return { ok: false, reason: "requires_cname_configuration", cnameValue: customDomainCnames[0] }; + return { + ok: false, + reason: "requires_cname_configuration", + cnames: ingressStatus.cnames ?? [{ name: domainToCheck, value: customDomainCnames[0], ok: false }], + }; } else { return { ok: false, reason: "internal_error" }; } } catch (e) { - log.atError().withCause(e).log(`Error checking ingress status for ${domain}`); + log.atError().withCause(e).log(`Error checking ingress status for ${domainToCheck}`); return { ok: false, reason: "internal_error" }; } }) .toNextApiHandler(); + +export async function getWildcardDomains(workspaceId: string): Promise { + const objs = await db.prisma().configurationObject.findMany({ + where: { + workspaceId: workspaceId, + deleted: false, + type: "domain", + workspace: { deleted: false }, + }, + }); + return objs + .map(obj => { + const config = obj.config as any; + return config.name; + }) + .filter(name => name.startsWith("*")); +} diff --git a/webapps/console/pages/api/admin/export/[name]/index.ts b/webapps/console/pages/api/admin/export/[name]/index.ts index 0a6d21926..e371aefd6 100644 --- a/webapps/console/pages/api/admin/export/[name]/index.ts +++ b/webapps/console/pages/api/admin/export/[name]/index.ts @@ -339,6 +339,17 @@ const exports: Export[] = [ } getLog().atInfo().log(`Active workspaces: ${activeWorkspaces.size}`); } catch (error) {} + const domains = await db.prisma().configurationObject.findMany({ + where: { deleted: false, type: "domain", workspace: { deleted: false } }, + }); + const domainsMap = new Map(); + for (const domain of domains) { + const name = (domain.config as any).name; + if (!name.includes("*")) { + const d = domainsMap.get(domain.workspaceId) || []; + domainsMap.set(domain.workspaceId, [...d, (domain.config as any).name]); + } + } writer.write("["); let lastId: string | undefined = undefined; let needComma = false; @@ -381,7 +392,10 @@ const exports: Export[] = [ "updatedAt", "workspace" ), - ...obj.config, + ...{ + ...obj.config, + domains: [...new Set([...(domainsMap.get(obj.workspace.id) ?? []), ...(obj.config.domains ?? [])])], + }, workspaceId: obj.workspace.id, }, backupEnabled: isEEAvailable() && !(obj.workspace.featuresEnabled || []).includes("nobackup"), From 2b64a39ec915df17c2074da9a2ce3186f1184231 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 20 Jan 2025 16:35:02 +0400 Subject: [PATCH 1046/1353] fix --- webapps/console/lib/server/custom-domains.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/lib/server/custom-domains.ts b/webapps/console/lib/server/custom-domains.ts index c77bfb06b..303d2ae9a 100644 --- a/webapps/console/lib/server/custom-domains.ts +++ b/webapps/console/lib/server/custom-domains.ts @@ -23,7 +23,7 @@ export async function isDomainAvailable(domain: string, workspaceId: string): Pr and "workspaceId" <> ${workspaceId} and deleted = false union - select id,type, "workspaceId", json_array(config->'name') as domains + select id,type, "workspaceId", jsonb_build_array(config->'name') as domains from newjitsu."ConfigurationObject" where type = 'domain' and (config->>'name' ilike ${pattern} or ${domain.toLowerCase()} ilike REPLACE(config->>'name','*','%') ) From 216b273d55d0bfbd77ad47fc3040c4847cc8e0d2 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 20 Jan 2025 17:10:05 +0400 Subject: [PATCH 1047/1353] console: sanitize custom domains on API level --- webapps/console/lib/schema/config-objects.ts | 34 +++++++++++++------ .../pages/api/[workspaceId]/domain-check.ts | 15 ++++---- 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/webapps/console/lib/schema/config-objects.ts b/webapps/console/lib/schema/config-objects.ts index b2768ee73..02077ef95 100644 --- a/webapps/console/lib/schema/config-objects.ts +++ b/webapps/console/lib/schema/config-objects.ts @@ -132,38 +132,40 @@ const configObjectTypes: Record = { inputFilter: async obj => { const workspaceId = obj.workspaceId; outer: for (const domain of obj.domains || []) { - const domainAvailability = await isDomainAvailable(domain, workspaceId); + const domainToCheck = domain.trim().toLowerCase(); + const domainAvailability = await isDomainAvailable(domainToCheck, workspaceId); if (!domainAvailability.available) { log .atWarn() .log( - `Domain ${domain} can't be added to workspace ${workspaceId}, it is already in use by other workspaces: ${domainAvailability.usedInWorkspace}` + `Domain ${domainToCheck} can't be added to workspace ${workspaceId}, it is already in use by other workspaces: ${domainAvailability.usedInWorkspace}` ); - throw new ApiError(`Domain ${domain} is already in use by other workspace`); + throw new ApiError(`Domain ${domainToCheck} is already in use by other workspace`); } const wildcardDomains = await getWildcardDomains(workspaceId); for (const wildcardDomain of wildcardDomains) { - if (domain.toLowerCase().endsWith(wildcardDomain.toLowerCase().replace("*", ""))) { + if (domainToCheck.endsWith(wildcardDomain.toLowerCase().replace("*", ""))) { log .atInfo() .log( - `No need to check ingress status for ${domain} since it is under wildcard domain: ${wildcardDomain}` + `No need to check ingress status for ${domainToCheck} since it is under wildcard domain: ${wildcardDomain}` ); continue outer; } } try { - const ingressStatus = await checkOrAddToIngress(domain); - log.atInfo().log(`Ingress status for ${domain}: ${JSON.stringify(ingressStatus)}`); + const ingressStatus = await checkOrAddToIngress(domainToCheck); + log.atInfo().log(`Ingress status for ${domainToCheck}: ${JSON.stringify(ingressStatus)}`); if (!ingressStatus) { - log.atWarn().log(`Incorrect ingress status ${domain} is not valid`); + log.atWarn().log(`Incorrect ingress status ${domainToCheck} is not valid`); } } catch (e) { - log.atError().withCause(e).log(`Error checking ingress status for ${domain}`); + log.atError().withCause(e).log(`Error checking ingress status for ${domainToCheck}`); } } return { ...obj, + domains: obj.domains?.map(d => d.trim().toLowerCase()) || [], privateKeys: hashKeys(obj.privateKeys || [], []), publicKeys: hashKeys(obj.publicKeys || [], []), }; @@ -171,7 +173,7 @@ const configObjectTypes: Record = { outputFilter: (original: StreamConfig) => { return { ...original, - domains: original.domains?.map(d => d.toLowerCase()), + domains: original.domains?.map(d => d.trim().toLowerCase()), privateKeys: (original.privateKeys || []).map(k => ({ ...k, plaintext: undefined, hash: undefined })), publicKeys: (original.publicKeys || []).map(k => ({ ...k, plaintext: undefined, hash: undefined })), }; @@ -188,5 +190,17 @@ const configObjectTypes: Record = { }, domain: { schema: WorkspaceDomain, + inputFilter: async obj => { + return { + ...obj, + name: obj.name.trim().toLowerCase(), + }; + }, + outputFilter: (original: WorkspaceDomain) => { + return { + ...original, + name: original.name.trim().toLowerCase(), + }; + }, }, } as const; diff --git a/webapps/console/pages/api/[workspaceId]/domain-check.ts b/webapps/console/pages/api/[workspaceId]/domain-check.ts index 274a62303..5017d8ef1 100644 --- a/webapps/console/pages/api/[workspaceId]/domain-check.ts +++ b/webapps/console/pages/api/[workspaceId]/domain-check.ts @@ -22,24 +22,25 @@ export default createRoute() throw new Error(`CUSTOM_DOMAIN_CNAMES is not set`); } await verifyAccess(user, workspaceId); - const domainAvailability = await isDomainAvailable(domain, workspaceId); + let domainToCheck = domain.trim().toLowerCase(); + + const domainAvailability = await isDomainAvailable(domainToCheck, workspaceId); if (!domainAvailability.available) { log .atWarn() .log( - `Domain '${domain}' can't be added to workspace ${workspaceId}. It is used by ${domainAvailability.usedInWorkspace}` + `Domain '${domainToCheck}' can't be added to workspace ${workspaceId}. It is used by ${domainAvailability.usedInWorkspace}` ); return { ok: false, reason: "used_by_other_workspace" }; } - let domainToCheck = domain; - if (!domain.startsWith("*")) { + if (!domainToCheck.startsWith("*")) { const wildcardDomains = await getWildcardDomains(workspaceId); for (const wildcardDomain of wildcardDomains) { if ( - domain.toLowerCase().endsWith(wildcardDomain.toLowerCase().replace("*", "")) && - domain.toLowerCase() !== wildcardDomain.toLowerCase() + domainToCheck.endsWith(wildcardDomain.toLowerCase().replace("*", "")) && + domainToCheck !== wildcardDomain.toLowerCase() ) { - domainToCheck = wildcardDomain; + domainToCheck = wildcardDomain.trim().toLowerCase(); break; } } From 09c5456cfb7812b8e5d662111e96ad19a7c381ac Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 20 Jan 2025 17:39:10 +0400 Subject: [PATCH 1048/1353] console: check domain correctness on API level --- .../components/DomainsEditor/DomainsEditor.tsx | 4 ++-- webapps/console/lib/schema/config-objects.ts | 13 +++++++++++-- webapps/console/lib/server/custom-domains.ts | 3 +++ .../console/pages/api/[workspaceId]/domain-check.ts | 11 ++++++++++- 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/webapps/console/components/DomainsEditor/DomainsEditor.tsx b/webapps/console/components/DomainsEditor/DomainsEditor.tsx index b224b9132..4783dfd01 100644 --- a/webapps/console/components/DomainsEditor/DomainsEditor.tsx +++ b/webapps/console/components/DomainsEditor/DomainsEditor.tsx @@ -299,15 +299,15 @@ export const DomainsEditor: React.FC< } else if (available.reason === "invalid_domain_name") { feedbackError( <> - Invalid domain name {addValue} + Invalid domain name: {addValue} ); return; } } const newVal = [...(domains ?? []), addValue as string]; - setAddValue(undefined); await onChange(newVal); + setAddValue(undefined); } catch (e) { feedbackError(`Can't add domain ${addValue}`, { error: e }); } finally { diff --git a/webapps/console/lib/schema/config-objects.ts b/webapps/console/lib/schema/config-objects.ts index 02077ef95..59f386f70 100644 --- a/webapps/console/lib/schema/config-objects.ts +++ b/webapps/console/lib/schema/config-objects.ts @@ -12,7 +12,7 @@ import { WorkspaceDomain, } from "./index"; import { assertDefined, createHash, requireDefined } from "juava"; -import { checkOrAddToIngress, isDomainAvailable } from "../server/custom-domains"; +import { checkDomain, checkOrAddToIngress, isDomainAvailable } from "../server/custom-domains"; import { ZodType, ZodTypeDef } from "zod"; import { getServerLog } from "../server/log"; import { getWildcardDomains } from "../../pages/api/[workspaceId]/domain-check"; @@ -133,6 +133,10 @@ const configObjectTypes: Record = { const workspaceId = obj.workspaceId; outer: for (const domain of obj.domains || []) { const domainToCheck = domain.trim().toLowerCase(); + if (!checkDomain(domainToCheck)) { + log.atWarn().log(`Domain '${domainToCheck}' is not a valid domain name`); + throw new ApiError(`Domain ${domainToCheck} is not a valid domain name`); + } const domainAvailability = await isDomainAvailable(domainToCheck, workspaceId); if (!domainAvailability.available) { log @@ -191,9 +195,14 @@ const configObjectTypes: Record = { domain: { schema: WorkspaceDomain, inputFilter: async obj => { + const domainToCheck = obj.name.trim().toLowerCase(); + if (!checkDomain(domainToCheck)) { + log.atWarn().log(`Domain '${domainToCheck}' is not a valid domain name`); + throw new ApiError(`Domain ${domainToCheck} is not a valid domain name`); + } return { ...obj, - name: obj.name.trim().toLowerCase(), + name: domainToCheck, }; }, outputFilter: (original: WorkspaceDomain) => { diff --git a/webapps/console/lib/server/custom-domains.ts b/webapps/console/lib/server/custom-domains.ts index 303d2ae9a..26d254100 100644 --- a/webapps/console/lib/server/custom-domains.ts +++ b/webapps/console/lib/server/custom-domains.ts @@ -8,6 +8,9 @@ type DomainAvailability = { available: true; usedInWorkspaces?: never } | { avai export const customDomainCnames = process.env.CUSTOM_DOMAIN_CNAMES?.split(","); +export function checkDomain(domain: string): boolean { + return !!domain.match(/^(?:[*][.])?(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,63}$/); +} /** * Tells if the given domain is used in other workspaces. */ diff --git a/webapps/console/pages/api/[workspaceId]/domain-check.ts b/webapps/console/pages/api/[workspaceId]/domain-check.ts index 5017d8ef1..e3bff91a0 100644 --- a/webapps/console/pages/api/[workspaceId]/domain-check.ts +++ b/webapps/console/pages/api/[workspaceId]/domain-check.ts @@ -1,7 +1,12 @@ import { getServerLog } from "../../../lib/server/log"; import { z } from "zod"; -import { customDomainCnames, isDomainAvailable, checkOrAddToIngress } from "../../../lib/server/custom-domains"; +import { + customDomainCnames, + isDomainAvailable, + checkOrAddToIngress, + checkDomain, +} from "../../../lib/server/custom-domains"; import { DomainCheckResponse } from "../../../lib/shared/domain-check-response"; import { createRoute, verifyAccess } from "../../../lib/api"; import { db } from "../../../lib/server/db"; @@ -23,6 +28,10 @@ export default createRoute() } await verifyAccess(user, workspaceId); let domainToCheck = domain.trim().toLowerCase(); + if (!checkDomain(domainToCheck)) { + log.atWarn().log(`Domain '${domainToCheck}' is not a valid domain name`); + return { ok: false, reason: "invalid_domain_name" }; + } const domainAvailability = await isDomainAvailable(domainToCheck, workspaceId); if (!domainAvailability.available) { From 4d48edc78937a99f88001e2bcec7ec556d46a724 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 23 Jan 2025 09:49:49 +0400 Subject: [PATCH 1049/1353] console: added hidden loadAsJson setting for CH --- .../console/components/DomainsEditor/DomainsEditor.tsx | 1 - webapps/console/lib/schema/destinations.tsx | 9 +++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/webapps/console/components/DomainsEditor/DomainsEditor.tsx b/webapps/console/components/DomainsEditor/DomainsEditor.tsx index 4783dfd01..2e690fd50 100644 --- a/webapps/console/components/DomainsEditor/DomainsEditor.tsx +++ b/webapps/console/components/DomainsEditor/DomainsEditor.tsx @@ -275,7 +275,6 @@ DomainConfigurationInstructions.show = p => { export const DomainsEditor: React.FC< { context: "site" | "workspace"; workspaceDomains?: string[] } & CustomWidgetProps > = ({ onChange, value: domains, workspaceDomains, context }) => { - console.log("DomainsEditor", domains, workspaceDomains); const [addValue, setAddValue] = useState(); const [addPending, setAddPending] = useState(false); const workspace = useWorkspace(); diff --git a/webapps/console/lib/schema/destinations.tsx b/webapps/console/lib/schema/destinations.tsx index 76939871a..2b652a56c 100644 --- a/webapps/console/lib/schema/destinations.tsx +++ b/webapps/console/lib/schema/destinations.tsx @@ -271,6 +271,12 @@ export const ClickhouseCredentials = z.object({ .describe( "Additional parameters for ClickHouse driver. See Clickhouse documentation" ), + loadAsJson: z + .boolean() + .default(false) + .describe( + "Load data in JSONEachRow. May offer better performance. May not work properly on old ClickHouse versions." + ), }); export type ClickhouseCredentials = z.infer; @@ -403,6 +409,9 @@ export const coreDestinations: DestinationType[] = [ password: { password: true, }, + loadAsJson: { + hidden: true, + }, }, }, { From 901c174f8d95439ea766e915a1e38b6fecb4a176 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 24 Jan 2025 15:27:41 +0400 Subject: [PATCH 1050/1353] rotor: count each multiplied event sent to destination as additional "active event" --- libs/core-functions/src/functions/lib/index.ts | 2 +- services/rotor/src/lib/functions-chain.ts | 4 ++-- services/rotor/src/lib/metrics.ts | 5 +++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/libs/core-functions/src/functions/lib/index.ts b/libs/core-functions/src/functions/lib/index.ts index 1c7df6d20..ecf6a6440 100644 --- a/libs/core-functions/src/functions/lib/index.ts +++ b/libs/core-functions/src/functions/lib/index.ts @@ -77,7 +77,7 @@ export type FuncChainResult = { }; export type FunctionExecRes = { - receivedAt?: any; + receivedAt?: Date; eventIndex: number; event?: any; metricsMeta?: MetricsMeta; diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index 56990a42a..fc73fe8f8 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -288,10 +288,10 @@ export async function runChain( const event = events[i]; let result: FuncReturn = undefined; const sw = stopwatch(); - const rat = new Date(event.receivedAt) as any; + const rat = new Date(event.receivedAt); const execLogMeta = { eventIndex: i, - receivedAt: rat && rat != "Invalid Date" ? rat : new Date(), + receivedAt: !isNaN(rat.getTime()) ? rat : new Date(), functionId: f.id, metricsMeta: metricsMeta, }; diff --git a/services/rotor/src/lib/metrics.ts b/services/rotor/src/lib/metrics.ts index 99de26d05..acd99adee 100644 --- a/services/rotor/src/lib/metrics.ts +++ b/services/rotor/src/lib/metrics.ts @@ -69,7 +69,8 @@ export function createMetrics( value: JSON.stringify({ timestamp: d, workspaceId: m.workspaceId, - messageId: m.messageId, + // to count active events use composed key: messageId_eventIndex_receivedAt + messageId: m.key, }), }; }), @@ -183,7 +184,7 @@ export function createMetrics( return prefix + status; })(el); buffer.push({ - key: crypto.randomUUID(), + key: el.metricsMeta.messageId + "_" + el.eventIndex + "_" + d.getTime(), timestamp: d, ...omit(el.metricsMeta, "retries"), functionId: el.functionId, From 70852f9612edcb3aa3ded32ed5ae6e156bbfbc04 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 27 Jan 2025 11:32:52 +0400 Subject: [PATCH 1051/1353] rotor: count each multiplied event sent to destination as additional "active event" --- services/rotor/src/lib/metrics.ts | 2 +- webapps/console/prisma/metrics.sql | 131 ++++++++++++++++------------- 2 files changed, 73 insertions(+), 60 deletions(-) diff --git a/services/rotor/src/lib/metrics.ts b/services/rotor/src/lib/metrics.ts index acd99adee..8c026be46 100644 --- a/services/rotor/src/lib/metrics.ts +++ b/services/rotor/src/lib/metrics.ts @@ -184,7 +184,7 @@ export function createMetrics( return prefix + status; })(el); buffer.push({ - key: el.metricsMeta.messageId + "_" + el.eventIndex + "_" + d.getTime(), + key: el.metricsMeta.messageId + "_" + el.eventIndex + "_" + (el.receivedAt || new Date()).getTime(), timestamp: d, ...omit(el.metricsMeta, "retries"), functionId: el.functionId, diff --git a/webapps/console/prisma/metrics.sql b/webapps/console/prisma/metrics.sql index 4ac360ca8..79dd708d6 100644 --- a/webapps/console/prisma/metrics.sql +++ b/webapps/console/prisma/metrics.sql @@ -28,44 +28,35 @@ GROUP BY workspaceId, timestamp; -CREATE MATERIALIZED VIEW newjitsu_metrics.mv_active_incoming on cluster jitsu_cluster - ( - `timestamp` DateTime, - `workspaceId` LowCardinality(String), - `count` AggregateFunction(uniq, String) - ) - ENGINE = ReplicatedAggregatingMergeTree('/clickhouse/tables/{shard}/newjitsu_metrics/mv_active_incoming5', - '{replica}') - ORDER BY (timestamp, workspaceId) - SETTINGS index_granularity = 8192 + + +create table newjitsu_metrics.mv_active_incoming3 on cluster jitsu_cluster +( + `workspaceId` LowCardinality(String), + `timestamp` DateTime, + `messageId` String +) + engine = ReplicatedReplacingMergeTree('/clickhouse/tables/{shard}/newjitsu_metrics/mv_active_incoming3_1', '{replica}') + ORDER BY (workspaceId, timestamp, messageId) + PARTITION BY toYYYYMM(timestamp) +; + +--drop table newjitsu_metrics.mv_active_incoming3 on cluster jitsu_cluster; +--drop view newjitsu_metrics.to_mv_active_incoming3 on cluster jitsu_cluster; + +CREATE MATERIALIZED VIEW newjitsu_metrics.to_mv_active_incoming3 on cluster jitsu_cluster + TO newjitsu_metrics.mv_active_incoming3 + ( + `workspaceId` LowCardinality(String), + `timestamp` DateTime, + `messageId` String + ) AS SELECT - timestamp, workspaceId, - uniqState(messageId) AS count -FROM newjitsu_metrics.active_incoming -GROUP BY timestamp, - workspaceId; --- --- create table newjitsu_metrics.metrics on cluster jitsu_cluster --- ( --- timestamp DateTime, --- messageId String, --- workspaceId LowCardinality(String), --- streamId LowCardinality(String), --- connectionId LowCardinality(String), --- functionId LowCardinality(String), --- destinationId LowCardinality(String), --- status LowCardinality(String), --- events Int64, --- tmpTotal Int64, --- tmpUniq Int64 --- ) --- engine = ReplicatedMergeTree('/clickhouse/tables/{shard}/newjitsu_metrics/metrics_real', '{replica}') --- PARTITION BY toYYYYMM(timestamp) --- ORDER BY (workspaceId, connectionId, timestamp) --- SETTINGS index_granularity = 8192; + messageId +FROM newjitsu_metrics.active_incoming; CREATE TABLE IF NOT EXISTS newjitsu_metrics.metrics on cluster jitsu_cluster @@ -82,29 +73,51 @@ CREATE TABLE IF NOT EXISTS newjitsu_metrics.metrics on cluster jitsu_cluster ) ENGINE = Null; -CREATE MATERIALIZED VIEW newjitsu_metrics.mv_metrics on cluster jitsu_cluster - ( - timestamp DateTime, - workspaceId LowCardinality(String), - streamId LowCardinality(String), - connectionId LowCardinality(String), - functionId LowCardinality(String), - destinationId LowCardinality(String), - status LowCardinality(String), - events AggregateFunction(sum, Int64), - uniqEvents AggregateFunction(uniq, String) +create table newjitsu_metrics.mv_metrics on cluster jitsu_cluster +( + timestamp DateTime, + workspaceId LowCardinality(String), + streamId LowCardinality(String), + connectionId LowCardinality(String), + functionId LowCardinality(String), + destinationId LowCardinality(String), + status LowCardinality(String), + events AggregateFunction(sum, Int64) +) + engine = ReplicatedAggregatingMergeTree('/clickhouse/tables/{shard}/newjitsu_metrics/mv_metrics', '{replica}') + ORDER BY (timestamp, workspaceId, streamId, connectionId, functionId, destinationId, status) + SETTINGS index_granularity = 8192; + + +CREATE MATERIALIZED VIEW newjitsu_metrics.to_mv_metrics on cluster jitsu_cluster + TO newjitsu_metrics.mv_metrics + ( + `timestamp` DateTime, + `workspaceId` LowCardinality(String), + `streamId` LowCardinality(String), + `connectionId` LowCardinality(String), + `functionId` LowCardinality(String), + `destinationId` LowCardinality(String), + `status` LowCardinality(String), + `events` AggregateFunction(sum, Int64) + ) +AS +SELECT + timestamp, + workspaceId, + streamId, + connectionId, + functionId, + destinationId, + status, + sumState(events) AS events +FROM newjitsu_metrics.metrics +GROUP BY + timestamp, + workspaceId, + streamId, + connectionId, + functionId, + destinationId, + status; - ) - ENGINE = ReplicatedAggregatingMergeTree('/clickhouse/tables/{shard}/newjitsu_metrics/mv_metrics', '{replica}') ORDER BY (timestamp, workspaceId, streamId, connectionId, functionId, destinationId, status) -AS SELECT - timestamp, - workspaceId, - streamId, - connectionId, - functionId, - destinationId, - status, - sumState(events) AS events, - uniqState(messageId) AS uniqEvents - FROM newjitsu_metrics.metrics - GROUP BY timestamp, workspaceId, streamId, connectionId, functionId, destinationId, status; \ No newline at end of file From 4088245977b91bcf3dbdd2c0acca5dc469d75aa9 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 27 Jan 2025 11:33:48 +0400 Subject: [PATCH 1052/1353] console - add workspace name to web page title --- webapps/console/pages/_app.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/webapps/console/pages/_app.tsx b/webapps/console/pages/_app.tsx index a36920a3c..32136df41 100644 --- a/webapps/console/pages/_app.tsx +++ b/webapps/console/pages/_app.tsx @@ -450,8 +450,12 @@ const WorkspaceLoader: React.FC< analytics.page("Workspace Page", { context: { workspaceId: workspace.id, groupId: workspace.id }, }); + const newTitle = `Jitsu - ${workspace.name}`; + if (document.title !== newTitle) { + document.title = newTitle; + } } - }, [analytics, router.asPath, workspace?.id]); + }, [analytics, router.asPath, workspace?.id, workspace?.name]); /* eslint-disable react-hooks/exhaustive-deps */ //user may be a new object on each render while being the same user From b2caafa98c4d7918b600da3311b28c46faa33cc1 Mon Sep 17 00:00:00 2001 From: DM Date: Sun, 26 Jan 2025 23:41:42 -0800 Subject: [PATCH 1053/1353] rotor: Add support for custom CA certificate in Kafka SSL configuration (#1175) --- services/rotor/src/lib/kafka-config.ts | 43 ++++++++++++++++++++------ 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/services/rotor/src/lib/kafka-config.ts b/services/rotor/src/lib/kafka-config.ts index 138e15c37..0c5c619a0 100644 --- a/services/rotor/src/lib/kafka-config.ts +++ b/services/rotor/src/lib/kafka-config.ts @@ -2,7 +2,8 @@ import { Kafka, logLevel, CompressionCodecs, CompressionTypes } from "kafkajs"; import SnappyCodec from "kafkajs-snappy"; import "@sensejs/kafkajs-zstd-support"; -import { LogMessageBuilder, requireDefined, randomId, getLog } from "juava"; +import { readFileSync } from "fs"; +import { isTruish, LogMessageBuilder, requireDefined, randomId, getLog } from "juava"; import JSON5 from "json5"; const log = getLog("kafka"); @@ -25,7 +26,7 @@ function translateLevel(l: logLevel): LogMessageBuilder { export type KafkaCredentials = { brokers: string[] | string; - ssl?: boolean; + ssl?: boolean | Record; sasl?: { mechanism: "scram-sha-256" | "scram-sha-512"; username: string; @@ -34,9 +35,37 @@ export type KafkaCredentials = { }; export function getCredentialsFromEnv(): KafkaCredentials { + const ssl = isTruish(process.env.KAFKA_SSL); + const sslSkipVerify = isTruish(process.env.KAFKA_SSL_SKIP_VERIFY); + + let sslOption: KafkaCredentials["ssl"] = undefined; + + if (ssl) { + if (sslSkipVerify) { + // TLS enabled, but server TLS certificate is not verified + sslOption = { + rejectUnauthorized: false, + checkServerIdentity: () => undefined, + }; + } else if (process.env.KAFKA_SSL_CA) { + // TLS enabled, server TLS certificate is verified using a custom CA certificate + sslOption = { + ca: process.env.KAFKA_SSL_CA, + }; + } else if (process.env.KAFKA_SSL_CA_FILE) { + // TLS enabled, server TLS certificate is verified using a custom CA certificate (loaded from a local file) + sslOption = { + ca: readFileSync(process.env.KAFKA_SSL_CA_FILE, "utf-8"), + }; + } else { + // TLS enabled, no extra configurations + sslOption = true; + } + } + return { brokers: requireDefined(process.env.KAFKA_BOOTSTRAP_SERVERS, "env KAFKA_BOOTSTRAP_SERVERS is required").split(","), - ssl: process.env.KAFKA_SSL === "true" || process.env.KAFKA_SSL === "1", + ssl: sslOption, sasl: process.env.KAFKA_SASL ? JSON5.parse(process.env.KAFKA_SASL) : undefined, }; } @@ -57,13 +86,7 @@ export function connectToKafka(opts: { defaultAppId: string } & KafkaCredentials // }, clientId: process.env.APPLICATION_ID || opts.defaultAppId, brokers: typeof opts.brokers === "string" ? opts.brokers.split(",") : opts.brokers, - ssl: opts.ssl - ? { - rejectUnauthorized: false, - checkServerIdentity: () => undefined, - } - : undefined, - + ssl: opts.ssl, ...sasl, }); } From 9dcd703020cf1acd67a96695827f9a330b67511e Mon Sep 17 00:00:00 2001 From: DM Date: Sun, 26 Jan 2025 23:43:48 -0800 Subject: [PATCH 1054/1353] rotor: Allow use of third-party S3-compatible storages for MaxMind (#1174) --- services/rotor/src/lib/maxmind.ts | 38 ++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/services/rotor/src/lib/maxmind.ts b/services/rotor/src/lib/maxmind.ts index 1e4aa27f3..cbc4e8780 100644 --- a/services/rotor/src/lib/maxmind.ts +++ b/services/rotor/src/lib/maxmind.ts @@ -3,7 +3,7 @@ import * as zlib from "zlib"; import * as tar from "tar"; import { Geo } from "@jitsu/protocols/analytics"; import NodeCache from "node-cache"; -import { getLog, requireDefined } from "juava"; +import { getLog, isTruish, requireDefined } from "juava"; import { S3Client, GetObjectCommand } from "@aws-sdk/client-s3"; const log = getLog("maxmind"); @@ -38,6 +38,34 @@ const DummyResolver: GeoResolver = { }, }; +const createS3Client = () => { + const region = requireDefined( + process.env.MAXMIND_S3_REGION ?? process.env.S3_REGION, + "MAXMIND_S3_REGION or S3_REGION is not provided" + ); + const accessKeyId = requireDefined( + process.env.MAXMIND_S3_ACCESS_KEY_ID ?? process.env.S3_ACCESS_KEY_ID, + "MAXMIND_S3_ACCESS_KEY_ID or S3_ACCESS_KEY_ID is not provided" + ); + const secretAccessKey = requireDefined( + process.env.MAXMIND_S3_SECRET_ACCESS_KEY ?? process.env.S3_SECRET_ACCESS_KEY, + "MAXMIND_S3_SECRET_ACCESS_KEY or S3_SECRET_ACCESS_KEY is not provided" + ); + + const endpoint = process.env.MAXMIND_S3_ENDPOINT; // Optional: AWS S3 will be used if not provided + const forcePathStyle = isTruish(process.env.MAXMIND_S3_FORCE_PATH_STYLE); // Optional: virtual-hosted style is used by default + + return new S3Client({ + credentials: { + accessKeyId, + secretAccessKey, + }, + endpoint, + forcePathStyle, + region, + }); +}; + async function test() { const maxMindClient = await initMaxMindClient({ licenseKey: process.env.MAXMIND_LICENSE_KEY || "", @@ -59,13 +87,7 @@ export async function initMaxMindClient(opts: { let loadFunc: LoadFunction; let s3client: S3Client = undefined as any as S3Client; if (s3Bucket) { - s3client = new S3Client({ - region: requireDefined(process.env.S3_REGION, "S3_REGION is not provided"), - credentials: { - accessKeyId: requireDefined(process.env.S3_ACCESS_KEY_ID, "S3_ACCESS_KEY_ID is not provided"), - secretAccessKey: requireDefined(process.env.S3_SECRET_ACCESS_KEY, "S3_SECRET_ACCESS_KEY is not provided"), - }, - }); + s3client = createS3Client(); loadFunc = (edition: Edition) => loadFromS3(s3client, s3Bucket, edition); } else { loadFunc = (edition: Edition) => loadFromURL(composeURL(licenseKey || url || "", edition)); From 9191ca89014ce92c0a915347ecca1581f4717e4e Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 27 Jan 2025 12:53:53 +0400 Subject: [PATCH 1055/1353] console - fix for sync logs coloring --- .../pages/[workspaceId]/syncs/logs.tsx | 50 +++++++++++-------- .../pages/api/[workspaceId]/sources/logs.ts | 6 ++- 2 files changed, 32 insertions(+), 24 deletions(-) diff --git a/webapps/console/pages/[workspaceId]/syncs/logs.tsx b/webapps/console/pages/[workspaceId]/syncs/logs.tsx index 74af82aa3..f79ab698c 100644 --- a/webapps/console/pages/[workspaceId]/syncs/logs.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/logs.tsx @@ -8,34 +8,40 @@ import { useQuery } from "@tanstack/react-query"; import { LoadingAnimation } from "../../../components/GlobalLoader/GlobalLoader"; import escape from "lodash/escape"; -function colorLogs(data: string): ReactNode { - return data.split("\n").map((line, i) => { +function colorLogs(data: string[]): ReactNode { + return data.map((line, i) => { line = escape(line); - if (line.includes(" ERROR [")) { + if (line.includes(" ERROR [") || line.includes(" FATAL [")) { return ( - - {line + "\n"} - + ); } else if (line.includes(" WARN [")) { return ( - - {line + "\n"} - + ); } else if (line.includes("[jitsu]")) { return ( - - $1') - .replace(/'([\w_]+)'/, "'$1'") + "\n", - }} - > - + $1') + + "\n", + }} + > ); } else { return ( @@ -69,7 +75,7 @@ function TaskLogs() { { cacheTime: 0, retry: false } ); - const [displayText, setDisplayText] = useState(undefined); + const [displayText, setDisplayText] = useState(undefined); useEffect(() => { if (divRef.current) { @@ -79,7 +85,7 @@ function TaskLogs() { useEffect(() => { if (data) { - setDisplayText(data.split("\n").reverse().join("\n")); + setDisplayText(data.split("#ENDLINE#").reverse()); } }, [data]); diff --git a/webapps/console/pages/api/[workspaceId]/sources/logs.ts b/webapps/console/pages/api/[workspaceId]/sources/logs.ts index 6bee59049..4f65c5dc6 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/logs.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/logs.ts @@ -85,7 +85,9 @@ export default createRoute() for (const rw of rs) { const r = rw.json() as any; if (gzip.bytesWritten < maxStreamingResponseSize) { - const line = `${dayjs(r[0]).utc().format("YYYY-MM-DD HH:mm:ss.SSS")} ${r[1]} [${r[2]}] ${r[3]}\n`; + const line = `${dayjs(r[0]).utc().format("YYYY-MM-DD HH:mm:ss.SSS")} ${r[1]} [${r[2]}] ${r[3]}${ + query.download ? "\n" : "#ENDLINE#" + }`; gzip.write(line); } else { stream.destroy(); @@ -115,7 +117,7 @@ export default createRoute() r => { const line = `${dayjs(r.timestamp).utc().format("YYYY-MM-DD HH:mm:ss.SSS")} ${r.level} [${r.logger}] ${ r.message - }\n`; + }${query.download ? "\n" : "#ENDLINE#"}`; if (gzip.bytesWritten < maxResponseSize) { gzip.write(line); } From 6c186bd8c5ee832a9e051996b49fd355c09dce6b Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Mon, 27 Jan 2025 13:08:55 +0400 Subject: [PATCH 1056/1353] console - fix for sync logs coloring --- webapps/console/pages/[workspaceId]/syncs/logs.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/pages/[workspaceId]/syncs/logs.tsx b/webapps/console/pages/[workspaceId]/syncs/logs.tsx index f79ab698c..0821e310c 100644 --- a/webapps/console/pages/[workspaceId]/syncs/logs.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/logs.tsx @@ -11,7 +11,7 @@ import escape from "lodash/escape"; function colorLogs(data: string[]): ReactNode { return data.map((line, i) => { line = escape(line); - if (line.includes(" ERROR [") || line.includes(" FATAL [")) { + if (line.includes(" ERROR [") || line.includes(" FATAL [") || line.includes(" ERRSTD [")) { return ( Date: Mon, 27 Jan 2025 16:36:18 +0400 Subject: [PATCH 1057/1353] console: better reporting of syncs errors --- .../pages/[workspaceId]/syncs/tasks.tsx | 58 ++++++++++++------- webapps/console/pages/_app.tsx | 15 +++-- .../pages/api/[workspaceId]/sources/tasks.ts | 5 +- webapps/console/prisma/schema.prisma | 1 + 4 files changed, 53 insertions(+), 26 deletions(-) diff --git a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx index b53d1504a..4d7ef801c 100644 --- a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx @@ -36,6 +36,7 @@ import hash from "object-hash"; import { useConfigObjectLinks, useConfigObjectList } from "../../../lib/store"; import { Spinner } from "../../../components/GlobalLoader/GlobalLoader"; import { MdOutlineCancel } from "react-icons/md"; +import escape from "lodash/escape"; dayjs.extend(utc); dayjs.extend(relativeTime); @@ -105,7 +106,9 @@ function TaskStatus0({ task, loading }: { task: TasksDbModel & TaskStats; loadin } const SyncStatus: React.FC< - PropsWithChildren<{ status: "PARTIAL" | "CANCELLED" | "FAILED" | "SUCCESS" | "RUNNING" | "SKIPPED" }> + PropsWithChildren<{ + status: "PARTIAL" | "CANCELLED" | "TIME_EXCEEDED" | "FAILED" | "SUCCESS" | "RUNNING" | "SKIPPED"; + }> > = props => { const [showPopover, setShowPopover] = useState(false); const handleOpenChange = (newOpen: boolean) => { @@ -122,6 +125,7 @@ function TaskStatus0({ task, loading }: { task: TasksDbModel & TaskStats; loadin
    {task.stats ? ( { const o = { key: v[0], stream: v[0], ...(v[1] as any) }; arr.push(o); @@ -129,7 +133,7 @@ function TaskStatus0({ task, loading }: { task: TasksDbModel & TaskStats; loadin }, [] as any[])} /> ) : ( -
    {task.description}
    +
    {task.error || task.description}
    )}
    @@ -162,7 +166,7 @@ function TaskStatus0({ task, loading }: { task: TasksDbModel & TaskStats; loadin ) : props.status === "SKIPPED" ? ( - ) : props.status === "CANCELLED" ? ( + ) : props.status === "CANCELLED" || props.status === "TIME_EXCEEDED" ? ( ) : ( @@ -217,10 +221,11 @@ function TaskStatus0({ task, loading }: { task: TasksDbModel & TaskStats; loadin ); case "CANCELLED": + case "TIME_EXCEEDED": return ( - CANCELLED + {task.status} show stats @@ -240,7 +245,7 @@ function TaskStatus0({ task, loading }: { task: TasksDbModel & TaskStats; loadin FAILED - show error + show details ); case "RUNNING": @@ -259,7 +264,7 @@ function TaskStatus0({ task, loading }: { task: TasksDbModel & TaskStats; loadin export const TaskStatus = React.memo(TaskStatus0, (p, n) => hash(p) === hash(n)); -function TaskStatusResultTable({ stats }: { stats: any[] }) { +function TaskStatusResultTable({ stats, error }: { stats: any[]; error?: string }) { const columns: ColumnType[] = [ { title: "Stream", @@ -277,8 +282,8 @@ function TaskStatusResultTable({ stats }: { stats: any[] }) { return SUCCESS; } else if (record.status === "PARTIAL") { return PARTIAL; - } else if (record.status === "CANCELLED") { - return CANCELLED; + } else if (record.status === "CANCELLED" || record.status === "TIME_EXCEEDED") { + return {record.status}; } else if (record.status === "PENDING") { return PENDING; } else if (record.status === "RUNNING") { @@ -308,18 +313,31 @@ function TaskStatusResultTable({ stats }: { stats: any[] }) { }, ]; return ( - record.status === "FAILED" || record.status === "PARTIAL", - expandedRowRender: record => { - return
    {record.error}
    ; - }, - }} - /> +
    + {error && ( +
    + Abort Reason:
    + +
    + )} +
    record.status === "FAILED" || record.status === "PARTIAL", + expandedRowRender: record => { + return
    {record.error}
    ; + }, + }} + /> + ); } diff --git a/webapps/console/pages/_app.tsx b/webapps/console/pages/_app.tsx index 32136df41..b915c8e01 100644 --- a/webapps/console/pages/_app.tsx +++ b/webapps/console/pages/_app.tsx @@ -446,16 +446,21 @@ const WorkspaceLoader: React.FC< const workspace = useLoadedWorkspace(workspaceIdOrSlug); useEffect(() => { - if (workspace?.id) { - analytics.page("Workspace Page", { - context: { workspaceId: workspace.id, groupId: workspace.id }, - }); + if (workspace?.name) { const newTitle = `Jitsu - ${workspace.name}`; if (document.title !== newTitle) { document.title = newTitle; } } - }, [analytics, router.asPath, workspace?.id, workspace?.name]); + }); + + useEffect(() => { + if (workspace?.id) { + analytics.page("Workspace Page", { + context: { workspaceId: workspace.id, groupId: workspace.id }, + }); + } + }, [analytics, router.asPath, workspace?.id]); /* eslint-disable react-hooks/exhaustive-deps */ //user may be a new object on each render while being the same user diff --git a/webapps/console/pages/api/[workspaceId]/sources/tasks.ts b/webapps/console/pages/api/[workspaceId]/sources/tasks.ts index 2123a9ee6..b67e84538 100644 --- a/webapps/console/pages/api/[workspaceId]/sources/tasks.ts +++ b/webapps/console/pages/api/[workspaceId]/sources/tasks.ts @@ -20,7 +20,8 @@ const aggregatedResultType = z.object({ sync_id: z.string(), task_id: z.string(), status: z.string(), - description: z.string(), + description: z.string().nullish(), + error: z.string().nullish(), started_by: z.any().optional(), started_at: z.date(), updated_at: z.date(), @@ -75,6 +76,7 @@ export default createRoute() `select distinct sync_id as sync_id, last_value(task_id) over ( partition by sync_id order by case when status = 'SKIPPED' then '2020-01-01' else started_at end RANGE BETWEEN unbounded preceding and unbounded following) as task_id, last_value(status) over ( partition by sync_id order by case when status = 'SKIPPED' then '2020-01-01' else started_at end RANGE BETWEEN unbounded preceding and unbounded following) as status, + last_value(error) over ( partition by sync_id order by case when status = 'SKIPPED' then '2020-01-01' else started_at end RANGE BETWEEN unbounded preceding and unbounded following) as error, last_value(description) over ( partition by sync_id order by case when status = 'SKIPPED' then '2020-01-01' else started_at end RANGE BETWEEN unbounded preceding and unbounded following) as description, last_value(started_at) over ( partition by sync_id order by case when status = 'SKIPPED' then '2020-01-01' else started_at end RANGE BETWEEN unbounded preceding and unbounded following) as started_at, last_value(updated_at) over ( partition by sync_id order by case when status = 'SKIPPED' then '2020-01-01' else started_at end RANGE BETWEEN unbounded preceding and unbounded following) as updated_at @@ -87,6 +89,7 @@ from newjitsu.source_task where sync_id = ANY($1::text[])`, task_id: r.task_id, status: r.status, description: r.description, + error: r.error, started_at: r.started_at, updated_at: r.updated_at, }; diff --git a/webapps/console/prisma/schema.prisma b/webapps/console/prisma/schema.prisma index 661ead742..cf7cfd5cb 100644 --- a/webapps/console/prisma/schema.prisma +++ b/webapps/console/prisma/schema.prisma @@ -273,6 +273,7 @@ model source_task { status String description String? metrics Json? + error String? @@index(sync_id) @@index(started_at) From d64eef14c788d31c01a629c400ec3b20c72dd3ea Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Mon, 27 Jan 2025 10:29:51 -0500 Subject: [PATCH 1058/1353] feat (console): display overage fee on a billing screen --- webapps/console/components/Billing/BillingManager.tsx | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/webapps/console/components/Billing/BillingManager.tsx b/webapps/console/components/Billing/BillingManager.tsx index d10ffa50b..08ebe9649 100644 --- a/webapps/console/components/Billing/BillingManager.tsx +++ b/webapps/console/components/Billing/BillingManager.tsx @@ -92,6 +92,12 @@ const EventsUsageSection: React.FC<{}> = () => { events used from {dayjs(usage.periodStart).utc().format("MMM DD, YYYY")} to{" "} {dayjs(usage.periodEnd).utc().format("MMM DD, YYYY")}. The quota will be reset on{" "} {dayjs(usage.periodEnd).add(1, "day").utc().format("MMM DD")}. +
    + {billing?.settings?.overagePricePer100k && ( +
    + Overage fee: ${billing.settings.overagePricePer100k * 1000} per 1,000,000 events +
    + )} = () => { {dayjs(periodStart).utc().format("MMM DD, YYYY")} to{" "} {dayjs(periodEnd).utc().format("MMM DD, YYYY")}. The quota will be reset on{" "} {dayjs(periodEnd).add(1, "day").utc().format("MMM DD")}. + {billing?.settings?.overagePricePer100k && ( +
    + Overage fee: ${billing.settings.overagePricePer100k * 10} per extra daily active sync` +
    + )} {percentage > 1 && ( From 0395779b518eb47b9b273cf91bc91ef0563f4d16 Mon Sep 17 00:00:00 2001 From: Vladimir Klimontovich Date: Mon, 27 Jan 2025 10:44:43 -0500 Subject: [PATCH 1059/1353] feat (console): display overage fee on a billing screen - fix math --- webapps/console/components/Billing/BillingManager.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/webapps/console/components/Billing/BillingManager.tsx b/webapps/console/components/Billing/BillingManager.tsx index 08ebe9649..bae82298b 100644 --- a/webapps/console/components/Billing/BillingManager.tsx +++ b/webapps/console/components/Billing/BillingManager.tsx @@ -95,7 +95,7 @@ const EventsUsageSection: React.FC<{}> = () => {
    {billing?.settings?.overagePricePer100k && (
    - Overage fee: ${billing.settings.overagePricePer100k * 1000} per 1,000,000 events + Overage fee: ${billing.settings.overagePricePer100k * 10} per 1,000,000 events
    )} @@ -262,9 +262,9 @@ const ConnectorUsageSection: React.FC<{}> = () => { {dayjs(periodStart).utc().format("MMM DD, YYYY")} to{" "} {dayjs(periodEnd).utc().format("MMM DD, YYYY")}. The quota will be reset on{" "} {dayjs(periodEnd).add(1, "day").utc().format("MMM DD")}. - {billing?.settings?.overagePricePer100k && ( + {billing?.settings?.dailyActiveSyncsOverage && (
    - Overage fee: ${billing.settings.overagePricePer100k * 10} per extra daily active sync` + Overage fee: ${billing?.settings?.dailyActiveSyncsOverage} per extra daily active sync
    )} From e3cea995c72b48a184ebce2f10e96e917c445e26 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 28 Jan 2025 15:54:51 +0400 Subject: [PATCH 1060/1353] rotor: fill source name in function's EventContext rotor: don't count events produced by user recognition as multiplied events --- .../__tests__/user-recognition.test.ts | 3 ++ .../src/functions/bulker-destination.ts | 32 ++++++++++++------- .../src/functions/lib/udf_wrapper.ts | 1 + .../src/functions/user-recognition.ts | 6 +++- libs/core-functions/src/index.ts | 1 + libs/core-functions/src/lib/config-types.ts | 1 + services/rotor/src/lib/functions-chain.ts | 4 ++- services/rotor/src/lib/message-handler.ts | 1 + services/rotor/src/lib/metrics.ts | 4 +-- .../pages/api/admin/export/[name]/index.ts | 1 + 10 files changed, 39 insertions(+), 15 deletions(-) diff --git a/libs/core-functions/__tests__/user-recognition.test.ts b/libs/core-functions/__tests__/user-recognition.test.ts index 91467cc1e..8c2414ae8 100644 --- a/libs/core-functions/__tests__/user-recognition.test.ts +++ b/libs/core-functions/__tests__/user-recognition.test.ts @@ -55,6 +55,7 @@ const expectedEvents: AnalyticsServerEvent[] = [ }, { messageId: "1", + _JITSU_UR_MESSAGE_ID: "4", type: "page", anonymousId: "anon1", userId: "user1", @@ -67,6 +68,7 @@ const expectedEvents: AnalyticsServerEvent[] = [ }, { messageId: "2", + _JITSU_UR_MESSAGE_ID: "4", type: "page", anonymousId: "anon1", userId: "user1", @@ -79,6 +81,7 @@ const expectedEvents: AnalyticsServerEvent[] = [ }, { messageId: "3", + _JITSU_UR_MESSAGE_ID: "4", type: "page", anonymousId: "anon1", userId: "user1", diff --git a/libs/core-functions/src/functions/bulker-destination.ts b/libs/core-functions/src/functions/bulker-destination.ts index 2935be221..a36f92215 100644 --- a/libs/core-functions/src/functions/bulker-destination.ts +++ b/libs/core-functions/src/functions/bulker-destination.ts @@ -13,6 +13,9 @@ import { AnalyticsServerEvent, DataLayoutType } from "@jitsu/protocols/analytics import omit from "lodash/omit"; import { MetricsMeta } from "./lib"; +import { UserRecognitionParameter } from "./user-recognition"; + +const JitsuInternalProperties = [TableNameParameter, UserRecognitionParameter]; export type MappedEvent = { event: any; @@ -25,7 +28,7 @@ export type DataLayoutImpl = ( export function jitsuLegacy(event: AnalyticsServerEvent, ctx: FullContext): MappedEvent { const flat = toJitsuClassic(event, ctx); - return { event: omit(flat, TableNameParameter), table: event[TableNameParameter] ?? "events" }; + return { event: omit(flat, JitsuInternalProperties), table: event[TableNameParameter] ?? "events" }; } export function segmentLayout( @@ -56,7 +59,7 @@ export function segmentLayout( event.context?.groupId || event.traits?.groupId || event.context?.traits?.groupId ); transferFunc(transformed, event.properties); - transferFunc(transformed, event, ["context", "properties", "traits", "type", TableNameParameter]); + transferFunc(transformed, event, ["context", "properties", "traits", "type", ...JitsuInternalProperties]); } else { transformed = { context: {}, @@ -65,7 +68,7 @@ export function segmentLayout( transferFunc(transformed, event.properties); transferFunc(transformed, event.context?.traits); transferFunc(transformed, event.traits); - transferFunc(transformed, event, ["context", "properties", "traits", "type", TableNameParameter]); + transferFunc(transformed, event, ["context", "properties", "traits", "type", ...JitsuInternalProperties]); } break; case "group": @@ -79,7 +82,14 @@ export function segmentLayout( transferFunc(transformed.context.group, event.traits); transferValueFunc(transformed.context, "group_id", event.groupId); transferFunc(transformed, event.properties); - transferFunc(transformed, event, ["context", "properties", "traits", "type", "groupId", TableNameParameter]); + transferFunc(transformed, event, [ + "context", + "properties", + "traits", + "type", + "groupId", + ...JitsuInternalProperties, + ]); } else { transformed = { context: {}, @@ -87,7 +97,7 @@ export function segmentLayout( transferFunc(transformed.context, event.context, ["traits"]); transferFunc(transformed, event.properties); transferFunc(transformed, event.traits); - transferFunc(transformed, event, ["context", "properties", "traits", "type", TableNameParameter]); + transferFunc(transformed, event, ["context", "properties", "traits", "type", ...JitsuInternalProperties]); } break; case "track": @@ -102,13 +112,13 @@ export function segmentLayout( transferFunc(transformed.context.traits, event.properties?.traits, ["groupId"]); transferValueFunc(transformed.context, "group_id", event.context?.groupId || event.context?.traits?.groupId); transferFunc(transformed, event.properties, ["traits"]); - transferFunc(transformed, event, ["context", "properties", "type", TableNameParameter]); + transferFunc(transformed, event, ["context", "properties", "type", ...JitsuInternalProperties]); } else { baseTrackFlat = {}; - transferFunc(baseTrackFlat, event, ["properties", "type", TableNameParameter]); + transferFunc(baseTrackFlat, event, ["properties", "type", ...JitsuInternalProperties]); transformed = {}; transferFunc(transformed, event.properties); - transferFunc(transformed, event, ["properties", "type", TableNameParameter]); + transferFunc(transformed, event, ["properties", "type", ...JitsuInternalProperties]); } break; default: @@ -122,11 +132,11 @@ export function segmentLayout( transferFunc(transformed.context.traits, event.context?.traits, ["groupId"]); transferValueFunc(transformed.context, "group_id", event.context?.groupId || event.context?.traits?.groupId); transferFunc(transformed, event.properties); - transferFunc(transformed, event, ["context", "properties", TableNameParameter]); + transferFunc(transformed, event, ["context", "properties", ...JitsuInternalProperties]); } else { transformed = {}; transferFunc(transformed, event.properties); - transferFunc(transformed, event, ["properties", TableNameParameter]); + transferFunc(transformed, event, ["properties", ...JitsuInternalProperties]); } } if (event[TableNameParameter]) { @@ -167,7 +177,7 @@ export const dataLayouts: Record> = { segment: (event, ctx) => segmentLayout(event, false, ctx), "segment-single-table": (event, ctx) => segmentLayout(event, true, ctx), "jitsu-legacy": jitsuLegacy, - passthrough: event => ({ event: omit(event, TableNameParameter), table: event[TableNameParameter] ?? "events" }), + passthrough: event => ({ event: omit(event, JitsuInternalProperties), table: event[TableNameParameter] ?? "events" }), }; export type BulkerDestinationConfig = { diff --git a/libs/core-functions/src/functions/lib/udf_wrapper.ts b/libs/core-functions/src/functions/lib/udf_wrapper.ts index a07015866..9f2ccf717 100644 --- a/libs/core-functions/src/functions/lib/udf_wrapper.ts +++ b/libs/core-functions/src/functions/lib/udf_wrapper.ts @@ -396,6 +396,7 @@ export async function UDFTestRun({ headers: {}, source: { id: "functionsDebugger-streamId", + name: "Functions Debugger Stream", type: "browser", }, destination: { diff --git a/libs/core-functions/src/functions/user-recognition.ts b/libs/core-functions/src/functions/user-recognition.ts index b2b206ea3..ccdf4608b 100644 --- a/libs/core-functions/src/functions/user-recognition.ts +++ b/libs/core-functions/src/functions/user-recognition.ts @@ -5,6 +5,8 @@ import get from "lodash/get"; import set from "lodash/set"; import merge from "lodash/merge"; +export const UserRecognitionParameter = "_JITSU_UR_MESSAGE_ID"; + export const UserRecognitionConfig = z.object({ /** * Where to look for anonymous id, an array of JSON paths @@ -61,7 +63,9 @@ const UserRecognitionFunction: JitsuFunction { return evs.map(anonEvent => { //merge anonymous event with identified fields - return merge(anonEvent, identifiedFields); + const merged = merge(anonEvent, identifiedFields); + merged[UserRecognitionParameter] = event.messageId; + return merged; }); }); if (res.length === 0) { diff --git a/libs/core-functions/src/index.ts b/libs/core-functions/src/index.ts index bf31e140b..14ddb1894 100644 --- a/libs/core-functions/src/index.ts +++ b/libs/core-functions/src/index.ts @@ -60,6 +60,7 @@ export function isDropResult(result: FuncReturn): boolean { } export * as bulkerDestination from "./functions/bulker-destination"; +export { UserRecognitionParameter } from "./functions/user-recognition"; export { UDFWrapper, UDFTestRun } from "./functions/lib/udf_wrapper"; export type { UDFTestRequest, UDFTestResponse, logType } from "./functions/lib/udf_wrapper"; export { ProfileUDFWrapper, ProfileUDFTestRun, mergeUserTraits } from "./functions/lib/profiles-udf-wrapper"; diff --git a/libs/core-functions/src/lib/config-types.ts b/libs/core-functions/src/lib/config-types.ts index 239fc2242..818dcaa29 100644 --- a/libs/core-functions/src/lib/config-types.ts +++ b/libs/core-functions/src/lib/config-types.ts @@ -42,6 +42,7 @@ export type EnrichedConnectionConfig = { updatedAt?: Date; destinationId: string; streamId: string; + streamName?: string; metricsKeyPrefix: string; usesBulker: boolean; //destinationType diff --git a/services/rotor/src/lib/functions-chain.ts b/services/rotor/src/lib/functions-chain.ts index fc73fe8f8..87819c360 100644 --- a/services/rotor/src/lib/functions-chain.ts +++ b/services/rotor/src/lib/functions-chain.ts @@ -18,6 +18,7 @@ import { MetricsMeta, mongodb, UDFWrapper, + UserRecognitionParameter, wrapperFunction, } from "@jitsu/core-functions"; import Prometheus from "prom-client"; @@ -290,7 +291,8 @@ export async function runChain( const sw = stopwatch(); const rat = new Date(event.receivedAt); const execLogMeta = { - eventIndex: i, + // we don't multiply active incoming metrics for events produced by user recognition + eventIndex: event[UserRecognitionParameter] ? 0 : i, receivedAt: !isNaN(rat.getTime()) ? rat : new Date(), functionId: f.id, metricsMeta: metricsMeta, diff --git a/services/rotor/src/lib/message-handler.ts b/services/rotor/src/lib/message-handler.ts index a7f91ad57..c60f9f734 100644 --- a/services/rotor/src/lib/message-handler.ts +++ b/services/rotor/src/lib/message-handler.ts @@ -102,6 +102,7 @@ export async function rotorMessageHandler( source: { type: message.ingestType, id: connection.streamId, + name: connection.streamName, domain: message.origin?.domain, }, destination: { diff --git a/services/rotor/src/lib/metrics.ts b/services/rotor/src/lib/metrics.ts index 8c026be46..b4aea21a6 100644 --- a/services/rotor/src/lib/metrics.ts +++ b/services/rotor/src/lib/metrics.ts @@ -98,12 +98,12 @@ export function createMetrics( JSON.stringify({ timestamp: e.timestamp, workspaceId: e.workspaceId, - messageId: e.messageId, + messageId: e.key, }) ); streamOld.push("\n"); } - stream.push(JSON.stringify(omit(e, "retries", "messageId"))); + stream.push(JSON.stringify(omit(e, "retries", "messageId", "key"))); stream.push("\n"); }); //close stream diff --git a/webapps/console/pages/api/admin/export/[name]/index.ts b/webapps/console/pages/api/admin/export/[name]/index.ts index e371aefd6..deeb66aa2 100644 --- a/webapps/console/pages/api/admin/export/[name]/index.ts +++ b/webapps/console/pages/api/admin/export/[name]/index.ts @@ -249,6 +249,7 @@ const exports: Export[] = [ type: destinationType, workspaceId: workspace.id, streamId: from.id, + streamName: from.config?.name, destinationId: to.id, usesBulker: !!coreDestinationType?.usesBulker, options: { From 83fd7f7c44775bb6d80096a5642970cdc9444d3c Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 28 Jan 2025 16:30:37 +0400 Subject: [PATCH 1061/1353] rotor: increase metrics date key resolution --- services/rotor/src/lib/metrics.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/services/rotor/src/lib/metrics.ts b/services/rotor/src/lib/metrics.ts index b4aea21a6..a2376dd53 100644 --- a/services/rotor/src/lib/metrics.ts +++ b/services/rotor/src/lib/metrics.ts @@ -158,6 +158,7 @@ export function createMetrics( continue; } const d = el.receivedAt || new Date(); + const epochTime = d.getTime(); d.setMilliseconds(0); d.setSeconds(0); // console.log( @@ -184,7 +185,7 @@ export function createMetrics( return prefix + status; })(el); buffer.push({ - key: el.metricsMeta.messageId + "_" + el.eventIndex + "_" + (el.receivedAt || new Date()).getTime(), + key: el.metricsMeta.messageId + "_" + el.eventIndex + "_" + epochTime, timestamp: d, ...omit(el.metricsMeta, "retries"), functionId: el.functionId, From 1677f466e3ac1ab652740847b5a144555d4779db Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 28 Jan 2025 17:49:07 +0400 Subject: [PATCH 1062/1353] console: bulker-connections: don't return sync connections --- .../console/pages/api/admin/export/[name]/index.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/webapps/console/pages/api/admin/export/[name]/index.ts b/webapps/console/pages/api/admin/export/[name]/index.ts index deeb66aa2..a8514b622 100644 --- a/webapps/console/pages/api/admin/export/[name]/index.ts +++ b/webapps/console/pages/api/admin/export/[name]/index.ts @@ -53,7 +53,13 @@ const exports: Export[] = [ let needComma = false; while (true) { const objects = await db.prisma().configurationObjectLink.findMany({ - where: { deleted: false, workspace: { deleted: false }, from: { deleted: false }, to: { deleted: false } }, + where: { + deleted: false, + OR: [{ type: "push" }, { type: null }], + workspace: { deleted: false }, + from: { deleted: false }, + to: { deleted: false }, + }, include: { from: true, to: true, workspace: true }, take: batchSize, cursor: lastId ? { id: lastId } : undefined, @@ -82,6 +88,11 @@ const exports: Export[] = [ ); credentials.parameters = { ...(credentials.parameters || {}), ...extraParams }; } + // if (data.timestampColumn) { + // // use timestampColumn field as discriminator field when doing local deduplication + // // inside batch of two rows having the same messageId(pk) will be chosen the one with the highest timestampColumn value + // data.discriminatorField = [data.timestampColumn]; + // } writer.write( JSON.stringify({ __debug: { From 851762dfef67e745adac099a42bd33db432d1a13 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Wed, 29 Jan 2025 19:55:21 +0400 Subject: [PATCH 1063/1353] console: syncs: support for loading data to CH through S3 --- pnpm-lock.yaml | 98 +++++++++++++++--------------- webapps/console/lib/server/sync.ts | 17 ++++++ webapps/console/package.json | 2 +- webapps/ee-api/package.json | 2 +- 4 files changed, 68 insertions(+), 51 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 734925c60..7de44be1e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1066,11 +1066,11 @@ importers: specifier: ^0.52.0 version: 0.52.0 next: - specifier: ^15.1.1 - version: 15.1.1(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^15.1.6 + version: 15.1.6(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-auth: specifier: ^4.24.11 - version: 4.24.11(next@15.1.1(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nodemailer@6.9.16)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 4.24.11(next@15.1.6(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nodemailer@6.9.16)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) node-fetch-commonjs: specifier: ^3.3.2 version: 3.3.2 @@ -1152,7 +1152,7 @@ importers: version: 8.3.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.6) '@storybook/nextjs': specifier: ^8.3.6 - version: 8.3.6(@types/webpack@5.28.5(esbuild@0.23.1))(esbuild@0.23.1)(next@15.1.1(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.6)(type-fest@3.13.1)(typescript@5.6.3)(webpack-dev-server@4.15.2(webpack@5.95.0(esbuild@0.23.1)))(webpack-hot-middleware@2.26.1)(webpack@5.95.0(esbuild@0.23.1)) + version: 8.3.6(@types/webpack@5.28.5(esbuild@0.23.1))(esbuild@0.23.1)(next@15.1.6(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.6)(type-fest@3.13.1)(typescript@5.6.3)(webpack-dev-server@4.15.2(webpack@5.95.0(esbuild@0.23.1)))(webpack-hot-middleware@2.26.1)(webpack@5.95.0(esbuild@0.23.1)) '@storybook/react': specifier: ^8.3.6 version: 8.3.6(@storybook/test@8.3.6(storybook@8.3.6))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.6)(typescript@5.6.3) @@ -1316,8 +1316,8 @@ importers: specifier: ^4.17.21 version: 4.17.21 next: - specifier: ^15.1.1 - version: 15.1.1(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^15.1.6 + version: 15.1.6(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) node-fetch-commonjs: specifier: ^3.3.2 version: 3.3.2 @@ -3413,56 +3413,56 @@ packages: '@nangohq/frontend@0.21.17': resolution: {integrity: sha512-utnO6JkRIQVqZBo472Yynf0nBl5Pc3QCMlC9L5LsIWApCD1pSkqZCA7cZKIJiX2p3tiB8Hzav31o0lAsnTZ1AQ==} - '@next/env@15.1.1': - resolution: {integrity: sha512-ldU8IpUqxa87LsWyMh8eIqAzejt8+ZuEsdtCV+fpDog++cBO5b/PWaI7wQQwun8LKJeFFpnY4kv/6r+/dCON6A==} + '@next/env@15.1.6': + resolution: {integrity: sha512-d9AFQVPEYNr+aqokIiPLNK/MTyt3DWa/dpKveiAaVccUadFbhFEvY6FXYX2LJO2Hv7PHnLBu2oWwB4uBuHjr/w==} '@next/eslint-plugin-next@15.0.3': resolution: {integrity: sha512-3Ln/nHq2V+v8uIaxCR6YfYo7ceRgZNXfTd3yW1ukTaFbO+/I8jNakrjYWODvG9BuR2v5kgVtH/C8r0i11quOgw==} - '@next/swc-darwin-arm64@15.1.1': - resolution: {integrity: sha512-pq7Hzu0KaaH6UYcCQ22mOuj2mWCD6iqGvYprp/Ep1EcCxbdNOSS+8EJADFbPHsaXLkaonIJ8lTKBGWXaFxkeNQ==} + '@next/swc-darwin-arm64@15.1.6': + resolution: {integrity: sha512-u7lg4Mpl9qWpKgy6NzEkz/w0/keEHtOybmIl0ykgItBxEM5mYotS5PmqTpo+Rhg8FiOiWgwr8USxmKQkqLBCrw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.1.1': - resolution: {integrity: sha512-h567/b/AHAnMpaJ1D3l3jKLrzNOgN9bmDSRd+Gb0hXTkLZh8mE0Kd9MbIw39QeTZQJ3192uFRFWlDjWiifwVhQ==} + '@next/swc-darwin-x64@15.1.6': + resolution: {integrity: sha512-x1jGpbHbZoZ69nRuogGL2MYPLqohlhnT9OCU6E6QFewwup+z+M6r8oU47BTeJcWsF2sdBahp5cKiAcDbwwK/lg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.1.1': - resolution: {integrity: sha512-I5Q6M3T9jzTUM2JlwTBy/VBSX+YCDvPLnSaJX5wE5GEPeaJkipMkvTA9+IiFK5PG5ljXTqVFVUj5BSHiYLCpoQ==} + '@next/swc-linux-arm64-gnu@15.1.6': + resolution: {integrity: sha512-jar9sFw0XewXsBzPf9runGzoivajeWJUc/JkfbLTC4it9EhU8v7tCRLH7l5Y1ReTMN6zKJO0kKAGqDk8YSO2bg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.1.1': - resolution: {integrity: sha512-4cPMSYmyXlOAk8U04ouEACEGnOwYM9uJOXZnm9GBXIKRbNEvBOH9OePhHiDWqOws6iaHvGayaKr+76LmM41yJA==} + '@next/swc-linux-arm64-musl@15.1.6': + resolution: {integrity: sha512-+n3u//bfsrIaZch4cgOJ3tXCTbSxz0s6brJtU3SzLOvkJlPQMJ+eHVRi6qM2kKKKLuMY+tcau8XD9CJ1OjeSQQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.1.1': - resolution: {integrity: sha512-KgIiKDdV35KwL9TrTxPFGsPb3J5RuDpw828z3MwMQbWaOmpp/T4MeWQCwo+J2aOxsyAcfsNE334kaWXCb6YTTA==} + '@next/swc-linux-x64-gnu@15.1.6': + resolution: {integrity: sha512-SpuDEXixM3PycniL4iVCLyUyvcl6Lt0mtv3am08sucskpG0tYkW1KlRhTgj4LI5ehyxriVVcfdoxuuP8csi3kQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.1.1': - resolution: {integrity: sha512-aHP/29x8loFhB3WuW2YaWaYFJN389t6/SBsug19aNwH+PRLzDEQfCvtuP6NxRCido9OAoExd+ZuYJKF9my1Kpg==} + '@next/swc-linux-x64-musl@15.1.6': + resolution: {integrity: sha512-L4druWmdFSZIIRhF+G60API5sFB7suTbDRhYWSjiw0RbE+15igQvE2g2+S973pMGvwN3guw7cJUjA/TmbPWTHQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.1.1': - resolution: {integrity: sha512-klbzXYwqHMwiucNFF0tWiWJyPb45MBX1q/ATmxrMjEYgA+V/0OXc9KmNVRIn6G/ab0ASUk4uWqxik5m6wvm1sg==} + '@next/swc-win32-arm64-msvc@15.1.6': + resolution: {integrity: sha512-s8w6EeqNmi6gdvM19tqKKWbCyOBvXFbndkGHl+c9YrzsLARRdCHsD9S1fMj8gsXm9v8vhC8s3N8rjuC/XrtkEg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.1.1': - resolution: {integrity: sha512-V5fm4aULqHSlMQt3U1rWAWuwJTFsb6Yh4P8p1kQFoayAF9jAQtjBvHku4zCdrtQuw9u9crPC0FNML00kN4WGhA==} + '@next/swc-win32-x64-msvc@15.1.6': + resolution: {integrity: sha512-6xomMuu54FAFxttYr5PJbEfu96godcxBTRk1OhAvJq0/EnmFU/Ybiax30Snis4vdWZ9LGpf7Roy5fSs7v/5ROQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -10164,8 +10164,8 @@ packages: next-transpile-modules@10.0.1: resolution: {integrity: sha512-4VX/LCMofxIYAVV58UmD+kr8jQflpLWvas/BQ4Co0qWLWzVh06FoZkECkrX5eEZT6oJFqie6+kfbTA3EZCVtdQ==} - next@15.1.1: - resolution: {integrity: sha512-SBZlcvdIxajw8//H3uOR1G3iu3jxsra/77m2ulRIxi3m89p+s3ACsoOXR49JEAbaun/DVoRJ9cPKq8eF/oNB5g==} + next@15.1.6: + resolution: {integrity: sha512-Hch4wzbaX0vKQtalpXvUiw5sYivBy4cm5rzUKrBnUB/y436LGrvOUqYvlSeNVCWFO/770gDlltR9gqZH62ct4Q==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -17323,34 +17323,34 @@ snapshots: '@nangohq/frontend@0.21.17': {} - '@next/env@15.1.1': {} + '@next/env@15.1.6': {} '@next/eslint-plugin-next@15.0.3': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.1.1': + '@next/swc-darwin-arm64@15.1.6': optional: true - '@next/swc-darwin-x64@15.1.1': + '@next/swc-darwin-x64@15.1.6': optional: true - '@next/swc-linux-arm64-gnu@15.1.1': + '@next/swc-linux-arm64-gnu@15.1.6': optional: true - '@next/swc-linux-arm64-musl@15.1.1': + '@next/swc-linux-arm64-musl@15.1.6': optional: true - '@next/swc-linux-x64-gnu@15.1.1': + '@next/swc-linux-x64-gnu@15.1.6': optional: true - '@next/swc-linux-x64-musl@15.1.1': + '@next/swc-linux-x64-musl@15.1.6': optional: true - '@next/swc-win32-arm64-msvc@15.1.1': + '@next/swc-win32-arm64-msvc@15.1.6': optional: true - '@next/swc-win32-x64-msvc@15.1.1': + '@next/swc-win32-x64-msvc@15.1.6': optional: true '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': @@ -18873,7 +18873,7 @@ snapshots: dependencies: storybook: 8.3.6 - '@storybook/nextjs@8.3.6(@types/webpack@5.28.5(esbuild@0.23.1))(esbuild@0.23.1)(next@15.1.1(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.6)(type-fest@3.13.1)(typescript@5.6.3)(webpack-dev-server@4.15.2(webpack@5.95.0(esbuild@0.23.1)))(webpack-hot-middleware@2.26.1)(webpack@5.95.0(esbuild@0.23.1))': + '@storybook/nextjs@8.3.6(@types/webpack@5.28.5(esbuild@0.23.1))(esbuild@0.23.1)(next@15.1.6(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.6)(type-fest@3.13.1)(typescript@5.6.3)(webpack-dev-server@4.15.2(webpack@5.95.0(esbuild@0.23.1)))(webpack-hot-middleware@2.26.1)(webpack@5.95.0(esbuild@0.23.1))': dependencies: '@babel/core': 7.26.0 '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.0) @@ -18901,7 +18901,7 @@ snapshots: fs-extra: 11.2.0 image-size: 1.1.1 loader-utils: 3.3.1 - next: 15.1.1(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 15.1.6(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) node-polyfill-webpack-plugin: 2.0.1(webpack@5.95.0(esbuild@0.23.1)) pnp-webpack-plugin: 1.7.0(typescript@5.6.3) postcss: 8.4.47 @@ -26792,13 +26792,13 @@ snapshots: dependencies: '@segment/isodate': 1.0.3 - next-auth@4.24.11(next@15.1.1(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nodemailer@6.9.16)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next-auth@4.24.11(next@15.1.6(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nodemailer@6.9.16)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 '@panva/hkdf': 1.2.1 cookie: 0.7.2 jose: 4.15.9 - next: 15.1.1(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 15.1.6(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) oauth: 0.9.15 openid-client: 5.7.0 preact: 10.24.3 @@ -26813,9 +26813,9 @@ snapshots: dependencies: enhanced-resolve: 5.17.1 - next@15.1.1(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@15.1.6(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.39.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@next/env': 15.1.1 + '@next/env': 15.1.6 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 @@ -26825,14 +26825,14 @@ snapshots: react-dom: 18.3.1(react@18.3.1) styled-jsx: 5.1.6(@babel/core@7.26.0)(react@18.3.1) optionalDependencies: - '@next/swc-darwin-arm64': 15.1.1 - '@next/swc-darwin-x64': 15.1.1 - '@next/swc-linux-arm64-gnu': 15.1.1 - '@next/swc-linux-arm64-musl': 15.1.1 - '@next/swc-linux-x64-gnu': 15.1.1 - '@next/swc-linux-x64-musl': 15.1.1 - '@next/swc-win32-arm64-msvc': 15.1.1 - '@next/swc-win32-x64-msvc': 15.1.1 + '@next/swc-darwin-arm64': 15.1.6 + '@next/swc-darwin-x64': 15.1.6 + '@next/swc-linux-arm64-gnu': 15.1.6 + '@next/swc-linux-arm64-musl': 15.1.6 + '@next/swc-linux-x64-gnu': 15.1.6 + '@next/swc-linux-x64-musl': 15.1.6 + '@next/swc-win32-arm64-msvc': 15.1.6 + '@next/swc-win32-x64-msvc': 15.1.6 '@opentelemetry/api': 1.9.0 '@playwright/test': 1.39.0 sharp: 0.33.5 diff --git a/webapps/console/lib/server/sync.ts b/webapps/console/lib/server/sync.ts index d6b37a75d..5f2398a60 100644 --- a/webapps/console/lib/server/sync.ts +++ b/webapps/console/lib/server/sync.ts @@ -19,6 +19,11 @@ import IJob = google.cloud.scheduler.v1.IJob; import hash from "stable-hash"; import { clickhouse } from "./clickhouse"; const metricsSchema = process.env.CLICKHOUSE_METRICS_SCHEMA || process.env.CLICKHOUSE_DATABASE || "newjitsu_metrics"; +const clickhouseUploadS3Bucket = process.env.CLICKHOUSE_UPLOAD_S3_BUCKET; +const s3Region = process.env.S3_REGION; +const s3AccessKeyId = process.env.S3_ACCESS_KEY_ID; +const s3SecretAccessKey = process.env.S3_SECRET_ACCESS_KEY; +const clickhouseS3Configured = clickhouseUploadS3Bucket && s3Region && s3AccessKeyId && s3SecretAccessKey; const log = getServerLog("sync-scheduler"); @@ -599,6 +604,18 @@ export async function scheduleSync({ logs: `${appBase}/api/${workspaceId}/sources/logs?taskId=${taskId}&syncId=${syncIdOrModel}`, }; } + if ( + destinationType.id === "clickhouse" && + destinationConfig.loadAsJson && + !destinationConfig.provisioned && + clickhouseS3Configured + ) { + destinationConfig.s3Region = s3Region; + destinationConfig.s3AccessKeyId = s3AccessKeyId; + destinationConfig.s3SecretAccessKey = s3SecretAccessKey; + destinationConfig.s3Bucket = clickhouseUploadS3Bucket; + destinationConfig.s3UsePresignedURL = true; + } const h = juavaHash("md5", hash(serviceConfig.credentials)); const versionHash = `${workspaceId}_${serviceConfig.id}_${h}`; diff --git a/webapps/console/package.json b/webapps/console/package.json index 7bcaa9f37..445241f6c 100644 --- a/webapps/console/package.json +++ b/webapps/console/package.json @@ -74,7 +74,7 @@ "mjml": "^5.0.0-alpha.6", "mjml-react": "^2.0.8", "monaco-editor": "^0.52.0", - "next": "^15.1.1", + "next": "^15.1.6", "next-auth": "^4.24.11", "node-fetch-commonjs": "^3.3.2", "node-sql-parser": "^4.6.5", diff --git a/webapps/ee-api/package.json b/webapps/ee-api/package.json index ac75d287b..ccc7d1f78 100644 --- a/webapps/ee-api/package.json +++ b/webapps/ee-api/package.json @@ -25,7 +25,7 @@ "jsonwebtoken": "^9.0.2", "juava": "workspace:*", "lodash": "^4.17.21", - "next": "^15.1.1", + "next": "^15.1.6", "node-fetch-commonjs": "^3.3.2", "pg": "^8.11.3", "react": "^18.3.1", From e608bf2bad8ba0dd8f151fab2abe06eb90525160 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 30 Jan 2025 12:41:22 +0400 Subject: [PATCH 1064/1353] console: support for loading data to CH through S3 for ingested messages console: syncs: tweaks for the TIME_EXCEEDED status display --- .../pages/[workspaceId]/syncs/tasks.tsx | 20 ++++++++---- .../pages/api/admin/export/[name]/index.ts | 32 +++++++++++++------ 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx index 4d7ef801c..46f75469f 100644 --- a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx @@ -19,6 +19,7 @@ import { CalendarIcon, CheckCircle2, ChevronLeft, + ClockAlert, Edit3, ListMinusIcon, PlayCircle, @@ -162,11 +163,13 @@ function TaskStatus0({ task, loading }: { task: TasksDbModel & TaskStats; loadin ) : props.status === "PARTIAL" ? ( + ) : props.status === "TIME_EXCEEDED" ? ( + ) : props.status === "RUNNING" ? ( ) : props.status === "SKIPPED" ? ( - - ) : props.status === "CANCELLED" || props.status === "TIME_EXCEEDED" ? ( + + ) : props.status === "CANCELLED" ? ( ) : ( @@ -224,7 +227,7 @@ function TaskStatus0({ task, loading }: { task: TasksDbModel & TaskStats; loadin case "TIME_EXCEEDED": return ( - + {task.status} show stats @@ -280,9 +283,9 @@ function TaskStatusResultTable({ stats, error }: { stats: any[]; error?: string render: (text, record) => { if (record.status === "SUCCESS") { return SUCCESS; - } else if (record.status === "PARTIAL") { - return PARTIAL; - } else if (record.status === "CANCELLED" || record.status === "TIME_EXCEEDED") { + } else if (record.status === "PARTIAL" || record.status === "TIME_EXCEEDED") { + return {record.status}; + } else if (record.status === "CANCELLED") { return {record.status}; } else if (record.status === "PENDING") { return PENDING; @@ -504,7 +507,10 @@ function TasksTable({ tasks, loading, linksMap, servicesMap, destinationsMap, re if (task.status === "SUCCESS") { return
    {task.successStreams}
    ; } else if ( - (task.status === "PARTIAL" || task.status === "RUNNING" || task.status === "CANCELLED") && + (task.status === "PARTIAL" || + task.status === "TIME_EXCEEDED" || + task.status === "RUNNING" || + task.status === "CANCELLED") && task.totalStreams ) { return ( diff --git a/webapps/console/pages/api/admin/export/[name]/index.ts b/webapps/console/pages/api/admin/export/[name]/index.ts index a8514b622..5e3ca338d 100644 --- a/webapps/console/pages/api/admin/export/[name]/index.ts +++ b/webapps/console/pages/api/admin/export/[name]/index.ts @@ -22,6 +22,11 @@ export type Export = { }; const batchSize = 1000; +const clickhouseUploadS3Bucket = process.env.CLICKHOUSE_UPLOAD_S3_BUCKET; +const s3Region = process.env.S3_REGION; +const s3AccessKeyId = process.env.S3_ACCESS_KEY_ID; +const s3SecretAccessKey = process.env.S3_SECRET_ACCESS_KEY; +const clickhouseS3Configured = clickhouseUploadS3Bucket && s3Region && s3AccessKeyId && s3SecretAccessKey; const safeLastModified = new Date(2024, 0, 1, 0, 0, 0, 0); @@ -78,15 +83,24 @@ const exports: Export[] = [ writer.write(","); } const credentials = omit(to.config, "destinationType", "type", "name"); - if (destinationType === "clickhouse" && data.clickhouseSettings) { - const extraParams = Object.fromEntries( - (data.clickhouseSettings as string) - .split("\n") - .filter(s => s.includes("=")) - .map(s => s.split("=")) - .map(([k, v]) => [k.trim(), v.trim()]) - ); - credentials.parameters = { ...(credentials.parameters || {}), ...extraParams }; + if (destinationType === "clickhouse") { + if (data.clickhouseSettings) { + const extraParams = Object.fromEntries( + (data.clickhouseSettings as string) + .split("\n") + .filter(s => s.includes("=")) + .map(s => s.split("=")) + .map(([k, v]) => [k.trim(), v.trim()]) + ); + credentials.parameters = { ...(credentials.parameters || {}), ...extraParams }; + } + if (credentials.loadAsJson && !credentials.provisioned && clickhouseS3Configured) { + credentials.s3Region = s3Region; + credentials.s3AccessKeyId = s3AccessKeyId; + credentials.s3SecretAccessKey = s3SecretAccessKey; + credentials.s3Bucket = clickhouseUploadS3Bucket; + credentials.s3UsePresignedURL = true; + } } // if (data.timestampColumn) { // // use timestampColumn field as discriminator field when doing local deduplication From 6ef8ef8f6cd79007d781156641703390fed468fe Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 30 Jan 2025 13:13:36 +0400 Subject: [PATCH 1065/1353] console: enable loadAsJson for CH by default console: improve coloring for TIME_EXCEEDED status --- webapps/console/lib/schema/destinations.tsx | 7 ++----- webapps/console/pages/[workspaceId]/syncs/tasks.tsx | 12 +++++++----- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/webapps/console/lib/schema/destinations.tsx b/webapps/console/lib/schema/destinations.tsx index 2b652a56c..eaec4e05a 100644 --- a/webapps/console/lib/schema/destinations.tsx +++ b/webapps/console/lib/schema/destinations.tsx @@ -273,9 +273,9 @@ export const ClickhouseCredentials = z.object({ ), loadAsJson: z .boolean() - .default(false) + .default(true) .describe( - "Load data in JSONEachRow. May offer better performance. May not work properly on old ClickHouse versions." + "Use JSONEachRow format::Load data in the JSONEachRow format. This method offers better performance but may not work correctly on older ClickHouse versions." ), }); @@ -409,9 +409,6 @@ export const coreDestinations: DestinationType[] = [ password: { password: true, }, - loadAsJson: { - hidden: true, - }, }, }, { diff --git a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx index 46f75469f..51db68505 100644 --- a/webapps/console/pages/[workspaceId]/syncs/tasks.tsx +++ b/webapps/console/pages/[workspaceId]/syncs/tasks.tsx @@ -164,7 +164,7 @@ function TaskStatus0({ task, loading }: { task: TasksDbModel & TaskStats; loadin ) : props.status === "PARTIAL" ? ( ) : props.status === "TIME_EXCEEDED" ? ( - + ) : props.status === "RUNNING" ? ( ) : props.status === "SKIPPED" ? ( @@ -223,21 +223,21 @@ function TaskStatus0({ task, loading }: { task: TasksDbModel & TaskStats; loadin show stats
    ); - case "CANCELLED": case "TIME_EXCEEDED": return ( - + {task.status} show stats ); + case "CANCELLED": case "SKIPPED": return ( - SKIPPED + {task.status} show reason @@ -283,8 +283,10 @@ function TaskStatusResultTable({ stats, error }: { stats: any[]; error?: string render: (text, record) => { if (record.status === "SUCCESS") { return SUCCESS; - } else if (record.status === "PARTIAL" || record.status === "TIME_EXCEEDED") { + } else if (record.status === "PARTIAL") { return {record.status}; + } else if (record.status === "TIME_EXCEEDED") { + return {record.status}; } else if (record.status === "CANCELLED") { return {record.status}; } else if (record.status === "PENDING") { From 7f517de3578ade789d8f9c432afc9d0affb1153c Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 30 Jan 2025 14:51:25 +0400 Subject: [PATCH 1066/1353] console: ServiceEditor: workaround from connector spec validation glitch --- .../components/ServiceEditor/ServiceEditor.tsx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/webapps/console/components/ServiceEditor/ServiceEditor.tsx b/webapps/console/components/ServiceEditor/ServiceEditor.tsx index be6559fa4..fd9abb340 100644 --- a/webapps/console/components/ServiceEditor/ServiceEditor.tsx +++ b/webapps/console/components/ServiceEditor/ServiceEditor.tsx @@ -19,6 +19,7 @@ import { CheckCircleTwoTone, InfoCircleTwoTone } from "@ant-design/icons"; import set from "lodash/set"; import get from "lodash/get"; import Ajv from "ajv"; +import draft7MetaSchema from "ajv/dist/refs/json-schema-draft-07.json"; import unset from "lodash/unset"; import { SchemaForm } from "../ConfigObjectEditor/SchemaForm"; import { TextEditor } from "../ConfigObjectEditor/Editors"; @@ -56,10 +57,11 @@ export const ServiceEditor: React.FC = props => { const [specs, setSpecs] = useState(undefined); const oauthConnector = appConfig.nango ? oauthDecorators.find(d => d.packageId === obj.package) : ""; const [manualAuth, setManualAuth] = useState(typeof oauthConnector === "undefined"); - const ajv = useMemo( - () => new Ajv({ allErrors: true, strictSchema: false, useDefaults: true, allowUnionTypes: true }), - [] - ); + const ajv = useMemo(() => { + const ajv = new Ajv({ allErrors: true, strictSchema: false, useDefaults: true, allowUnionTypes: true }); + ///ajv.addMetaSchema(draft7MetaSchema); + return ajv; + }, []); const modal = useAntdModal(); const reloadStore = useStoreReload(); @@ -127,6 +129,8 @@ export const ServiceEditor: React.FC = props => { errors.push("Source specification was not loaded"); return; } + // ajv doesn't expect schema identifiers to use https:// prefix. But such identifiers started to appear in connectors specs + specs.connectionSpecification.$schema = specs.connectionSpecification.$schema.replace("https://", "http://"); const validate = ajv.compile(specs.connectionSpecification); const valid = validate(credentials); if (!obj.name) { From 7e89d96995973abbc60929614d5ee9b03df72210 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 30 Jan 2025 15:43:33 +0400 Subject: [PATCH 1067/1353] console: Service Connectors: offer the "latest" version by default --- webapps/console/pages/api/sources/versions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/console/pages/api/sources/versions.ts b/webapps/console/pages/api/sources/versions.ts index 8b30e32f7..4acb99038 100644 --- a/webapps/console/pages/api/sources/versions.ts +++ b/webapps/console/pages/api/sources/versions.ts @@ -39,7 +39,7 @@ export default createRoute() const tags = (await rpc(`https://hub.docker.com/v2/repositories/${packageId}/tags?page_size=200`)).results.map( ({ name }) => ({ name, - isRelease: name.match(/^[0-9.]+$/) !== null, + isRelease: name.match(/^[0-9.]+$|^latest$/) !== null, isMit, }) ); From c31e28a5bc91fa9121b2ca7eecd7f4f25ee2f715 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Thu, 30 Jan 2025 15:46:40 +0400 Subject: [PATCH 1068/1353] console: Service Connectors: offer the "latest" version by default --- webapps/console/components/ServiceEditor/ServiceEditor.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/webapps/console/components/ServiceEditor/ServiceEditor.tsx b/webapps/console/components/ServiceEditor/ServiceEditor.tsx index fd9abb340..16d7b9e85 100644 --- a/webapps/console/components/ServiceEditor/ServiceEditor.tsx +++ b/webapps/console/components/ServiceEditor/ServiceEditor.tsx @@ -19,7 +19,6 @@ import { CheckCircleTwoTone, InfoCircleTwoTone } from "@ant-design/icons"; import set from "lodash/set"; import get from "lodash/get"; import Ajv from "ajv"; -import draft7MetaSchema from "ajv/dist/refs/json-schema-draft-07.json"; import unset from "lodash/unset"; import { SchemaForm } from "../ConfigObjectEditor/SchemaForm"; import { TextEditor } from "../ConfigObjectEditor/Editors"; From 428659e3224ebbffeaa8814f8887315cfca1f0f2 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 31 Jan 2025 15:08:32 +0400 Subject: [PATCH 1069/1353] console: it is now possible to assign sibling workspace via featuresEnabled flag --- webapps/console/lib/schema/config-objects.ts | 10 +++++++--- webapps/console/lib/schema/index.ts | 16 ++++++++++++++-- webapps/console/lib/server/custom-domains.ts | 18 +++++++++++++++--- webapps/console/lib/store/index.tsx | 12 +++++++++++- .../api/[workspaceId]/config/[type]/[id].ts | 7 ++++++- .../api/[workspaceId]/config/[type]/index.ts | 8 ++++++-- .../api/[workspaceId]/config/[type]/test.ts | 8 ++++++-- .../pages/api/[workspaceId]/domain-check.ts | 11 ++++++++--- webapps/console/prisma/schema.prisma | 13 ------------- 9 files changed, 73 insertions(+), 30 deletions(-) diff --git a/webapps/console/lib/schema/config-objects.ts b/webapps/console/lib/schema/config-objects.ts index 59f386f70..398e24573 100644 --- a/webapps/console/lib/schema/config-objects.ts +++ b/webapps/console/lib/schema/config-objects.ts @@ -7,6 +7,7 @@ import { ConnectorImageConfig, DestinationConfig, FunctionConfig, + MiscEntity, ServiceConfig, StreamConfig, WorkspaceDomain, @@ -129,15 +130,15 @@ const configObjectTypes: Record = { return merged; }, - inputFilter: async obj => { - const workspaceId = obj.workspaceId; + inputFilter: async (obj, _, workspace) => { + const workspaceId = workspace.id; outer: for (const domain of obj.domains || []) { const domainToCheck = domain.trim().toLowerCase(); if (!checkDomain(domainToCheck)) { log.atWarn().log(`Domain '${domainToCheck}' is not a valid domain name`); throw new ApiError(`Domain ${domainToCheck} is not a valid domain name`); } - const domainAvailability = await isDomainAvailable(domainToCheck, workspaceId); + const domainAvailability = await isDomainAvailable(domainToCheck, workspace); if (!domainAvailability.available) { log .atWarn() @@ -212,4 +213,7 @@ const configObjectTypes: Record = { }; }, }, + misc: { + schema: MiscEntity, + }, } as const; diff --git a/webapps/console/lib/schema/index.ts b/webapps/console/lib/schema/index.ts index 302b530fc..bb078d082 100644 --- a/webapps/console/lib/schema/index.ts +++ b/webapps/console/lib/schema/index.ts @@ -1,5 +1,5 @@ import { z } from "zod"; -import { UserProfileDbModel } from "../../prisma/schema"; +import { UserProfileDbModel, WorkspaceDbModel } from "../../prisma/schema"; export const SessionUser = z.object({ name: z.string(), @@ -186,13 +186,25 @@ export const WorkspaceDomain = ConfigEntityBase.merge( ); export type WorkspaceDomain = z.infer; +export const MiscEntity = ConfigEntityBase.merge( + z.object({ + type: z.string(), + value: z.object({}).passthrough(), + }) +); +export type MiscEntity = z.infer; + /** * What happens to an object before it is saved to DB. * * opts.original — original of the object, if object is being updated * opts.patch — patch of the object, if object is being updated. Or full object, if object is being created */ -export type InputFilter = (val: T, context: "create" | "update") => Promise; +export type InputFilter = ( + val: T, + context: "create" | "update", + workspace: z.infer +) => Promise; export type OutputFilter = (original: T) => T; /** diff --git a/webapps/console/lib/server/custom-domains.ts b/webapps/console/lib/server/custom-domains.ts index 26d254100..3a6e652a9 100644 --- a/webapps/console/lib/server/custom-domains.ts +++ b/webapps/console/lib/server/custom-domains.ts @@ -3,6 +3,9 @@ import dns from "dns"; import { getLog, requireDefined } from "juava"; import { httpAgent, httpsAgent } from "./http-agent"; import nodeFetch from "node-fetch-commonjs"; +import { z } from "zod"; +import { WorkspaceDbModel } from "../../prisma/schema"; +import { Prisma } from "@prisma/client"; type DomainAvailability = { available: true; usedInWorkspaces?: never } | { available: false; usedInWorkspace: string }; @@ -14,7 +17,16 @@ export function checkDomain(domain: string): boolean { /** * Tells if the given domain is used in other workspaces. */ -export async function isDomainAvailable(domain: string, workspaceId: string): Promise { +export async function isDomainAvailable( + domain: string, + workspace: z.infer +): Promise { + const workspaceId = workspace.id; + const siblings = (workspace.featuresEnabled ?? []) + .filter(f => f.startsWith("sibling=")) + .flatMap(f => f.replace("sibling=", "").split(",")); + siblings.push(workspaceId); + const domainSuffix = domain.replace(/^[*]/, ""); const fullTextPattern = `%${domainSuffix.toLowerCase()}%`; const pattern = `%${domainSuffix.toLowerCase()}`; @@ -23,14 +35,14 @@ export async function isDomainAvailable(domain: string, workspaceId: string): Pr from newjitsu."ConfigurationObject" where type = 'stream' and config::TEXT ilike ${fullTextPattern} - and "workspaceId" <> ${workspaceId} + and "workspaceId" not in (${Prisma.join(siblings)}) and deleted = false union select id,type, "workspaceId", jsonb_build_array(config->'name') as domains from newjitsu."ConfigurationObject" where type = 'domain' and (config->>'name' ilike ${pattern} or ${domain.toLowerCase()} ilike REPLACE(config->>'name','*','%') ) - and "workspaceId" <> ${workspaceId} + and "workspaceId" not in (${Prisma.join(siblings)}) and deleted = false `) as { id: string; workspaceId: string; domains: string[] }[]; diff --git a/webapps/console/lib/store/index.tsx b/webapps/console/lib/store/index.tsx index 9a8e405ca..a269e3c14 100644 --- a/webapps/console/lib/store/index.tsx +++ b/webapps/console/lib/store/index.tsx @@ -1,5 +1,6 @@ import type { ConnectorImageConfig, + MiscEntity, DestinationConfig, FunctionConfig, ServiceConfig, @@ -14,7 +15,15 @@ import { z } from "zod"; import { ConfigurationObjectLinkDbModel, ProfileBuilderDbModel, WorkspaceDbModel } from "../../prisma/schema"; import { UseMutationResult } from "@tanstack/react-query/src/types"; -export const allConfigTypes = ["stream", "service", "function", "destination", "custom-image", "domain"] as const; +export const allConfigTypes = [ + "stream", + "service", + "function", + "destination", + "custom-image", + "domain", + "misc", +] as const; export type ConfigType = (typeof allConfigTypes)[number]; @@ -25,6 +34,7 @@ export type ConfigTypes = { destination: DestinationConfig; "custom-image": ConnectorImageConfig; domain: WorkspaceDomain; + misc: MiscEntity; }; export function asConfigType(type: string): ConfigType { diff --git a/webapps/console/pages/api/[workspaceId]/config/[type]/[id].ts b/webapps/console/pages/api/[workspaceId]/config/[type]/[id].ts index 56529e3ea..157b30d51 100644 --- a/webapps/console/pages/api/[workspaceId]/config/[type]/[id].ts +++ b/webapps/console/pages/api/[workspaceId]/config/[type]/[id].ts @@ -8,6 +8,7 @@ import { prepareZodObjectForDeserialization } from "../../../../../lib/zod"; import { isReadOnly } from "../../../../../lib/server/read-only-mode"; import { enableAuditLog } from "../../../../../lib/server/audit-log"; import { trackTelemetryEvent } from "../../../../../lib/server/telemetry"; +import { requireDefined } from "juava"; function defaultMerge(a, b) { return { ...a, ...b }; @@ -55,6 +56,10 @@ export const api: Api = { throw new ApiError("Console is in read-only mode. Modifications of objects are not allowed"); } await verifyAccess(user, workspaceId); + const workspace = requireDefined( + await db.prisma().workspace.findFirst({ where: { id: workspaceId } }), + `Workspace ${workspaceId} not found` + ); const configObjectType = getConfigObjectType(type); const object = await db.prisma().configurationObject.findFirst({ where: { workspaceId: workspaceId, id, deleted: false }, @@ -64,7 +69,7 @@ export const api: Api = { } const merged = configObjectType.merge(object.config, { ...body, id, workspaceId }); const data = parseObject(type, merged); - const filtered = await configObjectType.inputFilter(data, "update"); + const filtered = await configObjectType.inputFilter(data, "update", workspace); delete filtered.id; delete filtered.workspaceId; diff --git a/webapps/console/pages/api/[workspaceId]/config/[type]/index.ts b/webapps/console/pages/api/[workspaceId]/config/[type]/index.ts index f70711047..865a70d0f 100644 --- a/webapps/console/pages/api/[workspaceId]/config/[type]/index.ts +++ b/webapps/console/pages/api/[workspaceId]/config/[type]/index.ts @@ -1,7 +1,7 @@ import { Api, inferUrl, nextJsApiHandler, verifyAccess } from "../../../../../lib/api"; import { z } from "zod"; import { db } from "../../../../../lib/server/db"; -import { assertDefined } from "juava"; +import { assertDefined, requireDefined } from "juava"; import { getConfigObjectType, parseObject } from "../../../../../lib/schema/config-objects"; import { ApiError } from "../../../../../lib/shared/errors"; import { isReadOnly } from "../../../../../lib/server/read-only-mode"; @@ -54,8 +54,12 @@ export const api: Api = { if (isReadOnly) { throw new ApiError("Console is in read-only mode. Modifications of objects are not allowed"); } + const workspace = requireDefined( + await db.prisma().workspace.findFirst({ where: { id: workspaceId } }), + `Workspace ${workspaceId} not found` + ); const configObjectTypes = getConfigObjectType(type); - const object = await configObjectTypes.inputFilter(parseObject(type, body), "create"); + const object = await configObjectTypes.inputFilter(parseObject(type, body), "create", workspace); const id = object.id; delete object.id; delete object.workspaceId; diff --git a/webapps/console/pages/api/[workspaceId]/config/[type]/test.ts b/webapps/console/pages/api/[workspaceId]/config/[type]/test.ts index c8200762f..d23d675ef 100644 --- a/webapps/console/pages/api/[workspaceId]/config/[type]/test.ts +++ b/webapps/console/pages/api/[workspaceId]/config/[type]/test.ts @@ -6,6 +6,7 @@ import { getConfigObjectType, parseObject } from "../../../../../lib/schema/conf import { httpAgent, httpsAgent } from "../../../../../lib/server/http-agent"; import { getErrorMessage, requireDefined } from "juava"; import nodeFetch from "node-fetch-commonjs"; +import { db } from "../../../../../lib/server/db"; const log = getServerLog("test-connection"); @@ -33,9 +34,12 @@ export const api: Api = { const isHttps = bulkerURLEnv.startsWith("https://"); const { workspaceId, type } = query; await verifyAccess(user, workspaceId); - + const workspace = requireDefined( + await db.prisma().workspace.findFirst({ where: { id: workspaceId } }), + `Workspace ${workspaceId} not found` + ); const configObjectTypes = getConfigObjectType(type); - const object = await configObjectTypes.inputFilter(parseObject(type, body), "create"); + const object = await configObjectTypes.inputFilter(parseObject(type, body), "create", workspace); const payload = JSON.stringify(object); log.atDebug().log("payload", payload); // Options object diff --git a/webapps/console/pages/api/[workspaceId]/domain-check.ts b/webapps/console/pages/api/[workspaceId]/domain-check.ts index e3bff91a0..798432a2b 100644 --- a/webapps/console/pages/api/[workspaceId]/domain-check.ts +++ b/webapps/console/pages/api/[workspaceId]/domain-check.ts @@ -10,6 +10,7 @@ import { import { DomainCheckResponse } from "../../../lib/shared/domain-check-response"; import { createRoute, verifyAccess } from "../../../lib/api"; import { db } from "../../../lib/server/db"; +import { requireDefined } from "juava"; const log = getServerLog("custom-domains"); @@ -27,23 +28,27 @@ export default createRoute() throw new Error(`CUSTOM_DOMAIN_CNAMES is not set`); } await verifyAccess(user, workspaceId); + const workspace = requireDefined( + await db.prisma().workspace.findFirst({ where: { id: workspaceId } }), + `Workspace ${workspaceId} not found` + ); let domainToCheck = domain.trim().toLowerCase(); if (!checkDomain(domainToCheck)) { log.atWarn().log(`Domain '${domainToCheck}' is not a valid domain name`); return { ok: false, reason: "invalid_domain_name" }; } - const domainAvailability = await isDomainAvailable(domainToCheck, workspaceId); + const domainAvailability = await isDomainAvailable(domainToCheck, workspace); if (!domainAvailability.available) { log .atWarn() .log( - `Domain '${domainToCheck}' can't be added to workspace ${workspaceId}. It is used by ${domainAvailability.usedInWorkspace}` + `Domain '${domainToCheck}' can't be added to workspace ${workspace.id}. It is used by ${domainAvailability.usedInWorkspace}` ); return { ok: false, reason: "used_by_other_workspace" }; } if (!domainToCheck.startsWith("*")) { - const wildcardDomains = await getWildcardDomains(workspaceId); + const wildcardDomains = await getWildcardDomains(workspace.id); for (const wildcardDomain of wildcardDomains) { if ( domainToCheck.endsWith(wildcardDomain.toLowerCase().replace("*", "")) && diff --git a/webapps/console/prisma/schema.prisma b/webapps/console/prisma/schema.prisma index cf7cfd5cb..119793750 100644 --- a/webapps/console/prisma/schema.prisma +++ b/webapps/console/prisma/schema.prisma @@ -84,7 +84,6 @@ model Workspace { slug String? workspaceAccess WorkspaceAccess[] - workspaceOptions WorkspaceOptions[] configurationObject ConfigurationObject[] configurationObjectLink ConfigurationObjectLink[] preferences UserPreferences[] @@ -97,18 +96,6 @@ model Workspace { @@index(updatedAt(sort: Desc)) } -//additional properties for workspace -model WorkspaceOptions { - id String @id @default(cuid()) - createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) - updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) - workspaceId String - workspace Workspace @relation(fields: [workspaceId], references: [id]) - namespace String - value Json - - @@index([workspaceId, namespace]) -} model WorkspaceAccess { workspaceId String From c3579edf9d1f3f99fbc69ab948fb571f5f65c448 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 31 Jan 2025 15:17:33 +0400 Subject: [PATCH 1070/1353] console: it is now possible to assign sibling workspace via featuresEnabled flag --- webapps/console/prisma/schema.prisma | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/webapps/console/prisma/schema.prisma b/webapps/console/prisma/schema.prisma index 119793750..cf7cfd5cb 100644 --- a/webapps/console/prisma/schema.prisma +++ b/webapps/console/prisma/schema.prisma @@ -84,6 +84,7 @@ model Workspace { slug String? workspaceAccess WorkspaceAccess[] + workspaceOptions WorkspaceOptions[] configurationObject ConfigurationObject[] configurationObjectLink ConfigurationObjectLink[] preferences UserPreferences[] @@ -96,6 +97,18 @@ model Workspace { @@index(updatedAt(sort: Desc)) } +//additional properties for workspace +model WorkspaceOptions { + id String @id @default(cuid()) + createdAt DateTime @default(now()) /// @zod.custom(z.coerce.date()) + updatedAt DateTime @default(now()) @updatedAt /// @zod.custom(z.coerce.date()) + workspaceId String + workspace Workspace @relation(fields: [workspaceId], references: [id]) + namespace String + value Json + + @@index([workspaceId, namespace]) +} model WorkspaceAccess { workspaceId String From a670144c121d1a2ed5da93322c3f1413025f2996 Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Fri, 31 Jan 2025 15:20:30 +0400 Subject: [PATCH 1071/1353] console: it is now possible to assign sibling workspace via featuresEnabled flag --- webapps/console/lib/schema/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/webapps/console/lib/schema/index.ts b/webapps/console/lib/schema/index.ts index bb078d082..19a15eab1 100644 --- a/webapps/console/lib/schema/index.ts +++ b/webapps/console/lib/schema/index.ts @@ -188,6 +188,7 @@ export type WorkspaceDomain = z.infer; export const MiscEntity = ConfigEntityBase.merge( z.object({ + name: z.string(), type: z.string(), value: z.object({}).passthrough(), }) From e84265dafce8f6fd38f46973c698b502ac85979e Mon Sep 17 00:00:00 2001 From: Ildar Nurislamov Date: Tue, 4 Feb 2025 11:58:21 +0400 Subject: [PATCH 1072/1353] console: added classic compat misc settings --- .../PageLayout/WorkspacePageLayout.tsx | 8 +++ webapps/console/lib/schema/index.ts | 4 +- .../pages/[workspaceId]/destinations.tsx | 14 +++++ webapps/console/pages/[workspaceId]/miscs.tsx | 58 +++++++++++++++++++ .../pages/api/admin/export/[name]/index.ts | 33 +++++++++++ 5 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 webapps/console/pages/[workspaceId]/miscs.tsx diff --git a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx index 66136df2f..b3102977c 100644 --- a/webapps/console/components/PageLayout/WorkspacePageLayout.tsx +++ b/webapps/console/components/PageLayout/WorkspacePageLayout.tsx @@ -63,6 +63,7 @@ import omit from "lodash/omit"; import { useBilling, UseBillingResult } from "../Billing/BillingProvider"; import { useEventsUsage, UseUsageRes } from "../Billing/use-events-usage"; import { MenuItemType } from "antd/lib/menu/interface"; +import { FaGear } from "react-icons/fa6"; export type PageLayoutProps = { fullscreen?: boolean; @@ -625,6 +626,13 @@ function PageHeader() { icon: , } : undefined, + workspace.featuresEnabled?.includes("misc") + ? { + title: "Miscellaneous Settings", + path: "/miscs", + icon: , + } + : undefined, ], }, appConfig.ee?.available && { diff --git a/webapps/console/lib/schema/index.ts b/webapps/console/lib/schema/index.ts index 19a15eab1..409e982ca 100644 --- a/webapps/console/lib/schema/index.ts +++ b/webapps/console/lib/schema/index.ts @@ -189,8 +189,8 @@ export type WorkspaceDomain = z.infer; export const MiscEntity = ConfigEntityBase.merge( z.object({ name: z.string(), - type: z.string(), - value: z.object({}).passthrough(), + objectType: z.enum(["classic-mapping"]).default("classic-mapping"), + value: z.string(), }) ); export type MiscEntity = z.infer; diff --git a/webapps/console/pages/[workspaceId]/destinations.tsx b/webapps/console/pages/[workspaceId]/destinations.tsx index 899445c13..248d5525f 100644 --- a/webapps/console/pages/[workspaceId]/destinations.tsx +++ b/webapps/console/pages/[workspaceId]/destinations.tsx @@ -157,6 +157,20 @@ export const ArrayTextareaEditor: React.FC> = props ); }; +export const TextareaEditor: React.FC> = props => { + const [value, setValue] = useState(props.value || ""); + return ( +